]> git.saurik.com Git - wxWidgets.git/blame - samples/popup/popup.cpp
1945421 applied
[wxWidgets.git] / samples / popup / popup.cpp
CommitLineData
98d5b42b
RR
1/////////////////////////////////////////////////////////////////////////////
2// Name: minimal.cpp
3// Purpose: Popup wxWidgets sample
43f813d1 4// Author: Robert Roebling
98d5b42b 5// Modified by:
43f813d1 6// Created: 2005-02-04
98d5b42b 7// RCS-ID: $Id$
43f813d1 8// Copyright: (c) 2005 Robert Roebling
98d5b42b
RR
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"
b6de8445 34#include "wx/spinctrl.h"
98d5b42b
RR
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
b6de8445
RR
46// ----------------------------------------------------------------------------
47// constants
48// ----------------------------------------------------------------------------
49
50// IDs for the controls and the menu commands
51enum
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
34786588
VZ
63//----------------------------------------------------------------------------
64// SimpleTransientPopup
65//----------------------------------------------------------------------------
98d5b42b
RR
66class SimpleTransientPopup: public wxPopupTransientWindow
67{
68public:
69 SimpleTransientPopup( wxWindow *parent );
70 virtual ~SimpleTransientPopup();
34786588
VZ
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 );
dd6a7fb4 77
34786588 78 wxScrolledWindow* GetChild() { return m_panel; }
dd6a7fb4 79
98d5b42b 80private:
34786588 81 wxScrolledWindow *m_panel;
b6de8445
RR
82 wxButton *m_button;
83 wxSpinCtrl *m_spinCtrl;
414f2513 84 wxStaticText *m_mouseText;
dd6a7fb4 85
98d5b42b
RR
86private:
87 void OnMouse( wxMouseEvent &event );
88 void OnSize( wxSizeEvent &event );
89 void OnSetFocus( wxFocusEvent &event );
90 void OnKillFocus( wxFocusEvent &event );
b6de8445
RR
91 void OnButton( wxCommandEvent& event );
92 void OnSpinCtrl( wxSpinEvent& event );
98d5b42b
RR
93
94private:
95 DECLARE_CLASS(SimpleTransientPopup)
96 DECLARE_EVENT_TABLE()
97};
98
98d5b42b
RR
99//----------------------------------------------------------------------------
100// SimpleTransientPopup
101//----------------------------------------------------------------------------
98d5b42b
RR
102IMPLEMENT_CLASS(SimpleTransientPopup,wxPopupTransientWindow)
103
104BEGIN_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 )
b6de8445
RR
109 EVT_BUTTON( Minimal_PopupButton, SimpleTransientPopup::OnButton )
110 EVT_SPINCTRL( Minimal_PopupSpinctrl, SimpleTransientPopup::OnSpinCtrl )
98d5b42b
RR
111END_EVENT_TABLE()
112
82ceade7
RD
113SimpleTransientPopup::SimpleTransientPopup( wxWindow *parent )
114 :wxPopupTransientWindow( parent )
98d5b42b 115{
dd6a7fb4 116 m_panel = new wxScrolledWindow( this, wxID_ANY );
98d5b42b 117 m_panel->SetBackgroundColour( *wxLIGHT_GREY );
82ceade7
RD
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
414f2513
RD
122 m_panel->Connect(wxEVT_MOTION,
123 wxMouseEventHandler(SimpleTransientPopup::OnMouse),
124 NULL, this);
82ceade7 125
dd6a7fb4 126 wxStaticText *text = new wxStaticText( m_panel, wxID_ANY,
befc36f8
RD
127 wxT("wxPopupTransientWindow is a\n")
128 wxT("wxPopupWindow which disappears\n")
98d5b42b
RR
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")
414f2513 132 wxT("any other way.") );
b6de8445 133
414f2513
RD
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 ->"));
21fe01e2 138
414f2513
RD
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
414f2513
RD
145 m_panel->SetSizer( topSizer );
146 topSizer->Fit(m_panel);
147 topSizer->Fit(this);
98d5b42b
RR
148}
149
150SimpleTransientPopup::~SimpleTransientPopup()
151{
152}
153
34786588
VZ
154void SimpleTransientPopup::Popup(wxWindow *focus)
155{
5c95f4b2 156 wxLogMessage( wxT("0x%lx SimpleTransientPopup::Popup"), long(this) );
82ceade7 157 wxPopupTransientWindow::Popup(focus ? focus : m_panel);
34786588
VZ
158}
159
98d5b42b
RR
160void SimpleTransientPopup::OnDismiss()
161{
5c95f4b2 162 wxLogMessage( wxT("0x%lx SimpleTransientPopup::OnDismiss"), long(this) );
34786588
VZ
163 wxPopupTransientWindow::OnDismiss();
164}
165
166bool SimpleTransientPopup::ProcessLeftDown(wxMouseEvent& event)
167{
5c95f4b2 168 wxLogMessage( wxT("0x%lx SimpleTransientPopup::ProcessLeftDown pos(%d, %d)"), long(this), event.GetX(), event.GetY());
34786588
VZ
169 return wxPopupTransientWindow::ProcessLeftDown(event);
170}
171bool SimpleTransientPopup::Show( bool show )
172{
5c95f4b2 173 wxLogMessage( wxT("0x%lx SimpleTransientPopup::Show %d"), long(this), int(show));
34786588 174 return wxPopupTransientWindow::Show(show);
98d5b42b
RR
175}
176
177void SimpleTransientPopup::OnSize(wxSizeEvent &event)
178{
5c95f4b2 179 wxLogMessage( wxT("0x%lx SimpleTransientPopup::OnSize"), long(this) );
98d5b42b
RR
180 event.Skip();
181}
182
183void SimpleTransientPopup::OnSetFocus(wxFocusEvent &event)
184{
5c95f4b2 185 wxLogMessage( wxT("0x%lx SimpleTransientPopup::OnSetFocus"), long(this) );
43f813d1 186 event.Skip();
98d5b42b
RR
187}
188
189void SimpleTransientPopup::OnKillFocus(wxFocusEvent &event)
190{
5c95f4b2 191 wxLogMessage( wxT("0x%lx SimpleTransientPopup::OnKillFocus"), long(this) );
43f813d1 192 event.Skip();
98d5b42b
RR
193}
194
195void SimpleTransientPopup::OnMouse(wxMouseEvent &event)
196{
414f2513
RD
197 wxRect rect(m_mouseText->GetRect());
198 rect.SetX(-100000);
199 rect.SetWidth(1000000);
200 wxColour colour(*wxLIGHT_GREY);
201
50dd4ca9 202 if (rect.Contains(event.GetPosition()))
414f2513
RD
203 {
204 colour = wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHT);
82ceade7 205 wxLogMessage( wxT("0x%lx SimpleTransientPopup::OnMouse pos(%d, %d)"), long(event.GetEventObject()), event.GetX(), event.GetY());
414f2513
RD
206 }
207
208 if (colour != m_mouseText->GetBackgroundColour())
209 {
210 m_mouseText->SetBackgroundColour(colour);
211 m_mouseText->Refresh();
212 }
34786588
VZ
213 event.Skip();
214}
215
b6de8445 216void SimpleTransientPopup::OnButton(wxCommandEvent& event)
34786588 217{
5c95f4b2 218 wxLogMessage( wxT("0x%lx SimpleTransientPopup::OnButton ID %d"), long(this), event.GetId());
dd6a7fb4 219
b6de8445
RR
220 wxButton *button = wxDynamicCast(event.GetEventObject(), wxButton);
221 if (button->GetLabel() == wxT("Press Me"))
222 button->SetLabel(wxT("Pressed"));
dd6a7fb4 223 else
b6de8445 224 button->SetLabel(wxT("Press Me"));
34786588 225
34786588
VZ
226 event.Skip();
227}
34786588 228
b6de8445 229void SimpleTransientPopup::OnSpinCtrl(wxSpinEvent& event)
34786588 230{
b143cf70 231 wxLogMessage( wxT("0x%lx SimpleTransientPopup::OnSpinCtrl ID %d Value %d"), long(this), event.GetId(), event.GetInt());
98d5b42b
RR
232 event.Skip();
233}
234
235// ----------------------------------------------------------------------------
236// private classes
237// ----------------------------------------------------------------------------
238
98d5b42b
RR
239class MyDialog : public wxDialog
240{
241public:
242 MyDialog(const wxString& title);
243
244 void OnStartSimplePopup(wxCommandEvent& event);
34786588 245 void OnStartScrolledPopup(wxCommandEvent& event);
98d5b42b
RR
246
247private:
82ceade7
RD
248 SimpleTransientPopup *m_simplePopup;
249 SimpleTransientPopup *m_scrolledPopup;
98d5b42b
RR
250 DECLARE_EVENT_TABLE()
251};
252
253class MyFrame : public wxFrame
254{
255public:
256 MyFrame(const wxString& title);
34786588
VZ
257 virtual ~MyFrame();
258
98d5b42b
RR
259 void OnQuit(wxCommandEvent& event);
260 void OnAbout(wxCommandEvent& event);
261 void OnTestDialog(wxCommandEvent& event);
262 void OnStartSimplePopup(wxCommandEvent& event);
34786588 263 void OnStartScrolledPopup(wxCommandEvent& event);
98d5b42b
RR
264
265private:
82ceade7
RD
266 SimpleTransientPopup *m_simplePopup;
267 SimpleTransientPopup *m_scrolledPopup;
b6de8445 268 wxTextCtrl *m_logWin;
34786588 269 wxLog *m_logOld;
98d5b42b
RR
270 DECLARE_EVENT_TABLE()
271};
272
b6de8445 273class MyApp : public wxApp
98d5b42b 274{
b6de8445
RR
275public:
276 virtual bool OnInit();
277
278 MyFrame *m_frame;
98d5b42b
RR
279};
280
281// ----------------------------------------------------------------------------
282// event tables and other macros for wxWidgets
283// ----------------------------------------------------------------------------
284
285
286IMPLEMENT_APP(MyApp)
287
288// 'Main program' equivalent: the program execution "starts" here
289bool MyApp::OnInit()
290{
45e6e6f8
VZ
291 if ( !wxApp::OnInit() )
292 return false;
293
98d5b42b 294 // create the main application window
b6de8445 295 m_frame = new MyFrame(_T("Popup wxWidgets App"));
98d5b42b
RR
296
297 // and show it (the frames, unlike simple controls, are not shown when
298 // created initially)
b6de8445 299 m_frame->Show(true);
98d5b42b
RR
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
311BEGIN_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)
34786588 316 EVT_BUTTON(Minimal_StartScrolledPopup, MyFrame::OnStartScrolledPopup)
98d5b42b
RR
317END_EVENT_TABLE()
318
319MyFrame::MyFrame(const wxString& title)
befc36f8 320: wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(500,300))
98d5b42b 321{
82ceade7
RD
322 m_simplePopup = m_scrolledPopup = NULL;
323
98d5b42b
RR
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
414f2513
RD
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
82ceade7
RD
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) );
34786588 354
82ceade7
RD
355 m_logWin = new wxTextCtrl( panel, wxID_ANY, wxEmptyString, wxDefaultPosition,
356 wxDefaultSize, wxTE_MULTILINE );
b6de8445
RR
357 m_logWin->SetEditable(false);
358 wxLogTextCtrl* logger = new wxLogTextCtrl( m_logWin );
34786588 359 m_logOld = logger->SetActiveTarget( logger );
bd0b594d 360 logger->DisableTimestamp();
dd6a7fb4 361
34786588 362 wxBoxSizer *topSizer = new wxBoxSizer( wxVERTICAL );
82ceade7
RD
363 topSizer->Add( button1, 0, wxALL, 5 );
364 topSizer->Add( button2, 0, wxALL, 5 );
365 topSizer->Add( m_logWin, 1, wxEXPAND|wxALL, 5 );
98d5b42b 366
82ceade7 367 panel->SetSizer( topSizer );
98d5b42b 368
98d5b42b
RR
369}
370
dd6a7fb4
WS
371MyFrame::~MyFrame()
372{
373 delete wxLog::SetActiveTarget(m_logOld);
374}
34786588
VZ
375
376
98d5b42b
RR
377// event handlers
378
379void MyFrame::OnStartSimplePopup(wxCommandEvent& event)
380{
b6de8445 381 wxLogMessage( wxT("================================================") );
82ceade7
RD
382 delete m_simplePopup;
383 m_simplePopup = new SimpleTransientPopup( this );
98d5b42b
RR
384 wxWindow *btn = (wxWindow*) event.GetEventObject();
385 wxPoint pos = btn->ClientToScreen( wxPoint(0,0) );
386 wxSize sz = btn->GetSize();
82ceade7
RD
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();
98d5b42b
RR
390}
391
34786588 392void MyFrame::OnStartScrolledPopup(wxCommandEvent& event)
98d5b42b 393{
34786588 394 wxLogMessage( wxT("================================================") );
82ceade7
RD
395 delete m_scrolledPopup;
396 m_scrolledPopup = new SimpleTransientPopup( this );
397 m_scrolledPopup->GetChild()->SetScrollbars(1, 1, 1000, 1000);
34786588
VZ
398 wxWindow *btn = (wxWindow*) event.GetEventObject();
399 wxPoint pos = btn->ClientToScreen( wxPoint(0,0) );
400 wxSize sz = btn->GetSize();
82ceade7
RD
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();
98d5b42b
RR
404}
405
406void MyFrame::OnTestDialog(wxCommandEvent& WXUNUSED(event))
407{
408 MyDialog dialog( wxT("Test") );
409 dialog.ShowModal();
410}
411
412void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
413{
414 // true is to force the frame to close
415 Close(true);
416}
417
418void 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
431BEGIN_EVENT_TABLE(MyDialog, wxDialog)
432 EVT_BUTTON(Minimal_StartSimplePopup, MyDialog::OnStartSimplePopup)
34786588 433 EVT_BUTTON(Minimal_StartScrolledPopup, MyDialog::OnStartScrolledPopup)
98d5b42b
RR
434END_EVENT_TABLE()
435
436MyDialog::MyDialog(const wxString& title)
82ceade7 437 :wxDialog(NULL, wxID_ANY, title, wxPoint(50,50), wxSize(400,300))
98d5b42b 438{
82ceade7
RD
439 m_simplePopup = m_scrolledPopup = NULL;
440 wxPanel *panel = new wxPanel(this, -1);
98d5b42b 441
82ceade7
RD
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) );
98d5b42b 444
82ceade7
RD
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
92c01615 453 panel->SetSizerAndFit( topSizer );
98d5b42b
RR
454}
455
456void MyDialog::OnStartSimplePopup(wxCommandEvent& event)
457{
b6de8445 458 wxLogMessage( wxT("================================================") );
82ceade7
RD
459 delete m_simplePopup;
460 m_simplePopup = new SimpleTransientPopup( this );
98d5b42b
RR
461 wxWindow *btn = (wxWindow*) event.GetEventObject();
462 wxPoint pos = btn->ClientToScreen( wxPoint(0,0) );
463 wxSize sz = btn->GetSize();
82ceade7
RD
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();
98d5b42b
RR
467}
468
34786588 469void MyDialog::OnStartScrolledPopup(wxCommandEvent& event)
98d5b42b 470{
34786588 471 wxLogMessage( wxT("================================================") );
82ceade7
RD
472 delete m_scrolledPopup;
473 m_scrolledPopup = new SimpleTransientPopup( this );
474 m_scrolledPopup->GetChild()->SetScrollbars(1, 1, 1000, 1000);
34786588
VZ
475 wxWindow *btn = (wxWindow*) event.GetEventObject();
476 wxPoint pos = btn->ClientToScreen( wxPoint(0,0) );
477 wxSize sz = btn->GetSize();
82ceade7
RD
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();
98d5b42b 481}