X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FGUI%2FFGCocoaMenuBar.mm;h=7bedc33d5abf9687ec6033d7a3e4cc39839a6e96;hb=6dd47822545bf27f69a18a2d0ccc8abf91daa8d5;hp=eeacee81a8cf1cfd6c84ba9d9dec1a183f887886;hpb=b501dc97cef821ea20e34c5d48eb2db2e0d11123;p=flightgear.git diff --git a/src/GUI/FGCocoaMenuBar.mm b/src/GUI/FGCocoaMenuBar.mm index eeacee81a..7bedc33d5 100644 --- a/src/GUI/FGCocoaMenuBar.mm +++ b/src/GUI/FGCocoaMenuBar.mm @@ -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 +@end +#endif @interface CocoaMenuDelegate : NSObject { @private @@ -109,23 +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() { @@ -135,6 +160,7 @@ FGCocoaMenuBar::CocoaMenuBarPrivate::CocoaMenuBarPrivate() FGCocoaMenuBar::CocoaMenuBarPrivate::~CocoaMenuBarPrivate() { + CocoaAutoreleasePool pool; [delegate release]; } @@ -151,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]) { @@ -173,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:)]; } @@ -225,6 +244,8 @@ FGCocoaMenuBar::~FGCocoaMenuBar() void FGCocoaMenuBar::init() { + CocoaAutoreleasePool pool; + NSMenu* mainBar = [[NSApplication sharedApplication] mainMenu]; SGPropertyNode_ptr props = fgGetNode("/sim/menubar/default",true); @@ -235,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; @@ -263,7 +284,7 @@ void FGCocoaMenuBar::init() n->setBoolValue("enabled", true); } - n->getNode("enabled")->addChangeListener(new EnabledListener(item)); + n->getNode("enabled")->addChangeListener(new CocoaEnabledListener(item)); } } @@ -281,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]; +}