]> git.saurik.com Git - wxWidgets.git/blobdiff - contrib/src/stc/PlatWX.cpp
Applied recent FL patches from Benjamin Williams <biwilliajsb@yahoo.com>.
[wxWidgets.git] / contrib / src / stc / PlatWX.cpp
index c4fcfb5123f2473035a918cbf320d0adce2e3062..35d5fc08772f01b96a2d80073503321ad30f7e3c 100644 (file)
@@ -187,7 +187,7 @@ void Font::Create(const char *faceName, int characterSet, int size, bool bold, b
                     italic ? wxITALIC :  wxNORMAL,
                     bold ? wxBOLD : wxNORMAL,
                     false,
-                    wxString(faceName, wxConvUTF8),
+                    stc2wx(faceName),
                     encoding);
 }
 
@@ -284,9 +284,16 @@ bool SurfaceImpl::Initialised() {
 }
 
 void SurfaceImpl::Init() {
+#if 0
     Release();
     hdc = new wxMemoryDC();
     hdcOwned = true;
+#else
+    // On Mac and GTK(?) the DC is not really valid until it has a bitmap
+    // selected into it.  So instead of just creating the DC with no bitmap,
+    // go ahead and give it one.
+    InitPixMap(1,1,NULL);
+#endif
 }
 
 void SurfaceImpl::Init(SurfaceID hdc_) {
@@ -393,12 +400,9 @@ void SurfaceImpl::DrawTextNoClip(PRectangle rc, Font &font, int ybase,
     hdc->SetTextBackground(wxColourFromCA(back));
     FillRectangle(rc, back);
 
-    // will convert from UTF-8 in unicode mode
-    wxString str(s, wxConvUTF8, len);
-
     // ybase is where the baseline should be, but wxWin uses the upper left
     // corner, so I need to calculate the real position for the text...
-    hdc->DrawText(str, rc.left, ybase - font.ascent);
+    hdc->DrawText(stc2wx(s, len), rc.left, ybase - font.ascent);
 }
 
 void SurfaceImpl::DrawTextClipped(PRectangle rc, Font &font, int ybase,
@@ -410,11 +414,8 @@ void SurfaceImpl::DrawTextClipped(PRectangle rc, Font &font, int ybase,
     FillRectangle(rc, back);
     hdc->SetClippingRegion(wxRectFromPRectangle(rc));
 
-    // will convert from UTF-8 in unicode mode
-    wxString str(s, wxConvUTF8, len);
-
     // see comments above
-    hdc->DrawText(str, rc.left, ybase - font.ascent);
+    hdc->DrawText(stc2wx(s, len), rc.left, ybase - font.ascent);
     hdc->DestroyClippingRegion();
 }
 
@@ -423,17 +424,13 @@ int SurfaceImpl::WidthText(Font &font, const char *s, int len) {
     int w;
     int h;
 
-    // will convert from UTF-8 in unicode mode
-    wxString str(s, wxConvUTF8, len);
-
-    hdc->GetTextExtent(str, &w, &h);
+    hdc->GetTextExtent(stc2wx(s, len), &w, &h);
     return w;
 }
 
 
 void SurfaceImpl::MeasureWidths(Font &font, const char *s, int len, int *positions) {
-    // will convert from UTF-8 in unicode mode
-    wxString str(s, wxConvUTF8, len);
+    wxString str = stc2wx(s, len);
     SetFont(font);
 
     // Calculate the position of each character based on the widths of
@@ -481,9 +478,7 @@ int SurfaceImpl::WidthChar(Font &font, char ch) {
     int h;
     char s[2] = { ch, 0 };
 
-    // will convert from UTF-8 in unicode mode
-    wxString str(s, wxConvUTF8, 1);
-    hdc->GetTextExtent(str, &w, &h);
+    hdc->GetTextExtent(stc2wx(s, 1), &w, &h);
     return w;
 }
 
@@ -643,16 +638,45 @@ void Window::SetCursor(Cursor curs) {
 
 
 void Window::SetTitle(const char *s) {
-    // will convert from UTF-8 in unicode mode
-    wxString str(s, wxConvUTF8);
-    GETWIN(id)->SetTitle(str);
+    GETWIN(id)->SetTitle(stc2wx(s));
 }
 
 
 //----------------------------------------------------------------------
 // Helper classes for ListBox
 
-// A wxListBox that gives focus back to its parent if it gets it.
+
+#if defined(__WXMAC__)
+class wxSTCListBoxWin : public wxListBox {
+public:
+    wxSTCListBoxWin(wxWindow* parent, wxWindowID id)
+        : wxListBox(parent, id, wxDefaultPosition, wxSize(0,0),
+                    0, NULL, wxLB_SINGLE | wxSIMPLE_BORDER) {
+        SetCursor(wxCursor(wxCURSOR_ARROW));
+        Hide();
+    }
+
+    void OnFocus(wxFocusEvent& event) {
+        GetParent()->SetFocus();
+        event.Skip();
+    }
+
+    wxListBox* GetLB() { return this; }
+
+private:
+    DECLARE_EVENT_TABLE()
+};
+
+
+BEGIN_EVENT_TABLE(wxSTCListBoxWin, wxListBox)
+    EVT_SET_FOCUS(wxSTCListBoxWin::OnFocus)
+END_EVENT_TABLE()
+
+
+
+#else
+
+
 class wxSTCListBox : public wxListBox {
 public:
     wxSTCListBox(wxWindow* parent, wxWindowID id)
@@ -660,9 +684,10 @@ public:
                     0, NULL, wxLB_SINGLE | wxSIMPLE_BORDER)
         {}
 
-    void OnFocus(wxFocusEvent& event) {
-        GetParent()->SetFocus();
-        event.Skip();
+    void OnKeyDown(wxKeyEvent& event) {
+        // Give the key events to the STC.  It will then update
+        // the listbox as needed.
+        GetGrandParent()->GetEventHandler()->ProcessEvent(event);
     }
 
 private:
@@ -670,22 +695,25 @@ private:
 };
 
 BEGIN_EVENT_TABLE(wxSTCListBox, wxListBox)
-    EVT_SET_FOCUS(wxSTCListBox::OnFocus)
+    EVT_KEY_DOWN(wxSTCListBox::OnKeyDown)
+    EVT_CHAR(wxSTCListBox::OnKeyDown)
 END_EVENT_TABLE()
 
 
 
+#undef  wxSTC_USE_POPUP
+#define wxSTC_USE_POPUP 0  // wxPopupWindow just doesn't work well in this case...
+
 // A window to place the listbox upon.  If wxPopupWindow is supported then
 // that will be used so the listbox can extend beyond the client area of the
 // wxSTC if needed.
-
-#if wxUSE_POPUPWIN
+#if wxUSE_POPUPWIN && wxSTC_USE_POPUP
 #include <wx/popupwin.h>
 #define wxSTCListBoxWinBase wxPopupWindow
 #define param2  wxBORDER_NONE  // popup's 2nd param is flags
 #else
 #define wxSTCListBoxWinBase wxWindow
-#define param2 -1 // wxWindows 2nd param is ID
+#define param2 -1 // wxWindow's 2nd param is ID
 #endif
 
 class wxSTCListBoxWin : public wxSTCListBoxWinBase {
@@ -693,19 +721,17 @@ public:
     wxSTCListBoxWin(wxWindow* parent, wxWindowID id)
         : wxSTCListBoxWinBase(parent, param2) {
         lb = new wxSTCListBox(this, id);
-    }
+        lb->SetCursor(wxCursor(wxCURSOR_ARROW));
+        lb->SetFocus();
+   }
 
     void OnSize(wxSizeEvent& event) {
         lb->SetSize(GetSize());
     }
-    void OnFocus(wxFocusEvent& event) {
-        GetParent()->SetFocus();
-        event.Skip();
-    }
 
     wxListBox* GetLB() { return lb; }
 
-#if wxUSE_POPUPWIN
+#if wxUSE_POPUPWIN && wxSTC_USE_POPUP
     virtual void DoSetSize(int x, int y,
                            int width, int height,
                            int sizeFlags = wxSIZE_AUTO) {
@@ -723,10 +749,9 @@ private:
 };
 
 BEGIN_EVENT_TABLE(wxSTCListBoxWin, wxSTCListBoxWinBase)
-    EVT_SIZE       (wxSTCListBoxWin::OnSize)
-    EVT_SET_FOCUS  (wxSTCListBoxWin::OnFocus)
+    EVT_SIZE(wxSTCListBoxWin::OnSize)
 END_EVENT_TABLE()
-
+#endif
 
 inline wxListBox* GETLB(WindowID win) {
     return (((wxSTCListBoxWin*)win)->GetLB());
@@ -755,8 +780,8 @@ PRectangle ListBox::GetDesiredRect() {
     rc.left = 0;
     if (sz.x > 400)
         sz.x = 400;
-    if (sz.y > 160)  // TODO:  Use desiredVisibleRows??
-        sz.y = 160;
+    if (sz.y > 140)  // TODO:  Use desiredVisibleRows??
+        sz.y = 140;
     rc.right = sz.x;
     rc.bottom = sz.y;
     return rc;
@@ -804,7 +829,7 @@ int ListBox::Find(const char *prefix) {
 
 void ListBox::GetValue(int n, char *value, int len) {
     wxString text = GETLB(id)->GetString(n);
-    strncpy(value, text.mb_str(wxConvUTF8), len);
+    strncpy(value, wx2stc(text), len);
     value[len-1] = '\0';
 }
 
@@ -861,7 +886,7 @@ unsigned int Platform::DoubleClickTime() {
 }
 
 void Platform::DebugDisplay(const char *s) {
-    wxLogDebug(wxString(s, *wxConvCurrent));
+    wxLogDebug(stc2wx(s));
 }
 
 bool Platform::IsKeyDown(int key) {
@@ -920,9 +945,10 @@ void Platform::Assert(const char *c, const char *file, int line) {
        char buffer[2000];
        sprintf(buffer, "Assertion [%s] failed at %s %d", c, file, line);
        if (assertionPopUps) {
-               int idButton = wxMessageBox(wxString(buffer, *wxConvCurrent),
-                                            wxT("Assertion failure"),
-                                            wxICON_HAND | wxOK);
+            /*int idButton = */
+            wxMessageBox(stc2wx(buffer),
+                         wxT("Assertion failure"),
+                         wxICON_HAND | wxOK);
 //             if (idButton == IDRETRY) {
 //                     ::DebugBreak();
 //             } else if (idButton == IDIGNORE) {