Changed scrollsub sample.
[wxWidgets.git] / samples / scrollsub / scrollsub.cpp
1 /*
2 * Program: scrollsub
3 *
4 * Author: Robert Roebling
5 *
6 * Copyright: (C) 1999, Robert Roebling
7 *
8 */
9
10 // For compilers that support precompilation, includes "wx/wx.h".
11 #include "wx/wxprec.h"
12
13 #ifdef __BORLANDC__
14 #pragma hdrstop
15 #endif
16
17 #ifndef WX_PRECOMP
18 #include "wx/wx.h"
19 #endif
20
21 #include "wx/image.h"
22 #include "wx/listctrl.h"
23 #include "wx/sizer.h"
24 #include "wx/log.h"
25
26
27 // derived classes
28
29 class MyFrame;
30 class MyScrolledWindow;
31 class MyCanvas;
32 class MyApp;
33
34 // MyScrolledWindow
35
36 class MyScrolledWindow: public wxScrolledWindow
37 {
38 public:
39 MyScrolledWindow() {}
40 MyScrolledWindow( wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size );
41 ~MyScrolledWindow();
42 void OnPaint( wxPaintEvent &event );
43
44 private:
45 MyCanvas *m_canvas;
46
47 DECLARE_DYNAMIC_CLASS(MyScrolledWindow)
48 DECLARE_EVENT_TABLE()
49 };
50
51 // MyCanvas
52
53 class MyCanvas: public wxPanel
54 {
55 public:
56 MyCanvas() {}
57 MyCanvas( wxScrolledWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size );
58 ~MyCanvas();
59 void OnPaint( wxPaintEvent &event );
60
61 private:
62 wxScrolledWindow *m_owner;
63
64 DECLARE_DYNAMIC_CLASS(MyCanvas)
65 DECLARE_EVENT_TABLE()
66 };
67
68 // MyFrame
69
70 class MyFrame: public wxFrame
71 {
72 public:
73 MyFrame();
74
75 void OnAbout( wxCommandEvent &event );
76 void OnQuit( wxCommandEvent &event );
77
78 wxScrolledWindow *m_scrolled;
79 wxTextCtrl *m_log;
80
81 private:
82 DECLARE_DYNAMIC_CLASS(MyFrame)
83 DECLARE_EVENT_TABLE()
84 };
85
86 // MyApp
87
88 class MyApp: public wxApp
89 {
90 public:
91 virtual bool OnInit();
92 };
93
94 // main program
95
96 IMPLEMENT_APP(MyApp)
97
98 // MyScrolledWindow
99
100 IMPLEMENT_DYNAMIC_CLASS(MyScrolledWindow, wxScrolledWindow)
101
102 BEGIN_EVENT_TABLE(MyScrolledWindow, wxScrolledWindow)
103 EVT_PAINT( MyScrolledWindow::OnPaint)
104 END_EVENT_TABLE()
105
106 MyScrolledWindow::MyScrolledWindow( wxWindow *parent, wxWindowID id,
107 const wxPoint &pos, const wxSize &size )
108 : wxScrolledWindow( parent, id, pos, size, wxSUNKEN_BORDER, "test canvas" )
109 {
110 m_canvas = new MyCanvas( this, -1, wxDefaultPosition, wxDefaultSize );
111
112 SetTargetWindow( m_canvas );
113
114 SetBackgroundColour( "WHEAT" );
115
116 SetCursor( wxCursor( wxCURSOR_HAND ) );
117
118
119 wxBoxSizer *topsizer = new wxBoxSizer( wxVERTICAL );
120
121 topsizer->Add( m_canvas, 1, wxEXPAND|wxALL, 30 );
122
123 SetAutoLayout( TRUE );
124 SetSizer( topsizer );
125 }
126
127 MyScrolledWindow::~MyScrolledWindow()
128 {
129 }
130
131 void MyScrolledWindow::OnPaint( wxPaintEvent &WXUNUSED(event) )
132 {
133 wxPaintDC dc( this );
134
135 wxSize size( GetClientSize() );
136
137 long w,h;
138 dc.GetTextExtent( wxT("Headline"), &w, &h );
139
140 dc.DrawText( wxT("Headline"), long (size.x / 2 - w / 2), 10 );
141 }
142
143 // MyCanvas
144
145 IMPLEMENT_DYNAMIC_CLASS(MyCanvas, wxPanel)
146
147 BEGIN_EVENT_TABLE(MyCanvas, wxPanel)
148 EVT_PAINT( MyCanvas::OnPaint)
149 END_EVENT_TABLE()
150
151 MyCanvas::MyCanvas( wxScrolledWindow *parent, wxWindowID id,
152 const wxPoint &pos, const wxSize &size )
153 : wxPanel( parent, id, pos, size, wxSUNKEN_BORDER, "test canvas" )
154 {
155 m_owner = parent;
156
157 (void)new wxButton( this, -1, "Hallo I", wxPoint(0,50), wxSize(100,25) );
158 (void)new wxButton( this, -1, "Hallo II", wxPoint(200,50), wxSize(100,25) );
159
160 SetBackgroundColour( *wxWHITE );
161
162 SetCursor( wxCursor( wxCURSOR_IBEAM ) );
163 }
164
165 MyCanvas::~MyCanvas()
166 {
167 }
168
169 void MyCanvas::OnPaint( wxPaintEvent &WXUNUSED(event) )
170 {
171 wxPaintDC dc( this );
172 m_owner->PrepareDC( dc );
173
174 dc.SetPen( *wxBLACK_PEN );
175
176 // OK, let's assume we are a grid control and we have two
177 // grid cells. Here in OnPaint we want to know which cell
178 // to redraw so that we prevent redrawing cells that don't
179 // need to get redrawn. We have one cell at (0,0) and one
180 // more at (200,0), both having a size of (100,25).
181
182 // We can query how much the window has been scrolled
183 // by calling CalcUnscrolledPosition()
184
185 int scroll_x = 0;
186 int scroll_y = 0;
187 m_owner->CalcUnscrolledPosition( scroll_x, scroll_y, &scroll_x, &scroll_y );
188
189 // We also need to know the size of the window to see which
190 // cells are completely hidden and not get redrawn
191
192 int size_x = 0;
193 int size_y = 0;
194 GetClientSize( &size_x, &size_y );
195
196 // First cell: (0,0)(100,25)
197 // It it on screen?
198 if ((0+100-scroll_x > 0) && (0+25-scroll_y > 0) &&
199 (0-scroll_x < size_x) && (0-scroll_y < size_y))
200 {
201 // Has the region an screen been exposed?
202 if (IsExposed(0,0,100,25))
203 {
204 printf( "Redraw first cell\n" );
205 dc.DrawRectangle( 0, 0, 100, 25 );
206 dc.DrawText( "First Cell", 5, 5 );
207 }
208 }
209
210
211 // Second cell: (0,200)(100,25)
212 // It it on screen?
213 if ((200+100-scroll_x > 0) && (0+25-scroll_y > 0) &&
214 (200-scroll_x < size_x) && (0-scroll_y < size_y))
215 {
216 // Has the region an screen been exposed?
217 if (IsExposed(200,0,100,25))
218 {
219 printf( "Redraw second cell\n" );
220 dc.DrawRectangle( 200, 0, 100, 25 );
221 dc.DrawText( "Second Cell", 205, 5 );
222 }
223 }
224
225 }
226
227
228 // MyFrame
229
230 const int ID_QUIT = 108;
231 const int ID_ABOUT = 109;
232
233 IMPLEMENT_DYNAMIC_CLASS( MyFrame, wxFrame )
234
235 BEGIN_EVENT_TABLE(MyFrame,wxFrame)
236 EVT_MENU (ID_ABOUT, MyFrame::OnAbout)
237 EVT_MENU (ID_QUIT, MyFrame::OnQuit)
238 END_EVENT_TABLE()
239
240 MyFrame::MyFrame()
241 : wxFrame( (wxFrame *)NULL, -1, "wxScrolledWindow sample",
242 wxPoint(20,20), wxSize(470,500) )
243 {
244 wxMenu *file_menu = new wxMenu();
245 file_menu->Append( ID_ABOUT, "&About..");
246 file_menu->Append( ID_QUIT, "E&xit\tAlt-X");
247
248 wxMenuBar *menu_bar = new wxMenuBar();
249 menu_bar->Append(file_menu, "&File");
250
251 SetMenuBar( menu_bar );
252
253 CreateStatusBar(2);
254 int widths[] = { -1, 100 };
255 SetStatusWidths( 2, widths );
256
257 m_scrolled = new MyScrolledWindow( this, -1, wxPoint(0,0), wxSize(100,100) );
258 m_scrolled->SetScrollbars( 10, 10, 50, 100 );
259
260 m_log = new wxTextCtrl( this, -1, "This is the log window.\n", wxPoint(0,0), wxSize(100,100), wxTE_MULTILINE );
261 wxLog *old_log = wxLog::SetActiveTarget( new wxLogTextCtrl( m_log ) );
262 delete old_log;
263
264 wxBoxSizer *topsizer = new wxBoxSizer( wxVERTICAL );
265
266 topsizer->Add( m_scrolled, 1, wxEXPAND );
267 topsizer->Add( m_log, 0, wxEXPAND );
268
269 SetAutoLayout( TRUE );
270 SetSizer( topsizer );
271 }
272
273 void MyFrame::OnQuit( wxCommandEvent &WXUNUSED(event) )
274 {
275 Close( TRUE );
276 }
277
278 void MyFrame::OnAbout( wxCommandEvent &WXUNUSED(event) )
279 {
280 (void)wxMessageBox( "wxScroll demo II\n"
281 "Robert Roebling (c) 1998",
282 "About wxScroll II Demo", wxICON_INFORMATION | wxOK );
283 }
284
285 //-----------------------------------------------------------------------------
286 // MyApp
287 //-----------------------------------------------------------------------------
288
289 bool MyApp::OnInit()
290 {
291 wxFrame *frame = new MyFrame();
292 frame->Show( TRUE );
293
294 return TRUE;
295 }
296