diff --git a/src/plugins/coreplugin/editormanager/editorgroup.cpp b/src/plugins/coreplugin/editormanager/editorgroup.cpp index 91adef17805cc1e60ebdf157aa5d3aea4fb26e67..8158bab4d8129ef5e7b9b7f0ecb027cc4f4140fe 100644 --- a/src/plugins/coreplugin/editormanager/editorgroup.cpp +++ b/src/plugins/coreplugin/editormanager/editorgroup.cpp @@ -93,8 +93,38 @@ int EditorModel::columnCount(const QModelIndex &parent) const int EditorModel::rowCount(const QModelIndex &parent) const { - Q_UNUSED(parent); - return m_editors.count(); + if (!parent.isValid()) + return m_editors.count(); + return 0; +} + +void EditorModel::insertEditor(int index, IEditor *editor) +{ + beginInsertRows(QModelIndex(), index, index); + m_editors.insert(index, editor); + connect(editor, SIGNAL(changed()), this, SLOT(itemChanged())); + endInsertRows(); +} + +void EditorModel::removeEditor(IEditor *editor) +{ + int idx = m_editors.indexOf(editor); + if (idx < 0) + return; + beginRemoveRows(QModelIndex(), idx, idx); + m_editors.removeAt(idx); + endRemoveRows(); + disconnect(editor, SIGNAL(changed()), this, SLOT(itemChanged())); +} + + +void EditorModel::emitDataChanged(IEditor *editor) +{ + int idx = m_editors.indexOf(editor); + if (idx < 0) + return; + QModelIndex mindex = index(idx, 0); + emit dataChanged(mindex, mindex); } QModelIndex EditorModel::index(int row, int column, const QModelIndex &parent) const @@ -136,10 +166,24 @@ QModelIndex EditorModel::indexOf(IEditor *editor) const { int idx = m_editors.indexOf(editor); if (idx < 0) - return QModelIndex(); + return indexOf(editor->file()->fileName()); return createIndex(idx, 0); } +QModelIndex EditorModel::indexOf(const QString &fileName) const +{ + for (int i = 0; i < m_editors.count(); ++i) + if (m_editors.at(i)->file()->fileName() == fileName) + return createIndex(i, 0); + return QModelIndex(); +} + + +void EditorModel::itemChanged() +{ + emitDataChanged(qobject_cast<IEditor*>(sender())); +} + //================EditorGroupContext=============== EditorGroupContext::EditorGroupContext(EditorGroup *editorGroup) diff --git a/src/plugins/coreplugin/editormanager/editorgroup.h b/src/plugins/coreplugin/editormanager/editorgroup.h index 83eb6cf240ddee31ddbe7be29d7413bcda2e5789..bd9879e1ce31e814ebe91998f8a79e785ddd0a4e 100644 --- a/src/plugins/coreplugin/editormanager/editorgroup.h +++ b/src/plugins/coreplugin/editormanager/editorgroup.h @@ -127,6 +127,7 @@ namespace Internal { // Also used by StackedEditorGroup class EditorModel : public QAbstractItemModel { + Q_OBJECT public: EditorModel(QObject *parent) : QAbstractItemModel(parent) {} int columnCount(const QModelIndex &parent = QModelIndex()) const; @@ -137,30 +138,16 @@ public: void addEditor(IEditor *editor) { insertEditor(rowCount(), editor); } - void insertEditor(int index, IEditor *editor) - { - beginInsertRows(QModelIndex(), index, index); - m_editors.insert(index, editor); - endInsertRows(); - } - - void removeEditor(IEditor *editor) - { - int index = m_editors.indexOf(editor); - beginRemoveRows(QModelIndex(), index, index); - m_editors.removeAt(index); - endRemoveRows(); - } - - void emitDataChanged(IEditor *editor) - { - int idx = m_editors.indexOf(editor); - QModelIndex mindex = index(idx, 0); - emit dataChanged(mindex, mindex); - } + void insertEditor(int index, IEditor *editor); + void removeEditor(IEditor *editor); + void emitDataChanged(IEditor *editor); QList<IEditor *> editors() const { return m_editors; } QModelIndex indexOf(IEditor *editor) const; + QModelIndex indexOf(const QString &filename) const; + +private slots: + void itemChanged(); private: QList<IEditor *> m_editors; }; diff --git a/src/plugins/coreplugin/editormanager/editormanager.cpp b/src/plugins/coreplugin/editormanager/editormanager.cpp index 1eb3abb133d72665bfd8aa03dff64a7a1c0cc717..133616f8f368162cf835ed5677b8d0cadf9770b4 100644 --- a/src/plugins/coreplugin/editormanager/editormanager.cpp +++ b/src/plugins/coreplugin/editormanager/editormanager.cpp @@ -118,7 +118,8 @@ EditorManagerPlaceHolder* EditorManagerPlaceHolder::current() // ---------------- EditorManager -struct Core::EditorManagerPrivate { +namespace Core { +struct EditorManagerPrivate { struct EditLocation { QPointer<IEditor> editor; QString fileName; @@ -161,8 +162,10 @@ struct Core::EditorManagerPrivate { QString fileFilters; QString selectedFilter; + EditorModel *m_editorModel; QString m_externalEditor; }; +} EditorManagerPrivate::EditorManagerPrivate(ICore *core, QWidget *parent) : m_splitter(0), @@ -183,7 +186,7 @@ EditorManagerPrivate::EditorManagerPrivate(ICore *core, QWidget *parent) : m_windowPopup(0), m_coreListener(0) { - + m_editorModel = new EditorModel(parent); } EditorManagerPrivate::~EditorManagerPrivate() @@ -408,6 +411,7 @@ void EditorManager::updateEditorHistory() bool EditorManager::registerEditor(IEditor *editor) { if (editor) { + m_d->m_editorModel->addEditor(editor); if (!hasDuplicate(editor)) { m_d->m_core->fileManager()->addFile(editor->file()); m_d->m_core->fileManager()->addToRecentFiles(editor->file()->fileName()); @@ -422,6 +426,7 @@ bool EditorManager::registerEditor(IEditor *editor) bool EditorManager::unregisterEditor(IEditor *editor) { if (editor) { + m_d->m_editorModel->removeEditor(editor); if (!hasDuplicate(editor)) m_d->m_core->fileManager()->removeFile(editor->file()); m_d->m_editorHistory.removeAll(editor); @@ -1171,6 +1176,7 @@ void EditorManager::updateActions() QList<IEditor*> EditorManager::openedEditors() const { + return m_d->m_editorModel->editors(); QList<IEditor*> editors; const QList<EditorGroup*> groups = m_d->m_splitter->groups(); foreach (EditorGroup *group, groups) { @@ -1179,6 +1185,12 @@ QList<IEditor*> EditorManager::openedEditors() const return editors; } +Internal::EditorModel *EditorManager::openedEditorsModel() const +{ + return m_d->m_editorModel; +} + + QList<EditorGroup *> EditorManager::editorGroups() const { return m_d->m_splitter->groups(); diff --git a/src/plugins/coreplugin/editormanager/editormanager.h b/src/plugins/coreplugin/editormanager/editormanager.h index eec20a4a05d3bdcace5797d5982e8a5a3752135d..f07da9d447aca2e6956defcdb7b29343af9be84b 100644 --- a/src/plugins/coreplugin/editormanager/editormanager.h +++ b/src/plugins/coreplugin/editormanager/editormanager.h @@ -68,10 +68,12 @@ struct EditorManagerPrivate; namespace Internal { class OpenEditorsWindow; +class EditorModel; class EditorSplitter; class EditorClosingCoreListener; class OpenEditorsViewFactory; + } // namespace Internal class CORE_EXPORT EditorManagerPlaceHolder : public QWidget @@ -119,6 +121,9 @@ public: EditorGroup *currentEditorGroup() const; QList<IEditor*> openedEditors() const; + + Internal::EditorModel *openedEditorsModel() const; + QList<IEditor*> editorsForFiles(QList<IFile*> files) const; QList<EditorGroup *> editorGroups() const; QList<IEditor*> editorHistory() const; diff --git a/src/plugins/coreplugin/editormanager/openeditorsview.cpp b/src/plugins/coreplugin/editormanager/openeditorsview.cpp index 755826c94a4c2dbcd057def2ebe681b760549c06..c04a2a5c73b43eff87712fb1faddc1ed85d5294e 100644 --- a/src/plugins/coreplugin/editormanager/openeditorsview.cpp +++ b/src/plugins/coreplugin/editormanager/openeditorsview.cpp @@ -63,7 +63,6 @@ OpenEditorsWidget::OpenEditorsWidget() setWindowTitle(tr("Open Documents")); setWindowIcon(QIcon(Constants::ICON_DIR)); setFocusProxy(m_ui.editorList); - m_ui.editorList->setColumnCount(1); m_ui.editorList->header()->hide(); m_ui.editorList->setIndentation(0); m_ui.editorList->setSelectionMode(QAbstractItemView::ExtendedSelection); @@ -71,20 +70,11 @@ OpenEditorsWidget::OpenEditorsWidget() m_ui.editorList->installEventFilter(this); m_ui.editorList->setFrameStyle(QFrame::NoFrame); EditorManager *em = EditorManager::instance(); - foreach (IEditor *editor, em->openedEditors()) { - registerEditor(editor); - } - connect(em, SIGNAL(editorOpened(Core::IEditor*)), - this, SLOT(registerEditor(Core::IEditor*))); - connect(em, SIGNAL(editorsClosed(QList<Core::IEditor*>)), - this, SLOT(unregisterEditors(QList<Core::IEditor*>))); - connect(em, SIGNAL(editorGroupsChanged()), - this, SLOT(updateEditorList())); + m_ui.editorList->setModel(em->openedEditorsModel()); connect(em, SIGNAL(currentEditorChanged(Core::IEditor*)), - this, SLOT(updateCurrentItem())); - connect(m_ui.editorList, SIGNAL(itemActivated(QTreeWidgetItem*, int)), - this, SLOT(selectEditor(QTreeWidgetItem*))); - updateEditorList(); + this, SLOT(updateCurrentItem(Core::IEditor*))); + connect(m_ui.editorList, SIGNAL(activated(QModelIndex)), + this, SLOT(selectEditor(QModelIndex))); } OpenEditorsWidget::~OpenEditorsWidget() @@ -92,126 +82,32 @@ OpenEditorsWidget::~OpenEditorsWidget() } -void OpenEditorsWidget::registerEditor(IEditor *editor) -{ - connect(editor, SIGNAL(changed()), this, SLOT(updateEditor())); - updateEditorList(); -} - -void OpenEditorsWidget::unregisterEditors(QList<IEditor *> editors) +void OpenEditorsWidget::updateCurrentItem(Core::IEditor *editor) { - foreach (IEditor *editor, editors) - disconnect(editor, SIGNAL(changed()), this, SLOT(updateEditor())); - updateEditorList(); -} - -void OpenEditorsWidget::updateEditorList() -{ - EditorManager *em = EditorManager::instance(); - QList<EditorGroup *> groups = em->editorGroups(); - IEditor *curEditor = em->currentEditor(); - int oldNum = m_ui.editorList->topLevelItemCount(); - QTreeWidgetItem *currentItem = 0; - int currItemIndex = 0; - for (int i = 0; i < groups.count(); ++i) { - QTreeWidgetItem *item; - if (groups.count() > 1) { - if (currItemIndex < oldNum) { - item = m_ui.editorList->topLevelItem(currItemIndex); - } else { - item = new QTreeWidgetItem(QStringList()<<""); - m_ui.editorList->addTopLevelItem(item); - } - currItemIndex++; - item->setIcon(0, QIcon()); - item->setText(0, tr("---Group %1---").arg(i)); - item->setFlags(0); - item->setToolTip(0, ""); - item->setData(0, Qt::UserRole, QVariant()); - item->setTextAlignment(0, Qt::AlignLeft); - } - foreach (IEditor *editor, groups.at(i)->editors()) { - if (currItemIndex < oldNum) { - item = m_ui.editorList->topLevelItem(currItemIndex); - } else { - item = new QTreeWidgetItem(QStringList()<<""); - m_ui.editorList->addTopLevelItem(item); - } - currItemIndex++; - updateItem(item, editor); - if (editor == curEditor) - currentItem = item; - } - } - for (int i = oldNum-1; i >= currItemIndex; --i) { - delete m_ui.editorList->takeTopLevelItem(i); + if (!editor) { + m_ui.editorList->clearSelection(); + return; } - updateCurrentItem(currentItem); -} - -void OpenEditorsWidget::updateCurrentItem(QTreeWidgetItem *currentItem) -{ EditorManager *em = EditorManager::instance(); - IEditor *curEditor = em->currentEditor(); - m_ui.editorList->clearSelection(); - if (!currentItem && curEditor) { - int count = m_ui.editorList->topLevelItemCount(); - for (int i = 0; i < count; ++i) { - if (m_ui.editorList->topLevelItem(i)->data(0, Qt::UserRole).value<IEditor *>() - == curEditor) { - currentItem = m_ui.editorList->topLevelItem(i); - break; - } - } - } - m_ui.editorList->setCurrentItem(currentItem); - if (currentItem) - m_ui.editorList->scrollTo(m_ui.editorList->currentIndex()); + m_ui.editorList->setCurrentIndex(em->openedEditorsModel()->indexOf(editor)); + m_ui.editorList->scrollTo(m_ui.editorList->currentIndex()); } -//todo: this is almost duplicated in openeditorswindow -void OpenEditorsWidget::updateItem(QTreeWidgetItem *item, IEditor *editor) +void OpenEditorsWidget::selectEditor(const QModelIndex &index) { - static const QIcon lockedIcon(QLatin1String(":/core/images/locked.png")); - static const QIcon emptyIcon(QLatin1String(":/core/images/empty14.png")); - QString title = editor->displayName(); - if (editor->file()->isModified()) - title += tr("*"); - item->setIcon(0, editor->file()->isReadOnly() ? lockedIcon : emptyIcon); - item->setText(0, title); - item->setToolTip(0, editor->file()->fileName()); - item->setData(0, Qt::UserRole, QVariant::fromValue(editor)); - item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); - item->setTextAlignment(0, Qt::AlignLeft); -} - -void OpenEditorsWidget::selectEditor(QTreeWidgetItem *item) -{ - if (item == 0) - item = m_ui.editorList->currentItem(); - if (item == 0) - return; - IEditor *editor = item->data(0, Qt::UserRole).value<IEditor*>(); + IEditor *editor = index.data(Qt::UserRole).value<IEditor*>(); EditorManager::instance()->setCurrentEditor(editor); } -void OpenEditorsWidget::updateEditor() + +void OpenEditorsWidget::selectEditor() { - IEditor *editor = qobject_cast<IEditor *>(sender()); - QTC_ASSERT(editor, return); - int num = m_ui.editorList->topLevelItemCount(); - for (int i = 0; i < num; ++i) { - QTreeWidgetItem *item = m_ui.editorList->topLevelItem(i); - if (item->data(0, Qt::UserRole).value<IEditor *>() - == editor) { - updateItem(item, editor); - return; - } - } + selectEditor(m_ui.editorList->currentIndex()); } void OpenEditorsWidget::closeEditors() { + /* ### TODO QList<IFile *> selectedFiles; QList<IEditor *> selectedEditors; foreach (QTreeWidgetItem *item, m_ui.editorList->selectedItems()) { @@ -226,6 +122,7 @@ void OpenEditorsWidget::closeEditors() core->editorManager()-> closeEditors(selectedEditors); updateEditorList(); + */ } void OpenEditorsWidget::closeAllEditors() @@ -242,7 +139,7 @@ bool OpenEditorsWidget::eventFilter(QObject *obj, QEvent *event) QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event); switch (keyEvent->key()) { case Qt::Key_Return: - selectEditor(m_ui.editorList->currentItem()); + selectEditor(m_ui.editorList->currentIndex()); return true; case Qt::Key_Delete: //fall through case Qt::Key_Backspace: @@ -259,9 +156,9 @@ bool OpenEditorsWidget::eventFilter(QObject *obj, QEvent *event) QContextMenuEvent *contextMenuEvent = static_cast<QContextMenuEvent *>(event); QMenu menu; menu.addAction(tr("&Select"), this, SLOT(selectEditor())); - menu.addAction(tr("&Close"), this, SLOT(closeEditors())); - menu.addAction(tr("Close &All"), this, SLOT(closeAllEditors())); - if (m_ui.editorList->selectedItems().isEmpty()) +//todo menu.addAction(tr("&Close"), this, SLOT(closeEditors())); +//todo menu.addAction(tr("Close &All"), this, SLOT(closeAllEditors())); + if (m_ui.editorList->selectionModel()->selectedIndexes().isEmpty()) menu.setEnabled(false); menu.exec(contextMenuEvent->globalPos()); return true; diff --git a/src/plugins/coreplugin/editormanager/openeditorsview.h b/src/plugins/coreplugin/editormanager/openeditorsview.h index 4aa9743e753c012c0cde8e4af23785d0a465049d..a7403d1e86754fe9297dd9c606d316082bd30ef0 100644 --- a/src/plugins/coreplugin/editormanager/openeditorsview.h +++ b/src/plugins/coreplugin/editormanager/openeditorsview.h @@ -59,19 +59,14 @@ public: bool eventFilter(QObject *obj, QEvent *event); private slots: - void registerEditor(Core::IEditor *editor); - void unregisterEditors(QList<Core::IEditor *> editors); - void updateEditorList(); - void selectEditor(QTreeWidgetItem *item = 0); - void updateEditor(); + void selectEditor(const QModelIndex &); + void selectEditor(); void closeEditors(); void closeAllEditors(); - void updateCurrentItem(QTreeWidgetItem *currentItem = 0); + void updateCurrentItem(Core::IEditor*); void putFocusToEditorList(); private: - static void updateItem(QTreeWidgetItem *item, Core::IEditor *editor); - Ui::OpenEditorsView m_ui; QWidget *m_widget; }; diff --git a/src/plugins/coreplugin/editormanager/openeditorsview.ui b/src/plugins/coreplugin/editormanager/openeditorsview.ui index 7676ba396777df91f489329ffee30bd1f26670cc..3cfa50e78320f7773ffb09a4977e61b65dfb9fe0 100644 --- a/src/plugins/coreplugin/editormanager/openeditorsview.ui +++ b/src/plugins/coreplugin/editormanager/openeditorsview.ui @@ -26,7 +26,7 @@ <number>0</number> </property> <item row="0" column="0" > - <widget class="QTreeWidget" name="editorList" > + <widget class="QTreeView" name="editorList" > <property name="uniformRowHeights" > <bool>true</bool> </property>