aboutsummaryrefslogtreecommitdiffstats
path: root/src/libs/utils/textutils.cpp
diff options
context:
space:
mode:
authorIvan Donchevskii <[email protected]>2017-09-21 12:35:24 +0200
committerIvan Donchevskii <[email protected]>2017-09-22 12:59:35 +0000
commit80a472740d62f0e0b1ffc177c75641691e99e213 (patch)
tree370c5bca8ebcb64b85845751b8dd9dc97de0655f /src/libs/utils/textutils.cpp
parenta959fe59da71289cb52b6c006d8ec7bc70362ad8 (diff)
TextEditor: move convenience from texteditor to utils
Allows to use this header without texteditor dependency. Change-Id: I706f42799c3ea42473a716fa9ef9f3cfbef6fdd4 Reviewed-by: Nikolai Kosjar <[email protected]>
Diffstat (limited to 'src/libs/utils/textutils.cpp')
-rw-r--r--src/libs/utils/textutils.cpp125
1 files changed, 125 insertions, 0 deletions
diff --git a/src/libs/utils/textutils.cpp b/src/libs/utils/textutils.cpp
new file mode 100644
index 00000000000..65b7093c5a6
--- /dev/null
+++ b/src/libs/utils/textutils.cpp
@@ -0,0 +1,125 @@
+/****************************************************************************
+**
+** 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.
+**
+****************************************************************************/
+
+#include "textutils.h"
+
+#include <QTextDocument>
+#include <QTextBlock>
+#include <QTextCursor>
+
+namespace Utils {
+namespace Text {
+
+bool convertPosition(const QTextDocument *document, int pos, int *line, int *column)
+{
+ QTextBlock block = document->findBlock(pos);
+ if (!block.isValid()) {
+ (*line) = -1;
+ (*column) = -1;
+ return false;
+ } else {
+ (*line) = block.blockNumber() + 1;
+ (*column) = pos - block.position();
+ return true;
+ }
+}
+
+QString textAt(QTextCursor tc, int pos, int length)
+{
+ if (pos < 0)
+ pos = 0;
+ tc.movePosition(QTextCursor::End);
+ if (pos + length > tc.position())
+ length = tc.position() - pos;
+
+ tc.setPosition(pos);
+ tc.setPosition(pos + length, QTextCursor::KeepAnchor);
+
+ // selectedText() returns U+2029 (PARAGRAPH SEPARATOR) instead of newline
+ return tc.selectedText().replace(QChar::ParagraphSeparator, QLatin1Char('\n'));
+}
+
+QTextCursor selectAt(QTextCursor textCursor, uint line, uint column, uint length)
+{
+ if (line < 1)
+ line = 1;
+
+ if (column < 1)
+ column = 1;
+
+ textCursor.setPosition(0);
+ textCursor.movePosition(QTextCursor::NextBlock, QTextCursor::MoveAnchor, line - 1);
+ textCursor.movePosition(QTextCursor::NextCharacter,QTextCursor::MoveAnchor, column + length - 1 );
+
+ textCursor.movePosition(QTextCursor::PreviousCharacter,QTextCursor::KeepAnchor, length);
+
+ return textCursor;
+}
+
+QTextCursor flippedCursor(const QTextCursor &cursor)
+{
+ QTextCursor flipped = cursor;
+ flipped.clearSelection();
+ flipped.setPosition(cursor.anchor(), QTextCursor::KeepAnchor);
+ return flipped;
+}
+
+static bool isValidIdentifierChar(const QChar &c)
+{
+ return c.isLetter()
+ || c.isNumber()
+ || c == QLatin1Char('_')
+ || c.isHighSurrogate()
+ || c.isLowSurrogate();
+}
+
+static bool isAfterOperatorKeyword(QTextCursor cursor)
+{
+ cursor.movePosition(QTextCursor::PreviousWord);
+ cursor.movePosition(QTextCursor::EndOfWord, QTextCursor::KeepAnchor);
+ return cursor.selectedText() == "operator";
+}
+
+QTextCursor wordStartCursor(const QTextCursor &textCursor)
+{
+ const int originalPosition = textCursor.position();
+ QTextCursor cursor(textCursor);
+ cursor.movePosition(QTextCursor::StartOfWord);
+ const int wordStartPosition = cursor.position();
+
+ if (originalPosition == wordStartPosition) {
+ // Cursor is not on an identifier, check whether we are right after one.
+ const QChar c = textCursor.document()->characterAt(originalPosition - 1);
+ if (isValidIdentifierChar(c))
+ cursor.movePosition(QTextCursor::PreviousWord);
+ }
+ if (isAfterOperatorKeyword(cursor))
+ cursor.movePosition(QTextCursor::PreviousWord);
+
+ return cursor;
+}
+
+} // Text
+} // Utils