From 08ccda586254de7ff4c66ccdb98d9843847080be Mon Sep 17 00:00:00 2001
From: dt <qtc-committer@nokia.com>
Date: Tue, 14 Sep 2010 15:15:57 +0200
Subject: [PATCH] EditorManager: Change openEditor/activateEditor to not do
 mode switching

Also introduce a indirection, modes have now types, edit and debug have
the same type, and editors do have a prefered type of modes instead of a
prefered mode.

That fixes the bug that if the prefered qml editing mode was set to
design, then in switching between qml editors would
- in Edit Mode: stay in edit mode
- in Debug Mode: switch to debug mode
---
 src/plugins/coreplugin/basemode.h                  |  3 +++
 src/plugins/coreplugin/coreconstants.h             |  3 +++
 src/plugins/coreplugin/designmode.cpp              |  5 +++++
 src/plugins/coreplugin/designmode.h                |  1 +
 src/plugins/coreplugin/editmode.cpp                |  5 +++++
 src/plugins/coreplugin/editmode.h                  |  1 +
 .../coreplugin/editormanager/editormanager.cpp     | 11 ++++++-----
 .../coreplugin/editormanager/editormanager.h       |  2 +-
 .../coreplugin/editormanager/editorview.cpp        | 13 ++++++++-----
 src/plugins/coreplugin/editormanager/ieditor.h     |  2 +-
 .../coreplugin/editormanager/openeditorsview.cpp   |  2 +-
 .../coreplugin/editormanager/openeditorswindow.cpp |  5 +++--
 src/plugins/coreplugin/editortoolbar.cpp           |  4 ++--
 src/plugins/coreplugin/imode.h                     |  1 +
 src/plugins/coreplugin/mainwindow.cpp              |  4 ++--
 src/plugins/coreplugin/modemanager.cpp             | 13 +++++++++++++
 src/plugins/coreplugin/modemanager.h               |  2 ++
 src/plugins/cpaster/cpasterplugin.cpp              |  2 +-
 src/plugins/cpptools/cppfilesettingspage.cpp       |  6 ++++--
 src/plugins/cpptools/cppfindreferences.cpp         |  6 ++++--
 src/plugins/cvs/cvsplugin.cpp                      | 13 +++++++------
 src/plugins/debugger/debuggeragents.cpp            |  6 +++---
 src/plugins/debugger/debuggerplugin.cpp            |  6 +++---
 src/plugins/designer/formeditorw.cpp               |  2 +-
 src/plugins/designer/formwindoweditor.cpp          |  4 ++--
 src/plugins/designer/formwindoweditor.h            |  2 +-
 src/plugins/git/gitclient.cpp                      |  2 +-
 src/plugins/git/gitplugin.cpp                      |  3 ++-
 src/plugins/helloworld/helloworldplugin.cpp        |  1 +
 src/plugins/locator/basefilefilter.cpp             |  2 +-
 src/plugins/locator/filesystemfilter.cpp           |  3 ++-
 src/plugins/locator/opendocumentsfilter.cpp        |  4 ++--
 src/plugins/mercurial/mercurialclient.cpp          |  2 +-
 src/plugins/mercurial/mercurialplugin.cpp          |  3 ++-
 src/plugins/perforce/perforceplugin.cpp            |  7 ++++---
 .../projectexplorer/foldernavigationwidget.cpp     |  2 +-
 src/plugins/projectexplorer/projectexplorer.cpp    |  4 ++--
 src/plugins/projectexplorer/projecttreewidget.cpp  |  2 +-
 src/plugins/qmljseditor/qmljseditor.cpp            | 10 +++++-----
 src/plugins/qmljseditor/qmljseditor.h              |  2 +-
 src/plugins/qmljsinspector/qmljsinspector.cpp      |  2 +-
 .../qt-maemo/maemopackagecreationwidget.cpp        |  4 +++-
 .../wizards/qmlstandaloneappwizard.cpp             |  3 ++-
 src/plugins/subversion/subversionplugin.cpp        | 14 ++++++++------
 src/plugins/texteditor/basefilefind.cpp            |  5 +++--
 src/plugins/texteditor/refactoringchanges.cpp      |  4 ++--
 src/plugins/vcsbase/cleandialog.cpp                |  2 +-
 src/plugins/vcsbase/vcsbaseeditor.cpp              |  3 +--
 src/plugins/vcsbase/vcsbaseoutputwindow.cpp        |  2 +-
 src/plugins/vcsbase/vcsbasesubmiteditor.cpp        |  2 +-
 src/plugins/welcome/welcomemode.cpp                |  5 +++++
 src/plugins/welcome/welcomemode.h                  |  1 +
 52 files changed, 139 insertions(+), 79 deletions(-)

diff --git a/src/plugins/coreplugin/basemode.h b/src/plugins/coreplugin/basemode.h
index 77ead779b81..d800ceb50fe 100644
--- a/src/plugins/coreplugin/basemode.h
+++ b/src/plugins/coreplugin/basemode.h
@@ -58,6 +58,7 @@ public:
     int priority() const { return m_priority; }
     QWidget *widget() { return m_widget; }
     QString id() const { return m_id; }
+    QString type() const { return m_type; }
     Context context() const { return m_context; }
     QString contextHelpId() const { return m_helpId; }
 
@@ -66,6 +67,7 @@ public:
     void setPriority(int priority) { m_priority = priority; }
     void setWidget(QWidget *widget) { m_widget = widget; }
     void setId(const QString &id) { m_id = id; }
+    void setType(const QString &type) { m_type = type; }
     void setContextHelpId(const QString &helpId) { m_helpId = helpId; }
     void setContext(const Context &context) { m_context = context; }
 
@@ -75,6 +77,7 @@ private:
     int m_priority;
     QWidget *m_widget;
     QString m_id;
+    QString m_type;
     QString m_helpId;
     Context m_context;
 };
diff --git a/src/plugins/coreplugin/coreconstants.h b/src/plugins/coreplugin/coreconstants.h
index 13081d5ecc7..32c525ddd53 100644
--- a/src/plugins/coreplugin/coreconstants.h
+++ b/src/plugins/coreplugin/coreconstants.h
@@ -68,8 +68,11 @@ const char * const IDE_REVISION_STR      = "";
 
 //modes
 const char * const MODE_WELCOME          = "Welcome";
+const char * const MODE_WELCOME_TYPE     = "Type.Welcome";
 const char * const MODE_EDIT             = "Edit";
+const char * const MODE_EDIT_TYPE        = "Type.Edit";
 const char * const MODE_DESIGN           = "Design";
+const char * const MODE_DESIGN_TYPE      = "Type.Design";
 const int          P_MODE_WELCOME        = 100;
 const int          P_MODE_EDIT           = 90;
 const int          P_MODE_DESIGN         = 89;
diff --git a/src/plugins/coreplugin/designmode.cpp b/src/plugins/coreplugin/designmode.cpp
index 44965576c08..f3d6590e18c 100644
--- a/src/plugins/coreplugin/designmode.cpp
+++ b/src/plugins/coreplugin/designmode.cpp
@@ -164,6 +164,11 @@ QString DesignMode::id() const
     return QLatin1String(Constants::MODE_DESIGN);
 }
 
