diff --git a/src/plugins/coreplugin/actionmanager/actioncontainer.cpp b/src/plugins/coreplugin/actionmanager/actioncontainer.cpp index ee22401fcfb..bb733f76af1 100644 --- a/src/plugins/coreplugin/actionmanager/actioncontainer.cpp +++ b/src/plugins/coreplugin/actionmanager/actioncontainer.cpp @@ -381,14 +381,16 @@ void ActionContainerPrivate::update() */ MenuActionContainer::MenuActionContainer(Id id) - : ActionContainerPrivate(id), m_menu(0) + : ActionContainerPrivate(id), + m_menu(new QMenu) { + m_menu->setObjectName(id.toString()); setOnAllDisabledBehavior(Disable); } -void MenuActionContainer::setMenu(QMenu *menu) +MenuActionContainer::~MenuActionContainer() { - m_menu = menu; + delete m_menu; } QMenu *MenuActionContainer::menu() const diff --git a/src/plugins/coreplugin/actionmanager/actioncontainer_p.h b/src/plugins/coreplugin/actionmanager/actioncontainer_p.h index c463994b93f..f01e5ca0d9e 100644 --- a/src/plugins/coreplugin/actionmanager/actioncontainer_p.h +++ b/src/plugins/coreplugin/actionmanager/actioncontainer_p.h @@ -105,8 +105,8 @@ class MenuActionContainer : public ActionContainerPrivate { public: explicit MenuActionContainer(Id id); + ~MenuActionContainer(); - void setMenu(QMenu *menu); QMenu *menu() const; void insertAction(QAction *before, QAction *action); @@ -120,7 +120,7 @@ protected: bool updateInternal(); private: - QMenu *m_menu; + QPointer m_menu; }; class MenuBarActionContainer : public ActionContainerPrivate diff --git a/src/plugins/coreplugin/actionmanager/actionmanager.cpp b/src/plugins/coreplugin/actionmanager/actionmanager.cpp index 58cba9840a6..121fed8f25e 100644 --- a/src/plugins/coreplugin/actionmanager/actionmanager.cpp +++ b/src/plugins/coreplugin/actionmanager/actionmanager.cpp @@ -32,17 +32,19 @@ #include "actionmanager_p.h" #include "actioncontainer_p.h" #include "command_p.h" -#include -#include +#include +#include #include +#include +#include #include -#include +#include #include #include -#include #include +#include namespace { enum { warnAboutFindFailures = 0 }; @@ -200,11 +202,7 @@ ActionContainer *ActionManager::createMenu(Id id) if (it != d->m_idContainerMap.constEnd()) return it.value(); - QMenu *m = new QMenu(ICore::mainWindow()); - m->setObjectName(QLatin1String(id.name())); - MenuActionContainer *mc = new MenuActionContainer(id); - mc->setMenu(m); d->m_idContainerMap.insert(id, mc); connect(mc, SIGNAL(destroyed()), d, SLOT(containerDestroyed())); @@ -327,8 +325,8 @@ void ActionManager::unregisterAction(QAction *action, Id id) a->removeOverrideAction(action); if (a->isEmpty()) { // clean up - // ActionContainers listen to the commands' destroyed signals ICore::mainWindow()->removeAction(a->action()); + // ActionContainers listen to the commands' destroyed signals delete a->action(); d->m_idCmdMap.remove(id); delete a; @@ -378,8 +376,9 @@ bool ActionManager::isPresentationModeEnabled() return d->m_presentationLabel; } -void ActionManager::initialize() +void ActionManager::initialize(QObject *parent) { + new ActionManager(parent); d->initialize(); } @@ -463,7 +462,17 @@ void ActionManagerPrivate::showShortcutPopup(const QString &shortcut) m_presentationLabel->setText(shortcut); m_presentationLabel->adjustSize(); - QPoint p = ICore::mainWindow()->mapToGlobal(ICore::mainWindow()->rect().center() - m_presentationLabel->rect().center()); + QWidget *window = QApplication::activeWindow(); + if (!window && !QApplication::topLevelWidgets().isEmpty()) + window = QApplication::topLevelWidgets().first(); + QPoint center; + if (window) { + center = window->mapToGlobal(window->rect().center()); + } else { + QTC_ASSERT(QApplication::desktop(), return); + center = QApplication::desktop()->screenGeometry().center(); + } + QPoint p = center - m_presentationLabel->rect().center(); m_presentationLabel->move(p); m_presentationLabel->show(); diff --git a/src/plugins/coreplugin/actionmanager/actionmanager.h b/src/plugins/coreplugin/actionmanager/actionmanager.h index 3f0dc846e4c..28fbbc0b18d 100644 --- a/src/plugins/coreplugin/actionmanager/actionmanager.h +++ b/src/plugins/coreplugin/actionmanager/actionmanager.h @@ -48,7 +48,10 @@ namespace Core { class ActionContainer; -namespace Internal { class MainWindow; } +namespace Internal { +class CorePlugin; +class MainWindow; +} // Internal class CORE_EXPORT ActionManager : public QObject { @@ -78,11 +81,12 @@ signals: private: ActionManager(QObject *parent = 0); ~ActionManager(); - static void initialize(); - void saveSettings(QSettings *settings); - void setContext(const Context &context); + static void initialize(QObject *parent); + static void saveSettings(QSettings *settings); + static void setContext(const Context &context); - friend class Core::Internal::MainWindow; + friend class Core::Internal::CorePlugin; // initialization + friend class Core::Internal::MainWindow; // saving settings and setting context }; } // namespace Core diff --git a/src/plugins/coreplugin/coreplugin.cpp b/src/plugins/coreplugin/coreplugin.cpp index df8659ffe7d..320536fc880 100644 --- a/src/plugins/coreplugin/coreplugin.cpp +++ b/src/plugins/coreplugin/coreplugin.cpp @@ -167,6 +167,7 @@ void CorePlugin::parseArguments(const QStringList &arguments) bool CorePlugin::initialize(const QStringList &arguments, QString *errorMessage) { + ActionManager::initialize(this); Theme::initialPalette(); // Initialize palette before setting it qsrand(QDateTime::currentDateTime().toTime_t()); parseArguments(arguments); diff --git a/src/plugins/coreplugin/mainwindow.cpp b/src/plugins/coreplugin/mainwindow.cpp index 3ea11517c46..cfa07f9f000 100644 --- a/src/plugins/coreplugin/mainwindow.cpp +++ b/src/plugins/coreplugin/mainwindow.cpp @@ -117,7 +117,6 @@ MainWindow::MainWindow() : this)), m_printer(0), m_windowSupport(0), - m_actionManager(new ActionManager(this)), m_editorManager(0), m_externalToolManager(0), m_progressManager(new ProgressManagerPrivate), @@ -146,8 +145,6 @@ MainWindow::MainWindow() : m_toggleSideBarAction(0), m_toggleSideBarButton(new QToolButton) { - ActionManager::initialize(); // must be done before registering any actions - (void) new DocumentManager(this); OutputPaneManager::create(); @@ -1000,7 +997,7 @@ void MainWindow::writeSettings() settings->endGroup(); DocumentManager::saveSettings(); - m_actionManager->saveSettings(settings); + ActionManager::saveSettings(settings); EditorManagerPrivate::saveSettings(); m_navigationWidget->saveSettings(settings); } @@ -1043,7 +1040,7 @@ void MainWindow::updateContext() uniquecontexts.add(id); } - m_actionManager->setContext(uniquecontexts); + ActionManager::setContext(uniquecontexts); emit m_coreImpl->contextChanged(m_activeContext, m_additionalContexts); } diff --git a/src/plugins/coreplugin/mainwindow.h b/src/plugins/coreplugin/mainwindow.h index d284dacdfa6..a5cdade98cb 100644 --- a/src/plugins/coreplugin/mainwindow.h +++ b/src/plugins/coreplugin/mainwindow.h @@ -49,7 +49,6 @@ QT_END_NAMESPACE namespace Core { -class ActionManager; class StatusBarWidget; class EditorManager; class ExternalToolManager; @@ -69,7 +68,6 @@ class VcsManager; namespace Internal { -class ActionManagerPrivate; class FancyTabWidget; class GeneralSettings; class ProgressManagerPrivate; @@ -168,7 +166,6 @@ private: SettingsDatabase *m_settingsDatabase; mutable QPrinter *m_printer; WindowSupport *m_windowSupport; - ActionManager *m_actionManager; EditorManager *m_editorManager; ExternalToolManager *m_externalToolManager; MessageManager *m_messageManager;