]> git.saurik.com Git - wxWidgets.git/blob - src/stc/ScintillaWX.cpp
This commit includes the following changes:
[wxWidgets.git] / src / stc / ScintillaWX.cpp
1 ////////////////////////////////////////////////////////////////////////////
2 // Name: ScintillaWX.cxx
3 // Purpose: A wxWindows implementation of Scintilla. A class derived
4 // from ScintillaBase that uses the "wx platform" defined in
5 // PlatformWX.cxx This class is one end of a bridge between
6 // the wx world and the Scintilla world. It needs a peer
7 // object of type wxStyledTextCtrl to function.
8 //
9 // Author: Robin Dunn
10 //
11 // Created: 13-Jan-2000
12 // RCS-ID: $Id$
13 // Copyright: (c) 2000 by Total Control Software
14 // Licence: wxWindows license
15 /////////////////////////////////////////////////////////////////////////////
16
17 #include <ctype.h>
18
19 #include "ScintillaWX.h"
20 #include "wx/stc/stc.h"
21
22
23 //----------------------------------------------------------------------
24
25 const int H_SCROLL_MAX = 2000;
26 const int H_SCROLL_STEP = 20;
27 const int H_SCROLL_PAGE = 200;
28
29 //----------------------------------------------------------------------
30 // Helper classes
31
32 class wxSTCTimer : public wxTimer {
33 public:
34 wxSTCTimer(ScintillaWX* swx) {
35 this->swx = swx;
36 }
37
38 void Notify() {
39 swx->DoTick();
40 }
41
42 private:
43 ScintillaWX* swx;
44 };
45
46
47
48 bool wxSTCDropTarget::OnDropText(wxCoord x, wxCoord y, const wxString& data) {
49 return swx->DoDropText(x, y, data);
50 }
51
52 wxDragResult wxSTCDropTarget::OnEnter(wxCoord x, wxCoord y, wxDragResult def) {
53 return swx->DoDragEnter(x, y, def);
54 }
55
56 wxDragResult wxSTCDropTarget::OnDragOver(wxCoord x, wxCoord y, wxDragResult def) {
57 return swx->DoDragOver(x, y, def);
58 }
59
60 void wxSTCDropTarget::OnLeave() {
61 swx->DoDragLeave();
62 }
63
64
65
66 //----------------------------------------------------------------------
67 // Constructor/Destructor
68
69
70 ScintillaWX::ScintillaWX(wxStyledTextCtrl* win) {
71 capturedMouse = false;
72 wMain = win;
73 wDraw = win;
74 stc = win;
75 Initialise();
76 }
77
78
79 ScintillaWX::~ScintillaWX() {
80 SetTicking(false);
81 }
82
83 //----------------------------------------------------------------------
84 // base class virtuals
85
86
87 void ScintillaWX::Initialise() {
88 //ScintillaBase::Initialise();
89 dropTarget = new wxSTCDropTarget;
90 dropTarget->SetScintilla(this);
91 stc->SetDropTarget(dropTarget);
92 }
93
94
95 void ScintillaWX::Finalise() {
96 ScintillaBase::Finalise();
97 }
98
99
100 void ScintillaWX::StartDrag() {
101 wxDropSource source(wMain.GetID());
102 wxTextDataObject data(dragChars);
103 wxDragResult result;
104
105 source.SetData(data);
106 result = source.DoDragDrop(TRUE);
107 if (result == wxDragMove && dropWentOutside)
108 ClearSelection();
109 inDragDrop = FALSE;
110 SetDragPosition(invalidPosition);
111 }
112
113
114 void ScintillaWX::SetTicking(bool on) {
115 wxSTCTimer* steTimer;
116 if (timer.ticking != on) {
117 timer.ticking = on;
118 if (timer.ticking) {
119 steTimer = new wxSTCTimer(this);
120 steTimer->Start(timer.tickSize);
121 timer.tickerID = (int)steTimer;
122 } else {
123 steTimer = (wxSTCTimer*)timer.tickerID;
124 steTimer->Stop();
125 delete steTimer;
126 timer.tickerID = 0;
127 }
128 }
129 timer.ticksToWait = caret.period;
130 }
131
132
133 void ScintillaWX::SetMouseCapture(bool on) {
134 if (on && !capturedMouse)
135 wMain.GetID()->CaptureMouse();
136 else if (!on && capturedMouse)
137 wMain.GetID()->ReleaseMouse();
138 capturedMouse = on;
139 }
140
141
142 bool ScintillaWX::HaveMouseCapture() {
143 return capturedMouse;
144 }
145
146
147 void ScintillaWX::ScrollText(int linesToMove) {
148 int dy = vs.lineHeight * (linesToMove);
149 // TODO: calculate the rectangle to refreshed...
150 wMain.GetID()->ScrollWindow(0, dy);
151 }
152
153 void ScintillaWX::SetVerticalScrollPos() {
154 wMain.GetID()->SetScrollPos(wxVERTICAL, topLine);
155 }
156
157 void ScintillaWX::SetHorizontalScrollPos() {
158 wMain.GetID()->SetScrollPos(wxHORIZONTAL, xOffset);
159 }
160
161
162 bool ScintillaWX::ModifyScrollBars(int nMax, int nPage) {
163 bool modified = false;
164 int sbMax = wMain.GetID()->GetScrollRange(wxVERTICAL);
165 int sbThumb = wMain.GetID()->GetScrollThumb(wxVERTICAL);
166 int sbPos = wMain.GetID()->GetScrollPos(wxVERTICAL);
167
168
169 if (sbMax != nMax || sbThumb != nPage) {
170 wMain.GetID()->SetScrollbar(wxVERTICAL, sbPos, nPage, nMax);
171 modified = true;
172 }
173
174 sbMax = wMain.GetID()->GetScrollRange(wxHORIZONTAL);
175 sbThumb = wMain.GetID()->GetScrollThumb(wxHORIZONTAL);
176 if ((sbMax != H_SCROLL_MAX) || (sbThumb != H_SCROLL_STEP)) {
177 wMain.GetID()->SetScrollbar(wxHORIZONTAL, 0, H_SCROLL_STEP, H_SCROLL_MAX);
178 modified = true;
179 }
180 return modified;
181 }
182
183
184 void ScintillaWX::NotifyChange() {
185 stc->NotifyChange();
186 }
187
188
189 void ScintillaWX::NotifyParent(SCNotification scn) {
190 stc->NotifyParent(&scn);
191 }
192
193
194
195 void ScintillaWX::Copy() {
196 if (currentPos != anchor) {
197 char* text = CopySelectionRange();
198 textDO.SetText(text);
199 wxTheClipboard->Open();
200 wxTheClipboard->SetData(&textDO);
201 wxTheClipboard->Close();
202 }
203 }
204
205
206 void ScintillaWX::Paste() {
207 pdoc->BeginUndoAction();
208 ClearSelection();
209
210 wxTextDataObject data;
211 bool canPaste;
212
213 wxTheClipboard->Open();
214 canPaste = wxTheClipboard->GetData(data);
215 wxTheClipboard->Close();
216 if (canPaste) {
217 wxString str = data.GetText();
218 int len = str.Length();
219 pdoc->InsertString(currentPos, str.c_str(), len);
220 SetEmptySelection(currentPos + len);
221 }
222
223 pdoc->EndUndoAction();
224 NotifyChange();
225 Redraw();
226 }
227
228
229 bool ScintillaWX::CanPaste() {
230 wxTextDataObject data;
231 bool canPaste;
232
233 wxTheClipboard->Open();
234 canPaste = wxTheClipboard->GetData(data);
235 wxTheClipboard->Close();
236
237 return canPaste;
238 }
239
240 void ScintillaWX::CreateCallTipWindow(PRectangle) {
241 ct.wCallTip = new wxWindow(wDraw.GetID(), -1);
242 ct.wDraw = ct.wCallTip;
243 }
244
245
246 void ScintillaWX::AddToPopUp(const char *label, int cmd, bool enabled) {
247 if (!label[0])
248 popup.GetID()->AppendSeparator();
249 else
250 popup.GetID()->Append(cmd, label);
251
252 if (!enabled)
253 popup.GetID()->Enable(cmd, enabled);
254
255 // TODO: need to create event handler mappings for the cmd ID
256 }
257
258
259 void ScintillaWX::ClaimSelection() {
260
261 }
262
263
264 LRESULT ScintillaWX::DefWndProc(UINT /*iMessage*/, WPARAM /*wParam*/, LPARAM /*lParam*/) {
265 return 0;
266 }
267
268 LRESULT ScintillaWX::WndProc(UINT iMessage, WPARAM wParam, LPARAM lParam) {
269 switch (iMessage) {
270 case EM_CANPASTE:
271 return CanPaste();
272 default:
273 return ScintillaBase::WndProc(iMessage, wParam, lParam);
274 }
275 return 0;
276 }
277
278
279
280 //----------------------------------------------------------------------
281 // Event delegates
282
283 void ScintillaWX::DoPaint(wxDC* dc, wxRect rect) {
284
285 paintState = painting;
286 Surface surfaceWindow;
287 surfaceWindow.Init(dc);
288 PRectangle rcPaint = PRectangleFromwxRect(rect);
289 dc->BeginDrawing();
290 Paint(&surfaceWindow, rcPaint);
291 dc->EndDrawing();
292 surfaceWindow.Release();
293 if (paintState == paintAbandoned) {
294 // Painting area was insufficient to cover new styling or brace highlight positions
295 FullPaint();
296 }
297 paintState = notPainting;
298 }
299
300
301 void ScintillaWX::DoHScroll(int type, int pos) {
302 int xPos = xOffset;
303 switch (type) {
304 case wxEVT_SCROLLWIN_LINEUP:
305 xPos -= H_SCROLL_STEP;
306 break;
307 case wxEVT_SCROLLWIN_LINEDOWN:
308 xPos += H_SCROLL_STEP;
309 break;
310 case wxEVT_SCROLLWIN_PAGEUP:
311 xPos -= H_SCROLL_PAGE;
312 break;
313 case wxEVT_SCROLLWIN_PAGEDOWN:
314 xPos += H_SCROLL_PAGE;
315 break;
316 case wxEVT_SCROLLWIN_TOP:
317 xPos = 0;
318 break;
319 case wxEVT_SCROLLWIN_BOTTOM:
320 xPos = H_SCROLL_MAX;
321 break;
322 case wxEVT_SCROLLWIN_THUMBTRACK:
323 xPos = pos;
324 break;
325 }
326 HorizontalScrollTo(xPos);
327 }
328
329 void ScintillaWX::DoVScroll(int type, int pos) {
330 int topLineNew = topLine;
331 switch (type) {
332 case wxEVT_SCROLLWIN_LINEUP:
333 topLineNew -= 1;
334 break;
335 case wxEVT_SCROLLWIN_LINEDOWN:
336 topLineNew += 1;
337 break;
338 case wxEVT_SCROLLWIN_PAGEUP:
339 topLineNew -= LinesToScroll();
340 break;
341 case wxEVT_SCROLLWIN_PAGEDOWN:
342 topLineNew += LinesToScroll();
343 break;
344 case wxEVT_SCROLLWIN_TOP:
345 topLineNew = 0;
346 break;
347 case wxEVT_SCROLLWIN_BOTTOM:
348 topLineNew = MaxScrollPos();
349 break;
350 case wxEVT_SCROLLWIN_THUMBTRACK:
351 topLineNew = pos;
352 break;
353 }
354 ScrollTo(topLineNew);
355 }
356
357 void ScintillaWX::DoSize(int width, int height) {
358 PRectangle rcClient(0,0,width,height);
359 SetScrollBarsTo(rcClient);
360 DropGraphics();
361 }
362
363 void ScintillaWX::DoLoseFocus(){
364 DropCaret();
365 }
366
367 void ScintillaWX::DoGainFocus(){
368 ShowCaretAtCurrentPosition();
369 }
370
371 void ScintillaWX::DoSysColourChange() {
372 InvalidateStyleData();
373 }
374
375 void ScintillaWX::DoButtonDown(Point pt, unsigned int curTime, bool shift, bool ctrl, bool alt) {
376 ButtonDown(pt, curTime, shift, ctrl, alt);
377 }
378
379 void ScintillaWX::DoButtonUp(Point pt, unsigned int curTime, bool ctrl) {
380 ButtonUp(pt, curTime, ctrl);
381 }
382
383 void ScintillaWX::DoButtonMove(Point pt) {
384 ButtonMove(pt);
385 }
386
387
388 void ScintillaWX::DoAddChar(char ch) {
389 AddChar(ch);
390 }
391
392 int ScintillaWX::DoKeyDown(int key, bool shift, bool ctrl, bool alt) {
393 return KeyDown(key, shift, ctrl, alt);
394 }
395
396
397 void ScintillaWX::DoCommand(int ID) {
398 Command(ID);
399 }
400
401
402 void ScintillaWX::DoContextMenu(Point pt) {
403 ContextMenu(pt);
404 }
405
406
407 //----------------------------------------------------------------------
408
409 bool ScintillaWX::DoDropText(long x, long y, const wxString& data) {
410 SetDragPosition(invalidPosition);
411 int movePos = PositionFromLocation(Point(x,y));
412 DropAt(movePos, data, dragResult == wxDragMove, FALSE); // TODO: rectangular?
413 return TRUE;
414 }
415
416
417 wxDragResult ScintillaWX::DoDragEnter(wxCoord x, wxCoord y, wxDragResult def) {
418 return def;
419 }
420
421
422 wxDragResult ScintillaWX::DoDragOver(wxCoord x, wxCoord y, wxDragResult def) {
423 SetDragPosition(PositionFromLocation(Point(x, y)));
424 dragResult = def;
425 return def;
426 }
427
428
429 void ScintillaWX::DoDragLeave() {
430 SetDragPosition(invalidPosition);
431 }
432
433 //----------------------------------------------------------------------
434
435 // Redraw all of text area. This paint will not be abandoned.
436 void ScintillaWX::FullPaint() {
437 paintState = painting;
438 rcPaint = GetTextRectangle();
439 wxClientDC dc(wMain.GetID());
440 Surface surfaceWindow;
441 surfaceWindow.Init(&dc);
442 Paint(&surfaceWindow, rcPaint);
443 surfaceWindow.Release();
444 paintState = notPainting;
445 }
446
447
448 void ScintillaWX::DoScrollToLine(int line) {
449 ScrollTo(line);
450 }
451
452
453 void ScintillaWX::DoScrollToColumn(int column) {
454 HorizontalScrollTo(column * vs.spaceWidth);
455 }
456
457
458
459 //----------------------------------------------------------------------
460 //----------------------------------------------------------------------