File: CSyntaxRichEditCtrl.h

package info (click to toggle)
dhewm3 1.5.1~pre%2Bgit20200905%2Bdfsg-1
  • links: PTS, VCS
  • area: contrib
  • in suites: bullseye
  • size: 21,664 kB
  • sloc: cpp: 408,868; ansic: 1,188; objc: 1,034; python: 330; sh: 94; makefile: 11
file content (236 lines) | stat: -rw-r--r-- 9,025 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
/*
===========================================================================

Doom 3 GPL Source Code
Copyright (C) 1999-2011 id Software LLC, a ZeniMax Media company.

This file is part of the Doom 3 GPL Source Code ("Doom 3 Source Code").

Doom 3 Source Code is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

Doom 3 Source Code is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with Doom 3 Source Code.  If not, see <http://www.gnu.org/licenses/>.

In addition, the Doom 3 Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 Source Code.  If not, please request a copy in writing from id Software at the address below.

If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA.

===========================================================================
*/

#ifndef __CSYNTAXRICHEDITCTR_H__
#define __CSYNTAXRICHEDITCTR_H__

/*
===============================================================================

	Rich Edit Control with:

	- syntax highlighting
	- braced section highlighting
	- braced section auto-indentation
	- multi-line tabs
	- keyword auto-completion
	- object member auto-completion
	- keyword tool tip
	- function parameter tool tip

===============================================================================
*/

// use #import on Vista to generate .tlh header to copy from intermediate compile directory to local directory for subsequent builds
//     rename: avoids warning C4278: 'FindText': identifier in type library 'riched20.dll' is already a macro; use the 'rename' qualifier
//     no_auto_exclude: avoids warnings
//     no_namespace: no longer using this option, which avoids variable redifinition compile errors on Vista
//#define GENERATE_TLH
#ifdef GENERATE_TLH
#	import "riched20.dll" raw_interfaces_only, raw_native_types, named_guids, no_auto_exclude, no_implementation, rename( "FindText", "FindShit" )
#else
#	include "riched20.tlh"
#endif

static const char *		FONT_NAME				= "Courier";
static const int		FONT_HEIGHT				= 10;
static const int		FONT_WIDTH				= 8;
static const int		TAB_SIZE				= 4;

static const COLORREF	SRE_COLOR_BLACK			= RGB(   0,   0,   0 );
static const COLORREF	SRE_COLOR_WHITE			= RGB( 255, 255, 255 );
static const COLORREF	SRE_COLOR_RED			= RGB( 255,   0,   0 );
static const COLORREF	SRE_COLOR_GREEN			= RGB(   0, 255,   0 );
static const COLORREF	SRE_COLOR_BLUE			= RGB(   0,   0, 255 );
static const COLORREF	SRE_COLOR_YELLOW		= RGB( 255, 255,   0 );
static const COLORREF	SRE_COLOR_MAGENTA		= RGB( 255,   0, 255 );
static const COLORREF	SRE_COLOR_CYAN			= RGB(   0, 255, 255 );
static const COLORREF	SRE_COLOR_ORANGE		= RGB( 255, 128,   0 );
static const COLORREF	SRE_COLOR_PURPLE		= RGB( 150,   0, 150 );
static const COLORREF	SRE_COLOR_PINK			= RGB( 186, 102, 123 );
static const COLORREF	SRE_COLOR_GREY			= RGB(  85,  85,  85 );
static const COLORREF	SRE_COLOR_BROWN			= RGB( 100,  90,  20 );
static const COLORREF	SRE_COLOR_LIGHT_GREY	= RGB( 170, 170, 170 );
static const COLORREF	SRE_COLOR_LIGHT_BROWN	= RGB( 170, 150,  20 );
static const COLORREF	SRE_COLOR_DARK_GREEN	= RGB(   0, 128,   0 );
static const COLORREF	SRE_COLOR_DARK_CYAN		= RGB(   0, 150, 150 );
static const COLORREF	SRE_COLOR_DARK_YELLOW	= RGB( 220, 200,  20 );

typedef struct {
	const char *		keyWord;
	COLORREF			color;
	const char *		description;
} keyWord_t;

typedef bool (*objectMemberCallback_t)( const char *objectName, CListBox &listBox );
typedef bool (*toolTipCallback_t)( const char *name, CString &string );


class CSyntaxRichEditCtrl : public CRichEditCtrl {
public:
							CSyntaxRichEditCtrl( void );
							~CSyntaxRichEditCtrl( void );

	void					Init( void );

	void					SetCaseSensitive( bool caseSensitive );
	void					AllowPathNames( bool allow );
	void					EnableKeyWordAutoCompletion( bool enable );
	void					SetKeyWords( const keyWord_t kws[] );
	bool					LoadKeyWordsFromFile( const char *fileName );
	void					SetObjectMemberCallback( objectMemberCallback_t callback );
	void					SetFunctionParmCallback( toolTipCallback_t callback );
	void					SetToolTipCallback( toolTipCallback_t callback );

