diff options
author | Frederik Gladhorn <frederik.gladhorn@digia.com> | 2013-03-05 14:37:37 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-04-08 11:35:44 +0200 |
commit | 8307ab784eb4d8d22441ee61f02cb381684ca3a2 (patch) | |
tree | 9ad1be637574d2979b5a63b3087dfab7770daf2f /src/gui | |
parent | 6f0dc9f4c7c1405bdbfef32395d0fb091bb0c8c8 (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.cpp | 73 | ||||
-rw-r--r-- | src/gui/accessible/qaccessible.h | 12 | ||||
-rw-r--r-- | src/gui/accessible/qaccessible2.cpp | 35 | ||||
-rw-r--r-- | src/gui/accessible/qaccessible2_p.h | 18 |
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; |