X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/6a9afc7adfa2ece7384ee5986854615f2ba6f723..b1d7de5ae0c53162b57ac20cfed04264f0f27b30:/src/cocoa/dialog.mm?ds=sidebyside diff --git a/src/cocoa/dialog.mm b/src/cocoa/dialog.mm index 3a3625556d..eede94cdfc 100644 --- a/src/cocoa/dialog.mm +++ b/src/cocoa/dialog.mm @@ -9,13 +9,21 @@ // Licence: wxWindows license ///////////////////////////////////////////////////////////////////////////// -#include "wx/dialog.h" -#include "wx/app.h" -#include "wx/settings.h" -#include "wx/log.h" +#include "wx/wxprec.h" +#ifndef WX_PRECOMP + #include "wx/log.h" + #include "wx/app.h" + #include "wx/dialog.h" + #include "wx/settings.h" +#endif //WX_PRECOMP + +#include "wx/cocoa/autorelease.h" +#include "wx/cocoa/string.h" #import #import +#import +#import // Lists to keep track of windows, so we can disable/enable them // for modal dialogs @@ -44,6 +52,7 @@ bool wxDialog::Create(wxWindow *parent, wxWindowID winid, long style, const wxString& name) { + wxAutoNSAutoreleasePool pool; wxTopLevelWindows.Append(this); if(!CreateBase(parent,winid,pos,size,style,wxDefaultValidator,name)) @@ -66,24 +75,23 @@ bool wxDialog::Create(wxWindow *parent, wxWindowID winid, // Because we do not release on close, the following release matches the // above alloc and thus the retain count will be 1. [m_cocoaNSWindow release]; - wxLogDebug("wxDialog m_cocoaNSWindow retainCount=%d",[m_cocoaNSWindow retainCount]); + wxLogTrace(wxTRACE_COCOA_RetainRelease,wxT("wxDialog m_cocoaNSWindow retainCount=%d"),[m_cocoaNSWindow retainCount]); + [m_cocoaNSWindow setTitle:wxNSStringWithWxString(title)]; + [m_cocoaNSWindow setHidesOnDeactivate:NO]; return true; } wxDialog::~wxDialog() { - wxLogDebug("Destroying"); - // setReleasedWhenClosed: NO - [m_cocoaNSWindow close]; - DisassociateNSPanel(m_cocoaNSWindow); + DisassociateNSPanel(GetNSPanel()); } -void wxDialog::Cocoa_close(void) +void wxDialog::CocoaDelegate_windowWillClose(void) { m_closed = true; /* Actually, this isn't true anymore */ - wxLogDebug("Woah: Dialogs are not generally closed"); + wxLogTrace(wxTRACE_COCOA,wxT("Woah: Dialogs are not generally closed")); } void wxDialog::SetModal(bool flag) @@ -102,24 +110,45 @@ void wxDialog::SetModal(bool flag) 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); - wxLogDebug("runModal"); + 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]; - wxLogDebug("runModal END"); + wxLogTrace(wxTRACE_COCOA,wxT("runModal END")); } else { - wxLogDebug("abortModal"); + wxLogTrace(wxTRACE_COCOA,wxT("abortModal")); [wxTheApp->GetNSApplication() abortModal]; wxModalDialogs.DeleteObject(this); } } + else + return wxTopLevelWindow::Show(show); return true; } @@ -166,13 +195,13 @@ void wxDialog::OnCloseWindow(wxCloseEvent& event) if ( closing.Member(this) ) { - wxLogDebug("WARNING: Attempting to recursively call Close for dialog"); + wxLogDebug(wxT("WARNING: Attempting to recursively call Close for dialog")); return; } closing.Append(this); - wxLogDebug("Sending Cancel Event"); + wxLogTrace(wxTRACE_COCOA,wxT("Sending Cancel Event")); wxCommandEvent cancelEvent(wxEVT_COMMAND_BUTTON_CLICKED, wxID_CANCEL); cancelEvent.SetEventObject( this ); GetEventHandler()->ProcessEvent(cancelEvent); // This may close the dialog @@ -198,7 +227,7 @@ void wxDialog::OnApply(wxCommandEvent& event) void wxDialog::OnCancel(wxCommandEvent& event) { - wxLogDebug("Cancelled!"); + wxLogTrace(wxTRACE_COCOA,wxT("Cancelled!")); EndModal(wxID_CANCEL); }