1 ///////////////////////////////////////////////////////////////////////////// 
   2 // Name:        src/os2/dialog.cpp 
   3 // Purpose:     wxDialog class 
   4 // Author:      David Webster 
   8 // Copyright:   (c) David Webster 
   9 // Licence:     wxWindows licence 
  10 ///////////////////////////////////////////////////////////////////////////// 
  12 // For compilers that support precompilation, includes "wx.h". 
  13 #include "wx/wxprec.h" 
  15 #include "wx/dialog.h" 
  21     #include "wx/settings.h" 
  26 #include "wx/os2/private.h" 
  27 #include "wx/evtloop.h" 
  28 #include "wx/scopedptr.h" 
  30 #define wxDIALOG_DEFAULT_X 300 
  31 #define wxDIALOG_DEFAULT_Y 300 
  33 #define wxDIALOG_DEFAULT_WIDTH 500 
  34 #define wxDIALOG_DEFAULT_HEIGHT 500 
  36 IMPLEMENT_DYNAMIC_CLASS(wxDialog
, wxTopLevelWindow
) 
  38 // ---------------------------------------------------------------------------- 
  40 // ---------------------------------------------------------------------------- 
  42 // this is simply a container for any data we need to implement modality which 
  43 // allows us to avoid changing wxDialog each time the implementation changes 
  44 class wxDialogModalData
 
  47     wxDialogModalData(wxDialog 
*dialog
) : m_evtLoop(dialog
) { } 
  60     wxModalEventLoop m_evtLoop
; 
  63 wxDEFINE_TIED_SCOPED_PTR_TYPE(wxDialogModalData
); 
  65 // ============================================================================ 
  67 // ============================================================================ 
  69 // ---------------------------------------------------------------------------- 
  70 // wxDialog construction 
  71 // ---------------------------------------------------------------------------- 
  77     m_pWindowDisabler 
= NULL
; 
  79     SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE
)); 
  80 } // end of wxDialog::Init 
  82 bool wxDialog::Create( wxWindow
*       pParent
, 
  84                        const wxString
& rsTitle
, 
  88                        const wxString
& rsName 
) 
  91     SetExtraStyle(GetExtraStyle() | wxTOPLEVEL_EX_DIALOG
); 
  94     // Save focus before doing anything which can potentially change it 
  96     m_pOldFocus 
= FindFocus(); 
  99     // All dialogs should really have this style 
 101     lStyle 
|= wxTAB_TRAVERSAL
; 
 103     if (!wxTopLevelWindow::Create( pParent
 
 113     SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT
)); 
 116     // Must defer setting the title until after dialog is created and sized 
 118     if (!rsTitle
.IsNull()) 
 121 } // end of wxDialog::Create 
 123 #if WXWIN_COMPATIBILITY_2_6 
 126 wxDialog::wxDialog(wxWindow 
*parent
, 
 127                    const wxString
& title
, 
 128                    bool WXUNUSED(modal
), 
 134                    const wxString
& name
) 
 138     Create(parent
, wxID_ANY
, title
, wxPoint(x
, y
), wxSize(w
, h
), style
, name
); 
 141 void wxDialog::SetModal(bool WXUNUSED(bFlag
)) 
 143     // nothing to do, obsolete method 
 144 } // end of wxDialog::SetModal 
 146 #endif // WXWIN_COMPATIBILITY_2_6 
 148 wxDialog::~wxDialog() 
 152     // this will also reenable all the other windows for a modal dialog 
 154 } // end of wxDialog::~wxDialog 
 156 // ---------------------------------------------------------------------------- 
 157 // showing the dialogs 
 158 // ---------------------------------------------------------------------------- 
 160 #if WXWIN_COMPATIBILITY_2_6 
 162 bool wxDialog::IsModalShowing() const 
 165 } // end of wxDialog::IsModalShowing 
 167 #endif // WXWIN_COMPATIBILITY_2_6 
 169 wxWindow 
*wxDialog::FindSuitableParent() const 
 171     // first try to use the currently active window 
 172     HWND hwndFg 
= ::WinQueryActiveWindow(HWND_DESKTOP
); 
 173     wxWindow 
*parent 
= hwndFg 
? wxFindWinFromHandle((WXHWND
)hwndFg
) 
 177         // next try the main app window 
 178         parent 
