]> git.saurik.com Git - wxWidgets.git/commitdiff
Added wxMenuBarManager
authorDavid Elliott <dfe@tgwbd.org>
Thu, 4 Sep 2003 19:19:03 +0000 (19:19 +0000)
committerDavid Elliott <dfe@tgwbd.org>
Thu, 4 Sep 2003 19:19:03 +0000 (19:19 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@23382 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/cocoa/mbarman.h [new file with mode: 0644]
src/cocoa/mbarman.mm [new file with mode: 0644]

diff --git a/include/wx/cocoa/mbarman.h b/include/wx/cocoa/mbarman.h
new file mode 100644 (file)
index 0000000..f21dac7
--- /dev/null
@@ -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_
diff --git a/src/cocoa/mbarman.mm b/src/cocoa/mbarman.mm
new file mode 100644 (file)
index 0000000..e72220b
--- /dev/null
@@ -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