CRichEditCtrl for Syntax HighLighting

1void CTWScriptEdit::FormatTextRange(int nStart, int nEnd)
2{
3	if (nStart >= nEnd)
4		return;
5
6	m_bInForcedChange = TRUE;
7
8	CHARRANGE crOldSel;
9
10	GetSel(crOldSel);
11	LockWindowUpdate();
12	HideSelection(TRUE, FALSE);
13
14	TCHAR *pBuffer = NULL;
15	try {
16		SetSel(nStart, nEnd);
17		pBuffer = new TCHAR[nEnd - nStart + 1];
18		long nLen = GetSelText(pBuffer);
19
20		ASSERT(nLen <= nEnd - nStart);
21
22		pBuffer[nLen] = 0;
23
24		TCHAR *pStart, *pPtr;
25		pStart = pPtr = pBuffer;
26
27		TCHAR* pSymbolStart = NULL;
28		SymbolColor ic;
29
30		while (*pPtr != 0) {
31			TCHAR ch = *pPtr;
32
33			if (ch == m_chComment && (m_chComment2 == 0 || pPtr[1] == m_chComment2)) {
34				pSymbolStart = pPtr;
35				do {
36					ch = *(++pPtr);
37				} while (ch != 0 && ch != '/r');
38				ic = m_icComment;
39			} else if (IsStringQuote(ch)) { // Process strings
40				pSymbolStart = pPtr;
41				TCHAR ch1 = ch;
42				do {
43					ch = *(++pPtr);
44				} while (ch != 0 && ch != ch1 && ch != '/r');
45				if (ch == ch1) pPtr++;
46				ic = m_icString;
47			} else if (_istdigit(ch)) { // Process numbers
48				pSymbolStart = pPtr;
49				_tcstod(pSymbolStart, &pPtr);
50				ic = m_icNumber;
51			} else if (_istalpha(ch) || ch == '_') { // Process keywords
52				pSymbolStart = pPtr;
53				do {
54					ch = *(++pPtr);
55				} while (_istalnum(ch) || ch == '_');
56				*pPtr = 0;
57				int nPos = IsKeyword(pSymbolStart);
58				if (nPos >= 0) {
59					ChangeCase(nStart + pSymbolStart - pBuffer, nStart + pPtr - pBuffer, 
60								m_strKeywords.Mid(nPos+1, pPtr - pSymbolStart));
61					if (_tcsicmp(m_strComment, pSymbolStart) == 0) {
62						*pPtr = ch;
63						*pSymbolStart = m_chComment;
64						if (pSymbolStart[1] != 0 && m_chComment2 != 0)
65							pSymbolStart[1] = m_chComment2;
66						pPtr = pSymbolStart;
67						pSymbolStart = NULL;
68						continue;
69					}
70					ic = m_icKeyword;
71				} else {
72					nPos = IsConstant(pSymbolStart);
73					if (nPos >= 0) {
74							ChangeCase(nStart + pSymbolStart - pBuffer, nStart + pPtr - pBuffer, 
75										m_strConstants.Mid(nPos+1, pPtr - pSymbolStart));
76						ic = m_icConstant;
77					} else {
78						pSymbolStart = NULL;
79					}
80				}
81				*pPtr = ch;
82			} else {
83				pPtr++;
84			}
85
86			if (pSymbolStart != NULL) {
87				ASSERT(pSymbolStart < pPtr);
88				SetFormatRange(nStart + pStart - pBuffer, nStart + pSymbolStart - pBuffer, FALSE, RGB(0,0,0));
89				SetFormatRange(nStart + pSymbolStart - pBuffer, nStart + pPtr - pBuffer, ic.bBold, ic.clrColor);
90				pStart = pPtr;
91				pSymbolStart = 0;
92			} else if (*pPtr == 0)
93				SetFormatRange(nStart + pStart - pBuffer, nStart + pPtr - pBuffer, FALSE, RGB(0,0,0));
94		}
95
96	} catch(...){}
97
98	delete [] pBuffer;
99
100	SetSel(crOldSel);
101	HideSelection(FALSE, FALSE);
102	UnlockWindowUpdate();
103
104	m_bInForcedChange = FALSE;
105}
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值