X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/925e9792d32e353233985f53a4845f154e455a58..0d8c57c00668287faa84cb9ddb4a631ae7100954:/samples/layout/layout.cpp diff --git a/samples/layout/layout.cpp b/samples/layout/layout.cpp index ed27778a83..1b00cbbeeb 100644 --- a/samples/layout/layout.cpp +++ b/samples/layout/layout.cpp @@ -2,10 +2,11 @@ // Name: layout.cpp // Purpose: Layout sample // Author: Julian Smart -// Modified by: +// Modified by: Robin Dunn, Vadim Zeitlin // Created: 04/01/98 // RCS-ID: $Id$ -// Copyright: (c) Julian Smart +// Copyright: (c) 1998 Julian Smart +// 2005 Vadim Zeitlin // Licence: wxWindows license ///////////////////////////////////////////////////////////////////////////// @@ -28,6 +29,7 @@ #include "wx/gbsizer.h" #include "wx/statline.h" #include "wx/notebook.h" +#include "wx/spinctrl.h" #include "layout.h" @@ -55,6 +57,7 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame) EVT_MENU(LAYOUT_ABOUT, MyFrame::OnAbout) EVT_MENU(LAYOUT_QUIT, MyFrame::OnQuit) + EVT_MENU(LAYOUT_TEST_PROPORTIONS, MyFrame::TestProportions) EVT_MENU(LAYOUT_TEST_SIZER, MyFrame::TestFlexSizers) EVT_MENU(LAYOUT_TEST_NB_SIZER, MyFrame::TestNotebookSizers) EVT_MENU(LAYOUT_TEST_GB_SIZER, MyFrame::TestGridBagSizer) @@ -69,15 +72,16 @@ MyFrame::MyFrame() // Make a menubar wxMenu *file_menu = new wxMenu; - file_menu->Append(LAYOUT_TEST_SIZER, _T("Test wx&FlexSizer")); - file_menu->Append(LAYOUT_TEST_NB_SIZER, _T("&Test notebook sizers")); - file_menu->Append(LAYOUT_TEST_GB_SIZER, _T("Test &gridbag sizer")); + file_menu->Append(LAYOUT_TEST_PROPORTIONS, _T("&Proportions demo...\tF1")); + file_menu->Append(LAYOUT_TEST_SIZER, _T("Test wx&FlexSizer...\tF2")); + file_menu->Append(LAYOUT_TEST_NB_SIZER, _T("Test ¬ebook sizers...\tF3")); + file_menu->Append(LAYOUT_TEST_GB_SIZER, _T("Test &gridbag sizer...\tF4")); file_menu->AppendSeparator(); file_menu->Append(LAYOUT_QUIT, _T("E&xit"), _T("Quit program")); wxMenu *help_menu = new wxMenu; - help_menu->Append(LAYOUT_ABOUT, _T("&About"), _T("About layout demo")); + help_menu->Append(LAYOUT_ABOUT, _T("&About"), _T("About layout demo...")); wxMenuBar *menu_bar = new wxMenuBar; @@ -92,6 +96,8 @@ MyFrame::MyFrame() SetStatusText(_T("wxWidgets layout demo")); #endif // wxUSE_STATUSBAR + wxPanel* p = new wxPanel(this, -1); + // we want to get a dialog that is stretchable because it // has a text ctrl in the middle. at the bottom, we have // two buttons which. @@ -100,19 +106,19 @@ MyFrame::MyFrame() // 1) top: create wxStaticText with minimum size equal to its default size topsizer->Add( - new wxStaticText( this, wxID_ANY, _T("An explanation (wxALIGN_RIGHT).") ), + new wxStaticText( p, wxID_ANY, _T("An explanation (wxALIGN_RIGHT).") ), wxSizerFlags().Align(wxALIGN_RIGHT).Border(wxALL & ~wxBOTTOM, 5)); // 2) top: create wxTextCtrl with minimum size (100x60) topsizer->Add( - new wxTextCtrl( this, wxID_ANY, _T("My text (wxEXPAND)."), wxDefaultPosition, wxSize(100,60), wxTE_MULTILINE), + new wxTextCtrl( p, wxID_ANY, _T("My text (wxEXPAND)."), wxDefaultPosition, wxSize(100,60), wxTE_MULTILINE), wxSizerFlags(1).Expand().Border(wxALL, 5)); // 2.5) Gratuitous test of wxStaticBoxSizers wxBoxSizer *statsizer = new wxStaticBoxSizer( - new wxStaticBox(this, wxID_ANY, _T("A wxStaticBoxSizer")), wxVERTICAL ); + new wxStaticBox(p, wxID_ANY, _T("A wxStaticBoxSizer")), wxVERTICAL ); statsizer->Add( - new wxStaticText(this, wxID_ANY, _T("And some TEXT inside it")), + new wxStaticText(p, wxID_ANY, _T("And some TEXT inside it")), wxSizerFlags().Center().Border(wxALL, 30)); topsizer->Add( statsizer, @@ -120,17 +126,17 @@ MyFrame::MyFrame() // 2.7) And a test of wxGridSizer wxGridSizer *gridsizer = new wxGridSizer(2, 5, 5); - gridsizer->Add(new wxStaticText(this, wxID_ANY, _T("Label")), + gridsizer->Add(new wxStaticText(p, wxID_ANY, _T("Label")), wxSizerFlags().Align(wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL)); - gridsizer->Add(new wxTextCtrl(this, wxID_ANY, _T("Grid sizer demo")), + gridsizer->Add(new wxTextCtrl(p, wxID_ANY, _T("Grid sizer demo")), wxSizerFlags(1).Align(wxGROW | wxALIGN_CENTER_VERTICAL)); - gridsizer->Add(new wxStaticText(this, wxID_ANY, _T("Another label")), + gridsizer->Add(new wxStaticText(p, wxID_ANY, _T("Another label")), wxSizerFlags().Align(wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL)); - gridsizer->Add(new wxTextCtrl(this, wxID_ANY, _T("More text")), + gridsizer->Add(new wxTextCtrl(p, wxID_ANY, _T("More text")), wxSizerFlags(1).Align(wxGROW | wxALIGN_CENTER_VERTICAL)); - gridsizer->Add(new wxStaticText(this, wxID_ANY, _T("Final label")), + gridsizer->Add(new wxStaticText(p, wxID_ANY, _T("Final label")), wxSizerFlags().Align(wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL)); - gridsizer->Add(new wxTextCtrl(this, wxID_ANY, _T("And yet more text")), + gridsizer->Add(new wxTextCtrl(p, wxID_ANY, _T("And yet more text")), wxSizerFlags().Align(wxGROW | wxALIGN_CENTER_VERTICAL)); topsizer->Add( gridsizer, @@ -140,7 +146,7 @@ MyFrame::MyFrame() #if wxUSE_STATLINE // 3) middle: create wxStaticLine with minimum size (3x3) topsizer->Add( - new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxSize(3,3), wxHORIZONTAL), + new wxStaticLine( p, wxID_ANY, wxDefaultPosition, wxSize(3,3), wxHORIZONTAL), wxSizerFlags().Expand()); #endif // wxUSE_STATLINE @@ -148,26 +154,31 @@ MyFrame::MyFrame() // 4) bottom: create two centred wxButtons wxBoxSizer *button_box = new wxBoxSizer( wxHORIZONTAL ); button_box->Add( - new wxButton( this, wxID_ANY, _T("Two buttons in a box") ), + new wxButton( p, wxID_ANY, _T("Two buttons in a box") ), wxSizerFlags().Border(wxALL, 7)); button_box->Add( - new wxButton( this, wxID_ANY, _T("(wxCENTER)") ), + new wxButton( p, wxID_ANY, _T("(wxCENTER)") ), wxSizerFlags().Border(wxALL, 7)); topsizer->Add(button_box, wxSizerFlags().Center()); + p->SetSizer( topsizer ); + // don't allow frame to get smaller than what the sizers tell it and also set // the initial size as calculated by the sizers topsizer->SetSizeHints( this ); - - SetSizer( topsizer ); } -void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event) ) +void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event)) { Close(true); } +void MyFrame::TestProportions(wxCommandEvent& WXUNUSED(event)) +{ + (new MyProportionsFrame(this))->Show(); +} + void MyFrame::TestFlexSizers(wxCommandEvent& WXUNUSED(event) ) { MyFlexSizerFrame *newFrame = new MyFlexSizerFrame(_T("Flex Sizer Test Frame"), 50, 50); @@ -195,12 +206,68 @@ void MyFrame::TestGridBagSizer(wxCommandEvent& WXUNUSED(event) ) newFrame->Show(true); } +// ---------------------------------------------------------------------------- +// MyProportionsFrame +// ---------------------------------------------------------------------------- + +MyProportionsFrame::MyProportionsFrame(wxFrame *parent) + : wxFrame(parent, wxID_ANY, _T("Box Sizer Proportions Demo")) +{ + size_t n; + + // create the controls + wxPanel *panel = new wxPanel(this, wxID_ANY); + for ( n = 0; n < WXSIZEOF(m_spins); n++ ) + { + m_spins[n] = new wxSpinCtrl(panel); + m_spins[n]->SetValue(n); + } + + // lay them out + m_sizer = new wxStaticBoxSizer(wxHORIZONTAL, panel, + _T("Try changing elements proportions and resizing the window")); + for ( n = 0; n < WXSIZEOF(m_spins); n++ ) + m_sizer->Add(m_spins[n], wxSizerFlags().Border()); + + // put everything together + panel->SetSizer(m_sizer); + wxSizer *sizerTop = new wxBoxSizer(wxVERTICAL); + sizerTop->Add(panel, wxSizerFlags(1).Expand().Border()); + UpdateProportions(); + SetSizerAndFit(sizerTop); + + // and connect the events + Connect(wxEVT_COMMAND_TEXT_UPDATED, + wxCommandEventHandler(MyProportionsFrame::OnProportionUpdated)); + Connect(wxEVT_COMMAND_SPINCTRL_UPDATED, + wxSpinEventHandler(MyProportionsFrame::OnProportionChanged)); +} + +void MyProportionsFrame::UpdateProportions() +{ + for ( size_t n = 0; n < WXSIZEOF(m_spins); n++ ) + { + m_sizer->GetItem(n)->SetProportion(m_spins[n]->GetValue()); + } + + m_sizer->Layout(); +} + +void MyProportionsFrame::OnProportionUpdated(wxCommandEvent& WXUNUSED(event)) +{ + UpdateProportions(); +} + +void MyProportionsFrame::OnProportionChanged(wxSpinEvent& WXUNUSED(event)) +{ + UpdateProportions(); +} // ---------------------------------------------------------------------------- // MyFlexSizerFrame // ---------------------------------------------------------------------------- -void MyFlexSizerFrame::InitFlexSizer(wxFlexGridSizer *sizer) +void MyFlexSizerFrame::InitFlexSizer(wxFlexGridSizer *sizer, wxWindow* parent) { for ( int i = 0; i < 3; i++ ) { @@ -208,7 +275,7 @@ void MyFlexSizerFrame::InitFlexSizer(wxFlexGridSizer *sizer) { sizer->Add(new wxStaticText ( - this, + parent, wxID_ANY, wxString::Format(_T("(%d, %d)"), i + 1, j + 1), wxDefaultPosition, @@ -224,29 +291,30 @@ MyFlexSizerFrame::MyFlexSizerFrame(const wxChar *title, int x, int y ) : wxFrame(NULL, wxID_ANY, title, wxPoint(x, y) ) { wxFlexGridSizer *sizerFlex; + wxPanel* p = new wxPanel(this, -1); // consttuct the first column wxSizer *sizerCol1 = new wxBoxSizer(wxVERTICAL); - sizerCol1->Add(new wxStaticText(this, wxID_ANY, _T("Ungrowable:")), 0, wxCENTER | wxTOP, 20); + sizerCol1->Add(new wxStaticText(p, wxID_ANY, _T("Ungrowable:")), 0, wxCENTER | wxTOP, 20); sizerFlex = new wxFlexGridSizer(3, 3); - InitFlexSizer(sizerFlex); + InitFlexSizer(sizerFlex, p); sizerCol1->Add(sizerFlex, 1, wxALL | wxEXPAND, 10); - sizerCol1->Add(new wxStaticText(this, wxID_ANY, _T("Growable middle column:")), 0, wxCENTER | wxTOP, 20); + sizerCol1->Add(new wxStaticText(p, wxID_ANY, _T("Growable middle column:")), 0, wxCENTER | wxTOP, 20); sizerFlex = new wxFlexGridSizer(3, 3); - InitFlexSizer(sizerFlex); + InitFlexSizer(sizerFlex, p); sizerFlex->AddGrowableCol(1); sizerCol1->Add(sizerFlex, 1, wxALL | wxEXPAND, 10); - sizerCol1->Add(new wxStaticText(this, wxID_ANY, _T("Growable middle row:")), 0, wxCENTER | wxTOP, 20); + sizerCol1->Add(new wxStaticText(p, wxID_ANY, _T("Growable middle row:")), 0, wxCENTER | wxTOP, 20); sizerFlex = new wxFlexGridSizer(3, 3); - InitFlexSizer(sizerFlex); + InitFlexSizer(sizerFlex, p); sizerFlex->AddGrowableRow(1); sizerCol1->Add(sizerFlex, 1, wxALL | wxEXPAND, 10); - sizerCol1->Add(new wxStaticText(this, wxID_ANY, _T("All growable columns:")), 0, wxCENTER | wxTOP, 20); + sizerCol1->Add(new wxStaticText(p, wxID_ANY, _T("All growable columns:")), 0, wxCENTER | wxTOP, 20); sizerFlex = new wxFlexGridSizer(3, 3); - InitFlexSizer(sizerFlex); + InitFlexSizer(sizerFlex, p); sizerFlex->AddGrowableCol(0, 1); sizerFlex->AddGrowableCol(1, 2); sizerFlex->AddGrowableCol(2, 3); @@ -254,33 +322,33 @@ MyFlexSizerFrame::MyFlexSizerFrame(const wxChar *title, int x, int y ) // the second one wxSizer *sizerCol2 = new wxBoxSizer(wxVERTICAL); - sizerCol2->Add(new wxStaticText(this, wxID_ANY, _T("Growable middle row and column:")), 0, wxCENTER | wxTOP, 20); + sizerCol2->Add(new wxStaticText(p, wxID_ANY, _T("Growable middle row and column:")), 0, wxCENTER | wxTOP, 20); sizerFlex = new wxFlexGridSizer(3, 3); - InitFlexSizer(sizerFlex); + InitFlexSizer(sizerFlex, p); sizerFlex->AddGrowableCol(1); sizerFlex->AddGrowableRow(1); sizerCol2->Add(sizerFlex, 1, wxALL | wxEXPAND, 10); - sizerCol2->Add(new wxStaticText(this, wxID_ANY, _T("Same with horz flex direction")), 0, wxCENTER | wxTOP, 20); + sizerCol2->Add(new wxStaticText(p, wxID_ANY, _T("Same with horz flex direction")), 0, wxCENTER | wxTOP, 20); sizerFlex = new wxFlexGridSizer(3, 3); - InitFlexSizer(sizerFlex); + InitFlexSizer(sizerFlex, p); sizerFlex->AddGrowableCol(1); sizerFlex->AddGrowableRow(1); sizerFlex->SetFlexibleDirection(wxHORIZONTAL); sizerCol2->Add(sizerFlex, 1, wxALL | wxEXPAND, 10); - sizerCol2->Add(new wxStaticText(this, wxID_ANY, _T("Same with grow mode == \"none\"")), 0, wxCENTER | wxTOP, 20); + sizerCol2->Add(new wxStaticText(p, wxID_ANY, _T("Same with grow mode == \"none\"")), 0, wxCENTER | wxTOP, 20); sizerFlex = new wxFlexGridSizer(3, 3); - InitFlexSizer(sizerFlex); + InitFlexSizer(sizerFlex, p); sizerFlex->AddGrowableCol(1); sizerFlex->AddGrowableRow(1); sizerFlex->SetFlexibleDirection(wxHORIZONTAL); sizerFlex->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_NONE); sizerCol2->Add(sizerFlex, 1, wxALL | wxEXPAND, 10); - sizerCol2->Add(new wxStaticText(this, wxID_ANY, _T("Same with grow mode == \"all\"")), 0, wxCENTER | wxTOP, 20); + sizerCol2->Add(new wxStaticText(p, wxID_ANY, _T("Same with grow mode == \"all\"")), 0, wxCENTER | wxTOP, 20); sizerFlex = new wxFlexGridSizer(3, 3); - InitFlexSizer(sizerFlex); + InitFlexSizer(sizerFlex, p); sizerFlex->AddGrowableCol(1); sizerFlex->AddGrowableRow(1); sizerFlex->SetFlexibleDirection(wxHORIZONTAL); @@ -292,7 +360,7 @@ MyFlexSizerFrame::MyFlexSizerFrame(const wxChar *title, int x, int y ) sizerTop->Add(sizerCol1, 1, wxEXPAND); sizerTop->Add(sizerCol2, 1, wxEXPAND); - SetSizer(sizerTop); + p->SetSizer(sizerTop); sizerTop->SetSizeHints(this); } @@ -349,7 +417,7 @@ MySizerDialog::MySizerDialog(wxWindow *parent, const wxChar *title) #define POS(r, c) wxGBPosition(r,c) #define SPAN(r, c) wxGBSpan(r,c) -wxChar* gbsDescription =_T("\ +const wxChar gbsDescription[] =_T("\ The wxGridBagSizer is similar to the wxFlexGridSizer except the items are explicitly positioned\n\ in a virtual cell of the layout grid, and column or row spanning is allowed. For example, this\n\ static text is positioned at (0,0) and it spans 7 columns.");