]> git.saurik.com Git - wxWidgets.git/blame - src/univ/dialog.cpp
Improve validation of wxCheckBox styles.
[wxWidgets.git] / src / univ / dialog.cpp
CommitLineData
0e0de6b8
VS
1/////////////////////////////////////////////////////////////////////////////
2// Name: src/univ/dialog.cpp
3// Author: Robert Roebling, Vaclav Slavik
4// Id: $Id$
5// Copyright: (c) 2001 SciTech Software, Inc. (www.scitechsoft.com)
65571936 6// Licence: wxWindows licence
0e0de6b8
VS
7/////////////////////////////////////////////////////////////////////////////
8
2e9f62da
VZ
9// ============================================================================
10// declarations
11// ============================================================================
12
13// ----------------------------------------------------------------------------
14// headers
15// ----------------------------------------------------------------------------
16
2e9f62da
VZ
17// For compilers that support precompilation, includes "wx.h".
18#include "wx/wxprec.h"
19
20#ifdef __BORLANDC__
21 #pragma hdrstop
22#endif
23
fdf565fe
WS
24#include "wx/dialog.h"
25
2e9f62da 26#ifndef WX_PRECOMP
2e9f62da
VZ
27 #include "wx/utils.h"
28 #include "wx/app.h"
0e0de6b8
VS
29#endif
30
0e0de6b8 31#include "wx/evtloop.h"
0e0de6b8
VS
32
33//-----------------------------------------------------------------------------
34// wxDialog
35//-----------------------------------------------------------------------------
36
37BEGIN_EVENT_TABLE(wxDialog,wxDialogBase)
38 EVT_BUTTON (wxID_OK, wxDialog::OnOK)
39 EVT_BUTTON (wxID_CANCEL, wxDialog::OnCancel)
40 EVT_BUTTON (wxID_APPLY, wxDialog::OnApply)
41 EVT_CLOSE (wxDialog::OnCloseWindow)
42END_EVENT_TABLE()
43
44IMPLEMENT_DYNAMIC_CLASS(wxDialog,wxTopLevelWindow)
45
46void wxDialog::Init()
47{
48 m_returnCode = 0;
49 m_windowDisabler = NULL;
50 m_eventLoop = NULL;
a290fa5a 51 m_isShowingModal = false;
0e0de6b8
VS
52}
53
54wxDialog::~wxDialog()
55{
a9efc294
VS
56 // if the dialog is modal, this will end its event loop
57 Show(false);
58
0e0de6b8
VS
59 delete m_eventLoop;
60}
61
62bool wxDialog::Create(wxWindow *parent,
63 wxWindowID id, const wxString &title,
64 const wxPoint &pos, const wxSize &size,
65 long style, const wxString &name)
66{
21f4383a 67 SetExtraStyle(GetExtraStyle() | wxTOPLEVEL_EX_DIALOG);
0e0de6b8
VS
68
69 // all dialogs should have tab traversal enabled
70 style |= wxTAB_TRAVERSAL;
71
72 return wxTopLevelWindow::Create(parent, id, title, pos, size, style, name);
73}
74
75void wxDialog::OnApply(wxCommandEvent &WXUNUSED(event))
76{
3aa8e4ea 77 if ( Validate() )
0e0de6b8
VS
78 TransferDataFromWindow();
79}
80
81void wxDialog::OnCancel(wxCommandEvent &WXUNUSED(event))
82{
83 if ( IsModal() )
84 {
85 EndModal(wxID_CANCEL);
86 }
87 else
88 {
89 SetReturnCode(wxID_CANCEL);
a290fa5a 90 Show(false);
0e0de6b8
VS
91 }
92}
93
94void wxDialog::OnOK(wxCommandEvent &WXUNUSED(event))
95{
96 if ( Validate() && TransferDataFromWindow() )
97 {
98 if ( IsModal() )
99 {
100 EndModal(wxID_OK);
101 }
102 else
103 {
104 SetReturnCode(wxID_OK);
a290fa5a 105 Show(false);
0e0de6b8
VS
106 }
107 }
108}
109
110void wxDialog::OnCloseWindow(wxCloseEvent& WXUNUSED(event))
111{
112 // We'll send a Cancel message by default,
113 // which may close the dialog.
114 // Check for looping if the Cancel event handler calls Close().
115
116 // Note that if a cancel button and handler aren't present in the dialog,
117 // nothing will happen when you close the dialog via the window manager, or
118 // via Close().
119 // We wouldn't want to destroy the dialog by default, since the dialog may have been
120 // created on the stack.
121 // However, this does mean that calling dialog->Close() won't delete the dialog
122 // unless the handler for wxID_CANCEL does so. So use Destroy() if you want to be
123 // sure to destroy the dialog.
124 // The default OnCancel (above) simply ends a modal dialog, and hides a modeless dialog.
125
126 static wxList s_closing;
127
128 if (s_closing.Member(this))
129 return; // no loops
130
131 s_closing.Append(this);
132
133 wxCommandEvent cancelEvent(wxEVT_COMMAND_BUTTON_CLICKED, wxID_CANCEL);
134 cancelEvent.SetEventObject(this);
135 GetEventHandler()->ProcessEvent(cancelEvent);
136 s_closing.DeleteObject(this);
137}
138
139bool wxDialog::Show(bool show)
140{
141 if ( !show )
142 {
143 // if we had disabled other app windows, reenable them back now because
144 // if they stay disabled Windows will activate another window (one
145 // which is enabled, anyhow) and we will lose activation
5276b0a5 146 wxDELETE(m_windowDisabler);
0e0de6b8
VS
147
148 if ( IsModal() )
149 EndModal(wxID_CANCEL);
150 }
151
3aa8e4ea
JS
152 if (show && CanDoLayoutAdaptation())
153 DoLayoutAdaptation();
154
0e0de6b8
VS
155 bool ret = wxDialogBase::Show(show);
156
3aa8e4ea 157 if ( show )
0e0de6b8
VS
158 InitDialog();
159
160 return ret;
161}
162
163bool wxDialog::IsModal() const
164{
165 return m_isShowingModal;
166}
167
0e0de6b8
VS
168int wxDialog::ShowModal()
169{
170 if ( IsModal() )
171 {
172 wxFAIL_MSG( wxT("wxDialog:ShowModal called twice") );
173 return GetReturnCode();
174 }
175
176 // use the apps top level window as parent if none given unless explicitly
177 // forbidden
cdc48273
VZ
178 wxWindow * const parent = GetParentForModalDialog();
179 if ( parent && parent != this )
0e0de6b8 180 {
cdc48273 181 m_parent = parent;
0e0de6b8
VS
182 }
183
a290fa5a 184 Show(true);
0e0de6b8 185
a290fa5a 186 m_isShowingModal = true;
0e0de6b8 187
9a83f860 188 wxASSERT_MSG( !m_windowDisabler, wxT("disabling windows twice?") );
0e0de6b8 189
e3fc616c 190#if defined(__WXGTK__) || defined(__WXMGL__)
b22d16ad 191 wxBusyCursorSuspender suspender;
e3fc616c 192 // FIXME (FIXME_MGL) - make sure busy cursor disappears under MSW too
b22d16ad
VS
193#endif
194
0e0de6b8
VS
195 m_windowDisabler = new wxWindowDisabler(this);
196 if ( !m_eventLoop )
197 m_eventLoop = new wxEventLoop;
198
199 m_eventLoop->Run();
200
201 return GetReturnCode();
202}
203
204void wxDialog::EndModal(int retCode)
205{
9a83f860 206 wxASSERT_MSG( m_eventLoop, wxT("wxDialog is not modal") );
0e0de6b8
VS
207
208 SetReturnCode(retCode);
209
210 if ( !IsModal() )
211 {
212 wxFAIL_MSG( wxT("wxDialog:EndModal called twice") );
213 return;
214 }
215
a290fa5a 216 m_isShowingModal = false;
fdf565fe 217
0e0de6b8
VS
218 m_eventLoop->Exit();
219
a290fa5a 220 Show(false);
0e0de6b8 221}