remove/replace redundant SetAutoLayout() and Fit() calls, leave just SetSizer[AndFit...
[wxWidgets.git] / samples / popup / popup.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: minimal.cpp
3 // Purpose: Popup wxWidgets sample
4 // Author: Robert Roebling
5 // Modified by:
6 // Created: 2005-02-04
7 // RCS-ID: $Id$
8 // Copyright: (c) 2005 Robert Roebling
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
11
12 // ============================================================================
13 // declarations
14 // ============================================================================
15
16 // ----------------------------------------------------------------------------
17 // headers
18 // ----------------------------------------------------------------------------
19
20 // For compilers that support precompilation, includes "wx/wx.h".
21 #include "wx/wxprec.h"
22
23 #ifdef __BORLANDC__
24 #pragma hdrstop
25 #endif
26
27 // for all others, include the necessary headers (this file is usually all you
28 // need because it includes almost all "standard" wxWidgets headers)
29 #ifndef WX_PRECOMP
30 #include "wx/wx.h"
31 #endif
32
33 #include "wx/popupwin.h"
34 #include "wx/spinctrl.h"
35
36 // ----------------------------------------------------------------------------
37 // resources
38 // ----------------------------------------------------------------------------
39
40 // the application icon (under Windows and OS/2 it is in resources and even
41 // though we could still include the XPM here it would be unused)
42 #if !defined(__WXMSW__) && !defined(__WXPM__)
43 #include "../sample.xpm"
44 #endif
45
46 // ----------------------------------------------------------------------------
47 // constants
48 // ----------------------------------------------------------------------------
49
50 // IDs for the controls and the menu commands
51 enum
52 {
53 Minimal_Quit = wxID_EXIT,
54 Minimal_About = wxID_ABOUT,
55 Minimal_TestDialog,
56 Minimal_StartSimplePopup,
57 Minimal_StartScrolledPopup,
58 Minimal_LogWindow,
59 Minimal_PopupButton,
60 Minimal_PopupSpinctrl
61 };
62
63 //----------------------------------------------------------------------------
64 // SimpleTransientPopup
65 //----------------------------------------------------------------------------
66 class SimpleTransientPopup: public wxPopupTransientWindow
67 {
68 public:
69 SimpleTransientPopup( wxWindow *parent );
70 virtual ~SimpleTransientPopup();
71
72 // wxPopupTransientWindow virtual methods are all overridden to log them
73 virtual void Popup(wxWindow *focus = NULL);
74 virtual void OnDismiss();
75 virtual bool ProcessLeftDown(wxMouseEvent& event);
76 virtual bool Show( bool show = true );
77
78 wxScrolledWindow* GetChild() { return m_panel; }
79
80 private:
81 wxScrolledWindow *m_panel;
82 wxButton *m_button;
83 wxSpinCtrl *m_spinCtrl;
84 wxStaticText *m_mouseText;
85
86 private:
87 void OnMouse( wxMouseEvent &event );
88 void OnSize( wxSizeEvent &event );
89 void OnSetFocus( wxFocusEvent &event );
90 void OnKillFocus( wxFocusEvent &event );
91 void OnButton( wxCommandEvent& event );
92 void OnSpinCtrl( wxSpinEvent& event );
93
94 private:
95 DECLARE_CLASS(SimpleTransientPopup)
96 DECLARE_EVENT_TABLE()
97 };
98
99 //----------------------------------------------------------------------------
100 // SimpleTransientPopup
101 //----------------------------------------------------------------------------
102 IMPLEMENT_CLASS(SimpleTransientPopup,wxPopupTransientWindow)
103
104 BEGIN_EVENT_TABLE(SimpleTransientPopup,wxPopupTransientWindow)
105 EVT_MOUSE_EVENTS( SimpleTransientPopup::OnMouse )
106 EVT_SIZE( SimpleTransientPopup::OnSize )
107 EVT_SET_FOCUS( SimpleTransientPopup::OnSetFocus )
108 EVT_KILL_FOCUS( SimpleTransientPopup::OnKillFocus )
109 EVT_BUTTON( Minimal_PopupButton, SimpleTransientPopup::OnButton )
110 EVT_SPINCTRL( Minimal_PopupSpinctrl, SimpleTransientPopup::OnSpinCtrl )
111 END_EVENT_TABLE()
112
113 SimpleTransientPopup::SimpleTransientPopup( wxWindow *parent )
114 :wxPopupTransientWindow( parent )
115 {
116 m_panel = new wxScrolledWindow( this, wxID_ANY );
117 m_panel->SetBackgroundColour( *wxLIGHT_GREY );
118
119 // Keep this code to verify if mouse events work, they're required if
120 // you're making a control like a combobox where the items are highlighted
121 // under the cursor, the m_panel is set focus in the Popup() function
122 m_panel->Connect(wxEVT_MOTION,
123 wxMouseEventHandler(SimpleTransientPopup::OnMouse),
124 NULL, this);
125
126 wxStaticText *text = new wxStaticText( m_panel, wxID_ANY,
127 wxT("wx.PopupTransientWindow is a\n")
128 wxT("wx.PopupWindow which disappears\n")
129 wxT("automatically when the user\n")
130 wxT("clicks the mouse outside it or if it\n")
131 wxT("(or its first child) loses focus in \n")
132 wxT("any other way.") );
133
134 m_button = new wxButton(m_panel, Minimal_PopupButton, wxT("Press Me"));
135 m_spinCtrl = new wxSpinCtrl(m_panel, Minimal_PopupSpinctrl, wxT("Hello"));
136 m_mouseText = new wxStaticText(m_panel, wxID_ANY,
137 wxT("<- Test Mouse ->"));
138
139 wxBoxSizer *topSizer = new wxBoxSizer( wxVERTICAL );
140 topSizer->Add( text, 0, wxALL, 5 );
141 topSizer->Add( m_button, 0, wxALL, 5 );
142 topSizer->Add( m_spinCtrl, 0, wxALL, 5 );
143 topSizer->Add( m_mouseText, 0, wxCENTRE|wxALL, 5 );
144
145 m_panel->SetSizer( topSizer );
146 topSizer->Fit(m_panel);
147 topSizer->Fit(this);
148 }
149
150 SimpleTransientPopup::~SimpleTransientPopup()
151 {
152 }
153
154 void SimpleTransientPopup::Popup(wxWindow *focus)
155 {
156 wxLogMessage( wxT("0x%lx SimpleTransientPopup::Popup"), long(this) );
157 wxPopupTransientWindow::Popup(focus ? focus : m_panel);
158 }
159
160 void SimpleTransientPopup::OnDismiss()
161 {
162 wxLogMessage( wxT("0x%lx SimpleTransientPopup::OnDismiss"), long(this) );
163 wxPopupTransientWindow::OnDismiss();
164 }
165
166 bool SimpleTransientPopup::ProcessLeftDown(wxMouseEvent& event)
167 {
168 wxLogMessage( wxT("0x%lx SimpleTransientPopup::ProcessLeftDown pos(%d, %d)"), long(this), event.GetX(), event.GetY());
169 return wxPopupTransientWindow::ProcessLeftDown(event);
170 }
171 bool SimpleTransientPopup::Show( bool show )
172 {
173 wxLogMessage( wxT("0x%lx SimpleTransientPopup::Show %d"), long(this), int(show));
174 return wxPopupTransientWindow::Show(show);
175 }
176
177 void SimpleTransientPopup::OnSize(wxSizeEvent &event)
178 {
179 wxLogMessage( wxT("0x%lx SimpleTransientPopup::OnSize"), long(this) );
180 event.Skip();
181 }
182
183 void SimpleTransientPopup::OnSetFocus(wxFocusEvent &event)
184 {
185 wxLogMessage( wxT("0x%lx SimpleTransientPopup::OnSetFocus"), long(this) );
186 event.Skip();
187 }
188
189 void SimpleTransientPopup::OnKillFocus(wxFocusEvent &event)
190 {
191 wxLogMessage( wxT("0x%lx SimpleTransientPopup::OnKillFocus"), long(this) );
192 event.Skip();
193 }
194
195 void SimpleTransientPopup::OnMouse(wxMouseEvent &event)
196 {
197 wxRect rect(m_mouseText->GetRect());
198 rect.SetX(-100000);
199 rect.SetWidth(1000000);
200 wxColour colour(*wxLIGHT_GREY);
201
202 if (rect.Contains(event.GetPosition()))
203 {
204 colour = wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHT);
205 wxLogMessage( wxT("0x%lx SimpleTransientPopup::OnMouse pos(%d, %d)"), long(event.GetEventObject()), event.GetX(), event.GetY());
206 }
207
208 if (colour != m_mouseText->GetBackgroundColour())
209 {
210 m_mouseText->SetBackgroundColour(colour);
211 m_mouseText->Refresh();
212 }
213 event.Skip();
214 }
215
216 void SimpleTransientPopup::OnButton(wxCommandEvent& event)
217 {
218 wxLogMessage( wxT("0x%lx SimpleTransientPopup::OnButton ID %d"), long(this), event.GetId());
219
220 wxButton *button = wxDynamicCast(event.GetEventObject(), wxButton);
221 if (button->GetLabel() == wxT("Press Me"))
222 button->SetLabel(wxT("Pressed"));
223 else
224 button->SetLabel(wxT("Press Me"));
225
226 event.Skip();
227 }
228
229 void SimpleTransientPopup::OnSpinCtrl(wxSpinEvent& event)
230 {
231 wxLogMessage( wxT("0x%lx SimpleTransientPopup::OnSpinCtrl ID %d Value %d"), long(this), event.GetId(), event.GetInt());
232 event.Skip();
233 }
234
235 // ----------------------------------------------------------------------------
236 // private classes
237 // ----------------------------------------------------------------------------
238
239 class MyDialog : public wxDialog
240 {
241 public:
242 MyDialog(const wxString& title);
243
244 void OnStartSimplePopup(wxCommandEvent& event);
245 void OnStartScrolledPopup(wxCommandEvent& event);
246
247 private:
248 SimpleTransientPopup *m_simplePopup;
249 SimpleTransientPopup *m_scrolledPopup;
250 DECLARE_EVENT_TABLE()
251 };
252
253 class MyFrame : public wxFrame
254 {
255 public:
256 MyFrame(const wxString& title);
257 virtual ~MyFrame();
258
259 void OnQuit(wxCommandEvent& event);
260 void OnAbout(wxCommandEvent& event);
261 void OnTestDialog(wxCommandEvent& event);
262 void OnStartSimplePopup(wxCommandEvent& event);
263 void OnStartScrolledPopup(wxCommandEvent& event);
264
265 private:
266 SimpleTransientPopup *m_simplePopup;
267 SimpleTransientPopup *m_scrolledPopup;
268 wxTextCtrl *m_logWin;
269 wxLog *m_logOld;
270 DECLARE_EVENT_TABLE()
271 };
272
273 class MyApp : public wxApp
274 {
275 public:
276 virtual bool OnInit();
277
278 MyFrame *m_frame;
279 };
280
281 // ----------------------------------------------------------------------------
282 // event tables and other macros for wxWidgets
283 // ----------------------------------------------------------------------------
284
285
286 IMPLEMENT_APP(MyApp)
287
288 // 'Main program' equivalent: the program execution "starts" here
289 bool MyApp::OnInit()
290 {
291 if ( !wxApp::OnInit() )
292 return false;
293
294 // create the main application window
295 m_frame = new MyFrame(_T("Popup wxWidgets App"));
296
297 // and show it (the frames, unlike simple controls, are not shown when
298 // created initially)
299 m_frame->Show(true);
300
301 // success: wxApp::OnRun() will be called which will enter the main message
302 // loop and the application will run. If we returned false here, the
303 // application would exit immediately.
304 return true;
305 }
306
307 // ----------------------------------------------------------------------------
308 // main frame
309 // ----------------------------------------------------------------------------
310
311 BEGIN_EVENT_TABLE(MyFrame, wxFrame)
312 EVT_MENU(Minimal_Quit, MyFrame::OnQuit)
313 EVT_MENU(Minimal_About, MyFrame::OnAbout)
314 EVT_MENU(Minimal_TestDialog, MyFrame::OnTestDialog)
315 EVT_BUTTON(Minimal_StartSimplePopup, MyFrame::OnStartSimplePopup)
316 EVT_BUTTON(Minimal_StartScrolledPopup, MyFrame::OnStartScrolledPopup)
317 END_EVENT_TABLE()
318
319 MyFrame::MyFrame(const wxString& title)
320 : wxFrame(NULL, wxID_ANY, title)
321 {
322 m_simplePopup = m_scrolledPopup = NULL;
323
324 SetIcon(wxICON(sample));
325
326 #if wxUSE_MENUS
327 wxMenu *menuFile = new wxMenu;
328
329 // the "About" item should be in the help menu
330 wxMenu *helpMenu = new wxMenu;
331 helpMenu->Append(Minimal_About, _T("&About...\tF1"), _T("Show about dialog"));
332
333 menuFile->Append(Minimal_TestDialog, _T("&Test dialog\tAlt-T"), _T("Test dialog"));
334 menuFile->Append(Minimal_Quit, _T("E&xit\tAlt-X"), _T("Quit this program"));
335
336 // now append the freshly created menu to the menu bar...
337 wxMenuBar *menuBar = new wxMenuBar();
338 menuBar->Append(menuFile, _T("&File"));
339 menuBar->Append(helpMenu, _T("&Help"));
340
341 // ... and attach this menu bar to the frame
342 SetMenuBar(menuBar);
343 #endif // wxUSE_MENUS
344
345 #if wxUSE_STATUSBAR
346 // create a status bar just for fun (by default with 1 pane only)
347 CreateStatusBar(2);
348 SetStatusText(_T("Welcome to wxWidgets!"));
349 #endif // wxUSE_STATUSBAR
350
351 wxPanel *panel = new wxPanel(this, -1);
352 wxButton *button1 = new wxButton( panel, Minimal_StartSimplePopup, wxT("Show simple popup"), wxPoint(20,20) );
353 wxButton *button2 = new wxButton( panel, Minimal_StartScrolledPopup, wxT("Show scrolled popup"), wxPoint(20,70) );
354
355 m_logWin = new wxTextCtrl( panel, wxID_ANY, wxEmptyString, wxDefaultPosition,
356 wxDefaultSize, wxTE_MULTILINE );
357 m_logWin->SetEditable(false);
358 wxLogTextCtrl* logger = new wxLogTextCtrl( m_logWin );
359 m_logOld = logger->SetActiveTarget( logger );
360 logger->DisableTimestamp();
361
362 wxBoxSizer *topSizer = new wxBoxSizer( wxVERTICAL );
363 topSizer->Add( button1, 0, wxALL, 5 );
364 topSizer->Add( button2, 0, wxALL, 5 );
365 topSizer->Add( m_logWin, 1, wxEXPAND|wxALL, 5 );
366
367 panel->SetSizer( topSizer );
368
369 }
370
371 MyFrame::~MyFrame()
372 {
373 delete wxLog::SetActiveTarget(m_logOld);
374 }
375
376
377 // event handlers
378
379 void MyFrame::OnStartSimplePopup(wxCommandEvent& event)
380 {
381 wxLogMessage( wxT("================================================") );
382 delete m_simplePopup;
383 m_simplePopup = new SimpleTransientPopup( this );
384 wxWindow *btn = (wxWindow*) event.GetEventObject();
385 wxPoint pos = btn->ClientToScreen( wxPoint(0,0) );
386 wxSize sz = btn->GetSize();
387 m_simplePopup->Position( pos, sz );
388 wxLogMessage( wxT("0x%lx Simple Popup Shown pos(%d, %d) size(%d, %d)"), long(m_simplePopup), pos.x, pos.y, sz.x, sz.y );
389 m_simplePopup->Popup();
390 }
391
392 void MyFrame::OnStartScrolledPopup(wxCommandEvent& event)
393 {
394 wxLogMessage( wxT("================================================") );
395 delete m_scrolledPopup;
396 m_scrolledPopup = new SimpleTransientPopup( this );
397 m_scrolledPopup->GetChild()->SetScrollbars(1, 1, 1000, 1000);
398 wxWindow *btn = (wxWindow*) event.GetEventObject();
399 wxPoint pos = btn->ClientToScreen( wxPoint(0,0) );
400 wxSize sz = btn->GetSize();
401 m_scrolledPopup->Position( pos, sz );
402 wxLogMessage( wxT("0x%lx Scrolled Popup Shown pos(%d, %d) size(%d, %d)"), long(m_scrolledPopup), pos.x, pos.y, sz.x, sz.y );
403 m_scrolledPopup->Popup();
404 }
405
406 void MyFrame::OnTestDialog(wxCommandEvent& WXUNUSED(event))
407 {
408 MyDialog dialog( wxT("Test") );
409 dialog.ShowModal();
410 }
411
412 void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
413 {
414 // true is to force the frame to close
415 Close(true);
416 }
417
418 void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
419 {
420 wxString msg;
421 msg.Printf( _T("This is the About dialog of the popup sample.\n")
422 _T("Welcome to %s"), wxVERSION_STRING);
423
424 wxMessageBox(msg, _T("About Popup"), wxOK | wxICON_INFORMATION, this);
425 }
426
427 // ----------------------------------------------------------------------------
428 // test dialog
429 // ----------------------------------------------------------------------------
430
431 BEGIN_EVENT_TABLE(MyDialog, wxDialog)
432 EVT_BUTTON(Minimal_StartSimplePopup, MyDialog::OnStartSimplePopup)
433 EVT_BUTTON(Minimal_StartScrolledPopup, MyDialog::OnStartScrolledPopup)
434 END_EVENT_TABLE()
435
436 MyDialog::MyDialog(const wxString& title)
437 :wxDialog(NULL, wxID_ANY, title, wxPoint(50,50), wxSize(400,300))
438 {
439 m_simplePopup = m_scrolledPopup = NULL;
440 wxPanel *panel = new wxPanel(this, -1);
441
442 wxButton *button1 = new wxButton( panel, Minimal_StartSimplePopup, wxT("Show simple popup"), wxPoint(20,20) );
443 wxButton *button2 = new wxButton( panel, Minimal_StartScrolledPopup, wxT("Show scrolled popup"), wxPoint(20,60) );
444
445 wxButton *okButton = new wxButton( panel, wxID_OK, wxT("OK"), wxPoint(20,200) );
446
447 wxBoxSizer *topSizer = new wxBoxSizer( wxVERTICAL );
448 topSizer->Add( button1, 0, wxALL, 5 );
449 topSizer->Add( button2, 0, wxALL, 5 );
450 topSizer->AddSpacer(40);
451 topSizer->Add( okButton, 0, wxALL, 5 );
452
453 panel->SetSizerAndFit( topSizer );
454 }
455
456 void MyDialog::OnStartSimplePopup(wxCommandEvent& event)
457 {
458 wxLogMessage( wxT("================================================") );
459 delete m_simplePopup;
460 m_simplePopup = new SimpleTransientPopup( this );
461 wxWindow *btn = (wxWindow*) event.GetEventObject();
462 wxPoint pos = btn->ClientToScreen( wxPoint(0,0) );
463 wxSize sz = btn->GetSize();
464 m_simplePopup->Position( pos, sz );
465 wxLogMessage( wxT("0x%lx Dialog Simple Popup Shown pos(%d, %d) size(%d, %d)"), long(m_simplePopup), pos.x, pos.y, sz.x, sz.y );
466 m_simplePopup->Popup();
467 }
468
469 void MyDialog::OnStartScrolledPopup(wxCommandEvent& event)
470 {
471 wxLogMessage( wxT("================================================") );
472 delete m_scrolledPopup;
473 m_scrolledPopup = new SimpleTransientPopup( this );
474 m_scrolledPopup->GetChild()->SetScrollbars(1, 1, 1000, 1000);
475 wxWindow *btn = (wxWindow*) event.GetEventObject();
476 wxPoint pos = btn->ClientToScreen( wxPoint(0,0) );
477 wxSize sz = btn->GetSize();
478 m_scrolledPopup->Position( pos, sz );
479 wxLogMessage( wxT("0x%lx Dialog Scrolled Popup Shown pos(%d, %d) size(%d, %d)"), long(m_scrolledPopup), pos.x, pos.y, sz.x, sz.y );
480 m_scrolledPopup->Popup();
481 }