From 05d9753817cac280b05d14b0aeb26018700d1764 Mon Sep 17 00:00:00 2001
From: Robert Roebling <robert@roebling.de>
Date: Tue, 14 Nov 2006 10:20:38 +0000
Subject: [PATCH]   Just use the already existing
 wxRenderer::DrawItemSelectionRect()     from wxListCtrl and wxTreeCtrl; and
 document it...

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@43406 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
---
 docs/latex/wx/renderer.tex | 15 ++++++++
 src/generic/listctrl.cpp   | 47 +++++-------------------
 src/generic/treectlg.cpp   | 75 ++++++++------------------------------
 src/gtk/renderer.cpp       | 24 +++++++-----
 4 files changed, 56 insertions(+), 105 deletions(-)

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 );
     }
 }
-- 
2.50.0

