1 /////////////////////////////////////////////////////////////////////////////
2 // Name:        sashtest.cpp
3 // Purpose:     Layout/sash sample
4 // Author:      Julian Smart
5 // Modified by:
6 // Created:     04/01/98
7 // RCS-ID:      $Id: sashtest.cpp 35281 2005-08-23 15:54:39Z ABX $
8 // Copyright:   (c) Julian Smart
9 // Licence:     wxWindows license
10 /////////////////////////////////////////////////////////////////////////////
11 
12 // For compilers that support precompilation, includes "wx/wx.h".
13 #include "wx/wxprec.h"
14 
15 #ifdef __BORLANDC__
16 #pragma hdrstop
17 #endif
18 
19 #ifndef WX_PRECOMP
20 #include "wx/wx.h"
21 #include "wx/mdi.h"
22 #endif
23 
24 #include "wx/toolbar.h"
25 #include "wx/laywin.h"
26 
27 #include "sashtest.h"
28 
29 MyFrame *frame = NULL;
30 wxList my_children;
31 
32 IMPLEMENT_APP(MyApp)
33 
34 // For drawing lines in a canvas
35 long xpos = -1;
36 long ypos = -1;
37 
38 int winNumber = 1;
39 
40 // Initialise this in OnInit, not statically
OnInit(void)41 bool MyApp::OnInit(void)
42 {
43   // Create the main frame window
44 
45   frame = new MyFrame(NULL, wxID_ANY, _T("Sash Demo"), wxPoint(0, 0), wxSize(500, 400),
46                       wxDEFAULT_FRAME_STYLE |
47                       wxNO_FULL_REPAINT_ON_RESIZE |
48                       wxHSCROLL | wxVSCROLL);
49 
50   // Give it an icon (this is ignored in MDI mode: uses resources)
51 #ifdef __WXMSW__
52   frame->SetIcon(wxIcon(_T("sashtest_icn")));
53 #endif
54 
55   // Make a menubar
56   wxMenu *file_menu = new wxMenu;
57 
58   file_menu->Append(SASHTEST_NEW_WINDOW, _T("&New window"));
59   file_menu->Append(SASHTEST_TOGGLE_WINDOW, _T("&Toggle window"));
60   file_menu->Append(SASHTEST_QUIT, _T("&Exit"));
61 
62   wxMenu *help_menu = new wxMenu;
63   help_menu->Append(SASHTEST_ABOUT, _T("&About"));
64 
65   wxMenuBar *menu_bar = new wxMenuBar;
66 
67   menu_bar->Append(file_menu, _T("&File"));
68   menu_bar->Append(help_menu, _T("&Help"));
69 
70   // Associate the menu bar with the frame
71   frame->SetMenuBar(menu_bar);
72 
73 #if wxUSE_STATUSBAR
74   frame->CreateStatusBar();
75 #endif // wxUSE_STATUSBAR
76 
77   frame->Show(true);
78 
79   SetTopWindow(frame);
80 
81   return true;
82 }
83 
BEGIN_EVENT_TABLE(MyFrame,wxMDIParentFrame)84 BEGIN_EVENT_TABLE(MyFrame, wxMDIParentFrame)
85     EVT_MENU(SASHTEST_ABOUT, MyFrame::OnAbout)
86     EVT_MENU(SASHTEST_NEW_WINDOW, MyFrame::OnNewWindow)
87     EVT_SIZE(MyFrame::OnSize)
88     EVT_MENU(SASHTEST_QUIT, MyFrame::OnQuit)
89     EVT_MENU(SASHTEST_TOGGLE_WINDOW, MyFrame::OnToggleWindow)
90     EVT_SASH_DRAGGED_RANGE(ID_WINDOW_TOP, ID_WINDOW_BOTTOM, MyFrame::OnSashDrag)
91 END_EVENT_TABLE()
92 
93 
94 // Define my frame constructor
95 MyFrame::MyFrame(wxWindow *parent, const wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size,
96     const long style):
97   wxMDIParentFrame(parent, id, title, pos, size, style)
98 {
99   // Create some dummy layout windows
100 
101   // A window like a toolbar
102   wxSashLayoutWindow* win =
103       new wxSashLayoutWindow(this, ID_WINDOW_TOP,
104                              wxDefaultPosition, wxSize(200, 30),
105                              wxNO_BORDER | wxSW_3D | wxCLIP_CHILDREN);
106 
107   win->SetDefaultSize(wxSize(1000, 30));
108   win->SetOrientation(wxLAYOUT_HORIZONTAL);
109   win->SetAlignment(wxLAYOUT_TOP);
110   win->SetBackgroundColour(wxColour(255, 0, 0));
111   win->SetSashVisible(wxSASH_BOTTOM, true);
112 
113   m_topWindow = win;
114 
115   // A window like a statusbar
116   win = new wxSashLayoutWindow(this, ID_WINDOW_BOTTOM,
117                                wxDefaultPosition, wxSize(200, 30),
118                                wxNO_BORDER | wxSW_3D | wxCLIP_CHILDREN);
119   win->SetDefaultSize(wxSize(1000, 30));
120   win->SetOrientation(wxLAYOUT_HORIZONTAL);
121   win->SetAlignment(wxLAYOUT_BOTTOM);
122   win->SetBackgroundColour(wxColour(0, 0, 255));
123   win->SetSashVisible(wxSASH_TOP, true);
124 
125   m_bottomWindow = win;
126 
127   // A window to the left of the client window
128   win = new wxSashLayoutWindow(this, ID_WINDOW_LEFT1,
129                                wxDefaultPosition, wxSize(200, 30),
130                                wxNO_BORDER | wxSW_3D | wxCLIP_CHILDREN);
131   win->SetDefaultSize(wxSize(120, 1000));
132   win->SetOrientation(wxLAYOUT_VERTICAL);
133   win->SetAlignment(wxLAYOUT_LEFT);
134   win->SetBackgroundColour(wxColour(0, 255, 0));
135   win->SetSashVisible(wxSASH_RIGHT, true);
136   win->SetExtraBorderSize(10);
137 
138   wxTextCtrl* textWindow = new wxTextCtrl(win, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize,
139         wxTE_MULTILINE|wxSUNKEN_BORDER);
140 //        wxTE_MULTILINE|wxNO_BORDER);
141   textWindow->SetValue(_T("A help window"));
142 
143   m_leftWindow1 = win;
144 
145   // Another window to the left of the client window
146   win = new wxSashLayoutWindow(this, ID_WINDOW_LEFT2,
147                                wxDefaultPosition, wxSize(200, 30),
148                                wxNO_BORDER | wxSW_3D | wxCLIP_CHILDREN);
149   win->SetDefaultSize(wxSize(120, 1000));
150   win->SetOrientation(wxLAYOUT_VERTICAL);
151   win->SetAlignment(wxLAYOUT_LEFT);
152   win->SetBackgroundColour(wxColour(0, 255, 255));
153   win->SetSashVisible(wxSASH_RIGHT, true);
154 
155   m_leftWindow2 = win;
156 }
157 
OnQuit(wxCommandEvent & WXUNUSED (event))158 void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
159 {
160       Close(true);
161 }
162 
OnAbout(wxCommandEvent & WXUNUSED (event))163 void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
164 {
165       (void)wxMessageBox(_T("wxWidgets 2.0 Sash Demo\nAuthor: Julian Smart (c) 1998"), _T("About Sash Demo"));
166 }
167 
OnToggleWindow(wxCommandEvent & WXUNUSED (event))168 void MyFrame::OnToggleWindow(wxCommandEvent& WXUNUSED(event))
169 {
170     if (m_leftWindow1->IsShown())
171     {
172         m_leftWindow1->Show(false);
173     }
174     else
175     {
176         m_leftWindow1->Show(true);
177     }
178 #if wxUSE_MDI_ARCHITECTURE
179     wxLayoutAlgorithm layout;
180     layout.LayoutMDIFrame(this);
181 #endif // wxUSE_MDI_ARCHITECTURE
182 }
183 
OnSashDrag(wxSashEvent & event)184 void MyFrame::OnSashDrag(wxSashEvent& event)
185 {
186     if (event.GetDragStatus() == wxSASH_STATUS_OUT_OF_RANGE)
187         return;
188 
189     switch (event.GetId())
190     {
191         case ID_WINDOW_TOP:
192         {
193             m_topWindow->SetDefaultSize(wxSize(1000, event.GetDragRect().height));
194             break;
195         }
196         case ID_WINDOW_LEFT1:
197         {
198             m_leftWindow1->SetDefaultSize(wxSize(event.GetDragRect().width, 1000));
199             break;
200         }
201         case ID_WINDOW_LEFT2:
202         {
203             m_leftWindow2->SetDefaultSize(wxSize(event.GetDragRect().width, 1000));
204             break;
205         }
206         case ID_WINDOW_BOTTOM:
207         {
208             m_bottomWindow->SetDefaultSize(wxSize(1000, event.GetDragRect().height));
209             break;
210         }
211     }
212 
213 #if wxUSE_MDI_ARCHITECTURE
214     wxLayoutAlgorithm layout;
215     layout.LayoutMDIFrame(this);
216 #endif // wxUSE_MDI_ARCHITECTURE
217 
218     // Leaves bits of itself behind sometimes
219     GetClientWindow()->Refresh();
220 }
221 
OnNewWindow(wxCommandEvent & WXUNUSED (event))222 void MyFrame::OnNewWindow(wxCommandEvent& WXUNUSED(event))
223 {
224       // Make another frame, containing a canvas
225       MyChild *subframe = new MyChild(frame, _T("Canvas Frame"),
226                                       wxPoint(10, 10), wxSize(300, 300),
227                                       wxDEFAULT_FRAME_STYLE |
228                                       wxNO_FULL_REPAINT_ON_RESIZE);
229 
230       subframe->SetTitle(wxString::Format(_T("Canvas Frame %d"), winNumber));
231       winNumber ++;
232 
233       // Give it an icon (this is ignored in MDI mode: uses resources)
234 #ifdef __WXMSW__
235       subframe->SetIcon(wxIcon(_T("sashtest_icn")));
236 #endif
237 
238 #if wxUSE_STATUSBAR
239       // Give it a status line
240       subframe->CreateStatusBar();
241 #endif // wxUSE_STATUSBAR
242 
243       // Make a menubar
244       wxMenu *file_menu = new wxMenu;
245 
246       file_menu->Append(SASHTEST_NEW_WINDOW, _T("&New window"));
247       file_menu->Append(SASHTEST_CHILD_QUIT, _T("&Close child"));
248       file_menu->Append(SASHTEST_QUIT, _T("&Exit"));
249 
250       wxMenu *option_menu = new wxMenu;
251 
252       // Dummy option
253       option_menu->Append(SASHTEST_REFRESH, _T("&Refresh picture"));
254 
255       wxMenu *help_menu = new wxMenu;
256       help_menu->Append(SASHTEST_ABOUT, _T("&About"));
257 
258       wxMenuBar *menu_bar = new wxMenuBar;
259 
260       menu_bar->Append(file_menu, _T("&File"));
261       menu_bar->Append(option_menu, _T("&Options"));
262       menu_bar->Append(help_menu, _T("&Help"));
263 
264       // Associate the menu bar with the frame
265       subframe->SetMenuBar(menu_bar);
266 
267       int width, height;
268       subframe->GetClientSize(&width, &height);
269       MyCanvas *canvas = new MyCanvas(subframe, wxPoint(0, 0), wxSize(width, height));
270       canvas->SetCursor(wxCursor(wxCURSOR_PENCIL));
271       subframe->canvas = canvas;
272 
273       // Give it scrollbars
274       canvas->SetScrollbars(20, 20, 50, 50);
275 
276       subframe->Show(true);
277 }
278 
BEGIN_EVENT_TABLE(MyCanvas,wxScrolledWindow)279 BEGIN_EVENT_TABLE(MyCanvas, wxScrolledWindow)
280     EVT_MOUSE_EVENTS(MyCanvas::OnEvent)
281 END_EVENT_TABLE()
282 
283 // Define a constructor for my canvas
284 MyCanvas::MyCanvas(wxWindow *parent, const wxPoint& pos, const wxSize& size)
285         : wxScrolledWindow(parent, wxID_ANY, pos, size,
286                            wxSUNKEN_BORDER | wxNO_FULL_REPAINT_ON_RESIZE)
287 {
288     SetBackgroundColour(* wxWHITE);
289 }
290 
291 // Define the repainting behaviour
OnDraw(wxDC & dc)292 void MyCanvas::OnDraw(wxDC& dc)
293 {
294     dc.SetFont(*wxSWISS_FONT);
295     dc.SetPen(*wxGREEN_PEN);
296     dc.DrawLine(0, 0, 200, 200);
297     dc.DrawLine(200, 0, 0, 200);
298 
299     dc.SetBrush(*wxCYAN_BRUSH);
300     dc.SetPen(*wxRED_PEN);
301     dc.DrawRectangle(100, 100, 100, 50);
302     dc.DrawRoundedRectangle(150, 150, 100, 50, 20);
303 
304     dc.DrawEllipse(250, 250, 100, 50);
305 #if wxUSE_SPLINES
306     dc.DrawSpline(50, 200, 50, 100, 200, 10);
307 #endif // wxUSE_SPLINES
308     dc.DrawLine(50, 230, 200, 230);
309     dc.DrawText(_T("This is a test string"), 50, 230);
310 
311     wxPoint points[3];
312     points[0].x = 200; points[0].y = 300;
313     points[1].x = 100; points[1].y = 400;
314     points[2].x = 300; points[2].y = 400;
315 
316     dc.DrawPolygon(3, points);
317 }
318 
319 // This implements a tiny doodling program! Drag the mouse using
320 // the left button.
OnEvent(wxMouseEvent & event)321 void MyCanvas::OnEvent(wxMouseEvent& event)
322 {
323   wxClientDC dc(this);
324   PrepareDC(dc);
325 
326   wxPoint pt(event.GetLogicalPosition(dc));
327 
328   if (xpos > -1 && ypos > -1 && event.Dragging())
329   {
330     dc.SetPen(*wxBLACK_PEN);
331     dc.DrawLine(xpos, ypos, pt.x, pt.y);
332   }
333   xpos = pt.x;
334   ypos = pt.y;
335 }
336 
OnSize(wxSizeEvent & WXUNUSED (event))337 void MyFrame::OnSize(wxSizeEvent& WXUNUSED(event))
338 {
339 #if wxUSE_MDI_ARCHITECTURE
340     wxLayoutAlgorithm layout;
341     layout.LayoutMDIFrame(this);
342 #endif // wxUSE_MDI_ARCHITECTURE
343 }
344 
345 // Note that SASHTEST_NEW_WINDOW and SASHTEST_ABOUT commands get passed
346 // to the parent window for processing, so no need to
347 // duplicate event handlers here.
348 
BEGIN_EVENT_TABLE(MyChild,wxMDIChildFrame)349 BEGIN_EVENT_TABLE(MyChild, wxMDIChildFrame)
350   EVT_MENU(SASHTEST_CHILD_QUIT, MyChild::OnQuit)
351 END_EVENT_TABLE()
352 
353 MyChild::MyChild(wxMDIParentFrame *parent, const wxString& title, const wxPoint& pos, const wxSize& size,
354 const long style):
355   wxMDIChildFrame(parent, wxID_ANY, title, pos, size, style)
356 {
357   canvas = NULL;
358   my_children.Append(this);
359 }
360 
~MyChild(void)361 MyChild::~MyChild(void)
362 {
363   my_children.DeleteObject(this);
364 }
365 
OnQuit(wxCommandEvent & WXUNUSED (event))366 void MyChild::OnQuit(wxCommandEvent& WXUNUSED(event))
367 {
368       Close(true);
369 }
370 
OnActivate(wxActivateEvent & event)371 void MyChild::OnActivate(wxActivateEvent& event)
372 {
373   if (event.GetActive() && canvas)
374     canvas->SetFocus();
375 }
376