📄 colorstring.cpp
字号:
long CColorString::GetLineCount()
{
long retval = 0;
ThreadLock();
retval = m_lineOffset.GetSize();
ThreadUnlock();
return retval;
}
long CColorString::GetLineOffset(long index)
{
long retval = 0;
ThreadLock();
if (index >= m_lineOffset.GetSize()) return GetLength();
if (index < 0) return 0;
retval = m_lineOffset[index];
ThreadUnlock();
return retval;
}
BOOL CColorString::ParseComments(CColorArray& color)
{
long len = GetLength();
long pos, size, start;
BOOL bComment;
len = GetLength();
pos = CommentPos();
while (pos < len) {
bComment = FALSE;
for (int i = 0; i < m_comment.GetSize(); i++) {
if ((start = GetComment(m_comment[i]->Begin(), m_comment[i]->End(), size, pos)) >= pos) {
// We've found a comment
color.SetColor(m_comment[i]->Color(), start, size);
ThreadLock();
if (pos != CommentPos() || len != GetLength()) {
ThreadUnlock();
return FALSE;
}
pos = CommentPos(start+size-1);
ThreadUnlock();
}
}
if (!bComment) {
ThreadLock();
pos = CommentPos(CommentPos()+1);
ThreadUnlock();
}
}
return TRUE;
}
BOOL CColorString::ParseKeywords(CColorArray& color)
{
CString token;
long beginToken;
CKeywordInfo* pKeyword = NULL;
long len = GetLength();
long pos;
pos = KeywordPos();
while (pos < len) {
beginToken = GetToken(token, pos, TRUE);
long tokenLen = token.GetLength();
if (tokenLen > 0) {
if ((pKeyword = KeywordLookup(token)) != NULL) {
color.SetColor(pKeyword->Color(), beginToken, tokenLen);
}
}
ThreadLock();
if (pos != KeywordPos() || len != GetLength()) {
ThreadUnlock();
return FALSE;
}
pos = KeywordPos((tokenLen > 0 ? beginToken + tokenLen : pos + 1));
ThreadUnlock();
}
return TRUE;
}
BOOL CColorString::ParseQuotes(CColorArray& color)
{
long len = GetLength();
long pos, size, start;
BOOL bQuote;
len = GetLength();
pos = QuotePos();
while (pos < len) {
bQuote = FALSE;
for (int i = 0; i < m_quote.GetSize(); i++) {
if ((start = GetQuote(m_quote[i]->Begin(), m_quote[i]->End(), size, pos)) >= pos) {
// We've found a comment
color.SetColor(m_quote[i]->Color(), start, size);
ThreadLock();
if (pos != QuotePos() || len != GetLength()) {
ThreadUnlock();
return FALSE;
}
pos = QuotePos(start+size-1);
ThreadUnlock();
}
}
if (!bQuote) {
ThreadLock();
pos = QuotePos(QuotePos()+1);
ThreadUnlock();
}
}
return TRUE;
}
void CColorString::DoUpdate(BOOL bDataChangedFlag)
{
for (int i = 0; i < m_update.GetSize(); i++) {
m_update[i]->DoColorStringUpdate(bDataChangedFlag);
}
}
void CColorString::Process(long pos /*= 0*/)
{
long len = GetLength();
ThreadLock();
if (m_color.GetSize() != len) {
//TRACE("m_color(%d) != len(%d)\r\n", m_color.GetSize(), len);
m_color.SetSize(len);
}
if (m_renderColor.GetSize() != len) m_renderColor.SetSize(len);
ThreadUnlock();
Reset(pos);
if (m_bkgThread == NULL) {
m_bkgThread = AfxBeginThread(CColorStringBkgThread, this, THREAD_PRIORITY_LOWEST);
}
}
CString CColorString::GetLine(long index)
{
CString retval = _T("");
if (index >= 0 && index < GetLineCount()) {
long begin = GetLineOffset(index);
long size;
if (index+1 < GetLineCount()) {
size = GetLineOffset(index+1)-begin-1;
} else {
size = GetLength()-begin;
}
ThreadLock();
retval = Mid(begin, size);
ThreadUnlock();
}
return retval;
}
CColorString& CColorString::operator=(const CString& rhs)
{
BeginUpdate();
ThreadLock();
*((CString*) this) = rhs;
long len = GetLength();
m_color.SetSize(len);
ThreadUnlock();
EndUpdate(0, len);
return *this;
}
CColorString& CColorString::operator=(const CStringEx& rhs)
{
BeginUpdate();
ThreadLock();
*((CStringEx*) this) = rhs;
long len = GetLength();
m_color.SetSize(len);
ThreadUnlock();
EndUpdate(0, len);
return *this;
}
CColorString& CColorString::operator=(TCHAR ch)
{
BeginUpdate();
ThreadLock();
*((CString*) this) = ch;
long len = GetLength();
m_color.SetSize(len);
ThreadUnlock();
EndUpdate(0, len);
return *this;
}
CColorString& CColorString::operator=(LPCSTR lpsz)
{
BeginUpdate();
ThreadLock();
*((CString*) this) = lpsz;
long len = GetLength();
m_color.SetSize(len);
ThreadUnlock();
EndUpdate(0, len);
return *this;
}
CColorString& CColorString::operator=(LPCWSTR lpsz)
{
BeginUpdate();
ThreadLock();
*((CString*) this) = lpsz;
long len = GetLength();
m_color.SetSize(len);
ThreadUnlock();
EndUpdate(0, len);
return *this;
}
CColorString& CColorString::operator=(const unsigned char* psz)
{
BeginUpdate();
ThreadLock();
*((CString*) this) = psz;
long len = GetLength();
m_color.SetSize(len);
ThreadUnlock();
EndUpdate(0, len);
return *this;
}
// string concatenation
CColorString& CColorString::operator+=(const CString& string)
{
ThreadLock();
long pos = GetLength();
ThreadUnlock();
BeginUpdate();
ThreadLock();
*((CString*) this) += string;
long len = GetLength();
m_color.SetSize(len);
ThreadUnlock();
EndUpdate(pos, len-pos);
return *this;
}
CColorString& CColorString::operator+=(TCHAR ch)
{
BeginUpdate();
ThreadLock();
long pos = GetLength();
*((CString*) this) += ch;
long len = GetLength();
m_color.SetSize(len);
ThreadUnlock();
EndUpdate(pos, len);
return *this;
}
CColorString& CColorString::operator+=(LPCTSTR lpsz)
{
BeginUpdate();
ThreadLock();
long pos = GetLength();
*((CString*) this) += lpsz;
long len = GetLength();
m_color.SetSize(len);
ThreadUnlock();
EndUpdate(pos, len-pos);
return *this;
}
CColorString& CColorString::Insert(int pos, LPCTSTR s)
{
BeginUpdate();
ThreadLock();
CStringEx::Insert(pos, s);
m_color.InsertAt(pos, m_defaultColor, strlen(s));
long len = GetLength();
ThreadUnlock();
EndUpdate(pos, len-pos);
return *this;
}
CColorString& CColorString::Insert(int pos, TCHAR c)
{
BeginUpdate();
ThreadLock();
CStringEx::Insert(pos, c);
m_color.InsertAt(pos, m_defaultColor);
long len = GetLength();
ThreadUnlock();
EndUpdate(pos, len-pos);
return *this;
}
CColorString& CColorString::Delete(int pos, int len)
{
BeginUpdate();
ThreadLock();
CStringEx::Delete(pos, len);
m_color.RemoveAt(pos, len);
long tLen = GetLength();
ThreadUnlock();
EndUpdate(pos, tLen-pos);
return *this;
}
CColorString& CColorString::Replace(int pos, int len, LPCTSTR s)
{
BeginUpdate();
ThreadLock();
CStringEx::Replace(pos, len, s);
ThreadUnlock();
EndUpdate(pos, len);
return *this;
}
void CColorString::SetAt(int nIndex, TCHAR ch)
{
BeginUpdate();
ThreadLock();
CString::SetAt(nIndex, ch);
m_color.SetAt(nIndex, m_defaultColor);
ThreadUnlock();
EndUpdate(nIndex, 1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -