From: Kevin Ollivier Date: Sat, 23 Jan 2010 20:06:48 +0000 (+0000) Subject: Start on ShowWindowModal for OS X Cocoa. Not working properly as children do not... X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/9482c64466359ec7cfd201bebc3399ac4a56b4e6 Start on ShowWindowModal for OS X Cocoa. Not working properly as children do not display. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@63232 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/dialog.h b/include/wx/dialog.h index 51852d4953..4cc11bab8a 100644 --- a/include/wx/dialog.h +++ b/include/wx/dialog.h @@ -74,7 +74,7 @@ public: virtual bool IsModal() const = 0; // show the dialog frame-modally (needs a parent), using app-modal // dialogs on platforms that don't support it - virtual bool ShowWindowModal () ; + virtual void ShowWindowModal () ; virtual void SendWindowModalDialogEvent ( wxEventType type ); // Modal dialogs have a return code - usually the id of the last diff --git a/include/wx/osx/dialog.h b/include/wx/osx/dialog.h index 351f6b8aee..2544d290bb 100644 --- a/include/wx/osx/dialog.h +++ b/include/wx/osx/dialog.h @@ -55,6 +55,8 @@ public: // For now, same as Show(TRUE) but returns return code virtual int ShowModal(); + + virtual void ShowWindowModal(); // may be called to terminate the dialog with the given return code virtual void EndModal(int retCode); @@ -69,6 +71,9 @@ protected: // mac also takes command-period as cancel virtual bool IsEscapeKey(const wxKeyEvent& event); + // needed for cleanup on the Cocoa side. + void EndWindowModal(); + private: void Init(); diff --git a/src/osx/carbon/dialog.cpp b/src/osx/carbon/dialog.cpp index 9924b54b06..a177006380 100644 --- a/src/osx/carbon/dialog.cpp +++ b/src/osx/carbon/dialog.cpp @@ -25,6 +25,20 @@ extern wxList wxModalDialogs; +void wxDialog::EndWindowModal() +{ + // Nothing to do for now. +} + +void wxDialog::ShowWindowModal() +{ + // 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. + wxDialogBase::ShowWindowModal(); +} + void wxDialog::DoShowModal() { wxCHECK_RET( !IsModal(), wxT("DoShowModal() called twice") ); diff --git a/src/osx/cocoa/dialog.mm b/src/osx/cocoa/dialog.mm index ab4ed1e5c3..8976d677f5 100644 --- a/src/osx/cocoa/dialog.mm +++ b/src/osx/cocoa/dialog.mm @@ -24,6 +24,29 @@ extern wxList wxModalDialogs; +void wxDialog::ShowWindowModal() +{ + wxTopLevelWindow* parent = static_cast(wxGetTopLevelParent(GetParent())); + + wxASSERT_MSG(parent, "ShowWindowModal requires the dialog to have a parent."); + + NSWindow* parentWindow = parent->GetWXWindow(); + NSWindow* theWindow = GetWXWindow(); + + wxASSERT_MSG([theWindow styleMask] & NSDocModalWindowMask, "Window must have DocModal mask set."); + + [NSApp beginSheet: theWindow + modalForWindow: parentWindow + modalDelegate: theWindow + didEndSelector: nil + contextInfo: nil]; +} + +void wxDialog::EndWindowModal() +{ + [NSApp endSheet: GetWXWindow()]; +} + void wxDialog::DoShowModal() { wxCHECK_RET( !IsModal(), wxT("DoShowModal() called twice") ); diff --git a/src/osx/dialog_osx.cpp b/src/osx/dialog_osx.cpp index c51035b969..df4e2a4cc7 100644 --- a/src/osx/dialog_osx.cpp +++ b/src/osx/dialog_osx.cpp @@ -145,5 +145,10 @@ void wxDialog::EndModal(int retCode) SetReturnCode(retCode); Show(false); SetModal(false); + if (GetModality() == wxDIALOG_MODALITY_WINDOW_MODAL) + { + EndWindowModal(); // OS X implementation method for cleanup + SendWindowModalDialogEvent ( wxEVT_WINDOW_MODAL_DIALOG_CLOSED ); + } }