diff --git a/src/plugins/coreplugin/editormanager/editormanager.cpp b/src/plugins/coreplugin/editormanager/editormanager.cpp index b8ddd1bc134b7f807ff70606805914bd8d9ac136..e7e717d335227bbd717d202f56bfe5825c15d971 100644 --- a/src/plugins/coreplugin/editormanager/editormanager.cpp +++ b/src/plugins/coreplugin/editormanager/editormanager.cpp @@ -499,7 +499,9 @@ void EditorManager::handleContextChange(Core::IContext *context) void EditorManager::setCurrentEditor(IEditor *editor, bool ignoreNavigationHistory) { - setCurrentView(0); + if (editor) + setCurrentView(0); + if (m_d->m_currentEditor == editor) return; if (m_d->m_currentEditor && !ignoreNavigationHistory) @@ -535,7 +537,10 @@ void EditorManager::setCurrentView(Core::Internal::SplitterOrView *view) Core::Internal::SplitterOrView *EditorManager::currentView() const { - return m_d->m_currentView; + SplitterOrView *view = m_d->m_currentView; + if (!view) + view = m_d->m_splitter->findView(m_d->m_currentEditor); + return view; } QList<IEditor *> EditorManager::editorsForFileName(const QString &filename) const @@ -555,14 +560,6 @@ IEditor *EditorManager::currentEditor() const } -// SLOT connected to action -// since this is potentially called in the event handler of the editor -// we simply postpone it with a single shot timer -void EditorManager::closeEditor() -{ - closeEditor(m_d->m_currentEditor); -} - void EditorManager::emptyView(Core::Internal::EditorView *view) { if (!view) @@ -619,13 +616,6 @@ void EditorManager::closeView(Core::Internal::EditorView *view) updateEditorHistory(); } -void EditorManager::closeEditor(Core::IEditor *editor) -{ - if (!editor) - return; - closeEditors(QList<IEditor *>() << editor); -} - QList<IEditor*> EditorManager::editorsForFiles(QList<IFile*> files) const { @@ -674,10 +664,39 @@ void EditorManager::closeOtherEditors() closeEditors(editors, true); } + +// SLOT connected to action +// since this is potentially called in the event handler of the editor +// we simply postpone it with a single shot timer +void EditorManager::closeEditor() +{ + closeEditor(m_d->m_currentEditor); +} + +void EditorManager::closeEditor(Core::IEditor *editor) +{ + if (!editor) + return; + closeEditors(QList<IEditor *>() << editor); +} + +void EditorManager::closeEditor(const QModelIndex &index) +{ + IEditor *editor = index.data(Qt::UserRole).value<Core::IEditor*>(); + if (editor) + closeEditor(editor); + else + m_d->m_editorModel->removeEditor(index); +} + + bool EditorManager::closeEditors(const QList<IEditor*> editorsToClose, bool askAboutModifiedEditors) { if (editorsToClose.isEmpty()) return true; + + SplitterOrView *currentSplitterOrView = currentView(); + bool closingFailed = false; QList<IEditor*> acceptedEditors; //ask all core listeners to check whether the editor can be closed @@ -719,8 +738,7 @@ bool EditorManager::closeEditors(const QList<IEditor*> editorsToClose, bool askA foreach(IEditor *editor, acceptedEditors) acceptedEditors += m_d->m_editorModel->duplicatesFor(editor); - QList<EditorView*> currentViews; - EditorView *currentView = 0; + QList<EditorView*> closedViews; // remove the editors foreach (IEditor *editor, acceptedEditors) { @@ -733,39 +751,22 @@ bool EditorManager::closeEditors(const QList<IEditor*> editorsToClose, bool askA removeEditor(editor); if (SplitterOrView *view = m_d->m_splitter->findView(editor)) { - if (editor == view->view()->currentEditor()) { - currentViews += view->view(); - if (editor == m_d->m_currentEditor) - currentView = view->view(); - } + if (editor == view->view()->currentEditor()) + closedViews += view->view(); view->view()->removeEditor(editor); } } - foreach (EditorView *view, currentViews) { + foreach (EditorView *view, closedViews) { IEditor *newCurrent = view->currentEditor(); -#if 0 if (!newCurrent) newCurrent = pickUnusedEditor(); - if (!newCurrent) { - // pick the first one that can be duplicated - foreach (IEditor *e, m_d->m_editorHistory) { - if (e->duplicateSupported()) { - newCurrent = e; - break; - } - } - } -#else - if (!newCurrent && view == m_d->m_view) - newCurrent = pickUnusedEditor(); -#endif if (newCurrent) { activateEditor(view, newCurrent, NoActivate); } else { QModelIndex idx = m_d->m_editorModel->firstRestoredEditor(); if (idx.isValid()) - activateEditor(idx, view); + activateEditor(idx, view, NoActivate); } } @@ -775,17 +776,60 @@ bool EditorManager::closeEditors(const QList<IEditor*> editorsToClose, bool askA delete editor; } - if (currentView) { - setCurrentView(m_d->m_splitter->findView(currentView)); - if (IEditor *e = currentView->currentEditor()) - activateEditor(currentView, e); - else - emit currentEditorChanged(0); + if (currentSplitterOrView) { + if (IEditor *editor = currentSplitterOrView->editor()) + activateEditor(currentSplitterOrView->view(), editor); } + if (!currentEditor()) + emit currentEditorChanged(0); + return !closingFailed; } +void EditorManager::closeDuplicate(Core::IEditor *editor) +{ + + IEditor *original = editor; + if (m_d->m_editorModel->isDuplicate(editor)) + original= m_d->m_editorModel->originalForDuplicate(editor); + QList<IEditor *> duplicates = m_d->m_editorModel->duplicatesFor(original); + + if (duplicates.isEmpty()) { + closeEditor(editor); + return; + } + + if (original== editor) + m_d->m_editorModel->makeOriginal(duplicates.first()); + + SplitterOrView *currentSplitterOrView = currentView(); + + emit editorAboutToClose(editor); + + EditorView *view = m_d->m_splitter->findView(editor)->view(); + removeEditor(editor); + view->removeEditor(editor); + + IEditor *newCurrent = view->currentEditor(); + if (!newCurrent) + newCurrent = pickUnusedEditor(); + if (newCurrent) { + activateEditor(view, newCurrent, NoActivate); + } else { + QModelIndex idx = m_d->m_editorModel->firstRestoredEditor(); + if (idx.isValid()) + activateEditor(idx, view, NoActivate); + } + + emit editorsClosed(QList<IEditor*>() << editor); + delete editor; + if (currentSplitterOrView) { + if (IEditor *currentEditor = currentSplitterOrView->editor()) + activateEditor(currentSplitterOrView->view(), currentEditor); + } +} + IEditor *EditorManager::pickUnusedEditor() const { foreach (IEditor *editor, m_d->m_editorHistory) { @@ -797,65 +841,19 @@ IEditor *EditorManager::pickUnusedEditor() const } -void EditorManager::closeEditor(const QModelIndex &index) -{ - IEditor *editor = index.data(Qt::UserRole).value<Core::IEditor*>(); - if (editor) - closeEditor(editor); - else - m_d->m_editorModel->removeEditor(index); -} - -void EditorManager::activateEditor(const QModelIndex &index, Internal::EditorView *view) +void EditorManager::activateEditor(const QModelIndex &index, Internal::EditorView *view, OpenEditorFlags flags) { IEditor *editor = index.data(Qt::UserRole).value<IEditor*>(); if (editor) { - if (view) - activateEditor(view, editor); - else - activateEditor(editor); + activateEditor(view, editor, flags); return; } - if (view) setCurrentView(m_d->m_splitter->findView(view)); QString fileName = index.data(Qt::UserRole + 1).toString(); QByteArray kind = index.data(Qt::UserRole + 2).toByteArray(); - openEditor(fileName, kind); -} - -void EditorManager::activateEditor(IEditor *editor, OpenEditorFlags flags) -{ - SplitterOrView *splitterOrView = m_d->m_currentView; - if (splitterOrView && splitterOrView->splitter()) - splitterOrView = 0; // safety if currentView gets out of sync - setCurrentView(0); - if (!editor) - return; - - SplitterOrView *place = m_d->m_splitter->findView(editor); - if (place && !place->isSplitter()) { - splitterOrView = place; - } - - - if (!splitterOrView) - splitterOrView = m_d->m_splitter->findEmptyView(); - - if (!splitterOrView && m_d->m_currentEditor) { - splitterOrView = m_d->m_splitter->findView(m_d->m_currentEditor); - if (splitterOrView && !splitterOrView->isVisible()) // safety if currentEditor gets out of sync - splitterOrView = 0; - } - - if (!splitterOrView) - splitterOrView = m_d->m_splitter->findFirstView(); - if (!splitterOrView) { - splitterOrView = m_d->m_splitter; - } - - activateEditor(splitterOrView->view(), editor, flags); + openEditor(fileName, kind, flags); } Core::IEditor *EditorManager::placeEditor(Core::Internal::EditorView *view, Core::IEditor *editor) @@ -868,13 +866,11 @@ Core::IEditor *EditorManager::placeEditor(Core::Internal::EditorView *view, Core sourceView->view()->removeEditor(editor); view->addEditor(editor); view->setCurrentEditor(editor); -#if 0 if (!sourceView->editor()) { if (IEditor *replacement = pickUnusedEditor()) { sourceView->view()->addEditor(replacement); } } -#endif return editor; } else if (duplicateSupported) { editor = duplicateEditor(editor); @@ -887,9 +883,17 @@ Core::IEditor *EditorManager::placeEditor(Core::Internal::EditorView *view, Core return editor; } +void EditorManager::activateEditor(Core::IEditor *editor, OpenEditorFlags flags) +{ + activateEditor(0, editor, flags); +} + void EditorManager::activateEditor(Core::Internal::EditorView *view, Core::IEditor *editor, OpenEditorFlags flags) { - Q_ASSERT(view) ; + if (!view) + view = currentView()->view(); + + Q_ASSERT(view); if (!editor && !m_d->m_currentEditor) { setCurrentEditor(0, (flags & IgnoreNavigationHistory)); diff --git a/src/plugins/coreplugin/editormanager/editormanager.h b/src/plugins/coreplugin/editormanager/editormanager.h index 60276f9f92beb87c4c072abd15054ceaedc55c2b..1a855ab9f27558e876e8c85dcda56f4afb89d331 100644 --- a/src/plugins/coreplugin/editormanager/editormanager.h +++ b/src/plugins/coreplugin/editormanager/editormanager.h @@ -129,7 +129,7 @@ public: QList<IEditor*> openedEditors() const; Internal::EditorModel *openedEditorsModel() const; - void activateEditor(const QModelIndex &index, Internal::EditorView *view = 0); + void activateEditor(const QModelIndex &index, Internal::EditorView *view = 0, OpenEditorFlags = 0); void closeEditor(const QModelIndex &index); @@ -235,9 +235,10 @@ private: Core::IEditor *duplicateEditor(IEditor *editor); void setCurrentEditor(IEditor *editor, bool ignoreNavigationHistory = false); void setCurrentView(Core::Internal::SplitterOrView *view); - Core::Internal::SplitterOrView *currentView() const; void activateEditor(Core::Internal::EditorView *view, Core::IEditor *editor, OpenEditorFlags flags = 0); + Core::Internal::SplitterOrView *currentView() const; void closeEditor(Core::IEditor *editor); + void closeDuplicate(Core::IEditor *editor); void closeView(Core::Internal::EditorView *view); void emptyView(Core::Internal::EditorView *view); Core::Internal::EditorView *currentEditorView(); diff --git a/src/plugins/coreplugin/editormanager/editorview.cpp b/src/plugins/coreplugin/editormanager/editorview.cpp index 8fec6a24639399c2c32ed302ca71cfd2f92e4647..592cddb776e9725c899339673aa756010ad48ccb 100644 --- a/src/plugins/coreplugin/editormanager/editorview.cpp +++ b/src/plugins/coreplugin/editormanager/editorview.cpp @@ -571,12 +571,9 @@ bool EditorView::hasEditor(IEditor *editor) const void EditorView::closeView() { EditorManager *em = CoreImpl::instance()->editorManager(); -#if 1 - if (IEditor *editor = currentEditor()) - em->closeEditor(editor); -#else - em->closeView(this); -#endif + if (IEditor *editor = currentEditor()) { + em->closeDuplicate(editor); + } } void EditorView::removeEditor(IEditor *editor) @@ -943,7 +940,7 @@ void SplitterOrView::split(Qt::Orientation orientation) m_view->removeEditor(e); m_splitter->addWidget(new SplitterOrView(e)); -#if 0 +#if 1 if (e->duplicateSupported()) { Core::IEditor *duplicate = em->duplicateEditor(e); m_splitter->addWidget(new SplitterOrView(duplicate)); @@ -967,7 +964,7 @@ void SplitterOrView::split(Qt::Orientation orientation) } em->setCurrentView(view); -#if 0 +#if 1 if (e) em->activateEditor(e); #endif