summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTobias Markmann <tm@ayena.de>2017-06-26 03:58:09 (GMT)
committerTobias Markmann <tm@ayena.de>2017-06-26 09:13:57 (GMT)
commit38b577abe56c76805e2f2bebb5194bee28359145 (patch)
treecb05fdfd725936c1fbe42e9245220befeadc8f6f /Swift/QtUI
parent96528818b201c5a250701b58bb9c4d11048b237e (diff)
downloadswift-38b577abe56c76805e2f2bebb5194bee28359145.zip
swift-38b577abe56c76805e2f2bebb5194bee28359145.tar.bz2
Use size_t instead of int in SpellParser::PositionPair
Use of int required a lot of casts when using the indices with std::string methods. Furthermore code used -1 as error code, which should have used std::optional for invalid PoistionPair instnaces. Test-Information: All tests pass on Debian Stretch with clang-3.9. Change-Id: Ic5c44ed606deb58b6123d654f25fc50f047dfbc8
Diffstat (limited to 'Swift/QtUI')
-rw-r--r--Swift/QtUI/QtTextEdit.cpp26
-rw-r--r--Swift/QtUI/QtTextEdit.h6
2 files changed, 18 insertions, 14 deletions
diff --git a/Swift/QtUI/QtTextEdit.cpp b/Swift/QtUI/QtTextEdit.cpp
index 168e6fc..e63cd4f 100644
--- a/Swift/QtUI/QtTextEdit.cpp
+++ b/Swift/QtUI/QtTextEdit.cpp
@@ -104,132 +104,134 @@ void QtTextEdit::updateStyleSheet() {
if (emphasiseFocus_) {
if (hasFocus()) {
newStyleSheet += "border: 2px solid palette(highlight);";
}
}
setStyleSheet(newStyleSheet);
handleTextChanged();
}
void QtTextEdit::focusInEvent(QFocusEvent* event) {
receivedFocus();
QTextEdit::focusInEvent(event);
updateStyleSheet();
}
void QtTextEdit::focusOutEvent(QFocusEvent* event) {
lostFocus();
QTextEdit::focusOutEvent(event);
updateStyleSheet();
}
void QtTextEdit::handleTextChanged() {
QSize previous(maximumSize());
setMaximumSize(QSize(maximumWidth(), sizeHint().height()));
if (previous != maximumSize()) {
updateGeometry();
}
}
-void QtTextEdit::replaceMisspelledWord(const QString& word, int cursorPosition) {
+void QtTextEdit::replaceMisspelledWord(const QString& word, size_t cursorPosition) {
QTextCursor cursor = textCursor();
- PositionPair wordPosition = getWordFromCursor(cursorPosition);
- cursor.setPosition(boost::get<0>(wordPosition), QTextCursor::MoveAnchor);
- cursor.setPosition(boost::get<1>(wordPosition), QTextCursor::KeepAnchor);
- QTextCharFormat normalFormat;
- cursor.insertText(word, normalFormat);
+ auto wordPosition = getWordFromCursor(cursorPosition);
+ if (wordPosition) {
+ cursor.setPosition(boost::get<0>(*wordPosition), QTextCursor::MoveAnchor);
+ cursor.setPosition(boost::get<1>(*wordPosition), QTextCursor::KeepAnchor);
+ QTextCharFormat normalFormat;
+ cursor.insertText(word, normalFormat);
+ }
}
-PositionPair QtTextEdit::getWordFromCursor(int cursorPosition) {
+boost::optional<PositionPair> QtTextEdit::getWordFromCursor(size_t cursorPosition) {
PositionPairList misspelledPositions = highlighter_->getMisspelledPositions();
for (auto& misspelledPosition : misspelledPositions) {
if (cursorPosition >= boost::get<0>(misspelledPosition) && cursorPosition <= boost::get<1>(misspelledPosition)) {
return misspelledPosition;
}
}
- return boost::make_tuple(-1,-1);
+ return boost::optional<PositionPair>(boost::make_tuple(-1,-1));
}
QSize QtTextEdit::sizeHint() const {
QSize hint = document()->size().toSize();
QMargins margins = contentsMargins();
return hint + QSize(margins.left() + margins.right(), margins.top() + margins.bottom());
}
void QtTextEdit::contextMenuEvent(QContextMenuEvent* event) {
QMenu* menu = createStandardContextMenu();
QTextCursor cursor = cursorForPosition(event->pos());
#ifdef HAVE_SPELLCHECKER
QAction* insertPoint = menu->actions().first();
QAction* settingsAction = new QAction(tr("Spell Checker Options"), menu);
menu->insertAction(insertPoint, settingsAction);
menu->insertAction(insertPoint, menu->addSeparator());
addSuggestions(menu, event);
QAction* result = menu->exec(event->globalPos());
if (result == settingsAction) {
spellCheckerSettingsWindow();
}
for (auto& replaceWordAction : replaceWordActions_) {
if (replaceWordAction == result) {
replaceMisspelledWord(replaceWordAction->text(), cursor.position());
}
}
#else
menu->exec(event->globalPos());
#endif
delete menu;
}
void QtTextEdit::dropEvent(QDropEvent* event) {
if (event->mimeData()->hasUrls()) {
itemDropped(event);
}
else {
QTextEdit::dropEvent(event);
}
}
void QtTextEdit::addSuggestions(QMenu* menu, QContextMenuEvent* event)
{
replaceWordActions_.clear();
if (checker_ && highlighter_) {
QAction* insertPoint = menu->actions().first();
QTextCursor cursor = cursorForPosition(event->pos());
- PositionPair wordPosition = getWordFromCursor(cursor.position());
- if (boost::get<0>(wordPosition) < 0) {
+ auto wordPosition = getWordFromCursor(cursor.position());
+ if (!wordPosition) {
// The click was executed outside a spellable word so no
// suggestions are necessary
return;
}
- cursor.setPosition(boost::get<0>(wordPosition), QTextCursor::MoveAnchor);
- cursor.setPosition(boost::get<1>(wordPosition), QTextCursor::KeepAnchor);
+ cursor.setPosition(boost::get<0>(*wordPosition), QTextCursor::MoveAnchor);
+ cursor.setPosition(boost::get<1>(*wordPosition), QTextCursor::KeepAnchor);
std::vector<std::string> wordList;
checker_->getSuggestions(Q2PSTRING(cursor.selectedText()), wordList);
if (wordList.size() == 0) {
QAction* noSuggestions = new QAction(tr("No Suggestions"), menu);
noSuggestions->setDisabled(true);
menu->insertAction(insertPoint, noSuggestions);
}
else {
for (auto& word : wordList) {
QAction* wordAction = new QAction(word.c_str(), menu);
menu->insertAction(insertPoint, wordAction);
replaceWordActions_.push_back(wordAction);
}
}
menu->insertAction(insertPoint, menu->addSeparator());
}
}
#ifdef HAVE_SPELLCHECKER
void QtTextEdit::setUpSpellChecker() {
delete highlighter_;
highlighter_ = nullptr;
delete checker_;
checker_ = nullptr;
if (settings_->getSetting(QtUISettingConstants::SPELL_CHECKER)) {
checker_ = SpellCheckerFactory().createSpellChecker();
if (checker_) {
if (!checker_->isAutomaticallyDetectingLanguage()) {
checker_->setActiveLanguage(settings_->getSetting(QtUISettingConstants::SPELL_CHECKER_LANGUAGE));
diff --git a/Swift/QtUI/QtTextEdit.h b/Swift/QtUI/QtTextEdit.h
index 7ce5d88..178f258 100644
--- a/Swift/QtUI/QtTextEdit.h
+++ b/Swift/QtUI/QtTextEdit.h
@@ -1,70 +1,72 @@
/*
* Copyright (c) 2010-2016 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
#pragma once
+#include <boost/optional.hpp>
+
#include <QPointer>
#include <QTextEdit>
#include <Swift/Controllers/Settings/SettingsProvider.h>
#include <SwifTools/SpellParser.h>
#include <Swift/QtUI/QtSpellCheckHighlighter.h>
namespace Swift {
class SpellChecker;
class QtSpellCheckerWindow;
class QtTextEdit : public QTextEdit {
Q_OBJECT
public:
QtTextEdit(SettingsProvider* settings, QWidget* parent = nullptr);
virtual ~QtTextEdit();
virtual QSize sizeHint() const;
void setEmphasiseFocus(bool emphasise);
void setCorrectionHighlight(bool coorectionHighlight);
signals:
void wordCorrected(QString& word);
void returnPressed();
void unhandledKeyPressEvent(QKeyEvent* event);
void receivedFocus();
void lostFocus();
void itemDropped(QDropEvent* event);
public slots:
void handleSettingChanged(const std::string& settings);
protected:
virtual void keyPressEvent(QKeyEvent* event);
virtual void focusInEvent(QFocusEvent* event);
virtual void focusOutEvent(QFocusEvent* event);
virtual void contextMenuEvent(QContextMenuEvent* event);
virtual void dropEvent(QDropEvent* event);
private slots:
void handleTextChanged();
private:
void addSuggestions(QMenu* menu, QContextMenuEvent* event);
- void replaceMisspelledWord(const QString& word, int cursorPosition);
+ void replaceMisspelledWord(const QString& word, size_t cursorPosition);
void setUpSpellChecker();
void spellCheckerSettingsWindow();
- PositionPair getWordFromCursor(int cursorPosition);
+ boost::optional<PositionPair> getWordFromCursor(size_t cursorPosition);
void updateStyleSheet();
private:
SpellChecker* checker_;
QtSpellCheckHighlighter* highlighter_;
std::vector<QAction*> replaceWordActions_;
SettingsProvider* settings_;
QPointer<QtSpellCheckerWindow> spellCheckerWindow_;
bool emphasiseFocus_ = false;
bool correctionHighlight_ = false;
};
}