1///////////////////////////////////////////////////////////////////////////// 2// Name: expended.cpp 3// Purpose: Layout/foldpanelbar sample 4// Author: Jorgen Bodde 5// Modified by: 6// Created: 24/07/2004 7// Copyright: (c) Jorgen Bodde based upon FoldPanelBarTest (c) Julian Smart 8// Licence: wxWindows license 9///////////////////////////////////////////////////////////////////////////// 10 11// For compilers that support precompilation, includes "wx/wx.h". 12#include "wx/wxprec.h" 13 14#ifdef __BORLANDC__ 15#pragma hdrstop 16#endif 17 18#ifndef WX_PRECOMP 19#include "wx/wx.h" 20#include "wx/mdi.h" 21#endif 22 23#include "wx/toolbar.h" 24#include "wx/laywin.h" 25#include "wx/spinctrl.h" 26#include "wx/slider.h" 27 28#include "sample.xpm" 29 30#include "extended.h" 31 32MyFrame *frame = NULL; 33wxList my_children; 34 35IMPLEMENT_APP(MyApp) 36 37// For drawing lines in a canvas 38long xpos = -1; 39long ypos = -1; 40 41int winNumber = 1; 42 43// Initialise this in OnInit, not statically 44bool MyApp::OnInit(void) 45{ 46 // Create the main frame window 47 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); 52 53 frame->SetIcon(wxIcon(sample_xpm)); 54 55 // Associate the menu bar with the frame 56 frame->SetMenuBar(CreateMenuBar(false)); 57 58 frame->CreateStatusBar(); 59 60 frame->Show(true); 61 62 SetTopWindow(frame); 63 64 return true; 65} 66 67BEGIN_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) 84END_EVENT_TABLE() 85 86 87// Define my frame constructor 88MyFrame::MyFrame(wxWindow *parent, const wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, 89 const long style) 90 : wxMDIParentFrame(parent, id, title, pos, size, style) 91 , m_flags(0) 92{ 93 m_leftWindow1 = new wxSashLayoutWindow(this, ID_WINDOW_LEFT1, 94 wxDefaultPosition, wxSize(200, 30), 95 wxNO_BORDER | wxSW_3D | wxCLIP_CHILDREN); 96 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); 102 103 m_pnl = NULL; 104 ReCreateFoldPanel(0); 105} 106 107void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event)) 108{ 109 Close(true); 110} 111 112void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event)) 113{ 114 (void)wxMessageBox(_T("wxWidgets 2.0 FoldPanelBar Demo\nAuthor: Julian Smart (c) 1998"), _T("About FoldPanelBar Demo")); 115} 116 117void MyFrame::OnToggleWindow(wxCommandEvent& WXUNUSED(event)) 118{ 119 m_leftWindow1->Show(!m_leftWindow1->IsShown()); 120#if wxUSE_MDI_ARCHITECTURE 121 wxLayoutAlgorithm layout; 122 layout.LayoutMDIFrame(this); 123#endif // wxUSE_MDI_ARCHITECTURE 124} 125 126void MyFrame::OnFoldPanelBarDrag(wxSashEvent& event) 127{ 128 if (event.GetDragStatus() == wxSASH_STATUS_OUT_OF_RANGE) 129 return; 130 131 if(event.GetId() == ID_WINDOW_LEFT1) 132 m_leftWindow1->SetDefaultSize(wxSize(event.GetDragRect().width, 1000)); 133 134#if wxUSE_MDI_ARCHITECTURE 135 wxLayoutAlgorithm layout; 136 layout.LayoutMDIFrame(this); 137#endif // wxUSE_MDI_ARCHITECTURE 138 139 // Leaves bits of itself behind sometimes 140 GetClientWindow()->Refresh(); 141} 142 143void MyFrame::OnNewWindow(wxCommandEvent& WXUNUSED(event)) 144{ 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); 150 151 subframe->SetTitle(wxString::Format(_T("Canvas Frame %d"), winNumber)); 152 winNumber ++; 153 154 // Give it a status line 155 subframe->CreateStatusBar(); 156 157 // Associate the menu bar with the frame 158 subframe->SetMenuBar(CreateMenuBar(true)); 159 160 int width, height; 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; 165 166 // Give it scrollbars 167 canvas->SetScrollbars(20, 20, 50, 50); 168 169 subframe->Show(true); 170} 171 172void MyFrame::ReCreateFoldPanel(int fpb_flags) 173{ 174 // delete earlier panel 175 m_leftWindow1->DestroyChildren(); 176 177 // recreate the foldpanelbar 178 179 m_pnl = new wxFoldPanelBar(m_leftWindow1, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxFPB_DEFAULT_STYLE, fpb_flags); 180 181 wxFoldPanel item = m_pnl->AddFoldPanel(_T("Caption colours"), false); 182 183 m_pnl->AddFoldPanelWindow(item, new wxStaticText(item.GetParent(), wxID_ANY, _T("Adjust the first colour")), 184 wxFPB_ALIGN_WIDTH, 5, 20); 185 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, 189 2, 20); 190 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, 194 0, 20); 195 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, 199 0, 20); 200 201 m_pnl->AddFoldPanelSeperator(item); 202 203 m_pnl->AddFoldPanelWindow(item, new wxStaticText(item.GetParent(), wxID_ANY, _T("Adjust the second colour")), 204 wxFPB_ALIGN_WIDTH, 5, 20); 205 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, 209 2, 20); 210 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, 214 0, 20); 215 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, 219 0, 20); 220 221 m_pnl->AddFoldPanelSeperator(item); 222 223 m_btn = new wxButton(item.GetParent(), ID_APPLYTOALL, _T("Apply to all")); 224 m_pnl->AddFoldPanelWindow(item, m_btn); 225 226 // read back current gradients and set the sliders 227 // for the colour which is now taken as default 228 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()); 234 235 col = style.GetSecondColour(); 236 m_rslider2->SetValue(col.Red()); 237 m_gslider2->SetValue(col.Green()); 238 m_bslider2->SetValue(col.Blue()); 239 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 242 243 item = m_pnl->AddFoldPanel(_T("Caption style"), false); 244 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); 248 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); 257 258 m_pnl->AddFoldPanelSeperator(item); 259 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); 262 263 264 // one more panel to finish it 265 266 wxCaptionBarStyle cs; 267 cs.SetCaptionStyle(wxCAPTIONBAR_RECTANGLE); 268 269 item = m_pnl->AddFoldPanel(_T("Misc stuff"), true, cs); 270 271 m_pnl->AddFoldPanelWindow(item, new wxButton(item.GetParent(), ID_COLLAPSEME, _T("Collapse All"))); 272 273 m_pnl->AddFoldPanelWindow(item, new wxStaticText(item.GetParent(), wxID_ANY, _T("Enter some comments")), 274 wxFPB_ALIGN_WIDTH, 5, 20); 275 276 m_pnl->AddFoldPanelWindow(item, new wxTextCtrl(item.GetParent(), wxID_ANY, _T("Comments")), 277 wxFPB_ALIGN_WIDTH, wxFPB_DEFAULT_SPACING, 10); 278 279 m_leftWindow1->SizeWindows(); 280 281} 282 283void MyFrame::OnCreateBottomStyle(wxCommandEvent& event) 284{ 285 // recreate with style collapse to bottom, which means 286 // all panels that are collapsed are placed at the bottom, 287 // or normal 288 289 if(event.IsChecked()) 290 m_flags |= wxFPB_COLLAPSE_TO_BOTTOM; 291 else 292 m_flags &= ~wxFPB_COLLAPSE_TO_BOTTOM; 293 294 ReCreateFoldPanel(m_flags); 295} 296 297void MyFrame::OnCreateNormalStyle(wxCommandEvent& event) 298{ 299 // receate with style where only one panel at the time is 300 // allowed to be opened 301 302 // TODO: Not yet implemented! 303 304 if(event.IsChecked()) 305 m_flags |= wxFPB_SINGLE_FOLD; 306 else 307 m_flags &= ~wxFPB_SINGLE_FOLD; 308 309 ReCreateFoldPanel(m_flags); 310} 311 312void MyFrame::OnCollapseMe(wxCommandEvent &WXUNUSED(event)) 313{ 314 wxFoldPanel item(0); 315 for(size_t i = 0; i < m_pnl->GetCount(); i++) 316 { 317 item = m_pnl->Item(i); 318 m_pnl->Collapse(item); 319 } 320} 321 322void MyFrame::OnExpandMe(wxCommandEvent &WXUNUSED(event)) 323{ 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()); 330 331 wxCaptionBarStyle style; 332 333 style.SetFirstColour(col1); 334 style.SetSecondColour(col2); 335 336 m_pnl->ApplyCaptionStyleAll(style); 337} 338 339wxMenuBar *CreateMenuBar(bool with_window) 340{ 341 // Make a menubar 342 wxMenu *file_menu = new wxMenu; 343 344 file_menu->Append(FPBTEST_NEW_WINDOW, _T("&New window")); 345 if(with_window) 346 file_menu->Append(FPBTEST_CHILD_QUIT, _T("&Close child")); 347 348 file_menu->AppendSeparator(); 349 file_menu->Append(FPBTEST_QUIT, _T("&Exit")); 350 351 wxMenu *option_menu = 0; 352 if(with_window) 353 { 354 // Dummy option 355 option_menu = new wxMenu; 356 option_menu->Append(FPBTEST_REFRESH, _T("&Refresh picture")); 357 } 358 359 // make fold panel menu 360 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")); 364 365 fpb_menu->AppendSeparator(); 366 fpb_menu->Append(FPBTEST_TOGGLE_WINDOW, _T("&Toggle FoldPanelBar")); 367 368 wxMenu *help_menu = new wxMenu; 369 help_menu->Append(FPBTEST_ABOUT, _T("&About")); 370 371 wxMenuBar *menu_bar = new wxMenuBar; 372 373 menu_bar->Append(file_menu, _T("&File")); 374 menu_bar->Append(fpb_menu, _T("&FoldPanel")); 375 if(option_menu) 376 menu_bar->Append(option_menu, _T("&Options")); 377 menu_bar->Append(help_menu, _T("&Help")); 378 379 return menu_bar; 380} 381 382void MyFrame::OnSlideColour(wxScrollEvent &WXUNUSED(event)) 383{ 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); 391 392 wxCaptionBarStyle style; 393 394 style.SetFirstColour(col1); 395 style.SetSecondColour(col2); 396 397 wxFoldPanel item = m_pnl->Item(0); 398 m_pnl->ApplyCaptionStyle(item, style); 399} 400 401void MyFrame::OnStyleChange(wxCommandEvent &event) 402{ 403 wxCaptionBarStyle style; 404 switch(event.GetId()) 405 { 406 case ID_USE_HGRADIENT: 407 style.SetCaptionStyle(wxCAPTIONBAR_GRADIENT_H); 408 break; 409 410 case ID_USE_VGRADIENT: 411 style.SetCaptionStyle(wxCAPTIONBAR_GRADIENT_V); 412 break; 413 414 case ID_USE_SINGLE: 415 style.SetCaptionStyle(wxCAPTIONBAR_SINGLE); 416 break; 417 418 case ID_USE_RECTANGLE: 419 style.SetCaptionStyle(wxCAPTIONBAR_RECTANGLE); 420 break; 421 422 case ID_USE_FILLED_RECTANGLE: 423 style.SetCaptionStyle(wxCAPTIONBAR_FILLED_RECTANGLE); 424 break; 425 426 default: 427 break; 428 } 429 430 if(m_single->GetValue()) 431 { 432 wxFoldPanel item = m_pnl->Item(1); 433 m_pnl->ApplyCaptionStyle(item, style); 434 } 435 else 436 { 437 m_pnl->ApplyCaptionStyleAll(style); 438 } 439} 440 441/* ----------------------------------------------------------------------------------------------- */ 442 443BEGIN_EVENT_TABLE(MyCanvas, wxScrolledWindow) 444 EVT_MOUSE_EVENTS(MyCanvas::OnEvent) 445END_EVENT_TABLE() 446 447// Define a constructor for my canvas 448MyCanvas::MyCanvas(wxWindow *parent, const wxPoint& pos, const wxSize& size) 449 :wxScrolledWindow(parent, wxID_ANY, pos, size, 450 wxSUNKEN_BORDER | wxNO_FULL_REPAINT_ON_RESIZE) 451{ 452 SetBackgroundColour(* wxWHITE); 453} 454 455// Define the repainting behaviour 456void MyCanvas::OnDraw(wxDC& dc) 457{ 458 dc.SetFont(*wxSWISS_FONT); 459 dc.SetPen(*wxGREEN_PEN); 460 dc.DrawLine(0, 0, 200, 200); 461 dc.DrawLine(200, 0, 0, 200); 462 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); 467 468 dc.DrawEllipse(250, 250, 100, 50); 469#if wxUSE_SPLINES 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); 474 475 wxPoint points[3]; 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; 479 480 dc.DrawPolygon(3, points); 481} 482 483// This implements a tiny doodling program! Drag the mouse using 484// the left button. 485void MyCanvas::OnEvent(wxMouseEvent& event) 486{ 487 wxClientDC dc(this); 488 PrepareDC(dc); 489 490 wxPoint pt(event.GetLogicalPosition(dc)); 491 492 if (xpos > -1 && ypos > -1 && event.Dragging()) 493 { 494 dc.SetPen(*wxBLACK_PEN); 495 dc.DrawLine(xpos, ypos, pt.x, pt.y); 496 } 497 xpos = pt.x; 498 ypos = pt.y; 499} 500 501void MyFrame::OnSize(wxSizeEvent& WXUNUSED(event)) 502{ 503#if wxUSE_MDI_ARCHITECTURE 504 wxLayoutAlgorithm layout; 505 layout.LayoutMDIFrame(this); 506#endif // wxUSE_MDI_ARCHITECTURE 507} 508 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. 512 513BEGIN_EVENT_TABLE(MyChild, wxMDIChildFrame) 514 EVT_MENU(FPBTEST_CHILD_QUIT, MyChild::OnQuit) 515END_EVENT_TABLE() 516 517MyChild::MyChild(wxMDIParentFrame *parent, const wxString& title, 518 const wxPoint& pos, const wxSize& size, 519 const long style) 520 :wxMDIChildFrame(parent, wxID_ANY, title, pos, size, style) 521{ 522 canvas = NULL; 523 my_children.Append(this); 524} 525 526MyChild::~MyChild(void) 527{ 528 my_children.DeleteObject(this); 529} 530 531void MyChild::OnQuit(wxCommandEvent& WXUNUSED(event)) 532{ 533 Close(true); 534} 535 536void MyChild::OnActivate(wxActivateEvent& event) 537{ 538 if (event.GetActive() && canvas) 539 canvas->SetFocus(); 540} 541