diff options
author | Eike Ziller <eike.ziller@theqtcompany.com> | 2016-06-01 11:46:27 +0200 |
---|---|---|
committer | Eike Ziller <eike.ziller@qt.io> | 2016-06-09 08:00:41 +0000 |
commit | 8f83ac351bfb66a21dd085e870f210bcd7f1a9d0 (patch) | |
tree | 8d3e33db1aa77fc4db6481805fd588f1e823e477 | |
parent | 505c9be9af58ad35c62f8fbbce3b7a77017204b3 (diff) | |
download | qt-creator-8f83ac351bfb66a21dd085e870f210bcd7f1a9d0.tar.gz |
DocumentModel: Better separation of private API
Change-Id: Iee534ba5d6edd283add8a1f36fd0e56ab3ee8f41
Reviewed-by: David Schulz <david.schulz@theqtcompany.com>
-rw-r--r-- | src/plugins/coreplugin/coreplugin.pro | 3 | ||||
-rw-r--r-- | src/plugins/coreplugin/coreplugin.qbs | 2 | ||||
-rw-r--r-- | src/plugins/coreplugin/editormanager/documentmodel.cpp | 553 | ||||
-rw-r--r-- | src/plugins/coreplugin/editormanager/documentmodel.h | 8 | ||||
-rw-r--r-- | src/plugins/coreplugin/editormanager/documentmodel_p.h | 94 | ||||
-rw-r--r-- | src/plugins/coreplugin/editormanager/editormanager.cpp | 19 | ||||
-rw-r--r-- | src/plugins/coreplugin/editormanager/editorview.cpp | 3 |
7 files changed, 367 insertions, 315 deletions
diff --git a/src/plugins/coreplugin/coreplugin.pro b/src/plugins/coreplugin/coreplugin.pro index 72d979f95e..9c8be5cfa7 100644 --- a/src/plugins/coreplugin/coreplugin.pro +++ b/src/plugins/coreplugin/coreplugin.pro @@ -217,7 +217,8 @@ HEADERS += corejsextensions.h \ messagebox.h \ iwelcomepage.h \ systemsettings.h \ - coreicons.h + coreicons.h \ + editormanager/documentmodel_p.h FORMS += dialogs/newdialog.ui \ dialogs/saveitemsdialog.ui \ diff --git a/src/plugins/coreplugin/coreplugin.qbs b/src/plugins/coreplugin/coreplugin.qbs index f5fc28bd9b..dc2018cd04 100644 --- a/src/plugins/coreplugin/coreplugin.qbs +++ b/src/plugins/coreplugin/coreplugin.qbs @@ -142,7 +142,7 @@ QtcPlugin { name: "Editor Manager" prefix: "editormanager/" files: [ - "documentmodel.cpp", "documentmodel.h", + "documentmodel.cpp", "documentmodel.h", "documentmodel_p.h", "editorarea.cpp", "editorarea.h", "editormanager.cpp", "editormanager.h", "editormanager_p.h", "editorview.cpp", "editorview.h", diff --git a/src/plugins/coreplugin/editormanager/documentmodel.cpp b/src/plugins/coreplugin/editormanager/documentmodel.cpp index 36cda805f3..9928709698 100644 --- a/src/plugins/coreplugin/editormanager/documentmodel.cpp +++ b/src/plugins/coreplugin/editormanager/documentmodel.cpp @@ -24,6 +24,8 @@ ****************************************************************************/ #include "documentmodel.h" +#include "documentmodel_p.h" + #include "ieditor.h" #include <coreplugin/documentmanager.h> #include <coreplugin/idocument.h> @@ -41,135 +43,17 @@ #include <QSet> #include <QUrl> -namespace Core { - -class DocumentModelPrivate : public QAbstractItemModel -{ - Q_OBJECT - -public: - ~DocumentModelPrivate(); - - int columnCount(const QModelIndex &parent = QModelIndex()) const override; - QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; - Qt::ItemFlags flags(const QModelIndex &index) const override; - QMimeData *mimeData(const QModelIndexList &indexes) const override; - QModelIndex parent(const QModelIndex &/*index*/) const override { return QModelIndex(); } - int rowCount(const QModelIndex &parent = QModelIndex()) const override; - QModelIndex index(int row, int column = 0, const QModelIndex &parent = QModelIndex()) const override; - - Qt::DropActions supportedDragActions() const override; - QStringList mimeTypes() const override; - - void addEntry(DocumentModel::Entry *entry); - void removeDocument(int idx); - - int indexOfFilePath(const Utils::FileName &filePath) const; - int indexOfDocument(IDocument *document) const; - - bool disambiguateDisplayNames(DocumentModel::Entry *entry); - - static QIcon lockedIcon(); - -private: - friend class DocumentModel; - void itemChanged(); - - class DynamicEntry - { - public: - DocumentModel::Entry *entry; - int pathComponents; - - DynamicEntry(DocumentModel::Entry *e) : - entry(e), - pathComponents(0) - { - } - DocumentModel::Entry *operator->() const { return entry; } +static Core::Internal::DocumentModelPrivate *d; - void disambiguate() - { - entry->document->setUniqueDisplayName(entry->fileName().fileName(++pathComponents)); - } - - void setNumberedName(int number) - { - entry->document->setUniqueDisplayName(QStringLiteral("%1 (%2)") - .arg(entry->document->displayName()) - .arg(number)); - } - }; - - QList<DocumentModel::Entry *> m_entries; - QMap<IDocument *, QList<IEditor *> > m_editors; - QHash<QString, DocumentModel::Entry *> m_entryByFixedPath; -}; +namespace Core { +namespace Internal { DocumentModelPrivate::~DocumentModelPrivate() { qDeleteAll(m_entries); } -static DocumentModelPrivate *d; - -DocumentModel::Entry::Entry() : - document(0), - isSuspended(false) -{ -} - -DocumentModel::Entry::~Entry() -{ - if (isSuspended) - delete document; -} - -DocumentModel::DocumentModel() -{ -} - -void DocumentModel::init() -{ - d = new DocumentModelPrivate; -} - -void DocumentModel::destroy() -{ - delete d; -} - -QIcon DocumentModel::lockedIcon() -{ - return DocumentModelPrivate::lockedIcon(); -} - -QAbstractItemModel *DocumentModel::model() -{ - return d; -} - -Utils::FileName DocumentModel::Entry::fileName() const -{ - return document->filePath(); -} - -QString DocumentModel::Entry::displayName() const -{ - return document->displayName(); -} - -QString DocumentModel::Entry::plainDisplayName() const -{ - return document->plainDisplayName(); -} - -Id DocumentModel::Entry::id() const -{ - return document->id(); -} - int DocumentModelPrivate::columnCount(const QModelIndex &parent) const { if (!parent.isValid()) @@ -184,39 +68,6 @@ int DocumentModelPrivate::rowCount(const QModelIndex &parent) const return 0; } -void DocumentModel::addEditor(IEditor *editor, bool *isNewDocument) -{ - if (!editor) - return; - - QList<IEditor *> &editorList = d->m_editors[editor->document()]; - bool isNew = editorList.isEmpty(); - if (isNewDocument) - *isNewDocument = isNew; - editorList << editor; - if (isNew) { - Entry *entry = new Entry; - entry->document = editor->document(); - d->addEntry(entry); - } -} - -void DocumentModel::addSuspendedDocument(const QString &fileName, const QString &displayName, Id id) -{ - Entry *entry = new Entry; - entry->document = new IDocument; - entry->document->setFilePath(Utils::FileName::fromString(fileName)); - entry->document->setPreferredDisplayName(displayName); - entry->document->setId(id); - entry->isSuspended = true; - d->addEntry(entry); -} - -DocumentModel::Entry *DocumentModel::firstSuspendedEntry() -{ - return Utils::findOrDefault(d->m_entries, [](Entry *entry) { return entry->isSuspended; }); -} - void DocumentModelPrivate::addEntry(DocumentModel::Entry *entry) { const Utils::FileName fileName = entry->fileName(); @@ -247,7 +98,7 @@ void DocumentModelPrivate::addEntry(DocumentModel::Entry *entry) int cmp = displayName.localeAwareCompare(m_entries.at(index)->plainDisplayName()); if (cmp < 0) break; - if (cmp == 0 && fileName < d->m_entries.at(index)->fileName()) + if (cmp == 0 && fileName < m_entries.at(index)->fileName()) break; } int row = index + 1/*<no document>*/; @@ -338,15 +189,173 @@ int DocumentModelPrivate::indexOfFilePath(const Utils::FileName &filePath) const return m_entries.indexOf(m_entryByFixedPath.value(fixedPath)); } -void DocumentModel::removeEntry(DocumentModel::Entry *entry) +void DocumentModelPrivate::removeDocument(int idx) { - // For non suspended entries, we wouldn't know what to do with the associated editors - QTC_ASSERT(entry->isSuspended, return); - int index = d->m_entries.indexOf(entry); - d->removeDocument(index); + if (idx < 0) + return; + QTC_ASSERT(idx < m_entries.size(), return); + int row = idx + 1/*<no document>*/; + beginRemoveRows(QModelIndex(), row, row); + DocumentModel::Entry *entry = m_entries.takeAt(idx); + endRemoveRows(); + + const QString fileName = entry->fileName().toString(); + if (!fileName.isEmpty()) { + const QString fixedPath = DocumentManager::fixFileName(fileName, + DocumentManager::ResolveLinks); + m_entryByFixedPath.remove(fixedPath); + } + disconnect(entry->document, &IDocument::changed, this, &DocumentModelPrivate::itemChanged); + disambiguateDisplayNames(entry); + delete entry; +} + +int DocumentModelPrivate::indexOfDocument(IDocument *document) const +{ + return Utils::indexOf(m_entries, [&document](DocumentModel::Entry *entry) { + return entry->document == document; + }); +} + +Qt::ItemFlags DocumentModelPrivate::flags(const QModelIndex &index) const +{ + const DocumentModel::Entry *e = DocumentModel::entryAtRow(index.row()); + if (!e || e->fileName().isEmpty()) + return Qt::ItemIsEnabled | Qt::ItemIsSelectable; + return Qt::ItemIsDragEnabled | Qt::ItemIsEnabled | Qt::ItemIsSelectable; +} + +QMimeData *DocumentModelPrivate::mimeData(const QModelIndexList &indexes) const +{ + auto data = new Utils::DropMimeData; + foreach (const QModelIndex &index, indexes) { + const DocumentModel::Entry *e = DocumentModel::entryAtRow(index.row()); + if (!e || e->fileName().isEmpty()) + continue; + data->addFile(e->fileName().toString()); + } + return data; +} + +QModelIndex DocumentModelPrivate::index(int row, int column, const QModelIndex &parent) const +{ + Q_UNUSED(parent) + if (column < 0 || column > 1 || row < 0 || row >= m_entries.count() + 1/*<no document>*/) + return QModelIndex(); + return createIndex(row, column); +} + +Qt::DropActions DocumentModelPrivate::supportedDragActions() const +{ + return Qt::MoveAction; +} + +QStringList DocumentModelPrivate::mimeTypes() const +{ + return Utils::DropSupport::mimeTypesForFilePaths(); +} + +QVariant DocumentModelPrivate::data(const QModelIndex &index, int role) const +{ + if (!index.isValid() || (index.column() != 0 && role < Qt::UserRole)) + return QVariant(); + const DocumentModel::Entry *entry = DocumentModel::entryAtRow(index.row()); + if (!entry) { + // <no document> entry + switch (role) { + case Qt::DisplayRole: + return tr("<no document>"); + case Qt::ToolTipRole: + return tr("No document is selected."); + default: + return QVariant(); + } + } + switch (role) { + case Qt::DisplayRole: { + QString name = entry->displayName(); + if (entry->document->isModified()) + name += QLatin1Char('*'); + return name; + } + case Qt::DecorationRole: + return entry->document->isFileReadOnly() ? lockedIcon() : QIcon(); + case Qt::ToolTipRole: + return entry->fileName().isEmpty() ? entry->displayName() : entry->fileName().toUserOutput(); + default: + return QVariant(); + } + return QVariant(); } -void DocumentModel::removeEditor(IEditor *editor, bool *lastOneForDocument) +void DocumentModelPrivate::itemChanged() +{ + IDocument *document = qobject_cast<IDocument *>(sender()); + + int idx = indexOfDocument(document); + if (idx < 0) + return; + const QString fileName = document->filePath().toString(); + QString fixedPath; + if (!fileName.isEmpty()) + fixedPath = DocumentManager::fixFileName(fileName, DocumentManager::ResolveLinks); + DocumentModel::Entry *entry = m_entries.at(idx); + bool found = false; + // The entry's fileName might have changed, so find the previous fileName that was associated + // with it and remove it, then add the new fileName. + for (auto it = m_entryByFixedPath.begin(), end = m_entryByFixedPath.end(); it != end; ++it) { + if (it.value() == entry) { + found = true; + if (it.key() != fixedPath) { + m_entryByFixedPath.remove(it.key()); + if (!fixedPath.isEmpty()) + m_entryByFixedPath[fixedPath] = entry; + } + break; + } + } + if (!found && !fixedPath.isEmpty()) + m_entryByFixedPath[fixedPath] = entry; + if (!disambiguateDisplayNames(m_entries.at(idx))) { + QModelIndex mindex = index(idx + 1/*<no document>*/, 0); + emit dataChanged(mindex, mindex); + } +} + +void DocumentModelPrivate::addEditor(IEditor *editor, bool *isNewDocument) +{ + if (!editor) + return; + + QList<IEditor *> &editorList = d->m_editors[editor->document()]; + bool isNew = editorList.isEmpty(); + if (isNewDocument) + *isNewDocument = isNew; + editorList << editor; + if (isNew) { + auto entry = new DocumentModel::Entry; + entry->document = editor->document(); + d->addEntry(entry); + } +} + +void DocumentModelPrivate::addSuspendedDocument(const QString &fileName, const QString &displayName, Id id) +{ + auto entry = new DocumentModel::Entry; + entry->document = new IDocument; + entry->document->setFilePath(Utils::FileName::fromString(fileName)); + entry->document->setPreferredDisplayName(displayName); + entry->document->setId(id); + entry->isSuspended = true; + d->addEntry(entry); +} + +DocumentModel::Entry *DocumentModelPrivate::firstSuspendedEntry() +{ + return Utils::findOrDefault(d->m_entries, [](DocumentModel::Entry *entry) { return entry->isSuspended; }); +} + +void DocumentModelPrivate::removeEditor(IEditor *editor, bool *lastOneForDocument) { if (lastOneForDocument) *lastOneForDocument = false; @@ -358,32 +367,19 @@ void DocumentModel::removeEditor(IEditor *editor, bool *lastOneForDocument) if (lastOneForDocument) *lastOneForDocument = true; d->m_editors.remove(document); - d->removeDocument(indexOfDocument(document)); + d->removeDocument(DocumentModel::indexOfDocument(document)); } } -void DocumentModelPrivate::removeDocument(int idx) +void DocumentModelPrivate::removeEntry(DocumentModel::Entry *entry) { - if (idx < 0) - return; - QTC_ASSERT(idx < d->m_entries.size(), return); - int row = idx + 1/*<no document>*/; - beginRemoveRows(QModelIndex(), row, row); - DocumentModel::Entry *entry = d->m_entries.takeAt(idx); - endRemoveRows(); - - const QString fileName = entry->fileName().toString(); - if (!fileName.isEmpty()) { - const QString fixedPath = DocumentManager::fixFileName(fileName, - DocumentManager::ResolveLinks); - m_entryByFixedPath.remove(fixedPath); - } - disconnect(entry->document, &IDocument::changed, this, &DocumentModelPrivate::itemChanged); - disambiguateDisplayNames(entry); - delete entry; + // For non suspended entries, we wouldn't know what to do with the associated editors + QTC_ASSERT(entry->isSuspended, return); + int index = d->m_entries.indexOf(entry); + d->removeDocument(index); } -void DocumentModel::removeAllSuspendedEntries() +void DocumentModelPrivate::removeAllSuspendedEntries() { for (int i = d->m_entries.count()-1; i >= 0; --i) { if (d->m_entries.at(i)->isSuspended) { @@ -403,6 +399,87 @@ void DocumentModel::removeAllSuspendedEntries() } } +DocumentModelPrivate::DynamicEntry::DynamicEntry(DocumentModel::Entry *e) : + entry(e), + pathComponents(0) +{ +} + +DocumentModel::Entry *DocumentModelPrivate::DynamicEntry::operator->() const +{ + return entry; +} + +void DocumentModelPrivate::DynamicEntry::disambiguate() +{ + entry->document->setUniqueDisplayName(entry->fileName().fileName(++pathComponents)); +} + +void DocumentModelPrivate::DynamicEntry::setNumberedName(int number) +{ + entry->document->setUniqueDisplayName(QStringLiteral("%1 (%2)") + .arg(entry->document->displayName()) + .arg(number)); +} + +} // Internal + +DocumentModel::Entry::Entry() : + document(0), + isSuspended(false) +{ +} + +DocumentModel::Entry::~Entry() +{ + if (isSuspended) + delete document; +} + +DocumentModel::DocumentModel() +{ +} + +void DocumentModel::init() +{ + d = new Internal::DocumentModelPrivate; +} + +void DocumentModel::destroy() +{ + delete d; +} + +QIcon DocumentModel::lockedIcon() +{ + return Internal::DocumentModelPrivate::lockedIcon(); +} + +QAbstractItemModel *DocumentModel::model() +{ + return d; +} + +Utils::FileName DocumentModel::Entry::fileName() const +{ + return document->filePath(); +} + +QString DocumentModel::Entry::displayName() const +{ + return document->displayName(); +} + +QString DocumentModel::Entry::plainDisplayName() const +{ + return document->plainDisplayName(); +} + +Id DocumentModel::Entry::id() const +{ + return document->id(); +} + QList<IEditor *> DocumentModel::editorsForDocument(IDocument *document) { return d->m_editors.value(document); @@ -426,13 +503,6 @@ int DocumentModel::indexOfDocument(IDocument *document) return d->indexOfDocument(document); } -int DocumentModelPrivate::indexOfDocument(IDocument *document) const -{ - return Utils::indexOf(m_entries, [&document](DocumentModel::Entry *entry) { - return entry->document == document; - }); -} - DocumentModel::Entry *DocumentModel::entryForDocument(IDocument *document) { return Utils::findOrDefault(d->m_entries, @@ -468,24 +538,6 @@ QList<IEditor *> DocumentModel::editorsForFilePath(const QString &filePath) return QList<IEditor *>(); } -QModelIndex DocumentModelPrivate::index(int row, int column, const QModelIndex &parent) const -{ - Q_UNUSED(parent) - if (column < 0 || column > 1 || row < 0 || row >= m_entries.count() + 1/*<no document>*/) - return QModelIndex(); - return createIndex(row, column); -} - -Qt::DropActions DocumentModelPrivate::supportedDragActions() const -{ - return Qt::MoveAction; -} - -QStringList DocumentModelPrivate::mimeTypes() const -{ - return Utils::DropSupport::mimeTypesForFilePaths(); -} - DocumentModel::Entry *DocumentModel::entryAtRow(int row) { int entryIndex = row - 1/*<no document>*/; @@ -499,59 +551,6 @@ int DocumentModel::entryCount() return d->m_entries.count(); } -QVariant DocumentModelPrivate::data(const QModelIndex &index, int role) const -{ - if (!index.isValid() || (index.column() != 0 && role < Qt::UserRole)) - return QVariant(); - const DocumentModel::Entry *entry = DocumentModel::entryAtRow(index.row()); - if (!entry) { - // <no document> entry - switch (role) { - case Qt::DisplayRole: - return tr("<no document>"); - case Qt::ToolTipRole: - return tr("No document is selected."); - default: - return QVariant(); - } - } - switch (role) { - case Qt::DisplayRole: { - QString name = entry->displayName(); - if (entry->document->isModified()) - name += QLatin1Char('*'); - return name; - } - case Qt::DecorationRole: - return entry->document->isFileReadOnly() ? lockedIcon() : QIcon(); - case Qt::ToolTipRole: - return entry->fileName().isEmpty() ? entry->displayName() : entry->fileName().toUserOutput(); - default: - return QVariant(); - } - return QVariant(); -} - -Qt::ItemFlags DocumentModelPrivate::flags(const QModelIndex &index) const -{ - const DocumentModel::Entry *e = DocumentModel::entryAtRow(index.row()); - if (!e || e->fileName().isEmpty()) - return Qt::ItemIsEnabled | Qt::ItemIsSelectable; - return Qt::ItemIsDragEnabled | Qt::ItemIsEnabled | Qt::ItemIsSelectable; -} - -QMimeData *DocumentModelPrivate::mimeData(const QModelIndexList &indexes) const -{ - auto data = new Utils::DropMimeData; - foreach (const QModelIndex &index, indexes) { - const DocumentModel::Entry *e = DocumentModel::entryAtRow(index.row()); - if (!e || e->fileName().isEmpty()) - continue; - data->addFile(e->fileName().toString()); - } - return data; -} - int DocumentModel::rowOfDocument(IDocument *document) { if (!document) @@ -559,45 +558,9 @@ int DocumentModel::rowOfDocument(IDocument *document) return indexOfDocument(document) + 1/*<no document>*/; } -void DocumentModelPrivate::itemChanged() -{ - IDocument *document = qobject_cast<IDocument *>(sender()); - - int idx = indexOfDocument(document); - if (idx < 0) - return; - const QString fileName = document->filePath().toString(); - QString fixedPath; - if (!fileName.isEmpty()) - fixedPath = DocumentManager::fixFileName(fileName, DocumentManager::ResolveLinks); - DocumentModel::Entry *entry = d->m_entries.at(idx); - bool found = false; - // The entry's fileName might have changed, so find the previous fileName that was associated - // with it and remove it, then add the new fileName. - for (auto it = m_entryByFixedPath.begin(), end = m_entryByFixedPath.end(); it != end; ++it) { - if (it.value() == entry) { - found = true; - if (it.key() != fixedPath) { - m_entryByFixedPath.remove(it.key()); - if (!fixedPath.isEmpty()) - m_entryByFixedPath[fixedPath] = entry; - } - break; - } - } - if (!found && !fixedPath.isEmpty()) - m_entryByFixedPath[fixedPath] = entry; - if (!disambiguateDisplayNames(d->m_entries.at(idx))) { - QModelIndex mindex = index(idx + 1/*<no document>*/, 0); - emit dataChanged(mindex, mindex); - } -} - QList<DocumentModel::Entry *> DocumentModel::entries() { return d->m_entries; } } // namespace Core - -#include "documentmodel.moc" diff --git a/src/plugins/coreplugin/editormanager/documentmodel.h b/src/plugins/coreplugin/editormanager/documentmodel.h index 2dcbe4c698..e0b14ed3aa 100644 --- a/src/plugins/coreplugin/editormanager/documentmodel.h +++ b/src/plugins/coreplugin/editormanager/documentmodel.h @@ -78,14 +78,6 @@ public: static QList<IEditor *> editorsForDocuments(const QList<IDocument *> &entries); static QList<IEditor *> editorsForOpenedDocuments(); - // editor manager related functions, nobody else should call it - static void addEditor(IEditor *editor, bool *isNewDocument); - static void addSuspendedDocument(const QString &fileName, const QString &displayName, Id id); - static Entry *firstSuspendedEntry(); - static void removeEditor(IEditor *editor, bool *lastOneForDocument); - static void removeEntry(Entry *entry); - static void removeAllSuspendedEntries(); - private: DocumentModel(); }; diff --git a/src/plugins/coreplugin/editormanager/documentmodel_p.h b/src/plugins/coreplugin/editormanager/documentmodel_p.h new file mode 100644 index 0000000000..9abed04fad --- /dev/null +++ b/src/plugins/coreplugin/editormanager/documentmodel_p.h @@ -0,0 +1,94 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#pragma once + +#include "documentmodel.h" +#include "ieditor.h" + +#include <QAbstractItemModel> +#include <QHash> +#include <QIcon> +#include <QList> +#include <QMap> + +namespace Core { +namespace Internal { + +class DocumentModelPrivate : public QAbstractItemModel +{ + Q_OBJECT + +public: + ~DocumentModelPrivate(); + + int columnCount(const QModelIndex &parent = QModelIndex()) const override; + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; + Qt::ItemFlags flags(const QModelIndex &index) const override; + QMimeData *mimeData(const QModelIndexList &indexes) const override; + QModelIndex parent(const QModelIndex &/*index*/) const override { return QModelIndex(); } + int rowCount(const QModelIndex &parent = QModelIndex()) const override; + QModelIndex index(int row, int column = 0, const QModelIndex &parent = QModelIndex()) const override; + + Qt::DropActions supportedDragActions() const override; + QStringList mimeTypes() const override; + + void addEntry(DocumentModel::Entry *entry); + void removeDocument(int idx); + + int indexOfFilePath(const Utils::FileName &filePath) const; + int indexOfDocument(IDocument *document) const; + + bool disambiguateDisplayNames(DocumentModel::Entry *entry); + + static QIcon lockedIcon(); + static void addEditor(IEditor *editor, bool *isNewDocument); + static void addSuspendedDocument(const QString &fileName, const QString &displayName, Id id); + static DocumentModel::Entry *firstSuspendedEntry(); + static void removeEditor(IEditor *editor, bool *lastOneForDocument); + static void removeEntry(DocumentModel::Entry *entry); + static void removeAllSuspendedEntries(); + + void itemChanged(); + + class DynamicEntry + { + public: + DocumentModel::Entry *entry; + int pathComponents; + + DynamicEntry(DocumentModel::Entry *e); + DocumentModel::Entry *operator->() const; + void disambiguate(); + void setNumberedName(int number); + }; + + QList<DocumentModel::Entry *> m_entries; + QMap<IDocument *, QList<IEditor *> > m_editors; + QHash<QString, DocumentModel::Entry *> m_entryByFixedPath; +}; + +} // Internal +} // Core diff --git a/src/plugins/coreplugin/editormanager/editormanager.cpp b/src/plugins/coreplugin/editormanager/editormanager.cpp index 8719936d2f..2ee878bd34 100644 --- a/src/plugins/coreplugin/editormanager/editormanager.cpp +++ b/src/plugins/coreplugin/editormanager/editormanager.cpp @@ -31,6 +31,7 @@ #include "openeditorswindow.h" #include "openeditorsview.h" #include "documentmodel.h" +#include "documentmodel_p.h" #include "ieditor.h" #include <coreplugin/actionmanager/actioncontainer.h> @@ -1130,7 +1131,7 @@ void EditorManagerPrivate::addEditor(IEditor *editor) ICore::addContextObject(editor); bool isNewDocument = false; - DocumentModel::addEditor(editor, &isNewDocument); + DocumentModelPrivate::addEditor(editor, &isNewDocument); if (isNewDocument) { const bool isTemporary = editor->document()->isTemporary(); const bool addWatcher = !isTemporary; @@ -1145,7 +1146,7 @@ void EditorManagerPrivate::addEditor(IEditor *editor) void EditorManagerPrivate::removeEditor(IEditor *editor) { bool lastOneForDocument = false; - DocumentModel::removeEditor(editor, &lastOneForDocument); + DocumentModelPrivate::removeEditor(editor, &lastOneForDocument); if (lastOneForDocument) DocumentManager::removeDocument(editor->document()); ICore::removeContextObject(editor); @@ -1252,7 +1253,7 @@ bool EditorManagerPrivate::activateEditorForEntry(EditorView *view, DocumentMode } if (!openEditor(view, entry->fileName().toString(), entry->id(), flags)) { - DocumentModel::removeEntry(entry); + DocumentModelPrivate::removeEntry(entry); return false; } return true; @@ -1975,7 +1976,7 @@ bool EditorManagerPrivate::saveDocumentAs(IDocument *document) void EditorManagerPrivate::closeAllEditorsExceptVisible() { - DocumentModel::removeAllSuspendedEntries(); + DocumentModelPrivate::removeAllSuspendedEntries(); QList<IDocument *> documentsToClose = DocumentModel::openedDocuments(); foreach (IEditor *editor, EditorManager::visibleEditors()) documentsToClose.removeAll(editor->document()); @@ -2118,7 +2119,7 @@ IEditor *EditorManager::currentEditor() bool EditorManager::closeAllEditors(bool askAboutModifiedEditors) { - DocumentModel::removeAllSuspendedEntries(); + DocumentModelPrivate::removeAllSuspendedEntries(); if (closeDocuments(DocumentModel::openedDocuments(), askAboutModifiedEditors)) return true; return false; @@ -2126,7 +2127,7 @@ bool EditorManager::closeAllEditors(bool askAboutModifiedEditors) void EditorManager::closeOtherDocuments(IDocument *document) { - DocumentModel::removeAllSuspendedEntries(); + DocumentModelPrivate::removeAllSuspendedEntries(); QList<IDocument *> documentsToClose = DocumentModel::openedDocuments(); documentsToClose.removeAll(document); closeDocuments(documentsToClose, true); @@ -2310,7 +2311,7 @@ void EditorManager::closeDocument(DocumentModel::Entry *entry) if (!entry) return; if (entry->isSuspended) - DocumentModel::removeEntry(entry); + DocumentModelPrivate::removeEntry(entry); else closeDocuments(QList<IDocument *>() << entry->document); } @@ -2421,7 +2422,7 @@ bool EditorManager::closeEditors(const QList<IEditor*> &editorsToClose, bool ask if (newCurrent) { EditorManagerPrivate::activateEditor(view, newCurrent, DoNotChangeCurrentEditor); } else if (forceViewToShowEditor == view) { - DocumentModel::Entry *entry = DocumentModel::firstSuspendedEntry(); + DocumentModel::Entry *entry = DocumentModelPrivate::firstSuspendedEntry(); if (entry) { EditorManagerPrivate::activateEditorForEntry(view, entry, DoNotChangeCurrentEditor); } else { // no "suspended" ones, so any entry left should have a document @@ -2886,7 +2887,7 @@ bool EditorManager::restoreState(const QByteArray &state) if (rfi.exists() && fi.lastModified() < rfi.lastModified()) openEditor(fileName, id, DoNotMakeVisible); else - DocumentModel::addSuspendedDocument(fileName, displayName, id); + DocumentModelPrivate::addSuspendedDocument(fileName, displayName, id); } } diff --git a/src/plugins/coreplugin/editormanager/editorview.cpp b/src/plugins/coreplugin/editormanager/editorview.cpp index 857d95404f..2129740d19 100644 --- a/src/plugins/coreplugin/editormanager/editorview.cpp +++ b/src/plugins/coreplugin/editormanager/editorview.cpp @@ -28,6 +28,7 @@ #include "editormanager.h" #include "editormanager_p.h" #include "documentmodel.h" +#include "documentmodel_p.h" #include <coreplugin/actionmanager/actionmanager.h> #include <coreplugin/editortoolbar.h> @@ -920,7 +921,7 @@ void SplitterOrView::restoreState(const QByteArray &state) | EditorManager::DoNotChangeCurrentEditor); if (!e) { - DocumentModel::Entry *entry = DocumentModel::firstSuspendedEntry(); + DocumentModel::Entry *entry = DocumentModelPrivate::firstSuspendedEntry(); if (entry) { EditorManagerPrivate::activateEditorForEntry(view(), entry, EditorManager::IgnoreNavigationHistory | EditorManager::DoNotChangeCurrentEditor); |