[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [libkdeaccessibilityclient] /: Add textWithBoundaries
From:       Frederik Gladhorn <frederik.gladhorn () digia ! com>
Date:       2014-04-30 20:33:55
Message-ID: E1WfbCV-0006mT-F8 () scm ! kde ! org
[Download RAW message or body]

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/69c2384fd0a4dde9231c7e9453ec9c8f4c6fd11f


diff --git a/src/qaccessibilityclient/accessibleobject.cpp \
b/src/qaccessibilityclient/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 \
endOffset) const  return QString();
 }
 
+QString AccessibleObject::textWithBoundary(int offset, TextBoundary \
boundary, int *startOffset, int *endOffset) const +{
+    if (supportedInterfaces() & AccessibleObject::TextInterface)
+        return d->registryPrivate->textWithBoundary(*this, offset, \
boundary, 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/qaccessibilityclient/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 = 0, int endOffset = -1) const;
 
     /**
+        \brief Returns the text of the TextInterface by boundary.
+
+        Especially for larger text fields it may be more performant and \
easier to +        query the text at a certain position instead of the full \
text. +
+        For example the line where the cursor is currently can be \
retrieved 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 \
example 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 \
*startOffset = 0, int *endOffset = 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/qaccessibilityclient/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 = \
QDBusMessage::createMethodCall(object.d->service, object.d->path, \
QLatin1String("org.a11y.atspi.Text"), QLatin1String("GetTextAtOffset")); +  \
message.setArguments(QVariantList() << offset << (AtspiTextBoundaryType) \
boundary); +    QDBusMessage reply = conn.connection().call(message);
+    if (reply.type() != QDBusMessage::ReplyMessage || reply.signature() != \
QStringLiteral("sii")) { +        qWarning() << "Could not access text." << \
reply.errorMessage(); +        if (startOffset)
+            *startOffset = 0;
+        if (endOffset)
+            *endOffset = 0;
+        return QString();
+    }
+    if (startOffset)
+        *startOffset = reply.arguments().at(1).toInt();
+    if (endOffset)
+        *endOffset = reply.arguments().at(2).toInt();
+    return reply.arguments().first().toString();;
+}
+
 bool RegistryPrivate::setText(const AccessibleObject &object, const \
QString &text)  {
     QDBusMessage message = \
QDBusMessage::createMethodCall(object.d->service, object.d->path, \
QLatin1String("org.a11y.atspi.EditableText"), \
                QLatin1String("SetTextContents"));
diff --git a/src/qaccessibilityclient/registry_p.h \
b/src/qaccessibilityclient/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<int,int> > textSelections(const AccessibleObject &object) \
                const;
     void setTextSelections(const AccessibleObject &object, const QList< \
                QPair<int,int> > &selections);
     QString text(const AccessibleObject &object, int startOffset = 0, int \
endOffset = -1) const; +    QString textWithBoundary(const AccessibleObject \
&object, int offset, AccessibleObject::TextBoundary boundary, int \
*startOffset, int *endOffset) const;  
     bool setText(const AccessibleObject &object, const QString &text);
     bool insertText(const AccessibleObject &object, const QString &text, \
                int position, int length = -1);
diff --git a/tests/auto/tst_accessibilityclient.cpp \
b/tests/auto/tst_accessibilityclient.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 = app.child(0).child(0);
     QVERIFY(textArea.supportedInterfaces() & \
QAccessibleClient::AccessibleObject::TextInterface);  
-    QCOMPARE(textArea.characterRect(0), QRect(20,40,0,14));
     textEdit->setText("This is useless text that is being used to test \
this text area.\n I \n hope \n this will get \
correct\n\t\t\tCharacterExtents!"); +    QPoint pos = w.pos();
+
+    int start;
+    int end;
+    QString textWord = textArea.textWithBoundary(0, \
AccessibleObject::WordStartBoundary, &start, &end); +    QCOMPARE(textWord, \
QStringLiteral("This")); +    QCOMPARE(start, 0);
+    QCOMPARE(end, 4);
+    textWord = textArea.textWithBoundary(6, \
AccessibleObject::WordStartBoundary, &start, &end); +    QCOMPARE(textWord \
, QStringLiteral("is")); +    QCOMPARE(start, 5);
+    QCOMPARE(end, 7);
+    textWord = textArea.textWithBoundary(3, \
AccessibleObject::WordEndBoundary); +    QCOMPARE(textWord , \
QStringLiteral("This")); +
+    QString textSentence = textArea.textWithBoundary(0, \
AccessibleObject::SentenceEndBoundary); +    QCOMPARE(textSentence, \
QStringLiteral("This is useless text that is being used to test this text \
area.")); +    QString textLine = textArea.textWithBoundary(0, \
AccessibleObject::LineEndBoundary); +    QCOMPARE(textLine, \
QStringLiteral("This is useless text that is being used to test this text \
area.")); +    textLine = textArea.textWithBoundary(0, \
AccessibleObject::LineEndBoundary); +    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));  }
 


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic