public:
// ctors and dtor
wxMenu(const wxString& title, long style = 0)
- : wxMenuBase(title, style) { Create(title,style); }
+ : wxMenuBase(title, style)
+ , m_cocoaDeletes(false)
+ { Create(title,style); }
bool Create(const wxString& title, long style = 0);
wxMenu(long style = 0) : wxMenuBase(style) { Create(wxEmptyString, style); }
// ------------------------------------------------------------------------
public:
inline WX_NSMenu GetNSMenu() { return m_cocoaNSMenu; }
+ void SetCocoaDeletes(bool cocoaDeletes);
+ virtual void Cocoa_dealloc();
protected:
WX_NSMenu m_cocoaNSMenu;
+ bool m_cocoaDeletes;
// ------------------------------------------------------------------------
// Implementation
// ------------------------------------------------------------------------
{
wxAutoNSAutoreleasePool pool;
m_cocoaNSMenu = [[NSMenu alloc] initWithTitle: wxNSStringWithWxString(title)];
+ AssociateNSMenu(m_cocoaNSMenu);
return true;
}
wxMenu::~wxMenu()
{
- [m_cocoaNSMenu release];
+ DisassociateNSMenu(m_cocoaNSMenu);
+ if(!m_cocoaDeletes)
+ [m_cocoaNSMenu release];
}
wxMenuItem* wxMenu::DoAppend(wxMenuItem *item)
return retitem;
}
+// This autoreleases the menu on the assumption that something is
+// going to retain it shortly (for instance, it is going to be returned from
+// an overloaded [NSStatusItem menu] or from the applicationDockMenu:
+// NSApplication delegate method.
+//
+// It then sets a bool flag m_cocoaDeletes. When the NSMenu is dealloc'd
+// (dealloc is the Cocoa destructor) we delete ourselves. In this manner we
+// can be available for Cocoa calls until Cocoa is finished with us.
+//
+// I can see very few reasons to undo this. Nevertheless, it is implemented.
+void wxMenu::SetCocoaDeletes(bool cocoaDeletes)
+{
+ if(m_cocoaDeletes==cocoaDeletes)
+ return;
+ m_cocoaDeletes = cocoaDeletes;
+ if(m_cocoaDeletes)
+ [m_cocoaNSMenu autorelease];
+ else
+ [m_cocoaNSMenu retain];
+}
+
+void wxMenu::Cocoa_dealloc()
+{
+ if(m_cocoaDeletes)
+ delete this;
+}
+
// ============================================================================
// wxMenuBar implementation
// ============================================================================