1 ///////////////////////////////////////////////////////////////////////////// 
   3 // Purpose:     wxDialog class 
   8 // Copyright:   (c) AUTHOR 
   9 // Licence:     wxWindows licence 
  10 ///////////////////////////////////////////////////////////////////////////// 
  13 #pragma implementation "dialog.h" 
  16 #include "wx/dialog.h" 
  20 #include "wx/settings.h" 
  22 // Lists to keep track of windows, so we can disable/enable them 
  24 wxList wxModalDialogs
; 
  25 wxList wxModelessWindows
;  // Frames and modeless dialogs 
  26 extern wxList wxPendingDelete
; 
  28 #if !USE_SHARED_LIBRARY 
  29 IMPLEMENT_DYNAMIC_CLASS(wxDialog
, wxPanel
) 
  31 BEGIN_EVENT_TABLE(wxDialog
, wxPanel
) 
  32   EVT_BUTTON(wxID_OK
, wxDialog::OnOK
) 
  33   EVT_BUTTON(wxID_APPLY
, wxDialog::OnApply
) 
  34   EVT_BUTTON(wxID_CANCEL
, wxDialog::OnCancel
) 
  35   EVT_CHAR_HOOK(wxDialog::OnCharHook
) 
  36   EVT_SYS_COLOUR_CHANGED(wxDialog::OnSysColourChanged
) 
  37   EVT_CLOSE(wxDialog::OnCloseWindow
) 
  44     SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE
)); 
  47 bool wxDialog::Create(wxWindow 
*parent
, wxWindowID id
, 
  48            const wxString
& title
, 
  54   m_windowStyle 
= style
; 
  56   SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE
)); 
  60     wxTopLevelWindows
.Append(this); 
  62   if (parent
) parent
->AddChild(this); 
  65         m_windowId 
= (int)NewControlId(); 
  69   // TODO: create dialog 
  74 void wxDialog::SetModal(bool flag
) 
  77                 m_windowStyle 
|= wxDIALOG_MODAL 
; 
  79                 if ( m_windowStyle 
& wxDIALOG_MODAL 
) 
  80                         m_windowStyle 
-= wxDIALOG_MODAL 
; 
  82   wxModelessWindows
.DeleteObject(this); 
  84     wxModelessWindows
.Append(this); 
  90     wxTopLevelWindows
.DeleteObject(this); 
  92     if ( (GetWindowStyleFlag() & wxDIALOG_MODAL
) != wxDIALOG_MODAL 
) 
  93       wxModelessWindows
.DeleteObject(this); 
  95     // If this is the last top-level window, exit. 
  96     if (wxTheApp 
&& (wxTopLevelWindows
.Number() == 0)) 
  98       wxTheApp
->SetTopWindow(NULL
); 
 100       if (wxTheApp
->GetExitOnFrameDelete()) 
 107 // By default, pressing escape cancels the dialog 
 108 void wxDialog::OnCharHook(wxKeyEvent
& event
) 
 110   if (event
.m_keyCode 
== WXK_ESCAPE
) 
 112                 // Behaviour changed in 2.0: we'll send a Cancel message 
 113                 // to the dialog instead of Close. 
 114                 wxCommandEvent 
cancelEvent(wxEVT_COMMAND_BUTTON_CLICKED
, wxID_CANCEL
); 
 115                 cancelEvent
.SetEventObject( this ); 
 116                 GetEventHandler()->ProcessEvent(cancelEvent
); 
 120   // We didn't process this event. 
 124 void wxDialog::Iconize(bool WXUNUSED(iconize
)) 
 129 bool wxDialog::IsIconized() const 
 135 void wxDialog::SetClientSize(int width
, int height
) 
 140 void wxDialog::GetPosition(int *x
, int *y
) const 
 145 bool wxDialog::Show(bool show
) 
 151 void wxDialog::SetTitle(const wxString
& title
) 
 156 wxString 
wxDialog::GetTitle() const 
 162 void wxDialog::Centre(int direction
) 
 164   int x_offset
,y_offset 
; 
 165   int display_width
, display_height
; 
 166   int  width
, height
, x
, y
; 
 167   wxWindow 
*parent 
= GetParent(); 
 168   if ((direction 
& wxCENTER_FRAME
) && parent
) 
 170       parent
->GetPosition(&x_offset
,&y_offset
) ; 
 171       parent
->GetSize(&display_width
,&display_height
) ; 
 175     wxDisplaySize(&display_width
, &display_height
); 
 180   GetSize(&width
, &height
); 
 183   if (direction 
& wxHORIZONTAL
) 
 184     x 
= (int)((display_width 
- width
)/2); 
 185   if (direction 
& wxVERTICAL
) 
 186     y 
= (int)((display_height 
- height
)/2); 
 188   SetSize(x
+x_offset
, y
+y_offset
, width
, height
); 
 191 // Replacement for Show(TRUE) for modal dialogs - returns return code 
 192 int wxDialog::ShowModal() 
 194     m_windowStyle 
|= wxDIALOG_MODAL
; 
 195     // TODO: modal showing 
 197         return GetReturnCode(); 
 200 void wxDialog::EndModal(int retCode
) 
 202         SetReturnCode(retCode
); 
 203     // TODO modal un-showing 
 208 void wxDialog::OnOK(wxCommandEvent
& event
) 
 210         if ( Validate() && TransferDataFromWindow() ) 
 216                     SetReturnCode(wxID_OK
); 
 222 void wxDialog::OnApply(wxCommandEvent
& event
) 
 225                 TransferDataFromWindow(); 
 226         // TODO probably need to disable the Apply button until things change again 
 229 void wxDialog::OnCancel(wxCommandEvent
& event
) 
 232         EndModal(wxID_CANCEL
); 
 235         SetReturnCode(wxID_CANCEL
); 
 240 void wxDialog::OnCloseWindow(wxCloseEvent
& event
) 
 242     // We'll send a Cancel message by default, 
 243     // which may close the dialog. 
 244     // Check for looping if the Cancel event handler calls Close(). 
 246     // Note that if a cancel button and handler aren't present in the dialog, 
 247     // nothing will happen when you close the dialog via the window manager, or 
 249     // We wouldn't want to destroy the dialog by default, since the dialog may have been 
 250     // created on the stack. 
 251     // However, this does mean that calling dialog->Close() won't delete the dialog 
 252     // unless the handler for wxID_CANCEL does so. So use Destroy() if you want to be 
 253     // sure to destroy the dialog. 
 254     // The default OnCancel (above) simply ends a modal dialog, and hides a modeless dialog. 
 256     static wxList closing
; 
 258     if ( closing
.Member(this) ) 
 261     closing
.Append(this); 
 263     wxCommandEvent 
cancelEvent(wxEVT_COMMAND_BUTTON_CLICKED
, wxID_CANCEL
); 
 264     cancelEvent
.SetEventObject( this ); 
 265     GetEventHandler()->ProcessEvent(cancelEvent
); // This may close the dialog 
 267     closing
.DeleteObject(this); 
 270 // Destroy the window (delayed, if a managed window) 
 271 bool wxDialog::Destroy() 
 273   if (!wxPendingDelete
.Member(this)) 
 274     wxPendingDelete
.Append(this); 
 278 void wxDialog::OnSysColourChanged(wxSysColourChangedEvent
& event
) 
 280   SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE
));