X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b2680ced12cbbed16990007c5fa3ea7730700122..47e175a24f862aa8b7ca7dd4a2bb5957991e7f2d:/src/osx/carbon/dialog.cpp?ds=sidebyside diff --git a/src/osx/carbon/dialog.cpp b/src/osx/carbon/dialog.cpp index c97b487fb6..42000d9a52 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,169 +20,22 @@ #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() +void wxDialog::EndWindowModal() { - m_isModalStyle = false; + // Nothing to do for now. } -bool wxDialog::Create( wxWindow *parent, - wxWindowID id, - const wxString& title, - const wxPoint& pos, - const wxSize& size, - long style, - const wxString& name ) +void wxDialog::DoShowWindowModal() { - SetExtraStyle( GetExtraStyle() | wxTOPLEVEL_EX_DIALOG ); - - // All dialogs should really have this style... - style |= wxTAB_TRAVERSAL; + // If someone wants to add support for this to wxOSX Carbon, here would + // be the place to start: http://trac.wxwidgets.org/ticket/9459 + // Unfortunately, supporting sheets in Carbon isn't as straightforward + // as with Cocoa, so it will probably take some tweaking. - // ...but not these styles - style &= ~(wxYES | wxOK | wxNO); // | wxCANCEL - - if ( !wxTopLevelWindow::Create( parent, id, title, pos, size, style, name ) ) - return false; - - return true; + m_modality = wxDIALOG_MODALITY_APP_MODAL; + ShowModal(); + SendWindowModalDialogEvent ( wxEVT_WINDOW_MODAL_DIALOG_CLOSED ); } - -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; -} - -void wxDialog::DoShowModal() -{ - wxCHECK_RET( !IsModal(), wxT("DoShowModal() called twice") ); - - wxModalDialogs.Append(this); - - SetFocus() ; - - WindowRef windowRef = (WindowRef) GetWXWindow(); - 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 ( IsModal() ) - { - wxTheApp->MacDoOneEvent() ; - // calls process idle itself - } - - EndAppModalStateForWindow(windowRef) ; - if ( resetGroupParent ) - { - 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); -} -