summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/gui/accessible/qaccessible2.cpp113
-rw-r--r--src/gui/accessible/qaccessible2.h21
-rw-r--r--src/plugins/accessible/widgets/qaccessiblewidgets.cpp62
-rw-r--r--src/plugins/accessible/widgets/qaccessiblewidgets.h5
-rw-r--r--src/plugins/accessible/widgets/simplewidgets.cpp7
-rw-r--r--src/plugins/accessible/widgets/simplewidgets.h3
-rw-r--r--src/plugins/platforms/windows/accessible/comutils.h5
-rw-r--r--src/plugins/platforms/windows/accessible/iaccessible2.cpp129
-rw-r--r--src/plugins/platforms/windows/accessible/iaccessible2.h6
9 files changed, 151 insertions, 200 deletions
diff --git a/src/gui/accessible/qaccessible2.cpp b/src/gui/accessible/qaccessible2.cpp
index 41275628f2..4936846d6c 100644
--- a/src/gui/accessible/qaccessible2.cpp
+++ b/src/gui/accessible/qaccessible2.cpp
@@ -190,10 +190,6 @@ QT_BEGIN_NAMESPACE
When implementing this interface you will almost certainly also want to implement \l QAccessibleTextInterface.
- Since this interface can be implemented by means of the normal \l QAccessibleTextInterface,
- \l QAccessibleSimpleEditableTextInterface provides a convenience implementation of this interface.
- Consider inheriting \l QAccessibleSimpleEditableTextInterface instead.
-
\sa QAccessibleInterface
\l{IAccessible2 Specification}
@@ -206,14 +202,6 @@ QT_BEGIN_NAMESPACE
*/
/*!
- \fn void QAccessibleEditableTextInterface::copyText(int startOffset, int endOffset) const
-
- Copies the text from \a startOffset to \a endOffset to the system clip board.
- The \a startOffset is the first character that will be copied.
- The \a endOffset is the first character that will not be copied.
-*/
-
-/*!
\fn void QAccessibleEditableTextInterface::deleteText(int startOffset, int endOffset)
Deletes the text from \a startOffset to \a endOffset.
@@ -226,18 +214,6 @@ QT_BEGIN_NAMESPACE
*/
/*!
- \fn void QAccessibleEditableTextInterface::cutText(int startOffset, int endOffset)
-
- Removes the text from \a startOffset to \a endOffset and puts it in the system clip board.
-*/
-
-/*!
- \fn void QAccessibleEditableTextInterface::pasteText(int offset)
-
- Pastes text from the system clip board at the position \a offset.
-*/
-
-/*!
\fn void QAccessibleEditableTextInterface::replaceText(int startOffset, int endOffset, const QString &text)
Removes the text from \a startOffset to \a endOffset and instead inserts \a text.
@@ -250,20 +226,7 @@ QT_BEGIN_NAMESPACE
*/
/*!
- \class QAccessibleSimpleEditableTextInterface
- \inmodule QtGui
- \ingroup accessibility
- \internal
-
- \brief The QAccessibleSimpleEditableTextInterface class is a convenience class for
- text-based widgets. It can be inherited instead of \l QAccessibleEditableTextInterface.
-
- \sa QAccessibleInterface, QAccessibleEditableTextInterface
-
- \l{IAccessible2 Specification}
-*/
-
-/*!
+ \class QAccessibleValueInterface
\class QAccessibleValueInterface
\inmodule QtGui
\ingroup accessibility
@@ -667,80 +630,6 @@ QString Q_GUI_EXPORT qTextAtOffsetFromString(int offset, QAccessible2::BoundaryT
return text.mid(*startOffset, *endOffset - *startOffset);
}
-QAccessibleSimpleEditableTextInterface::QAccessibleSimpleEditableTextInterface(
- QAccessibleInterface *accessibleInterface)
- : iface(accessibleInterface)
-{
- Q_ASSERT(iface);
-}
-
-#ifndef QT_NO_CLIPBOARD
-static QString textForRange(QAccessibleInterface *iface, int startOffset, int endOffset)
-{
- return iface->text(QAccessible::Value).mid(startOffset, endOffset - startOffset);
-}
-#endif
-
-/*! \reimp */
-void QAccessibleSimpleEditableTextInterface::copyText(int startOffset, int endOffset) const
-{
-#ifdef QT_NO_CLIPBOARD
- Q_UNUSED(startOffset);
- Q_UNUSED(endOffset);
-#else
- QGuiApplication::clipboard()->setText(textForRange(iface, startOffset, endOffset));
-#endif
-}
-
-/*! \reimp */
-void QAccessibleSimpleEditableTextInterface::deleteText(int startOffset, int endOffset)
-{
- QString txt = iface->text(QAccessible::Value);
- txt.remove(startOffset, endOffset - startOffset);
- iface->setText(QAccessible::Value, txt);
-}
-
-/*! \reimp */
-void QAccessibleSimpleEditableTextInterface::insertText(int offset, const QString &text)
-{
- QString txt = iface->text(QAccessible::Value);
- txt.insert(offset, text);
- iface->setText(QAccessible::Value, txt);
-}
-
-/*! \reimp */
-void QAccessibleSimpleEditableTextInterface::cutText(int startOffset, int endOffset)
-{
-#ifdef QT_NO_CLIPBOARD
- Q_UNUSED(startOffset);
- Q_UNUSED(endOffset);
-#else
- QString sub = textForRange(iface, startOffset, endOffset);
- deleteText(startOffset, endOffset);
- QGuiApplication::clipboard()->setText(sub);
-#endif
-}
-
-/*! \reimp */
-void QAccessibleSimpleEditableTextInterface::pasteText(int offset)
-{
-#ifdef QT_NO_CLIPBOARD
- Q_UNUSED(offset);
-#else
- QString txt = iface->text(QAccessible::Value);
- txt.insert(offset, QGuiApplication::clipboard()->text());
- iface->setText(QAccessible::Value, txt);
-#endif
-}
-
-/*! \reimp */
-void QAccessibleSimpleEditableTextInterface::replaceText(int startOffset, int endOffset, const QString &text)
-{
- QString txt = iface->text(QAccessible::Value);
- txt.replace(startOffset, endOffset - startOffset, text);
- iface->setText(QAccessible::Value, txt);
-}
-
QT_END_NAMESPACE
#endif // QT_NO_ACCESSIBILITY
diff --git a/src/gui/accessible/qaccessible2.h b/src/gui/accessible/qaccessible2.h
index 922fb73b7d..91f6b73f3e 100644
--- a/src/gui/accessible/qaccessible2.h
+++ b/src/gui/accessible/qaccessible2.h
@@ -97,30 +97,9 @@ class Q_GUI_EXPORT QAccessibleEditableTextInterface
public:
virtual ~QAccessibleEditableTextInterface() {}
- virtual void copyText(int startOffset, int endOffset) const = 0;
virtual void deleteText(int startOffset, int endOffset) = 0;
virtual void insertText(int offset, const QString &text) = 0;
- virtual void cutText(int startOffset, int endOffset) = 0;
- virtual void pasteText(int offset) = 0;
virtual void replaceText(int startOffset, int endOffset, const QString &text) = 0;
- virtual void setAttributes(int startOffset, int endOffset, const QString &attributes) = 0;
-};
-
-class Q_GUI_EXPORT QAccessibleSimpleEditableTextInterface: public QAccessibleEditableTextInterface
-{
-public:
- explicit QAccessibleSimpleEditableTextInterface(QAccessibleInterface *accessibleInterface); //###
-
- void copyText(int startOffset, int endOffset) const;
- void deleteText(int startOffset, int endOffset);
- void insertText(int offset, const QString &text);
- void cutText(int startOffset, int endOffset);
- void pasteText(int offset);
- void replaceText(int startOffset, int endOffset, const QString &text);
- inline void setAttributes(int, int, const QString &) {}
-
-private:
- QAccessibleInterface *iface;
};
class Q_GUI_EXPORT QAccessibleValueInterface
diff --git a/src/plugins/accessible/widgets/qaccessiblewidgets.cpp b/src/plugins/accessible/widgets/qaccessiblewidgets.cpp
index a002b8bf26..f6ec940b58 100644
--- a/src/plugins/accessible/widgets/qaccessiblewidgets.cpp
+++ b/src/plugins/accessible/widgets/qaccessiblewidgets.cpp
@@ -142,12 +142,20 @@ void QAccessibleTextEdit::setText(QAccessible::Text t, const QString &text)
textEdit()->setText(text);
}
+QAccessible::State QAccessibleTextEdit::state() const
+{
+ QAccessible::State st = QAccessibleWidget::state();
+ if (textEdit()->isReadOnly())
+ st.readOnly = true;
+ else
+ st.editable = true;
+ return st;
+}
+
void *QAccessibleTextEdit::interface_cast(QAccessible::InterfaceType t)
{
if (t == QAccessible::TextInterface)
return static_cast<QAccessibleTextInterface*>(this);
- else if (t == QAccessible::EditableTextInterface)
- return static_cast<QAccessibleEditableTextInterface*>(this);
return QAccessibleWidget::interface_cast(t);
}
@@ -467,24 +475,9 @@ static QTextCursor cursorForRange(QTextEdit *textEdit, int startOffset, int endO
QTextCursor cursor(textEdit->document());
cursor.setPosition(startOffset, QTextCursor::MoveAnchor);
cursor.setPosition(endOffset, QTextCursor::KeepAnchor);
-
return cursor;
}
-void QAccessibleTextEdit::copyText(int startOffset, int endOffset) const
-{
-#ifndef QT_NO_CLIPBOARD
- QTextCursor previousCursor = textEdit()->textCursor();
- QTextCursor cursor = cursorForRange(textEdit(), startOffset, endOffset);
-
- if (!cursor.hasSelection())
- return;
-
- textEdit()->setTextCursor(cursor);
- textEdit()->copy();
- textEdit()->setTextCursor(previousCursor);
-#endif
-}
void QAccessibleTextEdit::deleteText(int startOffset, int endOffset)
{
@@ -501,34 +494,6 @@ void QAccessibleTextEdit::insertText(int offset, const QString &text)
cursor.insertText(text);
}
-void QAccessibleTextEdit::cutText(int startOffset, int endOffset)
-{
-#ifndef QT_NO_CLIPBOARD
- QTextCursor cursor = cursorForRange(textEdit(), startOffset, endOffset);
-
- if (!cursor.hasSelection())
- return;
-
- textEdit()->setTextCursor(cursor);
- textEdit()->cut();
-#endif
-}
-
-void QAccessibleTextEdit::pasteText(int offset)
-{
- QTextEdit *edit = textEdit();
-
- QTextCursor oldCursor = edit->textCursor();
- QTextCursor newCursor = oldCursor;
- newCursor.setPosition(offset);
-
- edit->setTextCursor(newCursor);
-#ifndef QT_NO_CLIPBOARD
- edit->paste();
-#endif
- edit->setTextCursor(oldCursor);
-}
-
void QAccessibleTextEdit::replaceText(int startOffset, int endOffset, const QString &text)
{
QTextCursor cursor = cursorForRange(textEdit(), startOffset, endOffset);
@@ -537,13 +502,6 @@ void QAccessibleTextEdit::replaceText(int startOffset, int endOffset, const QStr
cursor.insertText(text);
}
-void QAccessibleTextEdit::setAttributes(int startOffset, int endOffset, const QString &attributes)
-{
- // TODO
- Q_UNUSED(startOffset);
- Q_UNUSED(endOffset);
- Q_UNUSED(attributes);
-}
#endif // QT_NO_TEXTEDIT
#ifndef QT_NO_STACKEDWIDGET
diff --git a/src/plugins/accessible/widgets/qaccessiblewidgets.h b/src/plugins/accessible/widgets/qaccessiblewidgets.h
index 79ac5ae7b5..dba645570a 100644
--- a/src/plugins/accessible/widgets/qaccessiblewidgets.h
+++ b/src/plugins/accessible/widgets/qaccessiblewidgets.h
@@ -73,6 +73,7 @@ public:
QString text(QAccessible::Text t) const;
void setText(QAccessible::Text t, const QString &text);
+ QAccessible::State state() const;
void *interface_cast(QAccessible::InterfaceType t);
@@ -98,13 +99,9 @@ public:
void scrollToSubstring(int startIndex, int endIndex);
// QAccessibleEditableTextInterface
- void copyText(int startOffset, int endOffset) const;
void deleteText(int startOffset, int endOffset);
void insertText(int offset, const QString &text);
- void cutText(int startOffset, int endOffset);
- void pasteText(int offset);
void replaceText(int startOffset, int endOffset, const QString &text);
- void setAttributes(int startOffset, int endOffset, const QString &attributes);
protected:
QTextEdit *textEdit() const;
diff --git a/src/plugins/accessible/widgets/simplewidgets.cpp b/src/plugins/accessible/widgets/simplewidgets.cpp
index 0fa6dc9990..cc10f598f6 100644
--- a/src/plugins/accessible/widgets/simplewidgets.cpp
+++ b/src/plugins/accessible/widgets/simplewidgets.cpp
@@ -575,7 +575,7 @@ QStringList QAccessibleGroupBox::keyBindingsForAction(const QString &) const
\a name is propagated to the QAccessibleWidget constructor.
*/
QAccessibleLineEdit::QAccessibleLineEdit(QWidget *w, const QString &name)
-: QAccessibleWidget(w, QAccessible::EditableText, name), QAccessibleSimpleEditableTextInterface(this)
+: QAccessibleWidget(w, QAccessible::EditableText, name)
{
addControllingSignal(QLatin1String("textChanged(const QString&)"));
addControllingSignal(QLatin1String("returnPressed()"));
@@ -626,6 +626,9 @@ QAccessible::State QAccessibleLineEdit::state() const
QLineEdit *l = lineEdit();
if (l->isReadOnly())
state.readOnly = true;
+ else
+ state.editable = true;
+
if (l->echoMode() != QLineEdit::Normal)
state.passwordEdit = true;
state.selectable = true;
@@ -643,8 +646,6 @@ void *QAccessibleLineEdit::interface_cast(QAccessible::InterfaceType t)
{
if (t == QAccessible::TextInterface)
return static_cast<QAccessibleTextInterface*>(this);
- else if (t == QAccessible::EditableTextInterface)
- return static_cast<QAccessibleEditableTextInterface*>(this);
return QAccessibleWidget::interface_cast(t);
}
diff --git a/src/plugins/accessible/widgets/simplewidgets.h b/src/plugins/accessible/widgets/simplewidgets.h
index 74c1da405d..baded3d76b 100644
--- a/src/plugins/accessible/widgets/simplewidgets.h
+++ b/src/plugins/accessible/widgets/simplewidgets.h
@@ -137,8 +137,7 @@ private:
#endif
#ifndef QT_NO_LINEEDIT
-class QAccessibleLineEdit : public QAccessibleWidget, public QAccessibleTextInterface,
- public QAccessibleSimpleEditableTextInterface
+class QAccessibleLineEdit : public QAccessibleWidget, public QAccessibleTextInterface
{
public:
explicit QAccessibleLineEdit(QWidget *o, const QString &name = QString());
diff --git a/src/plugins/platforms/windows/accessible/comutils.h b/src/plugins/platforms/windows/accessible/comutils.h
index 4d8e603899..40b89ed991 100644
--- a/src/plugins/platforms/windows/accessible/comutils.h
+++ b/src/plugins/platforms/windows/accessible/comutils.h
@@ -54,6 +54,11 @@ class QVariant;
bool QVariantToVARIANT(const QVariant &var, VARIANT &arg, const QByteArray &typeName, bool out);
+inline QString BSTRToQString(const BSTR &bstr)
+{
+ return QString((QChar*)bstr);
+}
+
inline BSTR QStringToBSTR(const QString &str)
{
return SysAllocStringLen((OLECHAR*)str.unicode(), str.length());
diff --git a/src/plugins/platforms/windows/accessible/iaccessible2.cpp b/src/plugins/platforms/windows/accessible/iaccessible2.cpp
index 71a26aff6b..5a82936a03 100644
--- a/src/plugins/platforms/windows/accessible/iaccessible2.cpp
+++ b/src/plugins/platforms/windows/accessible/iaccessible2.cpp
@@ -45,6 +45,7 @@
#include "qwindowsaccessibility.h"
#include <QtGui/qaccessible2.h>
+#include <QtGui/qclipboard.h>
#include <QtWidgets/qapplication.h>
#include <QtCore/qdebug.h>
@@ -241,9 +242,11 @@ HRESULT STDMETHODCALLTYPE QWindowsIA2Accessible::QueryInterface(REFIID id, LPVOI
} else if (id == IID_IAccessibleComponent) {
*iface = (IAccessibleComponent*)this;
} else if (id == IID_IAccessibleEditableText) {
- //if (accessible->editableTextInterface()) {
- //*iface = (IAccessibleEditableText*)this;
- //}
+ if (accessible->editableTextInterface() ||
+ accessible->role() == QAccessible::EditableText)
+ {
+ *iface = (IAccessibleEditableText*)this;
+ }
} else if (id == IID_IAccessibleHyperlink) {
//*iface = (IAccessibleHyperlink*)this;
} else if (id == IID_IAccessibleHypertext) {
@@ -673,6 +676,126 @@ HRESULT STDMETHODCALLTYPE QWindowsIA2Accessible::get_background(IA2Color *backgr
}
/**************************************************************\
+ * IAccessibleEditableText *
+ **************************************************************/
+#ifndef QT_NO_CLIPBOARD
+/*!
+ \internal
+
+ if \a endOffset == -1 it means end of the text
+*/
+QString QWindowsIA2Accessible::textForRange(int startOffset, int endOffset) const
+{
+ if (QAccessibleTextInterface *textIface = accessible->textInterface()) {
+ if (endOffset == IA2_TEXT_OFFSET_LENGTH)
+ endOffset = textIface->characterCount();
+ return textIface->text(startOffset, endOffset);
+ }
+ QString txt = accessible->text(QAccessible::Value);
+ if (endOffset == IA2_TEXT_OFFSET_LENGTH)
+ endOffset = txt.length();
+ return txt.mid(startOffset, endOffset - startOffset);
+}
+#endif
+
+/*!
+ \internal
+*/
+void QWindowsIA2Accessible::replaceTextFallback(long startOffset, long endOffset, const QString &txt)
+{
+ QString t = textForRange(0, -1);
+ if (endOffset == IA2_TEXT_OFFSET_LENGTH)
+ endOffset = t.length();
+ if (endOffset - startOffset == 0) {
+ t.insert(startOffset, txt);
+ } else {
+ t.replace(startOffset, endOffset - startOffset, txt);
+ }
+ accessible->setText(QAccessible::Value, t);
+}
+
+HRESULT STDMETHODCALLTYPE QWindowsIA2Accessible::copyText(long startOffset, long endOffset)
+{
+ accessibleDebugClientCalls(accessible);
+#ifndef QT_NO_CLIPBOARD
+ const QString t = textForRange(startOffset, endOffset);
+ QGuiApplication::clipboard()->setText(t);
+ return S_OK;
+#else
+ return E_NOTIMPL;
+#endif
+}
+
+HRESULT STDMETHODCALLTYPE QWindowsIA2Accessible::deleteText(long startOffset, long endOffset)
+{
+ accessibleDebugClientCalls(accessible);
+ if (QAccessibleEditableTextInterface *editableTextIface = accessible->editableTextInterface())
+ editableTextIface->deleteText(startOffset, endOffset);
+ else
+ replaceTextFallback(startOffset, endOffset, QString());
+ return S_OK;
+}
+
+HRESULT STDMETHODCALLTYPE QWindowsIA2Accessible::insertText(long offset, BSTR *text)
+{
+ accessibleDebugClientCalls(accessible);
+ const QString txt(BSTRToQString(*text));
+ if (QAccessibleEditableTextInterface *editableTextIface = accessible->editableTextInterface())
+ editableTextIface->insertText(offset, txt);
+ else
+ replaceTextFallback(offset, offset, txt);
+ return S_OK;
+}
+
+HRESULT STDMETHODCALLTYPE QWindowsIA2Accessible::cutText(long startOffset, long endOffset)
+{
+ accessibleDebugClientCalls(accessible);
+#ifndef QT_NO_CLIPBOARD
+ const QString t = textForRange(startOffset, endOffset);
+ if (QAccessibleEditableTextInterface *editableTextIface = accessible->editableTextInterface())
+ editableTextIface->deleteText(startOffset, endOffset);
+ else
+ replaceTextFallback(startOffset, endOffset, QString());
+ QGuiApplication::clipboard()->setText(t);
+ return S_OK;
+#else
+ return E_NOTIMPL;
+#endif
+}
+
+HRESULT STDMETHODCALLTYPE QWindowsIA2Accessible::pasteText(long offset)
+{
+ accessibleDebugClientCalls(accessible);
+#ifndef QT_NO_CLIPBOARD
+ const QString txt = QGuiApplication::clipboard()->text();
+ if (QAccessibleEditableTextInterface *editableTextIface = accessible->editableTextInterface())
+ editableTextIface->insertText(offset, txt);
+ else
+ replaceTextFallback(offset, offset, txt);
+ return S_OK;
+#else
+ return E_NOTIMPL;
+#endif
+}
+
+HRESULT STDMETHODCALLTYPE QWindowsIA2Accessible::replaceText(long startOffset, long endOffset, BSTR *text)
+{
+ accessibleDebugClientCalls(accessible);
+ const QString txt(BSTRToQString(*text));
+ if (QAccessibleEditableTextInterface *editableTextIface = accessible->editableTextInterface())
+ editableTextIface->replaceText(startOffset, endOffset, txt);
+ else
+ replaceTextFallback(startOffset, endOffset, txt);
+ return S_OK;
+}
+
+HRESULT STDMETHODCALLTYPE QWindowsIA2Accessible::setAttributes(long /*startOffset*/, long /*endOffset*/, BSTR * /*attributes*/)
+{
+ return E_NOTIMPL;
+}
+
+
+/**************************************************************\
* IAccessibleTable2 *
**************************************************************/
HRESULT STDMETHODCALLTYPE QWindowsIA2Accessible::get_cellAt( long row, long column, IUnknown **cell)
diff --git a/src/plugins/platforms/windows/accessible/iaccessible2.h b/src/plugins/platforms/windows/accessible/iaccessible2.h
index 0f9d3b3c41..bfd9031e88 100644
--- a/src/plugins/platforms/windows/accessible/iaccessible2.h
+++ b/src/plugins/platforms/windows/accessible/iaccessible2.h
@@ -73,7 +73,7 @@ QT_BEGIN_NAMESPACE
class QWindowsIA2Accessible : public QWindowsMsaaAccessible,
public IAccessibleAction,
public IAccessibleComponent,
- /*public IAccessibleEditableText,*/
+ public IAccessibleEditableText,
public IAccessibleTable2,
public IAccessibleTableCell,
public IAccessibleText,
@@ -122,7 +122,6 @@ public:
HRESULT STDMETHODCALLTYPE get_background(IA2Color *background);
/* IAccessibleEditableText */
- /*
HRESULT STDMETHODCALLTYPE copyText(long startOffset, long endOffset);
HRESULT STDMETHODCALLTYPE deleteText(long startOffset, long endOffset);
HRESULT STDMETHODCALLTYPE insertText(long offset, BSTR *text);
@@ -130,7 +129,6 @@ public:
HRESULT STDMETHODCALLTYPE pasteText(long offset);
HRESULT STDMETHODCALLTYPE replaceText(long startOffset, long endOffset, BSTR *text);
HRESULT STDMETHODCALLTYPE setAttributes(long startOffset, long endOffset, BSTR *attributes);
- */
/* IAccessibleTable2 */
HRESULT STDMETHODCALLTYPE get_cellAt( long row, long column, IUnknown **cell);
@@ -265,6 +263,8 @@ private:
HRESULT wrapListOfCells(const QList<QAccessibleInterface*> &inputCells, IUnknown ***outputAccessibles, long *nCellCount);
uint uniqueID() const;
QByteArray IIDToString(REFIID id);
+ QString textForRange(int startOffset, int endOffset) const;
+ void replaceTextFallback(long startOffset, long endOffset, const QString &txt);
};