11#if QT_CONFIG(textedit)
12#include "qplaintextedit.h"
14#include "private/qtextedit_p.h"
17#if QT_CONFIG(scrollbar)
18#include "qscrollbar.h"
21#include <QApplication>
22#if QT_CONFIG(stackedwidget)
23#include <QStackedWidget>
30#include <QMdiSubWindow>
32#if QT_CONFIG(dialogbuttonbox)
33#include <QDialogButtonBox>
36#if QT_CONFIG(rubberband)
39#if QT_CONFIG(textbrowser)
40#include <QTextBrowser>
42#if QT_CONFIG(calendarwidget)
43#include <QCalendarWidget>
45#if QT_CONFIG(itemviews)
46#include <QAbstractItemView>
48#if QT_CONFIG(dockwidget)
50#include <private/qdockwidget_p.h>
52#if QT_CONFIG(mainwindow)
60#if QT_CONFIG(accessibility)
62#include <QtGui/private/qaccessiblehelper_p.h>
66using namespace Qt::StringLiterals;
68QString qt_accHotKey(
const QString &text);
70QWidgetList _q_ac_childWidgets(
const QWidget *widget)
72 QList<QWidget*> widgets;
75 for (QObject *o : widget->children()) {
76 QWidget *w = qobject_cast<QWidget *>(o);
79 QString objectName = w->objectName();
81 && !qobject_cast<QFocusFrame*>(w)
83 && !qobject_cast<QMenu*>(w)
86 && objectName !=
"qt_rubberband"_L1
87 && objectName !=
"qt_qmainwindow_extended_splitter"_L1
88 && objectName !=
"qt_spinbox_lineedit"_L1) {
95#if QT_CONFIG(textedit) && !defined(QT_NO_CURSOR)
97QAccessiblePlainTextEdit::QAccessiblePlainTextEdit(QWidget* o)
98 :QAccessibleTextWidget(o)
100 Q_ASSERT(qobject_cast<QPlainTextEdit *>(widget()));
103QPlainTextEdit* QAccessiblePlainTextEdit::plainTextEdit()
const
105 return static_cast<QPlainTextEdit *>(widget());
108QString QAccessiblePlainTextEdit::text(QAccessible::Text t)
const
110 if (t == QAccessible::Value)
111 return plainTextEdit()->toPlainText();
113 return QAccessibleWidgetV2::text(t);
116void QAccessiblePlainTextEdit::setText(QAccessible::Text t,
const QString &text)
118 if (t != QAccessible::Value) {
119 QAccessibleWidgetV2::setText(t, text);
122 if (plainTextEdit()->isReadOnly())
125 plainTextEdit()->setPlainText(text);
128QAccessible::State QAccessiblePlainTextEdit::state()
const
130 QAccessible::State st = QAccessibleTextWidget::state();
131 if (plainTextEdit()->isReadOnly())
138void *QAccessiblePlainTextEdit::interface_cast(QAccessible::InterfaceType t)
140 if (t == QAccessible::TextInterface)
141 return static_cast<QAccessibleTextInterface*>(
this);
142 else if (t == QAccessible::EditableTextInterface)
143 return static_cast<QAccessibleEditableTextInterface*>(
this);
144 return QAccessibleWidgetV2::interface_cast(t);
147QPoint QAccessiblePlainTextEdit::scrollBarPosition()
const
150 result.setX(plainTextEdit()->horizontalScrollBar() ? plainTextEdit()->horizontalScrollBar()->sliderPosition() : 0);
151 result.setY(plainTextEdit()->verticalScrollBar() ? plainTextEdit()->verticalScrollBar()->sliderPosition() : 0);
155QTextCursor QAccessiblePlainTextEdit::textCursor()
const
157 return plainTextEdit()->textCursor();
160void QAccessiblePlainTextEdit::setTextCursor(
const QTextCursor &textCursor)
162 plainTextEdit()->setTextCursor(textCursor);
165QTextDocument* QAccessiblePlainTextEdit::textDocument()
const
167 return plainTextEdit()->document();
170QWidget* QAccessiblePlainTextEdit::viewport()
const
172 return plainTextEdit()->viewport();
175void QAccessiblePlainTextEdit::scrollToSubstring(
int startIndex,
int endIndex)
178 Q_UNUSED(startIndex);
184
185
186
187
190
191
192
193
194QAccessibleTextEdit::QAccessibleTextEdit(QWidget *o)
195: QAccessibleTextWidget(o, QAccessible::EditableText)
197 Q_ASSERT(qobject_cast<QTextEdit *>(widget()));
201QTextEdit *QAccessibleTextEdit::textEdit()
const
203 return static_cast<QTextEdit *>(widget());
206QTextCursor QAccessibleTextEdit::textCursor()
const
208 return textEdit()->textCursor();
211QTextDocument *QAccessibleTextEdit::textDocument()
const
213 return textEdit()->document();
216void QAccessibleTextEdit::setTextCursor(
const QTextCursor &textCursor)
218 textEdit()->setTextCursor(textCursor);
221QWidget *QAccessibleTextEdit::viewport()
const
223 return textEdit()->viewport();
226QPoint QAccessibleTextEdit::scrollBarPosition()
const
229 result.setX(textEdit()->horizontalScrollBar() ? textEdit()->horizontalScrollBar()->sliderPosition() : 0);
230 result.setY(textEdit()->verticalScrollBar() ? textEdit()->verticalScrollBar()->sliderPosition() : 0);
234QString QAccessibleTextEdit::text(QAccessible::Text t)
const
236 if (t == QAccessible::Value)
237 return textEdit()->toPlainText();
239 return QAccessibleWidgetV2::text(t);
242void QAccessibleTextEdit::setText(QAccessible::Text t,
const QString &text)
244 if (t != QAccessible::Value) {
245 QAccessibleWidgetV2::setText(t, text);
248 if (textEdit()->isReadOnly())
251 textEdit()->setText(text);
254QAccessible::State QAccessibleTextEdit::state()
const
256 QAccessible::State st = QAccessibleTextWidget::state();
257 if (textEdit()->isReadOnly())
264void *QAccessibleTextEdit::interface_cast(QAccessible::InterfaceType t)
266 if (t == QAccessible::TextInterface)
267 return static_cast<QAccessibleTextInterface*>(
this);
268 else if (t == QAccessible::EditableTextInterface)
269 return static_cast<QAccessibleEditableTextInterface*>(
this);
270 return QAccessibleWidgetV2::interface_cast(t);
273void QAccessibleTextEdit::scrollToSubstring(
int startIndex,
int endIndex)
275 QTextEdit *edit = textEdit();
277 QTextCursor cursor = textCursor();
278 cursor.setPosition(startIndex);
279 QRect r = edit->cursorRect(cursor);
281 cursor.setPosition(endIndex);
282 r.setBottomRight(edit->cursorRect(cursor).bottomRight());
284 r.moveTo(r.x() + edit->horizontalScrollBar()->value(),
285 r.y() + edit->verticalScrollBar()->value());
288 if (Q_UNLIKELY(!QMetaObject::invokeMethod(edit,
"_q_ensureVisible", Q_ARG(QRectF, r))))
289 qWarning(
"AccessibleTextEdit::scrollToSubstring failed!");
294#if QT_CONFIG(stackedwidget)
296QAccessibleStackedWidget::QAccessibleStackedWidget(QWidget *widget)
297 : QAccessibleWidgetV2(widget, QAccessible::LayeredPane)
299 Q_ASSERT(qobject_cast<QStackedWidget *>(widget));
302QAccessibleInterface *QAccessibleStackedWidget::childAt(
int x,
int y)
const
304 if (!stackedWidget()->isVisible())
306 QWidget *currentWidget = stackedWidget()->currentWidget();
309 QPoint position = currentWidget->mapFromGlobal(QPoint(x, y));
310 if (currentWidget->rect().contains(position))
311 return child(stackedWidget()->currentIndex());
315int QAccessibleStackedWidget::childCount()
const
317 return stackedWidget()->count();
320int QAccessibleStackedWidget::indexOfChild(
const QAccessibleInterface *child)
const
325 QWidget *widget = qobject_cast<QWidget*>(child->object());
326 return stackedWidget()->indexOf(widget);
329QAccessibleInterface *QAccessibleStackedWidget::child(
int index)
const
331 if (index < 0 || index >= stackedWidget()->count())
333 return QAccessible::queryAccessibleInterface(stackedWidget()->widget(index));
336QStackedWidget *QAccessibleStackedWidget::stackedWidget()
const
338 return static_cast<QStackedWidget *>(object());
342#if QT_CONFIG(toolbox)
344QAccessibleToolBox::QAccessibleToolBox(QWidget *widget)
345 : QAccessibleWidgetV2(widget, QAccessible::LayeredPane)
347 Q_ASSERT(qobject_cast<QToolBox *>(widget));
350QToolBox * QAccessibleToolBox::toolBox()
const
352 return static_cast<QToolBox *>(object());
357#if QT_CONFIG(mdiarea)
358QAccessibleMdiArea::QAccessibleMdiArea(QWidget *widget)
359 : QAccessibleWidgetV2(widget, QAccessible::LayeredPane)
361 Q_ASSERT(qobject_cast<QMdiArea *>(widget));
364int QAccessibleMdiArea::childCount()
const
366 return mdiArea()->subWindowList().size();
369QAccessibleInterface *QAccessibleMdiArea::child(
int index)
const
371 QList<QMdiSubWindow *> subWindows = mdiArea()->subWindowList();
372 QWidget *targetObject = subWindows.value(index);
375 return QAccessible::queryAccessibleInterface(targetObject);
379int QAccessibleMdiArea::indexOfChild(
const QAccessibleInterface *child)
const
381 if (!child || !child->object() || mdiArea()->subWindowList().isEmpty())
383 if (QMdiSubWindow *window = qobject_cast<QMdiSubWindow *>(child->object())) {
384 return mdiArea()->subWindowList().indexOf(window);
389QMdiArea *QAccessibleMdiArea::mdiArea()
const
391 return static_cast<QMdiArea *>(object());
395QAccessibleMdiSubWindow::QAccessibleMdiSubWindow(QWidget *widget)
396 : QAccessibleWidgetV2(widget, QAccessible::Window)
398 Q_ASSERT(qobject_cast<QMdiSubWindow *>(widget));
401QString QAccessibleMdiSubWindow::text(QAccessible::Text textType)
const
403 if (textType == QAccessible::Name) {
404 QString title = mdiSubWindow()->windowTitle();
405 title.remove(
"[*]"_L1);
408 return QAccessibleWidgetV2::text(textType);
411void QAccessibleMdiSubWindow::setText(QAccessible::Text textType,
const QString &text)
413 if (textType == QAccessible::Name)
414 mdiSubWindow()->setWindowTitle(text);
416 QAccessibleWidgetV2::setText(textType, text);
419QAccessible::State QAccessibleMdiSubWindow::state()
const
421 QAccessible::State state;
422 state.focusable =
true;
423 if (!mdiSubWindow()->isMaximized()) {
424 state.movable =
true;
425 state.sizeable =
true;
427 if (mdiSubWindow()->isAncestorOf(QApplication::focusWidget())
428 || QApplication::focusWidget() == mdiSubWindow())
429 state.focused =
true;
430 if (!mdiSubWindow()->isVisible())
431 state.invisible =
true;
432 if (
const QWidget *parent = mdiSubWindow()->parentWidget())
433 if (!parent->contentsRect().contains(mdiSubWindow()->geometry()))
434 state.offscreen =
true;
435 if (!mdiSubWindow()->isEnabled())
436 state.disabled =
true;
440int QAccessibleMdiSubWindow::childCount()
const
442 if (mdiSubWindow()->widget())
447QAccessibleInterface *QAccessibleMdiSubWindow::child(
int index)
const
449 QMdiSubWindow *source = mdiSubWindow();
450 if (index != 0 || !source->widget())
453 return QAccessible::queryAccessibleInterface(source->widget());
456int QAccessibleMdiSubWindow::indexOfChild(
const QAccessibleInterface *child)
const
458 if (child && child->object() && child->object() == mdiSubWindow()->widget())
463QRect QAccessibleMdiSubWindow::rect()
const
465 if (mdiSubWindow()->isHidden())
467 if (!mdiSubWindow()->parent())
468 return QAccessibleWidgetV2::rect();
469 const QPoint pos = mdiSubWindow()->mapToGlobal(QPoint(0, 0));
470 return QRect(pos, mdiSubWindow()->size());
473QMdiSubWindow *QAccessibleMdiSubWindow::mdiSubWindow()
const
475 return static_cast<QMdiSubWindow *>(object());
479#if QT_CONFIG(dialogbuttonbox)
481QAccessibleDialogButtonBox::QAccessibleDialogButtonBox(QWidget *widget)
482 : QAccessibleWidgetV2(widget, QAccessible::Grouping)
484 Q_ASSERT(qobject_cast<QDialogButtonBox*>(widget));
489#if QT_CONFIG(textbrowser) && !defined(QT_NO_CURSOR)
490QAccessibleTextBrowser::QAccessibleTextBrowser(QWidget *widget)
491 : QAccessibleTextEdit(widget)
493 Q_ASSERT(qobject_cast<QTextBrowser *>(widget));
496QAccessible::Role QAccessibleTextBrowser::role()
const
498 return QAccessible::StaticText;
502#if QT_CONFIG(calendarwidget)
504QAccessibleCalendarWidget::QAccessibleCalendarWidget(QWidget *widget)
505 : QAccessibleWidgetV2(widget, QAccessible::Table)
507 Q_ASSERT(qobject_cast<QCalendarWidget *>(widget));
510int QAccessibleCalendarWidget::childCount()
const
512 return calendarWidget()->isNavigationBarVisible() ? 2 : 1;
515int QAccessibleCalendarWidget::indexOfChild(
const QAccessibleInterface *child)
const
517 if (!child || !child->object() || childCount() <= 0)
519 if (qobject_cast<QAbstractItemView *>(child->object()))
520 return childCount() - 1;
524QAccessibleInterface *QAccessibleCalendarWidget::child(
int index)
const
526 if (index < 0 || index >= childCount())
529 if (childCount() > 1 && index == 0)
530 return QAccessible::queryAccessibleInterface(navigationBar());
532 return QAccessible::queryAccessibleInterface(calendarView());
535QCalendarWidget *QAccessibleCalendarWidget::calendarWidget()
const
537 return static_cast<QCalendarWidget *>(object());
540QAbstractItemView *QAccessibleCalendarWidget::calendarView()
const
542 for (QObject *child : calendarWidget()->children()) {
543 if (child->objectName() ==
"qt_calendar_calendarview"_L1)
544 return static_cast<QAbstractItemView *>(child);
549QWidget *QAccessibleCalendarWidget::navigationBar()
const
551 for (QObject *child : calendarWidget()->children()) {
552 if (child->objectName() ==
"qt_calendar_navigationbar"_L1)
553 return static_cast<QWidget *>(child);
559#if QT_CONFIG(dockwidget)
567QAccessibleDockWidget::QAccessibleDockWidget(QWidget *widget)
568 : QAccessibleWidgetV2(widget)
572QDockWidgetLayout *QAccessibleDockWidget::dockWidgetLayout()
const
574 return qobject_cast<QDockWidgetLayout*>(dockWidget()->layout());
577int QAccessibleDockWidget::childCount()
const
579 if (dockWidget()->titleBarWidget()) {
580 return dockWidget()->widget() ? 2 : 1;
582 return dockWidgetLayout()->count();
585QAccessibleInterface *QAccessibleDockWidget::child(
int index)
const
587 if (dockWidget()->titleBarWidget()) {
588 if ((!dockWidget()->widget() && index == 0) || (index == 1))
589 return QAccessible::queryAccessibleInterface(dockWidget()->titleBarWidget());
591 return QAccessible::queryAccessibleInterface(dockWidget()->widget());
593 QLayoutItem *item = dockWidgetLayout()->itemAt(index);
595 return QAccessible::queryAccessibleInterface(item->widget());
600int QAccessibleDockWidget::indexOfChild(
const QAccessibleInterface *child)
const
602 if (!child || !child->object() || child->object()->parent() != object())
605 if (dockWidget()->titleBarWidget() == child->object()) {
606 return dockWidget()->widget() ? 1 : 0;
609 return dockWidgetLayout()->indexOf(qobject_cast<QWidget*>(child->object()));
612QRect QAccessibleDockWidget::rect()
const
616 if (dockWidget()->isFloating()) {
617 rect = dockWidget()->frameGeometry();
619 rect = dockWidget()->rect();
620 rect.moveTopLeft(dockWidget()->mapToGlobal(rect.topLeft()));
626QDockWidget *QAccessibleDockWidget::dockWidget()
const
628 return static_cast<QDockWidget *>(object());
631QString QAccessibleDockWidget::text(QAccessible::Text t)
const
633 if (t == QAccessible::Name) {
634 return qt_accStripAmp(dockWidget()->windowTitle());
635 }
else if (t == QAccessible::Accelerator) {
636 return qt_accHotKey(dockWidget()->windowTitle());
641QAccessible::Role QAccessibleDockWidget::role()
const
643 if (dockWidget()->isFloating())
644 return QAccessible::Window;
646 return QAccessible::Pane;
653QAccessibleTextWidget::QAccessibleTextWidget(QWidget *o, QAccessible::Role r,
const QString &name)
654 : QAccessibleWidgetV2(o, r, name)
659QAccessible::State QAccessibleTextWidget::state()
const
661 QAccessible::State s = QAccessibleWidgetV2::state();
662 s.selectableText =
true;
667QRect QAccessibleTextWidget::characterRect(
int offset)
const
669 QTextBlock block = textDocument()->findBlock(offset);
670 if (!block.isValid())
673 QTextLayout *layout = block.layout();
674 QPointF layoutPosition = layout->position();
675 int relativeOffset = offset - block.position();
676 QTextLine line = layout->lineForTextPosition(relativeOffset);
680 if (line.isValid()) {
681 qreal x = line.cursorToX(relativeOffset);
683 QTextCharFormat format;
684 QTextBlock::iterator iter = block.begin();
686 format = block.charFormat();
688 while (!iter.atEnd() && !iter.fragment().contains(offset))
692 format = iter.fragment().charFormat();
695 QFontMetrics fm(format.font());
696 const QString ch = text(offset, offset + 1);
698 int w = fm.horizontalAdvance(ch);
700 r = QRect(layoutPosition.x() + x, layoutPosition.y() + line.y() + line.ascent() + fm.descent() - h,
702 r.moveTo(viewport()->mapToGlobal(r.topLeft()));
704 r.translate(-scrollBarPosition());
710int QAccessibleTextWidget::offsetAtPoint(
const QPoint &point)
const
712 QPoint p = viewport()->mapFromGlobal(point);
714 p += scrollBarPosition();
715 return textDocument()->documentLayout()->hitTest(p, Qt::ExactHit);
718int QAccessibleTextWidget::selectionCount()
const
720 return textCursor().hasSelection() ? 1 : 0;
725
726
727
728
729
730
731
732
733
734
735class AttributeFormatterRef {
738 friend class AttributeFormatter;
739 AttributeFormatterRef(QString &string,
const char *key) : string(string), key(key) {}
741 template <
typename RHS>
742 void operator=(RHS &&rhs)
743 { string += QLatin1StringView(key) + u':' + std::forward<RHS>(rhs) + u';'; }
747
748
749
750
751
752
753
754
755
756
757
758
759
760class AttributeFormatter {
763 AttributeFormatterRef operator[](
const char *key)
764 {
return AttributeFormatterRef(string, key); }
766 QString toFormatted()
const {
return string; }
770QString QAccessibleTextWidget::attributes(
int offset,
int *startOffset,
int *endOffset)
const
773
774
778 offset = cursorPosition();
780 const int charCount = characterCount();
784 if (offset == -1 || offset == charCount)
785 offset = charCount - 1;
787 if (offset < 0 || offset > charCount) {
794 QTextCursor cursor = textCursor();
795 cursor.setPosition(offset);
796 QTextBlock block = cursor.block();
798 int blockStart = block.position();
799 int blockEnd = blockStart + block.length();
801 QTextBlock::iterator iter = block.begin();
802 int lastFragmentIndex = blockStart;
803 while (!iter.atEnd()) {
804 QTextFragment f = iter.fragment();
805 if (f.contains(offset))
807 lastFragmentIndex = f.position() + f.length();
811 QTextCharFormat charFormat;
813 QTextFragment fragment = iter.fragment();
814 charFormat = fragment.charFormat();
815 int pos = fragment.position();
817 *startOffset = qMax(pos, blockStart);
818 *endOffset = qMin(pos + fragment.length(), blockEnd);
820 charFormat = block.charFormat();
821 *startOffset = lastFragmentIndex;
822 *endOffset = blockEnd;
824 Q_ASSERT(*startOffset <= offset);
825 Q_ASSERT(*endOffset >= offset);
827 QTextBlockFormat blockFormat = cursor.blockFormat();
829 const QFont charFormatFont = charFormat.font();
831 AttributeFormatter attrs;
832 QString family = charFormatFont.families().value(0, QString());
833 if (!family.isEmpty()) {
834 family = family.replace(u'\\',
"\\\\"_L1);
835 family = family.replace(u':',
"\\:"_L1);
836 family = family.replace(u',',
"\\,"_L1);
837 family = family.replace(u'=',
"\\="_L1);
838 family = family.replace(u';',
"\\;"_L1);
839 family = family.replace(u'\"',
"\\\""_L1);
840 attrs[
"font-family"] = u'"' + family + u'"';
843 int fontSize =
int(charFormatFont.pointSize());
845 attrs[
"font-size"] = QString::fromLatin1(
"%1pt").arg(fontSize);
848 attrs[
"font-weight"] = QString::fromLatin1(charFormatFont.weight() > QFont::Normal ?
"bold" :
"normal");
850 QFont::Style style = charFormatFont.style();
851 attrs[
"font-style"] = QString::fromLatin1((style == QFont::StyleItalic) ?
"italic" : ((style == QFont::StyleOblique) ?
"oblique":
"normal"));
853 attrs[
"text-line-through-type"] = charFormatFont.strikeOut() ?
"single"_L1 :
"none"_L1;
855 QTextCharFormat::UnderlineStyle underlineStyle = charFormat.underlineStyle();
856 if (underlineStyle == QTextCharFormat::NoUnderline && charFormatFont.underline())
857 underlineStyle = QTextCharFormat::SingleUnderline;
858 QString underlineStyleValue;
859 switch (underlineStyle) {
860 case QTextCharFormat::NoUnderline:
862 case QTextCharFormat::SingleUnderline:
863 underlineStyleValue = QStringLiteral(
"solid");
865 case QTextCharFormat::DashUnderline:
866 underlineStyleValue = QStringLiteral(
"dash");
868 case QTextCharFormat::DotLine:
869 underlineStyleValue = QStringLiteral(
"dash");
871 case QTextCharFormat::DashDotLine:
872 underlineStyleValue = QStringLiteral(
"dot-dash");
874 case QTextCharFormat::DashDotDotLine:
875 underlineStyleValue = QStringLiteral(
"dot-dot-dash");
877 case QTextCharFormat::WaveUnderline:
878 underlineStyleValue = QStringLiteral(
"wave");
880 case QTextCharFormat::SpellCheckUnderline:
881 underlineStyleValue = QStringLiteral(
"wave");
884 qWarning() <<
"Unknown QTextCharFormat::UnderlineStyle value " << underlineStyle <<
" could not be translated to IAccessible2 value";
887 if (!underlineStyleValue.isNull()) {
888 attrs[
"text-underline-style"] = underlineStyleValue;
889 attrs[
"text-underline-type"] = QStringLiteral(
"single");
892 if (block.textDirection() == Qt::RightToLeft)
893 attrs[
"writing-mode"] = QStringLiteral(
"rl");
895 QTextCharFormat::VerticalAlignment alignment = charFormat.verticalAlignment();
896 attrs[
"text-position"] = QString::fromLatin1((alignment == QTextCharFormat::AlignSubScript) ?
"sub" : ((alignment == QTextCharFormat::AlignSuperScript) ?
"super" :
"baseline" ));
898 QBrush background = charFormat.background();
899 if (background.style() == Qt::SolidPattern) {
900 attrs[
"background-color"] = QString::fromLatin1(
"rgb(%1,%2,%3)").arg(background.color().red()).arg(background.color().green()).arg(background.color().blue());
903 QBrush foreground = charFormat.foreground();
904 if (foreground.style() == Qt::SolidPattern) {
905 attrs[
"color"] = QString::fromLatin1(
"rgb(%1,%2,%3)").arg(foreground.color().red()).arg(foreground.color().green()).arg(foreground.color().blue());
908 switch (blockFormat.alignment() & (Qt::AlignLeft | Qt::AlignRight | Qt::AlignHCenter | Qt::AlignJustify)) {
910 attrs[
"text-align"] = QStringLiteral(
"left");
913 attrs[
"text-align"] = QStringLiteral(
"right");
915 case Qt::AlignHCenter:
916 attrs[
"text-align"] = QStringLiteral(
"center");
918 case Qt::AlignJustify:
919 attrs[
"text-align"] = QStringLiteral(
"justify");
923 return attrs.toFormatted();
926int QAccessibleTextWidget::cursorPosition()
const
928 return textCursor().position();
931void QAccessibleTextWidget::selection(
int selectionIndex,
int *startOffset,
int *endOffset)
const
933 *startOffset = *endOffset = 0;
934 QTextCursor cursor = textCursor();
936 if (selectionIndex != 0 || !cursor.hasSelection())
939 *startOffset = cursor.selectionStart();
940 *endOffset = cursor.selectionEnd();
943QString QAccessibleTextWidget::text(
int startOffset,
int endOffset)
const
945 QTextCursor cursor(textCursor());
947 cursor.setPosition(startOffset, QTextCursor::MoveAnchor);
948 cursor.setPosition(endOffset, QTextCursor::KeepAnchor);
950 return cursor.selectedText().replace(QChar(QChar::ParagraphSeparator), u'\n');
953QPoint QAccessibleTextWidget::scrollBarPosition()
const
959QString QAccessibleTextWidget::textBeforeOffset(
int offset, QAccessible::TextBoundaryType boundaryType,
960 int *startOffset,
int *endOffset)
const
962 return qt_accTextBeforeOffsetHelper(*
this, textCursor(), offset, boundaryType, startOffset,
966QString QAccessibleTextWidget::textAfterOffset(
int offset, QAccessible::TextBoundaryType boundaryType,
967 int *startOffset,
int *endOffset)
const
969 return qt_accTextAfterOffsetHelper(*
this, textCursor(), offset, boundaryType, startOffset,
973QString QAccessibleTextWidget::textAtOffset(
int offset, QAccessible::TextBoundaryType boundaryType,
974 int *startOffset,
int *endOffset)
const
976 return qt_accTextAtOffsetHelper(*
this, textCursor(), offset, boundaryType, startOffset,
980void QAccessibleTextWidget::setCursorPosition(
int position)
982 QTextCursor cursor = textCursor();
983 cursor.setPosition(position);
984 setTextCursor(cursor);
987void QAccessibleTextWidget::addSelection(
int startOffset,
int endOffset)
989 setSelection(0, startOffset, endOffset);
992void QAccessibleTextWidget::removeSelection(
int selectionIndex)
994 if (selectionIndex != 0)
997 QTextCursor cursor = textCursor();
998 cursor.clearSelection();
999 setTextCursor(cursor);
1002void QAccessibleTextWidget::setSelection(
int selectionIndex,
int startOffset,
int endOffset)
1004 if (selectionIndex != 0)
1007 QTextCursor cursor = textCursor();
1008 cursor.setPosition(startOffset, QTextCursor::MoveAnchor);
1009 cursor.setPosition(endOffset, QTextCursor::KeepAnchor);
1010 setTextCursor(cursor);
1013int QAccessibleTextWidget::characterCount()
const
1015 QTextCursor cursor = textCursor();
1016 cursor.movePosition(QTextCursor::End);
1017 return cursor.position();
1020QTextCursor QAccessibleTextWidget::textCursorForRange(
int startOffset,
int endOffset)
const
1022 QTextCursor cursor = textCursor();
1023 cursor.setPosition(startOffset, QTextCursor::MoveAnchor);
1024 cursor.setPosition(endOffset, QTextCursor::KeepAnchor);
1029void QAccessibleTextWidget::deleteText(
int startOffset,
int endOffset)
1031 QTextCursor cursor = textCursorForRange(startOffset, endOffset);
1032 cursor.removeSelectedText();
1035void QAccessibleTextWidget::insertText(
int offset,
const QString &text)
1037 QTextCursor cursor = textCursor();
1038 cursor.setPosition(offset);
1039 cursor.insertText(text);
1042void QAccessibleTextWidget::replaceText(
int startOffset,
int endOffset,
const QString &text)
1044 QTextCursor cursor = textCursorForRange(startOffset, endOffset);
1045 cursor.removeSelectedText();
1046 cursor.insertText(text);
1051#if QT_CONFIG(mainwindow)
1052QAccessibleMainWindow::QAccessibleMainWindow(QWidget *widget)
1053 : QAccessibleWidgetV2(widget, QAccessible::Window) { }
1055QAccessibleInterface *QAccessibleMainWindow::child(
int index)
const
1057 QList<QWidget*> kids = _q_ac_childWidgets(mainWindow());
1058 if (index >= 0 && index < kids.size()) {
1059 return QAccessible::queryAccessibleInterface(kids.at(index));
1064int QAccessibleMainWindow::childCount()
const
1066 QList<QWidget*> kids = _q_ac_childWidgets(mainWindow());
1070int QAccessibleMainWindow::indexOfChild(
const QAccessibleInterface *iface)
const
1072 QList<QWidget*> kids = _q_ac_childWidgets(mainWindow());
1073 return kids.indexOf(
static_cast<QWidget*>(iface->object()));
1076QAccessibleInterface *QAccessibleMainWindow::childAt(
int x,
int y)
const
1078 QWidget *w = widget();
1079 if (!w->isVisible())
1081 QPoint gp = w->mapToGlobal(QPoint(0, 0));
1082 if (!QRect(gp.x(), gp.y(), w->width(), w->height()).contains(x, y))
1085 const QWidgetList kids = _q_ac_childWidgets(mainWindow());
1086 QPoint rp = mainWindow()->mapFromGlobal(QPoint(x, y));
1087 for (QWidget *child : kids) {
1088 if (!child->isWindow() && !child->isHidden() && child->geometry().contains(rp)) {
1089 return QAccessible::queryAccessibleInterface(child);
1095QMainWindow *QAccessibleMainWindow::mainWindow()
const
1097 return qobject_cast<QMainWindow *>(object());