Allow the wxMenu to be owned by the NSMenu so that it can be returned
from methods which Cocoa calls when a menu is to be popped up. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@29867 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -27,7 +27,9 @@ class WXDLLEXPORT wxMenu : public wxMenuBase, public wxCocoaNSMenu
|
|||||||
public:
|
public:
|
||||||
// ctors and dtor
|
// ctors and dtor
|
||||||
wxMenu(const wxString& title, long style = 0)
|
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);
|
bool Create(const wxString& title, long style = 0);
|
||||||
|
|
||||||
wxMenu(long style = 0) : wxMenuBase(style) { Create(wxEmptyString, style); }
|
wxMenu(long style = 0) : wxMenuBase(style) { Create(wxEmptyString, style); }
|
||||||
@@ -39,8 +41,11 @@ public:
|
|||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
public:
|
public:
|
||||||
inline WX_NSMenu GetNSMenu() { return m_cocoaNSMenu; }
|
inline WX_NSMenu GetNSMenu() { return m_cocoaNSMenu; }
|
||||||
|
void SetCocoaDeletes(bool cocoaDeletes);
|
||||||
|
virtual void Cocoa_dealloc();
|
||||||
protected:
|
protected:
|
||||||
WX_NSMenu m_cocoaNSMenu;
|
WX_NSMenu m_cocoaNSMenu;
|
||||||
|
bool m_cocoaDeletes;
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
// Implementation
|
// Implementation
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
|
@@ -45,11 +45,14 @@ bool wxMenu::Create(const wxString& title, long style)
|
|||||||
{
|
{
|
||||||
wxAutoNSAutoreleasePool pool;
|
wxAutoNSAutoreleasePool pool;
|
||||||
m_cocoaNSMenu = [[NSMenu alloc] initWithTitle: wxNSStringWithWxString(title)];
|
m_cocoaNSMenu = [[NSMenu alloc] initWithTitle: wxNSStringWithWxString(title)];
|
||||||
|
AssociateNSMenu(m_cocoaNSMenu);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
wxMenu::~wxMenu()
|
wxMenu::~wxMenu()
|
||||||
{
|
{
|
||||||
|
DisassociateNSMenu(m_cocoaNSMenu);
|
||||||
|
if(!m_cocoaDeletes)
|
||||||
[m_cocoaNSMenu release];
|
[m_cocoaNSMenu release];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -80,6 +83,33 @@ wxMenuItem* wxMenu::DoRemove(wxMenuItem *item)
|
|||||||
return retitem;
|
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
|
// wxMenuBar implementation
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
|
Reference in New Issue
Block a user