summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEike Ziller <eike.ziller@theqtcompany.com>2016-06-01 11:46:27 +0200
committerEike Ziller <eike.ziller@qt.io>2016-06-09 08:00:41 +0000
commit8f83ac351bfb66a21dd085e870f210bcd7f1a9d0 (patch)
tree8d3e33db1aa77fc4db6481805fd588f1e823e477
parent505c9be9af58ad35c62f8fbbce3b7a77017204b3 (diff)
downloadqt-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.pro3
-rw-r--r--src/plugins/coreplugin/coreplugin.qbs2
-rw-r--r--src/plugins/coreplugin/editormanager/documentmodel.cpp553
-rw-r--r--src/plugins/coreplugin/editormanager/documentmodel.h8
-rw-r--r--src/plugins/coreplugin/editormanager/documentmodel_p.h94
-rw-r--r--src/plugins/coreplugin/editormanager/editormanager.cpp19
-rw-r--r--src/plugins/coreplugin/editormanager/editorview.cpp3
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);