1/////////////////////////////////////////////////////////////////////////////
2// Name:        collpane.cpp
3// Purpose:     wxCollapsiblePane sample
4// Author:      Francesco Montorsi
5// Modified by:
6// Created:     14/10/06
7// RCS-ID:      $Id: collpane.cpp 42759 2006-10-30 20:08:17Z VZ $
8// Copyright:   (c) Francesco Montorsi
9// Licence:     wxWindows license
10/////////////////////////////////////////////////////////////////////////////
11
12// ============================================================================
13// declarations
14// ============================================================================
15
16// ----------------------------------------------------------------------------
17// headers
18// ----------------------------------------------------------------------------
19
20// For compilers that support precompilation, includes "wx/wx.h".
21#include "wx/wxprec.h"
22
23#ifdef __BORLANDC__
24    #pragma hdrstop
25#endif
26
27#ifndef WX_PRECOMP
28    #include "wx/log.h"
29
30    #include "wx/app.h"
31    #include "wx/frame.h"
32
33    #include "wx/scrolwin.h"
34    #include "wx/menu.h"
35
36    #include "wx/textdlg.h"       // for wxGetTextFromUser
37#endif
38
39#include "wx/collpane.h"
40#include "wx/sizer.h"
41#include "wx/stattext.h"
42#include "wx/clrpicker.h"
43#include "wx/filepicker.h"
44#include "wx/fontpicker.h"
45#include "wx/aboutdlg.h"
46
47// ----------------------------------------------------------------------------
48// constants
49// ----------------------------------------------------------------------------
50
51// ID for the menu commands
52enum
53{
54    PANE_COLLAPSE,
55    PANE_EXPAND,
56    PANE_SETLABEL,
57    PANE_SHOWDLG,
58    PANE_ABOUT = wxID_ABOUT,
59    PANE_QUIT = wxID_EXIT
60};
61
62
63// ----------------------------------------------------------------------------
64// our classes
65// ----------------------------------------------------------------------------
66
67class MyApp: public wxApp
68{
69public:
70    MyApp() { }
71
72    virtual bool OnInit();
73
74    DECLARE_NO_COPY_CLASS(MyApp)
75};
76
77class MyFrame: public wxFrame
78{
79public:
80    MyFrame();
81    virtual ~MyFrame();
82
83    // Menu commands
84    void OnCollapse(wxCommandEvent& event);
85    void OnExpand(wxCommandEvent& event);
86    void OnSetLabel(wxCommandEvent& event);
87    void OnShowDialog(wxCommandEvent& event);
88    void Quit(wxCommandEvent& event);
89    void OnAbout(wxCommandEvent& event);
90
91    // Menu command update functions
92    void UpdateUI(wxUpdateUIEvent& event);
93
94private:
95    wxCollapsiblePane *m_collPane;
96
97    DECLARE_EVENT_TABLE()
98    DECLARE_NO_COPY_CLASS(MyFrame)
99};
100
101class MyDialog : public wxDialog
102{
103public:
104    MyDialog(wxFrame *parent);
105    void OnToggleStatus(wxCommandEvent& WXUNUSED(ev));
106    void OnPaneChanged(wxCollapsiblePaneEvent& event);
107
108private:
109    wxCollapsiblePane *m_collPane;
110
111    DECLARE_EVENT_TABLE()
112    DECLARE_NO_COPY_CLASS(MyDialog)
113};
114
115
116
117// ============================================================================
118// implementation
119// ============================================================================
120
121// ----------------------------------------------------------------------------
122// MyApp
123// ----------------------------------------------------------------------------
124
125IMPLEMENT_APP(MyApp)
126
127bool MyApp::OnInit()
128{
129    // create and show the main frame
130    MyFrame* frame = new MyFrame;
131
132    frame->Show(true);
133
134    return true;
135}
136
137// ----------------------------------------------------------------------------
138// MyFrame
139// ----------------------------------------------------------------------------
140
141BEGIN_EVENT_TABLE(MyFrame, wxFrame)
142    EVT_MENU(PANE_COLLAPSE, MyFrame::OnCollapse)
143    EVT_MENU(PANE_EXPAND, MyFrame::OnExpand)
144    EVT_MENU(PANE_SETLABEL, MyFrame::OnSetLabel)
145    EVT_MENU(PANE_SHOWDLG, MyFrame::OnShowDialog)
146    EVT_MENU(PANE_ABOUT, MyFrame::OnAbout)
147    EVT_MENU(PANE_QUIT, MyFrame::Quit)
148
149    EVT_UPDATE_UI(wxID_ANY, MyFrame::UpdateUI)
150END_EVENT_TABLE()
151
152// My frame constructor
153MyFrame::MyFrame()
154       : wxFrame(NULL, wxID_ANY, _T("wxCollapsiblePane sample"),
155                 wxDefaultPosition, wxSize(420, 300),
156                 wxDEFAULT_FRAME_STYLE | wxNO_FULL_REPAINT_ON_RESIZE)
157{
158#if wxUSE_STATUSBAR
159    CreateStatusBar(2);
160#endif // wxUSE_STATUSBAR
161
162    // Make a menubar
163    wxMenu *paneMenu = new wxMenu;
164    paneMenu->Append(PANE_COLLAPSE, _T("Collapse\tCtrl-C"));
165    paneMenu->Append(PANE_EXPAND, _T("Expand\tCtrl-E"));
166    paneMenu->AppendSeparator();
167    paneMenu->Append(PANE_SETLABEL, _T("Set label...\tCtrl-S"));
168    paneMenu->AppendSeparator();
169    paneMenu->Append(PANE_SHOWDLG, _T("Show dialog...\tCtrl-S"));
170    paneMenu->AppendSeparator();
171    paneMenu->Append(PANE_QUIT);
172
173    wxMenu *helpMenu = new wxMenu;
174    helpMenu->Append(PANE_ABOUT);
175
176    wxMenuBar *menuBar = new wxMenuBar;
177    menuBar->Append(paneMenu, _T("&Pane"));
178    menuBar->Append(helpMenu, _T("&Help"));
179    SetMenuBar(menuBar);
180
181    m_collPane = new wxCollapsiblePane(this, -1, wxT("test!"));
182    wxWindow *win = m_collPane->GetPane();
183
184    new wxStaticText(win, -1, wxT("Static control with absolute coords"), wxPoint(10,2));
185    new wxStaticText(win, -1, wxT("Yet another one!"), wxPoint(30, 30));
186    new wxTextCtrl(win, -1, wxT("You can place anything you like inside a wxCollapsiblePane"),
187                   wxPoint(5, 60), wxSize(300, -1));
188}
189
190MyFrame::~MyFrame()
191{
192}
193
194// menu command handlers
195
196void MyFrame::Quit(wxCommandEvent& WXUNUSED(event) )
197{
198    Close(true);
199}
200
201void MyFrame::OnCollapse(wxCommandEvent& WXUNUSED(event) )
202{
203    m_collPane->Collapse();
204}
205
206void MyFrame::OnExpand(wxCommandEvent& WXUNUSED(event) )
207{
208    m_collPane->Expand();
209}
210
211void MyFrame::OnSetLabel(wxCommandEvent& WXUNUSED(event) )
212{
213    wxString text = wxGetTextFromUser(wxT("Input the new label"));
214    m_collPane->SetLabel(text);
215}
216
217void MyFrame::OnShowDialog(wxCommandEvent& WXUNUSED(event) )
218{
219    MyDialog dlg(this);
220    dlg.ShowModal();
221}
222
223void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event) )
224{
225    wxAboutDialogInfo info;
226    info.SetName(_("wxCollapsiblePane sample"));
227    info.SetDescription(_("This sample program demonstrates usage of wxCollapsiblePane"));
228    info.SetCopyright(_T("(C) 2006 Francesco Montorsi <frm@users.sourceforge.net>"));
229
230    wxAboutBox(info);
231}
232
233void MyFrame::UpdateUI(wxUpdateUIEvent& event)
234{
235    GetMenuBar()->Enable(PANE_COLLAPSE, !m_collPane->IsCollapsed());
236    GetMenuBar()->Enable(PANE_EXPAND, m_collPane->IsCollapsed());
237}
238
239
240// ----------------------------------------------------------------------------
241// MyDialog
242// ----------------------------------------------------------------------------
243
244enum
245{
246    PANEDLG_TOGGLESTATUS_BTN = wxID_HIGHEST
247};
248
249BEGIN_EVENT_TABLE(MyDialog, wxDialog)
250    EVT_BUTTON(PANEDLG_TOGGLESTATUS_BTN, MyDialog::OnToggleStatus)
251    EVT_COLLAPSIBLEPANE_CHANGED(wxID_ANY, MyDialog::OnPaneChanged)
252END_EVENT_TABLE()
253
254MyDialog::MyDialog(wxFrame *parent)
255                : wxDialog(parent, wxID_ANY, wxT("Test dialog"),
256                            wxDefaultPosition, wxDefaultSize,
257                            wxRESIZE_BORDER|wxDEFAULT_DIALOG_STYLE )
258{
259    wxSizer *sz = new wxBoxSizer(wxVERTICAL);
260    sz->Add(new wxStaticText(this, -1,
261        wxT("This dialog allows you to test the wxCollapsiblePane control")),
262        0, wxALL, 5);
263    sz->Add(new wxButton(this, PANEDLG_TOGGLESTATUS_BTN, wxT("Change status")),
264        1, wxGROW|wxALL, 5);
265
266    m_collPane = new wxCollapsiblePane(this, -1, wxT("Click here for a surprise"));
267    sz->Add(m_collPane, 0, wxGROW|wxALL, 5);
268    sz->Add(new wxTextCtrl(this, -1, wxT("just a test")), 0, wxGROW|wxALL, 5);
269    sz->AddSpacer(10);
270    sz->Add(new wxButton(this, wxID_OK), 0, wxALIGN_RIGHT|wxALL, 5);
271
272    // now add test controls in the collapsible pane
273    wxWindow *win = m_collPane->GetPane();
274    wxSizer *paneSz = new wxGridSizer(2, 2, 5, 5);
275    paneSz->Add(new wxColourPickerCtrl(win, -1), 1, wxGROW|wxALL, 2);
276    paneSz->Add(new wxFontPickerCtrl(win, -1), 1, wxGROW|wxALL, 2);
277    paneSz->Add(new wxFilePickerCtrl(win, -1), 1, wxALL|wxALIGN_CENTER, 2);
278    paneSz->Add(new wxDirPickerCtrl(win, -1), 1, wxALL|wxALIGN_CENTER, 2);
279    win->SetSizer(paneSz);
280    paneSz->SetSizeHints(win);
281
282    SetSizer(sz);
283    sz->SetSizeHints(this);
284}
285
286void MyDialog::OnToggleStatus(wxCommandEvent& WXUNUSED(ev))
287{
288    m_collPane->Collapse(!m_collPane->IsCollapsed());
289}
290
291void MyDialog::OnPaneChanged(wxCollapsiblePaneEvent &event)
292{
293    wxLogDebug(wxT("The pane has just been %s by the user"),
294               event.GetCollapsed() ? wxT("collapsed") : wxT("expanded"));
295}
296
297