diff --git a/docs/latex/wx/renderer.tex b/docs/latex/wx/renderer.tex index d17248a300..b4bbe59f74 100644 --- a/docs/latex/wx/renderer.tex +++ b/docs/latex/wx/renderer.tex @@ -143,6 +143,21 @@ The \arg{sortArrow} parameter can be one of drawing of a text or bitmap label can be passed in \arg{params}. +\membersection{wxRendererNative::DrawItemSelectionRect}\label{wxrenderernativedrawitemselectionrect} + +\func{void}{DrawItemSelectionRect}{\param{wxWindow* }{win}, \param{wxDC\& }{dc}, \param{const wxRect\& }{rect}, \param{int }{flags = 0}} + +Draw a selection rectangle underneath the text as used e.g. +in a \helpref{wxListCtrl}{wxlistctrl}. The supported \arg{flags} +are \texttt{wxCONTROL\_SELECTED} for items which are selected +(e.g. often a blue rectangle) and \texttt{wxCONTROL\_CURRENT} +for the item that has the focus (often a dotted line around +the item's text). \texttt{wxCONTROL\_CURRENT} may be used +to indicate if the control has the focus (othewise the +the selection rectangle is e.g. often grey and not blue). +This may be ignored by the renderer or deduced by the +code directly from the \arg{win}. + \membersection{wxRendererNative::DrawPushButton}\label{wxrenderernativedrawpushbutton} \func{void}{DrawPushButton}{\param{wxWindow *}{win}, \param{wxDC\& }{dc}, \param{const wxRect\& }{rect}, \param{int }{flags}} diff --git a/src/generic/listctrl.cpp b/src/generic/listctrl.cpp index 08e3146d1e..fd4300b579 100644 --- a/src/generic/listctrl.cpp +++ b/src/generic/listctrl.cpp @@ -52,12 +52,6 @@ #include "wx/mac/private.h" #endif -#ifdef __WXGTK20__ - #include "wx/gtk/private.h" - #include "wx/gtk/win_gtk.h" -#endif - - // NOTE: If using the wxListBox visual attributes works everywhere then this can // be removed, as well as the #else case below. @@ -1456,17 +1450,11 @@ void wxListLineData::Draw( wxDC *dc ) { if (highlighted) { - wxRect rect2( m_gi->m_rectHighlight ); - m_owner->CalcScrolledPosition( rect2.x, rect2.y, &rect2.x, &rect2.y ); - - gtk_paint_flat_box( m_owner->m_widget->style, - GTK_PIZZA(m_owner->m_wxwindow)->bin_window, - GTK_STATE_SELECTED, - GTK_SHADOW_NONE, - NULL, - m_owner->m_wxwindow, - "cell_even", - rect2.x, rect2.y, rect2.width, rect2.height ); + int flags = wxCONTROL_SELECTED; + if (m_owner->HasFocus()) + flags |= wxCONTROL_FOCUSED; + wxRendererNative::Get().DrawItemSelectionRect( m_owner, *dc, m_gi->m_rectHighlight, flags ); + } else { @@ -1521,17 +1509,10 @@ void wxListLineData::DrawInReportMode( wxDC *dc, { if (highlighted) { - wxRect rect2( rectHL ); - m_owner->CalcScrolledPosition( rect2.x, rect2.y, &rect2.x, &rect2.y ); - - gtk_paint_flat_box( m_owner->m_widget->style, - GTK_PIZZA(m_owner->m_wxwindow)->bin_window, - GTK_STATE_SELECTED, - GTK_SHADOW_NONE, - NULL, - m_owner->m_wxwindow, - "cell_even", - rect2.x, rect2.y, rect2.width, rect2.height ); + int flags = wxCONTROL_SELECTED; + if (m_owner->HasFocus()) + flags |= wxCONTROL_FOCUSED; + wxRendererNative::Get().DrawItemSelectionRect( m_owner, *dc, rectHL, flags ); } else { @@ -2801,15 +2782,7 @@ void wxListMainWindow::OnPaint( wxPaintEvent &WXUNUSED(event) ) dc.SetBrush( *wxTRANSPARENT_BRUSH ); dc.DrawRectangle( rect ); #else - CalcScrolledPosition( rect.x, rect.y, &rect.x, &rect.y ); - - gtk_paint_focus( m_widget->style, - GTK_PIZZA(m_wxwindow)->bin_window, - GTK_STATE_SELECTED, - NULL, - m_wxwindow, - "treeview", - rect.x, rect.y, rect.width, rect.height ); + wxRendererNative::Get().DrawItemSelectionRect( this, dc, rect, wxCONTROL_CURRENT|wxCONTROL_FOCUSED ); #endif } diff --git a/src/generic/treectlg.cpp b/src/generic/treectlg.cpp index 2e88883895..bfd43b7dc8 100644 --- a/src/generic/treectlg.cpp +++ b/src/generic/treectlg.cpp @@ -45,11 +45,6 @@ #include "wx/mac/private.h" #endif -#ifdef __WXGTK20__ - #include "wx/gtk/private.h" - #include "wx/gtk/win_gtk.h" -#endif - // ----------------------------------------------------------------------------- // array types // ----------------------------------------------------------------------------- @@ -2250,25 +2245,12 @@ void wxGenericTreeCtrl::PaintItem(wxGenericTreeItem *item, wxDC& dc) } else { - CalcScrolledPosition( rect.x, rect.y, &rect.x, &rect.y ); - - gtk_paint_flat_box( m_widget->style, - GTK_PIZZA(m_wxwindow)->bin_window, - GTK_STATE_SELECTED, - GTK_SHADOW_NONE, - NULL, - m_wxwindow, - "cell_even", - rect.x, rect.y, rect.width, rect.height ); - + int flags = wxCONTROL_SELECTED; + if (m_hasFocus) + flags |= wxCONTROL_FOCUSED; if ((item == m_current) && (m_hasFocus)) - gtk_paint_focus( m_widget->style, - GTK_PIZZA(m_wxwindow)->bin_window, - GTK_STATE_SELECTED, - NULL, - m_wxwindow, - "treeview", - rect.x, rect.y, rect.width, rect.height ); + flags |= wxCONTROL_CURRENT; + wxRendererNative::Get().DrawItemSelectionRect( this, dc, rect, flags ); } #endif } @@ -2284,28 +2266,15 @@ void wxGenericTreeCtrl::PaintItem(wxGenericTreeItem *item, wxDC& dc) #ifndef __WXGTK20__ dc.DrawRectangle( rect ); #else - CalcScrolledPosition( rect.x, rect.y, &rect.x, &rect.y ); rect.x -= 1; rect.width += 2; - gtk_paint_flat_box( m_widget->style, - GTK_PIZZA(m_wxwindow)->bin_window, - GTK_STATE_SELECTED, - GTK_SHADOW_NONE, - NULL, - m_wxwindow, - "cell_even", - rect.x, rect.y, rect.width, rect.height ); - + int flags = wxCONTROL_SELECTED; + if (m_hasFocus) + flags |= wxCONTROL_FOCUSED; if ((item == m_current) && (m_hasFocus)) - gtk_paint_focus( m_widget->style, - GTK_PIZZA(m_wxwindow)->bin_window, - GTK_STATE_SELECTED, - NULL, - m_wxwindow, - "treeview", - rect.x, rect.y, rect.width, rect.height ); - + flags |= wxCONTROL_CURRENT; + wxRendererNative::Get().DrawItemSelectionRect( this, dc, rect, flags ); #endif } // On GTK+ 2, drawing a 'normal' background is wrong for themes that @@ -2324,27 +2293,15 @@ void wxGenericTreeCtrl::PaintItem(wxGenericTreeItem *item, wxDC& dc) } else { - CalcScrolledPosition( rect.x, rect.y, &rect.x, &rect.y ); rect.x -= 1; rect.width += 2; - - gtk_paint_flat_box( m_widget->style, - GTK_PIZZA(m_wxwindow)->bin_window, - GTK_STATE_SELECTED, - GTK_SHADOW_NONE, - NULL, - m_wxwindow, - "cell_even", - rect.x, rect.y, rect.width, rect.height ); - + + int flags = wxCONTROL_SELECTED; + if (m_hasFocus) + flags |= wxCONTROL_FOCUSED; if ((item == m_current) && (m_hasFocus)) - gtk_paint_focus( m_widget->style, - GTK_PIZZA(m_wxwindow)->bin_window, - GTK_STATE_SELECTED, - NULL, - m_wxwindow, - "treeview", - rect.x, rect.y, rect.width, rect.height ); + flags |= wxCONTROL_CURRENT; + wxRendererNative::Get().DrawItemSelectionRect( this, dc, rect, flags ); } #endif } diff --git a/src/gtk/renderer.cpp b/src/gtk/renderer.cpp index 2802f9274a..77ce8a0a4f 100644 --- a/src/gtk/renderer.cpp +++ b/src/gtk/renderer.cpp @@ -513,18 +513,17 @@ wxRendererGTK::DrawItemSelectionRect(wxWindow *win, GtkStateType state; if (flags & wxCONTROL_SELECTED) { - if (flags & wxCONTROL_FOCUSED) - state = GTK_STATE_SELECTED; - else - state = GTK_STATE_INSENSITIVE; + // the wxCONTROL_FOCUSED state is deduced + // directly from the m_wxwindow by GTK+ + state = GTK_STATE_SELECTED; - gtk_paint_flat_box( win->m_wxwindow->style, + gtk_paint_flat_box( win->m_widget->style, gdk_window, state, GTK_SHADOW_NONE, NULL, win->m_wxwindow, - "treeview", + "cell_even", dc.LogicalToDeviceX(rect.x), dc.LogicalToDeviceY(rect.y), rect.width, @@ -533,8 +532,15 @@ wxRendererGTK::DrawItemSelectionRect(wxWindow *win, if (flags & wxCONTROL_CURRENT) { - dc.SetPen( *wxBLACK_PEN ); - dc.SetBrush( *wxTRANSPARENT_BRUSH ); - dc.DrawRectangle( rect ); + gtk_paint_focus( win->m_widget->style, + gdk_window, + GTK_STATE_SELECTED, + NULL, + win->m_wxwindow, + "treeview", + dc.LogicalToDeviceX(rect.x), + dc.LogicalToDeviceY(rect.y), + rect.width, + rect.height ); } }