X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/7e71773004dfa6e6686ea69d4554496eb9e6bc9c..7f19ef40eb05ef30e63ce12d40071d35b1d5aaaf:/src/gtk/renderer.cpp diff --git a/src/gtk/renderer.cpp b/src/gtk/renderer.cpp index 6a6259289f..9889c5e4da 100644 --- a/src/gtk/renderer.cpp +++ b/src/gtk/renderer.cpp @@ -33,6 +33,7 @@ #include "wx/module.h" #endif +#include "wx/dcgraph.h" #include "wx/gtk/dc.h" #include "wx/gtk/private.h" @@ -53,6 +54,9 @@ public: wxHeaderSortIconType sortArrow = wxHDR_SORT_ICON_NONE, wxHeaderButtonParams* params = NULL); + virtual int GetHeaderButtonHeight(wxWindow *win); + + // draw the expanded/collapsed icon for a tree control item virtual void DrawTreeItemButton(wxWindow *win, wxDC& dc, @@ -95,24 +99,24 @@ public: const wxRect& rect, int flags = 0); - virtual void DrawChoice(wxWindow* win, - wxDC& dc, - const wxRect& rect, + virtual void DrawChoice(wxWindow* win, + wxDC& dc, + const wxRect& rect, int flags=0); - virtual void DrawComboBox(wxWindow* win, - wxDC& dc, - const wxRect& rect, + virtual void DrawComboBox(wxWindow* win, + wxDC& dc, + const wxRect& rect, int flags=0); - virtual void DrawTextCtrl(wxWindow* win, - wxDC& dc, - const wxRect& rect, + virtual void DrawTextCtrl(wxWindow* win, + wxDC& dc, + const wxRect& rect, int flags=0); - virtual void DrawRadioButton(wxWindow* win, - wxDC& dc, - const wxRect& rect, + virtual void DrawRadioBitmap(wxWindow* win, + wxDC& dc, + const wxRect& rect, int flags=0); virtual void DrawFocusRect(wxWindow* win, wxDC& dc, const wxRect& rect, int flags = 0); @@ -134,17 +138,30 @@ wxRendererNative& wxRendererNative::GetDefault() return s_rendererGTK; } -static GdkWindow* wxGetGdkWindowForDC(wxDC& dc) +static GdkWindow* wxGetGdkWindowForDC(wxWindow* win, wxDC& dc) { GdkWindow* gdk_window = NULL; + +#if wxUSE_GRAPHICS_CONTEXT + if ( dc.IsKindOf( CLASSINFO(wxGCDC) ) ) + gdk_window = win->GTKGetDrawingWindow(); + else +#endif + { #if wxUSE_NEW_DC - wxDCImpl *impl = dc.GetImpl(); - wxGTKDCImpl *gtk_impl = wxDynamicCast( impl, wxGTKDCImpl ); - if (gtk_impl) - gdk_window = gtk_impl->GetGDKWindow(); + wxDCImpl *impl = dc.GetImpl(); + wxGTKDCImpl *gtk_impl = wxDynamicCast( impl, wxGTKDCImpl ); + if (gtk_impl) + gdk_window = gtk_impl->GetGDKWindow(); #else - gdk_window = dc.GetGDKWindow(); + gdk_window = dc.GetGDKWindow(); +#endif + } + +#if !wxUSE_GRAPHICS_CONTEXT + wxUnusedVar(win); #endif + return gdk_window; } @@ -162,8 +179,12 @@ wxRendererGTK::DrawHeaderButton(wxWindow *win, { GtkWidget *button = wxGTKPrivate::GetHeaderButtonWidget(); + if (flags & wxCONTROL_SPECIAL) + button = wxGTKPrivate::GetHeaderButtonWidgetFirst(); + if (flags & wxCONTROL_DIRTY) + button = wxGTKPrivate::GetHeaderButtonWidgetLast(); - GdkWindow* gdk_window = wxGetGdkWindowForDC(dc); + GdkWindow* gdk_window = wxGetGdkWindowForDC(win, dc); wxASSERT_MSG( gdk_window, wxT("cannot use wxRendererNative on wxDC of this type") ); @@ -195,6 +216,17 @@ wxRendererGTK::DrawHeaderButton(wxWindow *win, return DrawHeaderButtonContents(win, dc, rect, flags, sortArrow, params); } +int wxRendererGTK::GetHeaderButtonHeight(wxWindow *WXUNUSED(win)) +{ + GtkWidget *button = wxGTKPrivate::GetHeaderButtonWidget(); + + GtkRequisition req; + GTK_WIDGET_GET_CLASS(button)->size_request(button, &req); + + return req.height; +} + + // draw a ">" or "v" button void wxRendererGTK::DrawTreeItemButton(wxWindow* win, @@ -202,7 +234,7 @@ wxRendererGTK::DrawTreeItemButton(wxWindow* win, { GtkWidget *tree = wxGTKPrivate::GetTreeWidget(); - GdkWindow* gdk_window = wxGetGdkWindowForDC(dc); + GdkWindow* gdk_window = wxGetGdkWindowForDC(win, dc); wxASSERT_MSG( gdk_window, wxT("cannot use wxRendererNative on wxDC of this type") ); @@ -268,7 +300,7 @@ wxRendererGTK::DrawSplitterBorder(wxWindow * WXUNUSED(win), } void -wxRendererGTK::DrawSplitterSash(wxWindow *win, +wxRendererGTK::DrawSplitterSash(wxWindow* win, wxDC& dc, const wxSize& size, wxCoord position, @@ -281,7 +313,7 @@ wxRendererGTK::DrawSplitterSash(wxWindow *win, return; } - GdkWindow* gdk_window = wxGetGdkWindowForDC(dc); + GdkWindow* gdk_window = wxGetGdkWindowForDC(win, dc); wxASSERT_MSG( gdk_window, wxT("cannot use wxRendererNative on wxDC of this type") ); @@ -329,19 +361,19 @@ wxRendererGTK::DrawSplitterSash(wxWindow *win, } void -wxRendererGTK::DrawDropArrow(wxWindow *WXUNUSED(win), +wxRendererGTK::DrawDropArrow(wxWindow* win, wxDC& dc, const wxRect& rect, int flags) { GtkWidget *button = wxGTKPrivate::GetButtonWidget(); - // If we give GTK_PIZZA(win->m_wxwindow)->bin_window as + // If we give WX_PIZZA(win->m_wxwindow)->bin_window as // a window for gtk_paint_xxx function, then it won't // work for wxMemoryDC. So that is why we assume wxDC // is wxWindowDC (wxClientDC, wxMemoryDC and wxPaintDC // are derived from it) and use its m_window. - GdkWindow* gdk_window = wxGetGdkWindowForDC(dc); + GdkWindow* gdk_window = wxGetGdkWindowForDC(win, dc); wxASSERT_MSG( gdk_window, wxT("cannot use wxRendererNative on wxDC of this type") ); @@ -409,14 +441,14 @@ wxRendererGTK::GetCheckBoxSize(wxWindow *WXUNUSED(win)) } void -wxRendererGTK::DrawCheckBox(wxWindow *WXUNUSED(win), +wxRendererGTK::DrawCheckBox(wxWindow* win, wxDC& dc, const wxRect& rect, int flags ) { GtkWidget *button = wxGTKPrivate::GetCheckButtonWidget(); - GdkWindow* gdk_window = wxGetGdkWindowForDC(dc); + GdkWindow* gdk_window = wxGetGdkWindowForDC(win, dc); wxASSERT_MSG( gdk_window, wxT("cannot use wxRendererNative on wxDC of this type") ); @@ -453,14 +485,14 @@ wxRendererGTK::DrawCheckBox(wxWindow *WXUNUSED(win), } void -wxRendererGTK::DrawPushButton(wxWindow *WXUNUSED(win), +wxRendererGTK::DrawPushButton(wxWindow* win, wxDC& dc, const wxRect& rect, int flags) { GtkWidget *button = wxGTKPrivate::GetButtonWidget(); - GdkWindow* gdk_window = wxGetGdkWindowForDC(dc); + GdkWindow* gdk_window = wxGetGdkWindowForDC(win, dc); wxASSERT_MSG( gdk_window, wxT("cannot use wxRendererNative on wxDC of this type") ); @@ -485,20 +517,22 @@ wxRendererGTK::DrawPushButton(wxWindow *WXUNUSED(win), NULL, button, "button", - dc.LogicalToDeviceX(rect.x), - dc.LogicalToDeviceY(rect.y), - rect.width, + dc.LogicalToDeviceX(rect.x), + dc.LogicalToDeviceY(rect.y), + rect.width, rect.height ); } void -wxRendererGTK::DrawItemSelectionRect(wxWindow *win, +wxRendererGTK::DrawItemSelectionRect(wxWindow* win, wxDC& dc, const wxRect& rect, int flags ) { - GdkWindow* gdk_window = wxGetGdkWindowForDC(dc); + GtkWidget *tree = wxGTKPrivate::GetTreeWidget(); + + GdkWindow* gdk_window = wxGetGdkWindowForDC(win, dc); wxASSERT_MSG( gdk_window, wxT("cannot use wxRendererNative on wxDC of this type") ); @@ -506,14 +540,15 @@ wxRendererGTK::DrawItemSelectionRect(wxWindow *win, if (win->GetLayoutDirection() == wxLayout_RightToLeft) x_diff = rect.width; - GtkStateType state; + GtkStateType state = GTK_STATE_NORMAL; + if (flags & wxCONTROL_SELECTED) { // the wxCONTROL_FOCUSED state is deduced // directly from the m_wxwindow by GTK+ state = GTK_STATE_SELECTED; - gtk_paint_flat_box( win->m_widget->style, + gtk_paint_flat_box( tree->style, // win->m_widget->style, gdk_window, state, GTK_SHADOW_NONE, @@ -532,7 +567,10 @@ wxRendererGTK::DrawItemSelectionRect(wxWindow *win, if ((flags & wxCONTROL_CURRENT) && (flags & wxCONTROL_FOCUSED)) { - gtk_paint_focus( win->m_widget->style, + if (flags & wxCONTROL_SELECTED) + state = GTK_STATE_SELECTED; + + gtk_paint_focus( tree->style, gdk_window, state, NULL, @@ -542,7 +580,7 @@ wxRendererGTK::DrawItemSelectionRect(wxWindow *win, // Using "treeview-middle" would fix the warning, but the right // edge of the focus rect is not getting erased properly either. // Better to not specify this detail unless the drawing is fixed. - NULL, + "", dc.LogicalToDeviceX(rect.x), dc.LogicalToDeviceY(rect.y), rect.width, @@ -552,7 +590,7 @@ wxRendererGTK::DrawItemSelectionRect(wxWindow *win, void wxRendererGTK::DrawFocusRect(wxWindow* win, wxDC& dc, const wxRect& rect, int flags) { - GdkWindow* gdk_window = wxGetGdkWindowForDC(dc); + GdkWindow* gdk_window = wxGetGdkWindowForDC(win, dc); wxASSERT_MSG( gdk_window, wxT("cannot use wxRendererNative on wxDC of this type") ); @@ -575,16 +613,16 @@ void wxRendererGTK::DrawFocusRect(wxWindow* win, wxDC& dc, const wxRect& rect, i } // Uses the theme to draw the border and fill for something like a wxTextCtrl -void wxRendererGTK::DrawTextCtrl(wxWindow*, wxDC& dc, const wxRect& rect, int flags) +void wxRendererGTK::DrawTextCtrl(wxWindow* win, wxDC& dc, const wxRect& rect, int flags) { GtkWidget *entry = wxGTKPrivate::GetTextEntryWidget(); - GdkWindow* gdk_window = wxGetGdkWindowForDC(dc); + GdkWindow* gdk_window = wxGetGdkWindowForDC(win, dc); GtkStateType state = GTK_STATE_NORMAL; if ( flags & wxCONTROL_DISABLED ) state = GTK_STATE_INSENSITIVE; - + if (flags & wxCONTROL_CURRENT ) GTK_WIDGET_SET_FLAGS( entry, GTK_HAS_FOCUS ); else @@ -592,7 +630,7 @@ void wxRendererGTK::DrawTextCtrl(wxWindow*, wxDC& dc, const wxRect& rect, int fl gtk_paint_shadow ( - entry->style, + entry->style, gdk_window, state, GTK_SHADOW_OUT, @@ -602,21 +640,21 @@ void wxRendererGTK::DrawTextCtrl(wxWindow*, wxDC& dc, const wxRect& rect, int fl dc.LogicalToDeviceX(rect.x), dc.LogicalToDeviceY(rect.y), rect.width, - rect.height + rect.height ); } // Draw the equivallent of a wxComboBox -void wxRendererGTK::DrawComboBox(wxWindow*, wxDC& dc, const wxRect& rect, int flags) +void wxRendererGTK::DrawComboBox(wxWindow* win, wxDC& dc, const wxRect& rect, int flags) { GtkWidget *combo = wxGTKPrivate::GetComboBoxWidget(); - GdkWindow* gdk_window = wxGetGdkWindowForDC(dc); + GdkWindow* gdk_window = wxGetGdkWindowForDC(win, dc); GtkStateType state = GTK_STATE_NORMAL; if ( flags & wxCONTROL_DISABLED ) state = GTK_STATE_INSENSITIVE; - + if (flags & wxCONTROL_CURRENT ) GTK_WIDGET_SET_FLAGS( combo, GTK_HAS_FOCUS ); else @@ -624,7 +662,7 @@ void wxRendererGTK::DrawComboBox(wxWindow*, wxDC& dc, const wxRect& rect, int fl gtk_paint_shadow ( - combo->style, + combo->style, gdk_window, state, GTK_SHADOW_OUT, @@ -634,7 +672,7 @@ void wxRendererGTK::DrawComboBox(wxWindow*, wxDC& dc, const wxRect& rect, int fl dc.LogicalToDeviceX(rect.x), dc.LogicalToDeviceY(rect.y), rect.width, - rect.height + rect.height ); wxRect r = rect; @@ -646,7 +684,7 @@ void wxRendererGTK::DrawComboBox(wxWindow*, wxDC& dc, const wxRect& rect, int fl gtk_paint_arrow ( - combo->style, + combo->style, gdk_window, state, GTK_SHADOW_OUT, @@ -667,7 +705,7 @@ void wxRendererGTK::DrawComboBox(wxWindow*, wxDC& dc, const wxRect& rect, int fl gtk_paint_box ( - combo->style, + combo->style, gdk_window, state, GTK_SHADOW_ETCHED_OUT, @@ -688,20 +726,20 @@ void wxRendererGTK::DrawChoice(wxWindow* win, wxDC& dc, DrawComboBox( win, dc, rect, flags ); } - + // Draw a themed radio button -void wxRendererGTK::DrawRadioButton(wxWindow*, wxDC& dc, const wxRect& rect, int flags) +void wxRendererGTK::DrawRadioBitmap(wxWindow* win, wxDC& dc, const wxRect& rect, int flags) { GtkWidget *button = wxGTKPrivate::GetRadioButtonWidget(); - GdkWindow* gdk_window = wxGetGdkWindowForDC(dc); - + GdkWindow* gdk_window = wxGetGdkWindowForDC(win, dc); + GtkShadowType shadow_type = GTK_SHADOW_OUT; if ( flags & wxCONTROL_CHECKED ) shadow_type = GTK_SHADOW_IN; else if ( flags & wxCONTROL_UNDETERMINED ) shadow_type = GTK_SHADOW_ETCHED_IN; - + GtkStateType state = GTK_STATE_NORMAL; if ( flags & wxCONTROL_DISABLED ) state = GTK_STATE_INSENSITIVE; @@ -721,8 +759,8 @@ void wxRendererGTK::DrawRadioButton(wxWindow*, wxDC& dc, const wxRect& rect, int NULL, button, "radiobutton", - dc.LogicalToDeviceX(rect.x), - dc.LogicalToDeviceY(rect.y), + dc.LogicalToDeviceX(rect.x), + dc.LogicalToDeviceY(rect.y), rect.width, rect.height ); }