10#if QT_CONFIG(textedit)
11#include "qplaintextedit.h"
13#include "private/qtextedit_p.h"
16#if QT_CONFIG(scrollbar)
17#include "qscrollbar.h"
20#include <QApplication>
21#if QT_CONFIG(stackedwidget)
22#include <QStackedWidget>
29#include <QMdiSubWindow>
31#if QT_CONFIG(dialogbuttonbox)
32#include <QDialogButtonBox>
35#if QT_CONFIG(rubberband)
38#if QT_CONFIG(textbrowser)
39#include <QTextBrowser>
41#if QT_CONFIG(calendarwidget)
42#include <QCalendarWidget>
44#if QT_CONFIG(itemviews)
45#include <QAbstractItemView>
47#if QT_CONFIG(dockwidget)
49#include <private/qdockwidget_p.h>
51#if QT_CONFIG(mainwindow)
59#if QT_CONFIG(accessibility)
61#include <QtGui/private/qaccessiblehelper_p.h>
65using namespace Qt::StringLiterals;
67QString qt_accHotKey(
const QString &text);
69QWidgetList _q_ac_childWidgets(
const QWidget *widget)
71 QList<QWidget*> widgets;
74 for (QObject *o : widget->children()) {
75 QWidget *w = qobject_cast<QWidget *>(o);
78 QString objectName = w->objectName();
80 && !qobject_cast<QFocusFrame*>(w)
82 && !qobject_cast<QMenu*>(w)
85 && objectName !=
"qt_rubberband"_L1
86 && objectName !=
"qt_qmainwindow_extended_splitter"_L1
87 && objectName !=
"qt_spinbox_lineedit"_L1) {
94#if QT_CONFIG(textedit) && !defined(QT_NO_CURSOR)
96QAccessiblePlainTextEdit::QAccessiblePlainTextEdit(QWidget* o)
97 :QAccessibleTextWidget(o)
99 Q_ASSERT(qobject_cast<QPlainTextEdit *>(widget()));
102QPlainTextEdit* QAccessiblePlainTextEdit::plainTextEdit()
const
104 return static_cast<QPlainTextEdit *>(widget());
107QString QAccessiblePlainTextEdit::text(QAccessible::Text t)
const
109 if (t == QAccessible::Value)
110 return plainTextEdit()->toPlainText();
112 return QAccessibleWidgetV2::text(t);
115void QAccessiblePlainTextEdit::setText(QAccessible::Text t,
const QString &text)
117 if (t != QAccessible::Value) {
118 QAccessibleWidgetV2::setText(t, text);
121 if (plainTextEdit()->isReadOnly())
124 plainTextEdit()->setPlainText(text);
127QAccessible::State QAccessiblePlainTextEdit::state()
const
129 QAccessible::State st = QAccessibleTextWidget::state();
130 if (plainTextEdit()->isReadOnly())
137void *QAccessiblePlainTextEdit::interface_cast(QAccessible::InterfaceType t)
139 if (t == QAccessible::TextInterface)
140 return static_cast<QAccessibleTextInterface*>(
this);
141 else if (t == QAccessible::EditableTextInterface)
142 return static_cast<QAccessibleEditableTextInterface*>(
this);
143 return QAccessibleWidgetV2::interface_cast(t);
146QPoint QAccessiblePlainTextEdit::scrollBarPosition()
const
149 result.setX(plainTextEdit()->horizontalScrollBar() ? plainTextEdit()->horizontalScrollBar()->sliderPosition() : 0);
150 result.setY(plainTextEdit()->verticalScrollBar() ? plainTextEdit()->verticalScrollBar()->sliderPosition() : 0);
154QTextCursor QAccessiblePlainTextEdit::textCursor()
const
156 return plainTextEdit()->textCursor();
159void QAccessiblePlainTextEdit::setTextCursor(
const QTextCursor &textCursor)
161 plainTextEdit()->setTextCursor(textCursor);
164QTextDocument* QAccessiblePlainTextEdit::textDocument()
const
166 return plainTextEdit()->document();
169QWidget* QAccessiblePlainTextEdit::viewport()
const
171 return plainTextEdit()->viewport();
174void QAccessiblePlainTextEdit::scrollToSubstring(
int startIndex,
int endIndex)
177 Q_UNUSED(startIndex);
183
184
185
186
189
190
191
192
193QAccessibleTextEdit::QAccessibleTextEdit(QWidget *o)
194: QAccessibleTextWidget(o, QAccessible::EditableText)
196 Q_ASSERT(qobject_cast<QTextEdit *>(widget()));
200QTextEdit *QAccessibleTextEdit::textEdit()
const
202 return static_cast<QTextEdit *>(widget());
205QTextCursor QAccessibleTextEdit::textCursor()
const
207 return textEdit()->textCursor();
210QTextDocument *QAccessibleTextEdit::textDocument()
const
212 return textEdit()->document();
215void QAccessibleTextEdit::setTextCursor(
const QTextCursor &textCursor)
217 textEdit()->setTextCursor(textCursor);
220QWidget *QAccessibleTextEdit::viewport()
const
222 return textEdit()->viewport();
225QPoint QAccessibleTextEdit::scrollBarPosition()
const
228 result.setX(textEdit()->horizontalScrollBar() ? textEdit()->horizontalScrollBar()->sliderPosition() : 0);
229 result.setY(textEdit()->verticalScrollBar() ? textEdit()->verticalScrollBar()->sliderPosition() : 0);
233QString QAccessibleTextEdit::text(QAccessible::Text t)
const
235 if (t == QAccessible::Value)
236 return textEdit()->toPlainText();
238 return QAccessibleWidgetV2::text(t);
241void QAccessibleTextEdit::setText(QAccessible::Text t,
const QString &text)
243 if (t != QAccessible::Value) {
244 QAccessibleWidgetV2::setText(t, text);
247 if (textEdit()->isReadOnly())
250 textEdit()->setText(text);
253QAccessible::State QAccessibleTextEdit::state()
const
255 QAccessible::State st = QAccessibleTextWidget::state();
256 if (textEdit()->isReadOnly())
263void *QAccessibleTextEdit::interface_cast(QAccessible::InterfaceType t)
265 if (t == QAccessible::TextInterface)
266 return static_cast<QAccessibleTextInterface*>(
this);
267 else if (t == QAccessible::EditableTextInterface)
268 return static_cast<QAccessibleEditableTextInterface*>(
this);
269 return QAccessibleWidgetV2::interface_cast(t);
272void QAccessibleTextEdit::scrollToSubstring(
int startIndex,
int endIndex)
274 QTextEdit *edit = textEdit();
276 QTextCursor cursor = textCursor();
277 cursor.setPosition(startIndex);
278 QRect r = edit->cursorRect(cursor);
280 cursor.setPosition(endIndex);
281 r.setBottomRight(edit->cursorRect(cursor).bottomRight());
283 r.moveTo(r.x() + edit->horizontalScrollBar()->value(),
284 r.y() + edit->verticalScrollBar()->value());
287 if (Q_UNLIKELY(!QMetaObject::invokeMethod(edit,
"_q_ensureVisible", Q_ARG(QRectF, r))))
288 qWarning(
"AccessibleTextEdit::scrollToSubstring failed!");
293#if QT_CONFIG(stackedwidget)
295QAccessibleStackedWidget::QAccessibleStackedWidget(QWidget *widget)
296 : QAccessibleWidgetV2(widget, QAccessible::LayeredPane)
298 Q_ASSERT(qobject_cast<QStackedWidget *>(widget));
301QAccessibleInterface *QAccessibleStackedWidget::childAt(
int x,
int y)
const
303 if (!stackedWidget()->isVisible())
305 QWidget *currentWidget = stackedWidget()->currentWidget();
308 QPoint position = currentWidget->mapFromGlobal(QPoint(x, y));
309 if (currentWidget->rect().contains(position))
310 return child(stackedWidget()->currentIndex());
314int QAccessibleStackedWidget::childCount()
const
316 return stackedWidget()->count();
319int QAccessibleStackedWidget::indexOfChild(
const QAccessibleInterface *child)
const
324 QWidget *widget = qobject_cast<QWidget*>(child->object());
325 return stackedWidget()->indexOf(widget);
328QAccessibleInterface *QAccessibleStackedWidget::child(
int index)
const
330 if (index < 0 || index >= stackedWidget()->count())
332 return QAccessible::queryAccessibleInterface(stackedWidget()->widget(index));
335QStackedWidget *QAccessibleStackedWidget::stackedWidget()
const
337 return static_cast<QStackedWidget *>(object());
341#if QT_CONFIG(toolbox)
343QAccessibleToolBox::QAccessibleToolBox(QWidget *widget)
344 : QAccessibleWidgetV2(widget, QAccessible::LayeredPane)
346 Q_ASSERT(qobject_cast<QToolBox *>(widget));
349QToolBox * QAccessibleToolBox::toolBox()
const
351 return static_cast<QToolBox *>(object());
356#if QT_CONFIG(mdiarea)
357QAccessibleMdiArea::QAccessibleMdiArea(QWidget *widget)
358 : QAccessibleWidgetV2(widget, QAccessible::LayeredPane)
360 Q_ASSERT(qobject_cast<QMdiArea *>(widget));
363int QAccessibleMdiArea::childCount()
const
365 return mdiArea()->subWindowList().size();
368QAccessibleInterface *QAccessibleMdiArea::child(
int index)
const
370 QList<QMdiSubWindow *> subWindows = mdiArea()->subWindowList();
371 QWidget *targetObject = subWindows.value(index);
374 return QAccessible::queryAccessibleInterface(targetObject);
378int QAccessibleMdiArea::indexOfChild(
const QAccessibleInterface *child)
const
380 if (!child || !child->object() || mdiArea()->subWindowList().isEmpty())
382 if (QMdiSubWindow *window = qobject_cast<QMdiSubWindow *>(child->object())) {
383 return mdiArea()->subWindowList().indexOf(window);
388QMdiArea *QAccessibleMdiArea::mdiArea()
const
390 return static_cast<QMdiArea *>(object());
394QAccessibleMdiSubWindow::QAccessibleMdiSubWindow(QWidget *widget)
395 : QAccessibleWidgetV2(widget, QAccessible::Window)
397 Q_ASSERT(qobject_cast<QMdiSubWindow *>(widget));
400QString QAccessibleMdiSubWindow::text(QAccessible::Text textType)
const
402 if (textType == QAccessible::Name) {
403 QString title = mdiSubWindow()->windowTitle();
404 title.remove(
"[*]"_L1);
407 return QAccessibleWidgetV2::text(textType);
410void QAccessibleMdiSubWindow::setText(QAccessible::Text textType,
const QString &text)
412 if (textType == QAccessible::Name)
413 mdiSubWindow()->setWindowTitle(text);
415 QAccessibleWidgetV2::setText(textType, text);
418QAccessible::State QAccessibleMdiSubWindow::state()
const
420 QAccessible::State state;
421 state.focusable =
true;
422 if (!mdiSubWindow()->isMaximized()) {
423 state.movable =
true;
424 state.sizeable =
true;
426 if (mdiSubWindow()->isAncestorOf(QApplication::focusWidget())
427 || QApplication::focusWidget() == mdiSubWindow())
428 state.focused =
true;
429 if (!mdiSubWindow()->isVisible())
430 state.invisible =
true;
431 if (
const QWidget *parent = mdiSubWindow()->parentWidget())
432 if (!parent->contentsRect().contains(mdiSubWindow()->geometry()))
433 state.offscreen =
true;
434 if (!mdiSubWindow()->isEnabled())
435 state.disabled =
true;
439int QAccessibleMdiSubWindow::childCount()
const
441 if (mdiSubWindow()->widget())
446QAccessibleInterface *QAccessibleMdiSubWindow::child(
int index)
const
448 QMdiSubWindow *source = mdiSubWindow();
449 if (index != 0 || !source->widget())
452 return QAccessible::queryAccessibleInterface(source->widget());
455int QAccessibleMdiSubWindow::indexOfChild(
const QAccessibleInterface *child)
const
457 if (child && child->object() && child->object() == mdiSubWindow()->widget())
462QRect QAccessibleMdiSubWindow::rect()
const
464 if (mdiSubWindow()->isHidden())
466 if (!mdiSubWindow()->parent())
467 return QAccessibleWidgetV2::rect();
468 const QPoint pos = mdiSubWindow()->mapToGlobal(QPoint(0, 0));
469 return QRect(pos, mdiSubWindow()->size());
472QMdiSubWindow *QAccessibleMdiSubWindow::mdiSubWindow()
const
474 return static_cast<QMdiSubWindow *>(object());
478#if QT_CONFIG(dialogbuttonbox)
480QAccessibleDialogButtonBox::QAccessibleDialogButtonBox(QWidget *widget)
481 : QAccessibleWidgetV2(widget, QAccessible::Grouping)
483 Q_ASSERT(qobject_cast<QDialogButtonBox*>(widget));
488#if QT_CONFIG(textbrowser) && !defined(QT_NO_CURSOR)
489QAccessibleTextBrowser::QAccessibleTextBrowser(QWidget *widget)
490 : QAccessibleTextEdit(widget)
492 Q_ASSERT(qobject_cast<QTextBrowser *>(widget));
495QAccessible::Role QAccessibleTextBrowser::role()
const
497 return QAccessible::StaticText;
501#if QT_CONFIG(calendarwidget)
503QAccessibleCalendarWidget::QAccessibleCalendarWidget(QWidget *widget)
504 : QAccessibleWidgetV2(widget, QAccessible::Table)
506 Q_ASSERT(qobject_cast<QCalendarWidget *>(widget));
509int QAccessibleCalendarWidget::childCount()
const
511 return calendarWidget()->isNavigationBarVisible() ? 2 : 1;
514int QAccessibleCalendarWidget::indexOfChild(
const QAccessibleInterface *child)
const
516 if (!child || !child->object() || childCount() <= 0)
518 if (qobject_cast<QAbstractItemView *>(child->object()))
519 return childCount() - 1;
523QAccessibleInterface *QAccessibleCalendarWidget::child(
int index)
const
525 if (index < 0 || index >= childCount())
528 if (childCount() > 1 && index == 0)
529 return QAccessible::queryAccessibleInterface(navigationBar());
531 return QAccessible::queryAccessibleInterface(calendarView());
534QCalendarWidget *QAccessibleCalendarWidget::calendarWidget()
const
536 return static_cast<QCalendarWidget *>(object());
539QAbstractItemView *QAccessibleCalendarWidget::calendarView()
const
541 for (QObject *child : calendarWidget()->children()) {
542 if (child->objectName() ==
"qt_calendar_calendarview"_L1)
543 return static_cast<QAbstractItemView *>(child);
548QWidget *QAccessibleCalendarWidget::navigationBar()
const
550 for (QObject *child : calendarWidget()->children()) {
551 if (child->objectName() ==
"qt_calendar_navigationbar"_L1)
552 return static_cast<QWidget *>(child);
558#if QT_CONFIG(dockwidget)
566QAccessibleDockWidget::QAccessibleDockWidget(QWidget *widget)
567 : QAccessibleWidgetV2(widget)
571QDockWidgetLayout *QAccessibleDockWidget::dockWidgetLayout()
const
573 return qobject_cast<QDockWidgetLayout*>(dockWidget()->layout());
576int QAccessibleDockWidget::childCount()
const
578 if (dockWidget()->titleBarWidget()) {
579 return dockWidget()->widget() ? 2 : 1;
581 return dockWidgetLayout()->count();
584QAccessibleInterface *QAccessibleDockWidget::child(
int index)
const
586 if (dockWidget()->titleBarWidget()) {
587 if ((!dockWidget()->widget() && index == 0) || (index == 1))
588 return QAccessible::queryAccessibleInterface(dockWidget()->titleBarWidget());
590 return QAccessible::queryAccessibleInterface(dockWidget()->widget());
592 QLayoutItem *item = dockWidgetLayout()->itemAt(index);
594 return QAccessible::queryAccessibleInterface(item->widget());
599int QAccessibleDockWidget::indexOfChild(
const QAccessibleInterface *child)
const
601 if (!child || !child->object() || child->object()->parent() != object())
604 if (dockWidget()->titleBarWidget() == child->object()) {
605 return dockWidget()->widget() ? 1 : 0;
608 return dockWidgetLayout()->indexOf(qobject_cast<QWidget*>(child->object()));
611QRect QAccessibleDockWidget::rect()
const
615 if (dockWidget()->isFloating()) {
616 rect = dockWidget()->frameGeometry();
618 rect = dockWidget()->rect();
619 rect.moveTopLeft(dockWidget()->mapToGlobal(rect.topLeft()));
625QDockWidget *QAccessibleDockWidget::dockWidget()
const
627 return static_cast<QDockWidget *>(object());
630QString QAccessibleDockWidget::text(QAccessible::Text t)
const
632 if (t == QAccessible::Name) {
633 return qt_accStripAmp(dockWidget()->windowTitle());
634 }
else if (t == QAccessible::Accelerator) {
635 return qt_accHotKey(dockWidget()->windowTitle());
640QAccessible::Role QAccessibleDockWidget::role()
const
642 if (dockWidget()->isFloating())
643 return QAccessible::Window;
645 return QAccessible::Pane;
652QAccessibleTextWidget::QAccessibleTextWidget(QWidget *o, QAccessible::Role r,
const QString &name)
653 : QAccessibleWidgetV2(o, r, name)
658QAccessible::State QAccessibleTextWidget::state()
const
660 QAccessible::State s = QAccessibleWidgetV2::state();
661 s.selectableText =
true;
666QRect QAccessibleTextWidget::characterRect(
int offset)
const
668 QTextBlock block = textDocument()->findBlock(offset);
669 if (!block.isValid())
672 QTextLayout *layout = block.layout();
673 QPointF layoutPosition = layout->position();
674 int relativeOffset = offset - block.position();
675 QTextLine line = layout->lineForTextPosition(relativeOffset);
679 if (line.isValid()) {
680 qreal x = line.cursorToX(relativeOffset);
682 QTextCharFormat format;
683 QTextBlock::iterator iter = block.begin();
685 format = block.charFormat();
687 while (!iter.atEnd() && !iter.fragment().contains(offset))
691 format = iter.fragment().charFormat();
694 QFontMetrics fm(format.font());
695 const QString ch = text(offset, offset + 1);
697 int w = fm.horizontalAdvance(ch);
699 r = QRect(layoutPosition.x() + x, layoutPosition.y() + line.y() + line.ascent() + fm.descent() - h,
701 r.moveTo(viewport()->mapToGlobal(r.topLeft()));
703 r.translate(-scrollBarPosition());
709int QAccessibleTextWidget::offsetAtPoint(
const QPoint &point)
const
711 QPoint p = viewport()->mapFromGlobal(point);
713 p += scrollBarPosition();
714 return textDocument()->documentLayout()->hitTest(p, Qt::ExactHit);
717int QAccessibleTextWidget::selectionCount()
const
719 return textCursor().hasSelection() ? 1 : 0;
724
725
726
727
728
729
730
731
732
733
734class AttributeFormatterRef {
737 friend class AttributeFormatter;
738 AttributeFormatterRef(QString &string,
const char *key) : string(string), key(key) {}
740 template <
typename RHS>
741 void operator=(RHS &&rhs)
742 { string += QLatin1StringView(key) + u':' + std::forward<RHS>(rhs) + u';'; }
746
747
748
749
750
751
752
753
754
755
756
757
758
759class AttributeFormatter {
762 AttributeFormatterRef operator[](
const char *key)
763 {
return AttributeFormatterRef(string, key); }
765 QString toFormatted()
const {
return string; }
769QString QAccessibleTextWidget::attributes(
int offset,
int *startOffset,
int *endOffset)
const
772
773
777 offset = cursorPosition();
779 const int charCount = characterCount();
783 if (offset == -1 || offset == charCount)
784 offset = charCount - 1;
786 if (offset < 0 || offset > charCount) {
793 QTextCursor cursor = textCursor();
794 cursor.setPosition(offset);
795 QTextBlock block = cursor.block();
797 int blockStart = block.position();
798 int blockEnd = blockStart + block.length();
800 QTextBlock::iterator iter = block.begin();
801 int lastFragmentIndex = blockStart;
802 while (!iter.atEnd()) {
803 QTextFragment f = iter.fragment();
804 if (f.contains(offset))
806 lastFragmentIndex = f.position() + f.length();
810 QTextCharFormat charFormat;
812 QTextFragment fragment = iter.fragment();
813 charFormat = fragment.charFormat();
814 int pos = fragment.position();
816 *startOffset = qMax(pos, blockStart);
817 *endOffset = qMin(pos + fragment.length(), blockEnd);
819 charFormat = block.charFormat();
820 *startOffset = lastFragmentIndex;
821 *endOffset = blockEnd;
823 Q_ASSERT(*startOffset <= offset);
824 Q_ASSERT(*endOffset >= offset);
826 QTextBlockFormat blockFormat = cursor.blockFormat();
828 const QFont charFormatFont = charFormat.font();
830 AttributeFormatter attrs;
831 QString family = charFormatFont.families().value(0, QString());
832 if (!family.isEmpty()) {
833 family = family.replace(u'\\',
"\\\\"_L1);
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 attrs[
"font-family"] = u'"' + family + u'"';
842 int fontSize =
int(charFormatFont.pointSize());
844 attrs[
"font-size"] = QString::fromLatin1(
"%1pt").arg(fontSize);
847 attrs[
"font-weight"] = QString::fromLatin1(charFormatFont.weight() > QFont::Normal ?
"bold" :
"normal");
849 QFont::Style style = charFormatFont.style();
850 attrs[
"font-style"] = QString::fromLatin1((style == QFont::StyleItalic) ?
"italic" : ((style == QFont::StyleOblique) ?
"oblique":
"normal"));
852 attrs[
"text-line-through-type"] = charFormatFont.strikeOut() ?
"single"_L1 :
"none"_L1;
854 QTextCharFormat::UnderlineStyle underlineStyle = charFormat.underlineStyle();
855 if (underlineStyle == QTextCharFormat::NoUnderline && charFormatFont.underline())
856 underlineStyle = QTextCharFormat::SingleUnderline;
857 QString underlineStyleValue;
858 switch (underlineStyle) {
859 case QTextCharFormat::NoUnderline:
861 case QTextCharFormat::SingleUnderline:
862 underlineStyleValue = QStringLiteral(
"solid");
864 case QTextCharFormat::DashUnderline:
865 underlineStyleValue = QStringLiteral(
"dash");
867 case QTextCharFormat::DotLine:
868 underlineStyleValue = QStringLiteral(
"dash");
870 case QTextCharFormat::DashDotLine:
871 underlineStyleValue = QStringLiteral(
"dot-dash");
873 case QTextCharFormat::DashDotDotLine:
874 underlineStyleValue = QStringLiteral(
"dot-dot-dash");
876 case QTextCharFormat::WaveUnderline:
877 underlineStyleValue = QStringLiteral(
"wave");
879 case QTextCharFormat::SpellCheckUnderline:
880 underlineStyleValue = QStringLiteral(
"wave");
883 qWarning() <<
"Unknown QTextCharFormat::UnderlineStyle value " << underlineStyle <<
" could not be translated to IAccessible2 value";
886 if (!underlineStyleValue.isNull()) {
887 attrs[
"text-underline-style"] = underlineStyleValue;
888 attrs[
"text-underline-type"] = QStringLiteral(
"single");
891 if (block.textDirection() == Qt::RightToLeft)
892 attrs[
"writing-mode"] = QStringLiteral(
"rl");
894 QTextCharFormat::VerticalAlignment alignment = charFormat.verticalAlignment();
895 attrs[
"text-position"] = QString::fromLatin1((alignment == QTextCharFormat::AlignSubScript) ?
"sub" : ((alignment == QTextCharFormat::AlignSuperScript) ?
"super" :
"baseline" ));
897 QBrush background = charFormat.background();
898 if (background.style() == Qt::SolidPattern) {
899 attrs[
"background-color"] = QString::fromLatin1(
"rgb(%1,%2,%3)").arg(background.color().red()).arg(background.color().green()).arg(background.color().blue());
902 QBrush foreground = charFormat.foreground();
903 if (foreground.style() == Qt::SolidPattern) {
904 attrs[
"color"] = QString::fromLatin1(
"rgb(%1,%2,%3)").arg(foreground.color().red()).arg(foreground.color().green()).arg(foreground.color().blue());
907 switch (blockFormat.alignment() & (Qt::AlignLeft | Qt::AlignRight | Qt::AlignHCenter | Qt::AlignJustify)) {
909 attrs[
"text-align"] = QStringLiteral(
"left");
912 attrs[
"text-align"] = QStringLiteral(
"right");
914 case Qt::AlignHCenter:
915 attrs[
"text-align"] = QStringLiteral(
"center");
917 case Qt::AlignJustify:
918 attrs[
"text-align"] = QStringLiteral(
"justify");
922 return attrs.toFormatted();
925int QAccessibleTextWidget::cursorPosition()
const
927 return textCursor().position();
930void QAccessibleTextWidget::selection(
int selectionIndex,
int *startOffset,
int *endOffset)
const
932 *startOffset = *endOffset = 0;
933 QTextCursor cursor = textCursor();
935 if (selectionIndex != 0 || !cursor.hasSelection())
938 *startOffset = cursor.selectionStart();
939 *endOffset = cursor.selectionEnd();
942QString QAccessibleTextWidget::text(
int startOffset,
int endOffset)
const
944 QTextCursor cursor(textCursor());
946 cursor.setPosition(startOffset, QTextCursor::MoveAnchor);
947 cursor.setPosition(endOffset, QTextCursor::KeepAnchor);
949 return cursor.selectedText().replace(QChar(QChar::ParagraphSeparator), u'\n');
952QPoint QAccessibleTextWidget::scrollBarPosition()
const
958QString QAccessibleTextWidget::textBeforeOffset(
int offset, QAccessible::TextBoundaryType boundaryType,
959 int *startOffset,
int *endOffset)
const
961 Q_ASSERT(startOffset);
964 QTextCursor cursor = textCursor();
965 cursor.setPosition(offset);
966 std::pair<
int,
int> boundaries = QAccessible::qAccessibleTextBoundaryHelper(cursor, boundaryType);
967 cursor.setPosition(boundaries.first - 1);
968 boundaries = QAccessible::qAccessibleTextBoundaryHelper(cursor, boundaryType);
970 *startOffset = boundaries.first;
971 *endOffset = boundaries.second;
973 return text(boundaries.first, boundaries.second);
977QString QAccessibleTextWidget::textAfterOffset(
int offset, QAccessible::TextBoundaryType boundaryType,
978 int *startOffset,
int *endOffset)
const
980 Q_ASSERT(startOffset);
983 QTextCursor cursor = textCursor();
984 cursor.setPosition(offset);
985 std::pair<
int,
int> boundaries = QAccessible::qAccessibleTextBoundaryHelper(cursor, boundaryType);
986 cursor.setPosition(boundaries.second);
987 boundaries = QAccessible::qAccessibleTextBoundaryHelper(cursor, boundaryType);
989 *startOffset = boundaries.first;
990 *endOffset = boundaries.second;
992 return text(boundaries.first, boundaries.second);
995QString QAccessibleTextWidget::textAtOffset(
int offset, QAccessible::TextBoundaryType boundaryType,
996 int *startOffset,
int *endOffset)
const
998 Q_ASSERT(startOffset);
1001 QTextCursor cursor = textCursor();
1002 cursor.setPosition(offset);
1003 std::pair<
int,
int> boundaries = QAccessible::qAccessibleTextBoundaryHelper(cursor, boundaryType);
1005 *startOffset = boundaries.first;
1006 *endOffset = boundaries.second;
1008 return text(boundaries.first, boundaries.second);
1011void QAccessibleTextWidget::setCursorPosition(
int position)
1013 QTextCursor cursor = textCursor();
1014 cursor.setPosition(position);
1015 setTextCursor(cursor);
1018void QAccessibleTextWidget::addSelection(
int startOffset,
int endOffset)
1020 setSelection(0, startOffset, endOffset);
1023void QAccessibleTextWidget::removeSelection(
int selectionIndex)
1025 if (selectionIndex != 0)
1028 QTextCursor cursor = textCursor();
1029 cursor.clearSelection();
1030 setTextCursor(cursor);
1033void QAccessibleTextWidget::setSelection(
int selectionIndex,
int startOffset,
int endOffset)
1035 if (selectionIndex != 0)
1038 QTextCursor cursor = textCursor();
1039 cursor.setPosition(startOffset, QTextCursor::MoveAnchor);
1040 cursor.setPosition(endOffset, QTextCursor::KeepAnchor);
1041 setTextCursor(cursor);
1044int QAccessibleTextWidget::characterCount()
const
1046 QTextCursor cursor = textCursor();
1047 cursor.movePosition(QTextCursor::End);
1048 return cursor.position();
1051QTextCursor QAccessibleTextWidget::textCursorForRange(
int startOffset,
int endOffset)
const
1053 QTextCursor cursor = textCursor();
1054 cursor.setPosition(startOffset, QTextCursor::MoveAnchor);
1055 cursor.setPosition(endOffset, QTextCursor::KeepAnchor);
1060void QAccessibleTextWidget::deleteText(
int startOffset,
int endOffset)
1062 QTextCursor cursor = textCursorForRange(startOffset, endOffset);
1063 cursor.removeSelectedText();
1066void QAccessibleTextWidget::insertText(
int offset,
const QString &text)
1068 QTextCursor cursor = textCursor();
1069 cursor.setPosition(offset);
1070 cursor.insertText(text);
1073void QAccessibleTextWidget::replaceText(
int startOffset,
int endOffset,
const QString &text)
1075 QTextCursor cursor = textCursorForRange(startOffset, endOffset);
1076 cursor.removeSelectedText();
1077 cursor.insertText(text);
1082#if QT_CONFIG(mainwindow)
1083QAccessibleMainWindow::QAccessibleMainWindow(QWidget *widget)
1084 : QAccessibleWidgetV2(widget, QAccessible::Window) { }
1086QAccessibleInterface *QAccessibleMainWindow::child(
int index)
const
1088 QList<QWidget*> kids = _q_ac_childWidgets(mainWindow());
1089 if (index >= 0 && index < kids.size()) {
1090 return QAccessible::queryAccessibleInterface(kids.at(index));
1095int QAccessibleMainWindow::childCount()
const
1097 QList<QWidget*> kids = _q_ac_childWidgets(mainWindow());
1101int QAccessibleMainWindow::indexOfChild(
const QAccessibleInterface *iface)
const
1103 QList<QWidget*> kids = _q_ac_childWidgets(mainWindow());
1104 return kids.indexOf(
static_cast<QWidget*>(iface->object()));
1107QAccessibleInterface *QAccessibleMainWindow::childAt(
int x,
int y)
const
1109 QWidget *w = widget();
1110 if (!w->isVisible())
1112 QPoint gp = w->mapToGlobal(QPoint(0, 0));
1113 if (!QRect(gp.x(), gp.y(), w->width(), w->height()).contains(x, y))
1116 const QWidgetList kids = _q_ac_childWidgets(mainWindow());
1117 QPoint rp = mainWindow()->mapFromGlobal(QPoint(x, y));
1118 for (QWidget *child : kids) {
1119 if (!child->isWindow() && !child->isHidden() && child->geometry().contains(rp)) {
1120 return QAccessible::queryAccessibleInterface(child);
1126QMainWindow *QAccessibleMainWindow::mainWindow()
const
1128 return qobject_cast<QMainWindow *>(object());