]> git.saurik.com Git - wxWidgets.git/blame - src/stc/stc.cpp.in
set the background brush to the window's background colour
[wxWidgets.git] / src / stc / stc.cpp.in
CommitLineData
f97d84a6
RD
1////////////////////////////////////////////////////////////////////////////
2// Name: stc.cpp
3// Purpose: A wxWindows implementation of Scintilla. This class is the
4// one meant to be used directly by wx applications. It does not
5// derive directly from the Scintilla classes, but instead
6// delegates most things to the real Scintilla class.
7// This allows the use of Scintilla without polluting the
8// namespace with all the classes and identifiers from Scintilla.
9//
10// Author: Robin Dunn
11//
12// Created: 13-Jan-2000
13// RCS-ID: $Id$
14// Copyright: (c) 2000 by Total Control Software
15// Licence: wxWindows license
16/////////////////////////////////////////////////////////////////////////////
17
18#include <ctype.h>
19
20#include "wx/stc/stc.h"
21#include "ScintillaWX.h"
22
23#include <wx/tokenzr.h>
24
25// The following code forces a reference to all of the Scintilla lexers.
26// If we don't do something like this, then the linker tends to "optimize"
27// them away. (eric@sourcegear.com)
28
29int wxForceScintillaLexers(void)
30{
65ec6247
RD
31 extern LexerModule lmAda;
32 extern LexerModule lmAVE;
33 extern LexerModule lmConf;
f97d84a6 34 extern LexerModule lmCPP;
b8b0e402 35 extern LexerModule lmNncrontab;
65ec6247 36 extern LexerModule lmEiffel;
f97d84a6 37 extern LexerModule lmHTML;
65ec6247
RD
38 extern LexerModule lmLISP;
39 extern LexerModule lmLua;
40 extern LexerModule lmBatch; // In LexOthers.cxx
41 extern LexerModule lmPascal;
f97d84a6
RD
42 extern LexerModule lmPerl;
43 extern LexerModule lmPython;
65ec6247 44 extern LexerModule lmRuby;
f97d84a6
RD
45 extern LexerModule lmSQL;
46 extern LexerModule lmVB;
47
65ec6247
RD
48 if ( &lmAda
49 && &lmAVE
50 && &lmConf
51 && &lmCPP
b8b0e402 52 && &lmNncrontab
65ec6247
RD
53 && &lmEiffel
54 && &lmHTML
55 && &lmLISP
56 && &lmLua
57 && &lmBatch
58 && &lmPascal
59 && &lmPerl
60 && &lmPython
61 && &lmRuby
62 && &lmSQL
63 && &lmVB )
f97d84a6
RD
64 {
65 return 1;
66 }
67 else
68 {
69 return 0;
70 }
71}
72
73//----------------------------------------------------------------------
74
75const wxChar* wxSTCNameStr = "stcwindow";
76
d25f5fbb
RD
77DEFINE_EVENT_TYPE( wxEVT_STC_CHANGE )
78DEFINE_EVENT_TYPE( wxEVT_STC_STYLENEEDED )
79DEFINE_EVENT_TYPE( wxEVT_STC_CHARADDED )
d25f5fbb
RD
80DEFINE_EVENT_TYPE( wxEVT_STC_SAVEPOINTREACHED )
81DEFINE_EVENT_TYPE( wxEVT_STC_SAVEPOINTLEFT )
82DEFINE_EVENT_TYPE( wxEVT_STC_ROMODIFYATTEMPT )
65ec6247 83DEFINE_EVENT_TYPE( wxEVT_STC_KEY )
d25f5fbb 84DEFINE_EVENT_TYPE( wxEVT_STC_DOUBLECLICK )
65ec6247 85DEFINE_EVENT_TYPE( wxEVT_STC_UPDATEUI )
d25f5fbb 86DEFINE_EVENT_TYPE( wxEVT_STC_MODIFIED )
d25f5fbb
RD
87DEFINE_EVENT_TYPE( wxEVT_STC_MACRORECORD )
88DEFINE_EVENT_TYPE( wxEVT_STC_MARGINCLICK )
89DEFINE_EVENT_TYPE( wxEVT_STC_NEEDSHOWN )
90DEFINE_EVENT_TYPE( wxEVT_STC_POSCHANGED )
65ec6247
RD
91DEFINE_EVENT_TYPE( wxEVT_STC_PAINTED )
92DEFINE_EVENT_TYPE( wxEVT_STC_USERLISTSELECTION )
93DEFINE_EVENT_TYPE( wxEVT_STC_URIDROPPED )
94DEFINE_EVENT_TYPE( wxEVT_STC_DWELLSTART )
95DEFINE_EVENT_TYPE( wxEVT_STC_DWELLEND )
1bc32508 96#if wxUSE_DRAG_AND_DROP
a29a241f
RD
97DEFINE_EVENT_TYPE( wxEVT_STC_START_DRAG )
98DEFINE_EVENT_TYPE( wxEVT_STC_DRAG_OVER )
99DEFINE_EVENT_TYPE( wxEVT_STC_DO_DROP )
1bc32508 100#endif
d25f5fbb
RD
101
102
f97d84a6
RD
103BEGIN_EVENT_TABLE(wxStyledTextCtrl, wxControl)
104 EVT_PAINT (wxStyledTextCtrl::OnPaint)
105 EVT_SCROLLWIN (wxStyledTextCtrl::OnScrollWin)
5fa4613c 106 EVT_SCROLL (wxStyledTextCtrl::OnScroll)
f97d84a6
RD
107 EVT_SIZE (wxStyledTextCtrl::OnSize)
108 EVT_LEFT_DOWN (wxStyledTextCtrl::OnMouseLeftDown)
4ceb1196
RD
109#ifdef __WXMSW__
110 // Let Scintilla see the double click as a second click
111 EVT_LEFT_DCLICK (wxStyledTextCtrl::OnMouseLeftDown)
112#endif
f97d84a6
RD
113 EVT_MOTION (wxStyledTextCtrl::OnMouseMove)
114 EVT_LEFT_UP (wxStyledTextCtrl::OnMouseLeftUp)
65ec6247 115 EVT_CONTEXT_MENU (wxStyledTextCtrl::OnContextMenu)
37d62433 116 EVT_MOUSEWHEEL (wxStyledTextCtrl::OnMouseWheel)
f97d84a6
RD
117 EVT_CHAR (wxStyledTextCtrl::OnChar)
118 EVT_KEY_DOWN (wxStyledTextCtrl::OnKeyDown)
119 EVT_KILL_FOCUS (wxStyledTextCtrl::OnLoseFocus)
120 EVT_SET_FOCUS (wxStyledTextCtrl::OnGainFocus)
121 EVT_SYS_COLOUR_CHANGED (wxStyledTextCtrl::OnSysColourChanged)
122 EVT_ERASE_BACKGROUND (wxStyledTextCtrl::OnEraseBackground)
123 EVT_MENU_RANGE (-1, -1, wxStyledTextCtrl::OnMenu)
124 EVT_LISTBOX_DCLICK (-1, wxStyledTextCtrl::OnListBox)
125END_EVENT_TABLE()
126
127
128IMPLEMENT_CLASS(wxStyledTextCtrl, wxControl)
129IMPLEMENT_DYNAMIC_CLASS(wxStyledTextEvent, wxCommandEvent)
130
131//----------------------------------------------------------------------
132// Constructor and Destructor
133
134wxStyledTextCtrl::wxStyledTextCtrl(wxWindow *parent,
135 wxWindowID id,
136 const wxPoint& pos,
137 const wxSize& size,
138 long style,
139 const wxString& name) :
140 wxControl(parent, id, pos, size,
141 style | wxVSCROLL | wxHSCROLL | wxWANTS_CHARS | wxCLIP_CHILDREN,
142 wxDefaultValidator, name)
143{
144 m_swx = new ScintillaWX(this);
145 m_stopWatch.Start();
d6582821 146 m_lastKeyDownConsumed = FALSE;
5fa4613c
RD
147 m_vScrollBar = NULL;
148 m_hScrollBar = NULL;
f97d84a6
RD
149}
150
151
152wxStyledTextCtrl::~wxStyledTextCtrl() {
153 delete m_swx;
154}
155
156
157//----------------------------------------------------------------------
158
159long wxStyledTextCtrl::SendMsg(int msg, long wp, long lp) {
160
161 return m_swx->WndProc(msg, wp, lp);
162}
163
164
165#ifdef MAKELONG
166#undef MAKELONG
167#endif
168
169#define MAKELONG(a, b) ((a) | ((b) << 16))
170
171
172static long wxColourAsLong(const wxColour& co) {
173 return (((long)co.Blue() << 16) |
174 ((long)co.Green() << 8) |
175 ((long)co.Red()));
176}
177
178static wxColour wxColourFromLong(long c) {
179 wxColour clr;
180 clr.Set(c & 0xff, (c >> 8) & 0xff, (c >> 16) & 0xff);
181 return clr;
182}
183
184
185static wxColour wxColourFromSpec(const wxString& spec) {
186 // spec should be #RRGGBB
187 char* junk;
188 int red = strtol(spec.Mid(1,2), &junk, 16);
189 int green = strtol(spec.Mid(3,2), &junk, 16);
190 int blue = strtol(spec.Mid(5,2), &junk, 16);
191 return wxColour(red, green, blue);
192}
193
194
195//----------------------------------------------------------------------
196// BEGIN generated section. The following code is automatically generated
197// by gen_iface.py from the contents of Scintilla.iface. Do not edit
198// this file. Edit stc.cpp.in or gen_iface.py instead and regenerate.
199
200%(METHOD_IMPS)s
201
202// END of generated section
203//----------------------------------------------------------------------
204
205
206// Returns the line number of the line with the caret.
207int wxStyledTextCtrl::GetCurrentLine() {
208 int line = LineFromPosition(GetCurrentPos());
209 return line;
210}
211
212
213// Extract style settings from a spec-string which is composed of one or
214// more of the following comma separated elements:
215//
216// bold turns on bold
217// italic turns on italics
218// fore:#RRGGBB sets the foreground colour
219// back:#RRGGBB sets the background colour
220// face:[facename] sets the font face name to use
221// size:[num] sets the font size in points
222// eol turns on eol filling
223// underline turns on underlining
224//
225void wxStyledTextCtrl::StyleSetSpec(int styleNum, const wxString& spec) {
226
227 wxStringTokenizer tkz(spec, ",");
228 while (tkz.HasMoreTokens()) {
229 wxString token = tkz.GetNextToken();
230
231 wxString option = token.BeforeFirst(':');
232 wxString val = token.AfterFirst(':');
233
234 if (option == "bold")
235 StyleSetBold(styleNum, true);
236
237 else if (option == "italic")
238 StyleSetItalic(styleNum, true);
239
240 else if (option == "underline")
241 StyleSetUnderline(styleNum, true);
242
243 else if (option == "eol")
244 StyleSetEOLFilled(styleNum, true);
245
246 else if (option == "size") {
247 long points;
248 if (val.ToLong(&points))
249 StyleSetSize(styleNum, points);
250 }
251
252 else if (option == "face")
253 StyleSetFaceName(styleNum, val);
254
255 else if (option == "fore")
256 StyleSetForeground(styleNum, wxColourFromSpec(val));
257
258 else if (option == "back")
259 StyleSetBackground(styleNum, wxColourFromSpec(val));
260 }
261}
262
263
264// Set style size, face, bold, italic, and underline attributes from
265// a wxFont's attributes.
266void wxStyledTextCtrl::StyleSetFont(int styleNum, wxFont& font) {
267 int size = font.GetPointSize();
268 wxString faceName = font.GetFaceName();
269 bool bold = font.GetWeight() == wxBOLD;
270 bool italic = font.GetStyle() != wxNORMAL;
271 bool under = font.GetUnderlined();
272
273 // TODO: add encoding/charset mapping
274 StyleSetFontAttr(styleNum, size, faceName, bold, italic, under);
275}
276
277// Set all font style attributes at once.
278void wxStyledTextCtrl::StyleSetFontAttr(int styleNum, int size,
279 const wxString& faceName,
280 bool bold, bool italic,
281 bool underline) {
282 StyleSetSize(styleNum, size);
283 StyleSetFaceName(styleNum, faceName);
284 StyleSetBold(styleNum, bold);
285 StyleSetItalic(styleNum, italic);
286 StyleSetUnderline(styleNum, underline);
287
288 // TODO: add encoding/charset mapping
289}
290
291
292// Perform one of the operations defined by the wxSTC_CMD_* constants.
293void wxStyledTextCtrl::CmdKeyExecute(int cmd) {
294 SendMsg(cmd);
295}
296
297
298// Set the left and right margin in the edit area, measured in pixels.
299void wxStyledTextCtrl::SetMargins(int left, int right) {
300 SetMarginLeft(left);
301 SetMarginRight(right);
302}
303
304
305// Retrieve the start and end positions of the current selection.
306void wxStyledTextCtrl::GetSelection(int* startPos, int* endPos) {
307 if (startPos != NULL)
308 *startPos = SendMsg(SCI_GETSELECTIONSTART);
309 if (endPos != NULL)
310 *endPos = SendMsg(SCI_GETSELECTIONEND);
311}
312
313
314// Retrieve the point in the window where a position is displayed.
315wxPoint wxStyledTextCtrl::PointFromPosition(int pos) {
316 int x = SendMsg(SCI_POINTXFROMPOSITION, 0, pos);
317 int y = SendMsg(SCI_POINTYFROMPOSITION, 0, pos);
318 return wxPoint(x, y);
319}
320
321// Scroll enough to make the given line visible
322void wxStyledTextCtrl::ScrollToLine(int line) {
323 m_swx->DoScrollToLine(line);
324}
325
326
327// Scroll enough to make the given column visible
328void wxStyledTextCtrl::ScrollToColumn(int column) {
329 m_swx->DoScrollToColumn(column);
330}
331
332
333
334//----------------------------------------------------------------------
335// Event handlers
336
337void wxStyledTextCtrl::OnPaint(wxPaintEvent& evt) {
338 wxPaintDC dc(this);
339 wxRegion region = GetUpdateRegion();
340
341 m_swx->DoPaint(&dc, region.GetBox());
342}
343
344void wxStyledTextCtrl::OnScrollWin(wxScrollWinEvent& evt) {
345 if (evt.GetOrientation() == wxHORIZONTAL)
346 m_swx->DoHScroll(evt.GetEventType(), evt.GetPosition());
347 else
348 m_swx->DoVScroll(evt.GetEventType(), evt.GetPosition());
349}
350
5fa4613c
RD
351void wxStyledTextCtrl::OnScroll(wxScrollEvent& evt) {
352 wxScrollBar* sb = wxDynamicCast(evt.GetEventObject(), wxScrollBar);
353 if (sb) {
354 if (sb->IsVertical())
355 m_swx->DoVScroll(evt.GetEventType(), evt.GetPosition());
356 else
357 m_swx->DoHScroll(evt.GetEventType(), evt.GetPosition());
358 }
359}
360
f97d84a6
RD
361void wxStyledTextCtrl::OnSize(wxSizeEvent& evt) {
362 wxSize sz = GetClientSize();
363 m_swx->DoSize(sz.x, sz.y);
364}
365
366void wxStyledTextCtrl::OnMouseLeftDown(wxMouseEvent& evt) {
367 wxPoint pt = evt.GetPosition();
368 m_swx->DoButtonDown(Point(pt.x, pt.y), m_stopWatch.Time(),
369 evt.ShiftDown(), evt.ControlDown(), evt.AltDown());
370}
371
372void wxStyledTextCtrl::OnMouseMove(wxMouseEvent& evt) {
373 wxPoint pt = evt.GetPosition();
374 m_swx->DoButtonMove(Point(pt.x, pt.y));
375}
376
377void wxStyledTextCtrl::OnMouseLeftUp(wxMouseEvent& evt) {
378 wxPoint pt = evt.GetPosition();
379 m_swx->DoButtonUp(Point(pt.x, pt.y), m_stopWatch.Time(),
380 evt.ControlDown());
381}
382
383
65ec6247 384void wxStyledTextCtrl::OnContextMenu(wxContextMenuEvent& evt) {
f97d84a6 385 wxPoint pt = evt.GetPosition();
65ec6247 386 ScreenToClient(&pt.x, &pt.y);
f97d84a6
RD
387 m_swx->DoContextMenu(Point(pt.x, pt.y));
388}
389
37d62433
RD
390
391void wxStyledTextCtrl::OnMouseWheel(wxMouseEvent& evt) {
392 m_swx->DoMouseWheel(evt.GetWheelRotation(),
393 evt.GetWheelDelta(),
65ec6247
RD
394 evt.GetLinesPerAction(),
395 evt.ControlDown());
37d62433
RD
396}
397
398
f97d84a6
RD
399void wxStyledTextCtrl::OnChar(wxKeyEvent& evt) {
400 long key = evt.KeyCode();
f3c2c221
RD
401
402// printf("OnChar key:%%d consumed:%%d ctrl:%%d alt:%%d\n",
403// key, m_lastKeyDownConsumed, evt.ControlDown(), evt.AltDown());
404
405 // AltGr keys???
406