]> git.saurik.com Git - wxWidgets.git/commitdiff
Further attempts at getting the header buttons right
authorRobert Roebling <robert@roebling.de>
Thu, 22 Jan 2009 14:09:32 +0000 (14:09 +0000)
committerRobert Roebling <robert@roebling.de>
Thu, 22 Jan 2009 14:09:32 +0000 (14:09 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@58299 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/gtk/private.h
src/generic/headerctrlg.cpp
src/gtk/private.cpp
src/gtk/renderer.cpp

index 5ae45bd0c9f3c06a26822b900ffacb95c1df1832..fdeaf7f03669dbcec7dfa3b713c9fbbee257de7d 100644 (file)
@@ -122,6 +122,7 @@ GtkWidget *GetCheckButtonWidget();
 GtkWidget *GetComboBoxWidget();
 GtkWidget *GetEntryWidget();
 GtkWidget *GetHeaderButtonWidgetFirst();
+GtkWidget *GetHeaderButtonWidgetLast();
 GtkWidget *GetHeaderButtonWidget();
 GtkWidget *GetRadioButtonWidget();
 GtkWidget *GetSplitterWidget();
index 90afc8de8fb6be9bbf62b7d5d99981624ab8d6ca..48e3117c397326d4c61c19b80f4b236028c8b923 100644 (file)
@@ -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
                                 (
index 8fc53a6aa4324670a2a25d3d869654e5ad42c681..54bc50973c6b82fd821c01801789e19b7b96723d 100644 (file)
@@ -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;
 }
index f6dde4676e1dd9760b3f239376af9073563cca43..fc9c68ba4d32cafc312bc11e9fc307513e32a988 100644 (file)
@@ -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,