]> git.saurik.com Git - wxWidgets.git/commitdiff
allow windows which are placed inside wxStaticBoxes to be built as children of the...
authorFrancesco Montorsi <f18m_cpp217828@yahoo.it>
Sat, 25 Apr 2009 10:49:36 +0000 (10:49 +0000)
committerFrancesco Montorsi <f18m_cpp217828@yahoo.it>
Sat, 25 Apr 2009 10:49:36 +0000 (10:49 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@60335 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

docs/changes.txt
include/wx/gtk/statbox.h
interface/wx/sizer.h
interface/wx/statbox.h
src/common/wincmn.cpp
src/gtk/statbox.cpp

index 39673ad7bc2c585a3b052838eb494d74a6fbea91..a5a61d988cd898461a0afc241de5ea75d542e476 100644 (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.
   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
 ----------------------------------
 
 Major new features in this release
 ----------------------------------
index 437e1836f21d32eb907b7a58d70262c9eb5b845b..b216e24143475eeb8ab9ea4b9b7dd9d37b152df4 100644 (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:
     virtual bool GTKWidgetNeedsMnemonic() const;
     virtual void GTKWidgetDoSetMnemonic(GtkWidget* w);
 protected:
     virtual bool GTKWidgetNeedsMnemonic() const;
     virtual void GTKWidgetDoSetMnemonic(GtkWidget* w);
index 2e37e10f9d807e54e69a3259348cfbd8132afcb1..9fbb06d67bbaacc1142910866f87f046f8408c9e 100644 (file)
@@ -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.
     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}
 
     @library{wxcore}
     @category{winlayout}
index 250ba09fccb4f1a9ce03761761d29bf28586a54c..ff31baeeb4a14b0b3529533673d89cad23304a2e 100644 (file)
     A static box is a rectangle drawn around other windows to denote
     a logical grouping of items.
 
     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}
 
     @library{wxcore}
     @category{ctrl}
index 44fc1783691c3a38fdec3f704c5a0915c6d53357..cd95242587354080dd9d62638486394fa2bc07d0 100644 (file)
@@ -217,17 +217,6 @@ bool wxWindowBase::CreateBase(wxWindowBase *parent,
                               const wxValidator& wxVALIDATOR_PARAM(validator),
                               const wxString& name)
 {
                               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)
     // 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)
index 20326248c207cf18595b95d2aba90f9f20bece73..a82354bc28f81e0417437a7f4230df859817b3c2 100644 (file)
@@ -13,6 +13,7 @@
 #if wxUSE_STATBOX
 
 #include "wx/statbox.h"
 #if wxUSE_STATBOX
 
 #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));
     int w = alloc->width -
         2 * widget->style->xthickness - 2 * LABEL_PAD - 2 * LABEL_SIDE_PAD;
     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;
     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);
 
     m_widget = GTKCreateFrame(label);
     g_object_ref(m_widget);
+
     // only base SetLabel needs to be called after GTKCreateFrame
     wxControl::SetLabel(label);
 
     // 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))
     {
 
     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;
 }
 
     }
 
     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") );
 void wxStaticBox::SetLabel( const wxString& label )
 {
     wxCHECK_RET( m_widget != NULL, wxT("invalid staticbox") );