]> git.saurik.com Git - wxWidgets.git/blame - src/os2/dialog.cpp
tiny fixes
[wxWidgets.git] / src / os2 / dialog.cpp
CommitLineData
0e320a79
DW
1/////////////////////////////////////////////////////////////////////////////
2// Name: dialog.cpp
3// Purpose: wxDialog class
4// Author: AUTHOR
5// Modified by:
6// Created: ??/??/98
7// RCS-ID: $Id$
8// Copyright: (c) AUTHOR
9// Licence: wxWindows licence
10/////////////////////////////////////////////////////////////////////////////
11
27476f73
DW
12// For compilers that support precompilation, includes "wx.h".
13#include "wx/wxprec.h"
0e320a79 14
27476f73 15#ifndef WX_PRECOMP
0e320a79
DW
16#include "wx/dialog.h"
17#include "wx/utils.h"
18#include "wx/frame.h"
19#include "wx/app.h"
20#include "wx/settings.h"
27476f73
DW
21#include "wx/intl.h"
22#include "wx/log.h"
23#endif
24
25#include "wx/os2/private.h"
26#include "wx/log.h"
27
28#if wxUSE_COMMON_DIALOGS
29#include <commdlg.h>
30#endif
31
32#define wxDIALOG_DEFAULT_X 300
33#define wxDIALOG_DEFAULT_Y 300
0e320a79
DW
34
35// Lists to keep track of windows, so we can disable/enable them
36// for modal dialogs
27476f73
DW
37wxWindowList wxModalDialogs;
38wxWindowList wxModelessWindows; // Frames and modeless dialogs
39extern wxList WXDLLEXPORT wxPendingDelete;
0e320a79
DW
40
41#if !USE_SHARED_LIBRARY
27476f73
DW
42 IMPLEMENT_DYNAMIC_CLASS(wxDialog, wxPanel)
43
44 BEGIN_EVENT_TABLE(wxDialog, wxPanel)
45 EVT_SIZE(wxDialog::OnSize)
46 EVT_BUTTON(wxID_OK, wxDialog::OnOK)
47 EVT_BUTTON(wxID_APPLY, wxDialog::OnApply)
48 EVT_BUTTON(wxID_CANCEL, wxDialog::OnCancel)
49 EVT_CHAR_HOOK(wxDialog::OnCharHook)
50 EVT_SYS_COLOUR_CHANGED(wxDialog::OnSysColourChanged)
51 EVT_CLOSE(wxDialog::OnCloseWindow)
52 END_EVENT_TABLE()
0e320a79
DW
53#endif
54
55wxDialog::wxDialog()
56{
27476f73
DW
57 m_isShown = FALSE;
58 m_modalShowing = FALSE;
59
0e320a79
DW
60 SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE));
61}
62
63bool wxDialog::Create(wxWindow *parent, wxWindowID id,
64 const wxString& title,
65 const wxPoint& pos,
66 const wxSize& size,
67 long style,
68 const wxString& name)
69{
27476f73
DW
70#if wxUSE_TOOLTIPS
71 m_hwndToolTip = 0;
72#endif
0e320a79 73
27476f73
DW
74 SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE));
75 SetName(name);
0e320a79 76
27476f73
DW
77 if (!parent)
78 wxTopLevelWindows.Append(this);
0e320a79 79
27476f73 80 if (parent) parent->AddChild(this);
0e320a79 81
27476f73
DW
82 if ( id == -1 )
83 m_windowId = (int)NewControlId();
84 else
85 m_windowId = id;
86
87 int x = pos.x;
88 int y = pos.y;
89 int width = size.x;
90 int height = size.y;
91
92 if (x < 0) x = wxDIALOG_DEFAULT_X;
93 if (y < 0) y = wxDIALOG_DEFAULT_Y;
94
95 m_windowStyle = style;
96
97 m_isShown = FALSE;
98 m_modalShowing = FALSE;
99
100 if (width < 0)
101 width = 500;
102 if (height < 0)
103 height = 500;
104
105 // TODO: convert below to OS/2 PM code
106
107 // All dialogs should really have this style
108// m_windowStyle |= wxTAB_TRAVERSAL;
109//
110// WXDWORD extendedStyle = MakeExtendedStyle(m_windowStyle);
111// if (m_windowStyle & wxSTAY_ON_TOP)
112// extendedStyle |= WS_EX_TOPMOST;
113//
114 // Allows creation of dialogs with & without captions under MSWindows,
115 // resizeable or not (but a resizeable dialog always has caption -
116 // otherwise it would look too strange)
117// const wxChar *dlg;
118// if ( style & wxRESIZE_BORDER )
119// dlg = T("wxResizeableDialog");
120// else if ( style & wxCAPTION )
121// dlg = T("wxCaptionDialog");
122// else
123// dlg = T("wxNoCaptionDialog");
124// MSWCreate(m_windowId, parent, NULL, this, NULL,
125// x, y, width, height,
126// 0, // style is not used if we have dlg template
127// dlg,
128// extendedStyle);
129//
130// HWND hwnd = (HWND)GetHWND();
131//
132// if ( !hwnd )
133// {
134// wxLogError(T("Failed to create dialog."));
135//
136// return FALSE;
137// }
138//
139// SubclassWin(GetHWND());
140//
141// SetWindowText(hwnd, title);
142// SetFont(wxSystemSettings::GetSystemFont(wxSYS_DEFAULT_GUI_FONT));
143//
144 return TRUE;
0e320a79
DW
145}
146
147void wxDialog::SetModal(bool flag)
148{
27476f73
DW
149 if ( flag )
150 m_windowStyle |= wxDIALOG_MODAL ;
151 else if ( m_windowStyle & wxDIALOG_MODAL )
152 m_windowStyle -= wxDIALOG_MODAL ;
153
154 wxModelessWindows.DeleteObject(this);
155 if (!flag)
156 wxModelessWindows.Append(this);
0e320a79
DW
157}
158
159wxDialog::~wxDialog()
160{
27476f73
DW
161 m_isBeingDeleted = TRUE;
162
0e320a79
DW
163 wxTopLevelWindows.DeleteObject(this);
164
27476f73
DW
165 Show(FALSE);
166
167 if (m_modalShowing)
168 {
169 if (GetParent() && GetParent()->GetHWND())
170 // TODO: bring the parent to the top
171 return;
172 }
173
174 m_modalShowing = FALSE;
0e320a79 175 if ( (GetWindowStyleFlag() & wxDIALOG_MODAL) != wxDIALOG_MODAL )
27476f73
DW
176 wxModelessWindows.DeleteObject(this);
177
0e320a79
DW
178
179 // If this is the last top-level window, exit.
180 if (wxTheApp && (wxTopLevelWindows.Number() == 0))
181 {
182 wxTheApp->SetTopWindow(NULL);
183
184 if (wxTheApp->GetExitOnFrameDelete())
185 {
186 // TODO: exit
187 }
188 }
189}
190
191// By default, pressing escape cancels the dialog
192void wxDialog::OnCharHook(wxKeyEvent& event)
193{
27476f73
DW
194 if (GetHWND())
195 {
196 if (event.m_keyCode == WXK_ESCAPE)
197 {
198 // Behaviour changed in 2.0: we'll send a Cancel message
199 // to the dialog instead of Close.
200 wxCommandEvent cancelEvent(wxEVT_COMMAND_BUTTON_CLICKED, wxID_CANCEL);
201 cancelEvent.SetEventObject( this );
202 GetEventHandler()->ProcessEvent(cancelEvent);
0e320a79 203
27476f73
DW
204 return;
205 }
206 }
207 // We didn't process this event.
208 event.Skip();
209}
210
211void wxDialog::OnPaint(wxPaintEvent& event)
212{
213 // No: if you call the default procedure, it makes
214 // the following painting code not work.
215// wxWindow::OnPaint(event);
216}
217
218void wxDialog::Fit()
219{
220 wxWindow::Fit();
0e320a79
DW
221}
222
223void wxDialog::Iconize(bool WXUNUSED(iconize))
224{
27476f73 225 // Windows dialog boxes can't be iconized
0e320a79
DW
226}
227
228bool wxDialog::IsIconized() const
229{
0e320a79
DW
230 return FALSE;
231}
232
27476f73
DW
233void wxDialog::DoSetClientSize(int width, int height)
234{
235 // TODO: Convert the below to OS/2 PM code
236
237// HWND hWnd = (HWND) GetHWND();
238// RECT rect;
239// ::GetClientRect(hWnd, &rect);
240//
241// RECT rect2;
242// GetWindowRect(hWnd, &rect2);
243//
244 // Find the difference between the entire window (title bar and all)
245 // and the client area; add this to the new client size to move the
246 // window
247// int actual_width = rect2.right - rect2.left - rect.right + width;
248// int actual_height = rect2.bottom - rect2.top - rect.bottom + height;
249
250// MoveWindow(hWnd, rect2.left, rect2.top, actual_width, actual_height, TRUE);
251//
252// wxSizeEvent event(wxSize(actual_width, actual_height), m_windowId);
253// event.SetEventObject( this );
254// GetEventHandler()->ProcessEvent(event);
255}
0e320a79
DW
256void wxDialog::GetPosition(int *x, int *y) const
257{
27476f73
DW
258 // TODO: Convert
259// HWND hWnd = (HWND) GetHWND();
260// RECT rect;
261// GetWindowRect(hWnd, &rect);
262
263// *x = rect.left;
264// *y = rect.top;
265}
266
267bool wxDialog::IsShown() const
268{
269 return m_isShown;
270}
271
272bool wxDialog::IsModal() const
273{
274 return wxModalDialogs.Find((wxDialog *)this) != 0; // const_cast
0e320a79
DW
275}
276
277bool wxDialog::Show(bool show)
278{
27476f73 279 // TODO: This is involved code, look at msw port for details
0e320a79
DW
280 return FALSE;
281}
282
283void wxDialog::SetTitle(const wxString& title)
284{
27476f73 285 ::WinSetWindowText((HWND) GetHWND(), title.c_str());
0e320a79
DW
286}
287
288wxString wxDialog::GetTitle() const
289{
27476f73
DW
290 ::WinQueryWindowText((HWND) GetHWND(), 1000, wxBuffer);
291 return wxString(wxBuffer);
0e320a79
DW
292}
293
294void wxDialog::Centre(int direction)
295{
296 int x_offset,y_offset ;
297 int display_width, display_height;
298 int width, height, x, y;
299 wxWindow *parent = GetParent();
300 if ((direction & wxCENTER_FRAME) && parent)
301 {
302 parent->GetPosition(&x_offset,&y_offset) ;
303 parent->GetSize(&display_width,&display_height) ;
304 }
305 else
306 {
307 wxDisplaySize(&display_width, &display_height);
308 x_offset = 0 ;
309 y_offset = 0 ;
310 }
311
312 GetSize(&width, &height);
313 GetPosition(&x, &y);
314
315 if (direction & wxHORIZONTAL)
316 x = (int)((display_width - width)/2);
317 if (direction & wxVERTICAL)
318 y = (int)((display_height - height)/2);
319
320 SetSize(x+x_offset, y+y_offset, width, height);
321}
322
323// Replacement for Show(TRUE) for modal dialogs - returns return code
324int wxDialog::ShowModal()
325{
326 m_windowStyle |= wxDIALOG_MODAL;
27476f73
DW
327 Show(TRUE);
328 return GetReturnCode();
0e320a79
DW
329}
330
331void wxDialog::EndModal(int retCode)
332{
27476f73 333 SetReturnCode(retCode);
0e320a79 334 // TODO modal un-showing
27476f73 335 Show(FALSE);
0e320a79
DW
336}
337
27476f73
DW
338// Define for each class of dialog and control
339WXHBRUSH wxDialog::OnCtlColor(WXHDC pDC, WXHWND pWnd, WXUINT nCtlColor,
340 WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
341{
342 return 0;
343}
0e320a79
DW
344// Standard buttons
345void wxDialog::OnOK(wxCommandEvent& event)
346{
27476f73
DW
347 if ( Validate() && TransferDataFromWindow() )
348 {
0e320a79
DW
349 if ( IsModal() )
350 EndModal(wxID_OK);
351 else
352 {
27476f73
DW
353 SetReturnCode(wxID_OK);
354 this->Show(FALSE);
0e320a79 355 }
27476f73 356 }
0e320a79
DW
357}
358
359void wxDialog::OnApply(wxCommandEvent& event)
360{
27476f73
DW
361 if (Validate())
362 TransferDataFromWindow();
363 // TODO probably need to disable the Apply button until things change again
0e320a79
DW
364}
365
366void wxDialog::OnCancel(wxCommandEvent& event)
367{
368 if ( IsModal() )
369 EndModal(wxID_CANCEL);
370 else
371 {
372 SetReturnCode(wxID_CANCEL);
27476f73 373 this->Show(FALSE);
0e320a79
DW
374 }
375}
376
377void wxDialog::OnCloseWindow(wxCloseEvent& event)
378{
379 // We'll send a Cancel message by default,
380 // which may close the dialog.
381 // Check for looping if the Cancel event handler calls Close().
382
383 // Note that if a cancel button and handler aren't present in the dialog,
384 // nothing will happen when you close the dialog via the window manager, or
385 // via Close().
386 // We wouldn't want to destroy the dialog by default, since the dialog may have been
387 // created on the stack.
388 // However, this does mean that calling dialog->Close() won't delete the dialog
389 // unless the handler for wxID_CANCEL does so. So use Destroy() if you want to be
390 // sure to destroy the dialog.
391 // The default OnCancel (above) simply ends a modal dialog, and hides a modeless dialog.
392
393 static wxList closing;
c3d43472 394
0e320a79
DW
395 if ( closing.Member(this) )
396 return;
c3d43472 397
0e320a79 398 closing.Append(this);
c3d43472 399
0e320a79
DW
400 wxCommandEvent cancelEvent(wxEVT_COMMAND_BUTTON_CLICKED, wxID_CANCEL);
401 cancelEvent.SetEventObject( this );
402 GetEventHandler()->ProcessEvent(cancelEvent); // This may close the dialog
403
404 closing.DeleteObject(this);
405}
406
407// Destroy the window (delayed, if a managed window)
408bool wxDialog::Destroy()
409{
27476f73
DW
410 if (!wxPendingDelete.Member(this))
411 wxPendingDelete.Append(this);
412 return TRUE;
413}
414
415void wxDialog::OnSize(wxSizeEvent& WXUNUSED(event))
416{
417 // if we're using constraints - do use them
418 #if wxUSE_CONSTRAINTS
419 if ( GetAutoLayout() )
420 {
421 Layout();
422 }
423 #endif
0e320a79
DW
424}
425
426void wxDialog::OnSysColourChanged(wxSysColourChangedEvent& event)
427{
428 SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE));
429 Refresh();
430}
431
27476f73 432MRESULT wxDialog::OS2WindowProc(HWND hwnd, WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
0e320a79 433{
27476f73
DW
434 MRESULT rc = 0;
435 bool processed = FALSE;
436
437 switch ( message )
438 {
439 case WM_CLOSE:
440 // if we can't close, tell the system that we processed the
441 // message - otherwise it would close us
442 processed = !Close();
443 break;
444 }
445
446 if ( !processed )
447 rc = wxWindow::OS2WindowProc(hwnd, message, wParam, lParam);
448
449 return rc;
0e320a79 450}
27476f73 451