forked from qt-creator/qt-creator
DocumentModel: Better separation of private API
Change-Id: Iee534ba5d6edd283add8a1f36fd0e56ab3ee8f41 Reviewed-by: David Schulz <david.schulz@theqtcompany.com>
This commit is contained in:
@@ -217,7 +217,8 @@ HEADERS += corejsextensions.h \
|
|||||||
messagebox.h \
|
messagebox.h \
|
||||||
iwelcomepage.h \
|
iwelcomepage.h \
|
||||||
systemsettings.h \
|
systemsettings.h \
|
||||||
coreicons.h
|
coreicons.h \
|
||||||
|
editormanager/documentmodel_p.h
|
||||||
|
|
||||||
FORMS += dialogs/newdialog.ui \
|
FORMS += dialogs/newdialog.ui \
|
||||||
dialogs/saveitemsdialog.ui \
|
dialogs/saveitemsdialog.ui \
|
||||||
|
@@ -142,7 +142,7 @@ QtcPlugin {
|
|||||||
name: "Editor Manager"
|
name: "Editor Manager"
|
||||||
prefix: "editormanager/"
|
prefix: "editormanager/"
|
||||||
files: [
|
files: [
|
||||||
"documentmodel.cpp", "documentmodel.h",
|
"documentmodel.cpp", "documentmodel.h", "documentmodel_p.h",
|
||||||
"editorarea.cpp", "editorarea.h",
|
"editorarea.cpp", "editorarea.h",
|
||||||
"editormanager.cpp", "editormanager.h", "editormanager_p.h",
|
"editormanager.cpp", "editormanager.h", "editormanager_p.h",
|
||||||
"editorview.cpp", "editorview.h",
|
"editorview.cpp", "editorview.h",
|
||||||
|
@@ -24,6 +24,8 @@
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#include "documentmodel.h"
|
#include "documentmodel.h"
|
||||||
|
#include "documentmodel_p.h"
|
||||||
|
|
||||||
#include "ieditor.h"
|
#include "ieditor.h"
|
||||||
#include <coreplugin/documentmanager.h>
|
#include <coreplugin/documentmanager.h>
|
||||||
#include <coreplugin/idocument.h>
|
#include <coreplugin/idocument.h>
|
||||||
@@ -41,135 +43,17 @@
|
|||||||
#include <QSet>
|
#include <QSet>
|
||||||
#include <QUrl>
|
#include <QUrl>
|
||||||
|
|
||||||
|
|
||||||
|
static Core::Internal::DocumentModelPrivate *d;
|
||||||
|
|
||||||
namespace Core {
|
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();
|
|
||||||
|
|
||||||
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; }
|
|
||||||
|
|
||||||
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;
|
|
||||||
};
|
|
||||||
|
|
||||||
DocumentModelPrivate::~DocumentModelPrivate()
|
DocumentModelPrivate::~DocumentModelPrivate()
|
||||||
{
|
{
|
||||||
qDeleteAll(m_entries);
|
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
|
int DocumentModelPrivate::columnCount(const QModelIndex &parent) const
|
||||||
{
|
{
|
||||||
if (!parent.isValid())
|
if (!parent.isValid())
|
||||||
@@ -184,39 +68,6 @@ int DocumentModelPrivate::rowCount(const QModelIndex &parent) const
|
|||||||
return 0;
|
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)
|
void DocumentModelPrivate::addEntry(DocumentModel::Entry *entry)
|
||||||
{
|
{
|
||||||
const Utils::FileName fileName = entry->fileName();
|
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());
|
int cmp = displayName.localeAwareCompare(m_entries.at(index)->plainDisplayName());
|
||||||
if (cmp < 0)
|
if (cmp < 0)
|
||||||
break;
|
break;
|
||||||
if (cmp == 0 && fileName < d->m_entries.at(index)->fileName())
|
if (cmp == 0 && fileName < m_entries.at(index)->fileName())
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
int row = index + 1/*<no document>*/;
|
int row = index + 1/*<no document>*/;
|
||||||
@@ -338,38 +189,14 @@ int DocumentModelPrivate::indexOfFilePath(const Utils::FileName &filePath) const
|
|||||||
return m_entries.indexOf(m_entryByFixedPath.value(fixedPath));
|
return m_entries.indexOf(m_entryByFixedPath.value(fixedPath));
|
||||||
}
|
}
|
||||||
|
|
||||||
void DocumentModel::removeEntry(DocumentModel::Entry *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::removeEditor(IEditor *editor, bool *lastOneForDocument)
|
|
||||||
{
|
|
||||||
if (lastOneForDocument)
|
|
||||||
*lastOneForDocument = false;
|
|
||||||
QTC_ASSERT(editor, return);
|
|
||||||
IDocument *document = editor->document();
|
|
||||||
QTC_ASSERT(d->m_editors.contains(document), return);
|
|
||||||
d->m_editors[document].removeAll(editor);
|
|
||||||
if (d->m_editors.value(document).isEmpty()) {
|
|
||||||
if (lastOneForDocument)
|
|
||||||
*lastOneForDocument = true;
|
|
||||||
d->m_editors.remove(document);
|
|
||||||
d->removeDocument(indexOfDocument(document));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void DocumentModelPrivate::removeDocument(int idx)
|
void DocumentModelPrivate::removeDocument(int idx)
|
||||||
{
|
{
|
||||||
if (idx < 0)
|
if (idx < 0)
|
||||||
return;
|
return;
|
||||||
QTC_ASSERT(idx < d->m_entries.size(), return);
|
QTC_ASSERT(idx < m_entries.size(), return);
|
||||||
int row = idx + 1/*<no document>*/;
|
int row = idx + 1/*<no document>*/;
|
||||||
beginRemoveRows(QModelIndex(), row, row);
|
beginRemoveRows(QModelIndex(), row, row);
|
||||||
DocumentModel::Entry *entry = d->m_entries.takeAt(idx);
|
DocumentModel::Entry *entry = m_entries.takeAt(idx);
|
||||||
endRemoveRows();
|
endRemoveRows();
|
||||||
|
|
||||||
const QString fileName = entry->fileName().toString();
|
const QString fileName = entry->fileName().toString();
|
||||||
@@ -383,7 +210,176 @@ void DocumentModelPrivate::removeDocument(int idx)
|
|||||||
delete entry;
|
delete entry;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DocumentModel::removeAllSuspendedEntries()
|
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 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;
|
||||||
|
QTC_ASSERT(editor, return);
|
||||||
|
IDocument *document = editor->document();
|
||||||
|
QTC_ASSERT(d->m_editors.contains(document), return);
|
||||||
|
d->m_editors[document].removeAll(editor);
|
||||||
|
if (d->m_editors.value(document).isEmpty()) {
|
||||||
|
if (lastOneForDocument)
|
||||||
|
*lastOneForDocument = true;
|
||||||
|
d->m_editors.remove(document);
|
||||||
|
d->removeDocument(DocumentModel::indexOfDocument(document));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void DocumentModelPrivate::removeEntry(DocumentModel::Entry *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 DocumentModelPrivate::removeAllSuspendedEntries()
|
||||||
{
|
{
|
||||||
for (int i = d->m_entries.count()-1; i >= 0; --i) {
|
for (int i = d->m_entries.count()-1; i >= 0; --i) {
|
||||||
if (d->m_entries.at(i)->isSuspended) {
|
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)
|
QList<IEditor *> DocumentModel::editorsForDocument(IDocument *document)
|
||||||
{
|
{
|
||||||
return d->m_editors.value(document);
|
return d->m_editors.value(document);
|
||||||
@@ -426,13 +503,6 @@ int DocumentModel::indexOfDocument(IDocument *document)
|
|||||||
return d->indexOfDocument(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)
|
DocumentModel::Entry *DocumentModel::entryForDocument(IDocument *document)
|
||||||
{
|
{
|
||||||
return Utils::findOrDefault(d->m_entries,
|
return Utils::findOrDefault(d->m_entries,
|
||||||
@@ -468,24 +538,6 @@ QList<IEditor *> DocumentModel::editorsForFilePath(const QString &filePath)
|
|||||||
return QList<IEditor *>();
|
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)
|
DocumentModel::Entry *DocumentModel::entryAtRow(int row)
|
||||||
{
|
{
|
||||||
int entryIndex = row - 1/*<no document>*/;
|
int entryIndex = row - 1/*<no document>*/;
|
||||||
@@ -499,59 +551,6 @@ int DocumentModel::entryCount()
|
|||||||
return d->m_entries.count();
|
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)
|
int DocumentModel::rowOfDocument(IDocument *document)
|
||||||
{
|
{
|
||||||
if (!document)
|
if (!document)
|
||||||
@@ -559,45 +558,9 @@ int DocumentModel::rowOfDocument(IDocument *document)
|
|||||||
return indexOfDocument(document) + 1/*<no 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()
|
QList<DocumentModel::Entry *> DocumentModel::entries()
|
||||||
{
|
{
|
||||||
return d->m_entries;
|
return d->m_entries;
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace Core
|
} // namespace Core
|
||||||
|
|
||||||
#include "documentmodel.moc"
|
|
||||||
|
@@ -78,14 +78,6 @@ public:
|
|||||||
static QList<IEditor *> editorsForDocuments(const QList<IDocument *> &entries);
|
static QList<IEditor *> editorsForDocuments(const QList<IDocument *> &entries);
|
||||||
static QList<IEditor *> editorsForOpenedDocuments();
|
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:
|
private:
|
||||||
DocumentModel();
|
DocumentModel();
|
||||||
};
|
};
|
||||||
|
94
src/plugins/coreplugin/editormanager/documentmodel_p.h
Normal file
94
src/plugins/coreplugin/editormanager/documentmodel_p.h
Normal file
@@ -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
|
@@ -31,6 +31,7 @@
|
|||||||
#include "openeditorswindow.h"
|
#include "openeditorswindow.h"
|
||||||
#include "openeditorsview.h"
|
#include "openeditorsview.h"
|
||||||
#include "documentmodel.h"
|
#include "documentmodel.h"
|
||||||
|
#include "documentmodel_p.h"
|
||||||
#include "ieditor.h"
|
#include "ieditor.h"
|
||||||
|
|
||||||
#include <coreplugin/actionmanager/actioncontainer.h>
|
#include <coreplugin/actionmanager/actioncontainer.h>
|
||||||
@@ -1130,7 +1131,7 @@ void EditorManagerPrivate::addEditor(IEditor *editor)
|
|||||||
ICore::addContextObject(editor);
|
ICore::addContextObject(editor);
|
||||||
|
|
||||||
bool isNewDocument = false;
|
bool isNewDocument = false;
|
||||||
DocumentModel::addEditor(editor, &isNewDocument);
|
DocumentModelPrivate::addEditor(editor, &isNewDocument);
|
||||||
if (isNewDocument) {
|
if (isNewDocument) {
|
||||||
const bool isTemporary = editor->document()->isTemporary();
|
const bool isTemporary = editor->document()->isTemporary();
|
||||||
const bool addWatcher = !isTemporary;
|
const bool addWatcher = !isTemporary;
|
||||||
@@ -1145,7 +1146,7 @@ void EditorManagerPrivate::addEditor(IEditor *editor)
|
|||||||
void EditorManagerPrivate::removeEditor(IEditor *editor)
|
void EditorManagerPrivate::removeEditor(IEditor *editor)
|
||||||
{
|
{
|
||||||
bool lastOneForDocument = false;
|
bool lastOneForDocument = false;
|
||||||
DocumentModel::removeEditor(editor, &lastOneForDocument);
|
DocumentModelPrivate::removeEditor(editor, &lastOneForDocument);
|
||||||
if (lastOneForDocument)
|
if (lastOneForDocument)
|
||||||
DocumentManager::removeDocument(editor->document());
|
DocumentManager::removeDocument(editor->document());
|
||||||
ICore::removeContextObject(editor);
|
ICore::removeContextObject(editor);
|
||||||
@@ -1252,7 +1253,7 @@ bool EditorManagerPrivate::activateEditorForEntry(EditorView *view, DocumentMode
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!openEditor(view, entry->fileName().toString(), entry->id(), flags)) {
|
if (!openEditor(view, entry->fileName().toString(), entry->id(), flags)) {
|
||||||
DocumentModel::removeEntry(entry);
|
DocumentModelPrivate::removeEntry(entry);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
@@ -1975,7 +1976,7 @@ bool EditorManagerPrivate::saveDocumentAs(IDocument *document)
|
|||||||
|
|
||||||
void EditorManagerPrivate::closeAllEditorsExceptVisible()
|
void EditorManagerPrivate::closeAllEditorsExceptVisible()
|
||||||
{
|
{
|
||||||
DocumentModel::removeAllSuspendedEntries();
|
DocumentModelPrivate::removeAllSuspendedEntries();
|
||||||
QList<IDocument *> documentsToClose = DocumentModel::openedDocuments();
|
QList<IDocument *> documentsToClose = DocumentModel::openedDocuments();
|
||||||
foreach (IEditor *editor, EditorManager::visibleEditors())
|
foreach (IEditor *editor, EditorManager::visibleEditors())
|
||||||
documentsToClose.removeAll(editor->document());
|
documentsToClose.removeAll(editor->document());
|
||||||
@@ -2118,7 +2119,7 @@ IEditor *EditorManager::currentEditor()
|
|||||||
|
|
||||||
bool EditorManager::closeAllEditors(bool askAboutModifiedEditors)
|
bool EditorManager::closeAllEditors(bool askAboutModifiedEditors)
|
||||||
{
|
{
|
||||||
DocumentModel::removeAllSuspendedEntries();
|
DocumentModelPrivate::removeAllSuspendedEntries();
|
||||||
if (closeDocuments(DocumentModel::openedDocuments(), askAboutModifiedEditors))
|
if (closeDocuments(DocumentModel::openedDocuments(), askAboutModifiedEditors))
|
||||||
return true;
|
return true;
|
||||||
return false;
|
return false;
|
||||||
@@ -2126,7 +2127,7 @@ bool EditorManager::closeAllEditors(bool askAboutModifiedEditors)
|
|||||||
|
|
||||||
void EditorManager::closeOtherDocuments(IDocument *document)
|
void EditorManager::closeOtherDocuments(IDocument *document)
|
||||||
{
|
{
|
||||||
DocumentModel::removeAllSuspendedEntries();
|
DocumentModelPrivate::removeAllSuspendedEntries();
|
||||||
QList<IDocument *> documentsToClose = DocumentModel::openedDocuments();
|
QList<IDocument *> documentsToClose = DocumentModel::openedDocuments();
|
||||||
documentsToClose.removeAll(document);
|
documentsToClose.removeAll(document);
|
||||||
closeDocuments(documentsToClose, true);
|
closeDocuments(documentsToClose, true);
|
||||||
@@ -2310,7 +2311,7 @@ void EditorManager::closeDocument(DocumentModel::Entry *entry)
|
|||||||
if (!entry)
|
if (!entry)
|
||||||
return;
|
return;
|
||||||
if (entry->isSuspended)
|
if (entry->isSuspended)
|
||||||
DocumentModel::removeEntry(entry);
|
DocumentModelPrivate::removeEntry(entry);
|
||||||
else
|
else
|
||||||
closeDocuments(QList<IDocument *>() << entry->document);
|
closeDocuments(QList<IDocument *>() << entry->document);
|
||||||
}
|
}
|
||||||
@@ -2421,7 +2422,7 @@ bool EditorManager::closeEditors(const QList<IEditor*> &editorsToClose, bool ask
|
|||||||
if (newCurrent) {
|
if (newCurrent) {
|
||||||
EditorManagerPrivate::activateEditor(view, newCurrent, DoNotChangeCurrentEditor);
|
EditorManagerPrivate::activateEditor(view, newCurrent, DoNotChangeCurrentEditor);
|
||||||
} else if (forceViewToShowEditor == view) {
|
} else if (forceViewToShowEditor == view) {
|
||||||
DocumentModel::Entry *entry = DocumentModel::firstSuspendedEntry();
|
DocumentModel::Entry *entry = DocumentModelPrivate::firstSuspendedEntry();
|
||||||
if (entry) {
|
if (entry) {
|
||||||
EditorManagerPrivate::activateEditorForEntry(view, entry, DoNotChangeCurrentEditor);
|
EditorManagerPrivate::activateEditorForEntry(view, entry, DoNotChangeCurrentEditor);
|
||||||
} else { // no "suspended" ones, so any entry left should have a document
|
} 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())
|
if (rfi.exists() && fi.lastModified() < rfi.lastModified())
|
||||||
openEditor(fileName, id, DoNotMakeVisible);
|
openEditor(fileName, id, DoNotMakeVisible);
|
||||||
else
|
else
|
||||||
DocumentModel::addSuspendedDocument(fileName, displayName, id);
|
DocumentModelPrivate::addSuspendedDocument(fileName, displayName, id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -28,6 +28,7 @@
|
|||||||
#include "editormanager.h"
|
#include "editormanager.h"
|
||||||
#include "editormanager_p.h"
|
#include "editormanager_p.h"
|
||||||
#include "documentmodel.h"
|
#include "documentmodel.h"
|
||||||
|
#include "documentmodel_p.h"
|
||||||
|
|
||||||
#include <coreplugin/actionmanager/actionmanager.h>
|
#include <coreplugin/actionmanager/actionmanager.h>
|
||||||
#include <coreplugin/editortoolbar.h>
|
#include <coreplugin/editortoolbar.h>
|
||||||
@@ -920,7 +921,7 @@ void SplitterOrView::restoreState(const QByteArray &state)
|
|||||||
| EditorManager::DoNotChangeCurrentEditor);
|
| EditorManager::DoNotChangeCurrentEditor);
|
||||||
|
|
||||||
if (!e) {
|
if (!e) {
|
||||||
DocumentModel::Entry *entry = DocumentModel::firstSuspendedEntry();
|
DocumentModel::Entry *entry = DocumentModelPrivate::firstSuspendedEntry();
|
||||||
if (entry) {
|
if (entry) {
|
||||||
EditorManagerPrivate::activateEditorForEntry(view(), entry,
|
EditorManagerPrivate::activateEditorForEntry(view(), entry,
|
||||||
EditorManager::IgnoreNavigationHistory | EditorManager::DoNotChangeCurrentEditor);
|
EditorManager::IgnoreNavigationHistory | EditorManager::DoNotChangeCurrentEditor);
|
||||||
|
Reference in New Issue
Block a user