6#if QT_CONFIG(abstractbutton)
7#include <qabstractbutton.h>
12#if QT_CONFIG(pushbutton)
13#include <qpushbutton.h>
15#if QT_CONFIG(progressbar)
16#include <qprogressbar.h>
18#if QT_CONFIG(statusbar)
19#include <qstatusbar.h>
21#if QT_CONFIG(radiobutton)
22#include <qradiobutton.h>
24#if QT_CONFIG(toolbutton)
25#include <qtoolbutton.h>
33#if QT_CONFIG(groupbox)
36#if QT_CONFIG(lcdnumber)
37#include <qlcdnumber.h>
39#if QT_CONFIG(lineedit)
41#include <private/qlineedit_p.h>
44#include <QtGui/qpicture.h>
46#if QT_CONFIG(messagebox)
47#include <qmessagebox.h>
50#include <qstyleoption.h>
51#include <qtextdocument.h>
53#include <private/qwindowcontainer_p.h>
54#include <QtCore/qvarlengtharray.h>
55#if QT_CONFIG(accessibility)
56#include <QtGui/private/qaccessiblehelper_p.h>
58#include <QtGui/qvalidator.h>
61#include <qfocusframe.h>
66using namespace Qt::StringLiterals;
68#if QT_CONFIG(accessibility)
70QWidgetList _q_ac_childWidgets(
const QWidget *widget);
72QString qt_accHotKey(
const QString &text);
74#if QT_CONFIG(abstractbutton)
76
77
78
79
80
81
84
85
86QAccessibleButton::QAccessibleButton(QWidget *w)
87: QAccessibleWidgetV2(w)
93 if (button()->isCheckable())
94 addControllingSignal(
"toggled(bool)"_L1);
96 addControllingSignal(
"clicked()"_L1);
100QAbstractButton *QAccessibleButton::button()
const
102 return qobject_cast<QAbstractButton*>(object());
106QString QAccessibleButton::text(QAccessible::Text t)
const
110 case QAccessible::Accelerator:
112#if QT_CONFIG(shortcut) && QT_CONFIG(pushbutton)
113 QPushButton *pb = qobject_cast<QPushButton*>(object());
114 if (pb && pb->isDefault())
115 str = QKeySequence(Qt::Key_Enter).toString(QKeySequence::NativeText);
118 str = qt_accHotKey(button()->text());
121 case QAccessible::Name:
122 str = widget()->accessibleName();
124 str = qt_accStripAmp(button()->text());
130 str = QAccessibleWidgetV2::text(t);
134QAccessible::State QAccessibleButton::state()
const
136 QAccessible::State state = QAccessibleWidgetV2::state();
138 QAbstractButton *b = button();
139#if QT_CONFIG(checkbox)
140 QCheckBox *cb = qobject_cast<QCheckBox *>(b);
142 if (b->isCheckable())
143 state.checkable =
true;
145 state.checked =
true;
146#if QT_CONFIG(checkbox)
147 if (cb && cb->checkState() == Qt::PartiallyChecked)
148 state.checkStateMixed =
true;
151 state.pressed =
true;
152#if QT_CONFIG(pushbutton)
153 QPushButton *pb = qobject_cast<QPushButton*>(b);
156 state.defaultButton =
true;
159 state.hasPopup =
true;
167QRect QAccessibleButton::rect()
const
169 QAbstractButton *ab = button();
170 if (!ab->isVisible())
173#if QT_CONFIG(checkbox)
174 if (QCheckBox *cb = qobject_cast<QCheckBox *>(ab)) {
175 QPoint wpos = cb->mapToGlobal(QPoint(0, 0));
176 QStyleOptionButton opt;
177 cb->initStyleOption(&opt);
178 return cb->style()->subElementRect(QStyle::SE_CheckBoxClickRect, &opt, cb).translated(wpos);
181#if QT_CONFIG(radiobutton)
182 else if (QRadioButton *rb = qobject_cast<QRadioButton *>(ab)) {
183 QPoint wpos = rb->mapToGlobal(QPoint(0, 0));
184 QStyleOptionButton opt;
185 rb->initStyleOption(&opt);
186 return rb->style()->subElementRect(QStyle::SE_RadioButtonClickRect, &opt, rb).translated(wpos);
189 return QAccessibleWidgetV2::rect();
192QAccessible::Role QAccessibleButton::role()
const
194 QAbstractButton *ab = button();
197 if (QPushButton *pb = qobject_cast<QPushButton*>(ab)) {
199 return QAccessible::ButtonMenu;
203 if (ab->isCheckable())
204 return ab->autoExclusive() ? QAccessible::RadioButton : QAccessible::CheckBox;
206 return QAccessible::Button;
209QStringList QAccessibleButton::actionNames()
const
212 if (widget()->isEnabled()) {
214 case QAccessible::ButtonMenu:
215 names << showMenuAction();
217 case QAccessible::RadioButton:
218 names << toggleAction();
221 if (button()->isCheckable())
222 names << toggleAction();
223 names << pressAction();
227 names << QAccessibleWidgetV2::actionNames();
231void QAccessibleButton::doAction(
const QString &actionName)
233 if (!widget()->isEnabled())
235 if (actionName == pressAction() ||
236 actionName == showMenuAction()) {
238 QPushButton *pb = qobject_cast<QPushButton*>(object());
239 if (pb && pb->menu())
243 button()->animateClick();
244 }
else if (actionName == toggleAction()) {
247 QAccessibleWidgetV2::doAction(actionName);
251QStringList QAccessibleButton::keyBindingsForAction(
const QString &actionName)
const
253 if (actionName == pressAction()) {
254#ifndef QT_NO_SHORTCUT
255 return QStringList() << button()->shortcut().toString();
258 return QStringList();
262#if QT_CONFIG(toolbutton)
264
265
266
267
268
269
272
273
274QAccessibleToolButton::QAccessibleToolButton(QWidget *w)
275: QAccessibleButton(w)
277 Q_ASSERT(toolButton());
281QToolButton *QAccessibleToolButton::toolButton()
const
283 return qobject_cast<QToolButton*>(object());
287
288
289bool QAccessibleToolButton::isSplitButton()
const
292 return menu() && toolButton()->popupMode() == QToolButton::MenuButtonPopup;
299QMenu *QAccessibleToolButton::menu()
const
301 if (QMenu *menu = toolButton()->menu())
304 if (QAction *defaultAction = toolButton()->defaultAction())
305 return defaultAction->menu();
311QAccessible::State QAccessibleToolButton::state()
const
313 QAccessible::State st = QAccessibleButton::state();
314 if (toolButton()->autoRaise())
315 st.hotTracked =
true;
323int QAccessibleToolButton::childCount()
const
325 return isSplitButton() ? 1 : 0;
328QAccessible::Role QAccessibleToolButton::role()
const
331 QToolButton *tb = toolButton();
333 return tb->isCheckable() ? QAccessible::CheckBox : QAccessible::PushButton;
334 else if (tb->popupMode() == QToolButton::DelayedPopup)
335 return QAccessible::ButtonDropDown;
338 return QAccessible::ButtonMenu;
341QAccessibleInterface *QAccessibleToolButton::child(
int index)
const
344 if (index == 0 && menu())
345 return QAccessible::queryAccessibleInterface(menu());
353
354
355
356
357
358QStringList QAccessibleToolButton::actionNames()
const
361 if (widget()->isEnabled()) {
363 if (toolButton()->menu())
364 names << showMenuAction();
365 if (toolButton()->popupMode() != QToolButton::InstantPopup)
366 names << QAccessibleButton::actionNames();
372void QAccessibleToolButton::doAction(
const QString &actionName)
374 if (!widget()->isEnabled())
377 if (actionName == pressAction()) {
379 }
else if (actionName == showMenuAction()) {
381 if (toolButton()->popupMode() != QToolButton::InstantPopup) {
382 toolButton()->setDown(
true);
383 toolButton()->showMenu();
387 QAccessibleButton::doAction(actionName);
395
396
397
398
399
400
403
404
405
406QAccessibleDisplay::QAccessibleDisplay(QWidget *w, QAccessible::Role role)
407: QAccessibleWidgetV2(w, role)
411QAccessible::Role QAccessibleDisplay::role()
const
414 QLabel *l = qobject_cast<QLabel*>(object());
416 if (!l->pixmap().isNull())
417 return QAccessible::Graphic;
419 if (!l->picture().isNull())
420 return QAccessible::Graphic;
424 return QAccessible::Animation;
426#if QT_CONFIG(progressbar)
427 }
else if (qobject_cast<QProgressBar*>(object())) {
428 return QAccessible::ProgressBar;
430#if QT_CONFIG(statusbar)
431 }
else if (qobject_cast<QStatusBar*>(object())) {
432 return QAccessible::StatusBar;
436 return QAccessibleWidgetV2::role();
439QAccessible::State QAccessibleDisplay::state()
const
441 QAccessible::State s = QAccessibleWidgetV2::state();
446QString QAccessibleDisplay::text(QAccessible::Text t)
const
450 case QAccessible::Name:
451 str = widget()->accessibleName();
455 }
else if (qobject_cast<QLabel*>(object())) {
456 QLabel *label = qobject_cast<QLabel*>(object());
458#ifndef QT_NO_TEXTHTMLPARSER
459 if (label->textFormat() == Qt::RichText
460 || (label->textFormat() == Qt::AutoText && Qt::mightBeRichText(str))) {
463 str = doc.toPlainText();
466#ifndef QT_NO_SHORTCUT
468 str = qt_accStripAmp(str);
471#if QT_CONFIG(lcdnumber)
472 }
else if (qobject_cast<QLCDNumber*>(object())) {
473 QLCDNumber *l = qobject_cast<QLCDNumber*>(object());
475 str = QString::number(l->value());
477 str = QString::number(l->intValue());
479#if QT_CONFIG(statusbar)
480 }
else if (qobject_cast<QStatusBar*>(object())) {
481 return qobject_cast<QStatusBar*>(object())->currentMessage();
486 case QAccessible::Value:
487#if QT_CONFIG(progressbar)
488 if (qobject_cast<QProgressBar*>(object()))
489 str = QString::number(qobject_cast<QProgressBar*>(object())->value());
496 str = QAccessibleWidgetV2::text(t);
501QList<std::pair<QAccessibleInterface *, QAccessible::Relation>>
502QAccessibleDisplay::relations(QAccessible::Relation match )
const
504 QList<std::pair<QAccessibleInterface *, QAccessible::Relation>> rels =
505 QAccessibleWidgetV2::relations(match);
506# if QT_CONFIG(shortcut) && QT_CONFIG(label)
507 if (match & QAccessible::Labelled) {
508 if (QLabel *label = qobject_cast<QLabel*>(object())) {
509 const QAccessible::Relation rel = QAccessible::Labelled;
510 if (QAccessibleInterface *iface = QAccessible::queryAccessibleInterface(label->buddy()))
511 rels.emplace_back(iface, rel);
518void *QAccessibleDisplay::interface_cast(QAccessible::InterfaceType t)
520 if (t == QAccessible::ImageInterface)
521 return static_cast<QAccessibleImageInterface*>(
this);
522 return QAccessibleWidgetV2::interface_cast(t);
526QString QAccessibleDisplay::imageDescription()
const
528#if QT_CONFIG(tooltip)
529 return widget()->toolTip();
536QSize QAccessibleDisplay::imageSize()
const
539 QLabel *label = qobject_cast<QLabel *>(widget());
544 return label->pixmap().size();
549QPoint QAccessibleDisplay::imagePosition()
const
552 QLabel *label = qobject_cast<QLabel *>(widget());
557 if (label->pixmap().isNull())
560 return QPoint(label->mapToGlobal(label->pos()));
564#if QT_CONFIG(groupbox)
565QAccessibleGroupBox::QAccessibleGroupBox(QWidget *w)
566: QAccessibleWidgetV2(w)
570QGroupBox* QAccessibleGroupBox::groupBox()
const
572 return static_cast<QGroupBox *>(widget());
575QString QAccessibleGroupBox::text(QAccessible::Text t)
const
577 QString txt = QAccessibleWidgetV2::text(t);
581 case QAccessible::Name:
582 txt = qt_accStripAmp(groupBox()->title());
584#if QT_CONFIG(tooltip)
585 case QAccessible::Description:
586 txt = groupBox()->toolTip();
589 case QAccessible::Accelerator:
590 txt = qt_accHotKey(groupBox()->title());
600QAccessible::State QAccessibleGroupBox::state()
const
602 QAccessible::State st = QAccessibleWidgetV2::state();
603 st.checkable = groupBox()->isCheckable();
604 st.checked = groupBox()->isChecked();
608QAccessible::Role QAccessibleGroupBox::role()
const
610 return groupBox()->isCheckable() ? QAccessible::CheckBox : QAccessible::Grouping;
613QList<std::pair<QAccessibleInterface *, QAccessible::Relation>>
614QAccessibleGroupBox::relations(QAccessible::Relation match )
const
616 QList<std::pair<QAccessibleInterface *, QAccessible::Relation>> rels =
617 QAccessibleWidgetV2::relations(match);
619 if ((match & QAccessible::Labelled) && (!groupBox()->title().isEmpty())) {
620 const QList<QWidget*> kids = _q_ac_childWidgets(widget());
621 for (QWidget *kid : kids) {
622 QAccessibleInterface *iface = QAccessible::queryAccessibleInterface(kid);
624 rels.emplace_back(iface, QAccessible::Relation(QAccessible::Labelled));
630QStringList QAccessibleGroupBox::actionNames()
const
632 QStringList actions = QAccessibleWidgetV2::actionNames();
634 if (groupBox()->isCheckable()) {
635 actions.prepend(QAccessibleActionInterface::toggleAction());
640void QAccessibleGroupBox::doAction(
const QString &actionName)
642 if (actionName == QAccessibleActionInterface::toggleAction())
643 groupBox()->setChecked(!groupBox()->isChecked());
646QStringList QAccessibleGroupBox::keyBindingsForAction(
const QString &)
const
648 return QStringList();
653#if QT_CONFIG(lineedit)
655
656
657
658
659
660
663
664
665
666QAccessibleLineEdit::QAccessibleLineEdit(QWidget *w,
const QString &name)
667: QAccessibleWidgetV2(w, QAccessible::EditableText, name)
669 addControllingSignal(
"textChanged(const QString&)"_L1);
670 addControllingSignal(
"returnPressed()"_L1);
674QLineEdit *QAccessibleLineEdit::lineEdit()
const
676 return qobject_cast<QLineEdit*>(object());
679QString QAccessibleLineEdit::text(QAccessible::Text t)
const
683 case QAccessible::Value:
684 str = lineEdit()->displayText();
690 str = QAccessibleWidgetV2::text(t);
691 if (str.isEmpty() && t == QAccessible::Description)
692 str = lineEdit()->placeholderText();
696void QAccessibleLineEdit::setText(QAccessible::Text t,
const QString &text)
698 if (t != QAccessible::Value) {
699 QAccessibleWidgetV2::setText(t, text);
703 QString newText = text;
704#if QT_CONFIG(validator)
705 if (lineEdit()->validator()) {
707 if (lineEdit()->validator()->validate(newText, pos) != QValidator::Acceptable)
711 lineEdit()->setText(newText);
714QAccessible::State QAccessibleLineEdit::state()
const
716 QAccessible::State state = QAccessibleWidgetV2::state();
718 QLineEdit *l = lineEdit();
719 state.editable =
true;
721 state.readOnly =
true;
723 if (l->echoMode() != QLineEdit::Normal)
724 state.passwordEdit =
true;
726 state.selectableText =
true;
730void *QAccessibleLineEdit::interface_cast(QAccessible::InterfaceType t)
732 if (t == QAccessible::TextInterface)
733 return static_cast<QAccessibleTextInterface*>(
this);
734 if (t == QAccessible::EditableTextInterface)
735 return static_cast<QAccessibleEditableTextInterface*>(
this);
736 return QAccessibleWidgetV2::interface_cast(t);
739void QAccessibleLineEdit::addSelection(
int startOffset,
int endOffset)
741 setSelection(0, startOffset, endOffset);
744QString QAccessibleLineEdit::attributes(
int offset,
int *startOffset,
int *endOffset)
const
747 *startOffset = *endOffset = offset;
751int QAccessibleLineEdit::cursorPosition()
const
753 return lineEdit()->cursorPosition();
756QRect QAccessibleLineEdit::characterRect(
int offset)
const
758 int x = lineEdit()->d_func()->control->cursorToX(offset);
759 int y = lineEdit()->textMargins().top();
760 QFontMetrics fm(lineEdit()->font());
761 const QString ch = text(offset, offset + 1);
764 int w = fm.horizontalAdvance(ch);
767 r.moveTo(lineEdit()->mapToGlobal(r.topLeft()));
771int QAccessibleLineEdit::selectionCount()
const
773 return lineEdit()->hasSelectedText() ? 1 : 0;
776int QAccessibleLineEdit::offsetAtPoint(
const QPoint &point)
const
778 QPoint p = lineEdit()->mapFromGlobal(point);
780 return lineEdit()->cursorPositionAt(p);
783void QAccessibleLineEdit::selection(
int selectionIndex,
int *startOffset,
int *endOffset)
const
785 *startOffset = *endOffset = 0;
786 if (selectionIndex != 0)
789 *startOffset = lineEdit()->selectionStart();
790 *endOffset = *startOffset + lineEdit()->selectedText().size();
793QString QAccessibleLineEdit::text(
int startOffset,
int endOffset)
const
795 if (startOffset > endOffset)
798 return lineEdit()->displayText().mid(startOffset, endOffset - startOffset);
801QString QAccessibleLineEdit::textBeforeOffset(
int offset, QAccessible::TextBoundaryType boundaryType,
802 int *startOffset,
int *endOffset)
const
805 offset = cursorPosition();
806 return QAccessibleTextInterface::textBeforeOffset(offset, boundaryType, startOffset, endOffset);
809QString QAccessibleLineEdit::textAfterOffset(
int offset, QAccessible::TextBoundaryType boundaryType,
810 int *startOffset,
int *endOffset)
const
813 offset = cursorPosition();
814 return QAccessibleTextInterface::textAfterOffset(offset, boundaryType, startOffset, endOffset);
817QString QAccessibleLineEdit::textAtOffset(
int offset, QAccessible::TextBoundaryType boundaryType,
818 int *startOffset,
int *endOffset)
const
821 offset = cursorPosition();
822 return QAccessibleTextInterface::textAtOffset(offset, boundaryType, startOffset, endOffset);
825void QAccessibleLineEdit::removeSelection(
int selectionIndex)
827 if (selectionIndex != 0)
830 lineEdit()->deselect();
833void QAccessibleLineEdit::setCursorPosition(
int position)
835 lineEdit()->setCursorPosition(position);
838void QAccessibleLineEdit::setSelection(
int selectionIndex,
int startOffset,
int endOffset)
840 if (selectionIndex != 0)
843 lineEdit()->setSelection(startOffset, endOffset - startOffset);
846int QAccessibleLineEdit::characterCount()
const
848 return lineEdit()->displayText().size();
851void QAccessibleLineEdit::scrollToSubstring(
int startIndex,
int endIndex)
853 lineEdit()->setCursorPosition(endIndex);
854 lineEdit()->setCursorPosition(startIndex);
857void QAccessibleLineEdit::deleteText(
int startOffset,
int endOffset)
859 lineEdit()->setText(lineEdit()->text().remove(startOffset, endOffset - startOffset));
862void QAccessibleLineEdit::insertText(
int offset,
const QString &text)
864 lineEdit()->setText(lineEdit()->text().insert(offset, text));
867void QAccessibleLineEdit::replaceText(
int startOffset,
int endOffset,
const QString &text)
869 lineEdit()->setText(lineEdit()->text().replace(startOffset, endOffset - startOffset, text));
874#if QT_CONFIG(progressbar)
875QAccessibleProgressBar::QAccessibleProgressBar(QWidget *o)
876 : QAccessibleDisplay(o)
878 Q_ASSERT(progressBar());
881void *QAccessibleProgressBar::interface_cast(QAccessible::InterfaceType t)
883 if (t == QAccessible::ValueInterface)
884 return static_cast<QAccessibleValueInterface*>(
this);
885 return QAccessibleDisplay::interface_cast(t);
888QVariant QAccessibleProgressBar::currentValue()
const
890 return progressBar()->value();
893QVariant QAccessibleProgressBar::maximumValue()
const
895 return progressBar()->maximum();
898QVariant QAccessibleProgressBar::minimumValue()
const
900 return progressBar()->minimum();
903QVariant QAccessibleProgressBar::minimumStepSize()
const
908 return (progressBar()->maximum() - progressBar()->minimum()) / 100.0;
911QProgressBar *QAccessibleProgressBar::progressBar()
const
913 return qobject_cast<QProgressBar *>(object());
918QAccessibleWindowContainer::QAccessibleWindowContainer(QWidget *w)
919 : QAccessibleWidgetV2(w)
923int QAccessibleWindowContainer::childCount()
const
925 if (container()->containedWindow() && QAccessible::queryAccessibleInterface(container()->containedWindow()))
930int QAccessibleWindowContainer::indexOfChild(
const QAccessibleInterface *child)
const
932 if (child->object() == container()->containedWindow())
937QAccessibleInterface *QAccessibleWindowContainer::child(
int i)
const
940 return QAccessible::queryAccessibleInterface(container()->containedWindow());
944QWindowContainer *QAccessibleWindowContainer::container()
const
946 return static_cast<QWindowContainer *>(widget());
949#if QT_CONFIG(messagebox)
951
952
953
954QAccessibleMessageBox::QAccessibleMessageBox(QWidget *widget)
955 : QAccessibleWidgetV2(widget, QAccessible::AlertMessage)
957 Q_ASSERT(qobject_cast<QMessageBox *>(widget));
960QMessageBox *QAccessibleMessageBox::messageBox()
const
962 return static_cast<QMessageBox *>(widget());
965QString QAccessibleMessageBox::text(QAccessible::Text t)
const
970 case QAccessible::Name:
971 str = QAccessibleWidgetV2::text(t);
973 str = messageBox()->text();
975 case QAccessible::Value:
976 str = messageBox()->text();
978 case QAccessible::Help:
979 str = messageBox()->informativeText();
982 str = QAccessibleWidgetV2::text(t);