[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