+QString DesignMode::type() const
+{
+    return QLatin1String(Constants::MODE_DESIGN_TYPE);
+}
+
 QStringList DesignMode::registeredMimeTypes() const
 {
     QStringList rc;
diff --git a/src/plugins/coreplugin/designmode.h b/src/plugins/coreplugin/designmode.h
index 6eee5e77824..7c23c73a829 100644
--- a/src/plugins/coreplugin/designmode.h
+++ b/src/plugins/coreplugin/designmode.h
@@ -73,6 +73,7 @@ public:
     QIcon icon() const;
     int priority() const;
     QString id() const;
+    QString type() const;
 
 signals:
     void actionsUpdated(Core::IEditor *editor);
diff --git a/src/plugins/coreplugin/editmode.cpp b/src/plugins/coreplugin/editmode.cpp
index 2470c4f4d6a..f8ba81af0b2 100644
--- a/src/plugins/coreplugin/editmode.cpp
+++ b/src/plugins/coreplugin/editmode.cpp
@@ -114,6 +114,11 @@ QString EditMode::id() const
     return QLatin1String(Constants::MODE_EDIT);
 }
 
+QString EditMode::type() const
+{
+    return QLatin1String(Constants::MODE_EDIT_TYPE);
+}
+
 Context EditMode::context() const
 {
     static Context contexts(Constants::C_EDIT_MODE,
diff --git a/src/plugins/coreplugin/editmode.h b/src/plugins/coreplugin/editmode.h
index 0e2900cd394..3e289a73fa5 100644
--- a/src/plugins/coreplugin/editmode.h
+++ b/src/plugins/coreplugin/editmode.h
@@ -58,6 +58,7 @@ public:
     int priority() const;
     QWidget* widget();
     QString id() const;
+    QString type() const;
     Context context() const;
 
 private slots:
diff --git a/src/plugins/coreplugin/editormanager/editormanager.cpp b/src/plugins/coreplugin/editormanager/editormanager.cpp
index 1b701a35388..3f2f1050143 100644
--- a/src/plugins/coreplugin/editormanager/editormanager.cpp
+++ b/src/plugins/coreplugin/editormanager/editormanager.cpp
@@ -970,7 +970,7 @@ Core::IEditor *EditorManager::activateEditor(Core::Internal::EditorView *view, C
 
     if (!(flags & NoActivate)) {
         setCurrentEditor(editor, (flags & IgnoreNavigationHistory));
-        if (!(flags & NoModeSwitch)) {
+        if (flags & ModeSwitch) {
             switchToPreferedMode();
         }
         if (isVisible())
@@ -1254,13 +1254,14 @@ void EditorManager::switchToPreferedMode()
     QString preferedMode;
     // Figure out prefered mode for editor
     if (m_d->m_currentEditor)
-        preferedMode = m_d->m_currentEditor->preferredMode();
+        preferedMode = m_d->m_currentEditor->preferredModeType();
 
     if (preferedMode.isEmpty())
-        preferedMode = Constants::MODE_EDIT;
+        preferedMode = Constants::MODE_EDIT_TYPE;
 
-    if (m_d->m_core->modeManager()->currentMode()->id() != preferedMode)
-        m_d->m_core->modeManager()->activateMode(preferedMode);
+    if (m_d->m_core->modeManager()->currentMode()->type() != preferedMode) {
+        m_d->m_core->modeManager()->activateModeType(preferedMode);
+    }
 }
 
 IEditor *EditorManager::openEditorWithContents(const QString &editorId,
diff --git a/src/plugins/coreplugin/editormanager/editormanager.h b/src/plugins/coreplugin/editormanager/editormanager.h
index a67cb271a83..68c22f1e34d 100644
--- a/src/plugins/coreplugin/editormanager/editormanager.h
+++ b/src/plugins/coreplugin/editormanager/editormanager.h
@@ -109,7 +109,7 @@ public:
     enum OpenEditorFlag {
         NoActivate = 1,
         IgnoreNavigationHistory = 2,
-        NoModeSwitch = 4
+        ModeSwitch = 4
     };
     Q_DECLARE_FLAGS(OpenEditorFlags, OpenEditorFlag)
 
diff --git a/src/plugins/coreplugin/editormanager/editorview.cpp b/src/plugins/coreplugin/editormanager/editorview.cpp
index d53f8d2f954..07ba37fd2fe 100644
--- a/src/plugins/coreplugin/editormanager/editorview.cpp
+++ b/src/plugins/coreplugin/editormanager/editorview.cpp
@@ -276,9 +276,9 @@ void EditorView::listSelectionActivated(int index)
     EditorManager *em = CoreImpl::instance()->editorManager();
     QAbstractItemModel *model = EditorManager::instance()->openedEditorsModel();
     if (IEditor *editor = model->data(model->index(index, 0), Qt::UserRole).value<IEditor*>()) {
-        em->activateEditor(this, editor);
+        em->activateEditor(this, editor, Core::EditorManager::ModeSwitch);
     } else {
-        em->activateEditor(model->index(index, 0), this);
+        em->activateEditor(model->index(index, 0), this, Core::EditorManager::ModeSwitch);
     }
 }
 
@@ -445,9 +445,11 @@ void EditorView::goBackInNavigationHistory()
         EditLocation location = m_navigationHistory.at(m_currentNavigationHistoryPosition);
         IEditor *editor;
         if (location.file) {
-            editor = em->activateEditor(this, location.file, EditorManager::IgnoreNavigationHistory);
+            editor = em->activateEditor(this, location.file,
+                                        EditorManager::IgnoreNavigationHistory | EditorManager::ModeSwitch);
         } else {
-            editor = em->openEditor(this, location.fileName, location.id, EditorManager::IgnoreNavigationHistory);
+            editor = em->openEditor(this, location.fileName, location.id,
+                                    EditorManager::IgnoreNavigationHistory | EditorManager::ModeSwitch);
             if (!editor) {
                 m_navigationHistory.removeAt(m_currentNavigationHistoryPosition);
                 continue;
@@ -469,7 +471,8 @@ void EditorView::goForwardInNavigationHistory()
     EditLocation location = m_navigationHistory.at(m_currentNavigationHistoryPosition);
     IEditor *editor;
     if (location.file) {
-        editor = em->activateEditor(this, location.file, EditorManager::IgnoreNavigationHistory);
+        editor = em->activateEditor(this, location.file,
+                                    EditorManager::IgnoreNavigationHistory | EditorManager::ModeSwitch);
     } else {
         editor = em->openEditor(this, location.fileName, location.id, EditorManager::IgnoreNavigationHistory);
         if (!editor) {
diff --git a/src/plugins/coreplugin/editormanager/ieditor.h b/src/plugins/coreplugin/editormanager/ieditor.h
index 58dd9060d8f..3d8b7eb996e 100644
--- a/src/plugins/coreplugin/editormanager/ieditor.h
+++ b/src/plugins/coreplugin/editormanager/ieditor.h
@@ -65,7 +65,7 @@ public:
 
     virtual QWidget *toolBar() = 0;
 
-    virtual QString preferredMode() const { return QString(); }
+    virtual QString preferredModeType() const { return QString(); }
 
 signals:
     void changed();
diff --git a/src/plugins/coreplugin/editormanager/openeditorsview.cpp b/src/plugins/coreplugin/editormanager/openeditorsview.cpp
index f9559a7044f..c8387ff25b5 100644
--- a/src/plugins/coreplugin/editormanager/openeditorsview.cpp
+++ b/src/plugins/coreplugin/editormanager/openeditorsview.cpp
@@ -190,7 +190,7 @@ void OpenEditorsWidget::handleClicked(const QModelIndex &index)
 void OpenEditorsWidget::activateEditor(const QModelIndex &index)
 {
     m_ui.editorList->selectionModel()->select(index, QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows);
-    EditorManager::instance()->activateEditor(index);
+    EditorManager::instance()->activateEditor(index, 0, EditorManager::ModeSwitch);
 }
 
 void OpenEditorsWidget::closeEditor(const QModelIndex &index)
diff --git a/src/plugins/coreplugin/editormanager/openeditorswindow.cpp b/src/plugins/coreplugin/editormanager/openeditorswindow.cpp
index 399ab26486a..e74ba2ff8c7 100644
--- a/src/plugins/coreplugin/editormanager/openeditorswindow.cpp
+++ b/src/plugins/coreplugin/editormanager/openeditorswindow.cpp
@@ -277,9 +277,10 @@ void OpenEditorsWindow::selectEditor(QTreeWidgetItem *item)
         return;
     if (IFile *file = item->data(0, Qt::UserRole).value<IFile*>()) {
         EditorView *view = item->data(0, Qt::UserRole+1).value<EditorView*>();
-        EditorManager::instance()->activateEditor(view, file);
+        EditorManager::instance()->activateEditor(view, file, Core::EditorManager::ModeSwitch);
     } else {
-        EditorManager::instance()->openEditor(item->toolTip(0), item->data(0, Qt::UserRole+2).toByteArray());
+        EditorManager::instance()->openEditor(item->toolTip(0), item->data(0, Qt::UserRole+2).toByteArray(),
+                                              Core::EditorManager::ModeSwitch);
     }
 }
 
diff --git a/src/plugins/coreplugin/editortoolbar.cpp b/src/plugins/coreplugin/editortoolbar.cpp
index 09b57296dde..73d8f8eb114 100644
--- a/src/plugins/coreplugin/editortoolbar.cpp
+++ b/src/plugins/coreplugin/editortoolbar.cpp
@@ -256,12 +256,12 @@ void EditorToolBar::changeActiveEditor(int row)
 
     if (editor) {
         if (editor != em->currentEditor())
-            em->activateEditor(editor, EditorManager::NoModeSwitch);
+            em->activateEditor(editor);
     } else {
         //em->activateEditor(model->index(index, 0), this);
         QString fileName = model->data(modelIndex, Qt::UserRole + 1).toString();
         QByteArray kind = model->data(modelIndex, Qt::UserRole + 2).toByteArray();
-        editor = em->openEditor(fileName, kind, EditorManager::NoModeSwitch);
+        editor = em->openEditor(fileName, kind);
     }
     if (editor) {
         m_editorList->setCurrentIndex(m_editorsListModel->indexOf(editor).row());
diff --git a/src/plugins/coreplugin/imode.h b/src/plugins/coreplugin/imode.h
index 86b4030cc00..7b316f23e33 100644
--- a/src/plugins/coreplugin/imode.h
+++ b/src/plugins/coreplugin/imode.h
@@ -52,6 +52,7 @@ public:
     virtual QIcon icon() const = 0;
     virtual int priority() const = 0;
     virtual QString id() const = 0;
+    virtual QString type() const = 0;
 
     void setEnabled(bool enabled);
     bool isEnabled() const;
diff --git a/src/plugins/coreplugin/mainwindow.cpp b/src/plugins/coreplugin/mainwindow.cpp
index d8e2132936f..77a57c5bcf7 100644
--- a/src/plugins/coreplugin/mainwindow.cpp
+++ b/src/plugins/coreplugin/mainwindow.cpp
@@ -964,7 +964,7 @@ void MainWindow::openFileWith()
         if (isExternal) {
             editorManager()->openExternalEditor(fileName, editorId);
         } else {
-            editorManager()->openEditor(fileName, editorId);
+            editorManager()->openEditor(fileName, editorId, Core::EditorManager::ModeSwitch);
         }
     }
 }
@@ -1272,7 +1272,7 @@ void MainWindow::openRecentFile()
     if (const QAction *action = qobject_cast<const QAction*>(sender())) {
         const QString fileName = action->data().toString();
         if (!fileName.isEmpty())
-            editorManager()->openEditor(fileName);
+            editorManager()->openEditor(fileName, QString(), Core::EditorManager::ModeSwitch);
     }
 }
 
diff --git a/src/plugins/coreplugin/modemanager.cpp b/src/plugins/coreplugin/modemanager.cpp
index 091bcff4f4f..1b0a14e3298 100644
--- a/src/plugins/coreplugin/modemanager.cpp
+++ b/src/plugins/coreplugin/modemanager.cpp
@@ -149,6 +149,19 @@ IMode *ModeManager::mode(const QString &id) const
     return 0;
 }
 
+void ModeManager::activateModeType(const QString &type)
+{
+    int index = -1;
+    for (int i = 0; i < d->m_modes.count(); ++i) {
+        if (d->m_modes.at(i)->type() == type) {
+            index = i;
+            break;
+        }
+    }
+    if (index != -1)
+        d->m_modeStack->setCurrentIndex(index);
+}
+
 void ModeManager::activateMode(const QString &id)
 {
     const int index = indexOf(id);
diff --git a/src/plugins/coreplugin/modemanager.h b/src/plugins/coreplugin/modemanager.h
index ea0fb716188..b0939e88ee5 100644
--- a/src/plugins/coreplugin/modemanager.h
+++ b/src/plugins/coreplugin/modemanager.h
@@ -66,6 +66,8 @@ public:
     void addProjectSelector(QAction *action);
     void addWidget(QWidget *widget);
 
+    void activateModeType(const QString &type);
+
 signals:
     void currentModeAboutToChange(Core::IMode *mode);
 
diff --git a/src/plugins/cpaster/cpasterplugin.cpp b/src/plugins/cpaster/cpasterplugin.cpp
index 492d91f3848..f4908a43a8a 100644
--- a/src/plugins/cpaster/cpasterplugin.cpp
+++ b/src/plugins/cpaster/cpasterplugin.cpp
@@ -342,7 +342,7 @@ void CodepasterPlugin::finishFetch(const QString &titleDescription,
     Core::IEditor* editor = EditorManager::instance()->openEditor(fileName);
     QTC_ASSERT(editor, return)
     editor->setDisplayName(titleDescription);
-    EditorManager::instance()->activateEditor(editor);
+    EditorManager::instance()->activateEditor(editor, Core::EditorManager::ModeSwitch);
 }
 
 Q_EXPORT_PLUGIN(CodepasterPlugin)
diff --git a/src/plugins/cpptools/cppfilesettingspage.cpp b/src/plugins/cpptools/cppfilesettingspage.cpp
index 397cb912808..6355c3e3f2d 100644
--- a/src/plugins/cpptools/cppfilesettingspage.cpp
+++ b/src/plugins/cpptools/cppfilesettingspage.cpp
@@ -285,7 +285,8 @@ void CppFileSettingsWidget::slotEdit()
     QString path = licenseTemplatePath();
     // Edit existing file with C++
     if (!path.isEmpty()) {
-        Core::EditorManager::instance()->openEditor(path, QLatin1String(CppEditor::Constants::CPPEDITOR_ID));
+        Core::EditorManager::instance()->openEditor(path, QLatin1String(CppEditor::Constants::CPPEDITOR_ID),
+                                                    Core::EditorManager::ModeSwitch);
         return;
     }
     // Pick a file name and write new template, edit with C++
@@ -301,7 +302,8 @@ void CppFileSettingsWidget::slotEdit()
     file.write(tr(licenseTemplateTemplate).toUtf8());
     file.close();
     setLicenseTemplatePath(path);
-    Core::EditorManager::instance()->openEditor(path, QLatin1String(CppEditor::Constants::CPPEDITOR_ID));
+    Core::EditorManager::instance()->openEditor(path, QLatin1String(CppEditor::Constants::CPPEDITOR_ID),
+                                                Core::EditorManager::ModeSwitch);
 }
 
 // --------------- CppFileSettingsPage
diff --git a/src/plugins/cpptools/cppfindreferences.cpp b/src/plugins/cpptools/cppfindreferences.cpp
index b0cd403ef3a..6029f33c4a7 100644
--- a/src/plugins/cpptools/cppfindreferences.cpp
+++ b/src/plugins/cpptools/cppfindreferences.cpp
@@ -304,9 +304,11 @@ void CppFindReferences::searchFinished()
 void CppFindReferences::openEditor(const Find::SearchResultItem &item)
 {
     if (item.path.size() > 0) {
-        TextEditor::BaseTextEditor::openEditorAt(item.path.first(), item.lineNumber, item.textMarkPos);
+        TextEditor::BaseTextEditor::openEditorAt(item.path.first(), item.lineNumber, item.textMarkPos,
+                                                 QString(),
+                                                 Core::EditorManager::ModeSwitch);
     } else {
-        Core::EditorManager::instance()->openEditor(item.text);
+        Core::EditorManager::instance()->openEditor(item.text, QString(), Core::EditorManager::ModeSwitch);
     }
 }
 
diff --git a/src/plugins/cvs/cvsplugin.cpp b/src/plugins/cvs/cvsplugin.cpp
index e20b3339efe..c904002cd8e 100644
--- a/src/plugins/cvs/cvsplugin.cpp
+++ b/src/plugins/cvs/cvsplugin.cpp
@@ -557,7 +557,7 @@ void CVSPlugin::cvsDiff(const QString &workingDir, const QStringList &files)
         // Show in the same editor if diff has been executed before
         if (Core::IEditor *editor = locateEditor("originalFileName", id)) {
             editor->createNew(output);
-            Core::EditorManager::instance()->activateEditor(editor);
+            Core::EditorManager::instance()->activateEditor(editor, Core::EditorManager::ModeSwitch);
             setDiffBaseDirectory(editor, workingDir);
             return;
         }
@@ -571,7 +571,8 @@ void CVSPlugin::cvsDiff(const QString &workingDir, const QStringList &files)
 
 CVSSubmitEditor *CVSPlugin::openCVSSubmitEditor(const QString &fileName)
 {
-    Core::IEditor *editor = Core::EditorManager::instance()->openEditor(fileName, QLatin1String(Constants::CVSCOMMITEDITOR_ID));
+    Core::IEditor *editor = Core::EditorManager::instance()->openEditor(fileName, QLatin1String(Constants::CVSCOMMITEDITOR_ID),
+                                                                        Core::EditorManager::ModeSwitch);
     CVSSubmitEditor *submitEditor = qobject_cast<CVSSubmitEditor*>(editor);
     QTC_ASSERT(submitEditor, /**/);
     submitEditor->registerActions(m_submitUndoAction, m_submitRedoAction, m_submitCurrentLogAction, m_submitDiffAction);
@@ -819,7 +820,7 @@ void CVSPlugin::filelog(const QString &workingDir,
     // the common usage pattern of continuously changing and diffing a file
     if (Core::IEditor *editor = locateEditor("logFileName", id)) {
         editor->createNew(response.stdOut);
-        Core::EditorManager::instance()->activateEditor(editor);
+        Core::EditorManager::instance()->activateEditor(editor, Core::EditorManager::ModeSwitch);
     } else {
         const QString title = QString::fromLatin1("cvs log %1").arg(id);
         Core::IEditor *newEditor = showOutputInEditor(title, response.stdOut, VCSBase::LogOutput, source, codec);
@@ -961,7 +962,7 @@ void CVSPlugin::annotate(const QString &workingDir, const QString &file,
     if (Core::IEditor *editor = locateEditor("annotateFileName", id)) {
         editor->createNew(response.stdOut);
         VCSBase::VCSBaseEditor::gotoLineOfEditor(editor, lineNumber);
-        Core::EditorManager::instance()->activateEditor(editor);
+        Core::EditorManager::instance()->activateEditor(editor, Core::EditorManager::ModeSwitch);
     } else {
         const QString title = QString::fromLatin1("cvs annotate %1").arg(id);
         Core::IEditor *newEditor = showOutputInEditor(title, response.stdOut, VCSBase::AnnotateOutput, source, codec);
@@ -1156,7 +1157,7 @@ bool CVSPlugin::describe(const QString &repositoryPath,
     const QString commitId = entries.front().revisions.front().commitId;
     if (Core::IEditor *editor = locateEditor("describeChange", commitId)) {
         editor->createNew(output);
-        Core::EditorManager::instance()->activateEditor(editor);
+        Core::EditorManager::instance()->activateEditor(editor, Core::EditorManager::ModeSwitch);
         setDiffBaseDirectory(editor, repositoryPath);
     } else {
         const QString title = QString::fromLatin1("cvs describe %1").arg(commitId);
@@ -1241,7 +1242,7 @@ Core::IEditor * CVSPlugin::showOutputInEditor(const QString& title, const QStrin
     if (codec)
         e->setCodec(codec);
     Core::IEditor *ie = e->editableInterface();
-    Core::EditorManager::instance()->activateEditor(ie);
+    Core::EditorManager::instance()->activateEditor(ie, Core::EditorManager::ModeSwitch);
     return ie;
 }
 
diff --git a/src/plugins/debugger/debuggeragents.cpp b/src/plugins/debugger/debuggeragents.cpp
index 8130f278866..aeb703e647a 100644
--- a/src/plugins/debugger/debuggeragents.cpp
+++ b/src/plugins/debugger/debuggeragents.cpp
@@ -129,7 +129,7 @@ void MemoryViewAgent::createBinEditor(quint64 addr)
             SIGNAL(endOfFileRequested(Core::IEditor *)),
             SLOT(handleEndOfFileRequested(Core::IEditor*)));
         m_editors << editor;
-        editorManager->activateEditor(editor, EditorManager::NoModeSwitch);
+        editorManager->activateEditor(editor);
         QMetaObject::invokeMethod(editor->widget(), "setNewWindowRequestAllowed");
         QMetaObject::invokeMethod(editor->widget(), "setLazyData",
             Q_ARG(quint64, addr), Q_ARG(int, DataRange), Q_ARG(int, BinBlockSize));
@@ -153,7 +153,7 @@ void MemoryViewAgent::addLazyData(QObject *editorToken, quint64 addr,
 {
     IEditor *editor = qobject_cast<IEditor *>(editorToken);
     if (editor && editor->widget()) {
-        EditorManager::instance()->activateEditor(editor, EditorManager::NoModeSwitch);
+        Core::EditorManager::instance()->activateEditor(editor);
         QMetaObject::invokeMethod(editor->widget(), "addLazyData",
             Q_ARG(quint64, addr / BinBlockSize), Q_ARG(QByteArray, ba));
     }
@@ -349,7 +349,7 @@ void DisassemblerViewAgent::setContents(const QString &contents)
         d->configureMimeType();
     }
 
-    editorManager->activateEditor(d->editor, EditorManager::NoModeSwitch);
+    editorManager->activateEditor(d->editor);
 
     plainTextEdit = qobject_cast<QPlainTextEdit *>(d->editor->widget());
     if (plainTextEdit) {
diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp
index 0a835346bc3..4bd2462ac28 100644
--- a/src/plugins/debugger/debuggerplugin.cpp
+++ b/src/plugins/debugger/debuggerplugin.cpp
@@ -479,6 +479,7 @@ public:
     DebugMode(QObject *parent = 0) : BaseMode(parent)
     {
         setDisplayName(QCoreApplication::translate("Debugger::Internal::DebugMode", "Debug"));
+        setType(Core::Constants::MODE_EDIT_TYPE);
         setId(MODE_DEBUG);
         setIcon(QIcon(__(":/fancyactionbar/images/mode_Debug.png")));
         setPriority(P_MODE_DEBUG);
@@ -2587,7 +2588,7 @@ void DebuggerPlugin::gotoLocation(const QString &file, int line, bool setMarker)
     bool newEditor = false;
     ITextEditor *editor =
         BaseTextEditor::openEditorAt(file, line, 0, QString(),
-            EditorManager::IgnoreNavigationHistory | EditorManager::NoModeSwitch,
+            EditorManager::IgnoreNavigationHistory,
             &newEditor);
     if (!editor)
         return;
@@ -2608,8 +2609,7 @@ void DebuggerPlugin::openTextEditor(const QString &titlePattern0,
     IEditor *editor = editorManager->openEditorWithContents(
         Core::Constants::K_DEFAULT_TEXT_EDITOR_ID, &titlePattern, contents);
     QTC_ASSERT(editor, return);
-    editorManager->activateEditor(editor,
-        EditorManager::IgnoreNavigationHistory|EditorManager::NoModeSwitch);
+    editorManager->activateEditor(editor, EditorManager::IgnoreNavigationHistory);
 }
 
 void DebuggerPlugin::writeSettings() const
diff --git a/src/plugins/designer/formeditorw.cpp b/src/plugins/designer/formeditorw.cpp
index 348bb8b5404..7729b370ace 100644
--- a/src/plugins/designer/formeditorw.cpp
+++ b/src/plugins/designer/formeditorw.cpp
@@ -903,7 +903,7 @@ void FormEditorW::switchSourceForm()
     Core::EditorManager *em = Core::EditorManager::instance();
     const QString fileToOpen = otherFile(em);
     if (!fileToOpen.isEmpty())
-        em->openEditor(fileToOpen);
+        em->openEditor(fileToOpen, QString(), Core::EditorManager::ModeSwitch);
 }
 
 } // namespace Internal
diff --git a/src/plugins/designer/formwindoweditor.cpp b/src/plugins/designer/formwindoweditor.cpp
index 8a97376fad6..39c22d062c1 100644
--- a/src/plugins/designer/formwindoweditor.cpp
+++ b/src/plugins/designer/formwindoweditor.cpp
@@ -257,9 +257,9 @@ TextEditor::PlainTextEditorEditable *FormWindowEditor::textEditable()
     return &d->m_textEditable;
 }
 
-QString FormWindowEditor::preferredMode() const
+QString FormWindowEditor::preferredModeType() const
 {
-    return QLatin1String(Core::Constants::MODE_DESIGN);
+    return QLatin1String(Core::Constants::MODE_DESIGN_TYPE);
 }
 
 } // namespace Designer
diff --git a/src/plugins/designer/formwindoweditor.h b/src/plugins/designer/formwindoweditor.h
index 08380fc5af4..fabc7823b58 100644
--- a/src/plugins/designer/formwindoweditor.h
+++ b/src/plugins/designer/formwindoweditor.h
@@ -88,7 +88,7 @@ public:
 
     virtual QWidget *toolBar();
 
-    virtual  QString preferredMode() const;
+    virtual  QString preferredModeType() const;
 
     // IContext
     virtual Core::Context context() const;
diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp
index 1403dd5cec7..0406b6eaa1a 100644
--- a/src/plugins/git/gitclient.cpp
+++ b/src/plugins/git/gitclient.cpp
@@ -187,7 +187,7 @@ VCSBase::VCSBaseEditor
         if (setSourceCodec)
             rc->setCodec(VCSBase::VCSBaseEditor::getCodec(source));
     }
-    m_core->editorManager()->activateEditor(outputEditor);
+    m_core->editorManager()->activateEditor(outputEditor, Core::EditorManager::ModeSwitch);
     rc->setForceReadOnly(true);
     return rc;
 }
diff --git a/src/plugins/git/gitplugin.cpp b/src/plugins/git/gitplugin.cpp
index 4d768308fea..2e647a0216d 100644
--- a/src/plugins/git/gitplugin.cpp
+++ b/src/plugins/git/gitplugin.cpp
@@ -676,7 +676,8 @@ void GitPlugin::startCommit(bool amend)
 
 Core::IEditor *GitPlugin::openSubmitEditor(const QString &fileName, const CommitData &cd, bool amend)
 {
-    Core::IEditor *editor = m_core->editorManager()->openEditor(fileName, QLatin1String(Constants::GITSUBMITEDITOR_ID));
+    Core::IEditor *editor = m_core->editorManager()->openEditor(fileName, QLatin1String(Constants::GITSUBMITEDITOR_ID),
+                                                                Core::EditorManager::ModeSwitch);
     if (Git::Constants::debug)
         qDebug() << Q_FUNC_INFO << fileName << editor;
     GitSubmitEditor *submitEditor = qobject_cast<GitSubmitEditor*>(editor);
diff --git a/src/plugins/helloworld/helloworldplugin.cpp b/src/plugins/helloworld/helloworldplugin.cpp
index 14ca96b67b1..5a5447fbf8d 100644
--- a/src/plugins/helloworld/helloworldplugin.cpp
+++ b/src/plugins/helloworld/helloworldplugin.cpp
@@ -109,6 +109,7 @@ bool HelloWorldPlugin::initialize(const QStringList &arguments, QString *error_m
     // it will unregister itself from the plugin manager when it is deleted.
     Core::BaseMode *baseMode = new Core::BaseMode;
     baseMode->setId(QLatin1String("HelloWorld.HelloWorldMode"));
+    baseMode->setType(QLatin1String("HelloWorld.HelloWorldMode"));
     baseMode->setDisplayName(tr("Hello world!"));
     baseMode->setIcon(QIcon());
     baseMode->setPriority(0);
diff --git a/src/plugins/locator/basefilefilter.cpp b/src/plugins/locator/basefilefilter.cpp
index 5ba5437cbc5..002ef960d50 100644
--- a/src/plugins/locator/basefilefilter.cpp
+++ b/src/plugins/locator/basefilefilter.cpp
@@ -97,7 +97,7 @@ QList<FilterEntry> BaseFileFilter::matchesFor(QFutureInterface<Locator::FilterEn
 void BaseFileFilter::accept(Locator::FilterEntry selection) const
 {
     Core::EditorManager *em = Core::EditorManager::instance();
-    em->openEditor(selection.internalData.toString());
+    em->openEditor(selection.internalData.toString(), QString(), Core::EditorManager::ModeSwitch);
 }
 
 void BaseFileFilter::generateFileNames()
diff --git a/src/plugins/locator/filesystemfilter.cpp b/src/plugins/locator/filesystemfilter.cpp
index fe24241dbe3..65b2f1ea459 100644
--- a/src/plugins/locator/filesystemfilter.cpp
+++ b/src/plugins/locator/filesystemfilter.cpp
@@ -106,7 +106,8 @@ void FileSystemFilter::accept(FilterEntry selection) const
         m_locatorWidget->show(value, value.length());
         return;
     }
-    m_editorManager->openEditor(selection.internalData.toString());
+    m_editorManager->openEditor(selection.internalData.toString(), QString(),
+                                Core::EditorManager::ModeSwitch);
 }
 
 bool FileSystemFilter::openConfigDialog(QWidget *parent, bool &needsRefresh)
diff --git a/src/plugins/locator/opendocumentsfilter.cpp b/src/plugins/locator/opendocumentsfilter.cpp
index 0c06aff5a13..5603108d8f7 100644
--- a/src/plugins/locator/opendocumentsfilter.cpp
+++ b/src/plugins/locator/opendocumentsfilter.cpp
@@ -101,8 +101,8 @@ void OpenDocumentsFilter::accept(FilterEntry selection) const
 {
     IEditor *editor = selection.internalData.value<IEditor *>();
     if (editor) {
-        m_editorManager->activateEditor(editor);
+        m_editorManager->activateEditor(editor, Core::EditorManager::ModeSwitch);
         return;
     }
-    m_editorManager->openEditor(selection.internalData.toString());
+    m_editorManager->openEditor(selection.internalData.toString(), QString(), Core::EditorManager::ModeSwitch);
 }
diff --git a/src/plugins/mercurial/mercurialclient.cpp b/src/plugins/mercurial/mercurialclient.cpp
index 57c46a62864..3cc71ca7aa0 100644
--- a/src/plugins/mercurial/mercurialclient.cpp
+++ b/src/plugins/mercurial/mercurialclient.cpp
@@ -628,7 +628,7 @@ VCSBase::VCSBaseEditor *MercurialClient::createVCSEditor(const QString &kind, QS
             baseEditor->setCodec(VCSBase::VCSBaseEditor::getCodec(source));
     }
 
-    core->editorManager()->activateEditor(outputEditor);
+    core->editorManager()->activateEditor(outputEditor, Core::EditorManager::ModeSwitch);
     baseEditor->setForceReadOnly(true);
     return baseEditor;
 }
diff --git a/src/plugins/mercurial/mercurialplugin.cpp b/src/plugins/mercurial/mercurialplugin.cpp
index 51495fe4ab6..1d5aac70b26 100644
--- a/src/plugins/mercurial/mercurialplugin.cpp
+++ b/src/plugins/mercurial/mercurialplugin.cpp
@@ -593,7 +593,8 @@ void MercurialPlugin::showCommitWidget(const QList<QPair<QString, QString> > &st
     }
 
     Core::IEditor *editor = core->editorManager()->openEditor(changeLog->fileName(),
-                                                              QLatin1String(Constants::COMMIT_ID));
+                                                              QLatin1String(Constants::COMMIT_ID),
+                                                              Core::EditorManager::ModeSwitch);
     if (!editor) {
         outputWindow->appendError(tr("Unable to create an editor for the commit."));
         return;
diff --git a/src/plugins/perforce/perforceplugin.cpp b/src/plugins/perforce/perforceplugin.cpp
index 6e4600e57d5..4c6711462af 100644
--- a/src/plugins/perforce/perforceplugin.cpp
+++ b/src/plugins/perforce/perforceplugin.cpp
@@ -673,7 +673,8 @@ void PerforcePlugin::startSubmitProject()
 Core::IEditor *PerforcePlugin::openPerforceSubmitEditor(const QString &fileName, const QStringList &depotFileNames)
 {
     Core::EditorManager *editorManager = Core::EditorManager::instance();
-    Core::IEditor *editor = editorManager->openEditor(fileName, Constants::PERFORCE_SUBMIT_EDITOR_ID);
+    Core::IEditor *editor = editorManager->openEditor(fileName, Constants::PERFORCE_SUBMIT_EDITOR_ID,
+                                                      Core::EditorManager::ModeSwitch);
     PerforceSubmitEditor *submitEditor = static_cast<PerforceSubmitEditor*>(editor);
     submitEditor->restrictToProjectFiles(depotFileNames);
     submitEditor->registerActions(m_undoAction, m_redoAction, m_submitCurrentLogAction, m_diffSelectedFiles);
@@ -1198,7 +1199,7 @@ Core::IEditor * PerforcePlugin::showOutputInEditor(const QString& title, const Q
     if (codec)
         e->setCodec(codec);
     Core::IEditor *ie = e->editableInterface();
-    Core::EditorManager::instance()->activateEditor(ie);
+    Core::EditorManager::instance()->activateEditor(ie, Core::EditorManager::ModeSwitch);
     return ie;
 }
 
@@ -1239,7 +1240,7 @@ void PerforcePlugin::p4Diff(const QString &workingDir, const QStringList &files)
 
     if (existingEditor) {
         existingEditor->createNew(result.stdOut);
-        Core::EditorManager::instance()->activateEditor(existingEditor);
+        Core::EditorManager::instance()->activateEditor(existingEditor, Core::EditorManager::ModeSwitch);
     } else {
         Core::IEditor *editor = showOutputInEditor(tr("p4 diff %1").arg(id), result.stdOut, VCSBase::DiffOutput,
                                                    VCSBase::VCSBaseEditor::getSource(workingDir, files),
diff --git a/src/plugins/projectexplorer/foldernavigationwidget.cpp b/src/plugins/projectexplorer/foldernavigationwidget.cpp
index b505d7d9fd9..b256ba0b2d5 100644
--- a/src/plugins/projectexplorer/foldernavigationwidget.cpp
+++ b/src/plugins/projectexplorer/foldernavigationwidget.cpp
@@ -267,7 +267,7 @@ void FolderNavigationWidget::openItem(const QModelIndex &srcIndex)
     }
     // Open file.
     Core::EditorManager *editorManager = Core::EditorManager::instance();
-    editorManager->openEditor(m_fileSystemModel->filePath(srcIndex));
+    editorManager->openEditor(m_fileSystemModel->filePath(srcIndex), QString(), Core::EditorManager::ModeSwitch);
 }
 
 void FolderNavigationWidget::setCurrentTitle(QString dirName, const QString &fullPath)
diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp
index b8e9fb31ccf..c8afcd8599e 100644
--- a/src/plugins/projectexplorer/projectexplorer.cpp
+++ b/src/plugins/projectexplorer/projectexplorer.cpp
@@ -2102,7 +2102,7 @@ void ProjectExplorerPlugin::openFile()
 {
     QTC_ASSERT(d->m_currentNode, return)
     Core::EditorManager *em = Core::EditorManager::instance();
-    em->openEditor(d->m_currentNode->path());
+    em->openEditor(d->m_currentNode->path(), QString(), Core::EditorManager::ModeSwitch);
 }
 
 void ProjectExplorerPlugin::showInGraphicalShell()
@@ -2297,7 +2297,7 @@ void ProjectExplorerPlugin::openEditorFromAction(QAction *action, const QString
                 return;
         }
 
-        em->openEditor(fileName, factory->id());
+        em->openEditor(fileName, factory->id(), Core::EditorManager::ModeSwitch);
         return;
     }
     if (qVariantCanConvert<Core::IExternalEditor *>(data)) {
diff --git a/src/plugins/projectexplorer/projecttreewidget.cpp b/src/plugins/projectexplorer/projecttreewidget.cpp
index 20d18d07180..85109a4cd1a 100644
--- a/src/plugins/projectexplorer/projecttreewidget.cpp
+++ b/src/plugins/projectexplorer/projecttreewidget.cpp
@@ -300,7 +300,7 @@ void ProjectTreeWidget::openItem(const QModelIndex &mainIndex)
     Node *node = m_model->nodeForIndex(mainIndex);
     if (node->nodeType() == FileNodeType) {
         Core::EditorManager *editorManager = Core::EditorManager::instance();
-        editorManager->openEditor(node->path());
+        editorManager->openEditor(node->path(), QString(), Core::EditorManager::ModeSwitch);
     }
 }
 
diff --git a/src/plugins/qmljseditor/qmljseditor.cpp b/src/plugins/qmljseditor/qmljseditor.cpp
index 7cedf1806a1..9ea7c681742 100644
--- a/src/plugins/qmljseditor/qmljseditor.cpp
+++ b/src/plugins/qmljseditor/qmljseditor.cpp
@@ -657,14 +657,14 @@ static bool openInDesignMode()
     return bool(QmlDesigner::Constants::QML_OPENDESIGNMODE_DEFAULT);
 }
 
-QString QmlJSEditorEditable::preferredMode() const
+QString QmlJSEditorEditable::preferredModeType() const
 {
     Core::ModeManager *modeManager = Core::ModeManager::instance();
     if (modeManager->currentMode()
-            && (modeManager->currentMode()->id() == Core::Constants::MODE_DESIGN
-                || modeManager->currentMode()->id() == Core::Constants::MODE_EDIT))
+            && (modeManager->currentMode()->type() == Core::Constants::MODE_DESIGN_TYPE
+                || modeManager->currentMode()->type() == Core::Constants::MODE_EDIT_TYPE))
     {
-        return modeManager->currentMode()->id();
+        return modeManager->currentMode()->type();
     }
 
     // if we are in other mode than edit or design, use the hard-coded default.
@@ -672,7 +672,7 @@ QString QmlJSEditorEditable::preferredMode() const
     // have the user also access to this failsafe setting.
     if (editor()->mimeType() == QLatin1String(QmlJSEditor::Constants::QML_MIMETYPE)
         && openInDesignMode())
-        return QLatin1String(Core::Constants::MODE_DESIGN);
+        return QLatin1String(Core::Constants::MODE_DESIGN_TYPE);
     return QString();
 }
 
diff --git a/src/plugins/qmljseditor/qmljseditor.h b/src/plugins/qmljseditor/qmljseditor.h
index b70ad1ae889..5c1dd65b301 100644
--- a/src/plugins/qmljseditor/qmljseditor.h
+++ b/src/plugins/qmljseditor/qmljseditor.h
@@ -81,7 +81,7 @@ public:
     QString id() const;
     bool isTemporary() const { return false; }
     virtual bool open(const QString & fileName);
-    virtual QString preferredMode() const;
+    virtual QString preferredModeType() const;
 
 private:
     Core::Context m_context;
diff --git a/src/plugins/qmljsinspector/qmljsinspector.cpp b/src/plugins/qmljsinspector/qmljsinspector.cpp
index a62f916f3f4..f789f843a4a 100644
--- a/src/plugins/qmljsinspector/qmljsinspector.cpp
+++ b/src/plugins/qmljsinspector/qmljsinspector.cpp
@@ -519,7 +519,7 @@ void InspectorUi::gotoObjectReferenceDefinition(const QDeclarativeDebugObjectRef
     }
 
     Core::EditorManager *editorManager = Core::EditorManager::instance();
-    Core::IEditor *editor = editorManager->openEditor(fileName, QString(), Core::EditorManager::NoModeSwitch);
+    Core::IEditor *editor = editorManager->openEditor(fileName);
     TextEditor::ITextEditor *textEditor = qobject_cast<TextEditor::ITextEditor*>(editor);
 
     if (textEditor) {
diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemopackagecreationwidget.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemopackagecreationwidget.cpp
index b8a6e5fdaf8..852f24ab436 100644
--- a/src/plugins/qt4projectmanager/qt-maemo/maemopackagecreationwidget.cpp
+++ b/src/plugins/qt4projectmanager/qt-maemo/maemopackagecreationwidget.cpp
@@ -210,7 +210,9 @@ void MaemoPackageCreationWidget::editDebianFile()
     const QString debianFilePath = MaemoTemplatesManager::instance()
         ->debianDirPath(m_step->buildConfiguration()->target()->project())
         + QLatin1Char('/') + m_ui->debianFilesComboBox->currentText();
-    Core::EditorManager::instance()->openEditor(debianFilePath);
+    Core::EditorManager::instance()->openEditor(debianFilePath,
+                                                QString(),
+                                                Core::EditorManager::ModeSwitch);
 }
 
 } // namespace Internal
diff --git a/src/plugins/qt4projectmanager/wizards/qmlstandaloneappwizard.cpp b/src/plugins/qt4projectmanager/wizards/qmlstandaloneappwizard.cpp
index e7574df0948..abf1cf103db 100644
--- a/src/plugins/qt4projectmanager/wizards/qmlstandaloneappwizard.cpp
+++ b/src/plugins/qt4projectmanager/wizards/qmlstandaloneappwizard.cpp
@@ -190,7 +190,8 @@ bool QmlStandaloneAppWizard::postGenerateFiles(const QWizard *wizard, const Core
     const bool success = ProjectExplorer::CustomProjectWizard::postGenerateOpen(l, errorMessage);
     if (success && m_d->type == QmlStandaloneAppWizard::ImportQmlFile) {
         ProjectExplorer::ProjectExplorerPlugin::instance()->setCurrentFile(0, m_d->standaloneApp->mainQmlFile());
-        Core::EditorManager::instance()->openEditor(m_d->standaloneApp->mainQmlFile());
+        Core::EditorManager::instance()->openEditor(m_d->standaloneApp->mainQmlFile(),
+                                                    QString(), Core::EditorManager::ModeSwitch);
     }
     return success;
 }
diff --git a/src/plugins/subversion/subversionplugin.cpp b/src/plugins/subversion/subversionplugin.cpp
index 2e56d222430..332ca5f3724 100644
--- a/src/plugins/subversion/subversionplugin.cpp
+++ b/src/plugins/subversion/subversionplugin.cpp
@@ -558,7 +558,7 @@ void SubversionPlugin::svnDiff(const QString &workingDir, const QStringList &fil
         // Show in the same editor if diff has been executed before
         if (Core::IEditor *editor = locateEditor("originalFileName", files.front())) {
             editor->createNew(response.stdOut);
-            Core::EditorManager::instance()->activateEditor(editor);
+            Core::EditorManager::instance()->activateEditor(editor, Core::EditorManager::ModeSwitch);
             setDiffBaseDirectory(editor, workingDir);
             return;
         }
@@ -572,7 +572,9 @@ void SubversionPlugin::svnDiff(const QString &workingDir, const QStringList &fil
 
 SubversionSubmitEditor *SubversionPlugin::openSubversionSubmitEditor(const QString &fileName)
 {
-    Core::IEditor *editor = Core::EditorManager::instance()->openEditor(fileName, QLatin1String(Constants::SUBVERSIONCOMMITEDITOR_ID));
+    Core::IEditor *editor = Core::EditorManager::instance()->openEditor(fileName,
+                                                                        QLatin1String(Constants::SUBVERSIONCOMMITEDITOR_ID),
+                                                                        Core::EditorManager::ModeSwitch);
     SubversionSubmitEditor *submitEditor = qobject_cast<SubversionSubmitEditor*>(editor);
     QTC_ASSERT(submitEditor, /**/);
     submitEditor->registerActions(m_submitUndoAction, m_submitRedoAction, m_submitCurrentLogAction, m_submitDiffAction);
@@ -858,7 +860,7 @@ void SubversionPlugin::filelog(const QString &workingDir,
     const QString id = VCSBase::VCSBaseEditor::getTitleId(workingDir, files);
     if (Core::IEditor *editor = locateEditor("logFileName", id)) {
         editor->createNew(response.stdOut);
-        Core::EditorManager::instance()->activateEditor(editor);
+        Core::EditorManager::instance()->activateEditor(editor, Core::EditorManager::ModeSwitch);
     } else {
         const QString title = QString::fromLatin1("svn log %1").arg(id);
         const QString source = VCSBase::VCSBaseEditor::getSource(workingDir, files);
@@ -935,7 +937,7 @@ void SubversionPlugin::vcsAnnotate(const QString &workingDir, const QString &fil
     if (Core::IEditor *editor = locateEditor("annotateFileName", id)) {
         editor->createNew(response.stdOut);
         VCSBase::VCSBaseEditor::gotoLineOfEditor(editor, lineNumber);
-        Core::EditorManager::instance()->activateEditor(editor);
+        Core::EditorManager::instance()->activateEditor(editor, Core::EditorManager::ModeSwitch);
     } else {
         const QString title = QString::fromLatin1("svn annotate %1").arg(id);
         Core::IEditor *newEditor = showOutputInEditor(title, response.stdOut, VCSBase::AnnotateOutput, source, codec);
@@ -999,7 +1001,7 @@ void SubversionPlugin::describe(const QString &source, const QString &changeNr)
     const QString id = diffArg + source;
     if (Core::IEditor *editor = locateEditor("describeChange", id)) {
         editor->createNew(description);
-        Core::EditorManager::instance()->activateEditor(editor);
+        Core::EditorManager::instance()->activateEditor(editor, Core::EditorManager::ModeSwitch);
     } else {
         const QString title = QString::fromLatin1("svn describe %1#%2").arg(fi.fileName(), changeNr);
         Core::IEditor *newEditor = showOutputInEditor(title, description, VCSBase::DiffOutput, source, codec);
@@ -1118,7 +1120,7 @@ Core::IEditor * SubversionPlugin::showOutputInEditor(const QString& title, const
     if (codec)
         e->setCodec(codec);
     Core::IEditor *ie = e->editableInterface();
-    Core::EditorManager::instance()->activateEditor(ie);
+    Core::EditorManager::instance()->activateEditor(ie, Core::EditorManager::ModeSwitch);
     return ie;
 }
 
diff --git a/src/plugins/texteditor/basefilefind.cpp b/src/plugins/texteditor/basefilefind.cpp
index 6de00a8bc9a..b34e1587bce 100644
--- a/src/plugins/texteditor/basefilefind.cpp
+++ b/src/plugins/texteditor/basefilefind.cpp
@@ -262,9 +262,10 @@ void BaseFileFind::updateComboEntries(QComboBox *combo, bool onTop)
 void BaseFileFind::openEditor(const Find::SearchResultItem &item)
 {
     if (item.path.size() > 0) {
-        TextEditor::BaseTextEditor::openEditorAt(item.path.first(), item.lineNumber, item.textMarkPos);
+        TextEditor::BaseTextEditor::openEditorAt(item.path.first(), item.lineNumber, item.textMarkPos,
+                                                 QString(), Core::EditorManager::ModeSwitch);
     } else {
-        Core::EditorManager::instance()->openEditor(item.text);
+        Core::EditorManager::instance()->openEditor(item.text, QString(), Core::EditorManager::ModeSwitch);
     }
 }
 
diff --git a/src/plugins/texteditor/refactoringchanges.cpp b/src/plugins/texteditor/refactoringchanges.cpp
index 25da5bafae1..4bf0be8bed8 100644
--- a/src/plugins/texteditor/refactoringchanges.cpp
+++ b/src/plugins/texteditor/refactoringchanges.cpp
@@ -68,7 +68,7 @@ BaseTextEditor *RefactoringChanges::editorForFile(const QString &fileName,
     }
 
     Core::IEditor *editor = editorManager->openEditor(fileName, QString(),
-                                                      Core::EditorManager::NoActivate | Core::EditorManager::IgnoreNavigationHistory | Core::EditorManager::NoModeSwitch);
+                                                      Core::EditorManager::NoActivate | Core::EditorManager::IgnoreNavigationHistory);
     return qobject_cast<BaseTextEditor *>(editor->widget());
 }
 
@@ -161,7 +161,7 @@ BaseTextEditor *RefactoringChanges::activateEditor(const QString &fileName, int
     BaseTextEditor *editor = openEditor(fileName, pos);
 
     Core::EditorManager *editorManager = Core::EditorManager::instance();
-    editorManager->activateEditor(editor->editableInterface());
+    editorManager->activateEditor(editor->editableInterface(), Core::EditorManager::ModeSwitch);
 
     return editor;
 }
diff --git a/src/plugins/vcsbase/cleandialog.cpp b/src/plugins/vcsbase/cleandialog.cpp
index b068607a538..23104b7bdac 100644
--- a/src/plugins/vcsbase/cleandialog.cpp
+++ b/src/plugins/vcsbase/cleandialog.cpp
@@ -252,7 +252,7 @@ void CleanDialog::slotDoubleClicked(const QModelIndex &index)
     if (const QStandardItem *item = d->m_filesModel->itemFromIndex(index))
         if (!item->data(isDirectoryRole).toBool()) {
             const QString fname = item->data(fileNameRole).toString();
-            Core::EditorManager::instance()->openEditor(fname);
+            Core::EditorManager::instance()->openEditor(fname, QString(), Core::EditorManager::ModeSwitch);
     }
 }
 
diff --git a/src/plugins/vcsbase/vcsbaseeditor.cpp b/src/plugins/vcsbase/vcsbaseeditor.cpp
index fc0281c5ba1..f65e221f634 100644
--- a/src/plugins/vcsbase/vcsbaseeditor.cpp
+++ b/src/plugins/vcsbase/vcsbaseeditor.cpp
@@ -635,8 +635,7 @@ void VCSBaseEditor::jumpToChangeFromDiff(QTextCursor cursor)
         return;
 
     Core::EditorManager *em = Core::EditorManager::instance();
-    Core::IEditor *ed = em->openEditor(fileName);
-    Core::ModeManager::instance()->activateMode(Core::Constants::MODE_EDIT);
+    Core::IEditor *ed = em->openEditor(fileName, QString(), Core::EditorManager::ModeSwitch);
     if (TextEditor::ITextEditor *editor = qobject_cast<TextEditor::ITextEditor *>(ed))
         editor->gotoLine(chunkStart + lineCount);
 }
diff --git a/src/plugins/vcsbase/vcsbaseoutputwindow.cpp b/src/plugins/vcsbase/vcsbaseoutputwindow.cpp
index 5045ddca1f1..56ffe8b2e35 100644
--- a/src/plugins/vcsbase/vcsbaseoutputwindow.cpp
+++ b/src/plugins/vcsbase/vcsbaseoutputwindow.cpp
@@ -174,7 +174,7 @@ void OutputWindowPlainTextEdit::contextMenuEvent(QContextMenuEvent *event)
         }
         if (action == openAction) {
             const QString fileName = action->data().toString();
-            Core::EditorManager::instance()->openEditor(fileName);
+            Core::EditorManager::instance()->openEditor(fileName, QString(), Core::EditorManager::ModeSwitch);
         }
     }
     delete menu;
diff --git a/src/plugins/vcsbase/vcsbasesubmiteditor.cpp b/src/plugins/vcsbase/vcsbasesubmiteditor.cpp
index 736a7981685..ad3b7249022 100644
--- a/src/plugins/vcsbase/vcsbasesubmiteditor.cpp
+++ b/src/plugins/vcsbase/vcsbasesubmiteditor.cpp
@@ -691,7 +691,7 @@ bool VCSBaseSubmitEditor::raiseSubmitEditor()
     // Try to activate a hidden one
     foreach (Core::IEditor *e, em->openedEditors()) {
         if (qobject_cast<VCSBaseSubmitEditor*>(e)) {
-            em->activateEditor(e, Core::EditorManager::IgnoreNavigationHistory);
+            em->activateEditor(e, Core::EditorManager::IgnoreNavigationHistory | Core::EditorManager::ModeSwitch);
             return true;
         }
     }
diff --git a/src/plugins/welcome/welcomemode.cpp b/src/plugins/welcome/welcomemode.cpp
index 4c7e3d57630..a09b5647670 100644
--- a/src/plugins/welcome/welcomemode.cpp
+++ b/src/plugins/welcome/welcomemode.cpp
@@ -147,6 +147,11 @@ QString WelcomeMode::id() const
     return QLatin1String(Core::Constants::MODE_WELCOME);
 }
 
+QString WelcomeMode::type() const
+{
+    return QLatin1String(Core::Constants::MODE_WELCOME_TYPE);
+}
+
 Core::Context WelcomeMode::context() const
 {
     static Core::Context contexts(Core::Constants::C_WELCOME_MODE);
diff --git a/src/plugins/welcome/welcomemode.h b/src/plugins/welcome/welcomemode.h
index 47cac9b4c32..acd4ac2b172 100644
--- a/src/plugins/welcome/welcomemode.h
+++ b/src/plugins/welcome/welcomemode.h
@@ -60,6 +60,7 @@ public:
     int priority() const;
     QWidget *widget();
     QString id() const;
+    QString type() const;
     Core::Context context() const;
     void activated();
     QString contextHelpId() const { return QLatin1String("Qt Creator Manual"); }
-- 
GitLab