X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c97c99522358ed5791528a38ec2a727d079d2483..8fd7108e7cfd6d3564a71ab5f49c391613e27798:/src/gtk/renderer.cpp diff --git a/src/gtk/renderer.cpp b/src/gtk/renderer.cpp index 86ebfa8b4a..1eec14354d 100644 --- a/src/gtk/renderer.cpp +++ b/src/gtk/renderer.cpp @@ -92,12 +92,14 @@ public: const wxRect& rect, int flags = 0); + virtual void DrawFocusRect(wxWindow* win, wxDC& dc, const wxRect& rect, int flags = 0); + virtual wxSplitterRenderParams GetSplitterParams(const wxWindow *win); private: // FIXME: shouldn't we destroy these windows somewhere? - // used by DrawHeaderButton and DrawPushButton + // used by DrawPushButton and DrawDropArrow static GtkWidget *GetButtonWidget(); // used by DrawTreeItemButton() @@ -105,6 +107,9 @@ private: // used by DrawCheckBox() static GtkWidget *GetCheckButtonWidget(); + + // Used by DrawHeaderButton + static GtkWidget *GetHeaderButtonWidget(); }; // ============================================================================ @@ -177,6 +182,28 @@ wxRendererGTK::GetTreeWidget() return s_tree; } + +// This one just gets the button used by the column header. Although it's +// still a gtk_button the themes will typically differentiate and draw them +// differently if the button is in a treeview. +GtkWidget * +wxRendererGTK::GetHeaderButtonWidget() +{ + static GtkWidget *s_button = NULL; + + if ( !s_button ) + { + // Get the dummy tree widget, give it a column, and then use the + // widget in the column header for the rendering code. + GtkWidget* treewidget = GetTreeWidget(); + GtkTreeViewColumn* column = gtk_tree_view_column_new(); + gtk_tree_view_append_column(GTK_TREE_VIEW(treewidget), column); + s_button = column->button; + } + + return s_button; +} + // ---------------------------------------------------------------------------- // list/tree controls drawing // ---------------------------------------------------------------------------- @@ -190,7 +217,7 @@ wxRendererGTK::DrawHeaderButton(wxWindow *win, wxHeaderButtonParams* params) { - GtkWidget *button = GetButtonWidget(); + GtkWidget *button = GetHeaderButtonWidget(); GdkWindow* gdk_window = dc.GetGDKWindow(); wxASSERT_MSG( gdk_window, @@ -199,7 +226,7 @@ wxRendererGTK::DrawHeaderButton(wxWindow *win, int x_diff = 0; if (win->GetLayoutDirection() == wxLayout_RightToLeft) x_diff = rect.width; - + gtk_paint_box ( button->style, @@ -334,7 +361,7 @@ wxRendererGTK::DrawSplitterSash(wxWindow *win, rect.height = full_size; rect.width = w; } - + int x_diff = 0; if (win->GetLayoutDirection() == wxLayout_RightToLeft) x_diff = rect.width; @@ -533,12 +560,16 @@ wxRendererGTK::DrawItemSelectionRect(wxWindow *win, rect.width, rect.height ); } + else // !wxCONTROL_SELECTED + { + state = GTK_STATE_NORMAL; + } if (flags & wxCONTROL_CURRENT) { - gtk_paint_focus( win->m_widget->style, + gtk_paint_focus( win->m_widget->style, gdk_window, - GTK_STATE_SELECTED, + state, NULL, win->m_wxwindow, "treeview", @@ -548,3 +579,27 @@ wxRendererGTK::DrawItemSelectionRect(wxWindow *win, rect.height ); } } + +void wxRendererGTK::DrawFocusRect(wxWindow* win, wxDC& dc, const wxRect& rect, int flags) +{ + GdkWindow* gdk_window = dc.GetGDKWindow(); + wxASSERT_MSG( gdk_window, + wxT("cannot use wxRendererNative on wxDC of this type") ); + + GtkStateType state; + if (flags & wxCONTROL_SELECTED) + state = GTK_STATE_SELECTED; + else + state = GTK_STATE_NORMAL; + + gtk_paint_focus( win->m_widget->style, + gdk_window, + state, + NULL, + win->m_wxwindow, + NULL, + dc.LogicalToDeviceX(rect.x), + dc.LogicalToDeviceY(rect.y), + rect.width, + rect.height ); +}