Added feature for change note for bookmarks.

Task-number: QTCREATORBUG-5572

Change-Id: I12e84928e1c9d2b212991fafa7de99e0ec618d70
Reviewed-by: Daniel Teske <daniel.teske@digia.com>
This commit is contained in:
Vasiliy Sorokin
2012-09-20 11:27:22 +04:00
committed by Daniel Teske
parent f3194ee1ac
commit d47b058c9b
9 changed files with 139 additions and 10 deletions

View File

@@ -78,11 +78,27 @@ void Bookmark::updateFileName(const QString &fileName)
BaseTextMark::updateFileName(fileName); BaseTextMark::updateFileName(fileName);
} }
void Bookmark::setNote(const QString &note)
{
m_note = note;
}
void Bookmark::updateNote(const QString &note)
{
setNote(note);
m_manager->updateBookmark(this);
}
QString Bookmark::lineText() const QString Bookmark::lineText() const
{ {
return m_lineText; return m_lineText;
} }
QString Bookmark::note() const
{
return m_note;
}
QString Bookmark::filePath() const QString Bookmark::filePath() const
{ {
return m_fileName; return m_fileName;

View File

@@ -53,12 +53,15 @@ public:
void updateLineNumber(int lineNumber); void updateLineNumber(int lineNumber);
void updateBlock(const QTextBlock &block); void updateBlock(const QTextBlock &block);
void updateFileName(const QString &fileName); void updateFileName(const QString &fileName);
void setNote(const QString &note);
void updateNote(const QString &note);
void removedFromEditor(); void removedFromEditor();
QString filePath() const; QString filePath() const;
QString fileName() const; QString fileName() const;
QString path() const; QString path() const;
QString lineText() const; QString lineText() const;
QString note() const;
private: private:
BookmarkManager *m_manager; BookmarkManager *m_manager;
@@ -66,6 +69,7 @@ private:
QString m_onlyFile; QString m_onlyFile;
QString m_path; QString m_path;
QString m_lineText; QString m_lineText;
QString m_note;
}; };
} // namespace Internal } // namespace Internal

View File

