]> git.saurik.com Git - wxWidgets.git/blobdiff - src/stc/ScintillaWX.cpp
More OS/2 update to fix some owner drawn things
[wxWidgets.git] / src / stc / ScintillaWX.cpp
index 1b65391a5923369da8ce3a3bfba2dd48d2d32a6d..5a256340edffe8d62a9b5b6474e5bb6a445fee7c 100644 (file)
@@ -63,7 +63,12 @@ void  wxSTCDropTarget::OnLeave() {
 #endif
 
 
-#if wxUSE_POPUPWIN
+#ifdef __WXGTK__
+#undef wxSTC_USE_POPUP
+#define wxSTC_USE_POPUP 0
+#endif
+
+#if wxUSE_POPUPWIN && wxSTC_USE_POPUP
 #include <wx/popupwin.h>
 #define wxSTCCallTipBase wxPopupWindow
 #define param2  wxBORDER_NONE  // popup's 2nd param is flags
@@ -80,6 +85,10 @@ public:
             m_ct = ct;
         }
 
+    ~wxSTCCallTip() {
+        if (HasCapture()) ReleaseMouse();
+    }
+
     void OnPaint(wxPaintEvent& evt) {
         wxPaintDC dc(this);
         Surface* surfaceWindow = Surface::Allocate();
@@ -88,7 +97,12 @@ public:
         delete surfaceWindow;
     }
 
-#if wxUSE_POPUPWIN
+    void OnFocus(wxFocusEvent& event) {
+        GetParent()->SetFocus();
+        event.Skip();
+    }
+
+#if wxUSE_POPUPWIN && wxSTC_USE_POPUP
     virtual void DoSetSize(int x, int y,
                            int width, int height,
                            int sizeFlags = wxSIZE_AUTO) {
@@ -98,6 +112,19 @@ public:
             GetParent()->ClientToScreen(NULL, &y);
         wxSTCCallTipBase::DoSetSize(x, y, width, height, sizeFlags);
     }
+
+    virtual bool Show( bool show = TRUE ) {
+        bool retval = wxSTCCallTipBase::Show(show);
+        if (show)
+            CaptureMouse();
+        else
+            if (HasCapture()) ReleaseMouse();
+        return retval;
+    }
+
+    void OnLeftDown(wxMouseEvent& ) {
+        Show(FALSE);
+    }
 #endif
 
 private:
@@ -107,6 +134,10 @@ private:
 
 BEGIN_EVENT_TABLE(wxSTCCallTip, wxSTCCallTipBase)
     EVT_PAINT(wxSTCCallTip::OnPaint)
+    EVT_SET_FOCUS(wxSTCCallTip::OnFocus)
+#if wxUSE_POPUPWIN && wxSTC_USE_POPUP
+    EVT_LEFT_DOWN(wxSTCCallTip::OnLeftDown)
+#endif
 END_EVENT_TABLE()
 
 
