]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/dialog.cpp
Performance optimization
[wxWidgets.git] / src / mac / carbon / dialog.cpp
index f75fdfbd7a62605eee792d34249909d1228a27df..bb90e3812be7a6cb83f3cdfd81eca38da74de30b 100644 (file)
@@ -29,17 +29,6 @@ wxList wxModalDialogs;
 
 IMPLEMENT_DYNAMIC_CLASS(wxDialog, wxTopLevelWindow)
 
-BEGIN_EVENT_TABLE(wxDialog, wxDialogBase)
-  EVT_BUTTON(wxID_OK, wxDialog::OnOK)
-  EVT_BUTTON(wxID_APPLY, wxDialog::OnApply)
-  EVT_BUTTON(wxID_CANCEL, wxDialog::OnCancel)
-
-  EVT_SYS_COLOUR_CHANGED(wxDialog::OnSysColourChanged)
-
-  EVT_CLOSE(wxDialog::OnCloseWindow)
-END_EVENT_TABLE()
-
-
 void wxDialog::Init()
 {
     m_isModalStyle = false;
@@ -64,13 +53,6 @@ bool wxDialog::Create( wxWindow *parent,
     if ( !wxTopLevelWindow::Create( parent, id, title, pos, size, style, name ) )
         return false;
 
-#if TARGET_API_MAC_OSX
-    HIViewRef growBoxRef = 0 ;
-    OSStatus err = HIViewFindByID( HIViewGetRoot( (WindowRef)m_macWindow ), kHIViewWindowGrowBoxID, &growBoxRef  );
-    if ( err == noErr && growBoxRef != 0 )
-        HIGrowBoxViewSetTransparent( growBoxRef, true ) ;
-#endif
-
     return true;
 }
 
@@ -82,9 +64,7 @@ void wxDialog::SetModal( bool flag )
 
         wxModelessWindows.DeleteObject( this );
 
-#if TARGET_CARBON
         SetWindowModality( (WindowRef)MacGetWindowRef(), kWindowModalityAppModal, NULL ) ;
-#endif
     }
     else
     {
@@ -97,6 +77,8 @@ void wxDialog::SetModal( bool flag )
 wxDialog::~wxDialog()
 {
     m_isBeingDeleted = true;
+
+    // if the dialog is modal, this will end its event loop
     Show(false);
 }
 
@@ -117,21 +99,21 @@ bool wxDialog::IsModal() const
 }
 
 
-bool wxDialog::IsModalShowing() const
-{
-    return wxModalDialogs.Find((wxDialog *)this) != NULL; // const_cast
-}
-
 bool wxDialog::Show(bool show)
 {
     if ( !wxDialogBase::Show(show) )
         // nothing to do
         return false;
 
+    if (show && CanDoLayoutAdaptation())
+        DoLayoutAdaptation();
+
     if ( show )
         // usually will result in TransferDataToWindow() being called
         InitDialog();
 
+    HiliteMenu(0);
+
     if ( m_isModalStyle )
     {
         if ( show )
@@ -149,38 +131,39 @@ bool wxDialog::Show(bool show)
     return true;
 }
 
-#if !TARGET_CARBON
-extern bool s_macIsInModalLoop ;
-#endif
-
 void wxDialog::DoShowModal()
 {
-    wxCHECK_RET( !IsModalShowing(), wxT("DoShowModal() called twice") );
+    wxCHECK_RET( !IsModal(), wxT("DoShowModal() called twice") );
 
     wxModalDialogs.Append(this);
 
     SetFocus() ;
 
-#if TARGET_CARBON
-    BeginAppModalStateForWindow(  (WindowRef) MacGetWindowRef()) ;
-#else
-    // TODO : test whether parent gets disabled
-    bool formerModal = s_macIsInModalLoop ;
-    s_macIsInModalLoop = true ;
-#endif
+    WindowRef windowRef = (WindowRef) MacGetWindowRef();
+    WindowGroupRef windowGroup;
+    WindowGroupRef formerParentGroup;
+    bool resetGroupParent = false;
+
+    if ( GetParent() == NULL )
+    {
+        windowGroup = GetWindowGroup(windowRef) ;
+        formerParentGroup = GetWindowGroupParent( windowGroup );
+        SetWindowGroupParent( windowGroup, GetWindowGroupOfClass( kMovableModalWindowClass ) );
+        resetGroupParent = true;
+    }
+    BeginAppModalStateForWindow(windowRef) ;
 
-    while ( IsModalShowing() )
+    while ( IsModal() )
     {
         wxTheApp->MacDoOneEvent() ;
         // calls process idle itself
     }
 
-#if TARGET_CARBON
-    EndAppModalStateForWindow( (WindowRef) MacGetWindowRef() ) ;
-#else
-    // TODO probably reenable the parent window if any
-    s_macIsInModalLoop = formerModal ;
-#endif
+    EndAppModalStateForWindow(windowRef) ;
+    if ( resetGroupParent )
+    {
+        SetWindowGroupParent( windowGroup , formerParentGroup );
+    }
 }
 
 
@@ -204,58 +187,3 @@ void wxDialog::EndModal(int retCode)
     SetModal(false);
 }
 
-// Standard buttons
-void wxDialog::OnOK(wxCommandEvent& WXUNUSED(event))
-{
-  if ( Validate() && TransferDataFromWindow() )
-      EndModal(wxID_OK);
-}
-
-void wxDialog::OnApply(wxCommandEvent& WXUNUSED(event))
-{
-  if (Validate())
-      TransferDataFromWindow();
-
-  // TODO probably need to disable the Apply button until things change again
-}
-
-void wxDialog::OnCancel(wxCommandEvent& WXUNUSED(event))
-{
-    EndModal(wxID_CANCEL);
-}
-
-void wxDialog::OnCloseWindow(wxCloseEvent& WXUNUSED(event))
-{
-    // We'll send a Cancel message by default,
-    // which may close the dialog.
-    // Check for looping if the Cancel event handler calls Close().
-
-    // Note that if a cancel button and handler aren't present in the dialog,
-    // nothing will happen when you close the dialog via the window manager, or
-    // via Close().
-    // We wouldn't want to destroy the dialog by default, since the dialog may have been
-    // created on the stack.
-    // However, this does mean that calling dialog->Close() won't delete the dialog
-    // unless the handler for wxID_CANCEL does so. So use Destroy() if you want to be
-    // sure to destroy the dialog.
-    // The default OnCancel (above) simply ends a modal dialog, and hides a modeless dialog.
-
-    static wxList closing;
-
-    if ( closing.Member(this) )
-        return;
-
-    closing.Append(this);
-
-    wxCommandEvent cancelEvent(wxEVT_COMMAND_BUTTON_CLICKED, wxID_CANCEL);
-    cancelEvent.SetEventObject( this );
-    GetEventHandler()->ProcessEvent(cancelEvent); // This may close the dialog
-
-    closing.DeleteObject(this);
-}
-
-void wxDialog::OnSysColourChanged(wxSysColourChangedEvent& WXUNUSED(event))
-{
-  SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE));
-  Refresh();
-}