Commit 9df34942 authored by mae's avatar mae
Browse files

more stuff works, but this requires more refactoring

parent 624df3c8
......@@ -128,6 +128,7 @@ const char * const ZOOM_WINDOW = "QtCreator.ZoomWindow";
const char * const SPLIT = "QtCreator.Split";
const char * const SPLIT_SIDE_BY_SIDE = "QtCreator.SplitSideBySide";
const char * const UNSPLIT = "QtCreator.Unsplit";
const char * const GOTO_OTHER_WINDOW = "QtCreator.GotoOtherWindow";
const char * const SAVEASDEFAULT = "QtCreator.SaveAsDefaultLayout";
const char * const RESTOREDEFAULT = "QtCreator.RestoreDefaultLayout";
const char * const CLOSE = "QtCreator.Close";
......
......@@ -159,6 +159,7 @@ struct EditorManagerPrivate {
QAction *m_splitAction;
QAction *m_splitSideBySideAction;
QAction *m_unsplitAction;
QAction *m_gotoOtherWindowAction;
QList<IEditor *> m_editorHistory;
QList<EditLocation *> m_navigationHistory;
......@@ -352,6 +353,11 @@ EditorManager::EditorManager(ICore *core, QWidget *parent) :
mwindow->addAction(cmd, Constants::G_WINDOW_SPLIT);
connect(m_d->m_unsplitAction, SIGNAL(triggered()), this, SLOT(unsplit()));
m_d->m_gotoOtherWindowAction = new QAction(tr("Goto other window"), this);
cmd = am->registerAction(m_d->m_gotoOtherWindowAction, Constants::GOTO_OTHER_WINDOW, editManagerContext);
cmd->setDefaultKeySequence(QKeySequence(tr("Ctrl+E,o")));
mwindow->addAction(cmd, Constants::G_WINDOW_SPLIT);
connect(m_d->m_gotoOtherWindowAction, SIGNAL(triggered()), this, SLOT(gotoOtherWindow()));
ActionContainer *medit = am->actionContainer(Constants::M_EDIT);
......@@ -384,8 +390,6 @@ EditorManager::EditorManager(ICore *core, QWidget *parent) :
this, SLOT(updateEditorHistory()));
m_d->m_view = new EditorView(m_d->m_editorModel, this);
m_d->m_splitter = new SplitterOrView(m_d->m_view);
connect(m_d->m_view, SIGNAL(closeRequested(Core::IEditor *)),
this, SLOT(closeEditor(Core::IEditor *)));
m_d->m_stackedLayout = new QStackedLayout(this);
m_d->m_stackedLayout->addWidget(m_d->m_splitter);
......@@ -489,6 +493,13 @@ void EditorManager::updateCurrentEditorAndGroup(IContext *context)
qDebug() << "leaving method" << Q_FUNC_INFO;
}
IEditor *EditorManager::activateEditor(IEditor *editor, bool ignoreNavigationHistory)
{
if (m_d->m_suppressEditorChanges)
return editor;
return activateEditor(m_d->m_splitter->findView(m_d->m_currentEditor)->view(), editor, ignoreNavigationHistory);
}
void EditorManager::setCurrentEditor(IEditor *editor, bool ignoreNavigationHistory)
{
if (debugEditorManager)
......@@ -499,13 +510,19 @@ void EditorManager::setCurrentEditor(IEditor *editor, bool ignoreNavigationHisto
return;
m_d->m_currentEditor = editor;
if (editor) {
qDebug() << "EditorManager::setCurrentEditor" << editor << editor->file()->fileName();
bool addToHistory = (!ignoreNavigationHistory && editor != currentEditor());
if (debugEditorManager)
qDebug() << Q_FUNC_INFO << (addToHistory ? "adding to history" : "not adding to history");
if (addToHistory)
addCurrentPositionToNavigationHistory(true);
m_d->m_suppressEditorChanges = true;
m_d->m_view->setCurrentEditor(editor);
EditorView *view = m_d->m_splitter->findView(editor)->view();
if (view == m_d->m_view && m_d->m_splitter)
unsplitAll();
view->setCurrentEditor(editor);
m_d->m_suppressEditorChanges = false;
if (addToHistory)
addCurrentPositionToNavigationHistory();
......@@ -545,26 +562,23 @@ void EditorManager::closeEditor()
QTimer::singleShot(0, this, SLOT(closeEditor()));
postpone = false;
} else {
closeEditor(currentEditor());
closeEditor(m_d->m_splitter->findView(m_d->m_currentEditor)->view(), m_d->m_currentEditor);
postpone = true;
}
}
void EditorManager::closeEditor(IEditor *editor)
void EditorManager::closeEditor(Core::Internal::EditorView *view, Core::IEditor *editor)
{
if (!editor)
editor = currentEditor();
if (!editor)
if (!editor || !view)
return;
qDebug() << "EditorManager::closeEditor";
if (m_d->m_view->hasEditor(editor)) {
qDebug() << "it's a main editor, do unsplit";
unsplitAll();
Q_ASSERT(view->hasEditor(editor));
if (view == m_d->m_view) {
closeEditors(QList<IEditor *>() << editor);
} else {
// ### TODO close duplicate editor
view->removeEditor(editor);
closeDuplicate(editor, true);
}
......@@ -688,12 +702,14 @@ bool EditorManager::closeEditors(const QList<IEditor*> editorsToClose, bool askA
void EditorManager::closeDuplicate(Core::IEditor *editor, bool doDelete)
{
m_d->m_editorHistory.removeAll(editor);
emit editorAboutToClose(editor);
emit editorsClosed(QList<Core::IEditor *>() << editor);
if (doDelete)
delete editor;
}
void EditorManager::activateEditor(Core::Internal::EditorView *view, Core::IEditor *editor)
Core::IEditor *EditorManager::activateEditor(Core::Internal::EditorView *view, Core::IEditor *editor, bool ignoreNavigationHistory)
{
Q_ASSERT(view && editor);
Q_ASSERT(m_d->m_view->hasEditor(editor));
......@@ -705,18 +721,17 @@ void EditorManager::activateEditor(Core::Internal::EditorView *view, Core::IEdit
if (view == m_d->m_view || view->hasEditor(editor)) {
view->setCurrentEditor(editor);
return;
return editor;
}
QList<IEditor*> editors = view->editors();
IEditor *duplicate = duplicateEditor(editor);
view->addEditor(duplicate);
view->setCurrentEditor(duplicate);
view->setCurrentEditor(duplicate, ignoreNavigationHistory);
foreach(IEditor *e, editors) {
view->removeEditor(e);
closeDuplicate(e, true);
}
return duplicate;
}
/* Find editors for a mimetype, best matching at the front
......@@ -808,14 +823,13 @@ IEditor *EditorManager::createEditor(const QString &editorKind,
}
void EditorManager::insertEditor(IEditor *editor,
bool ignoreNavigationHistory)
bool /*ignoreNavigationHistory*/)
{
if (!editor)
return;
m_d->m_core->addContextObject(editor);
registerEditor(editor);
m_d->m_view->addEditor(editor);
setCurrentEditor(editor, ignoreNavigationHistory);
emit editorOpened(editor);
}
......@@ -892,8 +906,7 @@ IEditor *EditorManager::openEditor(const QString &fileName, const QString &edito
const QList<IEditor *> editors = editorsForFileName(fileName);
if (!editors.isEmpty()) {
setCurrentEditor(editors.first(), ignoreNavigationHistory);
return editors.first();
return activateEditor(m_d->m_splitter->findView(m_d->m_currentEditor)->view(), editors.first(), ignoreNavigationHistory);
}
QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
IEditor *editor = createEditor(editorKind, fileName);
......@@ -908,8 +921,7 @@ IEditor *EditorManager::openEditor(const QString &fileName, const QString &edito
restoreEditorState(editor);
QApplication::restoreOverrideCursor();
ensureEditorManagerVisible();
setCurrentEditor(editor);
return editor;
return activateEditor(editor, ignoreNavigationHistory);
}
QStringList EditorManager::getOpenFileNames() const
......@@ -1138,17 +1150,25 @@ bool EditorManager::saveFileAs(IEditor *editor)
void EditorManager::gotoNextDocHistory()
{
OpenEditorsWindow *dialog = windowPopup();
dialog->setMode(OpenEditorsWindow::HistoryMode);
dialog->selectNextEditor();
showWindowPopup();
if (dialog->isVisible()) {
dialog->selectNextEditor();
} else {
dialog->setEditors(m_d->m_editorHistory, m_d->m_currentEditor);
dialog->selectNextEditor();
showWindowPopup();
}
}
void EditorManager::gotoPreviousDocHistory()
{
OpenEditorsWindow *dialog = windowPopup();
dialog->setMode(OpenEditorsWindow::HistoryMode);
dialog->selectPreviousEditor();
showWindowPopup();
if (dialog->isVisible()) {
dialog->selectPreviousEditor();
} else {
dialog->setEditors(m_d->m_editorHistory, m_d->m_currentEditor);
dialog->selectPreviousEditor();
showWindowPopup();
}
}
void EditorManager::makeCurrentEditorWritable()
......@@ -1560,19 +1580,33 @@ Core::IEditor *EditorManager::duplicateEditor(Core::IEditor *editor)
return duplicate;
}
void EditorManager::split(Qt::Orientation orientation)
{
SplitterOrView *view = m_d->m_currentEditor ? m_d->m_splitter->findView(m_d->m_currentEditor)
: m_d->m_splitter->findFirstView();
if (!view) {
view = m_d->m_splitter;
view->unsplit(0);
}
view->split(orientation);
}
void EditorManager::split()
{
m_d->m_splitter->split(Qt::Vertical);
split(Qt::Vertical);
}
void EditorManager::splitSideBySide()
{
m_d->m_splitter->split(Qt::Horizontal);
split(Qt::Horizontal);
}
void EditorManager::unsplit()
{
unsplitAll(); // ### TODO
qDebug() << "unsplit" << (m_d->m_currentEditor ? m_d->m_currentEditor->file()->fileName() : QString("no current editor"));
SplitterOrView *splitter = m_d->m_currentEditor ? m_d->m_splitter->findSplitter(m_d->m_currentEditor) : m_d->m_splitter;
qDebug() << "splitter" << splitter;
if (splitter)
splitter->unsplit(m_d->m_currentEditor);
}
void EditorManager::unsplitAll()
......@@ -1582,6 +1616,26 @@ void EditorManager::unsplitAll()
setCurrentEditor(e);
}
void EditorManager::gotoOtherWindow()
{
qDebug() << "gotoOtherWindow";
if (!m_d->m_currentEditor)
return;
qDebug() << "current editor" << m_d->m_currentEditor->file()->fileName();
if (m_d->m_splitter->isSplitter()) {
qDebug() << "we have a splitter";
SplitterOrView *view = m_d->m_splitter->findNextView(m_d->m_currentEditor);
qDebug() << "next view is" << view;
if (!view)
view = m_d->m_splitter->findFirstView();
if (view) {
if (IEditor *editor = view->editor()) {
qDebug() << "set new current editor to" << editor->file()->fileName();
view->view()->setCurrentEditor(editor);
}
}
}
}
//===================EditorClosingCoreListener======================
EditorClosingCoreListener::EditorClosingCoreListener(EditorManager *em)
......
......@@ -118,6 +118,7 @@ public:
void setCurrentEditor(IEditor *editor, bool ignoreNavigationHistory = false);
IEditor *currentEditor() const;
IEditor *activateEditor(IEditor *editor, bool ignoreNavigationHistory = false);
// EditorGroup *currentEditorGroup() const;
QList<IEditor*> openedEditors() const;
......@@ -189,7 +190,6 @@ private slots:
bool saveFile(Core::IEditor *editor = 0);
bool saveFileAs(Core::IEditor *editor = 0);
void closeEditor();
void closeEditor(Core::IEditor *editor);
void gotoNextDocHistory();
void gotoPreviousDocHistory();
......@@ -200,10 +200,12 @@ private slots:
void goBackInNavigationHistory();
void goForwardInNavigationHistory();
void makeCurrentEditorWritable();
void split(Qt::Orientation orientation);
void split();
void splitSideBySide();
void unsplit();
void unsplitAll();
void gotoOtherWindow();
private:
QList<IFile *> filesForEditors(QList<IEditor *> editors) const;
......@@ -218,7 +220,8 @@ private:
Core::IEditor *duplicateEditor(IEditor *editor);
void closeDuplicate(Core::IEditor *editor, bool doDelete);
void activateEditor(Core::Internal::EditorView *view, Core::IEditor *editor);
Core::IEditor *activateEditor(Core::Internal::EditorView *view, Core::IEditor *editor, bool ignoreNavigationHistory = false);
void closeEditor(Core::Internal::EditorView *view, Core::IEditor *editor);
static EditorManager *m_instance;
EditorManagerPrivate *m_d;
......
......@@ -335,8 +335,9 @@ void EditorView::insertEditor(int index, IEditor *editor)
connect(editor, SIGNAL(changed()), this, SLOT(checkEditorStatus()));
if (m_container->count() == 1) {
updateToolBar(editor);
m_editorList->setCurrentIndex(qobject_cast<EditorModel*>(m_editorList->model())->indexOf(editor->file()->fileName()).row());
updateEditorStatus(editor);
updateToolBar(editor);
}
}
......@@ -347,7 +348,8 @@ bool EditorView::hasEditor(IEditor *editor) const
void EditorView::sendCloseRequest()
{
emit closeRequested(currentEditor());
EditorManager *em = CoreImpl::instance()->editorManager();
em->closeEditor(this, currentEditor());
}
void EditorView::removeEditor(IEditor *editor)
......@@ -379,19 +381,18 @@ IEditor *EditorView::currentEditor() const
return 0;
}
void EditorView::setCurrentEditor(IEditor *editor)
void EditorView::setCurrentEditor(IEditor *editor, bool ignoreNavigationHistory)
{
if (!editor || m_container->count() <= 0
|| m_container->indexOf(editor->widget()) == -1)
return;
if (editor)
qDebug() << "EditorView::setCurrentEditor" << editor->file()->fileName();
const int idx = m_container->indexOf(editor->widget());
QTC_ASSERT(idx >= 0, return);
if (m_container->currentIndex() != idx) {
m_container->setCurrentIndex(idx);
m_editorList->setCurrentIndex(qobject_cast<EditorModel*>(m_editorList->model())->indexOf(editor->file()->fileName()).row());
}
m_container->setCurrentIndex(idx);
m_editorList->setCurrentIndex(qobject_cast<EditorModel*>(m_editorList->model())->indexOf(editor->file()->fileName()).row());
setEditorFocus(idx);
updateEditorStatus(editor);
updateToolBar(editor);
......@@ -401,6 +402,9 @@ void EditorView::setCurrentEditor(IEditor *editor)
m_infoWidget->hide();
m_editorForInfoWidget = 0;
}
EditorManager *em = CoreImpl::instance()->editorManager();
if (em->currentEditor() != editor)
em->setCurrentEditor(editor, ignoreNavigationHistory);
}
void EditorView::checkEditorStatus()
......@@ -490,9 +494,23 @@ SplitterOrView::SplitterOrView(Core::IEditor *editor, QWidget *parent)
m_layout->addWidget(m_view);
}
SplitterOrView *SplitterOrView::findFirstView()
{
if (m_splitter) {
for (int i = 0; i < m_splitter->count(); ++i) {
if (SplitterOrView *splitterOrView = qobject_cast<SplitterOrView*>(m_splitter->widget(i)))
if (SplitterOrView *result = splitterOrView->findFirstView())
return result;
}
return 0;
}
return this;
}
SplitterOrView *SplitterOrView::findView(Core::IEditor *editor)
{
if (hasEditor(editor))
if (!editor || hasEditor(editor))
return this;
if (m_splitter) {
for (int i = 0; i < m_splitter->count(); ++i) {
......@@ -519,6 +537,37 @@ SplitterOrView *SplitterOrView::findSplitter(Core::IEditor *editor)
return 0;
}
SplitterOrView *SplitterOrView::findNextView(Core::IEditor *editor)
{
bool found = false;
return findNextView_helper(editor, &found);
}
SplitterOrView *SplitterOrView::findNextView_helper(Core::IEditor *editor, bool *found)
{
qDebug() << "check view " << this << "view" << m_view << "splitter" << m_splitter << "found" << *found;
if (*found && m_view) {
qDebug() << "found next!";
return this;
}
if (hasEditor(editor)) {
qDebug() << "found editor";
*found = true;
return 0;
}
if (m_splitter) {
for (int i = 0; i < m_splitter->count(); ++i) {
if (SplitterOrView *splitterOrView = qobject_cast<SplitterOrView*>(m_splitter->widget(i))) {
if (SplitterOrView *result = splitterOrView->findNextView_helper(editor, found))
return result;
}
}
}
return 0;
}
void SplitterOrView::split(Qt::Orientation orientation)
{
Q_ASSERT(m_view && m_splitter == 0);
......@@ -526,14 +575,14 @@ void SplitterOrView::split(Qt::Orientation orientation)
m_splitter->setOrientation(orientation);
Core::IEditor *e = m_view->currentEditor();
Core::IEditor *focus = e;
SplitterOrView *focusView = 0;
if (m_isRoot) {
Core::IEditor *duplicateA = CoreImpl::instance()->editorManager()->duplicateEditor(e);
m_splitter->addWidget(new SplitterOrView(duplicateA));
focus = duplicateA;
m_splitter->addWidget((focusView = new SplitterOrView(duplicateA)));
} else {
m_view->removeEditor(e);
m_splitter->addWidget(new SplitterOrView(e));
m_splitter->addWidget((focusView = new SplitterOrView(e)));
Q_ASSERT(m_view->currentEditor() == 0);
}
Core::IEditor *duplicate = CoreImpl::instance()->editorManager()->duplicateEditor(e);
......@@ -547,7 +596,7 @@ void SplitterOrView::split(Qt::Orientation orientation)
m_layout->setCurrentWidget(m_splitter);
}
focus->widget()->setFocus();
focusView->view()->setCurrentEditor(focusView->editor());
}
void SplitterOrView::close()
......@@ -576,8 +625,8 @@ void SplitterOrView::unsplit(Core::IEditor *editor)
if (!m_isRoot) {
m_view = new EditorView(CoreImpl::instance()->editorManager()->openedEditorsModel());
m_view->addEditor(editor);
m_view->setCurrentEditor(editor);
m_layout->addWidget(m_view);
m_view->setCurrentEditor(editor);
}
closeSplitterEditors();
delete m_splitter;
......
......@@ -104,7 +104,7 @@ public:
void insertEditor(int i, IEditor *editor);
void removeEditor(IEditor *editor);
IEditor *currentEditor() const;
void setCurrentEditor(IEditor *editor);
void setCurrentEditor(IEditor *editor, bool ignoreNavigationHistory = false);
bool hasEditor(IEditor *editor) const;
......@@ -117,9 +117,6 @@ public:
void focusInEvent(QFocusEvent *e);
signals:
void closeRequested(Core::IEditor *editor);
private slots:
void sendCloseRequest();
void updateEditorStatus(Core::IEditor *editor = 0);
......@@ -159,6 +156,7 @@ public:
void unsplit(Core::IEditor *editor);
bool isView() const { return m_view != 0; }
bool isSplitter() const { return m_splitter != 0; }
Core::IEditor *editor() const { return m_view ? m_view->currentEditor() : 0; }
QList<Core::IEditor *> editors() const { return m_view ? m_view->editors() : QList<Core::IEditor*>(); }
bool hasEditor(Core::IEditor *editor) const { return m_view && m_view->hasEditor(editor); }
......@@ -166,11 +164,15 @@ public:
QSplitter *splitter() const { return m_splitter; }
SplitterOrView *findView(Core::IEditor *editor);
SplitterOrView *findFirstView();
SplitterOrView *findSplitter(Core::IEditor *editor);
SplitterOrView *findNextView(Core::IEditor *editor);
private:
void close();
void closeSplitterEditors();
SplitterOrView *findNextView_helper(Core::IEditor *editor, bool *found);
bool m_isRoot;
QStackedLayout *m_layout;
EditorView *m_view;
......
......@@ -97,7 +97,7 @@ void OpenEditorsWidget::updateCurrentItem(Core::IEditor *editor)
void OpenEditorsWidget::selectEditor(const QModelIndex &index)
{
IEditor *editor = index.data(Qt::UserRole).value<IEditor*>();
EditorManager::instance()->setCurrentEditor(editor);
EditorManager::instance()->activateEditor(editor);
}
......
......@@ -58,7 +58,6 @@ bool OpenEditorsWindow::isSameFile(IEditor *editorA, IEditor *editorB) const
OpenEditorsWindow::OpenEditorsWindow(QWidget *parent) :
QWidget(parent, Qt::Popup),
m_editorList(new QTreeWidget(this)),
m_mode(HistoryMode),
m_current(0)
{
resize(QSize(WIDTH, HEIGHT));
......@@ -79,13 +78,6 @@ OpenEditorsWindow::OpenEditorsWindow(QWidget *parent) :
m_autoHide.setSingleShot(true);
connect(&m_autoHide, SIGNAL(timeout()), this, SLOT(selectAndHide()));
EditorManager *em = EditorManager::instance();
connect(em, SIGNAL(editorOpened(Core::IEditor *)),
this, SLOT(updateEditorList()));
connect(em, SIGNAL(editorsClosed(QList<Core::IEditor *>)),
this, SLOT(updateEditorList()));
connect(em, SIGNAL(currentEditorChanged(Core::IEditor*)),
this, SLOT(updateEditorList()));
}
void OpenEditorsWindow::selectAndHide()
......@@ -98,7 +90,6 @@ void OpenEditorsWindow::setVisible(bool visible)
{
QWidget::setVisible(visible);
if (visible) {
updateEditorList(m_current);
m_autoHide.start(600);
setFocus();
}
......@@ -106,8 +97,6 @@ void OpenEditorsWindow::setVisible(bool visible)
bool OpenEditorsWindow::isCentering()
{
if (m_mode == OpenEditorsWindow::HistoryMode || m_editorList->topLevelItemCount() < 3)
return false;
int internalMargin = m_editorList->viewport()->mapTo(m_editorList, QPoint(0,0)).y();
QRect rect0 = m_editorList->visualItemRect(m_editorList->topLevelItem(0));
QRect rect1 = m_editorList->visualItemRect(m_editorList->topLevelItem(m_editorList->topLevelItemCount()-1));
......@@ -118,11 +107,6 @@ bool OpenEditorsWindow::isCentering()
return false;
}
void OpenEditorsWindow::setMode(Mode mode)
{
m_mode = mode;
updateEditorList(m_current);
}
bool OpenEditorsWindow::event(QEvent *e) {
if (e->type() == QEvent::KeyRelease) {
......@@ -187,89 +171,17 @@ void OpenEditorsWindow::selectUpDown(bool up)
count++;
}
if (editor)
updateEditorList(editor);
setSelectedEditor(editor);
}
void OpenEditorsWindow::selectPreviousEditor()
{
selectUpDown(m_mode == ListMode);
selectUpDown(false);
}
void OpenEditorsWindow::selectNextEditor()
{
selectUpDown(m_mode != ListMode);
}
void OpenEditorsWindow::updateEditorList(IEditor *editor)
{
if (!editor)
editor = EditorManager::instance()->currentEditor();
m_current = editor;
if (m_mode == ListMode)
updateList();
else if (m_mode == HistoryMode)