⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 colorstring.cpp

📁 检测语法的Edit类
💻 CPP
📖 第 1 页 / 共 2 页
字号:

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 + -