@@ -148,7 +179,7 @@ void ScintillaWX::Finalise() {
 
 void ScintillaWX::StartDrag() {
 #if wxUSE_DRAG_AND_DROP
-    wxString dragText(drag.s, drag.len);
+    wxString dragText = stc2wx(drag.s, drag.len);
 
     // Send an event to allow the drag text to be changed
     wxStyledTextEvent evt(wxEVT_STC_START_DRAG, stc->GetId());
@@ -295,9 +326,12 @@ void ScintillaWX::Copy() {
     if (currentPos != anchor) {
         SelectionText st;
         CopySelectionRange(&st);
-        wxTheClipboard->Open();
-        wxTheClipboard->SetData(new wxTextDataObject(wxString(st.s, st.len)));
-        wxTheClipboard->Close();
+        if (wxTheClipboard->Open()) {
+            wxTheClipboard->UsePrimarySelection();
+            wxString text = stc2wx(st.s, st.len);
+            wxTheClipboard->SetData(new wxTextDataObject(text));
+            wxTheClipboard->Close();
+        }
     }
 }
 
@@ -307,15 +341,17 @@ void ScintillaWX::Paste() {
     ClearSelection();
 
     wxTextDataObject data;
-    bool gotData;
+    bool gotData = FALSE;
 
-    wxTheClipboard->Open();
-    gotData = wxTheClipboard->GetData(data);
-    wxTheClipboard->Close();
+    if (wxTheClipboard->Open()) {
+        wxTheClipboard->UsePrimarySelection();
+        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)wx2stc(data.GetText());
+        int        len = strlen(buf);
+        pdoc->InsertString(currentPos, buf, len);
         SetEmptySelection(currentPos + len);
     }
 
@@ -326,12 +362,18 @@ void ScintillaWX::Paste() {
 
 
 bool ScintillaWX::CanPaste() {
-    bool canPaste;
+    bool canPaste = FALSE;
+    bool didOpen;
 
-    wxTheClipboard->Open();
-    canPaste = wxTheClipboard->IsSupported( wxDF_TEXT );
-    wxTheClipboard->Close();
+    if ( (didOpen = !wxTheClipboard->IsOpened()) )
+        wxTheClipboard->Open();
 
+    if (wxTheClipboard->IsOpened()) {
+        wxTheClipboard->UsePrimarySelection();
+        canPaste = wxTheClipboard->IsSupported(wxUSE_UNICODE ? wxDF_UNICODETEXT : wxDF_TEXT);
+        if (didOpen)
+            wxTheClipboard->Close();
+    }
     return canPaste;
 }
 
@@ -345,7 +387,7 @@ void ScintillaWX::AddToPopUp(const char *label, int cmd, bool enabled) {
     if (!label[0])
         ((wxMenu*)popup.GetID())->AppendSeparator();
     else
-        ((wxMenu*)popup.GetID())->Append(cmd, label);
+        ((wxMenu*)popup.GetID())->Append(cmd, stc2wx(label));
 
     if (!enabled)
         ((wxMenu*)popup.GetID())->Enable(cmd, enabled);
@@ -439,8 +481,9 @@ void ScintillaWX::DoVScroll(int type, int pos) {
     ScrollTo(topLineNew);
 }
 
-
-void ScintillaWX::DoMouseWheel(int rotation, int delta, int linesPerAction, int ctrlDown) {
+void ScintillaWX::DoMouseWheel(int rotation, int delta,
+                               int linesPerAction, int ctrlDown,
+                               bool isPageScroll ) {
     int topLineNew = topLine;
     int lines;
 
@@ -457,7 +500,10 @@ void ScintillaWX::DoMouseWheel(int rotation, int delta, int linesPerAction, int
         lines = wheelRotation / delta;
         wheelRotation -= lines * delta;
         if (lines != 0) {
-            lines *= linesPerAction;
+            if (isPageScroll)
+                lines = lines * LinesOnScreen();  // lines is either +1 or -1
+            else
+                lines *= linesPerAction;
             topLineNew -= lines;
             ScrollTo(topLineNew);
         }
@@ -497,45 +543,42 @@ 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) {
-#ifdef __WXGTK__
+#if defined(__WXGTK__) || defined(__WXMAC__)
     // Ctrl chars (A-Z) end up with the wrong keycode on wxGTK...
     if (ctrl && key >= 1 && key <= 26)
         key += 'A' - 1;
 #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);
@@ -553,7 +596,8 @@ void ScintillaWX::DoCommand(int ID) {
 
 
 void ScintillaWX::DoContextMenu(Point pt) {
-    ContextMenu(pt);
+    if (displayPopupMenu)
+        ContextMenu(pt);
 }
 
 void ScintillaWX::DoOnListBox() {
@@ -579,7 +623,7 @@ bool ScintillaWX::DoDropText(long x, long y, const wxString& data) {
     dragResult = evt.GetDragResult();
     if (dragResult == wxDragMove || dragResult == wxDragCopy) {
         DropAt(evt.GetPosition(),
-               evt.GetDragText(),
+               wx2stc(evt.GetDragText()),
                dragResult == wxDragMove,
                FALSE); // TODO: rectangular?
         return TRUE;