@@ -34,6 +34,7 @@
#include "bookmarksplugin.h" #include "bookmarksplugin.h"
#include "bookmarks_global.h" #include "bookmarks_global.h"
#include <coreplugin/editormanager/editormanager.h> #include <coreplugin/editormanager/editormanager.h>
#include <coreplugin/icore.h> #include <coreplugin/icore.h>
#include <coreplugin/actionmanager/actionmanager.h> #include <coreplugin/actionmanager/actionmanager.h>
@@ -41,6 +42,8 @@
#include <projectexplorer/projectexplorer.h> #include <projectexplorer/projectexplorer.h>
#include <projectexplorer/session.h> #include <projectexplorer/session.h>
#include <texteditor/basetexteditor.h> #include <texteditor/basetexteditor.h>
#include <texteditor/tooltip/tooltip.h>
#include <texteditor/tooltip/tipcontents.h>
#include <utils/qtcassert.h> #include <utils/qtcassert.h>
#include <QDebug> #include <QDebug>
@@ -51,6 +54,7 @@
#include <QContextMenuEvent> #include <QContextMenuEvent>
#include <QMenu> #include <QMenu>
#include <QPainter> #include <QPainter>
#include <QInputDialog>
Q_DECLARE_METATYPE(Bookmarks::Internal::Bookmark*) Q_DECLARE_METATYPE(Bookmarks::Internal::Bookmark*)
@@ -195,8 +199,10 @@ void BookmarkDelegate::paint(QPainter *painter, const QStyleOptionViewItem &opti
// //
// painter->drawText(3, opt.rect.top() + fm.ascent() + fm.height() + 6, directory); // painter->drawText(3, opt.rect.top() + fm.ascent() + fm.height() + 6, directory);
QString note = index.data(BookmarkManager::Note).toString().trimmed();
QString lineText = index.data(BookmarkManager::LineText).toString().trimmed(); QString lineText = index.data(BookmarkManager::LineText).toString().trimmed();
painter->drawText(6, opt.rect.top() + fm.ascent() + fm.height() + 6, lineText);
painter->drawText(6, opt.rect.top() + fm.ascent() + fm.height() + 6, note.isEmpty() ? lineText : note);
// Separator lines // Separator lines
painter->setPen(QColor::fromRgb(150,150,150)); painter->setPen(QColor::fromRgb(150,150,150));
@@ -234,6 +240,8 @@ void BookmarkView::contextMenuEvent(QContextMenuEvent *event)
QAction *moveDown = menu.addAction(tr("Move Down")); QAction *moveDown = menu.addAction(tr("Move Down"));
QAction *remove = menu.addAction(tr("&Remove")); QAction *remove = menu.addAction(tr("&Remove"));
QAction *removeAll = menu.addAction(tr("Remove All")); QAction *removeAll = menu.addAction(tr("Remove All"));
QAction *editNote = menu.addAction(tr("Edit note"));
m_contextMenuIndex = indexAt(event->pos()); m_contextMenuIndex = indexAt(event->pos());
if (!m_contextMenuIndex.isValid()) { if (!m_contextMenuIndex.isValid()) {
moveUp->setEnabled(false); moveUp->setEnabled(false);
@@ -252,6 +260,8 @@ void BookmarkView::contextMenuEvent(QContextMenuEvent *event)
this, SLOT(removeFromContextMenu())); this, SLOT(removeFromContextMenu()));
connect(removeAll, SIGNAL(triggered()), connect(removeAll, SIGNAL(triggered()),
this, SLOT(removeAll())); this, SLOT(removeAll()));
connect(editNote, SIGNAL(triggered()),
m_manager, SLOT(editNote()));
menu.exec(mapToGlobal(event->pos())); menu.exec(mapToGlobal(event->pos()));
} }
@@ -339,6 +349,12 @@ QItemSelectionModel *BookmarkManager::selectionModel() const
return m_selectionModel; return m_selectionModel;
} }
bool BookmarkManager::hasBookmarkInPosition(const QString &fileName, int lineNumber)
{
QFileInfo fi(fileName);
return findBookmark(fi.path(), fi.fileName(), lineNumber);
}
QModelIndex BookmarkManager::index(int row, int column, const QModelIndex &parent) const QModelIndex BookmarkManager::index(int row, int column, const QModelIndex &parent) const
{ {
if (parent.isValid()) if (parent.isValid())
@@ -380,6 +396,8 @@ QVariant BookmarkManager::data(const QModelIndex &index, int role) const
return m_bookmarksList.at(index.row())->path(); return m_bookmarksList.at(index.row())->path();
else if (role == BookmarkManager::LineText) else if (role == BookmarkManager::LineText)
return m_bookmarksList.at(index.row())->lineText(); return m_bookmarksList.at(index.row())->lineText();
else if (role == BookmarkManager::Note)
return m_bookmarksList.at(index.row())->note();
else if (role == Qt::ToolTipRole) else if (role == Qt::ToolTipRole)
return QDir::toNativeSeparators(m_bookmarksList.at(index.row())->filePath()); return QDir::toNativeSeparators(m_bookmarksList.at(index.row())->filePath());
@@ -665,6 +683,32 @@ void BookmarkManager::moveDown()
selectionModel()->setCurrentIndex(current.sibling(row, 0), QItemSelectionModel::Select | QItemSelectionModel::Clear); selectionModel()->setCurrentIndex(current.sibling(row, 0), QItemSelectionModel::Select | QItemSelectionModel::Clear);
} }
void BookmarkManager::editNote(const QString &fileName, int lineNumber)
{
QFileInfo fi(fileName);
Bookmark *b = findBookmark(fi.path(), fi.fileName(), lineNumber);
QModelIndex current = selectionModel()->currentIndex();
selectionModel()->setCurrentIndex(current.sibling(m_bookmarksList.indexOf(b), 0),
QItemSelectionModel::Select | QItemSelectionModel::Clear);
editNote();
}
void BookmarkManager::editNote()
{
QModelIndex current = selectionModel()->currentIndex();
Bookmark *b = m_bookmarksList.at(current.row());
bool inputOk = false;
QString noteText = QInputDialog::getText(0, tr("Edit note"),
tr("Note text:"), QLineEdit::Normal,
b->note(), &inputOk);
if (inputOk) {
b->updateNote(noteText.replace('\t', ' '));
emit dataChanged(current, current);
}
}
/* Returns the bookmark at the given file and line number, or 0 if no such bookmark exists. */ /* Returns the bookmark at the given file and line number, or 0 if no such bookmark exists. */
Bookmark *BookmarkManager::findBookmark(const QString &path, const QString &fileName, int lineNumber) Bookmark *BookmarkManager::findBookmark(const QString &path, const QString &fileName, int lineNumber)
{ {
@@ -704,15 +748,22 @@ void BookmarkManager::addBookmark(Bookmark *bookmark, bool userset)
/* Adds a new bookmark based on information parsed from the string. */ /* Adds a new bookmark based on information parsed from the string. */
void BookmarkManager::addBookmark(const QString &s) void BookmarkManager::addBookmark(const QString &s)
{ {
int index2 = s.lastIndexOf(':'); // index3 is a frontier beetween note text and other bookmarks data
int index3 = s.lastIndexOf('\t');
if (index3 < 0)
index3 = s.size();
int index2 = s.lastIndexOf(':', index3 - 1);
int index1 = s.indexOf(':'); int index1 = s.indexOf(':');
if (index2 != -1 || index1 != -1) {
if (index3 != -1 || index2 != -1 || index1 != -1) {
const QString &filePath = s.mid(index1+1, index2-index1-1); const QString &filePath = s.mid(index1+1, index2-index1-1);
const int lineNumber = s.mid(index2 + 1).toInt(); const QString &note = s.mid(index3 + 1);
const int lineNumber = s.mid(index2 + 1, index3 - index2 - 1).toInt();
const QFileInfo fi(filePath); const QFileInfo fi(filePath);
if (!filePath.isEmpty() && !findBookmark(fi.path(), fi.fileName(), lineNumber)) { if (!filePath.isEmpty() && !findBookmark(fi.path(), fi.fileName(), lineNumber)) {
Bookmark *b = new Bookmark(filePath, lineNumber, this); Bookmark *b = new Bookmark(filePath, lineNumber, this);
b->setNote(note);
b->init(); b->init();
addBookmark(b, false); addBookmark(b, false);
} }
@@ -725,8 +776,12 @@ void BookmarkManager::addBookmark(const QString &s)
QString BookmarkManager::bookmarkToString(const Bookmark *b) QString BookmarkManager::bookmarkToString(const Bookmark *b)
{ {
const QLatin1Char colon(':'); const QLatin1Char colon(':');
// Using \t as delimiter because any another symbol can be a part of note.
const QLatin1Char noteDelimiter('\t');
// Empty string was the name of the bookmark, which now is always "" // Empty string was the name of the bookmark, which now is always ""
return QLatin1String("") + colon + b->filePath() + colon + QString::number(b->lineNumber()); return QLatin1String("") + colon + b->filePath() +
colon + QString::number(b->lineNumber()) +
noteDelimiter + b->note();
} }
/* Saves the bookmarks to the session settings. */ /* Saves the bookmarks to the session settings. */
@@ -740,6 +795,18 @@ void BookmarkManager::saveBookmarks()
sessionManager()->setValue("Bookmarks", list); sessionManager()->setValue("Bookmarks", list);
} }
void BookmarkManager::operateTooltip(TextEditor::ITextEditor *textEditor, const QPoint &pos, Bookmark *mark)
{
if (!mark)
return;
if (mark->note().isEmpty()) {
TextEditor::ToolTip::instance()->hide();
} else {
TextEditor::ToolTip::instance()->show(pos, TextEditor::TextContent(mark->note()), textEditor->widget());
}
}
/* Loads the bookmarks from the session settings. */ /* Loads the bookmarks from the session settings. */
void BookmarkManager::loadBookmarks() void BookmarkManager::loadBookmarks()
{ {
@@ -759,6 +826,16 @@ void BookmarkManager::handleBookmarkRequest(TextEditor::ITextEditor *textEditor,
toggleBookmark(textEditor->document()->fileName(), line); toggleBookmark(textEditor->document()->fileName(), line);
} }
void BookmarkManager::handleBookmarkTooltipRequest(TextEditor::ITextEditor *textEditor, const QPoint &pos,
int line)
{
if (textEditor->document()) {
const QFileInfo fi(textEditor->document()->fileName());
Bookmark *mark = findBookmark(fi.path(), fi.fileName(), line);
operateTooltip(textEditor, pos, mark);
}
}
// BookmarkViewFactory // BookmarkViewFactory
BookmarkViewFactory::BookmarkViewFactory(BookmarkManager *bm) BookmarkViewFactory::BookmarkViewFactory(BookmarkManager *bm)

View File

@@ -86,11 +86,14 @@ public:
// this QItemSelectionModel is shared by all views // this QItemSelectionModel is shared by all views
QItemSelectionModel *selectionModel() const; QItemSelectionModel *selectionModel() const;
bool hasBookmarkInPosition(const QString &fileName, int lineNumber);
enum Roles { enum Roles {
Filename = Qt::UserRole, Filename = Qt::UserRole,
LineNumber = Qt::UserRole + 1, LineNumber = Qt::UserRole + 1,
Directory = Qt::UserRole + 2, Directory = Qt::UserRole + 2,
LineText = Qt::UserRole + 3 LineText = Qt::UserRole + 3,
Note = Qt::UserRole + 4
}; };
public slots: public slots:
@@ -102,6 +105,8 @@ public slots:
void prev(); void prev();
void moveUp(); void moveUp();
void moveDown(); void moveDown();
void editNote();
void editNote(const QString &fileName, int lineNumber);
bool gotoBookmark(Bookmark *bookmark); bool gotoBookmark(Bookmark *bookmark);
signals: signals:
@@ -114,6 +119,9 @@ private slots:
void handleBookmarkRequest(TextEditor::ITextEditor * textEditor, void handleBookmarkRequest(TextEditor::ITextEditor * textEditor,
int line, int line,
TextEditor::ITextEditor::MarkRequestKind kind); TextEditor::ITextEditor::MarkRequestKind kind);
void handleBookmarkTooltipRequest(TextEditor::ITextEditor *textEditor,
const QPoint &pos,
int line);
private: private:
TextEditor::ITextEditor *currentTextEditor() const; TextEditor::ITextEditor *currentTextEditor() const;
@@ -126,6 +134,7 @@ private:
void addBookmark(const QString &s); void addBookmark(const QString &s);
static QString bookmarkToString(const Bookmark *b); static QString bookmarkToString(const Bookmark *b);
void saveBookmarks(); void saveBookmarks();
void operateTooltip(TextEditor::ITextEditor *textEditor, const QPoint &pos, Bookmark *mark);
typedef QMultiMap<QString, Bookmark *> FileNameBookmarksMap; typedef QMultiMap<QString, Bookmark *> FileNameBookmarksMap;
typedef QMap<QString, FileNameBookmarksMap *> DirectoryFileBookmarksMap; typedef QMap<QString, FileNameBookmarksMap *> DirectoryFileBookmarksMap;

View File

@@ -37,6 +37,7 @@ namespace Constants {
const char BOOKMARKS_TOGGLE_ACTION[] = "Bookmarks.Toggle"; const char BOOKMARKS_TOGGLE_ACTION[] = "Bookmarks.Toggle";
const char BOOKMARKS_MOVEUP_ACTION[] = "Bookmarks.MoveUp"; const char BOOKMARKS_MOVEUP_ACTION[] = "Bookmarks.MoveUp";
const char BOOKMARKS_MOVEDOWN_ACTION[] = "Bookmarks.MoveDown"; const char BOOKMARKS_MOVEDOWN_ACTION[] = "Bookmarks.MoveDown";
const char BOOKMARKS_EDITNOTE_ACTION[] = "Bookmarks.EditNote";
const char BOOKMARKS_PREV_ACTION[] = "Bookmarks.Previous"; const char BOOKMARKS_PREV_ACTION[] = "Bookmarks.Previous";
const char BOOKMARKS_NEXT_ACTION[] = "Bookmarks.Next"; const char BOOKMARKS_NEXT_ACTION[] = "Bookmarks.Next";
const char BOOKMARKS_PREVDIR_ACTION[] = "Bookmarks.PreviousDirectory"; const char BOOKMARKS_PREVDIR_ACTION[] = "Bookmarks.PreviousDirectory";

View File

@@ -109,6 +109,8 @@ bool BookmarksPlugin::initialize(const QStringList & /*arguments*/, QString *)
cmd = Core::ActionManager::registerAction(m_docNextAction, BOOKMARKS_NEXTDOC_ACTION, globalcontext); cmd = Core::ActionManager::registerAction(m_docNextAction, BOOKMARKS_NEXTDOC_ACTION, globalcontext);
mbm->addAction(cmd); mbm->addAction(cmd);
m_editNoteAction = new QAction(tr("Edit Bookmark Note"), this);
m_bookmarkManager = new BookmarkManager; m_bookmarkManager = new BookmarkManager;
connect(m_toggleAction, SIGNAL(triggered()), m_bookmarkManager, SLOT(toggleBookmark())); connect(m_toggleAction, SIGNAL(triggered()), m_bookmarkManager, SLOT(toggleBookmark()));
@@ -116,6 +118,7 @@ bool BookmarksPlugin::initialize(const QStringList & /*arguments*/, QString *)
connect(m_nextAction, SIGNAL(triggered()), m_bookmarkManager, SLOT(next())); connect(m_nextAction, SIGNAL(triggered()), m_bookmarkManager, SLOT(next()));
connect(m_docPrevAction, SIGNAL(triggered()), m_bookmarkManager, SLOT(prevInDocument())); connect(m_docPrevAction, SIGNAL(triggered()), m_bookmarkManager, SLOT(prevInDocument()));
connect(m_docNextAction, SIGNAL(triggered()), m_bookmarkManager, SLOT(nextInDocument())); connect(m_docNextAction, SIGNAL(triggered()), m_bookmarkManager, SLOT(nextInDocument()));
connect(m_editNoteAction, SIGNAL(triggered()), this, SLOT(bookmarkEditNoteActionTriggered()));
connect(m_bookmarkManager, SIGNAL(updateActions(int)), this, SLOT(updateActions(int))); connect(m_bookmarkManager, SIGNAL(updateActions(int)), this, SLOT(updateActions(int)));
updateActions(m_bookmarkManager->state()); updateActions(m_bookmarkManager->state());
addAutoReleasedObject(new BookmarkViewFactory(m_bookmarkManager)); addAutoReleasedObject(new BookmarkViewFactory(m_bookmarkManager));
@@ -164,6 +167,10 @@ void BookmarksPlugin::editorOpened(Core::IEditor *editor)
m_bookmarkManager, m_bookmarkManager,
SLOT(handleBookmarkRequest(TextEditor::ITextEditor*,int, SLOT(handleBookmarkRequest(TextEditor::ITextEditor*,int,
TextEditor::ITextEditor::MarkRequestKind))); TextEditor::ITextEditor::MarkRequestKind)));
connect(editor,
SIGNAL(markTooltipRequested(TextEditor::ITextEditor*,QPoint,int)),
m_bookmarkManager,
SLOT(handleBookmarkTooltipRequest(TextEditor::ITextEditor*,QPoint,int)));
} }
} }
@@ -180,15 +187,21 @@ void BookmarksPlugin::requestContextMenu(TextEditor::ITextEditor *editor,
{ {
m_bookmarkMarginActionLineNumber = lineNumber; m_bookmarkMarginActionLineNumber = lineNumber;
m_bookmarkMarginActionFileName = editor->document()->fileName(); m_bookmarkMarginActionFileName = editor->document()->fileName();
menu->addAction(m_bookmarkMarginAction); menu->addAction(m_bookmarkMarginAction);
if (m_bookmarkManager->hasBookmarkInPosition(m_bookmarkMarginActionFileName, m_bookmarkMarginActionLineNumber))
menu->addAction(m_editNoteAction);
} }
void BookmarksPlugin::bookmarkMarginActionTriggered() void BookmarksPlugin::bookmarkMarginActionTriggered()
{ {
m_bookmarkManager->toggleBookmark( m_bookmarkManager->toggleBookmark(m_bookmarkMarginActionFileName,
m_bookmarkMarginActionFileName, m_bookmarkMarginActionLineNumber);
m_bookmarkMarginActionLineNumber }
);
void BookmarksPlugin::bookmarkEditNoteActionTriggered()
{
m_bookmarkManager->editNote(m_bookmarkMarginActionFileName, m_bookmarkMarginActionLineNumber);
} }
Q_EXPORT_PLUGIN(BookmarksPlugin) Q_EXPORT_PLUGIN(BookmarksPlugin)

View File

@@ -77,6 +77,7 @@ private slots:
void requestContextMenu(TextEditor::ITextEditor *editor, void requestContextMenu(TextEditor::ITextEditor *editor,
int lineNumber, QMenu *menu); int lineNumber, QMenu *menu);
void bookmarkMarginActionTriggered(); void bookmarkMarginActionTriggered();
void bookmarkEditNoteActionTriggered();
private: private:
static BookmarksPlugin *m_instance; static BookmarksPlugin *m_instance;
@@ -87,6 +88,7 @@ private:
QAction *m_nextAction; QAction *m_nextAction;
QAction *m_docPrevAction; QAction *m_docPrevAction;
QAction *m_docNextAction; QAction *m_docNextAction;
QAction *m_editNoteAction;
QAction *m_bookmarkMarginAction; QAction *m_bookmarkMarginAction;
int m_bookmarkMarginActionLineNumber; int m_bookmarkMarginActionLineNumber;

View File

@@ -4385,6 +4385,12 @@ void BaseTextEditorWidget::extraAreaMouseEvent(QMouseEvent *e)
// Set whether the mouse cursor is a hand or normal arrow // Set whether the mouse cursor is a hand or normal arrow
if (e->type() == QEvent::MouseMove) { if (e->type() == QEvent::MouseMove) {
bool hand = (e->pos().x() <= markWidth); bool hand = (e->pos().x() <= markWidth);
if (hand) {
//Find line by cursor position
int line = cursor.blockNumber() + 1;
emit editor()->markTooltipRequested(editor(), mapToGlobal(e->pos()), line);
}
if (hand != (d->m_extraArea->cursor().shape() == Qt::PointingHandCursor)) if (hand != (d->m_extraArea->cursor().shape() == Qt::PointingHandCursor))
d->m_extraArea->setCursor(hand ? Qt::PointingHandCursor : Qt::ArrowCursor); d->m_extraArea->setCursor(hand ? Qt::PointingHandCursor : Qt::ArrowCursor);
} }

View File

@@ -117,6 +117,7 @@ signals:
void markContextMenuRequested(TextEditor::ITextEditor *editor, int line, QMenu *menu); void markContextMenuRequested(TextEditor::ITextEditor *editor, int line, QMenu *menu);
void tooltipOverrideRequested(TextEditor::ITextEditor *editor, const QPoint &globalPos, int position, bool *handled); void tooltipOverrideRequested(TextEditor::ITextEditor *editor, const QPoint &globalPos, int position, bool *handled);
void tooltipRequested(TextEditor::ITextEditor *editor, const QPoint &globalPos, int position); void tooltipRequested(TextEditor::ITextEditor *editor, const QPoint &globalPos, int position);
void markTooltipRequested(TextEditor::ITextEditor *editor, const QPoint &globalPos, int line);
void contextHelpIdRequested(TextEditor::ITextEditor *editor, int position); void contextHelpIdRequested(TextEditor::ITextEditor *editor, int position);
}; };