]> git.saurik.com Git - wxWidgets.git/blobdiff - src/stc/PlatWX.cpp
fixed client area origin handling in wxGTK
[wxWidgets.git] / src / stc / PlatWX.cpp
index 0dbd3d5ea77e501b7d9ee4a5481c92d49667f4e0..29535072a7ae4ce72829327ddb500636b1e316b1 100644 (file)
@@ -4,17 +4,23 @@
 //                        Robin Dunn <robin@aldunn.com>
 // The License.txt file describes the conditions under which this software may be distributed.
 
+#include <ctype.h>
 
 #include "Platform.h"
 #include "wx/stc/stc.h"
 
+
+#ifdef __WXGTK__
+#include <gtk/gtk.h>
+#endif
+
 Point Point::FromLong(long lpoint) {
-    return Point(lpoint & 0xFFFF, lpoint >> 32);
+    return Point(lpoint & 0xFFFF, lpoint >> 16);
 }
 
 wxRect wxRectFromPRectangle(PRectangle prc) {
     wxRect rc(prc.left, prc.top,
-              prc.right-prc.left+1, prc.bottom-prc.top+1);
+              prc.right-prc.left, prc.bottom-prc.top);
     return rc;
 }
 
@@ -105,14 +111,17 @@ Font::Font() {
 Font::~Font() {
 }
 
-void Font::Create(const char *faceName, int size, bool bold, bool italic) {
+void Font::Create(const char *faceName, int characterSet, int size, bool bold, bool italic) {
+    // TODO:  what to do about the characterSet?
+
     Release();
     id = new wxFont(size,
                     wxDEFAULT,
                     italic ? wxITALIC :  wxNORMAL,
                     bold ? wxBOLD : wxNORMAL,
                     false,
-                    faceName);
+                    faceName,
+                    wxFONTENCODING_DEFAULT);
 }
 
 
@@ -154,13 +163,11 @@ void Surface::Init() {
     Release();
     hdc = new wxMemoryDC();
     hdcOwned = true;
-    // **** ::SetTextAlign(hdc, TA_BASELINE);
 }
 
 void Surface::Init(SurfaceID hdc_) {
     Release();
     hdc = hdc_;
-    // **** ::SetTextAlign(hdc, TA_BASELINE);
 }
 
 void Surface::InitPixMap(int width, int height, Surface *surface_) {
@@ -169,7 +176,6 @@ void Surface::InitPixMap(int width, int height, Surface *surface_) {
     hdcOwned = true;
     bitmap = new wxBitmap(width, height);
     ((wxMemoryDC*)hdc)->SelectObject(*bitmap);
-    // **** ::SetTextAlign(hdc, TA_BASELINE);
 }
 
 void Surface::PenColour(Colour fore) {
@@ -181,13 +187,21 @@ void Surface::BrushColor(Colour back) {
 }
 
 void Surface::SetFont(Font &font_) {
-    hdc->SetFont(*font_.GetID());
+  if (font_.GetID()) {
+      hdc->SetFont(*font_.GetID());
+    }
 }
 
 int Surface::LogPixelsY() {
     return hdc->GetPPI().y;
 }
 
+
+int Surface::DeviceHeightFont(int points) {
+    return points;
+}
+
+
 void Surface::MoveTo(int x_, int y_) {
     x = x_;
     y = y_;
@@ -232,7 +246,7 @@ void Surface::FillRectangle(PRectangle rc, Surface &surfacePattern) {
 void Surface::RoundedRectangle(PRectangle rc, Colour fore, Colour back) {
     PenColour(fore);
     BrushColor(back);
-    hdc->DrawRoundedRectangle(wxRectFromPRectangle(rc), 8);
+    hdc->DrawRoundedRectangle(wxRectFromPRectangle(rc), 4);
 }
 
 void Surface::Ellipse(PRectangle rc, Colour fore, Colour back) {
@@ -242,7 +256,8 @@ void Surface::Ellipse(PRectangle rc, Colour fore, Colour back) {
 }
 
 void Surface::Copy(PRectangle rc, Point from, Surface &surfaceSource) {
-    hdc->Blit(rc.left, rc.top, rc.Width(), rc.Height(),
+    wxRect r = wxRectFromPRectangle(rc);
+    hdc->Blit(r.x, r.y, r.width, r.height,
               surfaceSource.hdc, from.x, from.y, wxCOPY);
 }
 
@@ -337,14 +352,15 @@ int Surface::AverageCharWidth(Font &font) {
 }
 
 int Surface::SetPalette(Palette *pal, bool inBackGround) {
-    return 0;  // **** figure out what to do with palettes...
+    return 0;
 }
 
 void Surface::SetClip(PRectangle rc) {
     hdc->SetClippingRegion(wxRectFromPRectangle(rc));
 }
 
-
+void Surface::FlushCachedState() {
+}
 
 Window::~Window() {
 }
@@ -365,7 +381,8 @@ PRectangle Window::GetPosition() {
 }
 
 void Window::SetPosition(PRectangle rc) {
-    id->SetSize(rc.left, rc.top, rc.Width(), rc.Height());
+    wxRect r = wxRectFromPRectangle(rc);
+    id->SetSize(r);
 }
 
 void Window::SetPositionRelative(PRectangle rc, Window) {
@@ -374,7 +391,7 @@ void Window::SetPositionRelative(PRectangle rc, Window) {
 
 PRectangle Window::GetClientPosition() {
     wxSize sz = id->GetClientSize();
-    return  PRectangle(0, 0, sz.x - 1, sz.y - 1);
+    return  PRectangle(0, 0, sz.x, sz.y);
 }
 
 void Window::Show(bool show) {
@@ -386,7 +403,8 @@ void Window::InvalidateAll() {
 }
 
 void Window::InvalidateRectangle(PRectangle rc) {
-    id->Refresh(false, &wxRectFromPRectangle(rc));
+    wxRect r = wxRectFromPRectangle(rc);
+    id->Refresh(false, &r);
 }
 
 void Window::SetFont(Font &font) {
@@ -432,6 +450,76 @@ void Window::SetTitle(const char *s) {
 }
 
 
+class wxSTCListBox : public wxListBox {
+public:
+    wxSTCListBox(wxWindow* parent, wxWindowID id)
+        : wxListBox(parent, id, wxDefaultPosition, wxDefaultSize,
+                    0, NULL, wxLB_SINGLE | wxLB_SORT | wxSIMPLE_BORDER)
+        {}
+
+    void OnFocus(wxFocusEvent& event) {
+        GetParent()->SetFocus();
+        event.Skip();
+    }
+
+#ifdef __WXGTK__
+    void DoSetFirstItem(int n);
+#endif
+
+private:
+    DECLARE_EVENT_TABLE()
+};
+
+BEGIN_EVENT_TABLE(wxSTCListBox, wxListBox)
+    EVT_SET_FOCUS(wxSTCListBox::OnFocus)
+END_EVENT_TABLE()
+
+
+
+
+#ifdef __WXGTK__
+    // This can be removed after 2.2.2 I think
+void wxSTCListBox::DoSetFirstItem( int n )
+{
+    wxCHECK_RET( m_list, wxT("invalid listbox") );
+
+    if (gdk_pointer_is_grabbed () && GTK_WIDGET_HAS_GRAB (m_list))
+        return;
+
+    // terribly efficient
+    const gchar *vadjustment_key = "gtk-vadjustment";
+    guint vadjustment_key_id = g_quark_from_static_string (vadjustment_key);
+
+    GtkAdjustment *adjustment =
+       (GtkAdjustment*) gtk_object_get_data_by_id (GTK_OBJECT (m_list), vadjustment_key_id);
+    wxCHECK_RET( adjustment, wxT("invalid listbox code") );
+
+    GList *target = g_list_nth( m_list->children, n );
+    wxCHECK_RET( target, wxT("invalid listbox index") );
+
+    GtkWidget *item = GTK_WIDGET(target->data);
+    wxCHECK_RET( item, wxT("invalid listbox code") );
+
+    // find the last item before this one which is already realized
+    size_t nItemsBefore;
+    for ( nItemsBefore = 0; item && (item->allocation.y == -1); nItemsBefore++ )
+    {
+        target = target->prev;
+        if ( !target )
+        {
+            // nothing we can do if there are no allocated items yet
+            return;
+        }
+
+        item = GTK_WIDGET(target->data);
+    }
+
+    gtk_adjustment_set_value(adjustment,
+                             item->allocation.y +
+                                nItemsBefore*item->allocation.height);
+}
+#endif
+
 
 ListBox::ListBox() {
 }
@@ -440,8 +528,32 @@ ListBox::~ListBox() {
 }
 
 void ListBox::Create(Window &parent, int ctrlID) {
-    id = new wxListBox(parent.id, ctrlID, wxDefaultPosition, wxDefaultSize,
-                       0, NULL, wxLB_SINGLE | wxLB_SORT);
+    id = new wxSTCListBox(parent.id, ctrlID);
+//    id = new wxListBox(parent.id, ctrlID,  wxDefaultPosition, wxDefaultSize,
+//                       0, NULL, wxLB_SINGLE | wxLB_SORT | wxSIMPLE_BORDER);
+}
+
+PRectangle ListBox::GetDesiredRect() {
+    wxSize sz = ((wxListBox*)id)->GetBestSize();
+    PRectangle rc;
+    rc.top = 0;
+    rc.left = 0;
+    if (sz.x > 150)   // TODO: A better way to determine these max sizes
+        sz.x = 150;
+    if (sz.y > 100)
+        sz.y = 100;
+    rc.right = sz.x;
+    rc.bottom = sz.y;
+
+    return rc;
+}
+
+void ListBox::SetAverageCharWidth(int width) {
+    aveCharWidth = width;
+}
+
+void ListBox::SetFont(Font &font) {
+    Window::SetFont(font);
 }
 
 void ListBox::Clear() {
@@ -453,11 +565,18 @@ void ListBox::Append(char *s) {
 }
 
 int ListBox::Length() {
-    return ((wxListBox*)id)->Number();
+    return ((wxListBox*)id)->GetCount();
 }
 
 void ListBox::Select(int n) {
     ((wxListBox*)id)->SetSelection(n);
+#ifdef __WXGTK__
+    if (n > 4)
+        n = n - 4;
+    else
+        n = 1;
+    ((wxListBox*)id)->SetFirstItem(n);
+#endif
 }
 
 int ListBox::GetSelection() {
@@ -465,7 +584,14 @@ int ListBox::GetSelection() {
 }
 
 int ListBox::Find(const char *prefix) {
-    return ((wxListBox*)id)->FindString(prefix);
+    if (prefix) {
+        for (int x=0; x < ((wxListBox*)id)->GetCount(); x++) {
+            wxString text = ((wxListBox*)id)->GetString(x);
+            if (text.StartsWith(prefix))
+                return x;
+        }
+    }
+    return -1;
 }
 
 void ListBox::GetValue(int n, char *value, int len) {
@@ -570,6 +696,36 @@ void Platform::DebugPrintf(const char *format, ...) {
 #endif
 }
 
+
+static bool assertionPopUps = true;
+
+bool Platform::ShowAssertionPopUps(bool assertionPopUps_) {
+       bool ret = assertionPopUps;
+       assertionPopUps = assertionPopUps_;
+       return ret;
+}
+
+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(buffer, "Assertion failure",
+                                            wxICON_HAND | wxOK);
+//             if (idButton == IDRETRY) {
+//                     ::DebugBreak();
+//             } else if (idButton == IDIGNORE) {
+//                     // all OK
+//             } else {
+//                     abort();
+//             }
+       } else {
+               strcat(buffer, "\r\n");
+               Platform::DebugDisplay(buffer);
+               abort();
+       }
+}
+
+
 int Platform::Clamp(int val, int minVal, int maxVal) {
     if (val > maxVal)
         val = maxVal;