diff --git a/src/plugins/coreplugin/actionmanager/actioncontainer.cpp b/src/plugins/coreplugin/actionmanager/actioncontainer.cpp index f47313f5692161fcb0798551af4708fd84e4fc84..31e68bd70dbb82c17a2cd3aeeded805e6883b0cc 100644 --- a/src/plugins/coreplugin/actionmanager/actioncontainer.cpp +++ b/src/plugins/coreplugin/actionmanager/actioncontainer.cpp @@ -39,6 +39,8 @@ #include "coreconstants.h" #include "uniqueidmanager.h" +#include <utils/qtcassert.h> + #include <QtCore/QDebug> #include <QtCore/QTimer> #include <QtGui/QAction> @@ -165,6 +167,9 @@ using namespace Core::Internal; ActionContainerPrivate::ActionContainerPrivate(int id) : m_onAllDisabledBehavior(Disable), m_id(id), m_updateRequested(false) { + appendGroup(QLatin1String(Constants::G_DEFAULT_ONE)); + appendGroup(QLatin1String(Constants::G_DEFAULT_TWO)); + appendGroup(QLatin1String(Constants::G_DEFAULT_THREE)); scheduleUpdate(); } @@ -178,144 +183,112 @@ ActionContainer::OnAllDisabledBehavior ActionContainerPrivate::onAllDisabledBeha return m_onAllDisabledBehavior; } -void ActionContainerPrivate::appendGroup(const QString &group) -{ - int gid = UniqueIDManager::instance()->uniqueIdentifier(group); - m_groups << gid; -} - -QAction *ActionContainerPrivate::insertLocation(const QString &group) const +void ActionContainerPrivate::appendGroup(const QString &groupId) { - int grpid = UniqueIDManager::instance()->uniqueIdentifier(group); - int prevKey = 0; - int pos = ((grpid << 16) | 0xFFFF); - return beforeAction(pos, &prevKey); + m_groups.append(Group(groupId)); } -void ActionContainerPrivate::addAction(Command *action, const QString &group) +QList<Group>::const_iterator ActionContainerPrivate::findGroup(const QString &groupId) const { - if (!canAddAction(action)) - return; - - ActionManagerPrivate *am = ActionManagerPrivate::instance(); - UniqueIDManager *idmanager = UniqueIDManager::instance(); - int grpid = idmanager->uniqueIdentifier(Constants::G_DEFAULT_TWO); - if (!group.isEmpty()) - grpid = idmanager->uniqueIdentifier(group); - if (!m_groups.contains(grpid) && !am->defaultGroups().contains(grpid)) - qWarning() << "*** addAction(): Unknown group: " << group; - int pos = ((grpid << 16) | 0xFFFF); - addActionInternal(action, pos); + QList<Group>::const_iterator it = m_groups.constBegin(); + while (it != m_groups.constEnd()) { + if (it->id == groupId) + break; + ++it; + } + return it; } -void ActionContainerPrivate::addMenu(ActionContainer *menu, const QString &group) -{ - ActionContainerPrivate *container = static_cast<ActionContainerPrivate *>(menu); - if (!container->canBeAddedToMenu()) - return; - - ActionManagerPrivate *am = ActionManagerPrivate::instance(); - UniqueIDManager *idmanager = UniqueIDManager::instance(); - int grpid = idmanager->uniqueIdentifier(Constants::G_DEFAULT_TWO); - if (!group.isEmpty()) - grpid = idmanager->uniqueIdentifier(group); - if (!m_groups.contains(grpid) && !am->defaultGroups().contains(grpid)) - qWarning() << "*** addMenu(): Unknown group: " << group; - int pos = ((grpid << 16) | 0xFFFF); - addMenuInternal(menu, pos); -} -int ActionContainerPrivate::id() const +QAction *ActionContainerPrivate::insertLocation(const QString &groupId) const { - return m_id; + QList<Group>::const_iterator it = findGroup(groupId); + QTC_ASSERT(it != m_groups.constEnd(), return 0); + return insertLocation(it); } -QMenu *ActionContainerPrivate::menu() const -{ - return 0; -} - -QMenuBar *ActionContainerPrivate::menuBar() const +QAction *ActionContainerPrivate::insertLocation(QList<Group>::const_iterator group) const { + if (group == m_groups.constEnd()) + return 0; + ++group; + while (group != m_groups.constEnd()) { + if (!group->items.isEmpty()) { + QObject *item = group->items.first(); + if (Command *cmd = qobject_cast<Command *>(item)) { + return cmd->action(); + } else if (ActionContainer *container = qobject_cast<ActionContainer *>(item)) { + if (container->menu()) + return container->menu()->menuAction(); + } + QTC_ASSERT(false, return 0); + } + ++group; + } return 0; } -bool ActionContainerPrivate::canAddAction(Command *action) const +void ActionContainerPrivate::addAction(Command *command, const QString &groupId) { - return (action->action() != 0); -} + if (!canAddAction(command)) + return; -void ActionContainerPrivate::addActionInternal(Command *action, int pos) -{ - Action *a = static_cast<Action *>(action); + QString actualGroupId; + if (groupId.isEmpty()) + actualGroupId = QLatin1String(Constants::G_DEFAULT_TWO); + else + actualGroupId = groupId; - int prevKey = 0; - QAction *ba = beforeAction(pos, &prevKey); - pos = calcPosition(pos, prevKey); + QList<Group>::const_iterator groupIt = findGroup(actualGroupId); + QTC_ASSERT(groupIt != m_groups.constEnd(), return); + QAction *beforeAction = insertLocation(groupIt); + m_groups[groupIt-m_groups.constBegin()].items.append(command); - m_commands.append(action); - m_posmap.insert(pos, action->id()); - connect(action, SIGNAL(activeStateChanged()), this, SLOT(scheduleUpdate())); - insertAction(ba, a->action()); + connect(command, SIGNAL(activeStateChanged()), this, SLOT(scheduleUpdate())); + insertAction(beforeAction, command->action()); scheduleUpdate(); } -void ActionContainerPrivate::addMenuInternal(ActionContainer *menu, int pos) +void ActionContainerPrivate::addMenu(ActionContainer *menu, const QString &groupId) { - MenuActionContainer *mc = static_cast<MenuActionContainer *>(menu); + ActionContainerPrivate *containerPrivate = static_cast<ActionContainerPrivate *>(menu); + if (!containerPrivate->canBeAddedToMenu()) + return; + MenuActionContainer *container = static_cast<MenuActionContainer *>(containerPrivate); + + QString actualGroupId; + if (groupId.isEmpty()) + actualGroupId = QLatin1String(Constants::G_DEFAULT_TWO); + else + actualGroupId = groupId; - int prevKey = 0; - QAction *ba = beforeAction(pos, &prevKey); - pos = calcPosition(pos, prevKey); + QList<Group>::const_iterator groupIt = findGroup(actualGroupId); + QTC_ASSERT(groupIt != m_groups.constEnd(), return); + QAction *beforeAction = insertLocation(groupIt); + m_groups[groupIt-m_groups.constBegin()].items.append(menu); - m_subContainers.append(menu); - m_posmap.insert(pos, menu->id()); - insertMenu(ba, mc->menu()); + insertMenu(beforeAction, container->menu()); scheduleUpdate(); } -QAction *ActionContainerPrivate::beforeAction(int pos, int *prevKey) const +int ActionContainerPrivate::id() const { - ActionManagerPrivate *am = ActionManagerPrivate::instance(); - - int baId = -1; - - (*prevKey) = -1; - - QMap<int, int>::const_iterator i = m_posmap.constBegin(); - while (i != m_posmap.constEnd()) { - if (i.key() > pos) { - baId = i.value(); - break; - } - (*prevKey) = i.key(); - ++i; - } - - if (baId == -1) - return 0; - - if (Command *cmd = am->command(baId)) - return cmd->action(); - if (ActionContainer *container = am->actionContainer(baId)) - if (QMenu *menu = container->menu()) - return menu->menuAction(); + return m_id; +} +QMenu *ActionContainerPrivate::menu() const +{ return 0; } -int ActionContainerPrivate::calcPosition(int pos, int prevKey) const +QMenuBar *ActionContainerPrivate::menuBar() const { - int grp = (pos & 0xFFFF0000); - if (prevKey == -1) - return grp; - - int prevgrp = (prevKey & 0xFFFF0000); - - if (grp != prevgrp) - return grp; + return 0; +} - return grp + (prevKey & 0xFFFF) + 10; +bool ActionContainerPrivate::canAddAction(Command *action) const +{ + return (action->action() != 0); } void ActionContainerPrivate::scheduleUpdate() @@ -378,25 +351,32 @@ bool MenuActionContainer::updateInternal() bool hasitems = false; QList<QAction *> actions = m_menu->actions(); - foreach (ActionContainer *container, subContainers()) { - actions.removeAll(container->menu()->menuAction()); - if (container == this) { - qWarning() << Q_FUNC_INFO << "container" << (this->menu() ? this->menu()->title() : "") << "contains itself as subcontainer"; - continue; - } - if (qobject_cast<ActionContainerPrivate*>(container)->updateInternal()) { - hasitems = true; - break; - } - } - if (!hasitems) { - foreach (Command *command, commands()) { - actions.removeAll(command->action()); - if (command->isActive()) { - hasitems = true; - break; + QListIterator<Group> it(m_groups); + while (it.hasNext()) { + const Group &group = it.next(); + foreach (QObject *item, group.items) { + if (ActionContainerPrivate *container = qobject_cast<ActionContainerPrivate*>(item)) { + actions.removeAll(container->menu()->menuAction()); + if (container == this) { + qWarning() << Q_FUNC_INFO << "container" << (this->menu() ? this->menu()->title() : "") << "contains itself as subcontainer"; + continue; + } + if (container->updateInternal()) { + hasitems = true; + break; + } + } else if (Command *command = qobject_cast<Command *>(item)) { + actions.removeAll(command->action()); + if (command->isActive()) { + hasitems = true; + break; + } + } else { + QTC_ASSERT(false, continue); } } + if (hasitems) + break; } if (!hasitems) { // look if there were actions added that we don't control and check if they are enabled diff --git a/src/plugins/coreplugin/actionmanager/actioncontainer_p.h b/src/plugins/coreplugin/actionmanager/actioncontainer_p.h index 6beae138cef97ced1187c4acb1586397e2f16b4e..8d313dc98eebb749e3fbdd5984a34938b931e696 100644 --- a/src/plugins/coreplugin/actionmanager/actioncontainer_p.h +++ b/src/plugins/coreplugin/actionmanager/actioncontainer_p.h @@ -42,6 +42,12 @@ namespace Core { namespace Internal { +struct Group { + Group(const QString &id) : id(id) {} + QString id; + QList<QObject *> items; // Command * or ActionContainer * +}; + class ActionContainerPrivate : public Core::ActionContainer { Q_OBJECT @@ -54,7 +60,7 @@ public: ActionContainer::OnAllDisabledBehavior onAllDisabledBehavior() const; QAction *insertLocation(const QString &group) const; - void appendGroup(const QString &group); + void appendGroup(const QString &id); void addAction(Command *action, const QString &group = QString()); void addMenu(ActionContainer *menu, const QString &group = QString()); @@ -66,9 +72,6 @@ public: virtual void insertAction(QAction *before, QAction *action) = 0; virtual void insertMenu(QAction *before, QMenu *menu) = 0; - QList<Command *> commands() const { return m_commands; } - QList<ActionContainer *> subContainers() const { return m_subContainers; } - virtual bool updateInternal() = 0; protected: @@ -76,23 +79,19 @@ protected: bool canAddMenu(ActionContainer *menu) const; virtual bool canBeAddedToMenu() const = 0; - void addActionInternal(Command *action, int pos); - void addMenuInternal(ActionContainer *menu, int pos); + // groupId --> list of Command* and ActionContainer* + QList<Group> m_groups; private slots: void scheduleUpdate(); void update(); private: - QAction *beforeAction(int pos, int *prevKey) const; - int calcPosition(int pos, int prevKey) const; + QList<Group>::const_iterator findGroup(const QString &groupId) const; + QAction *insertLocation(QList<Group>::const_iterator group) const; - QList<int> m_groups; OnAllDisabledBehavior m_onAllDisabledBehavior; int m_id; - QMap<int, int> m_posmap; - QList<ActionContainer *> m_subContainers; - QList<Command *> m_commands; bool m_updateRequested; }; diff --git a/src/plugins/coreplugin/actionmanager/actionmanager.cpp b/src/plugins/coreplugin/actionmanager/actionmanager.cpp index 5f17c3ecebd5b031da714438bed869df1fda7809..e28f44abbf3c87cdacda5c97e146304d661e5bcf 100644 --- a/src/plugins/coreplugin/actionmanager/actionmanager.cpp +++ b/src/plugins/coreplugin/actionmanager/actionmanager.cpp @@ -242,12 +242,7 @@ ActionManagerPrivate::ActionManagerPrivate(MainWindow *mainWnd) : ActionManager(mainWnd), m_mainWnd(mainWnd) { - UniqueIDManager *uidmgr = UniqueIDManager::instance(); - m_defaultGroups << uidmgr->uniqueIdentifier(Constants::G_DEFAULT_ONE); - m_defaultGroups << uidmgr->uniqueIdentifier(Constants::G_DEFAULT_TWO); - m_defaultGroups << uidmgr->uniqueIdentifier(Constants::G_DEFAULT_THREE); m_instance = this; - } ActionManagerPrivate::~ActionManagerPrivate() @@ -261,11 +256,6 @@ ActionManagerPrivate *ActionManagerPrivate::instance() return m_instance; } -QList<int> ActionManagerPrivate::defaultGroups() const -{ - return m_defaultGroups; -} - QList<Command *> ActionManagerPrivate::commands() const { // transform list of CommandPrivate into list of Command diff --git a/src/plugins/coreplugin/actionmanager/actionmanager_p.h b/src/plugins/coreplugin/actionmanager/actionmanager_p.h index 4e1304965bb43c53b1f2b5bae3910dfd85236da8..4b953a5a9b268caa29db5f0d6bae2472a08e808a 100644 --- a/src/plugins/coreplugin/actionmanager/actionmanager_p.h +++ b/src/plugins/coreplugin/actionmanager/actionmanager_p.h @@ -69,7 +69,6 @@ public: static ActionManagerPrivate *instance(); void saveSettings(QSettings *settings); - QList<int> defaultGroups() const; QList<Command *> commands() const; @@ -98,7 +97,6 @@ private: Action *overridableAction(const Id &id); static ActionManagerPrivate *m_instance; - QList<int> m_defaultGroups; typedef QHash<int, CommandPrivate *> IdCmdMap; IdCmdMap m_idCmdMap;