From ec6778325142dc7a868e2c8e1d0aeee225fa22a2 Mon Sep 17 00:00:00 2001 From: jules Date: Thu, 14 Jun 2012 13:57:38 +0100 Subject: [PATCH] Fix for disappearing Apple extras menu items when showing native file choosers. --- .../juce_gui_basics/menus/juce_MenuBarModel.h | 5 +++++ .../native/juce_mac_FileChooser.mm | 9 +++++++-- .../juce_gui_basics/native/juce_mac_MainMenu.mm | 16 +++++++++++++--- 3 files changed, 25 insertions(+), 5 deletions(-) diff --git a/modules/juce_gui_basics/menus/juce_MenuBarModel.h b/modules/juce_gui_basics/menus/juce_MenuBarModel.h index 02e0872c4a..56efae1adb 100644 --- a/modules/juce_gui_basics/menus/juce_MenuBarModel.h +++ b/modules/juce_gui_basics/menus/juce_MenuBarModel.h @@ -154,6 +154,11 @@ public: the main menu bar. */ static MenuBarModel* getMacMainMenu(); + + /** MAC ONLY - Returns the menu that was last passed as the extraAppleMenuItems + argument to setMacMainMenu(), or nullptr if none was specified. + */ + static const PopupMenu* getMacExtraAppleItemsMenu(); #endif //============================================================================== diff --git a/modules/juce_gui_basics/native/juce_mac_FileChooser.mm b/modules/juce_gui_basics/native/juce_mac_FileChooser.mm index 06a5019447..f413e867b9 100644 --- a/modules/juce_gui_basics/native/juce_mac_FileChooser.mm +++ b/modules/juce_gui_basics/native/juce_mac_FileChooser.mm @@ -89,8 +89,12 @@ class TemporaryMainMenuWithStandardCommands { public: TemporaryMainMenuWithStandardCommands() - : oldMenu (MenuBarModel::getMacMainMenu()) + : oldMenu (MenuBarModel::getMacMainMenu()), oldAppleMenu (nullptr) { + const PopupMenu* appleMenu = MenuBarModel::getMacExtraAppleItemsMenu(); + if (appleMenu != nullptr) + oldAppleMenu = new PopupMenu (*appleMenu); + MenuBarModel::setMacMainMenu (nullptr); NSMenu* menu = [[NSMenu alloc] initWithTitle: nsStringLiteral ("Edit")]; @@ -119,11 +123,12 @@ public: ~TemporaryMainMenuWithStandardCommands() { - MenuBarModel::setMacMainMenu (oldMenu); + MenuBarModel::setMacMainMenu (oldMenu, oldAppleMenu); } private: MenuBarModel* oldMenu; + ScopedPointer oldAppleMenu; }; //============================================================================== diff --git a/modules/juce_gui_basics/native/juce_mac_MainMenu.mm b/modules/juce_gui_basics/native/juce_mac_MainMenu.mm index 1923210846..f9d9b0f74c 100644 --- a/modules/juce_gui_basics/native/juce_mac_MainMenu.mm +++ b/modules/juce_gui_basics/native/juce_mac_MainMenu.mm @@ -38,7 +38,7 @@ public: ~JuceMainMenuHandler() { - setMenu (nullptr); + setMenu (nullptr, nullptr); jassert (instance == this); instance = nullptr; @@ -46,7 +46,7 @@ public: [callback release]; } - void setMenu (MenuBarModel* const newMenuBarModel) + void setMenu (MenuBarModel* const newMenuBarModel, const PopupMenu* newExtraAppleMenuItems) { if (currentModel != newMenuBarModel) { @@ -60,6 +60,9 @@ public: menuBarItemsChanged (nullptr); } + + extraAppleMenuItems = newExtraAppleMenuItems != nullptr ? new PopupMenu (*newExtraAppleMenuItems) + : nullptr; } void addSubMenu (NSMenu* parent, const PopupMenu& child, @@ -262,6 +265,7 @@ public: static JuceMainMenuHandler* instance; MenuBarModel* currentModel; + ScopedPointer extraAppleMenuItems; uint32 lastUpdateTime; NSObject* callback; @@ -569,7 +573,7 @@ void MenuBarModel::setMacMainMenu (MenuBarModel* newMenuBarModel, if (JuceMainMenuHandler::instance == nullptr) JuceMainMenuHandler::instance = new JuceMainMenuHandler(); - JuceMainMenuHandler::instance->setMenu (newMenuBarModel); + JuceMainMenuHandler::instance->setMenu (newMenuBarModel, extraAppleMenuItems); } } @@ -585,6 +589,12 @@ MenuBarModel* MenuBarModel::getMacMainMenu() ? JuceMainMenuHandler::instance->currentModel : nullptr; } +const PopupMenu* MenuBarModel::getMacExtraAppleItemsMenu() +{ + return JuceMainMenuHandler::instance != nullptr + ? JuceMainMenuHandler::instance->extraAppleMenuItems.get() : nullptr; +} + void juce_initialiseMacMainMenu() { if (JuceMainMenuHandler::instance == nullptr)