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