]> git.saurik.com Git - wxWidgets.git/blobdiff - contrib/src/stc/ScintillaWX.cpp
Moved the cleanup code to an EVT_WINDOW_DESTROY handler.
[wxWidgets.git] / contrib / src / stc / ScintillaWX.cpp
index 6630a7d59c334eef737a4df417265b1d3e9bff13..f7336a7196d052321b9ab7ac3c5d591d5c7f325f 100644 (file)
 // Licence:     wxWindows license
 /////////////////////////////////////////////////////////////////////////////
 
 // Licence:     wxWindows license
 /////////////////////////////////////////////////////////////////////////////
 
-#include <ctype.h>
 
 #include "ScintillaWX.h"
 #include "wx/stc/stc.h"
 
 #include "ScintillaWX.h"
 #include "wx/stc/stc.h"
+#include "PlatWX.h"
 
 
 //----------------------------------------------------------------------
 
 
 //----------------------------------------------------------------------
@@ -63,30 +63,53 @@ void  wxSTCDropTarget::OnLeave() {
 #endif
 
 
 #endif
 
 
-class wxSTCCallTip : public wxWindow {
+#if wxUSE_POPUPWIN
+#include <wx/popupwin.h>
+#define wxSTCCallTipBase wxPopupWindow
+#define param2  wxBORDER_NONE  // popup's 2nd param is flags
+#else
+#define wxSTCCallTipBase wxWindow
+#define param2 -1 // wxWindows 2nd param is ID
+#endif
+
+class wxSTCCallTip : public wxSTCCallTipBase {
 public:
 public:
-    wxSTCCallTip(wxWindow* parent, int ID, CallTip* ct)
-        : wxWindow(parent, ID)
+    wxSTCCallTip(wxWindow* parent, CallTip* ct)
+        : wxSTCCallTipBase(parent, param2)
         {
             m_ct = ct;
         }
 
     void OnPaint(wxPaintEvent& evt) {
         wxPaintDC dc(this);
         {
             m_ct = ct;
         }
 
     void OnPaint(wxPaintEvent& evt) {
         wxPaintDC dc(this);
-        Surface surfaceWindow;
-        surfaceWindow.Init(&dc);
-        m_ct->PaintCT(&surfaceWindow);
-        surfaceWindow.Release();
+        Surface* surfaceWindow = Surface::Allocate();
+        surfaceWindow->Init(&dc);
+        m_ct->PaintCT(surfaceWindow);
+        delete surfaceWindow;
     }
 
     }
 
+#if wxUSE_POPUPWIN
+    virtual void DoSetSize(int x, int y,
+                           int width, int height,
+                           int sizeFlags = wxSIZE_AUTO) {
+        if (x != -1)
+            GetParent()->ClientToScreen(&x, NULL);
+        if (y != -1)
+            GetParent()->ClientToScreen(NULL, &y);
+        wxSTCCallTipBase::DoSetSize(x, y, width, height, sizeFlags);
+    }
+#endif
+
+private:
     CallTip*    m_ct;
     DECLARE_EVENT_TABLE()
 };
 
     CallTip*    m_ct;
     DECLARE_EVENT_TABLE()
 };
 
-BEGIN_EVENT_TABLE(wxSTCCallTip, wxWindow)
+BEGIN_EVENT_TABLE(wxSTCCallTip, wxSTCCallTipBase)
     EVT_PAINT(wxSTCCallTip::OnPaint)
 END_EVENT_TABLE()
 
     EVT_PAINT(wxSTCCallTip::OnPaint)
 END_EVENT_TABLE()
 
+
 //----------------------------------------------------------------------
 // Constructor/Destructor
 
 //----------------------------------------------------------------------
 // Constructor/Destructor
 
@@ -125,7 +148,7 @@ void ScintillaWX::Finalise() {
 
 void ScintillaWX::StartDrag() {
 #if wxUSE_DRAG_AND_DROP
 
 void ScintillaWX::StartDrag() {
 #if wxUSE_DRAG_AND_DROP
-    wxString dragText(drag.s, drag.len);
+    wxString dragText(drag.s, wxConvUTF8, drag.len);
 
     // Send an event to allow the drag text to be changed
     wxStyledTextEvent evt(wxEVT_STC_START_DRAG, stc->GetId());
 
     // Send an event to allow the drag text to be changed
     wxStyledTextEvent evt(wxEVT_STC_START_DRAG, stc->GetId());
@@ -161,7 +184,7 @@ void ScintillaWX::SetTicking(bool on) {
         if (timer.ticking) {
             steTimer = new wxSTCTimer(this);
             steTimer->Start(timer.tickSize);
         if (timer.ticking) {
             steTimer = new wxSTCTimer(this);
             steTimer->Start(timer.tickSize);
-            timer.tickerID = (int)steTimer;
+            timer.tickerID = steTimer;
         } else {
             steTimer = (wxSTCTimer*)timer.tickerID;
             steTimer->Stop();
         } else {
             steTimer = (wxSTCTimer*)timer.tickerID;
             steTimer->Stop();
@@ -273,7 +296,8 @@ void ScintillaWX::Copy() {
         SelectionText st;
         CopySelectionRange(&st);
         wxTheClipboard->Open();
         SelectionText st;
         CopySelectionRange(&st);
         wxTheClipboard->Open();
-        wxTheClipboard->SetData(new wxTextDataObject(wxString(st.s, st.len)));
+        wxString text(st.s, wxConvUTF8, st.len);
+        wxTheClipboard->SetData(new wxTextDataObject(text));
         wxTheClipboard->Close();
     }
 }
         wxTheClipboard->Close();
     }
 }
@@ -290,9 +314,9 @@ void ScintillaWX::Paste() {
     gotData = wxTheClipboard->GetData(data);
     wxTheClipboard->Close();
     if (gotData) {
     gotData = wxTheClipboard->GetData(data);
     wxTheClipboard->Close();
     if (gotData) {
-        wxString str = data.GetText();
-        int      len = str.Length();
-        pdoc->InsertString(currentPos, str.c_str(), len);
+        wxWX2MBbuf buf = (wxWX2MBbuf)data.GetText().mb_str(wxConvUTF8);
+        int        len = strlen(buf);
+        pdoc->InsertString(currentPos, buf, len);
         SetEmptySelection(currentPos + len);
     }
 
         SetEmptySelection(currentPos + len);
     }
 
@@ -306,26 +330,26 @@ bool ScintillaWX::CanPaste() {
     bool canPaste;
 
     wxTheClipboard->Open();
     bool canPaste;
 
     wxTheClipboard->Open();
-    canPaste = wxTheClipboard->IsSupported( wxDF_TEXT );
+    canPaste = wxTheClipboard->IsSupported(wxUSE_UNICODE ? wxDF_UNICODETEXT : wxDF_TEXT);
     wxTheClipboard->Close();
 
     return canPaste;
 }
 
 void ScintillaWX::CreateCallTipWindow(PRectangle) {
     wxTheClipboard->Close();
 
     return canPaste;
 }
 
 void ScintillaWX::CreateCallTipWindow(PRectangle) {
-    ct.wCallTip = new wxSTCCallTip(stc, -1, &ct);
+    ct.wCallTip = new wxSTCCallTip(stc, &ct);
     ct.wDraw = ct.wCallTip;
 }
 
 
 void ScintillaWX::AddToPopUp(const char *label, int cmd, bool enabled) {
     if (!label[0])
     ct.wDraw = ct.wCallTip;
 }
 
 
 void ScintillaWX::AddToPopUp(const char *label, int cmd, bool enabled) {
     if (!label[0])
-        popup.GetID()->AppendSeparator();
+        ((wxMenu*)popup.GetID())->AppendSeparator();
     else
     else
-        popup.GetID()->Append(cmd, label);
+        ((wxMenu*)popup.GetID())->Append(cmd, wxString(label, *wxConvCurrent));
 
     if (!enabled)
 
     if (!enabled)
-        popup.GetID()->Enable(cmd, enabled);
+        ((wxMenu*)popup.GetID())->Enable(cmd, enabled);
 }
 
 
 }
 
 
@@ -356,13 +380,13 @@ long ScintillaWX::WndProc(unsigned int iMessage, unsigned long wParam, long lPar
 void ScintillaWX::DoPaint(wxDC* dc, wxRect rect) {
 
     paintState = painting;
 void ScintillaWX::DoPaint(wxDC* dc, wxRect rect) {
 
     paintState = painting;
-    Surface surfaceWindow;
-    surfaceWindow.Init(dc);
+    Surface* surfaceWindow = Surface::Allocate();
+    surfaceWindow->Init(dc);
     PRectangle rcPaint = PRectangleFromwxRect(rect);
     dc->BeginDrawing();
     PRectangle rcPaint = PRectangleFromwxRect(rect);
     dc->BeginDrawing();
-    Paint(&surfaceWindow, rcPaint);
+    Paint(surfaceWindow, rcPaint);
     dc->EndDrawing();
     dc->EndDrawing();
-    surfaceWindow.Release();
+    delete surfaceWindow;
     if (paintState == paintAbandoned) {
         // Painting area was insufficient to cover new styling or brace highlight positions
         FullPaint();
     if (paintState == paintAbandoned) {
         // Painting area was insufficient to cover new styling or brace highlight positions
         FullPaint();
@@ -443,9 +467,10 @@ void ScintillaWX::DoMouseWheel(int rotation, int delta, int linesPerAction, int
 
 
 void ScintillaWX::DoSize(int width, int height) {
 
 
 void ScintillaWX::DoSize(int width, int height) {
-    PRectangle rcClient(0,0,width,height);
-    SetScrollBarsTo(rcClient);
-    DropGraphics();
+//      PRectangle rcClient(0,0,width,height);
+//      SetScrollBarsTo(rcClient);
+//      DropGraphics();
+    ChangeSize();
 }
 
 void ScintillaWX::DoLoseFocus(){
 }
 
 void ScintillaWX::DoLoseFocus(){
@@ -473,8 +498,8 @@ void ScintillaWX::DoButtonMove(Point pt) {
 }
 
 
 }
 
 
-void ScintillaWX::DoAddChar(char ch) {
-    AddChar(ch);
+void ScintillaWX::DoAddChar(int key) {
+    AddChar(key);
 }
 
 int  ScintillaWX::DoKeyDown(int key, bool shift, bool ctrl, bool alt, bool* consumed) {
 }
 
 int  ScintillaWX::DoKeyDown(int key, bool shift, bool ctrl, bool alt, bool* consumed) {
@@ -485,33 +510,30 @@ int  ScintillaWX::DoKeyDown(int key, bool shift, bool ctrl, bool alt, bool* cons
 #endif
 
     switch (key) {
 #endif
 
     switch (key) {
-    case WXK_DOWN: key = SCK_DOWN; break;
-    case WXK_UP: key = SCK_UP; break;
-    case WXK_LEFT: key = SCK_LEFT; break;
-    case WXK_RIGHT: key = SCK_RIGHT; break;
-    case WXK_HOME: key = SCK_HOME; break;
-    case WXK_END: key = SCK_END; break;
-    case WXK_PRIOR: key = SCK_PRIOR; break;
-    case WXK_NEXT: key = SCK_NEXT; break;
-    case WXK_DELETE: key = SCK_DELETE; break;
-    case WXK_INSERT: key = SCK_INSERT; break;
-    case WXK_ESCAPE: key = SCK_ESCAPE; break;
-    case WXK_BACK: key = SCK_BACK; break;
-    case WXK_TAB: key = SCK_TAB; break;
-    case WXK_RETURN: key = SCK_RETURN; break;
-    case WXK_ADD:
-    case WXK_NUMPAD_ADD:
-        key = SCK_ADD; break;
-    case WXK_SUBTRACT:
-    case WXK_NUMPAD_SUBTRACT:
-        key = SCK_SUBTRACT; break;
-    case WXK_DIVIDE:
-    case WXK_NUMPAD_DIVIDE:
-        key = SCK_DIVIDE; break;
-    case WXK_CONTROL: key = 0; break;
-    case WXK_ALT: key = 0; break;
-    case WXK_SHIFT: key = 0; break;
-    case WXK_MENU: key = 0; break;
+    case WXK_DOWN:              key = SCK_DOWN;     break;
+    case WXK_UP:                key = SCK_UP;       break;
+    case WXK_LEFT:              key = SCK_LEFT;     break;
+    case WXK_RIGHT:             key = SCK_RIGHT;    break;
+    case WXK_HOME:              key = SCK_HOME;     break;
+    case WXK_END:               key = SCK_END;      break;
+    case WXK_PRIOR:             key = SCK_PRIOR;    break;
+    case WXK_NEXT:              key = SCK_NEXT;     break;
+    case WXK_DELETE:            key = SCK_DELETE;   break;
+    case WXK_INSERT:            key = SCK_INSERT;   break;
+    case WXK_ESCAPE:            key = SCK_ESCAPE;   break;
+    case WXK_BACK:              key = SCK_BACK;     break;
+    case WXK_TAB:               key = SCK_TAB;      break;
+    case WXK_RETURN:            key = SCK_RETURN;   break;
+    case WXK_ADD:               // fall through
+    case WXK_NUMPAD_ADD:        key = SCK_ADD;      break;
+    case WXK_SUBTRACT:          // fall through
+    case WXK_NUMPAD_SUBTRACT:   key = SCK_SUBTRACT; break;
+    case WXK_DIVIDE:            // fall through
+    case WXK_NUMPAD_DIVIDE:     key = SCK_DIVIDE;   break;
+    case WXK_CONTROL:           key = 0; break;
+    case WXK_ALT:               key = 0; break;
+    case WXK_SHIFT:             key = 0; break;
+    case WXK_MENU:              key = 0; break;
     }
 
     int rv = KeyDown(key, shift, ctrl, alt, consumed);
     }
 
     int rv = KeyDown(key, shift, ctrl, alt, consumed);
@@ -555,7 +577,7 @@ bool ScintillaWX::DoDropText(long x, long y, const wxString& data) {
     dragResult = evt.GetDragResult();
     if (dragResult == wxDragMove || dragResult == wxDragCopy) {
         DropAt(evt.GetPosition(),
     dragResult = evt.GetDragResult();
     if (dragResult == wxDragMove || dragResult == wxDragCopy) {
         DropAt(evt.GetPosition(),
-               evt.GetDragText(),
+               evt.GetDragText().mb_str(wxConvUTF8),
                dragResult == wxDragMove,
                FALSE); // TODO: rectangular?
         return TRUE;
                dragResult == wxDragMove,
                FALSE); // TODO: rectangular?
         return TRUE;
@@ -599,10 +621,10 @@ void ScintillaWX::FullPaint() {
     rcPaint = GetTextRectangle();
     paintingAllText = true;
     wxClientDC dc(stc);
     rcPaint = GetTextRectangle();
     paintingAllText = true;
     wxClientDC dc(stc);
-    Surface surfaceWindow;
-    surfaceWindow.Init(&dc);
-    Paint(&surfaceWindow, rcPaint);
-    surfaceWindow.Release();
+    Surface* surfaceWindow = Surface::Allocate();
+    surfaceWindow->Init(&dc);
+    Paint(surfaceWindow, rcPaint);
+    delete surfaceWindow;
 
 //     stc->Refresh(FALSE);
 
 
 //     stc->Refresh(FALSE);