Rework modal dialog code to not depend on now obsolete wxDIALOG_MODAL flag.
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@26759 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -84,7 +84,8 @@ public:
|
|||||||
bool Show(bool show = true);
|
bool Show(bool show = true);
|
||||||
|
|
||||||
void SetModal(bool flag);
|
void SetModal(bool flag);
|
||||||
virtual bool IsModal() const;
|
virtual bool IsModal() const { return m_isModal; }
|
||||||
|
bool m_isModal;
|
||||||
|
|
||||||
// For now, same as Show(TRUE) but returns return code
|
// For now, same as Show(TRUE) but returns return code
|
||||||
virtual int ShowModal();
|
virtual int ShowModal();
|
||||||
|
@@ -42,6 +42,7 @@ WX_IMPLEMENT_COCOA_OWNER(wxDialog,NSPanel,NSWindow,NSWindow)
|
|||||||
|
|
||||||
void wxDialog::Init()
|
void wxDialog::Init()
|
||||||
{
|
{
|
||||||
|
m_isModal = false;
|
||||||
SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE));
|
SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -96,84 +97,84 @@ void wxDialog::CocoaDelegate_windowWillClose(void)
|
|||||||
|
|
||||||
void wxDialog::SetModal(bool flag)
|
void wxDialog::SetModal(bool flag)
|
||||||
{
|
{
|
||||||
if ( flag )
|
wxFAIL_MSG( wxT("wxDialog:SetModal obsolete now") );
|
||||||
{
|
|
||||||
wxModelessWindows.DeleteObject(this);
|
|
||||||
m_windowStyle |= wxDIALOG_MODAL ;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
m_windowStyle &= ~wxDIALOG_MODAL ;
|
|
||||||
wxModelessWindows.Append(this);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool wxDialog::Show(bool show)
|
bool wxDialog::Show(bool show)
|
||||||
{
|
{
|
||||||
if(m_isShown == show)
|
if(m_isShown == show)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if(show)
|
if(show)
|
||||||
InitDialog();
|
|
||||||
if(IsModal())
|
|
||||||
{
|
{
|
||||||
m_isShown = show;
|
wxAutoNSAutoreleasePool pool;
|
||||||
if(show)
|
InitDialog();
|
||||||
{
|
if(IsModal())
|
||||||
wxAutoNSAutoreleasePool pool;
|
{ // ShowModal() will show the dialog
|
||||||
wxModalDialogs.Append(this);
|
m_isShown = true;
|
||||||
wxLogTrace(wxTRACE_COCOA,wxT("runModal"));
|
return true;
|
||||||
NSApplication *theNSApp = wxTheApp->GetNSApplication();
|
|
||||||
// If the app hasn't started, flush the event queue
|
|
||||||
// If we don't do this, the Dock doesn't get the message that
|
|
||||||
// the app has started so will refuse to activate it.
|
|
||||||
if(![theNSApp isRunning])
|
|
||||||
{
|
|
||||||
while(NSEvent *event = [theNSApp
|
|
||||||
nextEventMatchingMask:NSAnyEventMask
|
|
||||||
untilDate:[NSDate distantPast]
|
|
||||||
inMode:NSDefaultRunLoopMode
|
|
||||||
dequeue: YES])
|
|
||||||
{
|
|
||||||
[theNSApp sendEvent: event];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
[wxTheApp->GetNSApplication() runModalForWindow:m_cocoaNSWindow];
|
|
||||||
wxLogTrace(wxTRACE_COCOA,wxT("runModal END"));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
wxLogTrace(wxTRACE_COCOA,wxT("abortModal"));
|
|
||||||
[wxTheApp->GetNSApplication() abortModal];
|
|
||||||
[m_cocoaNSWindow orderOut:m_cocoaNSWindow];
|
|
||||||
wxModalDialogs.DeleteObject(this);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
return wxTopLevelWindow::Show(show);
|
{
|
||||||
return true;
|
if(IsModal())
|
||||||
|
{ // this doesn't hide the dialog, base class Show(false) does.
|
||||||
|
wxLogTrace(wxTRACE_COCOA,wxT("abortModal"));
|
||||||
|
[wxTheApp->GetNSApplication() abortModal];
|
||||||
|
wxModalDialogs.DeleteObject(this);
|
||||||
|
m_isModal = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return wxTopLevelWindow::Show(show);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Replacement for Show(TRUE) for modal dialogs - returns return code
|
// Shows the dialog and begins a modal event loop. When the event loop
|
||||||
|
// is stopped (via EndModal()) it returns the exit code.
|
||||||
int wxDialog::ShowModal()
|
int wxDialog::ShowModal()
|
||||||
{
|
{
|
||||||
if(!IsModal())
|
wxCHECK_MSG(!IsModal(),GetReturnCode(),wxT("wxDialog::ShowModal called within its own modal loop"));
|
||||||
SetModal(true);
|
|
||||||
|
// Show(true) will set m_isShown = true
|
||||||
|
m_isShown = false;
|
||||||
|
m_isModal = true;
|
||||||
|
wxModalDialogs.Append(this);
|
||||||
|
|
||||||
|
wxLogTrace(wxTRACE_COCOA,wxT("runModal"));
|
||||||
|
NSApplication *theNSApp = wxTheApp->GetNSApplication();
|
||||||
|
// If the app hasn't started, flush the event queue
|
||||||
|
// If we don't do this, the Dock doesn't get the message that
|
||||||
|
// the app has started so will refuse to activate it.
|
||||||
|
if(![theNSApp isRunning])
|
||||||
|
{
|
||||||
|
// We should only do a few iterations so one pool should be okay
|
||||||
|
wxAutoNSAutoreleasePool pool;
|
||||||
|
while(NSEvent *event = [theNSApp
|
||||||
|
nextEventMatchingMask:NSAnyEventMask
|
||||||
|
untilDate:[NSDate distantPast]
|
||||||
|
inMode:NSDefaultRunLoopMode
|
||||||
|
dequeue: YES])
|
||||||
|
{
|
||||||
|
[theNSApp sendEvent: event];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Show(true);
|
Show(true);
|
||||||
|
do {
|
||||||
|
wxAutoNSAutoreleasePool pool;
|
||||||
|
[wxTheApp->GetNSApplication() runModalForWindow:m_cocoaNSWindow];
|
||||||
|
} while(0);
|
||||||
|
wxLogTrace(wxTRACE_COCOA,wxT("runModal END"));
|
||||||
|
|
||||||
return GetReturnCode();
|
return GetReturnCode();
|
||||||
}
|
}
|
||||||
|
|
||||||
// EndModal will work for any dialog
|
|
||||||
void wxDialog::EndModal(int retCode)
|
void wxDialog::EndModal(int retCode)
|
||||||
{
|
{
|
||||||
|
wxASSERT(IsModal(), wxT("EndModal() should only be used within ShowModal()"));
|
||||||
SetReturnCode(retCode);
|
SetReturnCode(retCode);
|
||||||
Show(false);
|
Show(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool wxDialog::IsModal() const
|
|
||||||
{
|
|
||||||
return (GetWindowStyleFlag() & wxDIALOG_MODAL);
|
|
||||||
}
|
|
||||||
|
|
||||||
void wxDialog::OnCloseWindow(wxCloseEvent& event)
|
void wxDialog::OnCloseWindow(wxCloseEvent& event)
|
||||||
{
|
{
|
||||||
// We'll send a Cancel message by default,
|
// We'll send a Cancel message by default,
|
||||||
|
Reference in New Issue
Block a user