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. 
  11 // Created:     13-Jan-2000 
  13 // Copyright:   (c) 2000 by Total Control Software 
  14 // Licence:     wxWindows license 
  15 ///////////////////////////////////////////////////////////////////////////// 
  18 #include "ScintillaWX.h" 
  19 #include "wx/stc/stc.h" 
  22 //---------------------------------------------------------------------- 
  25 class wxSTCTimer 
: public wxTimer 
{ 
  27     wxSTCTimer(ScintillaWX
* swx
) { 
  40 #if wxUSE_DRAG_AND_DROP 
  41 bool wxSTCDropTarget::OnDropText(wxCoord x
, wxCoord y
, const wxString
& data
) { 
  42     return swx
->DoDropText(x
, y
, data
); 
  45 wxDragResult  
wxSTCDropTarget::OnEnter(wxCoord x
, wxCoord y
, wxDragResult def
) { 
  46     return swx
->DoDragEnter(x
, y
, def
); 
  49 wxDragResult  
wxSTCDropTarget::OnDragOver(wxCoord x
, wxCoord y
, wxDragResult def
) { 
  50     return swx
->DoDragOver(x
, y
, def
); 
  53 void  wxSTCDropTarget::OnLeave() { 
  60 #undef wxSTC_USE_POPUP 
  61 #define wxSTC_USE_POPUP 0 
  64 #if wxUSE_POPUPWIN && wxSTC_USE_POPUP 
  65 #include <wx/popupwin.h> 
  66 #define wxSTCCallTipBase wxPopupWindow 
  67 #define param2  wxBORDER_NONE  // popup's 2nd param is flags 
  69 #define wxSTCCallTipBase wxWindow 
  70 #define param2 -1 // wxWindows 2nd param is ID 
  73 class wxSTCCallTip 
: public wxSTCCallTipBase 
{ 
  75     wxSTCCallTip(wxWindow
* parent
, CallTip
* ct
) 
  76         : wxSTCCallTipBase(parent
, param2
) 
  82         if (HasCapture()) ReleaseMouse(); 
  85     void OnPaint(wxPaintEvent
& evt
) { 
  87         Surface
* surfaceWindow 
= Surface::Allocate(); 
  88         surfaceWindow
->Init(&dc
); 
  89         m_ct
->PaintCT(surfaceWindow
); 
  93     void OnFocus(wxFocusEvent
& event
) { 
  94         GetParent()->SetFocus(); 
  98 #if wxUSE_POPUPWIN && wxSTC_USE_POPUP 
  99     virtual void DoSetSize(int x
, int y
, 
 100                            int width
, int height
, 
 101                            int sizeFlags 
= wxSIZE_AUTO
) { 
 103             GetParent()->ClientToScreen(&x
, NULL
); 
 105             GetParent()->ClientToScreen(NULL
, &y
); 
 106         wxSTCCallTipBase::DoSetSize(x
, y
, width
, height
, sizeFlags
); 
 109     virtual bool Show( bool show 
= TRUE 
) { 
 110         bool retval 
= wxSTCCallTipBase::Show(show
); 
 114             if (HasCapture()) ReleaseMouse(); 
 118     void OnLeftDown(wxMouseEvent
& ) { 
 125     DECLARE_EVENT_TABLE() 
 128 BEGIN_EVENT_TABLE(wxSTCCallTip
, wxSTCCallTipBase
) 
 129     EVT_PAINT(wxSTCCallTip::OnPaint
) 
 130     EVT_SET_FOCUS(wxSTCCallTip::OnFocus
) 
 131 #if wxUSE_POPUPWIN && wxSTC_USE_POPUP 
 132     EVT_LEFT_DOWN(wxSTCCallTip::OnLeftDown
) 
 137 //---------------------------------------------------------------------- 
 138 // Constructor/Destructor 
 141 ScintillaWX::ScintillaWX(wxStyledTextCtrl
* win
) { 
 149 ScintillaWX::~ScintillaWX() { 
 153 //---------------------------------------------------------------------- 
 154 // base class virtuals 
 157 void ScintillaWX::Initialise() { 
 158     //ScintillaBase::Initialise(); 
 159 #if wxUSE_DRAG_AND_DROP 
 160     dropTarget 
= new wxSTCDropTarget
; 
 161     dropTarget
->SetScintilla(this); 
 162     stc
->SetDropTarget(dropTarget
); 
 167 void ScintillaWX::Finalise() { 
 168     ScintillaBase::Finalise(); 
 172 void ScintillaWX::StartDrag() { 
 173 #if wxUSE_DRAG_AND_DROP 
 174     wxString dragText 
= stc2wx(drag
.s
, drag
.len
); 
 176     // Send an event to allow the drag text to be changed 
 177     wxStyledTextEvent 
evt(wxEVT_STC_START_DRAG
, stc
->GetId()); 
 178     evt
.SetEventObject(stc
); 
 179     evt
.SetDragText(dragText
); 
 180     evt
.SetDragAllowMove(TRUE
); 
 181     evt
.SetPosition(wxMin(stc
->GetSelectionStart(), 
 182                           stc
->GetSelectionEnd())); 
 183     stc
->GetEventHandler()->ProcessEvent(evt
); 
 184     dragText 
= evt
.GetDragText(); 
 186     if (dragText
.Length()) { 
 187         wxDropSource        
source(stc
); 
 188         wxTextDataObject    
data(dragText
); 
 191         source
.SetData(data
); 
 192         dropWentOutside 
= TRUE
; 
 193         result 
= source
.DoDragDrop(evt
.GetDragAllowMove()); 
 194         if (result 
== wxDragMove 
&& dropWentOutside
) 
 197         SetDragPosition(invalidPosition
); 
 203 void ScintillaWX::SetTicking(bool on
) { 
 204     wxSTCTimer
* steTimer
; 
 205     if (timer
.ticking 
!= on
) { 
 208             steTimer 
= new wxSTCTimer(this); 
 209             steTimer
->Start(timer
.tickSize
); 
 210             timer
.tickerID 
= steTimer
; 
 212             steTimer 
= (wxSTCTimer
*)timer
.tickerID
; 
 218     timer
.ticksToWait 
= caret
.period
; 
 222 void ScintillaWX::SetMouseCapture(bool on
) { 
 223     if (on 
&& !stc
->HasCapture()) 
 225     else if (!on 
&& stc
->HasCapture()) 
 230 bool ScintillaWX::HaveMouseCapture() { 
 231     return stc
->HasCapture(); 
 235 void ScintillaWX::ScrollText(int linesToMove
) { 
 236     int dy 
= vs
.lineHeight 
* (linesToMove
); 
 237     stc
->ScrollWindow(0, dy
); 
 241 void ScintillaWX::SetVerticalScrollPos() { 
 242     if (stc
->m_vScrollBar 
== NULL
) {  // Use built-in scrollbar 
 243         stc
->SetScrollPos(wxVERTICAL
, topLine
); 
 245     else { // otherwise use the one that's been given to us 
 246         stc
->m_vScrollBar
->SetThumbPosition(topLine
); 
 250 void ScintillaWX::SetHorizontalScrollPos() { 
 251     if (stc
->m_hScrollBar 
== NULL
) {  // Use built-in scrollbar 
 252         stc
->SetScrollPos(wxHORIZONTAL
, xOffset
); 
 254     else { // otherwise use the one that's been given to us 
 255         stc
->m_hScrollBar
->SetThumbPosition(xOffset
); 
 259 const int H_SCROLL_STEP 
= 20; 
 261 bool ScintillaWX::ModifyScrollBars(int nMax
, int nPage
) { 
 262     bool modified 
= false; 
 264     // Check the vertical scrollbar 
 265     if (stc
->m_vScrollBar 
== NULL
) {  // Use built-in scrollbar 
 266         int  sbMax    
= stc
->GetScrollRange(wxVERTICAL
); 
 267         int  sbThumb  
= stc
->GetScrollThumb(wxVERTICAL
); 
 268         int  sbPos    
= stc
->GetScrollPos(wxVERTICAL
); 
 269         if (sbMax 
!= nMax 
|| sbThumb 
!= nPage
) { 
 270             stc
->SetScrollbar(wxVERTICAL
, sbPos
, nPage
, nMax
+1); 
 274     else { // otherwise use the one that's been given to us 
 275         int  sbMax    
= stc
->m_vScrollBar
->GetRange(); 
 276         int  sbPage   
= stc
->m_vScrollBar
->GetPageSize(); 
 277         int  sbPos    
= stc
->m_vScrollBar
->GetThumbPosition(); 
 278         if (sbMax 
!= nMax 
|| sbPage 
!= nPage
) { 
 279             stc
->m_vScrollBar
->SetScrollbar(sbPos
, nPage
, nMax
+1, nPage
); 
 285     // Check the horizontal scrollbar 
 286     PRectangle rcText 
= GetTextRectangle(); 
 287     int horizEnd 
= scrollWidth
; 
 290     if (!horizontalScrollBarVisible 
|| (wrapState 
!= eWrapNone
)) 
 292     int pageWidth 
= rcText
.Width(); 
 294     if (stc
->m_hScrollBar 
== NULL
) {  // Use built-in scrollbar 
 295         int sbMax    
= stc
->GetScrollRange(wxHORIZONTAL
); 
 296         int sbThumb  
= stc
->GetScrollThumb(wxHORIZONTAL
); 
 297         int sbPos    
= stc
->GetScrollPos(wxHORIZONTAL
); 
 298         if ((sbMax 
!= horizEnd
) || (sbThumb 
!= pageWidth
) || (sbPos 
!= 0)) { 
 299             stc
->SetScrollbar(wxHORIZONTAL
, 0, pageWidth
, horizEnd
); 
 301             if (scrollWidth 
< pageWidth
) { 
 302                 HorizontalScrollTo(0); 
 306     else { // otherwise use the one that's been given to us 
 307         int sbMax    
= stc
->m_hScrollBar
->GetRange(); 
 308         int sbThumb  
= stc
->m_hScrollBar
->GetPageSize(); 
 309         int sbPos    
= stc
->m_hScrollBar
->GetThumbPosition(); 
 310         if ((sbMax 
!= horizEnd
) || (sbThumb 
!= pageWidth
) || (sbPos 
!= 0)) { 
 311             stc
->m_hScrollBar
->SetScrollbar(0, pageWidth
, horizEnd
, pageWidth
); 
 313             if (scrollWidth 
< pageWidth
) { 
 314                 HorizontalScrollTo(0); 
 323 void ScintillaWX::NotifyChange() { 
 328 void ScintillaWX::NotifyParent(SCNotification scn
) { 
 329     stc
->NotifyParent(&scn
); 
 334 void ScintillaWX::Copy() { 
 335     if (currentPos 
!= anchor
) { 
 337         CopySelectionRange(&st
); 
 338         if (wxTheClipboard
->Open()) { 
 339             wxTheClipboard
->UsePrimarySelection(FALSE
); 
 340             wxString text 
= stc2wx(st
.s
, st
.len
); 
 341             wxTheClipboard
->SetData(new wxTextDataObject(text
)); 
 342             wxTheClipboard
->Close(); 
 348 void ScintillaWX::Paste() { 
 349     pdoc
->BeginUndoAction(); 
 352     wxTextDataObject data
; 
 353     bool gotData 
= FALSE
; 
 355     if (wxTheClipboard
->Open()) { 
 356         wxTheClipboard
->UsePrimarySelection(FALSE
); 
 357         gotData 
= wxTheClipboard
->GetData(data
); 
 358         wxTheClipboard
->Close(); 
 361         wxWX2MBbuf buf 
= (wxWX2MBbuf
)wx2stc(data
.GetText()); 
 362         int        len 
= strlen(buf
); 
 363         pdoc
->InsertString(currentPos
, buf
, len
); 
 364         SetEmptySelection(currentPos 
+ len
); 
 367     pdoc
->EndUndoAction(); 
 373 bool ScintillaWX::CanPaste() { 
 374     bool canPaste 
= FALSE
; 
 377     if ( (didOpen 
= !wxTheClipboard
->IsOpened()) ) 
 378         wxTheClipboard
->Open(); 
 380     if (wxTheClipboard
->IsOpened()) { 
 381         wxTheClipboard
->UsePrimarySelection(FALSE
); 
 382         canPaste 
= wxTheClipboard
->IsSupported(wxUSE_UNICODE 
? wxDF_UNICODETEXT 
: wxDF_TEXT
); 
 384             wxTheClipboard
->Close(); 
 389 void ScintillaWX::CreateCallTipWindow(PRectangle
) { 
 390     ct
.wCallTip 
= new wxSTCCallTip(stc
, &ct
); 
 391     ct
.wDraw 
= ct
.wCallTip
; 
 395 void ScintillaWX::AddToPopUp(const char *label
, int cmd
, bool enabled
) { 
 397         ((wxMenu
*)popup
.GetID())->AppendSeparator(); 
 399         ((wxMenu
*)popup
.GetID())->Append(cmd
, stc2wx(label
)); 
 402         ((wxMenu
*)popup
.GetID())->Enable(cmd
, enabled
); 
 406 // This is called by the Editor base class whenever something is selected 
 407 void ScintillaWX::ClaimSelection() { 
 409     // Until wxGTK is able to support using both the primary selection and the 
 410     // clipboard at the same time I think it causes more problems than it is 
 411     // worth to implement this method.  Selecting text should not clear the 
 412     // clipboard.  --Robin 
 414     // Put the selected text in the PRIMARY selection 
 415     if (currentPos 
!= anchor
) { 
 417         CopySelectionRange(&st
); 
 418         if (wxTheClipboard
->Open()) { 
 419             wxTheClipboard
->UsePrimarySelection(TRUE
); 
 420             wxString text 
= stc2wx(st
.s
, st
.len
); 
 421             wxTheClipboard
->SetData(new wxTextDataObject(text
)); 
 422             wxTheClipboard
->UsePrimarySelection(FALSE
); 
 423             wxTheClipboard
->Close(); 
 431 long ScintillaWX::DefWndProc(unsigned int /*iMessage*/, unsigned long /*wParam*/, long /*lParam*/) { 
 435 long ScintillaWX::WndProc(unsigned int iMessage
, unsigned long wParam
, long lParam
) { 
 437       case SCI_CALLTIPSHOW
: { 
 438           // NOTE: This is copied here from scintilla/src/ScintillaBase.cxx 
 439           // because of the little tweak that needs done below.  When updating 
 440           // new versions double check that this is still needed, and that any 
 441           // new code there is copied here too. 
 442           AutoCompleteCancel(); 
 443           if (!ct
.wCallTip
.Created()) { 
 444               Point pt 
= LocationFromPosition(wParam
); 
 445               pt
.y 
+= vs
.lineHeight
; 
 446               PRectangle rc 
= ct
.CallTipStart(currentPos
, pt
, 
 447                                               reinterpret_cast<char *>(lParam
), 
 448                                               vs
.styles
[STYLE_DEFAULT
].fontName
, 
 449                                               vs
.styles
[STYLE_DEFAULT
].sizeZoomed
, 
 451               // If the call-tip window would be out of the client 
 452               // space, adjust so it displays above the text. 
 453               PRectangle rcClient 
= GetClientRectangle(); 
 454               if (rc
.bottom 
> rcClient
.bottom
) { 
 456                   int offset 
= int(vs
.lineHeight 
* 1.25)  + rc
.Height(); 
 458                   int offset 
= vs
.lineHeight 
+ rc
.Height(); 
 463               // Now display the window. 
 464               CreateCallTipWindow(rc
); 
 465               ct
.wCallTip
.SetPositionRelative(rc
, wMain
); 
 472           return ScintillaBase::WndProc(iMessage
, wParam
, lParam
); 
 479 //---------------------------------------------------------------------- 
 482 void ScintillaWX::DoPaint(wxDC
* dc
, wxRect rect
) { 
 484     paintState 
= painting
; 
 485     Surface
* surfaceWindow 
= Surface::Allocate(); 
 486     surfaceWindow
->Init(dc
); 
 487     PRectangle rcPaint 
= PRectangleFromwxRect(rect
); 
 489     Paint(surfaceWindow
, rcPaint
); 
 491     delete surfaceWindow
; 
 492     if (paintState 
== paintAbandoned
) { 
 493         // Painting area was insufficient to cover new styling or brace highlight positions 
 496     paintState 
= notPainting
; 
 498     // On wxGTK the editor window paints can overwrite the listbox... 
 500         ((wxWindow
*)ac
.lb
.GetID())->Refresh(TRUE
); 
 505 void ScintillaWX::DoHScroll(int type
, int pos
) { 
 507     PRectangle rcText 
= GetTextRectangle(); 
 508     int pageWidth 
= rcText
.Width() * 2 / 3; 
 509     if (type 
== wxEVT_SCROLLWIN_LINEUP 
|| type 
== wxEVT_SCROLL_LINEUP
) 
 510         xPos 
-= H_SCROLL_STEP
; 
 511     else if (type 
== wxEVT_SCROLLWIN_LINEDOWN 
|| type 
== wxEVT_SCROLL_LINEDOWN
) 
 512         xPos 
+= H_SCROLL_STEP
; 
 513     else if (type 
== wxEVT_SCROLLWIN_PAGEUP 
|| type 
== wxEVT_SCROLL_PAGEUP
) 
 515     else if (type 
== wxEVT_SCROLLWIN_PAGEDOWN 
|| type 
== wxEVT_SCROLL_PAGEDOWN
) { 
 517         if (xPos 
> scrollWidth 
- rcText
.Width()) { 
 518             xPos 
= scrollWidth 
- rcText
.Width(); 
 521     else if (type 
== wxEVT_SCROLLWIN_TOP 
|| type 
== wxEVT_SCROLL_TOP
) 
 523     else if (type 
== wxEVT_SCROLLWIN_BOTTOM 
|| type 
== wxEVT_SCROLL_BOTTOM
) 
 525     else if (type 
== wxEVT_SCROLLWIN_THUMBTRACK 
|| type 
== wxEVT_SCROLL_THUMBTRACK
) 
 528     HorizontalScrollTo(xPos
); 
 531 void ScintillaWX::DoVScroll(int type
, int pos
) { 
 532     int topLineNew 
= topLine
; 
 533     if (type 
== wxEVT_SCROLLWIN_LINEUP 
|| type 
== wxEVT_SCROLL_LINEUP
) 
 535     else if (type 
== wxEVT_SCROLLWIN_LINEDOWN 
|| type 
== wxEVT_SCROLL_LINEDOWN
) 
 537     else if (type 
==  wxEVT_SCROLLWIN_PAGEUP 
|| type 
== wxEVT_SCROLL_PAGEUP
) 
 538         topLineNew 
-= LinesToScroll(); 
 539     else if (type 
==  wxEVT_SCROLLWIN_PAGEDOWN 
|| type 
== wxEVT_SCROLL_PAGEDOWN
) 
 540         topLineNew 
+= LinesToScroll(); 
 541     else if (type 
==  wxEVT_SCROLLWIN_TOP 
|| type 
== wxEVT_SCROLL_TOP
) 
 543     else if (type 
==  wxEVT_SCROLLWIN_BOTTOM 
|| type 
== wxEVT_SCROLL_BOTTOM
) 
 544         topLineNew 
= MaxScrollPos(); 
 545     else if (type 
==   wxEVT_SCROLLWIN_THUMBTRACK 
|| type 
== wxEVT_SCROLL_THUMBTRACK
) 
 548     ScrollTo(topLineNew
); 
 551 void ScintillaWX::DoMouseWheel(int rotation
, int delta
, 
 552                                int linesPerAction
, int ctrlDown
, 
 553                                bool isPageScroll 
) { 
 554     int topLineNew 
= topLine
; 
 557     if (ctrlDown
) {  // Zoom the fonts if Ctrl key down 
 559             KeyCommand(SCI_ZOOMIN
); 
 562             KeyCommand(SCI_ZOOMOUT
); 
 565     else { // otherwise just scroll the window 
 568         wheelRotation 
+= rotation
; 
 569         lines 
= wheelRotation 
/ delta
; 
 570         wheelRotation 
-= lines 
* delta
; 
 573                 lines 
= lines 
* LinesOnScreen();  // lines is either +1 or -1 
 575                 lines 
*= linesPerAction
; 
 577             ScrollTo(topLineNew
); 
 583 void ScintillaWX::DoSize(int width
, int height
) { 
 584 //      PRectangle rcClient(0,0,width,height); 
 585 //      SetScrollBarsTo(rcClient); 
 590 void ScintillaWX::DoLoseFocus(){ 
 591     SetFocusState(false); 
 594 void ScintillaWX::DoGainFocus(){ 
 598 void ScintillaWX::DoSysColourChange() { 
 599     InvalidateStyleData(); 
 602 void ScintillaWX::DoLeftButtonDown(Point pt
, unsigned int curTime
, bool shift
, bool ctrl
, bool alt
) { 
 603     ButtonDown(pt
, curTime
, shift
, ctrl
, alt
); 
 606 void ScintillaWX::DoLeftButtonUp(Point pt
, unsigned int curTime
, bool ctrl
) { 
 607     ButtonUp(pt
, curTime
, ctrl
); 
 610 void ScintillaWX::DoLeftButtonMove(Point pt
) { 
 614 void ScintillaWX::DoMiddleButtonUp(Point pt
) { 
 616     // Set the current position to the mouse click point and 
 617     // then paste in the PRIMARY selection, if any.  wxGTK only. 
 618     int newPos 
= PositionFromLocation(pt
); 
 619     MovePositionTo(newPos
, 0, 1); 
 621     pdoc
->BeginUndoAction(); 
 622     wxTextDataObject data
; 
 623     bool gotData 
= FALSE
; 
 624     if (wxTheClipboard
->Open()) { 
 625         wxTheClipboard
->UsePrimarySelection(TRUE
); 
 626         gotData 
= wxTheClipboard
->GetData(data
); 
 627         wxTheClipboard
->UsePrimarySelection(FALSE
); 
 628         wxTheClipboard
->Close(); 
 631         wxWX2MBbuf buf 
= (wxWX2MBbuf
)wx2stc(data
.GetText()); 
 632         int        len 
= strlen(buf
); 
 633         pdoc
->InsertString(currentPos
, buf
, len
); 
 634         SetEmptySelection(currentPos 
+ len
); 
 636     pdoc
->EndUndoAction(); 
 640     ShowCaretAtCurrentPosition(); 
 641     EnsureCaretVisible(); 
 646 void ScintillaWX::DoAddChar(int key
) { 
 651     wxWX2MBbuf buf 
= (wxWX2MBbuf
)wx2stc(wszChars
); 
 652     AddCharUTF((char*)buf
.data(), strlen(buf
)); 
 659 int  ScintillaWX::DoKeyDown(int key
, bool shift
, bool ctrl
, bool alt
, bool* consumed
) { 
 660 #if defined(__WXGTK__) || defined(__WXMAC__) 
 661     // Ctrl chars (A-Z) end up with the wrong keycode on wxGTK... 
 662     if (ctrl 
&& key 
>= 1 && key 
<= 26) 
 667     case WXK_DOWN
:              key 
= SCK_DOWN
;     break; 
 668     case WXK_UP
:                key 
= SCK_UP
;       break; 
 669     case WXK_LEFT
:              key 
= SCK_LEFT
;     break; 
 670     case WXK_RIGHT
:             key 
= SCK_RIGHT
;    break; 
 671     case WXK_HOME
:              key 
= SCK_HOME
;     break; 
 672     case WXK_END
:               key 
= SCK_END
;      break; 
 673     case WXK_PAGEUP
:            // fall through 
 674     case WXK_PRIOR
:             key 
= SCK_PRIOR
;    break; 
 675     case WXK_PAGEDOWN
:          // fall through 
 676     case WXK_NEXT
:              key 
= SCK_NEXT
;     break; 
 677     case WXK_DELETE
:            key 
= SCK_DELETE
;   break; 
 678     case WXK_INSERT
:            key 
= SCK_INSERT
;   break; 
 679     case WXK_ESCAPE
:            key 
= SCK_ESCAPE
;   break; 
 680     case WXK_BACK
:              key 
= SCK_BACK
;     break; 
 681     case WXK_TAB
:               key 
= SCK_TAB
;      break; 
 682     case WXK_RETURN
:            key 
= SCK_RETURN
;   break; 
 683     case WXK_ADD
:               // fall through 
 684     case WXK_NUMPAD_ADD
:        key 
= SCK_ADD
;      break; 
 685     case WXK_SUBTRACT
:          // fall through 
 686     case WXK_NUMPAD_SUBTRACT
:   key 
= SCK_SUBTRACT
; break; 
 687     case WXK_DIVIDE
:            // fall through 
 688     case WXK_NUMPAD_DIVIDE
:     key 
= SCK_DIVIDE
;   break; 
 689     case WXK_CONTROL
:           key 
= 0; break; 
 690     case WXK_ALT
:               key 
= 0; break; 
 691     case WXK_SHIFT
:             key 
= 0; break; 
 692     case WXK_MENU
:              key 
= 0; break; 
 695     int rv 
= KeyDown(key
, shift
, ctrl
, alt
, consumed
); 
 704 void ScintillaWX::DoCommand(int ID
) { 
 709 void ScintillaWX::DoContextMenu(Point pt
) { 
 710     if (displayPopupMenu
) 
 714 void ScintillaWX::DoOnListBox() { 
 715     AutoCompleteCompleted(); 
 718 //---------------------------------------------------------------------- 
 720 #if wxUSE_DRAG_AND_DROP 
 721 bool ScintillaWX::DoDropText(long x
, long y
, const wxString
& data
) { 
 722     SetDragPosition(invalidPosition
); 
 724     // Send an event to allow the drag details to be changed 
 725     wxStyledTextEvent 
evt(wxEVT_STC_DO_DROP
, stc
->GetId()); 
 726     evt
.SetEventObject(stc
); 
 727     evt
.SetDragResult(dragResult
); 
 730     evt
.SetPosition(PositionFromLocation(Point(x
,y
))); 
 731     evt
.SetDragText(data
); 
 732     stc
->GetEventHandler()->ProcessEvent(evt
); 
 734     dragResult 
= evt
.GetDragResult(); 
 735     if (dragResult 
== wxDragMove 
|| dragResult 
== wxDragCopy
) { 
 736         DropAt(evt
.GetPosition(), 
 737                wx2stc(evt
.GetDragText()), 
 738                dragResult 
== wxDragMove
, 
 739                FALSE
); // TODO: rectangular? 
 746 wxDragResult 
ScintillaWX::DoDragEnter(wxCoord x
, wxCoord y
, wxDragResult def
) { 
 752 wxDragResult 
ScintillaWX::DoDragOver(wxCoord x
, wxCoord y
, wxDragResult def
) { 
 753     SetDragPosition(PositionFromLocation(Point(x
, y
))); 
 755     // Send an event to allow the drag result to be changed 
 756     wxStyledTextEvent 
evt(wxEVT_STC_DRAG_OVER
, stc
->GetId()); 
 757     evt
.SetEventObject(stc
); 
 758     evt
.SetDragResult(def
); 
 761     evt
.SetPosition(PositionFromLocation(Point(x
,y
))); 
 762     stc
->GetEventHandler()->ProcessEvent(evt
); 
 764     dragResult 
= evt
.GetDragResult(); 
 769 void ScintillaWX::DoDragLeave() { 
 770     SetDragPosition(invalidPosition
); 
 773 //---------------------------------------------------------------------- 
 775 // Redraw all of text area. This paint will not be abandoned. 
 776 void ScintillaWX::FullPaint() { 
 777     paintState 
= painting
; 
 778     rcPaint 
= GetTextRectangle(); 
 779     paintingAllText 
= true; 
 781     Surface
* surfaceWindow 
= Surface::Allocate(); 
 782     surfaceWindow
->Init(&dc
); 
 783     Paint(surfaceWindow
, rcPaint
); 
 784     delete surfaceWindow
; 
 786 //     stc->Refresh(FALSE); 
 788     paintState 
= notPainting
; 
 792 void ScintillaWX::DoScrollToLine(int line
) { 
 797 void ScintillaWX::DoScrollToColumn(int column
) { 
 798     HorizontalScrollTo(column 
* vs
.spaceWidth
); 
 803 //---------------------------------------------------------------------- 
 804 //----------------------------------------------------------------------