]> git.saurik.com Git - wxWidgets.git/commitdiff
more tweaks to drop down arrow drawing (Andreas Pflug)
authorVadim Zeitlin <vadim@wxwidgets.org>
Thu, 17 Feb 2005 18:29:22 +0000 (18:29 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Thu, 17 Feb 2005 18:29:22 +0000 (18:29 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@32120 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

src/generic/datectlg.cpp
src/gtk/renderer.cpp
src/gtk1/renderer.cpp

index 4c8e902b54d4abc3fbcf68abd6802cfcdc09ae20..ce8fb71cf1646551fc0c9b05b719fce9582f6579 100644 (file)
@@ -78,6 +78,104 @@ enum
 // local classes
 // ----------------------------------------------------------------------------
 
+
+class wxDropdownButton : public wxBitmapButton
+{
+public:
+    wxDropdownButton() { Init(); }
+    wxDropdownButton(wxWindow *parent,
+                     wxWindowID id,
+                     const wxPoint& pos = wxDefaultPosition,
+                     const wxSize& size = wxDefaultSize,
+                     long style=0,
+                     const wxValidator& validator = wxDefaultValidator);
+
+    void Init()
+    {
+        m_borderX = -1;
+        m_borderY = -1;
+    }
+    void Create(wxWindow *parent,
+                wxWindowID id,
+                const wxPoint& pos = wxDefaultPosition,
+                const wxSize& size = wxDefaultSize,
+                long style = 0, 
+                const wxValidator& validator = wxDefaultValidator);
+
+    void DoMoveWindow(int x, int y, int w, int h);
+
+protected:
+    int m_borderX, m_borderY;
+};
+
+
+wxDropdownButton::wxDropdownButton(wxWindow *parent,
+                                   wxWindowID id,
+                                   const wxPoint& pos,
+                                   const wxSize& size,
+                                   long style,
+                                   const wxValidator& validator)
+{
+    Init();
+    Create(parent, id, pos, size, style, validator);
+}
+
+
+void wxDropdownButton::Create(wxWindow *parent,
+                              wxWindowID id,
+                              const wxPoint& pos,
+                              const wxSize& size,
+                              long style,
+                              const wxValidator& validator)
+{
+    wxBitmap chkBmp(15,15);  // arbitrary
+    wxBitmapButton::Create(parent, id, chkBmp, pos, wxDefaultSize, wxBU_AUTODRAW, validator);
+
+    int w, h;
+
+    w=chkBmp.GetWidth();
+    h=chkBmp.GetHeight();
+    m_borderX = GetSize().x - m_marginX - w;
+    m_borderY = GetSize().y - m_marginY - h;
+
+    w = (size.x > 0 ? size.x : GetSize().x);
+    h = (size.y > 0 ? size.y : GetSize().y);
+
+    DoMoveWindow(pos.x, pos.y, w, h);
+}
+
+
+void wxDropdownButton::DoMoveWindow(int x, int y, int w, int h)
+{
+    if (m_borderX >= 0 && m_borderY >= 0 && (w >= 0 || h >= 0))
+    {
+        wxMemoryDC dc;
+        if (w < 0)
+              w = GetSize().x;
+#ifdef __WXGTK__
+        else
+            w = m_marginX + m_borderX + 15; // GTK magic size
+#endif
+        if (h < 0)
+            h = GetSize().y;
+
+        int bw = w - m_marginX - m_borderX;
+        int bh = h - m_marginY - m_borderY;
+        if (bh < 11) bh=11;
+        if (bw < 9)  bw=9;
+
+        wxBitmap bmp(bw, bh);
+        dc.SelectObject(bmp);
+
+        wxRendererNative::Get().DrawComboBoxDropButton(this, dc, wxRect(0,0,bw, bh));
+
+        SetBitmapLabel(bmp);
+    }
+
+    wxBitmapButton::DoMoveWindow(x, y, w, h);
+}
+
+
 #if wxUSE_POPUPWIN
 
 #include "wx/popupwin.h"
@@ -169,6 +267,7 @@ bool wxDatePickerCtrlGeneric::Create(wxWindow *parent,
     InheritAttributes();
 
     m_txt = new wxTextCtrl(this, CTRLID_TXT);
+
     m_txt->Connect(wxEVT_KEY_DOWN,
                    wxKeyEventHandler(wxDatePickerCtrlGeneric::OnEditKey),
                    NULL, this);
@@ -176,23 +275,10 @@ bool wxDatePickerCtrlGeneric::Create(wxWindow *parent,
                    wxFocusEventHandler(wxDatePickerCtrlGeneric::OnKillFocus),
                    NULL, this);
 
-    const int height = m_txt->GetBestSize().y - 4; // FIXME: fudge
-    wxBitmap bmp(height, height);
-    {
-        wxMemoryDC dc;
-        dc.SelectObject(bmp);
-        wxRendererNative::Get().DrawComboBoxDropButton
-                                (
-                                    this,
-                                    dc,
-                                    wxRect(0, 0, height, height)
-                                );
-    }
-
-    wxBitmapButton *btn = new wxBitmapButton(this, CTRLID_BTN, bmp);
-    btn->SetMargins(0, 0);
-    m_btn = btn;
+    const int height = m_txt->GetBestSize().y;
 
+    m_btn = new wxDropdownButton(this, CTRLID_BTN, wxDefaultPosition, wxSize(height, height));
     m_popup = new wxDatePopupInternal(this);
     m_popup->SetFont(GetFont());
 
index 61a6b7316571d3e0fbcd321742cd0cb3a55ce244..8b097e5c76ef46e3a42f7df4dce681f032ccb16e 100644 (file)
@@ -73,6 +73,11 @@ public:
                                   wxOrientation orient,
                                   int flags = 0);
 
+    virtual void DrawComboBoxDropButton(wxWindow *win,
+                                        wxDC& dc,
+                                        const wxRect& rect,
+                                        int flags = 0);
+
     virtual wxSplitterRenderParams GetSplitterParams(const wxWindow *win);
 };
 
@@ -104,19 +109,19 @@ wxRendererGTK::DrawHeaderButton(wxWindow *win,
     if (s_button == NULL)
     {
         s_window = gtk_window_new( GTK_WINDOW_POPUP );
-    gtk_widget_realize( s_window );
-    s_button = gtk_button_new();
-    gtk_container_add( GTK_CONTAINER(s_window), s_button );
-    gtk_widget_realize( s_button );
+        gtk_widget_realize( s_window );
+        s_button = gtk_button_new();
+        gtk_container_add( GTK_CONTAINER(s_window), s_button );
+        gtk_widget_realize( s_button );
     }
 
     gtk_paint_box
     (
-    s_button->style,
+        s_button->style,
         GTK_PIZZA(win->m_wxwindow)->bin_window,
         flags & wxCONTROL_DISABLED ? GTK_STATE_INSENSITIVE : GTK_STATE_NORMAL,
         GTK_SHADOW_OUT,
-    NULL,
+        NULL,
         s_button,
         "button",
         dc.XLOG2DEV(rect.x) -1, rect.y -1, rect.width +2, rect.height +2
@@ -342,3 +347,31 @@ wxRendererGTK::DrawSplitterSash(wxWindow *win,
 #endif // GTK+ 2.x/1.x
 }
 
+void wxRendererGTK::DrawComboBoxDropButton(wxWindow *win,
+                                            wxDC& dc,
+                                            const wxRect& rect,
+                                            int flags)
+{
+    dc.SetBrush(wxBrush(win->GetBackgroundColour()));
+    dc.SetPen(wxPen(win->GetBackgroundColour()));
+    dc.DrawRectangle(rect);
+
+    int x = (rect.GetWidth()-9)   / 2;
+    int y = (rect.GetHeight()-10) / 2;
+
+    wxPoint pt[] =
+    {
+        wxPoint(x+2, y+3),
+        wxPoint(x+6, y+3),
+        wxPoint(x+6, y+6),
+        wxPoint(x+8, y+6),
+        wxPoint(x+4, y+10),
+        wxPoint(x+0, y+6),
+        wxPoint(x+2, y+6)
+    };
+    dc.SetBrush(wxBrush(win->GetForegroundColour()));
+    dc.SetPen(wxPen(win->GetForegroundColour()));
+    dc.DrawLine(x, y, x+9, y);
+    dc.DrawPolygon(WXSIZEOF(pt), pt, rect.x, rect.y);
+}
+
index 61a6b7316571d3e0fbcd321742cd0cb3a55ce244..8b097e5c76ef46e3a42f7df4dce681f032ccb16e 100644 (file)
@@ -73,6 +73,11 @@ public:
                                   wxOrientation orient,
                                   int flags = 0);
 
+    virtual void DrawComboBoxDropButton(wxWindow *win,
+                                        wxDC& dc,
+                                        const wxRect& rect,
+                                        int flags = 0);
+
     virtual wxSplitterRenderParams GetSplitterParams(const wxWindow *win);
 };
 
@@ -104,19 +109,19 @@ wxRendererGTK::DrawHeaderButton(wxWindow *win,
     if (s_button == NULL)
     {
         s_window = gtk_window_new( GTK_WINDOW_POPUP );
-    gtk_widget_realize( s_window );
-    s_button = gtk_button_new();
-    gtk_container_add( GTK_CONTAINER(s_window), s_button );
-    gtk_widget_realize( s_button );
+        gtk_widget_realize( s_window );
+        s_button = gtk_button_new();
+        gtk_container_add( GTK_CONTAINER(s_window), s_button );
+        gtk_widget_realize( s_button );
     }
 
     gtk_paint_box
     (
-    s_button->style,
+        s_button->style,
         GTK_PIZZA(win->m_wxwindow)->bin_window,
         flags & wxCONTROL_DISABLED ? GTK_STATE_INSENSITIVE : GTK_STATE_NORMAL,
         GTK_SHADOW_OUT,
-    NULL,
+        NULL,
         s_button,
         "button",
         dc.XLOG2DEV(rect.x) -1, rect.y -1, rect.width +2, rect.height +2
@@ -342,3 +347,31 @@ wxRendererGTK::DrawSplitterSash(wxWindow *win,
 #endif // GTK+ 2.x/1.x
 }
 
+void wxRendererGTK::DrawComboBoxDropButton(wxWindow *win,
+                                            wxDC& dc,
+                                            const wxRect& rect,
+                                            int flags)
+{
+    dc.SetBrush(wxBrush(win->GetBackgroundColour()));
+    dc.SetPen(wxPen(win->GetBackgroundColour()));
+    dc.DrawRectangle(rect);
+
+    int x = (rect.GetWidth()-9)   / 2;
+    int y = (rect.GetHeight()-10) / 2;
+
+    wxPoint pt[] =
+    {
+        wxPoint(x+2, y+3),
+        wxPoint(x+6, y+3),
+        wxPoint(x+6, y+6),
+        wxPoint(x+8, y+6),
+        wxPoint(x+4, y+10),
+        wxPoint(x+0, y+6),
+        wxPoint(x+2, y+6)
+    };
+    dc.SetBrush(wxBrush(win->GetForegroundColour()));
+    dc.SetPen(wxPen(win->GetForegroundColour()));
+    dc.DrawLine(x, y, x+9, y);
+    dc.DrawPolygon(WXSIZEOF(pt), pt, rect.x, rect.y);
+}
+