summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Schulz <david.schulz@qt.io>2017-12-07 10:44:42 +0100
committerDavid Schulz <david.schulz@qt.io>2017-12-12 10:08:04 +0000
commit2d3829ffcc2ba760d64f996050e57275a84adaad (patch)
tree53b0c6d6b797995546be7c30e6f0f0687eb51688
parent469edcdde3fc5fca68dbc0b40f29778e9856784a (diff)
downloadqt-creator-2d3829ffcc2ba760d64f996050e57275a84adaad.tar.gz
BookMarks: restructure bookmark map
compare file names case insensitive on windows Task-number: QTCREATORBUG-19418 Change-Id: I4925a7b33f35ce18e906990ffc104b22ea6d73dc Reviewed-by: Eike Ziller <eike.ziller@qt.io>
-rw-r--r--src/plugins/bookmarks/bookmarkmanager.cpp103
-rw-r--r--src/plugins/bookmarks/bookmarkmanager.h16
-rw-r--r--src/plugins/bookmarks/bookmarksplugin.cpp6
-rw-r--r--src/plugins/bookmarks/bookmarksplugin.h3
4 files changed, 32 insertions, 96 deletions
diff --git a/src/plugins/bookmarks/bookmarkmanager.cpp b/src/plugins/bookmarks/bookmarkmanager.cpp
index d8ebe2deea..028c146234 100644
--- a/src/plugins/bookmarks/bookmarkmanager.cpp
+++ b/src/plugins/bookmarks/bookmarkmanager.cpp
@@ -37,6 +37,7 @@
#include <projectexplorer/projectexplorer.h>
#include <projectexplorer/session.h>
#include <texteditor/texteditor.h>
+#include <utils/algorithm.h>
#include <utils/icon.h>
#include <utils/qtcassert.h>
#include <utils/checkablemessagebox.h>
@@ -333,13 +334,7 @@ BookmarkManager::BookmarkManager() :
BookmarkManager::~BookmarkManager()
{
- DirectoryFileBookmarksMap::iterator it, end;
- end = m_bookmarksMap.end();
- for (it = m_bookmarksMap.begin(); it != end; ++it) {
- FileNameBookmarksMap *bookmarks = it.value();
- qDeleteAll(*bookmarks);
- delete bookmarks;
- }
+ qDeleteAll(m_bookmarksList);
}
QItemSelectionModel *BookmarkManager::selectionModel() const
@@ -347,7 +342,7 @@ QItemSelectionModel *BookmarkManager::selectionModel() const
return m_selectionModel;
}
-bool BookmarkManager::hasBookmarkInPosition(const QString &fileName, int lineNumber)
+bool BookmarkManager::hasBookmarkInPosition(const Utils::FileName &fileName, int lineNumber)
{
return findBookmark(fileName, lineNumber);
}
@@ -430,7 +425,7 @@ QMimeData *BookmarkManager::mimeData(const QModelIndexList &indexes) const
return data;
}
-void BookmarkManager::toggleBookmark(const QString &fileName, int lineNumber)
+void BookmarkManager::toggleBookmark(const FileName &fileName, int lineNumber)
{
if (lineNumber <= 0 || fileName.isEmpty())
return;
@@ -444,7 +439,7 @@ void BookmarkManager::toggleBookmark(const QString &fileName, int lineNumber)
// Add a new bookmark if no bookmark existed on this line
Bookmark *mark = new Bookmark(lineNumber, this);
- mark->updateFileName(fileName);
+ mark->updateFileName(fileName.toString());
addBookmark(mark);
}
@@ -463,9 +458,8 @@ void BookmarkManager::updateBookmarkFileName(Bookmark *bookmark, const QString &
if (oldFileName == bookmark->fileName())
return;
- if (removeBookmarkFromMap(bookmark, oldFileName))
- addBookmarkToMap(bookmark);
-
+ m_bookmarksMap[Utils::FileName::fromString(oldFileName)].removeAll(bookmark);
+ m_bookmarksMap[Utils::FileName::fromString(bookmark->fileName())].append(bookmark);
updateBookmark(bookmark);
}
@@ -475,51 +469,18 @@ void BookmarkManager::removeAllBookmarks()
return;
beginRemoveRows(QModelIndex(), 0, m_bookmarksList.size() - 1);
- DirectoryFileBookmarksMap::const_iterator it, end;
- end = m_bookmarksMap.constEnd();
- for (it = m_bookmarksMap.constBegin(); it != end; ++it) {
- FileNameBookmarksMap *files = it.value();
- FileNameBookmarksMap::const_iterator jt, jend;
- jend = files->constEnd();
- for (jt = files->constBegin(); jt != jend; ++jt) {
- delete jt.value();
- }
- files->clear();
- delete files;
- }
+ qDeleteAll(m_bookmarksList);
m_bookmarksMap.clear();
m_bookmarksList.clear();
endRemoveRows();
}
-bool BookmarkManager::removeBookmarkFromMap(Bookmark *bookmark, const QString &fileName)
-{
- bool found = false;
- const QFileInfo fi(fileName.isEmpty() ? bookmark->fileName() : fileName);
- if (FileNameBookmarksMap *files = m_bookmarksMap.value(fi.path())) {
- FileNameBookmarksMap::iterator i = files->begin();
- while (i != files->end()) {
- if (i.value() == bookmark) {
- files->erase(i);
- found = true;
- break;
- }
- ++i;
- }
- if (files->count() <= 0) {
- m_bookmarksMap.remove(fi.path());
- delete files;
- }
- }
- return found;
-}
-
void BookmarkManager::deleteBookmark(Bookmark *bookmark)
{
int idx = m_bookmarksList.indexOf(bookmark);
beginRemoveRows(QModelIndex(), idx, idx);
- removeBookmarkFromMap(bookmark);
+ m_bookmarksMap[Utils::FileName::fromString(bookmark->fileName())].removeAll(bookmark);
delete bookmark;
m_bookmarksList.removeAt(idx);
@@ -563,15 +524,15 @@ void BookmarkManager::documentPrevNext(bool next)
if (editorLine <= 0)
return;
- const QFileInfo fi = editor->document()->filePath().toFileInfo();
- if (!m_bookmarksMap.contains(fi.path()))
+ const FileName filePath = editor->document()->filePath();
+ if (!m_bookmarksMap.contains(filePath))
return;
int firstLine = -1;
int lastLine = -1;
int prevLine = -1;
int nextLine = -1;
- const QList<Bookmark *> marks = m_bookmarksMap.value(fi.path())->values(fi.fileName());
+ const QVector<Bookmark *> marks = m_bookmarksMap[filePath];
for (int i = 0; i < marks.count(); ++i) {
int markLine = marks.at(i)->lineNumber();
if (firstLine == -1 || firstLine > markLine)
@@ -647,20 +608,15 @@ void BookmarkManager::prev()
BookmarkManager::State BookmarkManager::state() const
{
- if (m_bookmarksMap.empty())
+ if (m_bookmarksList.empty())
return NoBookMarks;
IEditor *editor = EditorManager::currentEditor();
if (!editor)
return HasBookMarks;
- const QFileInfo fi = editor->document()->filePath().toFileInfo();
-
- const DirectoryFileBookmarksMap::const_iterator dit = m_bookmarksMap.constFind(fi.path());
- if (dit == m_bookmarksMap.constEnd())
- return HasBookMarks;
-
- return HasBookmarksInDocument;
+ return m_bookmarksMap.value(editor->document()->filePath()).isEmpty() ? HasBookMarks
+ : HasBookmarksInDocument;
}
void BookmarkManager::updateActionStatus()
@@ -714,7 +670,7 @@ void BookmarkManager::moveDown()
saveBookmarks();
}
-void BookmarkManager::editByFileAndLine(const QString &fileName, int lineNumber)
+void BookmarkManager::editByFileAndLine(const FileName &fileName, int lineNumber)
{
Bookmark *b = findBookmark(fileName, lineNumber);
QModelIndex current = selectionModel()->currentIndex();
@@ -753,26 +709,10 @@ void BookmarkManager::edit()
}
/* Returns the bookmark at the given file and line number, or 0 if no such bookmark exists. */
-Bookmark *BookmarkManager::findBookmark(const QString &filePath, int lineNumber)
-{
- QFileInfo fi(filePath);
- QString path = fi.path();
- if (m_bookmarksMap.contains(path)) {
- foreach (Bookmark *bookmark, m_bookmarksMap.value(path)->values(fi.fileName())) {
- if (bookmark->lineNumber() == lineNumber)
- return bookmark;
- }
- }
- return 0;
-}
-
-void BookmarkManager::addBookmarkToMap(Bookmark *bookmark)
+Bookmark *BookmarkManager::findBookmark(const FileName &filePath, int lineNumber)
{
- const QFileInfo fi(bookmark->fileName());
- const QString &path = fi.path();
- if (!m_bookmarksMap.contains(path))
- m_bookmarksMap.insert(path, new FileNameBookmarksMap());
- m_bookmarksMap.value(path)->insert(fi.fileName(), bookmark);
+ return Utils::findOrDefault(m_bookmarksMap.value(filePath),
+ Utils::equal(&Bookmark::lineNumber, lineNumber));
}
/* Adds a bookmark to the internal data structures. The 'userset' parameter
@@ -783,8 +723,7 @@ void BookmarkManager::addBookmark(Bookmark *bookmark, bool userset)
{
beginInsertRows(QModelIndex(), m_bookmarksList.size(), m_bookmarksList.size());
- addBookmarkToMap(bookmark);
-
+ m_bookmarksMap[FileName::fromString(bookmark->fileName())].append(bookmark);
m_bookmarksList.append(bookmark);
endInsertRows();
@@ -809,7 +748,7 @@ void BookmarkManager::addBookmark(const QString &s)
const QString &filePath = s.mid(index1+1, index2-index1-1);
const QString &note = s.mid(index3 + 1);
const int lineNumber = s.midRef(index2 + 1, index3 - index2 - 1).toInt();
- if (!filePath.isEmpty() && !findBookmark(filePath, lineNumber)) {
+ if (!filePath.isEmpty() && !findBookmark(FileName::fromString(filePath), lineNumber)) {
Bookmark *b = new Bookmark(lineNumber, this);
b->updateFileName(filePath);
b->setNote(note);
diff --git a/src/plugins/bookmarks/bookmarkmanager.h b/src/plugins/bookmarks/bookmarkmanager.h
index 320311696e..3689d59d06 100644
--- a/src/plugins/bookmarks/bookmarkmanager.h
+++ b/src/plugins/bookmarks/bookmarkmanager.h
@@ -26,6 +26,7 @@
#pragma once
#include <utils/itemviews.h>
+#include <utils/fileutils.h>
#include <coreplugin/inavigationwidgetfactory.h>
#include <QAbstractItemModel>
@@ -76,7 +77,7 @@ public:
// this QItemSelectionModel is shared by all views
QItemSelectionModel *selectionModel() const;
- bool hasBookmarkInPosition(const QString &fileName, int lineNumber);
+ bool hasBookmarkInPosition(const Utils::FileName &fileName, int lineNumber);
enum Roles {
Filename = Qt::UserRole,
@@ -86,7 +87,7 @@ public:
Note = Qt::UserRole + 4
};
- void toggleBookmark(const QString &fileName, int lineNumber);
+ void toggleBookmark(const Utils::FileName &fileName, int lineNumber);
void nextInDocument();
void prevInDocument();
void next();
@@ -94,7 +95,7 @@ public:
void moveUp();
void moveDown();
void edit();
- void editByFileAndLine(const QString &fileName, int lineNumber);
+ void editByFileAndLine(const Utils::FileName &fileName, int lineNumber);
bool gotoBookmark(Bookmark *bookmark);
signals:
@@ -107,18 +108,13 @@ private:
void documentPrevNext(bool next);
- Bookmark *findBookmark(const QString &filePath, int lineNumber);
+ Bookmark *findBookmark(const Utils::FileName &filePath, int lineNumber);
void addBookmark(Bookmark *bookmark, bool userset = true);
void addBookmark(const QString &s);
- void addBookmarkToMap(Bookmark *bookmark);
- bool removeBookmarkFromMap(Bookmark *bookmark, const QString &fileName = QString());
static QString bookmarkToString(const Bookmark *b);
void saveBookmarks();
- typedef QMultiMap<QString, Bookmark *> FileNameBookmarksMap;
- typedef QMap<QString, FileNameBookmarksMap *> DirectoryFileBookmarksMap;
-
- DirectoryFileBookmarksMap m_bookmarksMap;
+ QMap<Utils::FileName, QVector<Bookmark *>> m_bookmarksMap;
QList<Bookmark *> m_bookmarksList;
QItemSelectionModel *m_selectionModel;
diff --git a/src/plugins/bookmarks/bookmarksplugin.cpp b/src/plugins/bookmarks/bookmarksplugin.cpp
index e1a59296af..f388040ea3 100644
--- a/src/plugins/bookmarks/bookmarksplugin.cpp
+++ b/src/plugins/bookmarks/bookmarksplugin.cpp
@@ -112,7 +112,7 @@ bool BookmarksPlugin::initialize(const QStringList & /*arguments*/, QString *)
connect(m_toggleAction, &QAction::triggered, [this]() {
BaseTextEditor *editor = BaseTextEditor::currentTextEditor();
if (editor && !editor->document()->isTemporary())
- m_bookmarkManager->toggleBookmark(editor->document()->filePath().toString(), editor->currentLine());
+ m_bookmarkManager->toggleBookmark(editor->document()->filePath(), editor->currentLine());
});
connect(m_prevAction, &QAction::triggered, m_bookmarkManager, &BookmarkManager::prev);
@@ -167,7 +167,7 @@ void BookmarksPlugin::editorOpened(IEditor *editor)
connect(widget, &TextEditorWidget::markRequested, m_bookmarkManager,
[this, editor](TextEditorWidget *, int line, TextMarkRequestKind kind) {
if (kind == BookmarkRequest && !editor->document()->isTemporary())
- m_bookmarkManager->toggleBookmark(editor->document()->filePath().toString(), line);
+ m_bookmarkManager->toggleBookmark(editor->document()->filePath(), line);
});
connect(widget, &TextEditorWidget::markContextMenuRequested,
@@ -190,7 +190,7 @@ void BookmarksPlugin::requestContextMenu(TextEditorWidget *widget,
return;
m_bookmarkMarginActionLineNumber = lineNumber;
- m_bookmarkMarginActionFileName = widget->textDocument()->filePath().toString();
+ m_bookmarkMarginActionFileName = widget->textDocument()->filePath();
menu->addAction(m_bookmarkMarginAction);
if (m_bookmarkManager->hasBookmarkInPosition(m_bookmarkMarginActionFileName, m_bookmarkMarginActionLineNumber))
diff --git a/src/plugins/bookmarks/bookmarksplugin.h b/src/plugins/bookmarks/bookmarksplugin.h
index 4cb16b2218..c1a82a8def 100644
--- a/src/plugins/bookmarks/bookmarksplugin.h
+++ b/src/plugins/bookmarks/bookmarksplugin.h
@@ -26,6 +26,7 @@
#pragma once
#include <extensionsystem/iplugin.h>
+#include <utils/fileutils.h>
#include <QObject>
#include <QMultiMap>
@@ -75,7 +76,7 @@ private:
QAction *m_bookmarkMarginAction;
int m_bookmarkMarginActionLineNumber;
- QString m_bookmarkMarginActionFileName;
+ Utils::FileName m_bookmarkMarginActionFileName;
};
} // namespace Internal