X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b2680ced12cbbed16990007c5fa3ea7730700122..0aaa6ace7ede4240453251d6a1c84c918c54c321:/src/osx/carbon/dialog.cpp diff --git a/src/osx/carbon/dialog.cpp b/src/osx/carbon/dialog.cpp index c97b487fb6..9924b54b06 100644 --- a/src/osx/carbon/dialog.cpp +++ b/src/osx/carbon/dialog.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: src/mac/carbon/dialog.cpp +// Name: src/osx/carbon/dialog.cpp // Purpose: wxDialog class // Author: Stefan Csomor // Modified by: @@ -20,112 +20,10 @@ #include "wx/settings.h" #endif // WX_PRECOMP -#include "wx/osx/uma.h" +#include "wx/osx/private.h" +#include "wx/evtloop.h" - -// Lists to keep track of windows, so we can disable/enable them -// for modal dialogs -wxList wxModalDialogs; - -IMPLEMENT_DYNAMIC_CLASS(wxDialog, wxTopLevelWindow) - -void wxDialog::Init() -{ - m_isModalStyle = false; -} - -bool wxDialog::Create( wxWindow *parent, - wxWindowID id, - const wxString& title, - const wxPoint& pos, - const wxSize& size, - long style, - const wxString& name ) -{ - SetExtraStyle( GetExtraStyle() | wxTOPLEVEL_EX_DIALOG ); - - // All dialogs should really have this style... - style |= wxTAB_TRAVERSAL; - - // ...but not these styles - style &= ~(wxYES | wxOK | wxNO); // | wxCANCEL - - if ( !wxTopLevelWindow::Create( parent, id, title, pos, size, style, name ) ) - return false; - - return true; -} - -void wxDialog::SetModal( bool flag ) -{ - if ( flag ) - { - m_isModalStyle = true; - - SetWindowModality( (WindowRef)GetWXWindow(), kWindowModalityAppModal, NULL ) ; - } - else - { - m_isModalStyle = false; - } -} - -wxDialog::~wxDialog() -{ - m_isBeingDeleted = true; - - // if the dialog is modal, this will end its event loop - Show(false); -} - -// On mac command-stop does the same thing as Esc, let the base class know -// about it -bool wxDialog::IsEscapeKey(const wxKeyEvent& event) -{ - if ( event.GetKeyCode() == '.' && event.GetModifiers() == wxMOD_CMD ) - return true; - - return wxDialogBase::IsEscapeKey(event); -} - -bool wxDialog::IsModal() const -{ - return wxModalDialogs.Find((wxDialog *)this) != NULL; // const_cast - // return m_isModalStyle; -} - - -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 ) - { - DoShowModal(); - } - else // end of modal dialog - { - // this will cause IsModalShowing() return false and our local - // message loop will terminate - wxModalDialogs.DeleteObject(this); - } - } - - return true; -} +extern wxList wxModalDialogs; void wxDialog::DoShowModal() { @@ -136,24 +34,28 @@ void wxDialog::DoShowModal() SetFocus() ; WindowRef windowRef = (WindowRef) GetWXWindow(); - WindowGroupRef windowGroup; - WindowGroupRef formerParentGroup; + WindowGroupRef windowGroup = NULL; + WindowGroupRef formerParentGroup = NULL; bool resetGroupParent = false; if ( GetParent() == NULL ) { windowGroup = GetWindowGroup(windowRef) ; - formerParentGroup = GetWindowGroupParent( windowGroup ); - SetWindowGroupParent( windowGroup, GetWindowGroupOfClass( kMovableModalWindowClass ) ); - resetGroupParent = true; + if ( windowGroup != GetWindowGroupOfClass( kMovableModalWindowClass ) ) + { + formerParentGroup = GetWindowGroupParent( windowGroup ); + SetWindowGroupParent( windowGroup, GetWindowGroupOfClass( kMovableModalWindowClass ) ); + resetGroupParent = true; + } } BeginAppModalStateForWindow(windowRef) ; +#if wxUSE_CONSOLE_EVENTLOOP + wxEventLoopGuarantor ensureHasLoop; +#endif + wxEventLoopBase * const loop = wxEventLoop::GetActive(); while ( IsModal() ) - { - wxTheApp->MacDoOneEvent() ; - // calls process idle itself - } + loop->Dispatch(); EndAppModalStateForWindow(windowRef) ; if ( resetGroupParent ) @@ -161,28 +63,3 @@ void wxDialog::DoShowModal() SetWindowGroupParent( windowGroup , formerParentGroup ); } } - - -// Replacement for Show(true) for modal dialogs - returns return code -int wxDialog::ShowModal() -{ - if ( !m_isModalStyle ) - SetModal(true); - - if ( IsShown() ) - DoShowModal(); - else - Show(true); - - return GetReturnCode(); -} - -// NB: this function (surprizingly) may be called for both modal and modeless -// dialogs and should work for both of them -void wxDialog::EndModal(int retCode) -{ - SetReturnCode(retCode); - Show(false); - SetModal(false); -} -