EditorManager: Do not be a widget.

There is no reason for the editor manager itself to be a widget. This
makes even less sense in the presence of multiple windows.

Change-Id: I384f8945fdd5632d64643e473e6637e05abbce7e
Reviewed-by: hjk <hjk121@nokiamail.com>
Reviewed-by: Daniel Teske <daniel.teske@digia.com>
This commit is contained in:
Eike Ziller
2014-07-18 15:33:30 +02:00
committed by hjk
parent 30bad4b3f0
commit 4b82817391
11 changed files with 164 additions and 94 deletions

View File

@@ -118,6 +118,7 @@ HEADERS += mainwindow.h \
vcsmanager.h \ vcsmanager.h \
statusbarmanager.h \ statusbarmanager.h \
editormanager/editormanager.h \ editormanager/editormanager.h \
editormanager/editormanager_p.h \
editormanager/editorview.h \ editormanager/editorview.h \
editormanager/documentmodel.h \ editormanager/documentmodel.h \
editormanager/openeditorsview.h \ editormanager/openeditorsview.h \

View File

@@ -140,7 +140,7 @@ QtcPlugin {
files: [ files: [
"BinFiles.mimetypes.xml", "BinFiles.mimetypes.xml",
"documentmodel.cpp", "documentmodel.h", "documentmodel.cpp", "documentmodel.h",
"editormanager.cpp", "editormanager.h", "editormanager.cpp", "editormanager.h", "editormanager_p.h",
"editorview.cpp", "editorview.h", "editorview.cpp", "editorview.h",
"ieditor.cpp", "ieditor.h", "ieditor.cpp", "ieditor.h",
"ieditorfactory.cpp", "ieditorfactory.h", "ieditorfactory.cpp", "ieditorfactory.h",

View File

@@ -60,7 +60,8 @@ EditMode::EditMode() :
m_rightSplitWidgetLayout->setMargin(0); m_rightSplitWidgetLayout->setMargin(0);
QWidget *rightSplitWidget = new QWidget; QWidget *rightSplitWidget = new QWidget;
rightSplitWidget->setLayout(m_rightSplitWidgetLayout); rightSplitWidget->setLayout(m_rightSplitWidgetLayout);
m_rightSplitWidgetLayout->insertWidget(0, new Core::EditorManagerPlaceHolder(this)); auto editorPlaceHolder = new EditorManagerPlaceHolder(this);
m_rightSplitWidgetLayout->insertWidget(0, editorPlaceHolder);
MiniSplitter *rightPaneSplitter = new MiniSplitter; MiniSplitter *rightPaneSplitter = new MiniSplitter;
rightPaneSplitter->insertWidget(0, rightSplitWidget); rightPaneSplitter->insertWidget(0, rightSplitWidget);
@@ -84,7 +85,7 @@ EditMode::EditMode() :
connect(ModeManager::instance(), SIGNAL(currentModeChanged(Core::IMode*)), connect(ModeManager::instance(), SIGNAL(currentModeChanged(Core::IMode*)),
this, SLOT(grabEditorManager(Core::IMode*))); this, SLOT(grabEditorManager(Core::IMode*)));
m_splitter->setFocusProxy(EditorManager::instance()); m_splitter->setFocusProxy(editorPlaceHolder);
IContext *modeContextObject = new IContext(this); IContext *modeContextObject = new IContext(this);
modeContextObject->setContext(Context(Constants::C_EDITORMANAGER)); modeContextObject->setContext(Context(Constants::C_EDITORMANAGER));

View File

@@ -28,6 +28,8 @@
****************************************************************************/ ****************************************************************************/
#include "editormanager.h" #include "editormanager.h"
#include "editormanager_p.h"
#include "editorview.h" #include "editorview.h"
#include "openeditorswindow.h" #include "openeditorswindow.h"
#include "openeditorsview.h" #include "openeditorsview.h"
@@ -119,6 +121,7 @@ EditorManagerPlaceHolder::EditorManagerPlaceHolder(Core::IMode *mode, QWidget *p
{ {
setLayout(new QVBoxLayout); setLayout(new QVBoxLayout);
layout()->setMargin(0); layout()->setMargin(0);
setFocusProxy(EditorManagerPrivate::rootWidget());
connect(Core::ModeManager::instance(), SIGNAL(currentModeChanged(Core::IMode*)), connect(Core::ModeManager::instance(), SIGNAL(currentModeChanged(Core::IMode*)),
this, SLOT(currentModeChanged(Core::IMode*))); this, SLOT(currentModeChanged(Core::IMode*)));
@@ -128,7 +131,7 @@ EditorManagerPlaceHolder::EditorManagerPlaceHolder(Core::IMode *mode, QWidget *p
EditorManagerPlaceHolder::~EditorManagerPlaceHolder() EditorManagerPlaceHolder::~EditorManagerPlaceHolder()
{ {
// EditorManager will be deleted in ~MainWindow() // EditorManager will be deleted in ~MainWindow()
EditorManager *em = EditorManager::instance(); QWidget *em = EditorManagerPrivate::rootWidget();
if (em && em->parent() == this) { if (em && em->parent() == this) {
em->hide(); em->hide();
em->setParent(0); em->setParent(0);
@@ -139,10 +142,11 @@ void EditorManagerPlaceHolder::currentModeChanged(Core::IMode *mode)
{ {
if (m_mode == mode) { if (m_mode == mode) {
QWidget *previousFocus = 0; QWidget *previousFocus = 0;
if (EditorManager::instance()->focusWidget() && EditorManager::instance()->focusWidget()->hasFocus()) QWidget *em = EditorManagerPrivate::rootWidget();
previousFocus = EditorManager::instance()->focusWidget(); if (em->focusWidget() && em->focusWidget()->hasFocus())
layout()->addWidget(EditorManager::instance()); previousFocus = em->focusWidget();
EditorManager::instance()->show(); layout()->addWidget(em);
em->show();
if (previousFocus) if (previousFocus)
previousFocus->setFocus(); previousFocus->setFocus();
} }
@@ -150,71 +154,10 @@ void EditorManagerPlaceHolder::currentModeChanged(Core::IMode *mode)
// ---------------- EditorManager // ---------------- EditorManager
namespace Core { static EditorManager *m_instance = 0;
static EditorManagerPrivate *d;
EditorManagerPrivate::EditorManagerPrivate(QObject *parent) :
class EditorManagerPrivate
{
public:
explicit EditorManagerPrivate(QWidget *parent);
~EditorManagerPrivate();
QList<EditLocation> m_globalHistory;
QList<Internal::SplitterOrView *> m_root;
QList<IContext *> m_rootContext;
QPointer<IEditor> m_currentEditor;
QPointer<IEditor> m_scheduledCurrentEditor;
QPointer<EditorView> m_currentView;
QTimer *m_autoSaveTimer;
// actions
QAction *m_revertToSavedAction;
QAction *m_saveAction;
QAction *m_saveAsAction;
QAction *m_closeCurrentEditorAction;
QAction *m_closeAllEditorsAction;
QAction *m_closeOtherEditorsAction;
QAction *m_closeAllEditorsExceptVisibleAction;
QAction *m_gotoNextDocHistoryAction;
QAction *m_gotoPreviousDocHistoryAction;
QAction *m_goBackAction;
QAction *m_goForwardAction;
QAction *m_splitAction;
QAction *m_splitSideBySideAction;
QAction *m_splitNewWindowAction;
QAction *m_removeCurrentSplitAction;
QAction *m_removeAllSplitsAction;
QAction *m_gotoNextSplitAction;
QAction *m_saveCurrentEditorContextAction;
QAction *m_saveAsCurrentEditorContextAction;
QAction *m_revertToSavedCurrentEditorContextAction;
QAction *m_closeCurrentEditorContextAction;
QAction *m_closeAllEditorsContextAction;
QAction *m_closeOtherEditorsContextAction;
QAction *m_closeAllEditorsExceptVisibleContextAction;
QAction *m_openGraphicalShellAction;
QAction *m_openTerminalAction;
QAction *m_findInDirectoryAction;
DocumentModel::Entry *m_contextMenuEntry;
Internal::OpenEditorsWindow *m_windowPopup;
Internal::EditorClosingCoreListener *m_coreListener;
QMap<QString, QVariant> m_editorStates;
Internal::OpenEditorsViewFactory *m_openEditorsFactory;
IDocument::ReloadSetting m_reloadSetting;
QString m_titleAddition;
QString m_titleVcsTopic;
bool m_autoSaveEnabled;
int m_autoSaveInterval;
};
}
EditorManagerPrivate::EditorManagerPrivate(QWidget *parent) :
m_autoSaveTimer(0), m_autoSaveTimer(0),
m_revertToSavedAction(new QAction(EditorManager::tr("Revert to Saved"), parent)), m_revertToSavedAction(new QAction(EditorManager::tr("Revert to Saved"), parent)),
m_saveAction(new QAction(parent)), m_saveAction(new QAction(parent)),
@@ -252,13 +195,15 @@ EditorManagerPrivate::~EditorManagerPrivate()
DocumentModel::destroy(); DocumentModel::destroy();
} }
static EditorManager *m_instance = 0; QWidget *EditorManagerPrivate::rootWidget()
static EditorManagerPrivate *d; {
return d->m_root.at(0);
}
EditorManager *EditorManager::instance() { return m_instance; } EditorManager *EditorManager::instance() { return m_instance; }
EditorManager::EditorManager(QWidget *parent) : EditorManager::EditorManager(QObject *parent) :
QWidget(parent) QObject(parent)
{ {
d = new EditorManagerPrivate(parent); d = new EditorManagerPrivate(parent);
m_instance = this; m_instance = this;
@@ -425,18 +370,16 @@ EditorManager::EditorManager(QWidget *parent) :
// other setup // other setup
SplitterOrView *firstRoot = new SplitterOrView(); SplitterOrView *firstRoot = new SplitterOrView();
firstRoot->hide();
connect(firstRoot, SIGNAL(destroyed(QObject*)), m_instance, SLOT(rootDestroyed(QObject*)));
d->m_root.append(firstRoot); d->m_root.append(firstRoot);
d->m_rootContext.append(0); d->m_rootContext.append(0);
d->m_currentView = firstRoot->view(); d->m_currentView = firstRoot->view();
QHBoxLayout *layout = new QHBoxLayout(this);
layout->setMargin(0);
layout->setSpacing(0);
layout->addWidget(firstRoot);
updateActions(); updateActions();
d->m_windowPopup = new OpenEditorsWindow(this); d->m_windowPopup = new OpenEditorsWindow;
d->m_windowPopup->hide();
d->m_autoSaveTimer = new QTimer(this); d->m_autoSaveTimer = new QTimer(this);
connect(d->m_autoSaveTimer, SIGNAL(timeout()), SLOT(autoSave())); connect(d->m_autoSaveTimer, SIGNAL(timeout()), SLOT(autoSave()));
@@ -456,16 +399,19 @@ EditorManager::~EditorManager()
} }
// close all extra windows // close all extra windows
for (int i = 1; i < d->m_root.size(); ++i) { for (int i = 0; i < d->m_root.size(); ++i) {
SplitterOrView *root = d->m_root.at(i); SplitterOrView *root = d->m_root.at(i);
disconnect(root, SIGNAL(destroyed(QObject*)), this, SLOT(rootDestroyed(QObject*))); disconnect(root, SIGNAL(destroyed(QObject*)), this, SLOT(rootDestroyed(QObject*)));
IContext *rootContext = d->m_rootContext.at(i); IContext *rootContext = d->m_rootContext.at(i);
if (rootContext) {
ICore::removeContextObject(rootContext); ICore::removeContextObject(rootContext);
delete root;
delete rootContext; delete rootContext;
} }
delete root;
}
d->m_root.clear(); d->m_root.clear();
d->m_rootContext.clear(); d->m_rootContext.clear();
delete d->m_windowPopup;
delete d; delete d;
} }
@@ -2051,10 +1997,10 @@ void EditorManager::updateActions()
if (curDocument) { if (curDocument) {
if (HostOsInfo::isMacHost()) if (HostOsInfo::isMacHost())
m_instance->window()->setWindowModified(curDocument->isModified()); d->rootWidget()->window()->setWindowModified(curDocument->isModified());
updateMakeWritableWarning(); updateMakeWritableWarning();
} else /* curEditor */ if (HostOsInfo::isMacHost()) { } else /* curEditor */ if (HostOsInfo::isMacHost()) {
m_instance->window()->setWindowModified(false); d->rootWidget()->window()->setWindowModified(false);
} }
foreach (SplitterOrView *root, d->m_root) foreach (SplitterOrView *root, d->m_root)

View File

@@ -85,7 +85,7 @@ private:
Core::IMode *m_mode; Core::IMode *m_mode;
}; };
class CORE_EXPORT EditorManager : public QWidget class CORE_EXPORT EditorManager : public QObject
{ {
Q_OBJECT Q_OBJECT
@@ -251,7 +251,7 @@ public slots:
static void gotoOtherSplit(); static void gotoOtherSplit();
private: private:
explicit EditorManager(QWidget *parent); explicit EditorManager(QObject *parent);
~EditorManager(); ~EditorManager();
static void init(); static void init();

View File

@@ -0,0 +1,121 @@
/****************************************************************************
**
** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/legal
**
** This file is part of Qt Creator.
**
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Digia. For licensing terms and
** conditions see http://qt.digia.com/licensing. For further information
** use the contact form at http://qt.digia.com/contact-us.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 2.1 requirements
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Digia gives you certain additional
** rights. These rights are described in the Digia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
****************************************************************************/
#ifndef EDITORMANAGER_P_H
#define EDITORMANAGER_P_H
#include "idocument.h"
#include "documentmodel.h"
#include "editorview.h"
#include "ieditor.h"
#include <QList>
#include <QPointer>
#include <QString>
#include <QVariant>
QT_BEGIN_NAMESPACE
class QAction;
class QTimer;
QT_END_NAMESPACE
namespace Core {
namespace Internal {
class EditorClosingCoreListener;
class OpenEditorsViewFactory;
class OpenEditorsWindow;
class EditorManagerPrivate
{
public:
explicit EditorManagerPrivate(QObject *parent);
~EditorManagerPrivate();
static QWidget *rootWidget();
QList<EditLocation> m_globalHistory;
QList<SplitterOrView *> m_root;
QList<IContext *> m_rootContext;
QPointer<IEditor> m_currentEditor;
QPointer<IEditor> m_scheduledCurrentEditor;
QPointer<EditorView> m_currentView;
QTimer *m_autoSaveTimer;
// actions
QAction *m_revertToSavedAction;
QAction *m_saveAction;
QAction *m_saveAsAction;
QAction *m_closeCurrentEditorAction;
QAction *m_closeAllEditorsAction;
QAction *m_closeOtherEditorsAction;
QAction *m_closeAllEditorsExceptVisibleAction;
QAction *m_gotoNextDocHistoryAction;
QAction *m_gotoPreviousDocHistoryAction;
QAction *m_goBackAction;
QAction *m_goForwardAction;
QAction *m_splitAction;
QAction *m_splitSideBySideAction;
QAction *m_splitNewWindowAction;
QAction *m_removeCurrentSplitAction;
QAction *m_removeAllSplitsAction;
QAction *m_gotoNextSplitAction;
QAction *m_saveCurrentEditorContextAction;
QAction *m_saveAsCurrentEditorContextAction;
QAction *m_revertToSavedCurrentEditorContextAction;
QAction *m_closeCurrentEditorContextAction;
QAction *m_closeAllEditorsContextAction;
QAction *m_closeOtherEditorsContextAction;
QAction *m_closeAllEditorsExceptVisibleContextAction;
QAction *m_openGraphicalShellAction;
QAction *m_openTerminalAction;
QAction *m_findInDirectoryAction;
DocumentModel::Entry *m_contextMenuEntry;
OpenEditorsWindow *m_windowPopup;
EditorClosingCoreListener *m_coreListener;
QMap<QString, QVariant> m_editorStates;
OpenEditorsViewFactory *m_openEditorsFactory;
IDocument::ReloadSetting m_reloadSetting;
QString m_titleAddition;
QString m_titleVcsTopic;
bool m_autoSaveEnabled;
int m_autoSaveInterval;
};
} // Internal
} // Core
#endif // EDITORMANAGER_P_H

View File

@@ -278,7 +278,7 @@ void EditorToolBar::setToolbarCreationFlags(ToolbarCreationFlags flags)
{ {
d->m_isStandalone = flags & FlagsStandalone; d->m_isStandalone = flags & FlagsStandalone;
if (d->m_isStandalone) { if (d->m_isStandalone) {
QWidget *em = EditorManager::instance(); EditorManager *em = EditorManager::instance();
connect(em, SIGNAL(currentEditorChanged(Core::IEditor*)), SLOT(updateEditorListSelection(Core::IEditor*))); connect(em, SIGNAL(currentEditorChanged(Core::IEditor*)), SLOT(updateEditorListSelection(Core::IEditor*)));
disconnect(d->m_editorList, SIGNAL(activated(int)), this, SIGNAL(listSelectionActivated(int))); disconnect(d->m_editorList, SIGNAL(activated(int)), this, SIGNAL(listSelectionActivated(int)));

View File

@@ -189,7 +189,6 @@ MainWindow::MainWindow() :
m_statusBarManager = new StatusBarManager(this); m_statusBarManager = new StatusBarManager(this);
m_messageManager = new MessageManager; m_messageManager = new MessageManager;
m_editorManager = new EditorManager(this); m_editorManager = new EditorManager(this);
m_editorManager->hide();
m_externalToolManager = new ExternalToolManager(); m_externalToolManager = new ExternalToolManager();
setCentralWidget(m_modeStack); setCentralWidget(m_modeStack);

View File

@@ -443,7 +443,8 @@ QWidget *DebuggerMainWindow::createContents(IMode *mode)
QWidget *editorAndFindWidget = new QWidget; QWidget *editorAndFindWidget = new QWidget;
editorAndFindWidget->setLayout(editorHolderLayout); editorAndFindWidget->setLayout(editorHolderLayout);
editorHolderLayout->addWidget(new EditorManagerPlaceHolder(mode)); auto editorManagerPlaceHolder = new EditorManagerPlaceHolder(mode);
editorHolderLayout->addWidget(editorManagerPlaceHolder);
editorHolderLayout->addWidget(new FindToolBarPlaceHolder(editorAndFindWidget)); editorHolderLayout->addWidget(new FindToolBarPlaceHolder(editorAndFindWidget));
MiniSplitter *documentAndRightPane = new MiniSplitter; MiniSplitter *documentAndRightPane = new MiniSplitter;
@@ -502,6 +503,7 @@ QWidget *DebuggerMainWindow::createContents(IMode *mode)
// Navigation and right-side window. // Navigation and right-side window.
MiniSplitter *splitter = new MiniSplitter; MiniSplitter *splitter = new MiniSplitter;
splitter->setFocusProxy(editorManagerPlaceHolder);
splitter->addWidget(new NavigationWidgetPlaceHolder(mode)); splitter->addWidget(new NavigationWidgetPlaceHolder(mode));
splitter->addWidget(mainWindowSplitter); splitter->addWidget(mainWindowSplitter);
splitter->setStretchFactor(0, 0); splitter->setStretchFactor(0, 0);

View File

@@ -3292,7 +3292,6 @@ void DebuggerPluginPrivate::extensionsInitialized()
modeContextObject->setContext(Core::Context(CC::C_EDITORMANAGER)); modeContextObject->setContext(Core::Context(CC::C_EDITORMANAGER));
modeContextObject->setWidget(widget); modeContextObject->setWidget(widget);
Core::ICore::addContextObject(modeContextObject); Core::ICore::addContextObject(modeContextObject);
widget->setFocusProxy(EditorManager::instance());
debugMode->setWidget(widget); debugMode->setWidget(widget);
m_plugin->addAutoReleasedObject(debugMode); m_plugin->addAutoReleasedObject(debugMode);

View File

@@ -39,6 +39,7 @@
#include "addlibrarywizard.h" #include "addlibrarywizard.h"
#include "wizards/qtquickapp.h" #include "wizards/qtquickapp.h"
#include <coreplugin/icore.h>
#include <projectexplorer/projectexplorer.h> #include <projectexplorer/projectexplorer.h>
#include <projectexplorer/buildmanager.h> #include <projectexplorer/buildmanager.h>
#include <projectexplorer/session.h> #include <projectexplorer/session.h>
@@ -146,7 +147,7 @@ void QmakeManager::addLibraryContextMenu()
void QmakeManager::addLibrary(const QString &fileName, ProFileEditor *editor) void QmakeManager::addLibrary(const QString &fileName, ProFileEditor *editor)
{ {
AddLibraryWizard wizard(fileName, Core::EditorManager::instance()); AddLibraryWizard wizard(fileName, Core::ICore::dialogParent());
if (wizard.exec() != QDialog::Accepted) if (wizard.exec() != QDialog::Accepted)
return; return;