X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c7a757aa56bb3eb47e14418f53579c4a8d9055dc..10c508ef3cfbbb0bf36151f4aafad8edca511a8a:/src/gtk/renderer.cpp diff --git a/src/gtk/renderer.cpp b/src/gtk/renderer.cpp index 7323cb5c04..fa562f68c6 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: @@ -180,6 +181,41 @@ wxRendererGTK::GetTreeWidget() return s_tree; } +// used elsewhere +GtkWidget *GetEntryWidget() +{ + static GtkWidget *s_entry = NULL; + static GtkWidget *s_window = NULL; + + if ( !s_entry ) + { + s_window = gtk_window_new( GTK_WINDOW_POPUP ); + gtk_widget_realize( s_window ); + s_entry = gtk_entry_new(); + gtk_container_add( GTK_CONTAINER(s_window), s_entry ); + gtk_widget_realize( s_entry ); + } + + return s_entry; +} + +// used elsewhere +GtkWidget *GetScrolledWidget() +{ + static GtkWidget *s_entry = NULL; + static GtkWidget *s_window = NULL; + + if ( !s_entry ) + { + s_window = gtk_window_new( GTK_WINDOW_POPUP ); + gtk_widget_realize( s_window ); + s_entry = gtk_scrolled_window_new( NULL, NULL); + gtk_container_add( GTK_CONTAINER(s_window), s_entry ); + gtk_widget_realize( s_entry ); + } + + return s_entry; +} // 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 @@ -188,7 +224,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 +253,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 +269,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 +300,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 +391,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 +412,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 +459,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 +528,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 +575,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 +618,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 +658,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 +672,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 ); +}