GtkWidget *GetComboBoxWidget();
 GtkWidget *GetEntryWidget();
 GtkWidget *GetHeaderButtonWidgetFirst();
+GtkWidget *GetHeaderButtonWidgetLast();
 GtkWidget *GetHeaderButtonWidget();
 GtkWidget *GetRadioButtonWidget();
 GtkWidget *GetSplitterWidget();
 
 
 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;
 }
 {
     int w, h;
     GetClientSize(&w, &h);
+    
+#ifdef __WXGTK__
+    int vw;
+    GetVirtualSize(&vw, NULL);
+#endif
 
     wxAutoBufferedPaintDC dc(this);
 
         if ( col.IsHidden() )
             continue;
 
-        const int colWidth = col.GetWidth();
+        int colWidth = col.GetWidth();
 
         wxHeaderSortIconType sortArrow;
         if ( col.IsSortKey() )
         {
             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
                                 (
 
 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();
         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;
 }
 
     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,