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