]> git.saurik.com Git - wxWidgets.git/commitdiff
Fix wxWrapSizer minimal size calculation.
authorVadim Zeitlin <vadim@wxwidgets.org>
Tue, 8 Feb 2011 13:36:13 +0000 (13:36 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Tue, 8 Feb 2011 13:36:13 +0000 (13:36 +0000)
Add a unit test checking that wxWrapSizer::CalcMin() returns the expected
results.

Closes #12464.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@66862 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

15 files changed:
docs/changes.txt
include/wx/sizer.h
include/wx/window.h
src/common/wincmn.cpp
tests/Makefile.in
tests/makefile.bcc
tests/makefile.gcc
tests/makefile.vc
tests/makefile.wat
tests/sizers/wrapsizer.cpp [new file with mode: 0644]
tests/test.bkl
tests/test_test_gui.dsp
tests/test_vc7_test_gui.vcproj
tests/test_vc8_test_gui.vcproj
tests/test_vc9_test_gui.vcproj

index 2d7703606398e7ab9858007d9f6d8e88c8968e8e..bb79b65387bc6e75c8c2dcb308a5abea3ee56ba8 100644 (file)
@@ -461,6 +461,7 @@ All (GUI):
 - wxPropertyGrid: Added "HasAlpha" attribute for wxColourProperty.
 - Added support for saving PNG files with palette (troelsk).
 - Added support for saving as GIF and animated GIF (troelsk).
+- Fix wxWrapSizer minimal size calculation (Catalin Raceanu).
 
 GTK:
 
index 6d414fd09d20308b3cc8a22ee7d0a3e1d33fb5b0..39044e31e880958f4f78e19749928fd7629393b9 100644 (file)
@@ -665,6 +665,10 @@ public:
         m_position = pos;
         m_size = size;
         Layout();
+
+        // This call is required for wxWrapSizer to be able to calculate its
+        // minimal size correctly.
+        InformFirstDirection(wxHORIZONTAL, size.x, size.y);
     }
     void SetDimension(int x, int y, int width, int height)
         { SetDimension(wxPoint(x, y), wxSize(width, height)); }
index 1527a1e0de728fa81afd3133103054800e009500..0fd842426a90fd5a1031d0fb868006cb3b73d026 100644 (file)
@@ -525,12 +525,7 @@ public:
     // tells the item how much more space there is available in the opposite
     // direction (-1 if unknown).
     virtual bool
-    InformFirstDirection(int WXUNUSED(direction),
-                         int WXUNUSED(size),
-                         int WXUNUSED(availableOtherDir))
-    {
-        return false;
-    }
+    InformFirstDirection(int direction, int size, int availableOtherDir);
 
     // sends a size event to the window using its current size -- this has an
     // effect of refreshing the window layout
index 76aca9086ced6730870a90f38b7b1d3d73716242..2c58ce1ec1be00242d7b546d36520c9edeb33011 100644 (file)
@@ -853,6 +853,16 @@ wxSize wxWindowBase::GetWindowBorderSize() const
     return size*2;
 }
 
