From 39cdc95fb3819c4b4ed4c41d51dfd770ce5363eb Mon Sep 17 00:00:00 2001 From: Francesco Montorsi Date: Sat, 25 Apr 2009 10:49:36 +0000 Subject: [PATCH] allow windows which are placed inside wxStaticBoxes to be built as children of the wxStaticBox itself rather than forcing users to build them as siblings of the static box (closes #9859) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@60335 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- docs/changes.txt | 5 +++++ include/wx/gtk/statbox.h | 2 ++ interface/wx/sizer.h | 13 +++++++++++++ interface/wx/statbox.h | 24 ++++++++++++++---------- src/common/wincmn.cpp | 11 ----------- src/gtk/statbox.cpp | 25 +++++++++++++++++++++---- 6 files changed, 55 insertions(+), 25 deletions(-) diff --git a/docs/changes.txt b/docs/changes.txt index 39673ad7bc..a5a61d988c 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -284,6 +284,11 @@ Deprecated methods and their replacements documented TryBefore/After() methods if you used to override these ones. - wxGetMultipleChoices() is deprecated, use wxGetSelectedChoices() which has the same signature but returns -1 and not 0 if the dialog was cancelled. +- building the windows which are placed inside wxStaticBoxes as siblings of the + wxStaticBox is still allowed but it's deprecated as it gives some problems + on some ports (e.g. wxGTK). + You should now create windows placed inside a wxStaticBox as children of + the static box itself. Major new features in this release ---------------------------------- diff --git a/include/wx/gtk/statbox.h b/include/wx/gtk/statbox.h index 437e1836f2..b216e24143 100644 --- a/include/wx/gtk/statbox.h +++ b/include/wx/gtk/statbox.h @@ -44,6 +44,8 @@ public: virtual void GetBordersForSizer(int *borderTop, int *borderOther) const; + virtual void AddChild( wxWindowBase *child ); + protected: virtual bool GTKWidgetNeedsMnemonic() const; virtual void GTKWidgetDoSetMnemonic(GtkWidget* w); diff --git a/interface/wx/sizer.h b/interface/wx/sizer.h index 2e37e10f9d..9fbb06d67b 100644 --- a/interface/wx/sizer.h +++ b/interface/wx/sizer.h @@ -1642,6 +1642,19 @@ public: The static box may be either created independently or the sizer may create it itself as a convenience. In any case, the sizer owns the wxStaticBox control and will delete it in the wxStaticBoxSizer destructor. + + Note that since wxWidgets 2.9.0 you are encouraged to build the windows which are + placed inside wxStaticBoxes as children of the wxStaticBox itself: + @code + ... + wxStaticBoxSizer *sz = new wxStaticBoxSizer(wxVERTICAL, parentWindow, "StaticBox"); + sz->Add(new wxStaticText(sz->GetStaticBox(), "This window is a child of the staticbox")); + ... + @endcode + + Creating the windows which are placed inside wxStaticBoxes as siblings of the + wxStaticBox is still allowed but it's deprecated as it gives some problems + (e.g. relative to tooltips) on some ports. @library{wxcore} @category{winlayout} diff --git a/interface/wx/statbox.h b/interface/wx/statbox.h index 250ba09fcc..ff31baeeb4 100644 --- a/interface/wx/statbox.h +++ b/interface/wx/statbox.h @@ -12,18 +12,22 @@ A static box is a rectangle drawn around other windows to denote a logical grouping of items. - Please note that a static box should @b not be used as the parent for the - controls it contains, instead they should be @b siblings of each other. - Although using a static box as a parent might work in some ports of wxWidgets, - it would result in a crash under, for example, wxGTK, and thus it's explicitely - disallowed (an assertion will fail if you try to add children to a wxStaticBox). + Note that since wxWidgets 2.9.0 you are encouraged to build the windows which are + placed inside wxStaticBoxes as children of the wxStaticBox itself: + @code + ... + wxStaticBox *stbox = new wxStaticBox(parentWindow, wxID_ANY, "StaticBox"); - Also, please note that because of this, the order in which you create new - controls is important. Create your wxStaticBox control @b before any - siblings that are to appear inside the wxStaticBox in order to preserve the - correct Z-order of controls. + new wxStaticText(stbox, "This window is a child of the staticbox"); + ... + @endcode - You may want to use wxStaticBoxSizer instead of wxStaticBox to avoid this problem. + Creating the windows which are placed inside wxStaticBoxes as siblings of the + wxStaticBox is still allowed but it's deprecated as it gives some problems + (e.g. relative to tooltips) on some ports. + + Also note that there is a specialized wxSizer class (wxStaticBoxSizer) which can + be used as an easier way to pack items into a static box. @library{wxcore} @category{ctrl} diff --git a/src/common/wincmn.cpp b/src/common/wincmn.cpp index 44fc178369..cd95242587 100644 --- a/src/common/wincmn.cpp +++ b/src/common/wincmn.cpp @@ -217,17 +217,6 @@ bool wxWindowBase::CreateBase(wxWindowBase *parent, const wxValidator& wxVALIDATOR_PARAM(validator), const wxString& name) { -#if wxUSE_STATBOX - // wxGTK doesn't allow to create controls with static box as the parent so - // this will result in a crash when the program is ported to wxGTK so warn - // the user about it - - // if you get this assert, the correct solution is to create the controls - // as siblings of the static box - wxASSERT_MSG( !parent || !wxDynamicCast(parent, wxStaticBox), - _T("wxStaticBox can't be used as a window parent!") ); -#endif // wxUSE_STATBOX - // ids are limited to 16 bits under MSW so if you care about portability, // it's not a good idea to use ids out of this range (and negative ids are // reserved for wxWidgets own usage) diff --git a/src/gtk/statbox.cpp b/src/gtk/statbox.cpp index 20326248c2..a82354bc28 100644 --- a/src/gtk/statbox.cpp +++ b/src/gtk/statbox.cpp @@ -13,6 +13,7 @@ #if wxUSE_STATBOX #include "wx/statbox.h" +#include "wx/gtk/private/win_gtk.h" // for wxPizza #include @@ -31,7 +32,9 @@ static void size_allocate(GtkWidget* widget, GtkAllocation* alloc, void*) GtkWidget* label_widget = gtk_frame_get_label_widget(GTK_FRAME(widget)); int w = alloc->width - 2 * widget->style->xthickness - 2 * LABEL_PAD - 2 * LABEL_SIDE_PAD; - if (w < 0) w = 0; + if (w < 0) + w = 0; + if (label_widget->allocation.width > w) { GtkAllocation alloc2 = label_widget->allocation; @@ -79,6 +82,7 @@ bool wxStaticBox::Create( wxWindow *parent, m_widget = GTKCreateFrame(label); g_object_ref(m_widget); + // only base SetLabel needs to be called after GTKCreateFrame wxControl::SetLabel(label); @@ -97,14 +101,27 @@ bool wxStaticBox::Create( wxWindow *parent, if (gtk_check_version(2, 12, 0)) { - // for clipping label as GTK >= 2.12 does - g_signal_connect(m_widget, "size_allocate", - G_CALLBACK(size_allocate), NULL); + // we connect this signal to perform label-clipping as GTK >= 2.12 does + g_signal_connect(m_widget, "size_allocate", G_CALLBACK(size_allocate), NULL); } return true; } +void wxStaticBox::AddChild( wxWindowBase *child ) +{ + if (!m_wxwindow) + { + // make this window a container of other wxWindows by instancing a wxPizza + // and packing it into the GtkFrame: + m_wxwindow = wxPizza::New( 0, this ); + gtk_widget_show( m_wxwindow ); + gtk_container_add( GTK_CONTAINER (m_widget), m_wxwindow ); + } + + wxWindow::AddChild( child ); +} + void wxStaticBox::SetLabel( const wxString& label ) { wxCHECK_RET( m_widget != NULL, wxT("invalid staticbox") ); -- 2.45.2