= wxTheApp
->GetTopWindow(); 
 181     // finally, check if the parent we found is really suitable 
 182     if ( !parent 
|| parent 
== (wxWindow 
*)this || !parent
->IsShown() ) 
 184         // don't use this one 
 191 bool wxDialog::Show( bool bShow 
) 
 193     if ( bShow 
== IsShown() ) 
 196     if (!bShow 
&& m_modalData 
) 
 198         // we need to do this before calling wxDialogBase version because if we 
 199         // had disabled other app windows, they must be reenabled right now as 
 200         // if they stay disabled Windows will activate another window (one 
 201         // which is enabled, anyhow) when we're hidden in the base class Show() 
 202         // and we will lose activation 
 203         m_modalData
->ExitLoop(); 
 205         if (m_pWindowDisabler
) 
 207             delete m_pWindowDisabler
; 
 208             m_pWindowDisabler 
= NULL
; 
 215         if (CanDoLayoutAdaptation()) 
 216             DoLayoutAdaptation(); 
 218         // this usually will result in TransferDataToWindow() being called 
 219         // which will change the controls values so do it before showing as 
 220         // otherwise we could have some flicker 
 224     wxDialogBase::Show(bShow
); 
 226     wxString title 
= GetTitle(); 
 228         ::WinSetWindowText((HWND
)GetHwnd(), title
.c_str()); 
 232         // dialogs don't get WM_SIZE message after creation unlike most (all?) 
 233         // other windows and so could start their life not laid out correctly 
 234         // if we didn't call Layout() from here 
 236         // NB: normally we should call it just the first time but doing it 
 237         //     every time is simpler than keeping a flag 
 242 } // end of wxDialog::Show 
 245 // Replacement for Show(true) for modal dialogs - returns return code 
 247 int wxDialog::ShowModal() 
 249     wxASSERT_MSG( !IsModal(), _T("wxDialog::ShowModal() reentered?") ); 
 251     m_endModalCalled 
= false; 
 255     // EndModal may have been called from InitDialog handler (called from 
 256     // inside Show()), which would cause an infinite loop if we didn't take it 
 258     if ( !m_endModalCalled 
) 
 260         // modal dialog needs a parent window, so try to find one 
 261         wxWindow 
*parent 
= GetParent(); 
 264             parent 
= FindSuitableParent(); 
 267         // remember where the focus was 
 268         wxWindow 
*oldFocus 
= m_pOldFocus
; 
 271             // VZ: do we really want to do this? 
 275         // We have to remember the HWND because we need to check 
 276         // the HWND still exists (oldFocus can be garbage when the dialog 
 277         // exits, if it has been destroyed) 
 278         HWND hwndOldFocus 
= oldFocus 
? GetHwndOf(oldFocus
) : NULL
; 
 282         // Before entering the modal loop, reset the "is in OnIdle()" flag (see 
 283         // comment in app.cpp) 
 285         extern bool                     gbInOnIdle
; 
 286         bool                            bWasInOnIdle 
= gbInOnIdle
; 
 290         // enter and run the modal loop 
 292             wxDialogModalDataTiedPtr 
modalData(&m_modalData
, 
 293                                                new wxDialogModalData(this)); 
 294             modalData
->RunLoop(); 
 296         gbInOnIdle 
= bWasInOnIdle
; 
 299         // Note that this code MUST NOT access the dialog object's data 
 300         // in case the object has been deleted (which will be the case 
 301         // for a modal dialog that has been destroyed before calling EndModal). 
 302         if ( oldFocus 
&& (oldFocus 
!= this) && ::WinIsWindow(vHabmain
, hwndOldFocus
)) 
 304             // This is likely to prove that the object still exists 
 305             if (wxFindWinFromHandle((WXHWND
) hwndOldFocus
) == oldFocus
) 
 306                 oldFocus
->SetFocus(); 
 310     return GetReturnCode(); 
 311 } // end of wxDialog::ShowModal 
 313 void wxDialog::EndModal( 
 317     wxASSERT_MSG( IsModal(), _T("EndModal() called for non modal dialog") ); 
 319     m_endModalCalled 
= true; 
 320     SetReturnCode(nRetCode
); 
 323 } // end of wxDialog::EndModal 
 325 MRESULT 
wxDialog::OS2WindowProc( WXUINT uMessage
, WXWPARAM wParam
, WXLPARAM lParam 
) 
 328     bool     bProcessed 
= false; 
 334             // If we can't close, tell the system that we processed the 
 335             // message - otherwise it would close us 
 337             bProcessed 
= !Close(); 
 342         rc 
= wxWindow::OS2WindowProc( uMessage
 
 347 } // end of wxDialog::OS2WindowProc