From kde-commits Wed Apr 30 20:33:55 2014 From: Frederik Gladhorn Date: Wed, 30 Apr 2014 20:33:55 +0000 To: kde-commits Subject: [libkdeaccessibilityclient] /: Add textWithBoundaries Message-Id: X-MARC-Message: https://marc.info/?l=kde-commits&m=139889004531192 Git commit 69c2384fd0a4dde9231c7e9453ec9c8f4c6fd11f by Frederik Gladhorn. Committed on 30/04/2014 at 20:25. Pushed by gladhorn into branch 'master'. Add textWithBoundaries M +8 -0 src/qaccessibilityclient/accessibleobject.cpp M +31 -0 src/qaccessibilityclient/accessibleobject.h M +20 -0 src/qaccessibilityclient/registry_p.cpp M +1 -0 src/qaccessibilityclient/registry_p.h M +23 -1 tests/auto/tst_accessibilityclient.cpp http://commits.kde.org/libkdeaccessibilityclient/69c2384fd0a4dde9231c7e9453= ec9c8f4c6fd11f diff --git a/src/qaccessibilityclient/accessibleobject.cpp b/src/qaccessibi= lityclient/accessibleobject.cpp index bf17ae3..21686bd 100644 --- a/src/qaccessibilityclient/accessibleobject.cpp +++ b/src/qaccessibilityclient/accessibleobject.cpp @@ -235,6 +235,14 @@ QString AccessibleObject::text(int startOffset, int en= dOffset) const return QString(); } = +QString AccessibleObject::textWithBoundary(int offset, TextBoundary bounda= ry, int *startOffset, int *endOffset) const +{ + if (supportedInterfaces() & AccessibleObject::TextInterface) + return d->registryPrivate->textWithBoundary(*this, offset, boundar= y, startOffset, endOffset); + qWarning() << "text called on accessible that does not implement text"; + return QString(); +} + bool AccessibleObject::setText(const QString &text) { if( supportedInterfaces() & AccessibleObject::EditableTextInterface ) diff --git a/src/qaccessibilityclient/accessibleobject.h b/src/qaccessibili= tyclient/accessibleobject.h index c4913fc..a0d0db4 100644 --- a/src/qaccessibilityclient/accessibleobject.h +++ b/src/qaccessibilityclient/accessibleobject.h @@ -183,6 +183,20 @@ public: }; = /** + \brief The TextBoundaries enum represents the different boundaries= when + asking for text at a certain offset. + */ + enum TextBoundary { + CharBoundary, + WordStartBoundary, + WordEndBoundary, + SentenceStartBoundary, + SentenceEndBoundary, + LineStartBoundary, + LineEndBoundary + }; + + /** \brief Construct an invalid AccessibleObject. */ AccessibleObject(); @@ -434,6 +448,23 @@ public: QString text(int startOffset =3D 0, int endOffset =3D -1) const; = /** + \brief Returns the text of the TextInterface by boundary. + + Especially for larger text fields it may be more performant and ea= sier to + query the text at a certain position instead of the full text. + + For example the line where the cursor is currently can be retrieve= d with this function + in a convenient way. + + \param offset is the position of the requested text. + \param startOffset returns the beginning of the offset, for exampl= e the start of the line when + asking for line boundaries. + \param endOffset returns the end of the text section + \return the text at the offset. + */ + QString textWithBoundary(int offset, TextBoundary boundary, int *start= Offset =3D 0, int *endOffset =3D 0) const; + + /** \brief Set the text of the EditableTextInterface. = \param text The text to set. diff --git a/src/qaccessibilityclient/registry_p.cpp b/src/qaccessibilitycl= ient/registry_p.cpp index 45e0834..d28bfb0 100644 --- a/src/qaccessibilityclient/registry_p.cpp +++ b/src/qaccessibilityclient/registry_p.cpp @@ -958,6 +958,26 @@ QString RegistryPrivate::text(const AccessibleObject &= object, int startOffset, i return reply.value(); } = +QString RegistryPrivate::textWithBoundary(const AccessibleObject &object, = int offset, AccessibleObject::TextBoundary boundary, int *startOffset, int = *endOffset) const +{ + QDBusMessage message =3D QDBusMessage::createMethodCall(object.d->serv= ice, object.d->path, QLatin1String("org.a11y.atspi.Text"), QLatin1String("G= etTextAtOffset")); + message.setArguments(QVariantList() << offset << (AtspiTextBoundaryTyp= e) boundary); + QDBusMessage reply =3D conn.connection().call(message); + if (reply.type() !=3D QDBusMessage::ReplyMessage || reply.signature() = !=3D QStringLiteral("sii")) { + qWarning() << "Could not access text." << reply.errorMessage(); + if (startOffset) + *startOffset =3D 0; + if (endOffset) + *endOffset =3D 0; + return QString(); + } + if (startOffset) + *startOffset =3D reply.arguments().at(1).toInt(); + if (endOffset) + *endOffset =3D reply.arguments().at(2).toInt(); + return reply.arguments().first().toString();; +} + bool RegistryPrivate::setText(const AccessibleObject &object, const QStrin= g &text) { QDBusMessage message =3D QDBusMessage::createMethodCall(object.d->serv= ice, object.d->path, QLatin1String("org.a11y.atspi.EditableText"), QLatin1S= tring("SetTextContents")); diff --git a/src/qaccessibilityclient/registry_p.h b/src/qaccessibilityclie= nt/registry_p.h index b35de51..e28ecd4 100644 --- a/src/qaccessibilityclient/registry_p.h +++ b/src/qaccessibilityclient/registry_p.h @@ -81,6 +81,7 @@ public: QList< QPair > textSelections(const AccessibleObject &object)= const; void setTextSelections(const AccessibleObject &object, const QList< QP= air > &selections); QString text(const AccessibleObject &object, int startOffset =3D 0, in= t endOffset =3D -1) const; + QString textWithBoundary(const AccessibleObject &object, int offset, A= ccessibleObject::TextBoundary boundary, int *startOffset, int *endOffset) c= onst; = bool setText(const AccessibleObject &object, const QString &text); bool insertText(const AccessibleObject &object, const QString &text, i= nt position, int length =3D -1); diff --git a/tests/auto/tst_accessibilityclient.cpp b/tests/auto/tst_access= ibilityclient.cpp index dc1eb69..2fcb856 100644 --- a/tests/auto/tst_accessibilityclient.cpp +++ b/tests/auto/tst_accessibilityclient.cpp @@ -467,8 +467,30 @@ void AccessibilityClientTest::tst_characterExtents() AccessibleObject textArea =3D app.child(0).child(0); QVERIFY(textArea.supportedInterfaces() & QAccessibleClient::Accessible= Object::TextInterface); = - QCOMPARE(textArea.characterRect(0), QRect(20,40,0,14)); textEdit->setText("This is useless text that is being used to test thi= s text area.\n I \n hope \n this will get correct\n\t\t\tCharacterExtents!"= ); + QPoint pos =3D w.pos(); + + int start; + int end; + QString textWord =3D textArea.textWithBoundary(0, AccessibleObject::Wo= rdStartBoundary, &start, &end); + QCOMPARE(textWord, QStringLiteral("This")); + QCOMPARE(start, 0); + QCOMPARE(end, 4); + textWord =3D textArea.textWithBoundary(6, AccessibleObject::WordStartB= oundary, &start, &end); + QCOMPARE(textWord , QStringLiteral("is")); + QCOMPARE(start, 5); + QCOMPARE(end, 7); + textWord =3D textArea.textWithBoundary(3, AccessibleObject::WordEndBou= ndary); + QCOMPARE(textWord , QStringLiteral("This")); + + QString textSentence =3D textArea.textWithBoundary(0, AccessibleObject= ::SentenceEndBoundary); + QCOMPARE(textSentence, QStringLiteral("This is useless text that is be= ing used to test this text area.")); + QString textLine =3D textArea.textWithBoundary(0, AccessibleObject::Li= neEndBoundary); + QCOMPARE(textLine, QStringLiteral("This is useless text that is being = used to test this text area.")); + textLine =3D textArea.textWithBoundary(0, AccessibleObject::LineEndBou= ndary); + QCOMPARE(textLine, QStringLiteral("This is useless text that is being = used to test this text area.")); + + QCOMPARE(textArea.characterRect(0), QRect(20,40,7,14).translated(pos)); QCOMPARE(textArea.characterRect(1), QRect(20,40,7,14)); } =