]> git.mxchange.org Git - flightgear.git/blobdiff - src/GUI/FGCocoaMenuBar.mm
Support for multiple data dirs.
[flightgear.git] / src / GUI / FGCocoaMenuBar.mm
index 18643cdeaf31e70461f2c8fb69d7d58d6dde3775..7bedc33d5abf9687ec6033d7a3e4cc39839a6e96 100644 (file)
@@ -39,6 +39,11 @@ public:
   MenuItemBindings itemBindings;
 };
 
+// prior to the 10.6 SDK, NSMenuDelegate was an informal protocol
+#if __MAC_OS_X_VERSION_MIN_REQUIRED < 1060
+@protocol NSMenuDelegate <NSObject>
+@end
+#endif
 
 @interface CocoaMenuDelegate : NSObject <NSMenuDelegate> {
 @private
@@ -109,25 +114,43 @@ static void setItemShortcutFromString(NSMenuItem* item, const string& s)
   [item setKeyEquivalentModifierMask:modifiers];
 }
 
-class EnabledListener : public SGPropertyChangeListener
-{
-public:
-  EnabledListener(NSMenuItem* i) :
-    item(i)
-  {}
-  
-  
-  virtual void valueChanged(SGPropertyNode *node) 
+namespace {
+  class CocoaAutoreleasePool
   {
-    BOOL b = node->getBoolValue();
-    [item setEnabled:b];
-  }
+  public:
+    CocoaAutoreleasePool()
+    {
+      pool = [[NSAutoreleasePool alloc] init];
+    }
+    
+    ~CocoaAutoreleasePool()
+    {
+      [pool release];
+    }
+    
+  private:
+    NSAutoreleasePool* pool;
+  };
   
-private:
-  NSMenuItem* item;
-};
-
-
+  class CocoaEnabledListener : public SGPropertyChangeListener
+  {
+  public:
+    CocoaEnabledListener(NSMenuItem* i) :
+      item(i)
+    {}
+    
+    
+    virtual void valueChanged(SGPropertyNode *node) 
+    {
+      CocoaAutoreleasePool pool;
+      BOOL b = node->getBoolValue();
+      [item setEnabled:b];
+    }
+    
+  private:
+    NSMenuItem* item;
+  };
+} // of anonymous namespace
 
 FGCocoaMenuBar::CocoaMenuBarPrivate::CocoaMenuBarPrivate()
 {
@@ -137,6 +160,7 @@ FGCocoaMenuBar::CocoaMenuBarPrivate::CocoaMenuBarPrivate()
   
 FGCocoaMenuBar::CocoaMenuBarPrivate::~CocoaMenuBarPrivate()
 {
+  CocoaAutoreleasePool pool;
   [delegate release];
 }
   
@@ -153,16 +177,9 @@ void FGCocoaMenuBar::CocoaMenuBarPrivate::menuFromProps(NSMenu* menu, SGProperty
       n->setBoolValue("enabled", true);
     }
     
-    string shortcut;
-    string l = n->getStringValue("label");
-    string::size_type pos = l.find("(");
-    if (pos != string::npos) {
-      string full(l);
-      l = full.substr(0, pos);
-      shortcut = full.substr(pos + 1, full.size() - (pos + 2));
-    }
-    
+    string l = getLocalizedLabel(n);
     NSString* label = stdStringToCocoa(strutils::simplify(l));
+    string shortcut = n->getStringValue("key");
     
     NSMenuItem* item;
     if (index >= [menu numberOfItems]) {
@@ -175,7 +192,7 @@ void FGCocoaMenuBar::CocoaMenuBarPrivate::menuFromProps(NSMenu* menu, SGProperty
           setItemShortcutFromString(item, shortcut);
         }
         
-        n->getNode("enabled")->addChangeListener(new EnabledListener(item));
+        n->getNode("enabled")->addChangeListener(new CocoaEnabledListener(item));
         [item setTarget:delegate];
         [item setAction:@selector(itemAction:)];
       }
@@ -227,6 +244,8 @@ FGCocoaMenuBar::~FGCocoaMenuBar()
 
 void FGCocoaMenuBar::init()
 {
+  CocoaAutoreleasePool pool;
+  
   NSMenu* mainBar = [[NSApplication sharedApplication] mainMenu];
   SGPropertyNode_ptr props = fgGetNode("/sim/menubar/default",true);
   
@@ -237,7 +256,7 @@ void FGCocoaMenuBar::init()
   }
   
   BOOST_FOREACH(SGPropertyNode_ptr n, props->getChildren("menu")) {
-    NSString* label = stdStringToCocoa(n->getStringValue("label"));
+    NSString* label = stdStringToCocoa(getLocalizedLabel(n));
     NSMenuItem* item = [mainBar itemWithTitle:label];
     NSMenu* menu;
     
@@ -259,6 +278,13 @@ void FGCocoaMenuBar::init()
     p->menuFromProps(menu, n);
     ++index;
     previousMenu = item;
+    
+  // track menu enable/disable state
+    if (!n->hasValue("enabled")) {
+      n->setBoolValue("enabled", true);
+    }
+    
+    n->getNode("enabled")->addChangeListener(new CocoaEnabledListener(item));
   }
 }
 
@@ -276,3 +302,10 @@ void FGCocoaMenuBar::hide()
 {
   // no-op
 }
+
+void cocoaOpenUrl(const std::string& url)
+{
+  CocoaAutoreleasePool pool;
+  NSURL* nsu = [NSURL URLWithString:stdStringToCocoa(url)];
+  [[NSWorkspace sharedWorkspace] openURL:nsu];
+}