]> git.saurik.com Git - wxWidgets.git/blobdiff - src/cocoa/menu.mm
check the validity of wxString pointer itself too
[wxWidgets.git] / src / cocoa / menu.mm
index dee38021275ed768f822d47a973b0494a392ab63..fc5e4b038cfad1667e76852743ee82ac1c58e9fa 100644 (file)
@@ -45,12 +45,15 @@ bool wxMenu::Create(const wxString& title, long style)
 {
     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)
@@ -80,6 +83,33 @@ wxMenuItem* wxMenu::DoRemove(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
 // ============================================================================
@@ -98,6 +128,17 @@ bool wxMenuBar::Create(long style)
     return true;
 }
 
+wxMenuBar::wxMenuBar(size_t n,
+                     wxMenu *menus[],
+                     const wxString titles[],
+                     long style)
+{
+    Create(style);
+
+    for ( size_t i = 0; i < n; ++i )
+        Append(menus[i], titles[i]);
+}
+
 wxMenuBar::~wxMenuBar()
 {
     [m_cocoaNSMenu release];