From 2faf32c79c23eb6043ea2b5683b3b5f6eac84ac1 Mon Sep 17 00:00:00 2001 From: mae Date: Wed, 4 Feb 2009 14:30:55 +0100 Subject: [PATCH] new editor split system seems to be working now --- .../editormanager/editormanager.cpp | 40 +++++++---- .../coreplugin/editormanager/editormanager.h | 4 +- .../coreplugin/editormanager/editorview.cpp | 71 ++++++++----------- .../editormanager/openeditorswindow.cpp | 22 +++--- 4 files changed, 73 insertions(+), 64 deletions(-) diff --git a/src/plugins/coreplugin/editormanager/editormanager.cpp b/src/plugins/coreplugin/editormanager/editormanager.cpp index bc8e19a9534..af052bf4b08 100644 --- a/src/plugins/coreplugin/editormanager/editormanager.cpp +++ b/src/plugins/coreplugin/editormanager/editormanager.cpp @@ -569,16 +569,19 @@ void EditorManager::closeView(Core::Internal::EditorView *view) return; if (view == m_d->m_view) { - closeEditors(QList() << view->currentEditor()); + if (IEditor *e = view->currentEditor()) + closeEditors(QList() << e); return; } emptyView(view); SplitterOrView *splitterOrView = m_d->m_splitter->findView(view); + Q_ASSERT(splitterOrView); Q_ASSERT(splitterOrView->view() == view); SplitterOrView *splitter = m_d->m_splitter->findSplitter(splitterOrView); Q_ASSERT(splitterOrView->hasEditors() == false); + splitterOrView->hide(); delete splitterOrView; splitter->unsplit(); @@ -590,6 +593,7 @@ void EditorManager::closeView(Core::Internal::EditorView *view) else setCurrentView(newCurrent); } + updateEditorHistory(); } void EditorManager::closeEditor(Core::IEditor *editor) @@ -726,8 +730,11 @@ bool EditorManager::closeEditors(const QList editorsToClose, bool askA delete editor; } - if (currentView) - activateEditor(currentView, currentView->currentEditor()); + if (currentView) { + setCurrentView(m_d->m_splitter->findView(currentView)); + if (IEditor *e = currentView->currentEditor()) + activateEditor(currentView, e); + } return !closingFailed; } @@ -744,27 +751,29 @@ IEditor *EditorManager::pickUnusedEditor() const void EditorManager::activateEditor(IEditor *editor, OpenEditorFlags flags) { - SplitterOrView *splitterOrView = m_d->m_currentView; setCurrentView(0); - qDebug() << "currentView" << splitterOrView; + if (editor && (flags & ActivateInPlace)) { + SplitterOrView *place = m_d->m_splitter->findView(editor); + if (place && !place->isSplitter()) { + splitterOrView = place; + } + } + + if (!splitterOrView) splitterOrView = m_d->m_splitter->findEmptyView(); - qDebug() << "empty" << splitterOrView; if (!splitterOrView && m_d->m_currentEditor) splitterOrView = m_d->m_splitter->findView(m_d->m_currentEditor); - qDebug() << "current editor" << splitterOrView; if (!splitterOrView) splitterOrView = m_d->m_splitter->findFirstView(); - qDebug() << "first" << splitterOrView; if (!splitterOrView) { splitterOrView = m_d->m_splitter; } - qDebug() << "origin" << splitterOrView; activateEditor(splitterOrView->view(), editor, flags); } @@ -805,6 +814,7 @@ void EditorManager::activateEditor(Core::Internal::EditorView *view, Core::IEdit } bool hasCurrent = (view->currentEditor() != 0); + editor = placeEditor(view, editor); if (!(flags & NoActivate) || !hasCurrent) view->setCurrentEditor(editor); @@ -1310,6 +1320,10 @@ void EditorManager::updateActions() m_d->m_goBackAction->setEnabled(m_d->currentNavigationHistoryPosition > 0); m_d->m_goForwardAction->setEnabled(m_d->currentNavigationHistoryPosition < m_d->m_navigationHistory.size()-1); + bool hasSplitter = m_d->m_splitter->isSplitter(); + m_d->m_unsplitAction->setEnabled(hasSplitter); + m_d->m_gotoOtherWindowAction->setEnabled(hasSplitter); + m_d->m_openInExternalEditorAction->setEnabled(curEditor != 0); } @@ -1434,7 +1448,6 @@ QByteArray EditorManager::saveState() const QByteArray bytes; QDataStream stream(&bytes, QIODevice::WriteOnly); - qDebug() << "saveState"; stream << QByteArray("EditorManagerV1"); stream << m_d->m_editorStates; @@ -1447,7 +1460,6 @@ QByteArray EditorManager::saveState() const editors.prepend(m_d->m_currentEditor); } - qDebug() << "save editors:" << editorCount; stream << editorCount; foreach (IEditor *editor, editors) { @@ -1674,8 +1686,11 @@ void EditorManager::split(Qt::Orientation orientation) if (!view) view = m_d->m_currentEditor ? m_d->m_splitter->findView(m_d->m_currentEditor) : m_d->m_splitter->findFirstView(); - if (view) + if (view) { view->split(orientation); + updateEditorHistory(); + } + updateActions(); } void EditorManager::split() @@ -1698,6 +1713,7 @@ void EditorManager::unsplit() return; closeView(viewToClose->view()); + updateActions(); } void EditorManager::gotoOtherWindow() diff --git a/src/plugins/coreplugin/editormanager/editormanager.h b/src/plugins/coreplugin/editormanager/editormanager.h index d8c9be410dd..9e6bb4f1ac2 100644 --- a/src/plugins/coreplugin/editormanager/editormanager.h +++ b/src/plugins/coreplugin/editormanager/editormanager.h @@ -104,7 +104,9 @@ public: enum OpenEditorFlag { NoActivate = 1, - IgnoreNavigationHistory = 2 + IgnoreNavigationHistory = 2, + ActivateInPlace = 4 + }; Q_DECLARE_FLAGS(OpenEditorFlags, OpenEditorFlag) diff --git a/src/plugins/coreplugin/editormanager/editorview.cpp b/src/plugins/coreplugin/editormanager/editorview.cpp index ab43c5d38fe..15652872ded 100644 --- a/src/plugins/coreplugin/editormanager/editorview.cpp +++ b/src/plugins/coreplugin/editormanager/editorview.cpp @@ -34,6 +34,7 @@ #include "editorview.h" #include "editormanager.h" #include "coreimpl.h" +#include "minisplitter.h" #include @@ -199,8 +200,6 @@ void EditorModel::itemChanged() emitDataChanged(qobject_cast(sender())); } - - //================EditorView==================== EditorView::EditorView(EditorModel *model, QWidget *parent) : @@ -354,8 +353,6 @@ bool EditorView::hasEditor(IEditor *editor) const void EditorView::closeView() { - if (editorCount() == 0) - return; EditorManager *em = CoreImpl::instance()->editorManager(); em->closeView(this); } @@ -397,8 +394,6 @@ void EditorView::setCurrentEditor(IEditor *editor) if (!editor || m_container->count() <= 0 || m_container->indexOf(editor->widget()) == -1) return; - if (editor) - qDebug() << "EditorView::setCurrentEditor" << editor << editor->file()->fileName(); const int idx = m_container->indexOf(editor->widget()); QTC_ASSERT(idx >= 0, return); @@ -664,7 +659,7 @@ SplitterOrView *SplitterOrView::findNextView_helper(SplitterOrView *view, bool * void SplitterOrView::split(Qt::Orientation orientation) { Q_ASSERT(m_view && m_splitter == 0); - m_splitter = new QSplitter(this); + m_splitter = new MiniSplitter(this); m_splitter->setOrientation(orientation); m_layout->addWidget(m_splitter); EditorManager *em = CoreImpl::instance()->editorManager(); @@ -674,7 +669,6 @@ void SplitterOrView::split(Qt::Orientation orientation) m_view->removeEditor(e); m_splitter->addWidget(new SplitterOrView(e)); - m_view = 0; if (e->duplicateSupported()) { Core::IEditor *duplicate = em->duplicateEditor(e); @@ -695,10 +689,9 @@ void SplitterOrView::split(Qt::Orientation orientation) m_view = 0; } + em->setCurrentView(findFirstView()); if (e) em->activateEditor(e); - else - em->setCurrentView(findFirstView()); } void SplitterOrView::close() @@ -728,37 +721,35 @@ void SplitterOrView::unsplit() if (!m_splitter) return; - qDebug() << "unsplit" << this << m_splitter; -#if 0 - SplitterOrView *splitterOrView = qobject_cast(m_splitter->widget(0)); - Q_ASSERT(splitterOrView != 0); + Q_ASSERT(m_splitter->count() == 1); + EditorManager *em = CoreImpl::instance()->editorManager(); + SplitterOrView *childSplitterOrView = qobject_cast(m_splitter->widget(0)); - qDebug() << "splitter or view is" << splitterOrView; + QSplitter *oldSplitter = m_splitter; + m_splitter = 0; - if (editor) { // pick the other side - if (SplitterOrView *view = findView(editor)) { - qDebug() << "view to close is" << view; - view->close(); - delete view; - } - splitterOrView = qobject_cast(m_splitter->widget(0)); - qDebug() << "other splitter or view is" << splitterOrView; - } - - QSplitter *old_splitter = m_splitter; - EditorView *old_view = m_view; - - m_splitter = splitterOrView->splitter(); - m_view = splitterOrView->view(); - - qDebug() << "new splitter/view" << m_splitter << m_view; - - if (m_splitter) + if (childSplitterOrView->isSplitter()) { + Q_ASSERT(childSplitterOrView->view() == 0); + m_splitter = childSplitterOrView->splitter(); m_layout->addWidget(m_splitter); - if (m_view) - m_layout->addWidget(m_view); - -// delete old_view; -// delete old_splitter; -#endif + m_layout->setCurrentWidget(m_splitter); + } else { + EditorView *childView = childSplitterOrView->view(); + Q_ASSERT(childView); + if (m_view) { + if (IEditor *e = childView->currentEditor()) { + childView->removeEditor(e); + m_view->addEditor(e); + m_view->setCurrentEditor(e); + } + em->emptyView(childView); + } else { + m_view = childView; + childSplitterOrView->m_layout->removeWidget(m_view); + m_layout->addWidget(m_view); + } + m_layout->setCurrentWidget(m_view); + } + delete oldSplitter; + em->setCurrentView(findFirstView()); } diff --git a/src/plugins/coreplugin/editormanager/openeditorswindow.cpp b/src/plugins/coreplugin/editormanager/openeditorswindow.cpp index c3b40cd7859..abba9867ad5 100644 --- a/src/plugins/coreplugin/editormanager/openeditorswindow.cpp +++ b/src/plugins/coreplugin/editormanager/openeditorswindow.cpp @@ -46,15 +46,6 @@ const int OpenEditorsWindow::WIDTH = 300; const int OpenEditorsWindow::HEIGHT = 200; const int OpenEditorsWindow::MARGIN = 4; -bool OpenEditorsWindow::isSameFile(IEditor *editorA, IEditor *editorB) const -{ - if (editorA == editorB) - return true; - if (!editorA || !editorB) - return false; - return editorA->file()->fileName() == editorB->file()->fileName(); -} - OpenEditorsWindow::OpenEditorsWindow(QWidget *parent) : QWidget(parent, Qt::Popup), m_editorList(new QTreeWidget(this)), @@ -209,7 +200,16 @@ void OpenEditorsWindow::setEditors(const QList&editors, IEditor *curr m_editorList->clear(); + QList doneList; + QListdoneFileList; foreach (IEditor *editor, editors) { + if (doneList.contains(editor)) + continue; + doneList += editor; + if (!editor->widget()->isVisible() && doneFileList.contains(editor->file())) + continue; + doneFileList += editor->file(); + QTreeWidgetItem *item = new QTreeWidgetItem(); QString title = editor->displayName(); @@ -219,7 +219,7 @@ void OpenEditorsWindow::setEditors(const QList&editors, IEditor *curr item->setText(0, title); item->setToolTip(0, editor->file()->fileName()); item->setData(0, Qt::UserRole, QVariant::fromValue(editor)); - item->setFlags(Qt::ItemIsSelectable); + //item->setFlags(Qt::ItemIsSelectable); item->setTextAlignment(0, Qt::AlignLeft); @@ -236,7 +236,7 @@ void OpenEditorsWindow::selectEditor(QTreeWidgetItem *item) if (item) editor = item->data(0, Qt::UserRole).value(); if (editor) - EditorManager::instance()->activateEditor(editor); + EditorManager::instance()->activateEditor(editor, EditorManager::ActivateInPlace); } void OpenEditorsWindow::editorClicked(QTreeWidgetItem *item)