/////////////////////////////////////////////////////////////////////////////
-// Name: cocoa/menu.cpp
+// Name: src/cocoa/menu.cpp
// Purpose: wxMenu and wxMenuBar implementation
// Author: David Elliott
// Modified by:
// Created: 2002/12/09
-// RCS-ID: $Id:
+// RCS-ID: $Id$
// Copyright: (c) 2002 David Elliott
// Licence: wxWidgets licence
/////////////////////////////////////////////////////////////////////////////
// ----------------------------------------------------------------------------
#include "wx/wxprec.h"
+
+#include "wx/menu.h"
+
#ifndef WX_PRECOMP
- #include "wx/menu.h"
#include "wx/log.h"
#endif // WX_PRECOMP
#include "wx/cocoa/string.h"
#import <Foundation/NSString.h>
-#import <AppKit/NSMenu.h>
+#include "wx/cocoa/objc/NSMenu.h"
#if wxUSE_MENUS
bool wxMenu::Create(const wxString& title, long style)
{
wxAutoNSAutoreleasePool pool;
- m_cocoaNSMenu = [[NSMenu alloc] initWithTitle: wxNSStringWithWxString(title)];
+ m_cocoaNSMenu = [[WXNSMenu 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
// ============================================================================
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];