From b047e876e0f3189f86145b8f4754d0bf10ba38c3 Mon Sep 17 00:00:00 2001 From: Robert Roebling Date: Thu, 22 Jan 2009 14:09:32 +0000 Subject: [PATCH] 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 --- include/wx/gtk/private.h | 1 + src/generic/headerctrlg.cpp | 23 ++++++++++++++++++-- src/gtk/private.cpp | 42 ++++++++++++++++--------------------- src/gtk/renderer.cpp | 2 ++ 4 files changed, 42 insertions(+), 26 deletions(-) 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, -- 2.45.2