From 8307ab784eb4d8d22441ee61f02cb381684ca3a2 Mon Sep 17 00:00:00 2001 From: Frederik Gladhorn Date: Tue, 5 Mar 2013 14:37:37 +0100 Subject: Make QTextCursor accessibility boundary finder available MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- .../accessible/widgets/qaccessiblewidgets.cpp | 94 ++++------------------ .../accessible/widgets/qaccessiblewidgets.h | 8 +- src/plugins/accessible/widgets/simplewidgets.cpp | 7 +- src/plugins/accessible/widgets/simplewidgets.h | 6 +- .../platforms/windows/accessible/iaccessible2.cpp | 6 +- 5 files changed, 29 insertions(+), 92 deletions(-) (limited to 'src/plugins') diff --git a/src/plugins/accessible/widgets/qaccessiblewidgets.cpp b/src/plugins/accessible/widgets/qaccessiblewidgets.cpp index 751a722bb8..f20823f25b 100644 --- a/src/plugins/accessible/widgets/qaccessiblewidgets.cpp +++ b/src/plugins/accessible/widgets/qaccessiblewidgets.cpp @@ -72,8 +72,6 @@ QT_BEGIN_NAMESPACE -using namespace QAccessible2; - QString Q_GUI_EXPORT qt_accStripAmp(const QString &text); QString Q_GUI_EXPORT qt_accHotKey(const QString &text); @@ -997,83 +995,18 @@ QPoint QAccessibleTextWidget::scrollBarPosition() const return QPoint(0, 0); } -QPair< int, int > QAccessibleTextWidget::getBoundaries(int offset, BoundaryType boundaryType) const -{ - if (offset >= characterCount()) - return QPair(characterCount(), characterCount()); - if (offset < 0) - return QPair(0, 0); - - QTextCursor cursor = textCursor(); - QPair result; - - cursor.setPosition(offset); - 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 = offset - 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; - default: - qWarning("QAccessibleTextWidget::getBoundaries: Unknown boundary type %d", boundaryType); - result.first = -1; - result.second = -1; - } - return result; -} -QString QAccessibleTextWidget::textBeforeOffset(int offset, BoundaryType boundaryType, +QString QAccessibleTextWidget::textBeforeOffset(int offset, QAccessible::TextBoundaryType boundaryType, int *startOffset, int *endOffset) const { Q_ASSERT(startOffset); Q_ASSERT(endOffset); - QPair boundaries = getBoundaries(offset, boundaryType); - boundaries = getBoundaries(boundaries.first - 1, boundaryType); + QTextCursor cursor = textCursor(); + cursor.setPosition(offset); + QPair boundaries = QAccessible::qAccessibleTextBoundaryHelper(cursor, boundaryType); + cursor.setPosition(boundaries.first - 1); + boundaries = QAccessible::qAccessibleTextBoundaryHelper(cursor, boundaryType); *startOffset = boundaries.first; *endOffset = boundaries.second; @@ -1082,14 +1015,17 @@ QString QAccessibleTextWidget::textBeforeOffset(int offset, BoundaryType boundar } -QString QAccessibleTextWidget::textAfterOffset(int offset, BoundaryType boundaryType, +QString QAccessibleTextWidget::textAfterOffset(int offset, QAccessible::TextBoundaryType boundaryType, int *startOffset, int *endOffset) const { Q_ASSERT(startOffset); Q_ASSERT(endOffset); - QPair boundaries = getBoundaries(offset, boundaryType); - boundaries = getBoundaries(boundaries.second, boundaryType); + QTextCursor cursor = textCursor(); + cursor.setPosition(offset); + QPair boundaries = QAccessible::qAccessibleTextBoundaryHelper(cursor, boundaryType); + cursor.setPosition(boundaries.second); + boundaries = QAccessible::qAccessibleTextBoundaryHelper(cursor, boundaryType); *startOffset = boundaries.first; *endOffset = boundaries.second; @@ -1097,13 +1033,15 @@ QString QAccessibleTextWidget::textAfterOffset(int offset, BoundaryType boundary return text(boundaries.first, boundaries.second); } -QString QAccessibleTextWidget::textAtOffset(int offset, BoundaryType boundaryType, +QString QAccessibleTextWidget::textAtOffset(int offset, QAccessible::TextBoundaryType boundaryType, int *startOffset, int *endOffset) const { Q_ASSERT(startOffset); Q_ASSERT(endOffset); - QPair boundaries = getBoundaries(offset, boundaryType); + QTextCursor cursor = textCursor(); + cursor.setPosition(offset); + QPair boundaries = QAccessible::qAccessibleTextBoundaryHelper(cursor, boundaryType); *startOffset = boundaries.first; *endOffset = boundaries.second; diff --git a/src/plugins/accessible/widgets/qaccessiblewidgets.h b/src/plugins/accessible/widgets/qaccessiblewidgets.h index 35ef3ce905..c60a1d893e 100644 --- a/src/plugins/accessible/widgets/qaccessiblewidgets.h +++ b/src/plugins/accessible/widgets/qaccessiblewidgets.h @@ -92,11 +92,11 @@ public: // text QString text(int startOffset, int endOffset) const; - QString textBeforeOffset(int offset, QAccessible2::BoundaryType boundaryType, + QString textBeforeOffset(int offset, QAccessible::TextBoundaryType boundaryType, int *startOffset, int *endOffset) const; - QString textAfterOffset(int offset, QAccessible2::BoundaryType boundaryType, + QString textAfterOffset(int offset, QAccessible::TextBoundaryType boundaryType, int *startOffset, int *endOffset) const; - QString textAtOffset(int offset, QAccessible2::BoundaryType boundaryType, + QString textAtOffset(int offset, QAccessible::TextBoundaryType boundaryType, int *startOffset, int *endOffset) const; int characterCount() const; @@ -115,8 +115,8 @@ public: protected: QTextCursor textCursorForRange(int startOffset, int endOffset) const; - QPair getBoundaries(int offset, QAccessible2::BoundaryType boundaryType) const; virtual QPoint scrollBarPosition() const; + // return the current text cursor at the caret position including a potential selection virtual QTextCursor textCursor() const = 0; virtual void setTextCursor(const QTextCursor &) = 0; virtual QTextDocument *textDocument() const = 0; diff --git a/src/plugins/accessible/widgets/simplewidgets.cpp b/src/plugins/accessible/widgets/simplewidgets.cpp index a9a43a7875..0112182a4b 100644 --- a/src/plugins/accessible/widgets/simplewidgets.cpp +++ b/src/plugins/accessible/widgets/simplewidgets.cpp @@ -67,7 +67,6 @@ QT_BEGIN_NAMESPACE #ifndef QT_NO_ACCESSIBILITY -using namespace QAccessible2; extern QList childWidgets(const QWidget *widget, bool includeTopLevel = false); QString Q_GUI_EXPORT qt_accStripAmp(const QString &text); @@ -724,7 +723,7 @@ QString QAccessibleLineEdit::text(int startOffset, int endOffset) const return lineEdit()->text().mid(startOffset, endOffset - startOffset); } -QString QAccessibleLineEdit::textBeforeOffset(int offset, BoundaryType boundaryType, +QString QAccessibleLineEdit::textBeforeOffset(int offset, QAccessible::TextBoundaryType boundaryType, int *startOffset, int *endOffset) const { if (lineEdit()->echoMode() != QLineEdit::Normal) { @@ -734,7 +733,7 @@ QString QAccessibleLineEdit::textBeforeOffset(int offset, BoundaryType boundaryT return QAccessibleTextInterface::textBeforeOffset(offset, boundaryType, startOffset, endOffset); } -QString QAccessibleLineEdit::textAfterOffset(int offset, BoundaryType boundaryType, +QString QAccessibleLineEdit::textAfterOffset(int offset, QAccessible::TextBoundaryType boundaryType, int *startOffset, int *endOffset) const { if (lineEdit()->echoMode() != QLineEdit::Normal) { @@ -744,7 +743,7 @@ QString QAccessibleLineEdit::textAfterOffset(int offset, BoundaryType boundaryTy return QAccessibleTextInterface::textAfterOffset(offset, boundaryType, startOffset, endOffset); } -QString QAccessibleLineEdit::textAtOffset(int offset, BoundaryType boundaryType, +QString QAccessibleLineEdit::textAtOffset(int offset, QAccessible::TextBoundaryType boundaryType, int *startOffset, int *endOffset) const { if (lineEdit()->echoMode() != QLineEdit::Normal) { diff --git a/src/plugins/accessible/widgets/simplewidgets.h b/src/plugins/accessible/widgets/simplewidgets.h index 4701634ca0..f1426354f1 100644 --- a/src/plugins/accessible/widgets/simplewidgets.h +++ b/src/plugins/accessible/widgets/simplewidgets.h @@ -156,11 +156,11 @@ public: int offsetAtPoint(const QPoint &point) const; void selection(int selectionIndex, int *startOffset, int *endOffset) const; QString text(int startOffset, int endOffset) const; - QString textBeforeOffset (int offset, QAccessible2::BoundaryType boundaryType, + QString textBeforeOffset (int offset, QAccessible::TextBoundaryType boundaryType, int *startOffset, int *endOffset) const; - QString textAfterOffset(int offset, QAccessible2::BoundaryType boundaryType, + QString textAfterOffset(int offset, QAccessible::TextBoundaryType boundaryType, int *startOffset, int *endOffset) const; - QString textAtOffset(int offset, QAccessible2::BoundaryType boundaryType, + QString textAtOffset(int offset, QAccessible::TextBoundaryType boundaryType, int *startOffset, int *endOffset) const; void removeSelection(int selectionIndex); void setCursorPosition(int position); diff --git a/src/plugins/platforms/windows/accessible/iaccessible2.cpp b/src/plugins/platforms/windows/accessible/iaccessible2.cpp index b1afd7aca3..7a28fd9074 100644 --- a/src/plugins/platforms/windows/accessible/iaccessible2.cpp +++ b/src/plugins/platforms/windows/accessible/iaccessible2.cpp @@ -1354,7 +1354,7 @@ HRESULT STDMETHODCALLTYPE QWindowsIA2Accessible::get_textBeforeOffset(long offse QAccessibleInterface *accessible = accessibleInterface(); accessibleDebugClientCalls(accessible); if (QAccessibleTextInterface *textIface = textInterface()) { - const QString txt = textIface->textBeforeOffset(offset, (QAccessible2::BoundaryType)boundaryType, (int*)startOffset, (int*)endOffset); + const QString txt = textIface->textBeforeOffset(offset, (QAccessible::TextBoundaryType)boundaryType, (int*)startOffset, (int*)endOffset); if (!txt.isEmpty()) { *text = QStringToBSTR(txt); return S_OK; @@ -1374,7 +1374,7 @@ HRESULT STDMETHODCALLTYPE QWindowsIA2Accessible::get_textAfterOffset( QAccessibleInterface *accessible = accessibleInterface(); accessibleDebugClientCalls(accessible); if (QAccessibleTextInterface *textIface = textInterface()) { - const QString txt = textIface->textAfterOffset(offset, (QAccessible2::BoundaryType)boundaryType, (int*)startOffset, (int*)endOffset); + const QString txt = textIface->textAfterOffset(offset, (QAccessible::TextBoundaryType)boundaryType, (int*)startOffset, (int*)endOffset); if (!txt.isEmpty()) { *text = QStringToBSTR(txt); return S_OK; @@ -1393,7 +1393,7 @@ HRESULT STDMETHODCALLTYPE QWindowsIA2Accessible::get_textAtOffset(long offset, QAccessibleInterface *accessible = accessibleInterface(); accessibleDebugClientCalls(accessible); if (QAccessibleTextInterface *textIface = textInterface()) { - const QString txt = textIface->textAtOffset(offset, (QAccessible2::BoundaryType)boundaryType, (int*)startOffset, (int*)endOffset); + const QString txt = textIface->textAtOffset(offset, (QAccessible::TextBoundaryType)boundaryType, (int*)startOffset, (int*)endOffset); if (!txt.isEmpty()) { *text = QStringToBSTR(txt); return S_OK; -- cgit v1.2.3