X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c7a757aa56bb3eb47e14418f53579c4a8d9055dc..35bb3cb155917b4287fb2a3841bea22919a3d499:/src/gtk/renderer.cpp diff --git a/src/gtk/renderer.cpp b/src/gtk/renderer.cpp index 7323cb5c04..4eec03a12e 100644 --- a/src/gtk/renderer.cpp +++ b/src/gtk/renderer.cpp @@ -33,7 +33,6 @@ #endif #include -#include "wx/gtk/win_gtk.h" // ---------------------------------------------------------------------------- // wxRendererGTK: our wxRendererNative implementation @@ -92,6 +91,8 @@ 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: @@ -188,7 +189,7 @@ GtkWidget * wxRendererGTK::GetHeaderButtonWidget() { static GtkWidget *s_button = NULL; - + if ( !s_button ) { // Get the dummy tree widget, give it a column, and then use the @@ -217,7 +218,15 @@ wxRendererGTK::DrawHeaderButton(wxWindow *win, GtkWidget *button = GetHeaderButtonWidget(); - GdkWindow* gdk_window = dc.GetGDKWindow(); + GdkWindow* gdk_window = NULL; +#if wxUSE_NEW_DC + wxImplDC *impl = dc.GetImpl(); + wxGTKImplDC *gtk_impl = wxDynamicCast( impl, wxGTKImplDC ); + if (gtk_impl) + gdk_window = gtk_impl->GetGDKWindow(); +#else + gdk_window = dc.GetGDKWindow(); +#endif wxASSERT_MSG( gdk_window, wxT("cannot use wxRendererNative on wxDC of this type") ); @@ -225,11 +234,20 @@ wxRendererGTK::DrawHeaderButton(wxWindow *win, if (win->GetLayoutDirection() == wxLayout_RightToLeft) x_diff = rect.width; + GtkStateType state = GTK_STATE_NORMAL; + if (flags & wxCONTROL_DISABLED) + state = GTK_STATE_INSENSITIVE; + else + { + if (flags & wxCONTROL_CURRENT) + state = GTK_STATE_PRELIGHT; + } + gtk_paint_box ( button->style, gdk_window, - flags & wxCONTROL_DISABLED ? GTK_STATE_INSENSITIVE : GTK_STATE_NORMAL, + state, GTK_SHADOW_OUT, NULL, button, @@ -247,7 +265,15 @@ wxRendererGTK::DrawTreeItemButton(wxWindow* win, { GtkWidget *tree = GetTreeWidget(); - GdkWindow* gdk_window = dc.GetGDKWindow(); + GdkWindow* gdk_window = NULL; +#if wxUSE_NEW_DC + wxImplDC *impl = dc.GetImpl(); + wxGTKImplDC *gtk_impl = wxDynamicCast( impl, wxGTKImplDC ); + if (gtk_impl) + gdk_window = gtk_impl->GetGDKWindow(); +#else + gdk_window = dc.GetGDKWindow(); +#endif wxASSERT_MSG( gdk_window, wxT("cannot use wxRendererNative on wxDC of this type") ); @@ -330,7 +356,15 @@ wxRendererGTK::DrawSplitterSash(wxWindow *win, return; } - GdkWindow* gdk_window = dc.GetGDKWindow(); + GdkWindow* gdk_window = NULL; +#if wxUSE_NEW_DC + wxImplDC *impl = dc.GetImpl(); + wxGTKImplDC *gtk_impl = wxDynamicCast( impl, wxGTKImplDC ); + if (gtk_impl) + gdk_window = gtk_impl->GetGDKWindow(); +#else + gdk_window = dc.GetGDKWindow(); +#endif wxASSERT_MSG( gdk_window, wxT("cannot use wxRendererNative on wxDC of this type") ); @@ -343,21 +377,17 @@ wxRendererGTK::DrawSplitterSash(wxWindow *win, if ( isVert ) { - int h = win->GetClientSize().GetHeight(); - rect.x = position; rect.y = 0; rect.width = full_size; - rect.height = h; + rect.height = size.y; } else // horz { - int w = win->GetClientSize().GetWidth(); - rect.x = 0; rect.y = position; rect.height = full_size; - rect.width = w; + rect.width = size.x; } int x_diff = 0; @@ -394,7 +424,15 @@ wxRendererGTK::DrawDropArrow(wxWindow *WXUNUSED(win), // 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 = dc.GetGDKWindow(); + GdkWindow* gdk_window = NULL; +#if wxUSE_NEW_DC + wxImplDC *impl = dc.GetImpl(); + wxGTKImplDC *gtk_impl = wxDynamicCast( impl, wxGTKImplDC ); + if (gtk_impl) + gdk_window = gtk_impl->GetGDKWindow(); +#else + gdk_window = dc.GetGDKWindow(); +#endif wxASSERT_MSG( gdk_window, wxT("cannot use wxRendererNative on wxDC of this type") ); @@ -455,9 +493,16 @@ wxRendererGTK::DrawCheckBox(wxWindow *WXUNUSED(win), int flags ) { GtkWidget *button = GetCheckButtonWidget(); - - // for reason why we do this, see DrawDropArrow - GdkWindow* gdk_window = dc.GetGDKWindow(); + + GdkWindow* gdk_window = NULL; +#if wxUSE_NEW_DC + wxImplDC *impl = dc.GetImpl(); + wxGTKImplDC *gtk_impl = wxDynamicCast( impl, wxGTKImplDC ); + if (gtk_impl) + gdk_window = gtk_impl->GetGDKWindow(); +#else + gdk_window = dc.GetGDKWindow(); +#endif wxASSERT_MSG( gdk_window, wxT("cannot use wxRendererNative on wxDC of this type") ); @@ -495,8 +540,15 @@ wxRendererGTK::DrawPushButton(wxWindow *WXUNUSED(win), { GtkWidget *button = GetButtonWidget(); - // for reason why we do this, see DrawDropArrow - GdkWindow* gdk_window = dc.GetGDKWindow(); + GdkWindow* gdk_window = NULL; +#if wxUSE_NEW_DC + wxImplDC *impl = dc.GetImpl(); + wxGTKImplDC *gtk_impl = wxDynamicCast( impl, wxGTKImplDC ); + if (gtk_impl) + gdk_window = gtk_impl->GetGDKWindow(); +#else + gdk_window = dc.GetGDKWindow(); +#endif wxASSERT_MSG( gdk_window, wxT("cannot use wxRendererNative on wxDC of this type") ); @@ -531,7 +583,15 @@ wxRendererGTK::DrawItemSelectionRect(wxWindow *win, const wxRect& rect, int flags ) { - GdkWindow* gdk_window = dc.GetGDKWindow(); + GdkWindow* gdk_window = NULL; +#if wxUSE_NEW_DC + wxImplDC *impl = dc.GetImpl(); + wxGTKImplDC *gtk_impl = wxDynamicCast( impl, wxGTKImplDC ); + if (gtk_impl) + gdk_window = gtk_impl->GetGDKWindow(); +#else + gdk_window = dc.GetGDKWindow(); +#endif wxASSERT_MSG( gdk_window, wxT("cannot use wxRendererNative on wxDC of this type") ); @@ -563,7 +623,7 @@ wxRendererGTK::DrawItemSelectionRect(wxWindow *win, state = GTK_STATE_NORMAL; } - if (flags & wxCONTROL_CURRENT) + if ((flags & wxCONTROL_CURRENT) && (flags & wxCONTROL_FOCUSED)) { gtk_paint_focus( win->m_widget->style, gdk_window, @@ -577,3 +637,35 @@ wxRendererGTK::DrawItemSelectionRect(wxWindow *win, rect.height ); } } + +void wxRendererGTK::DrawFocusRect(wxWindow* win, wxDC& dc, const wxRect& rect, int flags) +{ + GdkWindow* gdk_window = NULL; +#if wxUSE_NEW_DC + wxImplDC *impl = dc.GetImpl(); + wxGTKImplDC *gtk_impl = wxDynamicCast( impl, wxGTKImplDC ); + if (gtk_impl) + gdk_window = gtk_impl->GetGDKWindow(); +#else + gdk_window = dc.GetGDKWindow(); +#endif + 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 ); +}