// 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 <AppKit/NSPanel.h>
#import <AppKit/NSApplication.h>
+#import <AppKit/NSEvent.h>
+#import <Foundation/NSRunLoop.h>
// Lists to keep track of windows, so we can disable/enable them
// for modal dialogs
long style,
const wxString& name)
{
+ wxAutoNSAutoreleasePool pool;
wxTopLevelWindows.Append(this);
if(!CreateBase(parent,winid,pos,size,style,wxDefaultValidator,name))
// 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];
- SetNSPanel(NULL);
+ 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)
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;
}
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
void wxDialog::OnCancel(wxCommandEvent& event)
{
- wxLogDebug("Cancelled!");
+ wxLogTrace(wxTRACE_COCOA,wxT("Cancelled!"));
EndModal(wxID_CANCEL);
}