diff options
Diffstat (limited to 'src/plugins')
7 files changed, 150 insertions, 67 deletions
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); }; |