[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