From: Robert Roebling <robert@roebling.de>
Date: Thu, 22 Jan 2009 14:09:32 +0000 (+0000)
Subject: Further attempts at getting the header buttons right
X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/b047e876e0f3189f86145b8f4754d0bf10ba38c3

Further attempts at getting the header buttons right

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@58299 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
---

diff --git a/include/wx/gtk/private.h b/include/wx/gtk/private.h
index 5ae45bd0c9..fdeaf7f036 100644
--- a/include/wx/gtk/private.h
+++ b/include/wx/gtk/private.h
@@ -122,6 +122,7 @@ GtkWidget *GetCheckButtonWidget();
 GtkWidget *GetComboBoxWidget();
 GtkWidget *GetEntryWidget();
 GtkWidget *GetHeaderButtonWidgetFirst();
+GtkWidget *GetHeaderButtonWidgetLast();
 GtkWidget *GetHeaderButtonWidget();
 GtkWidget *GetRadioButtonWidget();
 GtkWidget *GetSplitterWidget();
diff --git a/src/generic/headerctrlg.cpp b/src/generic/headerctrlg.cpp
index 90afc8de8f..48e3117c39 100644
--- a/src/generic/headerctrlg.cpp
+++ b/src/generic/headerctrlg.cpp
@@ -133,11 +133,14 @@ void wxHeaderCtrl::DoScrollHorz(int dx)
 
 wxSize wxHeaderCtrl::DoGetBestSize() const
 {
+    wxWindow *win = GetParent();
+    int height = wxRendererNative::Get().GetHeaderButtonHeight( win );
+
     // the vertical size is rather arbitrary but it looks better if we leave
     // some space around the text
     const wxSize size(IsEmpty() ? wxHeaderCtrlBase::DoGetBestSize().x
                                 : GetColEnd(GetColumnCount() - 1),
-                      (7*GetCharHeight())/4);
+                                height ); // (7*GetCharHeight())/4);
     CacheBestSize(size);
     return size;
 }
@@ -492,6 +495,11 @@ void wxHeaderCtrl::OnPaint(wxPaintEvent& WXUNUSED(event))
 {
     int w, h;
     GetClientSize(&w, &h);
+    
+#ifdef __WXGTK__
+    int vw;
+    GetVirtualSize(&vw, NULL);
+#endif
 
     wxAutoBufferedPaintDC dc(this);
 
@@ -510,7 +518,7 @@ void wxHeaderCtrl::OnPaint(wxPaintEvent& WXUNUSED(event))
         if ( col.IsHidden() )
             continue;
 
-        const int colWidth = col.GetWidth();
+        int colWidth = col.GetWidth();
 
         wxHeaderSortIconType sortArrow;
         if ( col.IsSortKey() )
@@ -533,11 +541,22 @@ void wxHeaderCtrl::OnPaint(wxPaintEvent& WXUNUSED(event))
         {
             state = wxCONTROL_DISABLED;
         }
+        
+        if (i == 0)
+           state |= wxCONTROL_SPECIAL;
 
         wxHeaderButtonParams params;
         params.m_labelText = col.GetTitle();
         params.m_labelBitmap = col.GetBitmap();
         params.m_labelAlignment = col.GetAlignment();
+        
+#ifdef __WXGTK__
+        if (i == count-1)
+        {
+            colWidth = wxMax( colWidth, vw - xpos );
+            state |= wxCONTROL_EXPANDED;
+        }
+#endif
 
         wxRendererNative::Get().DrawHeaderButton
                                 (
diff --git a/src/gtk/private.cpp b/src/gtk/private.cpp
index 8fc53a6aa4..54bc50973c 100644
--- a/src/gtk/private.cpp
+++ b/src/gtk/private.cpp
@@ -116,12 +116,9 @@ GtkWidget *GetEntryWidget()
 static GtkWidget *s_first_button = NULL;
 static GtkWidget *s_other_button = NULL;
 static GtkWidget *s_last_button = NULL;
-    
-GtkWidget *GetHeaderButtonWidgetFirst()
-{
 
-    if ( !s_first_button )
-    {
+static void CreateHeaderButtona()
+{
         // 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();
@@ -137,31 +134,28 @@ GtkWidget *GetHeaderButtonWidgetFirst()
         column = gtk_tree_view_column_new();
         gtk_tree_view_append_column(GTK_TREE_VIEW(treewidget), column);
         s_last_button = column->button;
-    }
+}
+    
+GtkWidget *GetHeaderButtonWidgetFirst()
+{
+    if (!s_first_button)
+      CreateHeaderButtons();
 
     return s_first_button;
 }
 
+GtkWidget *GetHeaderButtonWidgetLast()
+{
+    if (!s_last_button)
+      CreateHeaderButtons();
+
+    return s_last_button;
+}
+
 GtkWidget *GetHeaderButtonWidget()
 {
-    if ( !s_other_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_first_button = column->button;
-        
-        column = gtk_tree_view_column_new();
-        gtk_tree_view_append_column(GTK_TREE_VIEW(treewidget), column);
-        s_other_button = column->button;
-        
-        column = gtk_tree_view_column_new();
-        gtk_tree_view_append_column(GTK_TREE_VIEW(treewidget), column);
-        s_last_button = column->button;
-    }
+    if (!s_other_button)
+      CreateHeaderButtons();
 
     return s_other_button;
 }
diff --git a/src/gtk/renderer.cpp b/src/gtk/renderer.cpp
index f6dde4676e..fc9c68ba4d 100644
--- a/src/gtk/renderer.cpp
+++ b/src/gtk/renderer.cpp
@@ -173,6 +173,8 @@ wxRendererGTK::DrawHeaderButton(wxWindow *win,
     GtkWidget *button = wxGTKPrivate::GetHeaderButtonWidget();
     if (flags & wxCONTROL_SPECIAL)
         button = wxGTKPrivate::GetHeaderButtonWidgetFirst();
+    if (flags & wxCONTROL_EXPANDED)
+        button = wxGTKPrivate::GetHeaderButtonWidgetLast();
 
     GdkWindow* gdk_window = wxGetGdkWindowForDC(win, dc);
     wxASSERT_MSG( gdk_window,