From: Francesco Montorsi Date: Sat, 25 Apr 2009 10:49:36 +0000 (+0000) Subject: allow windows which are placed inside wxStaticBoxes to be built as children of the... X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/39cdc95fb3819c4b4ed4c41d51dfd770ce5363eb 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 --- 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") );