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
This commit is contained in:
Francesco Montorsi
2009-04-25 10:49:36 +00:00
parent 74ed0fa155
commit 39cdc95fb3
6 changed files with 55 additions and 25 deletions

View File

@@ -284,6 +284,11 @@ Deprecated methods and their replacements
documented TryBefore/After() methods if you used to override these ones. documented TryBefore/After() methods if you used to override these ones.
- wxGetMultipleChoices() is deprecated, use wxGetSelectedChoices() which has - wxGetMultipleChoices() is deprecated, use wxGetSelectedChoices() which has
the same signature but returns -1 and not 0 if the dialog was cancelled. 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 Major new features in this release
---------------------------------- ----------------------------------

View File

@@ -44,6 +44,8 @@ public:
virtual void GetBordersForSizer(int *borderTop, int *borderOther) const; virtual void GetBordersForSizer(int *borderTop, int *borderOther) const;
virtual void AddChild( wxWindowBase *child );
protected: protected:
virtual bool GTKWidgetNeedsMnemonic() const; virtual bool GTKWidgetNeedsMnemonic() const;
virtual void GTKWidgetDoSetMnemonic(GtkWidget* w); virtual void GTKWidgetDoSetMnemonic(GtkWidget* w);

View File

@@ -1642,6 +1642,19 @@ public:
The static box may be either created independently or the sizer may create it 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 itself as a convenience. In any case, the sizer owns the wxStaticBox control
and will delete it in the wxStaticBoxSizer destructor. 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} @library{wxcore}
@category{winlayout} @category{winlayout}

View File

@@ -12,18 +12,22 @@
A static box is a rectangle drawn around other windows to denote A static box is a rectangle drawn around other windows to denote
a logical grouping of items. a logical grouping of items.
Please note that a static box should @b not be used as the parent for the Note that since wxWidgets 2.9.0 you are encouraged to build the windows which are
controls it contains, instead they should be @b siblings of each other. placed inside wxStaticBoxes as children of the wxStaticBox itself:
Although using a static box as a parent might work in some ports of wxWidgets, @code
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). wxStaticBox *stbox = new wxStaticBox(parentWindow, wxID_ANY, "StaticBox");
Also, please note that because of this, the order in which you create new new wxStaticText(stbox, "This window is a child of the staticbox");
controls is important. Create your wxStaticBox control @b before any ...
siblings that are to appear inside the wxStaticBox in order to preserve the @endcode
correct Z-order of controls.
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} @library{wxcore}
@category{ctrl} @category{ctrl}

View File

@@ -217,17 +217,6 @@ bool wxWindowBase::CreateBase(wxWindowBase *parent,
const wxValidator& wxVALIDATOR_PARAM(validator), const wxValidator& wxVALIDATOR_PARAM(validator),
const wxString& name) 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, // 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 // it's not a good idea to use ids out of this range (and negative ids are
// reserved for wxWidgets own usage) // reserved for wxWidgets own usage)

View File

@@ -13,6 +13,7 @@
#if wxUSE_STATBOX #if wxUSE_STATBOX
#include "wx/statbox.h" #include "wx/statbox.h"
#include "wx/gtk/private/win_gtk.h" // for wxPizza
#include <gtk/gtk.h> #include <gtk/gtk.h>
@@ -31,7 +32,9 @@ static void size_allocate(GtkWidget* widget, GtkAllocation* alloc, void*)
GtkWidget* label_widget = gtk_frame_get_label_widget(GTK_FRAME(widget)); GtkWidget* label_widget = gtk_frame_get_label_widget(GTK_FRAME(widget));
int w = alloc->width - int w = alloc->width -
2 * widget->style->xthickness - 2 * LABEL_PAD - 2 * LABEL_SIDE_PAD; 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) if (label_widget->allocation.width > w)
{ {
GtkAllocation alloc2 = label_widget->allocation; GtkAllocation alloc2 = label_widget->allocation;
@@ -79,6 +82,7 @@ bool wxStaticBox::Create( wxWindow *parent,
m_widget = GTKCreateFrame(label); m_widget = GTKCreateFrame(label);
g_object_ref(m_widget); g_object_ref(m_widget);
// only base SetLabel needs to be called after GTKCreateFrame // only base SetLabel needs to be called after GTKCreateFrame
wxControl::SetLabel(label); wxControl::SetLabel(label);
@@ -97,14 +101,27 @@ bool wxStaticBox::Create( wxWindow *parent,
if (gtk_check_version(2, 12, 0)) if (gtk_check_version(2, 12, 0))
{ {
// for clipping label as GTK >= 2.12 does // we connect this signal to perform label-clipping as GTK >= 2.12 does
g_signal_connect(m_widget, "size_allocate", g_signal_connect(m_widget, "size_allocate", G_CALLBACK(size_allocate), NULL);
G_CALLBACK(size_allocate), NULL);
} }
return true; 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 ) void wxStaticBox::SetLabel( const wxString& label )
{ {
wxCHECK_RET( m_widget != NULL, wxT("invalid staticbox") ); wxCHECK_RET( m_widget != NULL, wxT("invalid staticbox") );