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.
- 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
----------------------------------

View File

@@ -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);

View File

@@ -1643,6 +1643,19 @@ public:
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}

View File

@@ -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}

View File

@@ -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)

View File

@@ -13,6 +13,7 @@
#if wxUSE_STATBOX
#include "wx/statbox.h"
#include "wx/gtk/private/win_gtk.h" // for wxPizza
#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));
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") );