1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: Layout/foldpanelbar sample
4 // Author: Jorgen Bodde
7 // Copyright: (c) Jorgen Bodde based upon FoldPanelBarTest (c) Julian Smart
8 // Licence: wxWindows license
9 /////////////////////////////////////////////////////////////////////////////
11 // For compilers that support precompilation, includes "wx/wx.h".
12 #include "wx/wxprec.h"
23 #include "wx/toolbar.h"
24 #include "wx/laywin.h"
25 #include "wx/spinctrl.h"
26 #include "wx/slider.h"
32 MyFrame
*frame
= NULL
;
37 // For drawing lines in a canvas
43 // Initialise this in OnInit, not statically
44 bool MyApp::OnInit(void)
46 // Create the main frame window
48 frame
= new MyFrame(NULL
, wxID_ANY
, _T("FoldPanelBar Extended Demo"), wxDefaultPosition
, wxSize(500, 600),
49 wxDEFAULT_FRAME_STYLE
|
50 wxNO_FULL_REPAINT_ON_RESIZE
|
51 wxHSCROLL
| wxVSCROLL
);
53 frame
->SetIcon(wxIcon(sample_xpm
));
55 // Associate the menu bar with the frame
56 frame
->SetMenuBar(CreateMenuBar(false));
58 frame
->CreateStatusBar();
67 BEGIN_EVENT_TABLE(MyFrame
, wxMDIParentFrame
)
68 EVT_MENU(FPBTEST_ABOUT
, MyFrame::OnAbout
)
69 EVT_MENU(FPBTEST_NEW_WINDOW
, MyFrame::OnNewWindow
)
70 EVT_SIZE(MyFrame::OnSize
)
71 EVT_MENU(FPBTEST_QUIT
, MyFrame::OnQuit
)
72 EVT_MENU(FPBTEST_TOGGLE_WINDOW
, MyFrame::OnToggleWindow
)
73 EVT_SASH_DRAGGED_RANGE(ID_WINDOW_TOP
, ID_WINDOW_BOTTOM
, MyFrame::OnFoldPanelBarDrag
)
74 EVT_MENU(FPB_BOTTOM_STICK
, MyFrame::OnCreateBottomStyle
)
75 EVT_MENU(FPB_SINGLE_FOLD
, MyFrame::OnCreateNormalStyle
)
76 EVT_BUTTON(ID_COLLAPSEME
, MyFrame::OnCollapseMe
)
77 EVT_BUTTON(ID_APPLYTOALL
, MyFrame::OnExpandMe
)
78 EVT_SCROLL(MyFrame::OnSlideColour
)
79 EVT_RADIOBUTTON(ID_USE_HGRADIENT
, MyFrame::OnStyleChange
)
80 EVT_RADIOBUTTON(ID_USE_VGRADIENT
, MyFrame::OnStyleChange
)
81 EVT_RADIOBUTTON(ID_USE_SINGLE
, MyFrame::OnStyleChange
)
82 EVT_RADIOBUTTON(ID_USE_RECTANGLE
, MyFrame::OnStyleChange
)
83 EVT_RADIOBUTTON(ID_USE_FILLED_RECTANGLE
, MyFrame::OnStyleChange
)
87 // Define my frame constructor
88 MyFrame::MyFrame(wxWindow
*parent
, const wxWindowID id
, const wxString
& title
, const wxPoint
& pos
, const wxSize
& size
,
90 : wxMDIParentFrame(parent
, id
, title
, pos
, size
, style
)
93 m_leftWindow1
= new wxSashLayoutWindow(this, ID_WINDOW_LEFT1
,
94 wxDefaultPosition
, wxSize(200, 30),
95 wxNO_BORDER
| wxSW_3D
| wxCLIP_CHILDREN
);
97 m_leftWindow1
->SetDefaultSize(wxSize(160, 1000));
98 m_leftWindow1
->SetOrientation(wxLAYOUT_VERTICAL
);
99 m_leftWindow1
->SetAlignment(wxLAYOUT_LEFT
);
100 m_leftWindow1
->SetSashVisible(wxSASH_RIGHT
, true);
101 m_leftWindow1
->SetExtraBorderSize(0);
104 ReCreateFoldPanel(0);
107 void MyFrame::OnQuit(wxCommandEvent
& WXUNUSED(event
))
112 void MyFrame::OnAbout(wxCommandEvent
& WXUNUSED(event
))
114 (void)wxMessageBox(_T("wxWidgets 2.0 FoldPanelBar Demo\nAuthor: Julian Smart (c) 1998"), _T("About FoldPanelBar Demo"));
117 void MyFrame::OnToggleWindow(wxCommandEvent
& WXUNUSED(event
))
119 m_leftWindow1
->Show(!m_leftWindow1
->IsShown());
120 #if wxUSE_MDI_ARCHITECTURE
121 wxLayoutAlgorithm layout
;
122 layout
.LayoutMDIFrame(this);
123 #endif // wxUSE_MDI_ARCHITECTURE
126 void MyFrame::OnFoldPanelBarDrag(wxSashEvent
& event
)
128 if (event
.GetDragStatus() == wxSASH_STATUS_OUT_OF_RANGE
)
131 if(event
.GetId() == ID_WINDOW_LEFT1
)
132 m_leftWindow1
->SetDefaultSize(wxSize(event
.GetDragRect().width
, 1000));
134 #if wxUSE_MDI_ARCHITECTURE
135 wxLayoutAlgorithm layout
;
136 layout
.LayoutMDIFrame(this);
137 #endif // wxUSE_MDI_ARCHITECTURE
139 // Leaves bits of itself behind sometimes
140 GetClientWindow()->Refresh();
143 void MyFrame::OnNewWindow(wxCommandEvent
& WXUNUSED(event
))
145 // Make another frame, containing a canvas
146 MyChild
*subframe
= new MyChild(frame
, _T("Canvas Frame"),
147 wxPoint(10, 10), wxSize(300, 300),
148 wxDEFAULT_FRAME_STYLE
|
149 wxNO_FULL_REPAINT_ON_RESIZE
);
151 subframe
->SetTitle(wxString::Format(_T("Canvas Frame %d"), winNumber
));
154 // Give it a status line
155 subframe
->CreateStatusBar();
157 // Associate the menu bar with the frame
158 subframe
->SetMenuBar(CreateMenuBar(true));
161 subframe
->GetClientSize(&width
, &height
);
162 MyCanvas
*canvas
= new MyCanvas(subframe
, wxPoint(0, 0), wxSize(width
, height
));
163 canvas
->SetCursor(wxCursor(wxCURSOR_PENCIL
));
164 subframe
->canvas
= canvas
;
166 // Give it scrollbars
167 canvas
->SetScrollbars(20, 20, 50, 50);
169 subframe
->Show(true);
172 void MyFrame::ReCreateFoldPanel(int fpb_flags
)
174 // delete earlier panel
175 m_leftWindow1
->DestroyChildren();
177 // recreate the foldpanelbar
179 m_pnl
= new wxFoldPanelBar(m_leftWindow1
, wxID_ANY
, wxDefaultPosition
, wxDefaultSize
, wxFPB_DEFAULT_STYLE
, fpb_flags
);
181 wxFoldPanel item
= m_pnl
->AddFoldPanel(_T("Caption colours"), false);
183 m_pnl
->AddFoldPanelWindow(item
, new wxStaticText(item
.GetParent(), wxID_ANY
, _T("Adjust the first colour")),
184 wxFPB_ALIGN_WIDTH
, 5, 20);
186 // RED color spin control
187 m_rslider1
= new wxSlider(item
.GetParent(), wxID_ANY
, 0, 0, 255);
188 m_pnl
->AddFoldPanelWindow(item
, m_rslider1
, wxFPB_ALIGN_WIDTH
,
191 // GREEN color spin control
192 m_gslider1
= new wxSlider(item
.GetParent(), wxID_ANY
, 0, 0, 255);
193 m_pnl
->AddFoldPanelWindow(item
, m_gslider1
, wxFPB_ALIGN_WIDTH
,
196 // BLUE color spin control
197 m_bslider1
= new wxSlider(item
.GetParent(), wxID_ANY
, 0, 0, 255);
198 m_pnl
->AddFoldPanelWindow(item
, m_bslider1
, wxFPB_ALIGN_WIDTH
,
201 m_pnl
->AddFoldPanelSeperator(item
);
203 m_pnl
->AddFoldPanelWindow(item
, new wxStaticText(item
.GetParent(), wxID_ANY
, _T("Adjust the second colour")),
204 wxFPB_ALIGN_WIDTH
, 5, 20);
206 // RED color spin control
207 m_rslider2
= new wxSlider(item
.GetParent(), wxID_ANY
, 0, 0, 255);
208 m_pnl
->AddFoldPanelWindow(item
, m_rslider2
, wxFPB_ALIGN_WIDTH
,
211 // GREEN color spin control
212 m_gslider2
= new wxSlider(item
.GetParent(), wxID_ANY
, 0, 0, 255);
213 m_pnl
->AddFoldPanelWindow(item
, m_gslider2
, wxFPB_ALIGN_WIDTH
,
216 // BLUE color spin control
217 m_bslider2
= new wxSlider(item
.GetParent(), wxID_ANY
, 0, 0, 255);
218 m_pnl
->AddFoldPanelWindow(item
, m_bslider2
, wxFPB_ALIGN_WIDTH
,
221 m_pnl
->AddFoldPanelSeperator(item
);
223 m_btn
= new wxButton(item
.GetParent(), ID_APPLYTOALL
, _T("Apply to all"));
224 m_pnl
->AddFoldPanelWindow(item
, m_btn
);
226 // read back current gradients and set the sliders
227 // for the colour which is now taken as default
229 wxCaptionBarStyle style
= m_pnl
->GetCaptionStyle(item
);
230 wxColour col
= style
.GetFirstColour();
231 m_rslider1
->SetValue(col
.Red());
232 m_gslider1
->SetValue(col
.Green());
233 m_bslider1
->SetValue(col
.Blue());
235 col
= style
.GetSecondColour();
236 m_rslider2
->SetValue(col
.Red());
237 m_gslider2
->SetValue(col
.Green());
238 m_bslider2
->SetValue(col
.Blue());
240 // put down some caption styles from which the user can
241 // select to show how the current or all caption bars will look like
243 item
= m_pnl
->AddFoldPanel(_T("Caption style"), false);
245 wxRadioButton
*currStyle
= new wxRadioButton(item
.GetParent(), ID_USE_VGRADIENT
, _T("&Vertical gradient"));
246 m_pnl
->AddFoldPanelWindow(item
, currStyle
, wxFPB_ALIGN_WIDTH
, wxFPB_DEFAULT_SPACING
, 10);
247 currStyle
->SetValue(true);
249 m_pnl
->AddFoldPanelWindow(item
, new wxRadioButton(item
.GetParent(), ID_USE_HGRADIENT
, _T("&Horizontal gradient")),
250 wxFPB_ALIGN_WIDTH
, wxFPB_DEFAULT_SPACING
, 10);
251 m_pnl
->AddFoldPanelWindow(item
, new wxRadioButton(item
.GetParent(), ID_USE_SINGLE
, _T("&Single colour")),
252 wxFPB_ALIGN_WIDTH
, wxFPB_DEFAULT_SPACING
, 10);
253 m_pnl
->AddFoldPanelWindow(item
, new wxRadioButton(item
.GetParent(), ID_USE_RECTANGLE
, _T("&Rectangle box")),
254 wxFPB_ALIGN_WIDTH
, wxFPB_DEFAULT_SPACING
, 10);
255 m_pnl
->AddFoldPanelWindow(item
, new wxRadioButton(item
.GetParent(), ID_USE_FILLED_RECTANGLE
, _T("&Filled rectangle box")),
256 wxFPB_ALIGN_WIDTH
, wxFPB_DEFAULT_SPACING
, 10);
258 m_pnl
->AddFoldPanelSeperator(item
);
260 m_single
= new wxCheckBox(item
.GetParent(), wxID_ANY
, _T("&Only this caption"));
261 m_pnl
->AddFoldPanelWindow(item
, m_single
, wxFPB_ALIGN_WIDTH
, wxFPB_DEFAULT_SPACING
, 10);
264 // one more panel to finish it
266 wxCaptionBarStyle cs
;
267 cs
.SetCaptionStyle(wxCAPTIONBAR_RECTANGLE
);
269 item
= m_pnl
->AddFoldPanel(_T("Misc stuff"), true, cs
);
271 m_pnl
->AddFoldPanelWindow(item
, new wxButton(item
.GetParent(), ID_COLLAPSEME
, _T("Collapse All")));
273 m_pnl
->AddFoldPanelWindow(item
, new wxStaticText(item
.GetParent(), wxID_ANY
, _T("Enter some comments")),
274 wxFPB_ALIGN_WIDTH
, 5, 20);
276 m_pnl
->AddFoldPanelWindow(item
, new wxTextCtrl(item
.GetParent(), wxID_ANY
, _T("Comments")),
277 wxFPB_ALIGN_WIDTH
, wxFPB_DEFAULT_SPACING
, 10);
279 m_leftWindow1
->SizeWindows();
283 void MyFrame::OnCreateBottomStyle(wxCommandEvent
& event
)
285 // recreate with style collapse to bottom, which means
286 // all panels that are collapsed are placed at the bottom,
289 if(event
.IsChecked())
290 m_flags
|= wxFPB_COLLAPSE_TO_BOTTOM
;
292 m_flags
&= ~wxFPB_COLLAPSE_TO_BOTTOM
;
294 ReCreateFoldPanel(m_flags
);
297 void MyFrame::OnCreateNormalStyle(wxCommandEvent
& event
)
299 // receate with style where only one panel at the time is
300 // allowed to be opened
302 // TODO: Not yet implemented!
304 if(event
.IsChecked())
305 m_flags
|= wxFPB_SINGLE_FOLD
;
307 m_flags
&= ~wxFPB_SINGLE_FOLD
;
309 ReCreateFoldPanel(m_flags
);
312 void MyFrame::OnCollapseMe(wxCommandEvent
&WXUNUSED(event
))
315 for(size_t i
= 0; i
< m_pnl
->GetCount(); i
++)
317 item
= m_pnl
->Item(i
);
318 m_pnl
->Collapse(item
);
322 void MyFrame::OnExpandMe(wxCommandEvent
&WXUNUSED(event
))
324 wxColour
col1((unsigned char)m_rslider1
->GetValue(),
325 (unsigned char)m_gslider1
->GetValue(),
326 (unsigned char)m_bslider1
->GetValue()),
327 col2((unsigned char)m_rslider2
->GetValue(),
328 (unsigned char)m_gslider2
->GetValue(),
329 (unsigned char)m_bslider2
->GetValue());
331 wxCaptionBarStyle style
;
333 style
.SetFirstColour(col1
);
334 style
.SetSecondColour(col2
);
336 m_pnl
->ApplyCaptionStyleAll(style
);
339 wxMenuBar
*CreateMenuBar(bool with_window
)
342 wxMenu
*file_menu
= new wxMenu
;
344 file_menu
->Append(FPBTEST_NEW_WINDOW
, _T("&New window"));
346 file_menu
->Append(FPBTEST_CHILD_QUIT
, _T("&Close child"));
348 file_menu
->AppendSeparator();
349 file_menu
->Append(FPBTEST_QUIT
, _T("&Exit"));
351 wxMenu
*option_menu
= 0;
355 option_menu
= new wxMenu
;
356 option_menu
->Append(FPBTEST_REFRESH
, _T("&Refresh picture"));
359 // make fold panel menu
361 wxMenu
*fpb_menu
= new wxMenu
;
362 fpb_menu
->AppendCheckItem(FPB_BOTTOM_STICK
, _T("Create with &wxFPB_COLLAPSE_TO_BOTTOM"));
363 //fpb_menu->AppendCheckItem(FPB_SINGLE_FOLD, _T("Create with &wxFPB_SINGLE_FOLD"));
365 fpb_menu
->AppendSeparator();
366 fpb_menu
->Append(FPBTEST_TOGGLE_WINDOW
, _T("&Toggle FoldPanelBar"));
368 wxMenu
*help_menu
= new wxMenu
;
369 help_menu
->Append(FPBTEST_ABOUT
, _T("&About"));
371 wxMenuBar
*menu_bar
= new wxMenuBar
;
373 menu_bar
->Append(file_menu
, _T("&File"));
374 menu_bar
->Append(fpb_menu
, _T("&FoldPanel"));
376 menu_bar
->Append(option_menu
, _T("&Options"));
377 menu_bar
->Append(help_menu
, _T("&Help"));
382 void MyFrame::OnSlideColour(wxScrollEvent
&WXUNUSED(event
))
384 wxColour
col1((unsigned char)m_rslider1
->GetValue(),
385 (unsigned char)m_gslider1
->GetValue(),
386 (unsigned char)m_bslider1
->GetValue()),
387 col2((unsigned char)m_rslider2
->GetValue(),
388 (unsigned char)m_gslider2
->GetValue(),
389 (unsigned char)m_bslider2
->GetValue());
390 //m_btn->SetBackgroundColour(col);
392 wxCaptionBarStyle style
;
394 style
.SetFirstColour(col1
);
395 style
.SetSecondColour(col2
);
397 wxFoldPanel item
= m_pnl
->Item(0);
398 m_pnl
->ApplyCaptionStyle(item
, style
);
401 void MyFrame::OnStyleChange(wxCommandEvent
&event
)
403 wxCaptionBarStyle style
;
404 switch(event
.GetId())
406 case ID_USE_HGRADIENT
:
407 style
.SetCaptionStyle(wxCAPTIONBAR_GRADIENT_H
);
410 case ID_USE_VGRADIENT
:
411 style
.SetCaptionStyle(wxCAPTIONBAR_GRADIENT_V
);
415 style
.SetCaptionStyle(wxCAPTIONBAR_SINGLE
);
418 case ID_USE_RECTANGLE
:
419 style
.SetCaptionStyle(wxCAPTIONBAR_RECTANGLE
);
422 case ID_USE_FILLED_RECTANGLE
:
423 style
.SetCaptionStyle(wxCAPTIONBAR_FILLED_RECTANGLE
);
430 if(m_single
->GetValue())
432 wxFoldPanel item
= m_pnl
->Item(1);
433 m_pnl
->ApplyCaptionStyle(item
, style
);
437 m_pnl
->ApplyCaptionStyleAll(style
);
441 /* ----------------------------------------------------------------------------------------------- */
443 BEGIN_EVENT_TABLE(MyCanvas
, wxScrolledWindow
)
444 EVT_MOUSE_EVENTS(MyCanvas::OnEvent
)
447 // Define a constructor for my canvas
448 MyCanvas::MyCanvas(wxWindow
*parent
, const wxPoint
& pos
, const wxSize
& size
)
449 :wxScrolledWindow(parent
, wxID_ANY
, pos
, size
,
450 wxSUNKEN_BORDER
| wxNO_FULL_REPAINT_ON_RESIZE
)
452 SetBackgroundColour(* wxWHITE
);
455 // Define the repainting behaviour
456 void MyCanvas::OnDraw(wxDC
& dc
)
458 dc
.SetFont(*wxSWISS_FONT
);
459 dc
.SetPen(*wxGREEN_PEN
);
460 dc
.DrawLine(0, 0, 200, 200);
461 dc
.DrawLine(200, 0, 0, 200);
463 dc
.SetBrush(*wxCYAN_BRUSH
);
464 dc
.SetPen(*wxRED_PEN
);
465 dc
.DrawRectangle(100, 100, 100, 50);
466 dc
.DrawRoundedRectangle(150, 150, 100, 50, 20);
468 dc
.DrawEllipse(250, 250, 100, 50);
470 dc
.DrawSpline(50, 200, 50, 100, 200, 10);
471 #endif // wxUSE_SPLINES
472 dc
.DrawLine(50, 230, 200, 230);
473 dc
.DrawText(_T("This is a test string"), 50, 230);
476 points
[0].x
= 200; points
[0].y
= 300;
477 points
[1].x
= 100; points
[1].y
= 400;
478 points
[2].x
= 300; points
[2].y
= 400;
480 dc
.DrawPolygon(3, points
);
483 // This implements a tiny doodling program! Drag the mouse using
485 void MyCanvas::OnEvent(wxMouseEvent
& event
)
490 wxPoint
pt(event
.GetLogicalPosition(dc
));
492 if (xpos
> -1 && ypos
> -1 && event
.Dragging())
494 dc
.SetPen(*wxBLACK_PEN
);
495 dc
.DrawLine(xpos
, ypos
, pt
.x
, pt
.y
);
501 void MyFrame::OnSize(wxSizeEvent
& WXUNUSED(event
))
503 #if wxUSE_MDI_ARCHITECTURE
504 wxLayoutAlgorithm layout
;
505 layout
.LayoutMDIFrame(this);
506 #endif // wxUSE_MDI_ARCHITECTURE
509 // Note that FPBTEST_NEW_WINDOW and FPBTEST_ABOUT commands get passed
510 // to the parent window for processing, so no need to
511 // duplicate event handlers here.
513 BEGIN_EVENT_TABLE(MyChild
, wxMDIChildFrame
)
514 EVT_MENU(FPBTEST_CHILD_QUIT
, MyChild::OnQuit
)
517 MyChild::MyChild(wxMDIParentFrame
*parent
, const wxString
& title
,
518 const wxPoint
& pos
, const wxSize
& size
,
520 :wxMDIChildFrame(parent
, wxID_ANY
, title
, pos
, size
, style
)
523 my_children
.Append(this);
526 MyChild::~MyChild(void)
528 my_children
.DeleteObject(this);
531 void MyChild::OnQuit(wxCommandEvent
& WXUNUSED(event
))
536 void MyChild::OnActivate(wxActivateEvent
& event
)
538 if (event
.GetActive() && canvas
)