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:
David Elliott 2004-04-14 05:39:43 +00:00
parent ec8c39ed09
commit 90c108964c
2 changed files with 56 additions and 54 deletions

View File

@ -84,7 +84,8 @@ public:
bool Show(bool show = true);
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
virtual int ShowModal();

View File

@ -42,6 +42,7 @@ WX_IMPLEMENT_COCOA_OWNER(wxDialog,NSPanel,NSWindow,NSWindow)
void wxDialog::Init()
{
m_isModal = false;
SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE));
}
@ -96,84 +97,84 @@ void wxDialog::CocoaDelegate_windowWillClose(void)
void wxDialog::SetModal(bool flag)
{
if ( flag )
{
wxModelessWindows.DeleteObject(this);
m_windowStyle |= wxDIALOG_MODAL ;
}
else
{
m_windowStyle &= ~wxDIALOG_MODAL ;
wxModelessWindows.Append(this);
}
wxFAIL_MSG( wxT("wxDialog:SetModal obsolete now") );
}
bool wxDialog::Show(bool show)
{
if(m_isShown == show)
return false;
if(show)
InitDialog();
if(IsModal())
{
m_isShown = show;
if(show)
{
wxAutoNSAutoreleasePool pool;
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])
{
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);
wxAutoNSAutoreleasePool pool;
InitDialog();
if(IsModal())
{ // ShowModal() will show the dialog
m_isShown = true;
return true;
}
}
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()
{
if(!IsModal())
SetModal(true);
wxCHECK_MSG(!IsModal(),GetReturnCode(),wxT("wxDialog::ShowModal called within its own modal loop"));
// 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);
do {
wxAutoNSAutoreleasePool pool;
[wxTheApp->GetNSApplication() runModalForWindow:m_cocoaNSWindow];
} while(0);
wxLogTrace(wxTRACE_COCOA,wxT("runModal END"));
return GetReturnCode();
}
// EndModal will work for any dialog
void wxDialog::EndModal(int retCode)
{
wxASSERT(IsModal(), wxT("EndModal() should only be used within ShowModal()"));
SetReturnCode(retCode);
Show(false);
}
bool wxDialog::IsModal() const
{
return (GetWindowStyleFlag() & wxDIALOG_MODAL);
}
void wxDialog::OnCloseWindow(wxCloseEvent& event)
{
// We'll send a Cancel message by default,