Bring back accessibility for plain text edit.

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>
bb10
Frederik Gladhorn 2012-10-12 15:00:23 +02:00 committed by The Qt Project
parent 2ec2edc24d
commit a2b7b42ca4
5 changed files with 125 additions and 10 deletions

View 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);

View 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);
}

View 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

View File

@ -21,6 +21,7 @@
"QGroupBox",
"QStatusBar",
"QProgressBar",
"QPlainTextEdit",
"QMenuBar",
"QMenu",
"QHeaderView",

View 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) {