• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /netgear-R7000-V1.0.7.12_1.2.5/ap/gpl/amule/wxWidgets-2.8.12/contrib/samples/foldbar/extended/
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