Bring back accessibility for plain text edit.
authorFrederik Gladhorn <frederik.gladhorn@digia.com>
Fri, 12 Oct 2012 13:00:23 +0000 (15:00 +0200)
committerThe Qt Project <gerrit-noreply@qt-project.org>
Mon, 22 Oct 2012 06:41:57 +0000 (08:41 +0200)
This ports 282951bc6c7ddb607fb7ebf61eb8de9acf3da77f
aka Change-Id: If0269a49b9fcd1b3e9fcfd32fac912560df28f21
to Qt 5.

Change-Id: I46f1d4947d90688b598993f76330e2e10aeca950
Reviewed-by: Marc Mutz <marc.mutz@kdab.com>
Reviewed-by: Jan Arve Sæther <jan-arve.saether@digia.com>
src/plugins/accessible/widgets/main.cpp
src/plugins/accessible/widgets/qaccessiblewidgets.cpp
src/plugins/accessible/widgets/qaccessiblewidgets.h
src/plugins/accessible/widgets/widgets.json
src/widgets/widgets/qplaintextedit.cpp

index 2db039f..55b1d37 100644 (file)
@@ -202,6 +202,8 @@ QAccessibleInterface *AccessibleFactory::create(const QString &classname, QObjec
 #ifndef QT_NO_TEXTEDIT
     } else if (classname == QLatin1String("QTextEdit")) {
         iface = new QAccessibleTextEdit(widget);
+    } else if (classname == QLatin1String("QPlainTextEdit")) {
+        iface = new QAccessiblePlainTextEdit(widget);
 #endif
     } else if (classname == QLatin1String("QTipLabel")) {
         iface = new QAccessibleDisplay(widget, QAccessible::ToolTip);
index ad5ef69..eac31b8 100644 (file)
@@ -47,6 +47,7 @@
 #include "private/qtextedit_p.h"
 #include "qtextdocument.h"
 #include "qtextobject.h"
+#include "qplaintextedit.h"
 #include "qtextboundaryfinder.h"
 #include "qscrollbar.h"
 #include "qdebug.h"
@@ -100,6 +101,90 @@ QList<QWidget*> childWidgets(const QWidget *widget, bool includeTopLevel)
 
 #ifndef QT_NO_TEXTEDIT
 
+QAccessiblePlainTextEdit::QAccessiblePlainTextEdit(QWidget* o)
+  :QAccessibleTextWidget(o)
+{
+    Q_ASSERT(widget()->inherits("QPlainTextEdit"));
+}
+
+QPlainTextEdit* QAccessiblePlainTextEdit::plainTextEdit() const
+{
+    return static_cast<QPlainTextEdit *>(widget());
+}
+
+QString QAccessiblePlainTextEdit::text(QAccessible::Text t) const
+{
+    if (t == QAccessible::Value)
+        return plainTextEdit()->toPlainText();
+
+    return QAccessibleWidget::text(t);
+}
+
+void QAccessiblePlainTextEdit::setText(QAccessible::Text t, const QString &text)
+{
+    if (t != QAccessible::Value) {
+        QAccessibleWidget::setText(t, text);
+        return;
+    }
+    if (plainTextEdit()->isReadOnly())
+        return;
+
+    plainTextEdit()->setPlainText(text);
+}
+
+QAccessible::State QAccessiblePlainTextEdit::state() const
+{
+    QAccessible::State st = QAccessibleWidget::state();
+    if (plainTextEdit()->isReadOnly())
+        st.readOnly = true;
+    else
+        st.editable = true;
+    return st;
+}
+
+void *QAccessiblePlainTextEdit::interface_cast(QAccessible::InterfaceType t)
+{
+    if (t == QAccessible::TextInterface)
+        return static_cast<QAccessibleTextInterface*>(this);
+    return QAccessibleWidget::interface_cast(t);
+}
+
+QPoint QAccessiblePlainTextEdit::scrollBarPosition() const
+{
+    QPoint result;
+    result.setX(plainTextEdit()->horizontalScrollBar() ? plainTextEdit()->horizontalScrollBar()->sliderPosition() : 0);
+    result.setY(plainTextEdit()->verticalScrollBar() ? plainTextEdit()->verticalScrollBar()->sliderPosition() : 0);
+    return result;
+}
+
+QTextCursor QAccessiblePlainTextEdit::textCursor() const
+{
+    return plainTextEdit()->textCursor();
+}
+
+void QAccessiblePlainTextEdit::setTextCursor(const QTextCursor &textCursor)
+{
+    plainTextEdit()->setTextCursor(textCursor);
+}
+
+QTextDocument* QAccessiblePlainTextEdit::textDocument() const
+{
+    return plainTextEdit()->document();
+}
+
+QWidget* QAccessiblePlainTextEdit::viewport() const
+{
+    return plainTextEdit()->viewport();
+}
+
+void QAccessiblePlainTextEdit::scrollToSubstring(int startIndex, int endIndex)
+{
+    //TODO: Not implemented
+    Q_UNUSED(startIndex);
+    Q_UNUSED(endIndex);
+}
+
+
 /*!
   \class QAccessibleTextEdit
   \brief The QAccessibleTextEdit class implements the QAccessibleInterface for richtext editors.
@@ -143,9 +228,9 @@ QWidget *QAccessibleTextEdit::viewport() const
     return textEdit()->viewport();
 }
 
-QPoint QAccessibleTextEdit::scrollBarsCurrentPosition() const
+QPoint QAccessibleTextEdit::scrollBarPosition() const
 {
-    QPoint result(0, 0);
+    QPoint result;
     result.setX(textEdit()->horizontalScrollBar() ? textEdit()->horizontalScrollBar()->sliderPosition() : 0);
     result.setY(textEdit()->verticalScrollBar() ? textEdit()->verticalScrollBar()->sliderPosition() : 0);
     return result;
@@ -750,10 +835,9 @@ QRect QAccessibleTextWidget::characterRect(int offset) const
                       w, h);
             r.moveTo(viewport()->mapToGlobal(r.topLeft()));
         }
+        r.translate(-scrollBarPosition());
     }
 
-    r.translate(-scrollBarsCurrentPosition());
-
     return r;
 }
 
@@ -761,7 +845,7 @@ int QAccessibleTextWidget::offsetAtPoint(const QPoint &point) const
 {
     QPoint p = viewport()->mapFromGlobal(point);
     // convert to document coordinates
-    p += scrollBarsCurrentPosition();
+    p += scrollBarPosition();
     return textDocument()->documentLayout()->hitTest(p, Qt::ExactHit);
 }
 
@@ -907,7 +991,7 @@ QString QAccessibleTextWidget::text(int startOffset, int endOffset) const
     return cursor.selectedText();
 }
 
-QPoint QAccessibleTextWidget::scrollBarsCurrentPosition() const
+QPoint QAccessibleTextWidget::scrollBarPosition() const
 {
     return QPoint(0, 0);
 }
index b740bf7..ec25832 100644 (file)
@@ -64,6 +64,7 @@ class QAbstractItemView;
 class QDockWidget;
 class QDockWidgetLayout;
 class QMainWindow;
+class QPlainTextEdit;
 class QTextCursor;
 class QTextDocument;
 
@@ -111,7 +112,7 @@ public:
 protected:
     QTextCursor textCursorForRange(int startOffset, int endOffset) const;
     QPair<int, int> getBoundaries(int offset, QAccessible2::BoundaryType boundaryType) const;
-    virtual QPoint scrollBarsCurrentPosition() const;
+    virtual QPoint scrollBarPosition() const;
     virtual QTextCursor textCursor() const = 0;
     virtual void setTextCursor(const QTextCursor &) = 0;
     virtual QTextDocument *textDocument() const = 0;
@@ -120,6 +121,29 @@ protected:
 #endif  //QT_NO_CURSOR
 
 #ifndef QT_NO_TEXTEDIT
+class QAccessiblePlainTextEdit : public QAccessibleTextWidget
+{
+public:
+    explicit QAccessiblePlainTextEdit(QWidget *o);
+
+    QString text(QAccessible::Text t) const;
+    void setText(QAccessible::Text t, const QString &text);
+    QAccessible::State state() const;
+
+    void *interface_cast(QAccessible::InterfaceType t);
+
+    // QAccessibleTextInterface
+    void scrollToSubstring(int startIndex, int endIndex);
+protected:
+    QPlainTextEdit *plainTextEdit() const;
+
+    QPoint scrollBarPosition() const;
+    QTextCursor textCursor() const;
+    void setTextCursor(const QTextCursor &textCursor);
+    QTextDocument *textDocument() const;
+    QWidget *viewport() const;
+};
+
 class QAccessibleTextEdit : public QAccessibleTextWidget
 {
 public:
@@ -137,13 +161,11 @@ public:
 protected:
     QTextEdit *textEdit() const;
 
-    QPoint scrollBarsCurrentPosition() const;
+    QPoint scrollBarPosition() const;
     QTextCursor textCursor() const;
     void setTextCursor(const QTextCursor &textCursor);
     QTextDocument *textDocument() const;
     QWidget *viewport() const;
-private:
-    int childOffset;
 };
 #endif // QT_NO_TEXTEDIT
 
index 21c0157..69584b9 100644 (file)
@@ -21,6 +21,7 @@
     "QGroupBox",
     "QStatusBar",
     "QProgressBar",
+    "QPlainTextEdit",
     "QMenuBar",
     "QMenu",
     "QHeaderView",
index 397bc67..f27ca39 100644 (file)
@@ -56,6 +56,7 @@
 #include "qtextdocument.h"
 #include "private/qtextdocument_p.h"
 #include "qtextlist.h"
+#include "qaccessible.h"
 
 #include <qtextformat.h>
 #include <qdatetime.h>
@@ -441,6 +442,11 @@ QPlainTextEditControl::QPlainTextEditControl(QPlainTextEdit *parent)
 void QPlainTextEditPrivate::_q_cursorPositionChanged()
 {
     pageUpDownLastCursorYIsValid = false;
+#ifndef QT_NO_ACCESSIBILITY
+    Q_Q(QPlainTextEdit);
+    QAccessibleTextCursorEvent ev(q, q->textCursor().position());
+    QAccessible::updateAccessibility(&ev);
+#endif
 }
 
 void QPlainTextEditPrivate::_q_verticalScrollbarActionTriggered(int action) {