]> git.saurik.com Git - wxWidgets.git/blobdiff - contrib/src/stc/PlatWX.cpp
wxX11:
[wxWidgets.git] / contrib / src / stc / PlatWX.cpp
index 862d16456d3fe6e6c3e71267cf1326033f267aa3..dda64f77b22c786aa979b04956232e4025d4e94f 100644 (file)
@@ -25,7 +25,8 @@ wxRect wxRectFromPRectangle(PRectangle prc) {
 }
 
 PRectangle PRectangleFromwxRect(wxRect rc) {
-    return PRectangle(rc.GetLeft(), rc.GetTop(), rc.GetRight(), rc.GetBottom());
+    return PRectangle(rc.GetLeft(), rc.GetTop(),
+                      rc.GetRight()+1, rc.GetBottom()+1);
 }
 
 Colour::Colour(long lcol) {
@@ -174,6 +175,8 @@ void Surface::InitPixMap(int width, int height, Surface *surface_) {
     Release();
     hdc = new wxMemoryDC(surface_->hdc);
     hdcOwned = true;
+    if (width < 1) width = 1;
+    if (height < 1) height = 1;
     bitmap = new wxBitmap(width, height);
     ((wxMemoryDC*)hdc)->SelectObject(*bitmap);
 }
@@ -198,7 +201,7 @@ int Surface::LogPixelsY() {
 
 
 int Surface::DeviceHeightFont(int points) {
-    return points * LogPixelsY() / 72;
+    return points;
 }
 
 
@@ -450,11 +453,15 @@ void Window::SetTitle(const char *s) {
 }
 
 
+//----------------------------------------------------------------------
+// Helper classes for ListBox
+
+// A wxListBox that gives focus to its parent if it gets it.
 class wxSTCListBox : public wxListBox {
 public:
     wxSTCListBox(wxWindow* parent, wxWindowID id)
         : wxListBox(parent, id, wxDefaultPosition, wxDefaultSize,
-                    0, NULL, wxLB_SINGLE | wxLB_SORT | wxSIMPLE_BORDER)
+                    0, NULL, wxLB_SINGLE | wxSIMPLE_BORDER)
         {}
 
     void OnFocus(wxFocusEvent& event) {
@@ -462,10 +469,6 @@ public:
         event.Skip();
     }
 
-#ifdef __WXGTK__
-    void DoSetFirstItem(int n);
-#endif
-
 private:
     DECLARE_EVENT_TABLE()
 };
@@ -476,50 +479,62 @@ END_EVENT_TABLE()
 
 
 
+// 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.
 
-#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;
-        }
+#if wxUSE_POPUPWIN
+#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
+#endif
 
-        item = GTK_WIDGET(target->data);
+class wxSTCListBoxWin : public wxSTCListBoxWinBase {
+public:
+    wxSTCListBoxWin(wxWindow* parent, wxWindowID id)
+        : wxSTCListBoxWinBase(parent, param2) {
+        lb = new wxSTCListBox(this, id);
     }
 
-    gtk_adjustment_set_value(adjustment,
-                             item->allocation.y +
-                                nItemsBefore*item->allocation.height);
-}
+    void OnSize(wxSizeEvent& event) {
+        lb->SetSize(GetSize());
+    }
+    void OnFocus(wxFocusEvent& event) {
+        GetParent()->SetFocus();
+        event.Skip();
+    }
+
+    wxListBox* GetLB() { return lb; }
+
+#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);
+        wxSTCListBoxWinBase::DoSetSize(x, y, width, height, sizeFlags);
+    }
 #endif
 
+private:
+    wxSTCListBox* lb;
+    DECLARE_EVENT_TABLE()
+};
+
+BEGIN_EVENT_TABLE(wxSTCListBoxWin, wxSTCListBoxWinBase)
+    EVT_SIZE       (wxSTCListBoxWin::OnSize)
+    EVT_SET_FOCUS  (wxSTCListBoxWin::OnFocus)
+END_EVENT_TABLE()
+
+
+#define GETLB(win)  (((wxSTCListBoxWin*)win)->GetLB())
+
+//----------------------------------------------------------------------
 
 ListBox::ListBox() {
 }
@@ -528,23 +543,24 @@ ListBox::~ListBox() {
 }
 
 void ListBox::Create(Window &parent, int ctrlID) {
-    id = new wxSTCListBox(parent.id, ctrlID);
-//    id = new wxListBox(parent.id, ctrlID,  wxDefaultPosition, wxDefaultSize,
-//                       0, NULL, wxLB_SINGLE | wxLB_SORT | wxSIMPLE_BORDER);
+    id = new wxSTCListBoxWin(parent.id, ctrlID);
+}
+
+void ListBox::SetVisibleRows(int rows) {
+    desiredVisibleRows = rows;
 }
 
 PRectangle ListBox::GetDesiredRect() {
-    wxSize sz = ((wxListBox*)id)->GetBestSize();
+    wxSize sz = GETLB(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;
+    if (sz.x > 400)
+        sz.x = 400;
+    if (sz.y > 160)  // TODO:  Use desiredVisibleRows??
+        sz.y = 160;
     rc.right = sz.x;
     rc.bottom = sz.y;
-
     return rc;
 }
 
@@ -553,55 +569,48 @@ void ListBox::SetAverageCharWidth(int width) {
 }
 
 void ListBox::SetFont(Font &font) {
-    Window::SetFont(font);
+    GETLB(id)->SetFont(*font.GetID());
 }
 
 void ListBox::Clear() {
-    ((wxListBox*)id)->Clear();
+    GETLB(id)->Clear();
 }
 
 void ListBox::Append(char *s) {
-    ((wxListBox*)id)->Append(s);
+    GETLB(id)->Append(s);
 }
 
 int ListBox::Length() {
-    return ((wxListBox*)id)->GetCount();
+    return GETLB(id)->GetCount();
 }
 
 void ListBox::Select(int n) {
-    ((wxListBox*)id)->SetSelection(n);
+    GETLB(id)->SetSelection(n);
 #ifdef __WXGTK__
     if (n > 4)
         n = n - 4;
     else
         n = 1;
-    ((wxListBox*)id)->SetFirstItem(n);
+    GETLB(id)->SetFirstItem(n);
 #endif
 }
 
 int ListBox::GetSelection() {
-    return ((wxListBox*)id)->GetSelection();
+    return GETLB(id)->GetSelection();
 }
 
 int ListBox::Find(const char *prefix) {
-    if (prefix) {
-        for (int x=0; x < ((wxListBox*)id)->GetCount(); x++) {
-            wxString text = ((wxListBox*)id)->GetString(x);
-            if (text.StartsWith(prefix))
-                return x;
-        }
-    }
+    // No longer used
     return -1;
 }
 
 void ListBox::GetValue(int n, char *value, int len) {
-    wxString text = ((wxListBox*)id)->GetString(n);
+    wxString text = GETLB(id)->GetString(n);
     strncpy(value, text.c_str(), len);
     value[len-1] = '\0';
 }
 
 void ListBox::Sort() {
-    // wxWindows keeps sorted so no need to sort
 }
 
 
@@ -627,13 +636,13 @@ void Menu::Show(Point pt, Window &w) {
 
 Colour Platform::Chrome() {
     wxColour c;
-    c = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE);
+    c = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE);
     return Colour(c.Red(), c.Green(), c.Blue());
 }
 
 Colour Platform::ChromeHighlight() {
     wxColour c;
-    c = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DHIGHLIGHT);
+    c = wxSystemSettings::GetColour(wxSYS_COLOUR_3DHIGHLIGHT);
     return Colour(c.Red(), c.Green(), c.Blue());
 }