diff --git a/src/plugins/coreplugin/editormanager/editormanager.cpp b/src/plugins/coreplugin/editormanager/editormanager.cpp index 4572fef6f255da061c01842bfbdc5c9fd1800a8b..babc38c5d622bac92f556b928fbc6e6bc3288553 100644 --- a/src/plugins/coreplugin/editormanager/editormanager.cpp +++ b/src/plugins/coreplugin/editormanager/editormanager.cpp @@ -137,7 +137,7 @@ struct EditorManagerPrivate { explicit EditorManagerPrivate(ICore *core, QWidget *parent); ~EditorManagerPrivate(); Internal::EditorView *m_view; - QSplitter *m_splitter; + Internal::SplitterOrView *m_splitter; QStackedLayout *m_stackedLayout; ICore *m_core; @@ -382,11 +382,12 @@ EditorManager::EditorManager(ICore *core, QWidget *parent) : connect(this, SIGNAL(currentEditorChanged(Core::IEditor*)), 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_view); + m_d->m_stackedLayout->addWidget(m_d->m_splitter); updateActions(); @@ -554,7 +555,15 @@ void EditorManager::closeEditor(IEditor *editor) editor = currentEditor(); if (!editor) return; - closeEditors(QList<IEditor *>() << editor); + + if (m_d->m_view->hasEditor(editor)) { + unsplitAll(); + closeEditors(QList<IEditor *>() << editor); + } else { + // ### TODO close duplicate editor + } + + } QList<IEditor*> @@ -588,6 +597,7 @@ QList<IFile *> bool EditorManager::closeAllEditors(bool askAboutModifiedEditors) { + unsplitAll(); return closeEditors(openedEditors(), askAboutModifiedEditors); } @@ -672,6 +682,12 @@ bool EditorManager::closeEditors(const QList<IEditor*> editorsToClose, bool askA return !closingFailed; } +void EditorManager::closeDuplicate(Core::IEditor *editor, bool doDelete) +{ + emit editorAboutToClose(editor); + if (doDelete) + delete editor; +} /* Find editors for a mimetype, best matching at the front * of the list. Recurse over the parent classes of the mimetype to @@ -1162,11 +1178,6 @@ QList<IEditor*> EditorManager::openedEditors() const return m_d->m_view->editors(); } -QList<IEditor*> EditorManager::openedEditorsNoDuplicates() const -{ - return m_d->m_view->editors(); -} - Internal::EditorModel *EditorManager::openedEditorsModel() const { return m_d->m_editorModel; @@ -1286,7 +1297,7 @@ QByteArray EditorManager::saveState() const stream << m_d->m_editorStates; - QList<IEditor *> editors = openedEditorsNoDuplicates(); + QList<IEditor *> editors = openedEditors(); int editorCount = editors.count(); qDebug() << "save editors:" << editorCount; @@ -1501,19 +1512,36 @@ QString EditorManager::externalEditor() const } +Core::IEditor *EditorManager::duplicateEditor(Core::IEditor *editor) +{ + if (!editor->duplicateSupported()) + return 0; + + IEditor *duplicate = editor->duplicate(0); + // TODO ### emit signals + return duplicate; +} + void EditorManager::split() { - qDebug() << "split"; + m_d->m_splitter->split(Qt::Vertical); } void EditorManager::splitSideBySide() { - qDebug() << "splitSideBySide"; + m_d->m_splitter->split(Qt::Horizontal); } void EditorManager::unsplit() { - qDebug() << "unsplit"; + unsplitAll(); // ### TODO +} + +void EditorManager::unsplitAll() +{ + m_d->m_splitter->unsplit(0); + if (IEditor *e = m_d->m_splitter->editor()) + setCurrentEditor(e); } //===================EditorClosingCoreListener====================== diff --git a/src/plugins/coreplugin/editormanager/editormanager.h b/src/plugins/coreplugin/editormanager/editormanager.h index f8805881a43aaf9447ea525f4591c9ee26046f93..06fe23629afb3849ea82c76097d986140605ae1e 100644 --- a/src/plugins/coreplugin/editormanager/editormanager.h +++ b/src/plugins/coreplugin/editormanager/editormanager.h @@ -69,11 +69,10 @@ struct EditorManagerPrivate; namespace Internal { class OpenEditorsWindow; class EditorModel; -//class EditorSplitter; +class SplitterOrView; class EditorClosingCoreListener; class OpenEditorsViewFactory; - } // namespace Internal class CORE_EXPORT EditorManagerPlaceHolder : public QWidget @@ -121,7 +120,6 @@ public: // EditorGroup *currentEditorGroup() const; QList<IEditor*> openedEditors() const; - QList<IEditor*> openedEditorsNoDuplicates() const; Internal::EditorModel *openedEditorsModel() const; @@ -191,6 +189,7 @@ private slots: bool saveFileAs(Core::IEditor *editor = 0); void closeEditor(); void closeEditor(Core::IEditor *editor); + void gotoNextDocHistory(); void gotoPreviousDocHistory(); void updateCurrentEditorAndGroup(Core::IContext *context); @@ -203,6 +202,7 @@ private slots: void split(); void splitSideBySide(); void unsplit(); + void unsplitAll(); private: QList<IFile *> filesForEditors(QList<IEditor *> editors) const; @@ -215,8 +215,13 @@ private: void restoreEditorState(IEditor *editor); + Core::IEditor *duplicateEditor(IEditor *editor); + void closeDuplicate(Core::IEditor *editor, bool doDelete); + static EditorManager *m_instance; EditorManagerPrivate *m_d; + + friend class Core::Internal::SplitterOrView; }; //===================EditorClosingCoreListener====================== diff --git a/src/plugins/coreplugin/editormanager/editorview.cpp b/src/plugins/coreplugin/editormanager/editorview.cpp index 317668054d974e7fd9eaea3bdf3dc56c2affe188..4936d7b8a070576ea89ed1387dce271e931fbdc1 100644 --- a/src/plugins/coreplugin/editormanager/editorview.cpp +++ b/src/plugins/coreplugin/editormanager/editorview.cpp @@ -333,8 +333,6 @@ void EditorView::insertEditor(int index, IEditor *editor) m_toolBar->layout()->addWidget(toolBar); } connect(editor, SIGNAL(changed()), this, SLOT(checkEditorStatus())); - -// emit editorAdded(editor); } bool EditorView::hasEditor(IEditor *editor) const @@ -464,3 +462,115 @@ void EditorView::listSelectionChanged(int index) } +SplitterOrView::SplitterOrView(EditorView *view, QWidget *parent) + : QWidget(parent) +{ + m_isRoot = true; + m_layout = new QStackedLayout(this); + m_view = view; + m_splitter = 0; + m_layout->addWidget(m_view); +} + +SplitterOrView::SplitterOrView(Core::IEditor *editor, QWidget *parent) + : QWidget(parent) +{ + m_isRoot = false; + m_layout = new QStackedLayout(this); + m_view = new EditorView(CoreImpl::instance()->editorManager()->openedEditorsModel()); + m_view->addEditor(editor); + m_splitter = 0; + m_layout->addWidget(editor->widget()); +} + +SplitterOrView *SplitterOrView::findView(Core::IEditor *editor) +{ + if (hasEditor(editor)) + return this; + 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->findView(editor)) + return result; + } + } + return 0; +} + +SplitterOrView *SplitterOrView::findSplitter(Core::IEditor *editor) +{ + if (m_splitter) { + for (int i = 0; i < m_splitter->count(); ++i) { + if (SplitterOrView *splitterOrView = qobject_cast<SplitterOrView*>(m_splitter->widget(i))) { + if (splitterOrView->hasEditor(editor)) + return this; + if (SplitterOrView *result = splitterOrView->findSplitter(editor)) + return result; + } + } + } + return 0; +} + +void SplitterOrView::split(Qt::Orientation orientation) +{ + Q_ASSERT(m_view && m_splitter == 0); + m_splitter = new QSplitter(this); + m_splitter->setOrientation(orientation); + Core::IEditor *e = m_view->currentEditor(); + + Core::IEditor *focus = e; + if (m_isRoot) { + Core::IEditor *duplicateA = CoreImpl::instance()->editorManager()->duplicateEditor(e); + m_splitter->addWidget(new SplitterOrView(duplicateA)); + focus = duplicateA; + } else { + m_splitter->addWidget(new SplitterOrView(e)); + Q_ASSERT(m_view->currentEditor() == 0); + } + Core::IEditor *duplicate = CoreImpl::instance()->editorManager()->duplicateEditor(e); + m_splitter->addWidget(new SplitterOrView(duplicate)); + m_layout->addWidget(m_splitter); + + if (!m_isRoot) { + delete m_view; + m_view = 0; + } else { + m_layout->setCurrentWidget(m_splitter); + } + + focus->widget()->setFocus(); +} + +void SplitterOrView::close() +{ + foreach(Core::IEditor *e, editors()) + CoreImpl::instance()->editorManager()->closeDuplicate(e, false); + closeSplitterEditors(); +} + +void SplitterOrView::closeSplitterEditors() +{ + if (!m_splitter) + return; + for (int i = 0; i < m_splitter->count(); ++i) { + if (SplitterOrView *splitterOrView = qobject_cast<SplitterOrView*>(m_splitter->widget(i))) { + splitterOrView->close(); + } + } +} + +void SplitterOrView::unsplit(Core::IEditor *editor) +{ + if (!m_splitter) + return; + Q_ASSERT(m_isRoot || (m_view == 0 && editor)); + if (!m_isRoot) { + m_view = new EditorView(CoreImpl::instance()->editorManager()->openedEditorsModel()); + m_view->addEditor(editor); + m_layout->addWidget(m_view); + } + closeSplitterEditors(); + delete m_splitter; + m_splitter = 0; +} diff --git a/src/plugins/coreplugin/editormanager/editorview.h b/src/plugins/coreplugin/editormanager/editorview.h index 14cebf1f9aed6c3e73304e1c3cad9d0e4f2b115e..401066761b94a3f6c7804689ac19bdc18b016f5b 100644 --- a/src/plugins/coreplugin/editormanager/editorview.h +++ b/src/plugins/coreplugin/editormanager/editorview.h @@ -148,6 +148,36 @@ private: QMap<QWidget *, IEditor *> m_widgetEditorMap; }; +class SplitterOrView : public QWidget +{ + Q_OBJECT +public: + SplitterOrView(EditorView *view, QWidget *parent = 0); // creates a root splitter or view + SplitterOrView(Core::IEditor *editor, QWidget *parent = 0); + + void split(Qt::Orientation orientation); + void unsplit(Core::IEditor *editor); + + bool isView() const { return m_view != 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); } + EditorView *view() const { return m_view; } + QSplitter *splitter() const { return m_splitter; } + + SplitterOrView *findView(Core::IEditor *editor); + SplitterOrView *findSplitter(Core::IEditor *editor); + +private: + void close(); + void closeSplitterEditors(); + bool m_isRoot; + QStackedLayout *m_layout; + EditorView *m_view; + QSplitter *m_splitter; +}; + + } } diff --git a/src/plugins/coreplugin/editormanager/openeditorswindow.cpp b/src/plugins/coreplugin/editormanager/openeditorswindow.cpp index cd92e3e93d66cd371a565d53b985ad0e666bda34..792a9e746d9baf2037f284b59315f5acc99f0901 100644 --- a/src/plugins/coreplugin/editormanager/openeditorswindow.cpp +++ b/src/plugins/coreplugin/editormanager/openeditorswindow.cpp @@ -248,7 +248,7 @@ void OpenEditorsWindow::updateList() int curItem = 0; int selectedIndex = -1; QTreeWidgetItem *item; - foreach (IEditor *editor, em->openedEditorsNoDuplicates()){ + foreach (IEditor *editor, em->openedEditors()){ if (curItem < oldNum) { item = m_editorList->topLevelItem(curItem); } else {