	void					SetDefaultColor( const COLORREF color );
	void					SetCommentColor( const COLORREF color );
	void					SetStringColor( const COLORREF color, const COLORREF altColor = -1 );
	void					SetLiteralColor( const COLORREF color );

	COLORREF				GetForeColor( int charIndex ) const;
	COLORREF				GetBackColor( int charIndex ) const;

	void					GetCursorPos( int &line, int &column, int &character ) const;
	CHARRANGE				GetVisibleRange( void ) const;

	void					GetText( idStr &text ) const;
	void					GetText( idStr &text, int startCharIndex, int endCharIndex ) const;
	void					SetText( const char *text );

	void					GoToLine( int line );
	bool					FindNext( const char *find, bool matchCase, bool matchWholeWords, bool searchForward );
	int						ReplaceAll( const char *find, const char *replace, bool matchCase, bool matchWholeWords );
	void					ReplaceText( int startCharIndex, int endCharIndex, const char *replace );

protected:
	virtual int				OnToolHitTest( CPoint point, TOOLINFO* pTI ) const;
	afx_msg BOOL			OnToolTipNotify( UINT id, NMHDR *pNMHDR, LRESULT *pResult );
	afx_msg UINT			OnGetDlgCode();
	afx_msg void			OnChar( UINT nChar, UINT nRepCnt, UINT nFlags );
	afx_msg void			OnKeyDown( UINT nKey, UINT nRepCnt, UINT nFlags );
	afx_msg void			OnLButtonDown( UINT nFlags, CPoint point );
	afx_msg BOOL			OnMouseWheel( UINT nFlags, short zDelta, CPoint pt );
	afx_msg void			OnMouseMove( UINT nFlags, CPoint point );
	afx_msg void			OnVScroll( UINT nSBCode, UINT nPos, CScrollBar* pScrollBar );
	afx_msg void			OnSize( UINT nType, int cx, int cy );
	afx_msg void			OnProtected( NMHDR *pNMHDR, LRESULT *pResult );
	afx_msg void			OnChange();
	afx_msg void			OnAutoCompleteListBoxChange();
	afx_msg void			OnAutoCompleteListBoxDblClk();

	DECLARE_MESSAGE_MAP()

	// settings
	CHARFORMAT2				defaultCharFormat;
	COLORREF				defaultColor;
	COLORREF				singleLineCommentColor;
	COLORREF				multiLineCommentColor;
	COLORREF				stringColor[2];
	COLORREF				literalColor;
	COLORREF				braceHighlightColor;

	typedef enum {
		CT_WHITESPACE,
		CT_COMMENT,
		CT_STRING,
		CT_LITERAL,
		CT_NUMBER,
		CT_NAME,
		CT_PUNCTUATION
	} charType_t;

	int						charType[256];

	idList<keyWord_t>		keyWordsFromFile;
	const keyWord_t *		keyWords;
	int *					keyWordLengths;
	COLORREF *				keyWordColors;
	idHashIndex				keyWordHash;

	bool					caseSensitive;
	bool					allowPathNames;
	bool					keyWordAutoCompletion;

	objectMemberCallback_t	GetObjectMembers;
	toolTipCallback_t		GetFunctionParms;
	toolTipCallback_t		GetToolTip;

	// run-time variables
	tom::ITextDocument *	m_TextDoc;
	tom::ITextFont *		m_DefaultFont;

	CHARRANGE				updateRange;
	bool					updateSyntaxHighlighting;
	int						stringColorIndex;
	int						stringColorLine;

	int						autoCompleteStart;
	CListBox				autoCompleteListBox;

	int						funcParmToolTipStart;
	CEdit					funcParmToolTip;

	int						bracedSection[2];

	CPoint					mousePoint;
	CToolTipCtrl *			keyWordToolTip;
	TCHAR *					m_pchTip;
	WCHAR *					m_pwchTip;

protected:
	void					InitFont( void );
	void					InitSyntaxHighlighting( void );
	void					SetCharType( int first, int last, int type );
	void					SetDefaultFont( int startCharIndex, int endCharIndex );
	void					SetColor( int startCharIndex, int endCharIndex, COLORREF foreColor, COLORREF backColor, bool bold );

	void					FreeKeyWordsFromFile( void );
	int						FindKeyWord( const char *keyWord, int length ) const;

	void					HighlightSyntax( int startCharIndex, int endCharIndex );
	void					UpdateVisibleRange( void );

	bool					GetNameBeforeCurrentSelection( CString &name, int &charIndex ) const;
	bool					GetNameForMousePosition( idStr &name ) const;

	void					AutoCompleteInsertText( void );
	void					AutoCompleteUpdate( void );
	void					AutoCompleteShow( int charIndex );
	void					AutoCompleteHide( void );

	void					ToolTipShow( int charIndex, const char *string );
	void					ToolTipHide( void );

	bool					BracedSectionStart( char braceStartChar, char braceEndChar );
	bool					BracedSectionEnd( char braceStartChar, char braceEndChar );
	void					BracedSectionAdjustEndTabs( void );
	void					BracedSectionShow( void );
	void					BracedSectionHide( void );
};

#endif /* !__CSYNTAXRICHEDITCTR_H__ */