summaryrefslogtreecommitdiffstats
path: root/src/gui
diff options
context:
space:
mode:
authorFrederik Gladhorn <frederik.gladhorn@digia.com>2013-03-05 14:37:37 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-04-08 11:35:44 +0200
commit8307ab784eb4d8d22441ee61f02cb381684ca3a2 (patch)
tree9ad1be637574d2979b5a63b3087dfab7770daf2f /src/gui
parent6f0dc9f4c7c1405bdbfef32395d0fb091bb0c8c8 (diff)
Make QTextCursor accessibility boundary finder available
This allows re-using the function in QtQuick. In addition TextBoundaryType is moved to QAccessible and QAccessible2 as namespace ceases to exist. Change-Id: I184bc2c181a22ca51ac4db4e5a080dc26d4acfe0 Reviewed-by: Jan Arve Sæther <jan-arve.saether@digia.com>
Diffstat (limited to 'src/gui')
-rw-r--r--src/gui/accessible/qaccessible.cpp73
-rw-r--r--src/gui/accessible/qaccessible.h12
-rw-r--r--src/gui/accessible/qaccessible2.cpp35
-rw-r--r--src/gui/accessible/qaccessible2_p.h18
4 files changed, 100 insertions, 38 deletions
diff --git a/src/gui/accessible/qaccessible.cpp b/src/gui/accessible/qaccessible.cpp
index e007c9967e..7487aabde5 100644
--- a/src/gui/accessible/qaccessible.cpp
+++ b/src/gui/accessible/qaccessible.cpp
@@ -46,6 +46,8 @@
#include "qaccessibleplugin.h"
#include "qaccessibleobject.h"
#include "qaccessiblebridge.h"
+#include <QtCore/qtextboundaryfinder.h>
+#include <QtGui/qtextcursor.h>
#include <QtGui/QGuiApplication>
#include <private/qguiapplication_p.h>
#include <qpa/qplatformaccessibility.h>
@@ -790,6 +792,77 @@ void QAccessible::updateAccessibility(QAccessibleEvent *event)
#endif
/*!
+ \internal
+ \brief getBoundaries is a helper function to find the accessible text boundaries for QTextCursor based documents.
+ \param documentCursor a valid cursor bound to the document (not null). It needs to ba at the position to look for the boundary
+ \param boundaryType the type of boundary to find
+ \return the boundaries as pair
+*/
+QPair< int, int > QAccessible::qAccessibleTextBoundaryHelper(const QTextCursor &offsetCursor, TextBoundaryType boundaryType)
+{
+ Q_ASSERT(!offsetCursor.isNull());
+
+ QTextCursor endCursor = offsetCursor;
+ endCursor.movePosition(QTextCursor::End);
+ int characterCount = endCursor.position();
+
+ QPair<int, int> result;
+ QTextCursor cursor = offsetCursor;
+ switch (boundaryType) {
+ case CharBoundary:
+ result.first = cursor.position();
+ cursor.movePosition(QTextCursor::NextCharacter, QTextCursor::KeepAnchor);
+ result.second = cursor.position();
+ break;
+ case WordBoundary:
+ cursor.movePosition(QTextCursor::StartOfWord, QTextCursor::MoveAnchor);
+ result.first = cursor.position();
+ cursor.movePosition(QTextCursor::EndOfWord, QTextCursor::KeepAnchor);
+ result.second = cursor.position();
+ break;
+ case SentenceBoundary: {
+ // QCursor does not provide functionality to move to next sentence.
+ // We therefore find the current block, then go through the block using
+ // QTextBoundaryFinder and find the sentence the \offset represents
+ cursor.movePosition(QTextCursor::StartOfBlock, QTextCursor::MoveAnchor);
+ result.first = cursor.position();
+ cursor.movePosition(QTextCursor::EndOfBlock, QTextCursor::KeepAnchor);
+ result.second = cursor.position();
+ QString blockText = cursor.selectedText();
+ const int offsetWithinBlockText = offsetCursor.position() - result.first;
+ QTextBoundaryFinder sentenceFinder(QTextBoundaryFinder::Sentence, blockText);
+ sentenceFinder.setPosition(offsetWithinBlockText);
+ int prevBoundary = offsetWithinBlockText;
+ int nextBoundary = offsetWithinBlockText;
+ if (!(sentenceFinder.boundaryReasons() & QTextBoundaryFinder::StartOfItem))
+ prevBoundary = sentenceFinder.toPreviousBoundary();
+ nextBoundary = sentenceFinder.toNextBoundary();
+ if (nextBoundary != -1)
+ result.second = result.first + nextBoundary;
+ if (prevBoundary != -1)
+ result.first += prevBoundary;
+ break; }
+ case LineBoundary:
+ cursor.movePosition(QTextCursor::StartOfLine, QTextCursor::MoveAnchor);
+ result.first = cursor.position();
+ cursor.movePosition(QTextCursor::EndOfLine, QTextCursor::KeepAnchor);
+ result.second = cursor.position();
+ break;
+ case ParagraphBoundary:
+ cursor.movePosition(QTextCursor::StartOfBlock, QTextCursor::MoveAnchor);
+ result.first = cursor.position();
+ cursor.movePosition(QTextCursor::EndOfBlock, QTextCursor::KeepAnchor);
+ result.second = cursor.position();
+ break;
+ case NoBoundary:
+ result.first = 0;
+ result.second = characterCount;
+ break;
+ }
+ return result;
+}
+
+/*!
\class QAccessibleInterface
\brief The QAccessibleInterface class defines an interface that exposes information
about accessible objects.
diff --git a/src/gui/accessible/qaccessible.h b/src/gui/accessible/qaccessible.h
index 8447f34154..339e3fbcd6 100644
--- a/src/gui/accessible/qaccessible.h
+++ b/src/gui/accessible/qaccessible.h
@@ -62,6 +62,7 @@ QT_BEGIN_NAMESPACE
class QAccessibleInterface;
class QAccessibleEvent;
class QWindow;
+class QTextCursor;
// We need to inherit QObject to expose the enums to QML.
class Q_GUI_EXPORT QAccessible
@@ -331,6 +332,15 @@ public:
TableCellInterface
};
+ enum TextBoundaryType {
+ CharBoundary,
+ WordBoundary,
+ SentenceBoundary,
+ ParagraphBoundary,
+ LineBoundary,
+ NoBoundary
+ };
+
typedef QAccessibleInterface*(*InterfaceFactory)(const QString &key, QObject*);
typedef void(*UpdateHandler)(QAccessibleEvent *event);
typedef void(*RootObjectHandler)(QObject*);
@@ -359,6 +369,8 @@ public:
static void cleanup();
+ static QPair< int, int > qAccessibleTextBoundaryHelper(const QTextCursor &cursor, TextBoundaryType boundaryType);
+
private:
static UpdateHandler updateHandler;
static RootObjectHandler rootObjectHandler;
diff --git a/src/gui/accessible/qaccessible2.cpp b/src/gui/accessible/qaccessible2.cpp
index bd9ecde260..d790fac071 100644
--- a/src/gui/accessible/qaccessible2.cpp
+++ b/src/gui/accessible/qaccessible2.cpp
@@ -49,17 +49,6 @@
QT_BEGIN_NAMESPACE
/*!
- \namespace QAccessible2
- \ingroup accessibility
- \internal
-
- \brief The QAccessible2 namespace defines constants relating to
- IAccessible2-based interfaces
-
- \l{IAccessible2 Specification}
-*/
-
-/*!
\class QAccessibleTextInterface
\internal
\inmodule QtGui
@@ -139,7 +128,7 @@ QT_BEGIN_NAMESPACE
of that item; returns an empty string if there is no such an item.
Sets \a startOffset and \a endOffset values to -1 on error.
*/
-QString QAccessibleTextInterface::textBeforeOffset(int offset, QAccessible2::BoundaryType boundaryType,
+QString QAccessibleTextInterface::textBeforeOffset(int offset, QAccessible::TextBoundaryType boundaryType,
int *startOffset, int *endOffset) const
{
const QString txt = text(0, characterCount());
@@ -155,13 +144,13 @@ QString QAccessibleTextInterface::textBeforeOffset(int offset, QAccessible2::Bou
QTextBoundaryFinder::BoundaryType type;
switch (boundaryType) {
- case QAccessible2::CharBoundary:
+ case QAccessible::CharBoundary:
type = QTextBoundaryFinder::Grapheme;
break;
- case QAccessible2::WordBoundary:
+ case QAccessible::WordBoundary:
type = QTextBoundaryFinder::Word;
break;
- case QAccessible2::SentenceBoundary:
+ case QAccessible::SentenceBoundary:
type = QTextBoundaryFinder::Sentence;
break;
default:
@@ -199,7 +188,7 @@ QString QAccessibleTextInterface::textBeforeOffset(int offset, QAccessible2::Bou
of that item; returns an empty string if there is no such an item.
Sets \a startOffset and \a endOffset values to -1 on error.
*/
-QString QAccessibleTextInterface::textAfterOffset(int offset, QAccessible2::BoundaryType boundaryType,
+QString QAccessibleTextInterface::textAfterOffset(int offset, QAccessible::TextBoundaryType boundaryType,
int *startOffset, int *endOffset) const
{
const QString txt = text(0, characterCount());
@@ -215,13 +204,13 @@ QString QAccessibleTextInterface::textAfterOffset(int offset, QAccessible2::Boun
QTextBoundaryFinder::BoundaryType type;
switch (boundaryType) {
- case QAccessible2::CharBoundary:
+ case QAccessible::CharBoundary:
type = QTextBoundaryFinder::Grapheme;
break;
- case QAccessible2::WordBoundary:
+ case QAccessible::WordBoundary:
type = QTextBoundaryFinder::Word;
break;
- case QAccessible2::SentenceBoundary:
+ case QAccessible::SentenceBoundary:
type = QTextBoundaryFinder::Sentence;
break;
default:
@@ -259,7 +248,7 @@ QString QAccessibleTextInterface::textAfterOffset(int offset, QAccessible2::Boun
of that item; returns an empty string if there is no such an item.
Sets \a startOffset and \a endOffset values to -1 on error.
*/
-QString QAccessibleTextInterface::textAtOffset(int offset, QAccessible2::BoundaryType boundaryType,
+QString QAccessibleTextInterface::textAtOffset(int offset, QAccessible::TextBoundaryType boundaryType,
int *startOffset, int *endOffset) const
{
const QString txt = text(0, characterCount());
@@ -275,13 +264,13 @@ QString QAccessibleTextInterface::textAtOffset(int offset, QAccessible2::Boundar
QTextBoundaryFinder::BoundaryType type;
switch (boundaryType) {
- case QAccessible2::CharBoundary:
+ case QAccessible::CharBoundary:
type = QTextBoundaryFinder::Grapheme;
break;
- case QAccessible2::WordBoundary:
+ case QAccessible::WordBoundary:
type = QTextBoundaryFinder::Word;
break;
- case QAccessible2::SentenceBoundary:
+ case QAccessible::SentenceBoundary:
type = QTextBoundaryFinder::Sentence;
break;
default:
diff --git a/src/gui/accessible/qaccessible2_p.h b/src/gui/accessible/qaccessible2_p.h
index 1a1eeea4ba..95f93e2431 100644
--- a/src/gui/accessible/qaccessible2_p.h
+++ b/src/gui/accessible/qaccessible2_p.h
@@ -50,18 +50,6 @@ QT_BEGIN_NAMESPACE
#ifndef QT_NO_ACCESSIBILITY
-namespace QAccessible2
-{
- enum BoundaryType {
- CharBoundary,
- WordBoundary,
- SentenceBoundary,
- ParagraphBoundary,
- LineBoundary,
- NoBoundary
- };
-}
-
class Q_GUI_EXPORT QAccessibleTextInterface
{
public:
@@ -79,11 +67,11 @@ public:
// text
virtual QString text(int startOffset, int endOffset) const = 0;
- virtual QString textBeforeOffset(int offset, QAccessible2::BoundaryType boundaryType,
+ virtual QString textBeforeOffset(int offset, QAccessible::TextBoundaryType boundaryType,
int *startOffset, int *endOffset) const;
- virtual QString textAfterOffset(int offset, QAccessible2::BoundaryType boundaryType,
+ virtual QString textAfterOffset(int offset, QAccessible::TextBoundaryType boundaryType,
int *startOffset, int *endOffset) const;
- virtual QString textAtOffset(int offset, QAccessible2::BoundaryType boundaryType,
+ virtual QString textAtOffset(int offset, QAccessible::TextBoundaryType boundaryType,
int *startOffset, int *endOffset) const;
virtual int characterCount() const = 0;