]> git.saurik.com Git - wxWidgets.git/commitdiff
* Removed CocoaInternalIdle()
authorDavid Elliott <dfe@tgwbd.org>
Thu, 6 Nov 2003 20:12:11 +0000 (20:12 +0000)
committerDavid Elliott <dfe@tgwbd.org>
Thu, 6 Nov 2003 20:12:11 +0000 (20:12 +0000)
* Removed methods that were called by wxTopLevelWindow notification handlers
* Removed now useless m_needMenuBar
* Added an Objective-C notification observer class
* Added methods to receive the notifications
* InstallMenuBarForWindow now takes a wxCocoaNSWindow
* Do not keep track of key/main window
* Keep track of window for which menu bar was installed (m_windowCurrent)
* SetMenuBar() will now install the main menu immediately

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@24430 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/cocoa/mbarman.h
src/cocoa/mbarman.mm

index 52a8c058c7a8719e11f42d035d3a39ca35cdf48f..a7947bde1b50763d7109484f31a52404b892d07a 100644 (file)
@@ -16,6 +16,8 @@
 
 #include "wx/toplevel.h"
 
+DECLARE_WXCOCOA_OBJC_CLASS(wxMenuBarManagerObserver);
+
 // ========================================================================
 // wxMenuBarManager
 // ========================================================================
@@ -41,28 +43,28 @@ protected:
 // ------------------------------------------------------------------------
 public:
     void SetMainMenuBar(wxMenuBar* menubar);
-    void CocoaInternalIdle();
-    void WindowDidBecomeKey(wxTopLevelWindowNative *win);
-    void WindowDidResignKey(wxTopLevelWindowNative *win, bool uninstallMenuBar = true);
-    void WindowDidBecomeMain(wxTopLevelWindowNative *win);
-    void WindowDidResignMain(wxTopLevelWindowNative *win);
+    void WindowDidBecomeKey(NSNotification *notification);
+#if 0
+    void WindowDidResignKey(NSNotification *notification);
+    void WindowDidBecomeMain(NSNotification *notification);
+    void WindowDidResignMain(NSNotification *notification);
+    void WindowWillClose(NSNotification *notification);
+#endif // 0
     void UpdateWindowMenuBar(wxTopLevelWindowNative *win);
 protected:
     void SetMenuBar(wxMenuBar* menubar);
-    void InstallMenuBarForWindow(wxTopLevelWindowNative *win);
+    void InstallMenuBarForWindow(wxCocoaNSWindow *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;
+    wxMenuBarManagerObserver *m_observer;
+    wxCocoaNSWindow *m_windowCurrent;
 };
 
 #endif // wxUSE_MENUS
index 63bbdd4e915961f318f96f89830878bbea9c9337..f6c52d21be2436140b89f91b4c8103011f3057d0 100644 (file)
 #include "wx/cocoa/autorelease.h"
 
 #import <Foundation/NSString.h>
+#import <Foundation/NSNotification.h>
 #import <AppKit/NSMenu.h>
 #import <AppKit/NSApplication.h>
+#import <AppKit/NSWindow.h>
+
+// ============================================================================
+// wxMenuBarManagerObserver
+// ============================================================================
+@interface wxMenuBarManagerObserver : NSObject
+{
+    wxMenuBarManager *m_mbarman;
+}
+
+- (id)init;
+- (id)initWithWxMenuBarManager: (wxMenuBarManager *)mbarman;
+- (void)windowDidBecomeKey: (NSNotification *)notification;
+#if 0
+- (void)windowDidResignKey: (NSNotification *)notification;
+- (void)windowDidBecomeMain: (NSNotification *)notification;
+- (void)windowDidResignMain: (NSNotification *)notification;
+- (void)windowWillClose: (NSNotification *)notification;
+#endif // 0
+@end // interface wxMenuBarManagerObserver : NSObject
+
+@implementation wxMenuBarManagerObserver : NSObject
+- (id)init
+{
+    wxFAIL_MSG("[wxMenuBarManagerObserver -init] should never be called!");
+    m_mbarman = NULL;
+    return self;
+}
+
+- (id)initWithWxMenuBarManager: (wxMenuBarManager *)mbarman
+{
+    wxASSERT(mbarman);
+    m_mbarman = mbarman;
+    return [super init];
+}
+
+- (void)windowDidBecomeKey: (NSNotification *)notification
+{
+    wxASSERT(m_mbarman);
+    m_mbarman->WindowDidBecomeKey(notification);
+}
+
+#if 0
+- (void)windowDidResignKey: (NSNotification *)notification
+{
+    wxASSERT(m_mbarman);
+    m_mbarman->WindowDidResignKey(notification);
+}
+
+- (void)windowDidBecomeMain: (NSNotification *)notification
+{
+    wxASSERT(m_mbarman);
+    m_mbarman->WindowDidBecomeMain(notification);
+}
+
+- (void)windowDidResignMain: (NSNotification *)notification
+{
+    wxASSERT(m_mbarman);
+    m_mbarman->WindowDidResignMain(notification);
+}
+
+- (void)windowWillClose: (NSNotification *)notification
+{
+    wxASSERT(m_mbarman);
+    m_mbarman->WindowWillClose(notification);
+}
+#endif // 0
+
+@end // implementation wxMenuBarManagerObserver : NSObject
 
 // ============================================================================
 // wxMenuBarManager