+bool
+wxWindowBase::InformFirstDirection(int direction,
+                                   int size,
+                                   int availableOtherDir)
+{
+    return GetSizer() && GetSizer()->InformFirstDirection(direction,
+                                                          size,
+                                                          availableOtherDir);
+}
+
 wxSize wxWindowBase::GetEffectiveMinSize() const
 {
     // merge the best size with the min size, giving priority to the min size
index 9a1f9abb7804990648fdd7771488a065e7b57d0f..9c57cd3d22deb788c5aa286b2f8f116a96b2c8bb 100644 (file)
@@ -213,6 +213,7 @@ TEST_GUI_OBJECTS =  \
        test_gui_settings.o \
        test_gui_socket.o \
        test_gui_boxsizer.o \
+       test_gui_wrapsizer.o \
        test_gui_valnum.o \
        test_gui_clientsize.o \
        test_gui_setsize.o \
@@ -868,6 +869,9 @@ test_gui_socket.o: $(srcdir)/net/socket.cpp $(TEST_GUI_ODEP)
 test_gui_boxsizer.o: $(srcdir)/sizers/boxsizer.cpp $(TEST_GUI_ODEP)
        $(CXXC) -c -o $@ $(TEST_GUI_CXXFLAGS) $(srcdir)/sizers/boxsizer.cpp
 
+test_gui_wrapsizer.o: $(srcdir)/sizers/wrapsizer.cpp $(TEST_GUI_ODEP)
+       $(CXXC) -c -o $@ $(TEST_GUI_CXXFLAGS) $(srcdir)/sizers/wrapsizer.cpp
+
 test_gui_valnum.o: $(srcdir)/validators/valnum.cpp $(TEST_GUI_ODEP)
        $(CXXC) -c -o $@ $(TEST_GUI_CXXFLAGS) $(srcdir)/validators/valnum.cpp
 
index 5b9060338d1a42df4112bd4f75f4ad5338b91b64..f6a49b636b48364f9c27c36f927edaaafb2b08e1 100644 (file)
@@ -195,12 +195,13 @@ TEST_GUI_OBJECTS =  \
        $(OBJS)\test_gui_guifuncs.obj \\r
        $(OBJS)\test_gui_selstoretest.obj \\r
        $(OBJS)\test_gui_garbage.obj \\r
-       $(OBJS)\test_gui_settings.obj \\r
-       $(OBJS)\test_gui_socket.obj \\r
-       $(OBJS)\test_gui_boxsizer.obj \\r
-       $(OBJS)\test_gui_valnum.obj \\r
-       $(OBJS)\test_gui_clientsize.obj \\r
-       $(OBJS)\test_gui_setsize.obj \\r
+       $(OBJS)\test_gui_settings.obj \
+       $(OBJS)\test_gui_socket.obj \
+       $(OBJS)\test_gui_boxsizer.obj \
+       $(OBJS)\test_gui_wrapsizer.obj \
+       $(OBJS)\test_gui_valnum.obj \
+       $(OBJS)\test_gui_clientsize.obj \
+       $(OBJS)\test_gui_setsize.obj \
        $(OBJS)\test_gui_xrctest.obj\r
 \r
 ### Conditionally set variables: ###\r
@@ -913,12 +914,15 @@ $(OBJS)\test_gui_settings.obj: .\misc\settings.cpp
 $(OBJS)\test_gui_socket.obj: .\net\socket.cpp\r
        $(CXX) -q -c -P -o$@ $(TEST_GUI_CXXFLAGS) .\net\socket.cpp\r
 \r
-$(OBJS)\test_gui_boxsizer.obj: .\sizers\boxsizer.cpp\r
-       $(CXX) -q -c -P -o$@ $(TEST_GUI_CXXFLAGS) .\sizers\boxsizer.cpp\r
-\r
-$(OBJS)\test_gui_valnum.obj: .\validators\valnum.cpp\r
-       $(CXX) -q -c -P -o$@ $(TEST_GUI_CXXFLAGS) .\validators\valnum.cpp\r
-\r
+$(OBJS)\test_gui_boxsizer.obj: .\sizers\boxsizer.cpp
+       $(CXX) -q -c -P -o$@ $(TEST_GUI_CXXFLAGS) .\sizers\boxsizer.cpp
+
+$(OBJS)\test_gui_wrapsizer.obj: .\sizers\wrapsizer.cpp
+       $(CXX) -q -c -P -o$@ $(TEST_GUI_CXXFLAGS) .\sizers\wrapsizer.cpp
+
+$(OBJS)\test_gui_valnum.obj: .\validators\valnum.cpp
+       $(CXX) -q -c -P -o$@ $(TEST_GUI_CXXFLAGS) .\validators\valnum.cpp
+
 $(OBJS)\test_gui_clientsize.obj: .\window\clientsize.cpp\r
        $(CXX) -q -c -P -o$@ $(TEST_GUI_CXXFLAGS) .\window\clientsize.cpp\r
 \r
index f7829a341b5e0df783e826e9f5f1cf7e2ab02e76..52490dd62f15bbdddbecb33f30c0f4be4602d0b4 100644 (file)
@@ -188,12 +188,13 @@ TEST_GUI_OBJECTS =  \
        $(OBJS)\test_gui_guifuncs.o \\r
        $(OBJS)\test_gui_selstoretest.o \\r
        $(OBJS)\test_gui_garbage.o \\r
-       $(OBJS)\test_gui_settings.o \\r
-       $(OBJS)\test_gui_socket.o \\r
-       $(OBJS)\test_gui_boxsizer.o \\r
-       $(OBJS)\test_gui_valnum.o \\r
-       $(OBJS)\test_gui_clientsize.o \\r
-       $(OBJS)\test_gui_setsize.o \\r
+       $(OBJS)\test_gui_settings.o \
+       $(OBJS)\test_gui_socket.o \
+       $(OBJS)\test_gui_boxsizer.o \
+       $(OBJS)\test_gui_wrapsizer.o \
+       $(OBJS)\test_gui_valnum.o \
+       $(OBJS)\test_gui_clientsize.o \
+       $(OBJS)\test_gui_setsize.o \
        $(OBJS)\test_gui_xrctest.o\r
 \r
 ### Conditionally set variables: ###\r
@@ -894,12 +895,15 @@ $(OBJS)\test_gui_settings.o: ./misc/settings.cpp
 $(OBJS)\test_gui_socket.o: ./net/socket.cpp\r
        $(CXX) -c -o $@ $(TEST_GUI_CXXFLAGS) $(CPPDEPS) $<\r
 \r
-$(OBJS)\test_gui_boxsizer.o: ./sizers/boxsizer.cpp\r
-       $(CXX) -c -o $@ $(TEST_GUI_CXXFLAGS) $(CPPDEPS) $<\r
-\r
-$(OBJS)\test_gui_valnum.o: ./validators/valnum.cpp\r
-       $(CXX) -c -o $@ $(TEST_GUI_CXXFLAGS) $(CPPDEPS) $<\r
-\r
+$(OBJS)\test_gui_boxsizer.o: ./sizers/boxsizer.cpp
+       $(CXX) -c -o $@ $(TEST_GUI_CXXFLAGS) $(CPPDEPS) $<
+
+$(OBJS)\test_gui_wrapsizer.o: ./sizers/wrapsizer.cpp
+       $(CXX) -c -o $@ $(TEST_GUI_CXXFLAGS) $(CPPDEPS) $<
+
+$(OBJS)\test_gui_valnum.o: ./validators/valnum.cpp
+       $(CXX) -c -o $@ $(TEST_GUI_CXXFLAGS) $(CPPDEPS) $<
+
 $(OBJS)\test_gui_clientsize.o: ./window/clientsize.cpp\r
        $(CXX) -c -o $@ $(TEST_GUI_CXXFLAGS) $(CPPDEPS) $<\r
 \r
index 2af1e2cfa517a0b7bd5c3e0cc8a1dd9df177e537..19f365c0ad48b00c7b180cfad1f12254093078d9 100644 (file)
@@ -190,12 +190,13 @@ TEST_GUI_OBJECTS =  \
        $(OBJS)\test_gui_guifuncs.obj \\r
        $(OBJS)\test_gui_selstoretest.obj \\r
        $(OBJS)\test_gui_garbage.obj \\r
-       $(OBJS)\test_gui_settings.obj \\r
-       $(OBJS)\test_gui_socket.obj \\r
-       $(OBJS)\test_gui_boxsizer.obj \\r
-       $(OBJS)\test_gui_valnum.obj \\r
-       $(OBJS)\test_gui_clientsize.obj \\r
-       $(OBJS)\test_gui_setsize.obj \\r
+       $(OBJS)\test_gui_settings.obj \
+       $(OBJS)\test_gui_socket.obj \
+       $(OBJS)\test_gui_boxsizer.obj \
+       $(OBJS)\test_gui_wrapsizer.obj \
+       $(OBJS)\test_gui_valnum.obj \
+       $(OBJS)\test_gui_clientsize.obj \
+       $(OBJS)\test_gui_setsize.obj \
        $(OBJS)\test_gui_xrctest.obj\r
 TEST_GUI_RESOURCES =  \\r
        $(OBJS)\test_gui_sample.res\r
@@ -1039,12 +1040,15 @@ $(OBJS)\test_gui_settings.obj: .\misc\settings.cpp
 $(OBJS)\test_gui_socket.obj: .\net\socket.cpp\r
        $(CXX) /c /nologo /TP /Fo$@ $(TEST_GUI_CXXFLAGS) .\net\socket.cpp\r
 \r
-$(OBJS)\test_gui_boxsizer.obj: .\sizers\boxsizer.cpp\r
-       $(CXX) /c /nologo /TP /Fo$@ $(TEST_GUI_CXXFLAGS) .\sizers\boxsizer.cpp\r
-\r
-$(OBJS)\test_gui_valnum.obj: .\validators\valnum.cpp\r
-       $(CXX) /c /nologo /TP /Fo$@ $(TEST_GUI_CXXFLAGS) .\validators\valnum.cpp\r
-\r
+$(OBJS)\test_gui_boxsizer.obj: .\sizers\boxsizer.cpp
+       $(CXX) /c /nologo /TP /Fo$@ $(TEST_GUI_CXXFLAGS) .\sizers\boxsizer.cpp
+
+$(OBJS)\test_gui_wrapsizer.obj: .\sizers\wrapsizer.cpp
+       $(CXX) /c /nologo /TP /Fo$@ $(TEST_GUI_CXXFLAGS) .\sizers\wrapsizer.cpp
+
+$(OBJS)\test_gui_valnum.obj: .\validators\valnum.cpp
+       $(CXX) /c /nologo /TP /Fo$@ $(TEST_GUI_CXXFLAGS) .\validators\valnum.cpp
+
 $(OBJS)\test_gui_clientsize.obj: .\window\clientsize.cpp\r
        $(CXX) /c /nologo /TP /Fo$@ $(TEST_GUI_CXXFLAGS) .\window\clientsize.cpp\r
 \r
index ba5ae182f5310b59cc2137df69c6a765a651192a..6500836f23e04047c756322de9007414ae613d17 100644 (file)
@@ -434,12 +434,13 @@ TEST_GUI_OBJECTS =  &
        $(OBJS)\test_gui_guifuncs.obj &\r
        $(OBJS)\test_gui_selstoretest.obj &\r
        $(OBJS)\test_gui_garbage.obj &\r
-       $(OBJS)\test_gui_settings.obj &\r
-       $(OBJS)\test_gui_socket.obj &\r
-       $(OBJS)\test_gui_boxsizer.obj &\r
-       $(OBJS)\test_gui_valnum.obj &\r
-       $(OBJS)\test_gui_clientsize.obj &\r
-       $(OBJS)\test_gui_setsize.obj &\r
+       $(OBJS)\test_gui_settings.obj &
+       $(OBJS)\test_gui_socket.obj &
+       $(OBJS)\test_gui_boxsizer.obj &
+       $(OBJS)\test_gui_wrapsizer.obj &
+       $(OBJS)\test_gui_valnum.obj &
+       $(OBJS)\test_gui_clientsize.obj &
+       $(OBJS)\test_gui_setsize.obj &
        $(OBJS)\test_gui_xrctest.obj\r
 \r
 \r
@@ -953,12 +954,15 @@ $(OBJS)\test_gui_settings.obj :  .AUTODEPEND .\misc\settings.cpp
 $(OBJS)\test_gui_socket.obj :  .AUTODEPEND .\net\socket.cpp\r
        $(CXX) -bt=nt -zq -fo=$^@ $(TEST_GUI_CXXFLAGS) $<\r
 \r
-$(OBJS)\test_gui_boxsizer.obj :  .AUTODEPEND .\sizers\boxsizer.cpp\r
-       $(CXX) -bt=nt -zq -fo=$^@ $(TEST_GUI_CXXFLAGS) $<\r
-\r
-$(OBJS)\test_gui_valnum.obj :  .AUTODEPEND .\validators\valnum.cpp\r
-       $(CXX) -bt=nt -zq -fo=$^@ $(TEST_GUI_CXXFLAGS) $<\r
-\r
+$(OBJS)\test_gui_boxsizer.obj :  .AUTODEPEND .\sizers\boxsizer.cpp
+       $(CXX) -bt=nt -zq -fo=$^@ $(TEST_GUI_CXXFLAGS) $<
+
+$(OBJS)\test_gui_wrapsizer.obj :  .AUTODEPEND .\sizers\wrapsizer.cpp
+       $(CXX) -bt=nt -zq -fo=$^@ $(TEST_GUI_CXXFLAGS) $<
+
+$(OBJS)\test_gui_valnum.obj :  .AUTODEPEND .\validators\valnum.cpp
+       $(CXX) -bt=nt -zq -fo=$^@ $(TEST_GUI_CXXFLAGS) $<
+
 $(OBJS)\test_gui_clientsize.obj :  .AUTODEPEND .\window\clientsize.cpp\r
        $(CXX) -bt=nt -zq -fo=$^@ $(TEST_GUI_CXXFLAGS) $<\r
 \r
diff --git a/tests/sizers/wrapsizer.cpp b/tests/sizers/wrapsizer.cpp
new file mode 100644 (file)
index 0000000..a5d8575
--- /dev/null
@@ -0,0 +1,128 @@
+///////////////////////////////////////////////////////////////////////////////
+// Name:        tests/sizers/wrapsizer.cpp
+// Purpose:     Unit tests for wxWrapSizer
+// Author:      Catalin Raceanu
+// Created:     2010-10-23
+// RCS-ID:      $Id:$
+// Copyright:   (c) 2010 wxWidgets development team
+///////////////////////////////////////////////////////////////////////////////
+
+// ----------------------------------------------------------------------------
+// headers
+// ----------------------------------------------------------------------------
+
+#include "testprec.h"
+
+#ifdef __BORLANDC__
+    #pragma hdrstop
+#endif
+
+#ifndef WX_PRECOMP
+    #include "wx/app.h"
+#endif // WX_PRECOMP
+
+#include "wx/wrapsizer.h"
+
+#include "asserthelper.h"
+
+// ----------------------------------------------------------------------------
+// test class
+// ----------------------------------------------------------------------------
+
+class WrapSizerTestCase : public CppUnit::TestCase
+{
+public:
+    WrapSizerTestCase() { }
+
+    virtual void setUp();
+    virtual void tearDown();
+
+private:
+    CPPUNIT_TEST_SUITE( WrapSizerTestCase );
+        CPPUNIT_TEST( CalcMin );
+    CPPUNIT_TEST_SUITE_END();
+
+    void CalcMin();
+
+    wxWindow *m_win;
+    wxSizer *m_sizer;
+
+    DECLARE_NO_COPY_CLASS(WrapSizerTestCase)
+};
+
+// register in the unnamed registry so that these tests are run by default
+CPPUNIT_TEST_SUITE_REGISTRATION( WrapSizerTestCase );
+
+// also include in it's own registry so that these tests can be run alone
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( WrapSizerTestCase, "WrapSizerTestCase" );
+
+// ----------------------------------------------------------------------------
+// test initialization
+// ----------------------------------------------------------------------------
+
+void WrapSizerTestCase::setUp()
+{
+    m_win = new wxWindow(wxTheApp->GetTopWindow(), wxID_ANY);
+    m_win->SetClientSize(180, 240);
+
+    m_sizer = new wxWrapSizer(wxHORIZONTAL);
+    m_win->SetSizer(m_sizer);
+}
+
+void WrapSizerTestCase::tearDown()
+{
+    delete m_win;
+    m_win = NULL;
+
+    m_sizer = NULL;
+}
+
+// ----------------------------------------------------------------------------
+// tests themselves
+// ----------------------------------------------------------------------------
+
+void WrapSizerTestCase::CalcMin()
+{
+    const wxSize sizeTotal = m_win->GetClientSize();
+    wxSize sizeMinExpected;
+
+    // With a single child the min size must be the same as child size.
+    const wxSize sizeChild1 = wxSize(sizeTotal.x/2 - 10, sizeTotal.y/4);
+    sizeMinExpected = sizeChild1;
+
+    wxWindow * const
+        child1 = new wxWindow(m_win, wxID_ANY, wxDefaultPosition, sizeChild1);
+    child1->SetBackgroundColour(*wxRED);
+    m_sizer->Add(child1);
+    m_win->Layout();
+
+    CPPUNIT_ASSERT_EQUAL( sizeMinExpected, m_sizer->CalcMin() );
+
+    // If both children can fit in the same row, the minimal size of the sizer
+    // is determined by the sum of their minimal horizontal dimensions and
+    // the maximum of their minimal vertical dimensions.
+    const wxSize sizeChild2 = wxSize(sizeTotal.x/2 + 10, sizeTotal.y/3);
+    sizeMinExpected.x += sizeChild2.x;
+    sizeMinExpected.y = wxMax(sizeChild1.y, sizeChild2.y);
+
+    wxWindow * const
+        child2 = new wxWindow(m_win, wxID_ANY, wxDefaultPosition, sizeChild2);
+    child2->SetBackgroundColour(*wxYELLOW);
+    m_sizer->Add(child2);
+    m_win->Layout();
+
+    CPPUNIT_ASSERT_EQUAL( sizeMinExpected, m_sizer->CalcMin() );
+
+    // Three children will take at least two rows so the minimal size in
+    // vertical direction must increase.
+    const wxSize sizeChild3 = wxSize(sizeTotal.x/2, sizeTotal.y/5);
+    sizeMinExpected.y += sizeChild3.y;
+
+    wxWindow * const
+        child3 = new wxWindow(m_win, wxID_ANY, wxDefaultPosition, sizeChild3);
+    child3->SetBackgroundColour(*wxGREEN);
+    m_sizer->Add(child3);
+    m_win->Layout();
+
+    CPPUNIT_ASSERT_EQUAL( sizeMinExpected, m_sizer->CalcMin() );
+}
index 33d577ece25e0368d78794a035d4298a77d6efa6..bea939d1aef5416239d22915b3a1dd9cdd07a3b3 100644 (file)
              -->
             net/socket.cpp
             sizers/boxsizer.cpp
+            sizers/wrapsizer.cpp
             validators/valnum.cpp
             window/clientsize.cpp
             window/setsize.cpp
index 9d31a564d0a30cb12d66134b840f4da04198edc4..382ecd8890cb55a24c77c583f7784ec64eeadd1b 100644 (file)
@@ -529,6 +529,10 @@ SOURCE=.\controls\windowtest.cpp
 # End Source File\r
 # Begin Source File\r
 \r
+SOURCE=.\sizers\wrapsizer.cpp
+# End Source File
+# Begin Source File
+
 SOURCE=.\xml\xrctest.cpp\r
 # End Source File\r
 # End Group\r
index 9f23cd81e4109a160c3df17ade3f35383d5056b2..d2bd4c2d73bd471ec88cf6a0b0add36a03a92c19 100644 (file)
                                RelativePath=".\controls\windowtest.cpp">\r
                        </File>\r
                        <File\r
+                               RelativePath=".\sizers\wrapsizer.cpp">
+                       </File>
+                       <File
                                RelativePath=".\xml\xrctest.cpp">\r
                        </File>\r
                </Filter>\r
index d4d9c62f0f47cc8ee21a95649fcc37123ac4d8dd..8099a9a808f6f466eea291985b9c1820a9d8a978 100644 (file)
                                >\r
                        </File>\r
                        <File\r
+                               RelativePath=".\sizers\wrapsizer.cpp"
+                               >
+                       </File>
+                       <File
                                RelativePath=".\xml\xrctest.cpp"\r
                                >\r
                        </File>\r
index f349958217c4bb227706cf2fd6c97b8bf71b87cb..c11080f5936b37ef991a5b7bfcb8d7b92a44d692 100644 (file)
                                >\r
                        </File>\r
                        <File\r
+                               RelativePath=".\sizers\wrapsizer.cpp"
+                               >
+                       </File>
+                       <File
                                RelativePath=".\xml\xrctest.cpp"\r
                                >\r
                        </File>\r