From 624df3c8f6f3078b0f98cad0e14b36dc6ba6a2cf Mon Sep 17 00:00:00 2001 From: mae <qtc-committer@nokia.com> Date: Thu, 22 Jan 2009 15:17:22 +0100 Subject: [PATCH] more splitting works, fewer crashes --- .../editormanager/editormanager.cpp | 47 +++++++++++++++++-- .../coreplugin/editormanager/editormanager.h | 3 ++ .../coreplugin/editormanager/editorview.cpp | 23 ++++++--- .../coreplugin/editormanager/editorview.h | 2 +- 4 files changed, 63 insertions(+), 12 deletions(-) diff --git a/src/plugins/coreplugin/editormanager/editormanager.cpp b/src/plugins/coreplugin/editormanager/editormanager.cpp index 352fae6802c..bbbf0fdaed0 100644 --- a/src/plugins/coreplugin/editormanager/editormanager.cpp +++ b/src/plugins/coreplugin/editormanager/editormanager.cpp @@ -34,6 +34,7 @@ #include "editormanager.h" #include "editorview.h" #include "openeditorswindow.h" +#include "openeditorsview.h" #include "openwithdialog.h" #include "filemanager.h" #include "icore.h" @@ -137,6 +138,7 @@ struct EditorManagerPrivate { ~EditorManagerPrivate(); Internal::EditorView *m_view; Internal::SplitterOrView *m_splitter; + QPointer<IEditor> m_currentEditor; QStackedLayout *m_stackedLayout; ICore *m_core; @@ -495,6 +497,7 @@ void EditorManager::setCurrentEditor(IEditor *editor, bool ignoreNavigationHisto << "ignore history?" << ignoreNavigationHistory; if (m_d->m_suppressEditorChanges) return; + m_d->m_currentEditor = editor; if (editor) { bool addToHistory = (!ignoreNavigationHistory && editor != currentEditor()); if (debugEditorManager) @@ -528,7 +531,7 @@ QList<IEditor *> EditorManager::editorsForFileName(const QString &filename) cons IEditor *EditorManager::currentEditor() const { - return m_d->m_view->currentEditor(); + return m_d->m_currentEditor; } @@ -555,7 +558,9 @@ void EditorManager::closeEditor(IEditor *editor) if (!editor) return; + qDebug() << "EditorManager::closeEditor"; if (m_d->m_view->hasEditor(editor)) { + qDebug() << "it's a main editor, do unsplit"; unsplitAll(); closeEditors(QList<IEditor *>() << editor); } else { @@ -688,6 +693,32 @@ void EditorManager::closeDuplicate(Core::IEditor *editor, bool doDelete) delete editor; } +void EditorManager::activateEditor(Core::Internal::EditorView *view, Core::IEditor *editor) +{ + Q_ASSERT(view && editor); + Q_ASSERT(m_d->m_view->hasEditor(editor)); + + if (!editor->duplicateSupported()) { + unsplitAll(); + view = m_d->m_view; + } + + if (view == m_d->m_view || view->hasEditor(editor)) { + view->setCurrentEditor(editor); + return; + } + QList<IEditor*> editors = view->editors(); + IEditor *duplicate = duplicateEditor(editor); + view->addEditor(duplicate); + view->setCurrentEditor(duplicate); + foreach(IEditor *e, editors) { + view->removeEditor(e); + closeDuplicate(e, true); + } + + +} + /* Find editors for a mimetype, best matching at the front * of the list. Recurse over the parent classes of the mimetype to * find them. */ @@ -1299,6 +1330,11 @@ QByteArray EditorManager::saveState() const QList<IEditor *> editors = openedEditors(); int editorCount = editors.count(); + if (editors.contains(m_d->m_currentEditor)) { + editors.removeAll(m_d->m_currentEditor); + editors.prepend(m_d->m_currentEditor); + } + qDebug() << "save editors:" << editorCount; stream << editorCount; @@ -1341,12 +1377,14 @@ bool EditorManager::restoreState(const QByteArray &state) stream >> fileName; QByteArray kind; stream >> kind; - openEditor(fileName, kind, true); + IEditor *editor = openEditor(fileName, kind, true); + if (!m_d->m_currentEditor) + m_d->m_currentEditor = editor; } m_d->m_suppressEditorChanges = editorChangesSuppressed; if (currentEditor()) - setCurrentEditor(currentEditor());// looks like a null-op but is not + setCurrentEditor(m_d->m_currentEditor); QApplication::restoreOverrideCursor(); @@ -1517,7 +1555,8 @@ Core::IEditor *EditorManager::duplicateEditor(Core::IEditor *editor) return 0; IEditor *duplicate = editor->duplicate(0); - // TODO ### emit signals + emit editorCreated(duplicate, duplicate->file()->fileName()); + emit editorOpened(duplicate); return duplicate; } diff --git a/src/plugins/coreplugin/editormanager/editormanager.h b/src/plugins/coreplugin/editormanager/editormanager.h index 06fe23629af..bb3cd7bd691 100644 --- a/src/plugins/coreplugin/editormanager/editormanager.h +++ b/src/plugins/coreplugin/editormanager/editormanager.h @@ -69,6 +69,7 @@ struct EditorManagerPrivate; namespace Internal { class OpenEditorsWindow; class EditorModel; +class EditorView; class SplitterOrView; class EditorClosingCoreListener; @@ -217,11 +218,13 @@ private: Core::IEditor *duplicateEditor(IEditor *editor); void closeDuplicate(Core::IEditor *editor, bool doDelete); + void activateEditor(Core::Internal::EditorView *view, Core::IEditor *editor); static EditorManager *m_instance; EditorManagerPrivate *m_d; friend class Core::Internal::SplitterOrView; + friend class Core::Internal::EditorView; }; //===================EditorClosingCoreListener====================== diff --git a/src/plugins/coreplugin/editormanager/editorview.cpp b/src/plugins/coreplugin/editormanager/editorview.cpp index 4936d7b8a07..10db489707e 100644 --- a/src/plugins/coreplugin/editormanager/editorview.cpp +++ b/src/plugins/coreplugin/editormanager/editorview.cpp @@ -234,7 +234,7 @@ EditorView::EditorView(EditorModel *model, QWidget *parent) : vlayout->addLayout(toplayout); tl->addWidget(top); - connect(m_editorList, SIGNAL(currentIndexChanged(int)), this, SLOT(listSelectionChanged(int))); + connect(m_editorList, SIGNAL(activated(int)), this, SLOT(listSelectionActivated(int))); connect(m_lockButton, SIGNAL(clicked()), this, SLOT(makeEditorWritable())); connect(m_closeButton, SIGNAL(clicked()), this, SLOT(sendCloseRequest())); } @@ -333,6 +333,11 @@ void EditorView::insertEditor(int index, IEditor *editor) m_toolBar->layout()->addWidget(toolBar); } connect(editor, SIGNAL(changed()), this, SLOT(checkEditorStatus())); + + if (m_container->count() == 1) { + updateToolBar(editor); + updateEditorStatus(editor); + } } bool EditorView::hasEditor(IEditor *editor) const @@ -379,18 +384,19 @@ void EditorView::setCurrentEditor(IEditor *editor) 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); - disconnect(m_editorList, SIGNAL(currentIndexChanged(int)), this, SLOT(listSelectionChanged(int))); m_editorList->setCurrentIndex(qobject_cast<EditorModel*>(m_editorList->model())->indexOf(editor->file()->fileName()).row()); - connect(m_editorList, SIGNAL(currentIndexChanged(int)), this, SLOT(listSelectionChanged(int))); } setEditorFocus(idx); - updateEditorStatus(editor); updateToolBar(editor); + + if (editor != m_editorForInfoWidget) { m_infoWidget->hide(); m_editorForInfoWidget = 0; @@ -455,10 +461,11 @@ void EditorView::makeEditorWritable() CoreImpl::instance()->editorManager()->makeEditorWritable(currentEditor()); } -void EditorView::listSelectionChanged(int index) +void EditorView::listSelectionActivated(int index) { QAbstractItemModel *model = m_editorList->model(); - setCurrentEditor(model->data(model->index(index, 0), Qt::UserRole).value<IEditor*>()); + IEditor *editor = model->data(model->index(index, 0), Qt::UserRole).value<IEditor*>(); + CoreImpl::instance()->editorManager()->activateEditor(this, editor); } @@ -480,7 +487,7 @@ SplitterOrView::SplitterOrView(Core::IEditor *editor, QWidget *parent) m_view = new EditorView(CoreImpl::instance()->editorManager()->openedEditorsModel()); m_view->addEditor(editor); m_splitter = 0; - m_layout->addWidget(editor->widget()); + m_layout->addWidget(m_view); } SplitterOrView *SplitterOrView::findView(Core::IEditor *editor) @@ -525,6 +532,7 @@ void SplitterOrView::split(Qt::Orientation orientation) m_splitter->addWidget(new SplitterOrView(duplicateA)); focus = duplicateA; } else { + m_view->removeEditor(e); m_splitter->addWidget(new SplitterOrView(e)); Q_ASSERT(m_view->currentEditor() == 0); } @@ -568,6 +576,7 @@ 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); } closeSplitterEditors(); diff --git a/src/plugins/coreplugin/editormanager/editorview.h b/src/plugins/coreplugin/editormanager/editorview.h index 401066761b9..bfcdcb965bd 100644 --- a/src/plugins/coreplugin/editormanager/editorview.h +++ b/src/plugins/coreplugin/editormanager/editorview.h @@ -126,7 +126,7 @@ private slots: void checkEditorStatus(); void setEditorFocus(int index); void makeEditorWritable(); - void listSelectionChanged(int index); + void listSelectionActivated(int index); private: void updateToolBar(IEditor *editor); -- GitLab