@@ -32,15 +102,32 @@ wxMenuBarManager *wxMenuBarManager::sm_mbarmanInstance = NULL;
 
 wxMenuBarManager::wxMenuBarManager()
 {
+    m_observer = [[wxMenuBarManagerObserver alloc]
+            initWithWxMenuBarManager:this];
+    [[NSNotificationCenter defaultCenter] addObserver:m_observer
+            selector:@selector(windowDidBecomeKey:)
+            name:NSWindowDidBecomeKeyNotification object:nil];
+#if 0
+    [[NSNotificationCenter defaultCenter] addObserver:m_observer
+            selector:@selector(windowDidResignKey:)
+            name:NSWindowDidResignKeyNotification object:nil];
+    [[NSNotificationCenter defaultCenter] addObserver:m_observer
+            selector:@selector(windowDidBecomeMain:)
+            name:NSWindowDidBecomeMainNotification object:nil];
+    [[NSNotificationCenter defaultCenter] addObserver:m_observer
+            selector:@selector(windowDidResignMain:)
+            name:NSWindowDidResignMainNotification object:nil];
+    [[NSNotificationCenter defaultCenter] addObserver:m_observer
+            selector:@selector(windowWillClose:)
+            name:NSWindowWillCloseNotification object:nil];
+#endif // 0
     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;
+    m_windowCurrent = NULL;
 
     NSApplication *theNSApplication = wxTheApp->GetNSApplication();
     // Create the services menu.
@@ -107,6 +194,7 @@ wxMenuBarManager::wxMenuBarManager()
 
 wxMenuBarManager::~wxMenuBarManager()
 {
+    [m_observer release];
 }
 
 void wxMenuBarManager::CreateInstance()
@@ -120,22 +208,17 @@ void wxMenuBarManager::DestroyInstance()
     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()];
     }
+    else
+        InstallMainMenu();
 }
 
 void wxMenuBarManager::SetMainMenuBar(wxMenuBar* menubar)
@@ -151,7 +234,6 @@ void wxMenuBarManager::InstallMainMenu()
         SetMenuBar(m_mainMenuBar);
     else
     {
-        m_needMenuBar = false;
         m_mainMenuBarInstalled = true;
         [[[wxTheApp->GetNSApplication() mainMenu] itemAtIndex:0] setSubmenu:nil];
         [[m_menuMain itemAtIndex:0] setSubmenu:m_menuApp];
@@ -159,44 +241,46 @@ void wxMenuBarManager::InstallMainMenu()
     }
 }
 
-void wxMenuBarManager::WindowDidBecomeKey(wxTopLevelWindowNative *win)
+void wxMenuBarManager::WindowDidBecomeKey(NSNotification *notification)
+{
+    wxCocoaNSWindow *win = wxCocoaNSWindow::GetFromCocoa([notification object]);
+    if(win)
+        InstallMenuBarForWindow(win);
+    else
+        SetMenuBar(NULL);
+}
+
+#if 0
+void wxMenuBarManager::WindowDidResignKey(NSNotification *notification)
 {
-    wxASSERT(!m_windowKey);
-    m_windowKey = win;
-    InstallMenuBarForWindow(win);
 }
 
-void wxMenuBarManager::WindowDidResignKey(wxTopLevelWindowNative *win, bool uninstallMenuBar)
+void wxMenuBarManager::WindowDidBecomeMain(NSNotification *notification)
 {
-    wxASSERT(m_windowKey==win);
-    m_windowKey = NULL;
-    if(uninstallMenuBar)
-        SetMenuBar(NULL);
 }
 
-void wxMenuBarManager::WindowDidBecomeMain(wxTopLevelWindowNative *win)
+void wxMenuBarManager::WindowDidResignMain(NSNotification *notification)
 {
-    wxASSERT(!m_windowMain);
-    m_windowMain = win;
 }
 
-void wxMenuBarManager::WindowDidResignMain(wxTopLevelWindowNative *win)
+void wxMenuBarManager::WindowWillClose(NSNotification *notification)
 {
-    wxASSERT(m_windowMain==win);
-    m_windowMain = NULL;
 }
+#endif // 0
 
-void wxMenuBarManager::InstallMenuBarForWindow(wxTopLevelWindowNative *win)
+void wxMenuBarManager::InstallMenuBarForWindow(wxCocoaNSWindow *win)
 {
     wxASSERT(win);
+    m_windowCurrent = win;
     wxMenuBar *menubar = win->GetAppMenuBar();
+    wxLogDebug("Found menubar=%p for window=%p.",menubar,win);
     SetMenuBar(menubar);
 }
 
 void wxMenuBarManager::UpdateWindowMenuBar(wxTopLevelWindowNative *win)
 {
-    if(m_windowKey)
-        InstallMenuBarForWindow(m_windowKey);
+    if(m_windowCurrent)
+        InstallMenuBarForWindow(m_windowCurrent);
 }
 
 #endif // wxUSE_MENUS