Added wxMenuBarManager
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@23382 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
parent
cee0eb6e66
commit
268bec5aee
69
include/wx/cocoa/mbarman.h
Normal file
69
include/wx/cocoa/mbarman.h
Normal file
@ -0,0 +1,69 @@
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// Name: wx/cocoa/mbarman.h
|
||||
// Purpose: wxMenuBarManager class
|
||||
// Author: David Elliott
|
||||
// Modified by:
|
||||
// Created: 2003/09/04
|
||||
// RCS-ID: $Id$
|
||||
// Copyright: (c) 2003 David Elliott
|
||||
// Licence: wxWindows licence
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef __WX_COCOA_MBARMAN_H__
|
||||
#define __WX_COCOA_MBARMAN_H__
|
||||
|
||||
#if wxUSE_MENUS
|
||||
|
||||
#include "wx/toplevel.h"
|
||||
|
||||
// ========================================================================
|
||||
// wxMenuBarManager
|
||||
// ========================================================================
|
||||
class WXDLLEXPORT wxMenuBarManager : public wxObject
|
||||
{
|
||||
// ------------------------------------------------------------------------
|
||||
// initialization/destruction
|
||||
// ------------------------------------------------------------------------
|
||||
public:
|
||||
wxMenuBarManager();
|
||||
virtual ~wxMenuBarManager();
|
||||
// ------------------------------------------------------------------------
|
||||
// Single instance
|
||||
// ------------------------------------------------------------------------
|
||||
public:
|
||||
static wxMenuBarManager *GetInstance() { return sm_mbarmanInstance; }
|
||||
static void CreateInstance();
|
||||
static void DestroyInstance();
|
||||
protected:
|
||||
static wxMenuBarManager *sm_mbarmanInstance;
|
||||
// ------------------------------------------------------------------------
|
||||
// Implementation
|
||||
// ------------------------------------------------------------------------
|
||||
public:
|
||||
void SetMainMenuBar(wxMenuBar* menubar);
|
||||
void CocoaInternalIdle();
|
||||
void WindowDidBecomeKey(wxTopLevelWindowNative *win);
|
||||
void WindowDidResignKey(wxTopLevelWindowNative *win);
|
||||
void WindowDidBecomeMain(wxTopLevelWindowNative *win);
|
||||
void WindowDidResignMain(wxTopLevelWindowNative *win);
|
||||
void UpdateWindowMenuBar(wxTopLevelWindowNative *win);
|
||||
protected:
|
||||
void SetMenuBar(wxMenuBar* menubar);
|
||||
void InstallMenuBarForWindow(wxTopLevelWindowNative *win);
|
||||
void InstallMainMenu();
|
||||
WX_NSMenu m_menuApp;
|
||||
WX_NSMenu m_menuServices;
|
||||
WX_NSMenu m_menuWindows;
|
||||
WX_NSMenu m_menuMain;
|
||||
// Some menu bar needs to be installed
|
||||
bool m_needMenuBar;
|
||||
// Is main menu bar the current one
|
||||
bool m_mainMenuBarInstalled;
|
||||
// Main menu (if app provides one)
|
||||
wxMenuBar *m_mainMenuBar;
|
||||
wxTopLevelWindowNative *m_windowKey;
|
||||
wxTopLevelWindowNative *m_windowMain;
|
||||
};
|
||||
|
||||
#endif // wxUSE_MENUS
|
||||
#endif // _WX_COCOA_MBARMAN_H_
|
205
src/cocoa/mbarman.mm
Normal file
205
src/cocoa/mbarman.mm
Normal file
@ -0,0 +1,205 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Name: cocoa/mbarman.cpp
|
||||
// Purpose: wxMenuBarManager implementation
|
||||
// Author: David Elliott
|
||||
// Modified by:
|
||||
// Created: 2003/09/04
|
||||
// RCS-ID: $Id$
|
||||
// Copyright: (c) 2003 David Elliott
|
||||
// Licence: wxWindows licence
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "wx/wxprec.h"
|
||||
#if wxUSE_MENUS
|
||||
#ifndef WX_PRECOMP
|
||||
#include "wx/log.h"
|
||||
#include "wx/app.h"
|
||||
#include "wx/menu.h"
|
||||
#include "wx/toplevel.h"
|
||||
#endif // WX_PRECOMP
|
||||
|
||||
#include "wx/cocoa/mbarman.h"
|
||||
#include "wx/cocoa/autorelease.h"
|
||||
|
||||
#import <Foundation/NSString.h>
|
||||
#import <AppKit/NSMenu.h>
|
||||
#import <AppKit/NSApplication.h>
|
||||
|
||||
// ============================================================================
|
||||
// wxMenuBarManager
|
||||
// ============================================================================
|
||||
wxMenuBarManager *wxMenuBarManager::sm_mbarmanInstance = NULL;
|
||||
|
||||
wxMenuBarManager::wxMenuBarManager()
|
||||
{
|
||||
m_menuApp = nil;
|
||||
m_menuServices = nil;
|
||||
m_menuWindows = nil;
|
||||
m_menuMain = nil;
|
||||
m_needMenuBar = true;
|
||||
m_mainMenuBarInstalled = true;
|
||||
m_mainMenuBar = NULL;
|
||||
m_windowKey = NULL;
|
||||
m_windowMain = NULL;
|
||||
|
||||
NSApplication *theNSApplication = wxTheApp->GetNSApplication();
|
||||
// Create the services menu.
|
||||
m_menuServices = [[NSMenu alloc] initWithTitle: @"Services"];
|
||||
[theNSApplication setServicesMenu:m_menuServices];
|
||||
|
||||
NSMenuItem *menuitem;
|
||||
// Create the application (Apple) menu.
|
||||
m_menuApp = [[NSMenu alloc] initWithTitle: @"Apple Menu"];
|
||||
|
||||
/**/[m_menuApp addItemWithTitle:@"Preferences..." action:nil keyEquivalent:@""];
|
||||
/**/[m_menuApp addItem: [NSMenuItem separatorItem]];
|
||||
/**/menuitem = [[NSMenuItem alloc] initWithTitle: @"Services" action:nil keyEquivalent:@""];
|
||||
[menuitem setSubmenu:m_menuServices];
|
||||
[m_menuApp addItem: menuitem];
|
||||
[menuitem release];
|
||||
/**/[m_menuApp addItem: [NSMenuItem separatorItem]];
|
||||
/**/menuitem = [[NSMenuItem alloc] initWithTitle:@"Hide" action:@selector(hide:) keyEquivalent:@""];
|
||||
[menuitem setTarget: theNSApplication];
|
||||
[m_menuApp addItem: menuitem];
|
||||
[menuitem release];
|
||||
/**/menuitem = [[NSMenuItem alloc] initWithTitle:@"Hide Others" action:@selector(hideOtherApplications:) keyEquivalent:@""];
|
||||
[menuitem setTarget: theNSApplication];
|
||||
[m_menuApp addItem: menuitem];
|
||||
[menuitem release];
|
||||
/**/menuitem = [[NSMenuItem alloc] initWithTitle:@"Show All" action:@selector(unhideAllApplications:) keyEquivalent:@""];
|
||||
[menuitem setTarget: theNSApplication];
|
||||
[m_menuApp addItem: menuitem];
|
||||
[menuitem release];
|
||||
/**/[m_menuApp addItem: [NSMenuItem separatorItem]];
|
||||
/**/menuitem = [[NSMenuItem alloc] initWithTitle:@"Quit" action:@selector(terminate:) keyEquivalent:@"Q"];
|
||||
[menuitem setTarget: theNSApplication];
|
||||
[m_menuApp addItem: menuitem];
|
||||
[menuitem release];
|
||||
|
||||
[theNSApplication setAppleMenu:m_menuApp];
|
||||
|
||||
// Create the Windows menu
|
||||
m_menuWindows = [[NSMenu alloc] initWithTitle: @"Window"];
|
||||
|
||||
/**/[m_menuWindows addItemWithTitle:@"Minimize" action:@selector(performMiniaturize:) keyEquivalent:@""];
|
||||
/**/[m_menuWindows addItem: [NSMenuItem separatorItem]];
|
||||
/**/[m_menuWindows addItemWithTitle:@"Bring All to Front" action:@selector(arrangeInFront:) keyEquivalent:@""];
|
||||
|
||||
[theNSApplication setWindowsMenu:m_menuWindows];
|
||||
|
||||
// Create the main menubar
|
||||
m_menuMain = [[NSMenu alloc] initWithTitle: @"wxApp Menu"];
|
||||
/**/NSMenuItem *dummyItem = [[NSMenuItem alloc] initWithTitle:@"App menu"
|
||||
/* Note: title gets clobbered by app name anyway */
|
||||
action:nil keyEquivalent:@""];
|
||||
[dummyItem setSubmenu:m_menuApp];
|
||||
[m_menuMain addItem:dummyItem];
|
||||
[dummyItem release];
|
||||
/**/dummyItem = [[NSMenuItem alloc] initWithTitle:@"Window"
|
||||
action:nil keyEquivalent:@""];
|
||||
[dummyItem setSubmenu:m_menuWindows];
|
||||
[m_menuMain addItem:dummyItem];
|
||||
[dummyItem release];
|
||||
|
||||
[theNSApplication setMainMenu: m_menuMain];
|
||||
|
||||
}
|
||||
|
||||
wxMenuBarManager::~wxMenuBarManager()
|
||||
{
|
||||
}
|
||||
|
||||
void wxMenuBarManager::CreateInstance()
|
||||
{
|
||||
sm_mbarmanInstance = new wxMenuBarManager;
|
||||
}
|
||||
|
||||
void wxMenuBarManager::DestroyInstance()
|
||||
{
|
||||
delete sm_mbarmanInstance;
|
||||
sm_mbarmanInstance = NULL;
|
||||
}
|
||||
|
||||
void wxMenuBarManager::CocoaInternalIdle()
|
||||
{
|
||||
if(m_needMenuBar)
|
||||
InstallMainMenu();
|
||||
}
|
||||
|
||||
void wxMenuBarManager::SetMenuBar(wxMenuBar* menubar)
|
||||
{
|
||||
m_mainMenuBarInstalled = false;
|
||||
m_needMenuBar = !menubar;
|
||||
if(menubar)
|
||||
{
|
||||
[[[wxTheApp->GetNSApplication() mainMenu] itemAtIndex:0] setSubmenu:nil];
|
||||
[[menubar->GetNSMenu() itemAtIndex:0] setSubmenu:m_menuApp];
|
||||
[wxTheApp->GetNSApplication() setMainMenu:menubar->GetNSMenu()];
|
||||
}
|
||||
}
|
||||
|
||||
void wxMenuBarManager::SetMainMenuBar(wxMenuBar* menubar)
|
||||
{
|
||||
m_mainMenuBar = menubar;
|
||||
if(m_mainMenuBarInstalled)
|
||||
InstallMainMenu();
|
||||
}
|
||||
|
||||
void wxMenuBarManager::InstallMainMenu()
|
||||
{
|
||||
if(m_mainMenuBar)
|
||||
SetMenuBar(m_mainMenuBar);
|
||||
else
|
||||
{
|
||||
m_needMenuBar = false;
|
||||
m_mainMenuBarInstalled = true;
|
||||
[[[wxTheApp->GetNSApplication() mainMenu] itemAtIndex:0] setSubmenu:nil];
|
||||
[[m_menuMain itemAtIndex:0] setSubmenu:m_menuApp];
|
||||
[wxTheApp->GetNSApplication() setMainMenu:m_menuMain];
|
||||
}
|
||||
}
|
||||
|
||||
void wxMenuBarManager::WindowDidBecomeKey(wxTopLevelWindowNative *win)
|
||||
{
|
||||
wxASSERT(!m_windowKey);
|
||||
m_windowKey = win;
|
||||
InstallMenuBarForWindow(win);
|
||||
}
|
||||
|
||||
void wxMenuBarManager::WindowDidResignKey(wxTopLevelWindowNative *win)
|
||||
{
|
||||
wxASSERT(m_windowKey==win);
|
||||
m_windowKey = NULL;
|
||||
SetMenuBar(NULL);
|
||||
}
|
||||
|
||||
void wxMenuBarManager::WindowDidBecomeMain(wxTopLevelWindowNative *win)
|
||||
{
|
||||
wxASSERT(!m_windowMain);
|
||||
m_windowMain = win;
|
||||
}
|
||||
|
||||
void wxMenuBarManager::WindowDidResignMain(wxTopLevelWindowNative *win)
|
||||
{
|
||||
wxASSERT(m_windowMain==win);
|
||||
m_windowMain = NULL;
|
||||
}
|
||||
|
||||
void wxMenuBarManager::InstallMenuBarForWindow(wxTopLevelWindowNative *win)
|
||||
{
|
||||
wxMenuBar *menubar = NULL;
|
||||
for(wxTopLevelWindowNative *destwin = win;
|
||||
!menubar && destwin;
|
||||
destwin = wxDynamicCast(destwin->GetParent(), wxTopLevelWindow))
|
||||
{
|
||||
menubar = destwin->GetAppMenuBar();
|
||||
}
|
||||
SetMenuBar(menubar);
|
||||
}
|
||||
|
||||
void wxMenuBarManager::UpdateWindowMenuBar(wxTopLevelWindowNative *win)
|
||||
{
|
||||
InstallMenuBarForWindow(m_windowKey);
|
||||
}
|
||||
|
||||
#endif // wxUSE_MENUS
|
Loading…
Reference in New Issue
Block a user