]> git.saurik.com Git - wxWidgets.git/blobdiff - src/stc/PlatWX.cpp
fixed slider value rounding once again
[wxWidgets.git] / src / stc / PlatWX.cpp
index 2bb9ba84eba41d200cb98681f613597c98d431cd..e0eeab7d987da4c9f1e41272013d22d20aced064 100644 (file)
@@ -9,6 +9,11 @@
 #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 >> 16);
 }
@@ -446,6 +451,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() {
 }
@@ -454,8 +529,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() {
@@ -472,6 +571,13 @@ int ListBox::Length() {
 
 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() {