7#if QT_CONFIG(abstractbutton)
8#include <qabstractbutton.h>
10#if QT_CONFIG(checkbox)
13#if QT_CONFIG(pushbutton)
14#include <qpushbutton.h>
16#if QT_CONFIG(progressbar)
17#include <qprogressbar.h>
19#if QT_CONFIG(statusbar)
20#include <qstatusbar.h>
22#if QT_CONFIG(radiobutton)
23#include <qradiobutton.h>
25#if QT_CONFIG(toolbutton)
26#include <qtoolbutton.h>
34#if QT_CONFIG(groupbox)
37#if QT_CONFIG(lcdnumber)
38#include <qlcdnumber.h>
40#if QT_CONFIG(lineedit)
42#include <private/qlineedit_p.h>
45#include <QtGui/qpicture.h>
47#if QT_CONFIG(messagebox)
48#include <qmessagebox.h>
51#include <qstyleoption.h>
52#include <qtextdocument.h>
54#include <private/qwindowcontainer_p.h>
55#include <QtCore/qvarlengtharray.h>
56#if QT_CONFIG(accessibility)
57#include <QtGui/private/qaccessiblehelper_p.h>
59#include <QtGui/qvalidator.h>
62#include <qfocusframe.h>
67using namespace Qt::StringLiterals;
69#if QT_CONFIG(accessibility)
71QWidgetList _q_ac_childWidgets(
const QWidget *widget);
73QString qt_accHotKey(
const QString &text);
75#if QT_CONFIG(abstractbutton)
77
78
79
80
81
82
85
86
87QAccessibleButton::QAccessibleButton(QWidget *w)
88: QAccessibleWidgetV2(w)
94 if (button()->isCheckable())
95 addControllingSignal(
"toggled(bool)"_L1);
97 addControllingSignal(
"clicked()"_L1);
101QAbstractButton *QAccessibleButton::button()
const
103 return qobject_cast<QAbstractButton*>(object());
107QString QAccessibleButton::text(QAccessible::Text t)
const
111 case QAccessible::Accelerator:
113#if QT_CONFIG(shortcut) && QT_CONFIG(pushbutton)
114 QPushButton *pb = qobject_cast<QPushButton*>(object());
115 if (pb && pb->isDefault())
116 str = QKeySequence(Qt::Key_Enter).toString(QKeySequence::NativeText);
119 str = qt_accHotKey(button()->text());
122 case QAccessible::Name:
123 str = widget()->accessibleName();
125 str = qt_accStripAmp(button()->text());
131 str = QAccessibleWidgetV2::text(t);
135QAccessible::State QAccessibleButton::state()
const
137 QAccessible::State state = QAccessibleWidgetV2::state();
139 QAbstractButton *b = button();
140#if QT_CONFIG(checkbox)
141 QCheckBox *cb = qobject_cast<QCheckBox *>(b);
143 if (b->isCheckable())
144 state.checkable =
true;
146 state.checked =
true;
147#if QT_CONFIG(checkbox)
148 if (cb && cb->checkState() == Qt::PartiallyChecked)
149 state.checkStateMixed =
true;
152 state.pressed =
true;
153#if QT_CONFIG(pushbutton)
154 QPushButton *pb = qobject_cast<QPushButton*>(b);
157 state.defaultButton =
true;
160 state.hasPopup =
true;
168QRect QAccessibleButton::rect()
const
170 QAbstractButton *ab = button();
171 if (!ab->isVisible())
174#if QT_CONFIG(checkbox)
175 if (QCheckBox *cb = qobject_cast<QCheckBox *>(ab)) {
176 QPoint wpos = cb->mapToGlobal(QPoint(0, 0));
177 QStyleOptionButton opt;
178 cb->initStyleOption(&opt);
179 return cb->style()->subElementRect(QStyle::SE_CheckBoxClickRect, &opt, cb).translated(wpos);
182#if QT_CONFIG(radiobutton)
183 else if (QRadioButton *rb = qobject_cast<QRadioButton *>(ab)) {
184 QPoint wpos = rb->mapToGlobal(QPoint(0, 0));
185 QStyleOptionButton opt;
186 rb->initStyleOption(&opt);
187 return rb->style()->subElementRect(QStyle::SE_RadioButtonClickRect, &opt, rb).translated(wpos);
190 return QAccessibleWidgetV2::rect();
193QAccessible::Role QAccessibleButton::role()
const
195 QAbstractButton *ab = button();
198 if (QPushButton *pb = qobject_cast<QPushButton*>(ab)) {
200 return QAccessible::ButtonMenu;
204 if (ab->isCheckable())
205 return ab->autoExclusive() ? QAccessible::RadioButton : QAccessible::CheckBox;
207 return QAccessible::Button;
210QStringList QAccessibleButton::actionNames()
const
213 if (widget()->isEnabled()) {
215 case QAccessible::ButtonMenu:
216 names << showMenuAction();
218 case QAccessible::RadioButton:
219 names << toggleAction();
222 if (button()->isCheckable())
223 names << toggleAction();
224 names << pressAction();
228 names << QAccessibleWidgetV2::actionNames();
232void QAccessibleButton::doAction(
const QString &actionName)
234 if (!widget()->isEnabled())
236 if (actionName == pressAction() ||
237 actionName == showMenuAction()) {
239 QPushButton *pb = qobject_cast<QPushButton*>(object());
240 if (pb && pb->menu())
244 button()->animateClick();
245 }
else if (actionName == toggleAction()) {
248 QAccessibleWidgetV2::doAction(actionName);
252QStringList QAccessibleButton::keyBindingsForAction(
const QString &actionName)
const
254 if (actionName == pressAction()) {
255#ifndef QT_NO_SHORTCUT
256 return QStringList() << button()->shortcut().toString();
259 return QStringList();
263#if QT_CONFIG(toolbutton)
265
266
267
268
269
270
273
274
275QAccessibleToolButton::QAccessibleToolButton(QWidget *w)
276: QAccessibleButton(w)
278 Q_ASSERT(toolButton());
282QToolButton *QAccessibleToolButton::toolButton()
const
284 return qobject_cast<QToolButton*>(object());
288
289
290bool QAccessibleToolButton::isSplitButton()
const
293 return menu() && toolButton()->popupMode() == QToolButton::MenuButtonPopup;
300QMenu *QAccessibleToolButton::menu()
const
302 if (QMenu *menu = toolButton()->menu())
305 if (QAction *defaultAction = toolButton()->defaultAction())
306 return defaultAction->menu();
312QAccessible::State QAccessibleToolButton::state()
const
314 QAccessible::State st = QAccessibleButton::state();
315 if (toolButton()->autoRaise())
316 st.hotTracked =
true;
324int QAccessibleToolButton::childCount()
const
326 return isSplitButton() ? 1 : 0;
329QAccessible::Role QAccessibleToolButton::role()
const
332 QToolButton *tb = toolButton();
334 return tb->isCheckable() ? QAccessible::CheckBox : QAccessible::PushButton;
335 else if (tb->popupMode() == QToolButton::DelayedPopup)
336 return QAccessible::ButtonDropDown;
339 return QAccessible::ButtonMenu;
342QAccessibleInterface *QAccessibleToolButton::child(
int index)
const
345 if (index == 0 && menu())
346 return QAccessible::queryAccessibleInterface(menu());
354
355
356
357
358
359QStringList QAccessibleToolButton::actionNames()
const
362 if (widget()->isEnabled()) {
364 if (toolButton()->menu())
365 names << showMenuAction();
366 if (toolButton()->popupMode() != QToolButton::InstantPopup)
367 names << QAccessibleButton::actionNames();
373void QAccessibleToolButton::doAction(
const QString &actionName)
375 if (!widget()->isEnabled())
378 if (actionName == pressAction()) {
380 }
else if (actionName == showMenuAction()) {
382 if (toolButton()->popupMode() != QToolButton::InstantPopup) {
383 toolButton()->setDown(
true);
384 toolButton()->showMenu();
388 QAccessibleButton::doAction(actionName);
396
397
398
399
400
401
404
405
406
407QAccessibleDisplay::QAccessibleDisplay(QWidget *w, QAccessible::Role role)
408: QAccessibleWidgetV2(w, role)
412QAccessible::Role QAccessibleDisplay::role()
const
415 QLabel *l = qobject_cast<QLabel*>(object());
417 if (!l->pixmap().isNull())
418 return QAccessible::Graphic;
420 if (!l->picture().isNull())
421 return QAccessible::Graphic;
425 return QAccessible::Animation;
427#if QT_CONFIG(progressbar)
428 }
else if (qobject_cast<QProgressBar*>(object())) {
429 return QAccessible::ProgressBar;
431#if QT_CONFIG(statusbar)
432 }
else if (qobject_cast<QStatusBar*>(object())) {
433 return QAccessible::StatusBar;
437 return QAccessibleWidgetV2::role();
440QAccessible::State QAccessibleDisplay::state()
const
442 QAccessible::State s = QAccessibleWidgetV2::state();
447QString QAccessibleDisplay::text(QAccessible::Text t)
const
451 case QAccessible::Name:
452 str = widget()->accessibleName();
456 }
else if (qobject_cast<QLabel*>(object())) {
457 QLabel *label = qobject_cast<QLabel*>(object());
459#ifndef QT_NO_TEXTHTMLPARSER
460 if (label->textFormat() == Qt::RichText
461 || (label->textFormat() == Qt::AutoText && Qt::mightBeRichText(str))) {
464 str = doc.toPlainText();
467#ifndef QT_NO_SHORTCUT
469 str = qt_accStripAmp(str);
472#if QT_CONFIG(lcdnumber)
473 }
else if (qobject_cast<QLCDNumber*>(object())) {
474 QLCDNumber *l = qobject_cast<QLCDNumber*>(object());
476 str = QString::number(l->value());
478 str = QString::number(l->intValue());
480#if QT_CONFIG(statusbar)
481 }
else if (qobject_cast<QStatusBar*>(object())) {
482 return qobject_cast<QStatusBar*>(object())->currentMessage();
487 case QAccessible::Value:
488#if QT_CONFIG(progressbar)
489 if (qobject_cast<QProgressBar*>(object()))
490 str = QString::number(qobject_cast<QProgressBar*>(object())->value());
497 str = QAccessibleWidgetV2::text(t);
502QList<std::pair<QAccessibleInterface *, QAccessible::Relation>>
503QAccessibleDisplay::relations(QAccessible::Relation match )
const
505 QList<std::pair<QAccessibleInterface *, QAccessible::Relation>> rels =
506 QAccessibleWidgetV2::relations(match);
507# if QT_CONFIG(shortcut) && QT_CONFIG(label)
508 if (match & QAccessible::Labelled) {
509 if (QLabel *label = qobject_cast<QLabel*>(object())) {
510 const QAccessible::Relation rel = QAccessible::Labelled;
511 if (QAccessibleInterface *iface = QAccessible::queryAccessibleInterface(label->buddy()))
512 rels.emplace_back(iface, rel);
519void *QAccessibleDisplay::interface_cast(QAccessible::InterfaceType t)
521 if (t == QAccessible::ImageInterface)
522 return static_cast<QAccessibleImageInterface*>(
this);
523 return QAccessibleWidgetV2::interface_cast(t);
527QString QAccessibleDisplay::imageDescription()
const
529#if QT_CONFIG(tooltip)
530 return widget()->toolTip();
537QSize QAccessibleDisplay::imageSize()
const
540 QLabel *label = qobject_cast<QLabel *>(widget());
545 return label->pixmap().size();
550QPoint QAccessibleDisplay::imagePosition()
const
553 QLabel *label = qobject_cast<QLabel *>(widget());
558 if (label->pixmap().isNull())
561 return QPoint(label->mapToGlobal(label->pos()));
565#if QT_CONFIG(groupbox)
566QAccessibleGroupBox::QAccessibleGroupBox(QWidget *w)
567: QAccessibleWidgetV2(w)
571QGroupBox* QAccessibleGroupBox::groupBox()
const
573 return static_cast<QGroupBox *>(widget());
576QString QAccessibleGroupBox::text(QAccessible::Text t)
const
578 QString txt = QAccessibleWidgetV2::text(t);
582 case QAccessible::Name:
583 txt = qt_accStripAmp(groupBox()->title());
585#if QT_CONFIG(tooltip)
586 case QAccessible::Description:
587 txt = groupBox()->toolTip();
590 case QAccessible::Accelerator:
591 txt = qt_accHotKey(groupBox()->title());
601QAccessible::State QAccessibleGroupBox::state()
const
603 QAccessible::State st = QAccessibleWidgetV2::state();
604 st.checkable = groupBox()->isCheckable();
605 st.checked = groupBox()->isChecked();
609QAccessible::Role QAccessibleGroupBox::role()
const
611 return groupBox()->isCheckable() ? QAccessible::CheckBox : QAccessible::Grouping;
614QList<std::pair<QAccessibleInterface *, QAccessible::Relation>>
615QAccessibleGroupBox::relations(QAccessible::Relation match )
const
617 QList<std::pair<QAccessibleInterface *, QAccessible::Relation>> rels =
618 QAccessibleWidgetV2::relations(match);
620 if ((match & QAccessible::Labelled) && (!groupBox()->title().isEmpty())) {
621 const QList<QWidget*> kids = _q_ac_childWidgets(widget());
622 for (QWidget *kid : kids) {
623 QAccessibleInterface *iface = QAccessible::queryAccessibleInterface(kid);
625 rels.emplace_back(iface, QAccessible::Relation(QAccessible::Labelled));
631QStringList QAccessibleGroupBox::actionNames()
const
633 QStringList actions = QAccessibleWidgetV2::actionNames();
635 if (groupBox()->isCheckable()) {
636 actions.prepend(QAccessibleActionInterface::toggleAction());
641void QAccessibleGroupBox::doAction(
const QString &actionName)
643 if (actionName == QAccessibleActionInterface::toggleAction())
644 groupBox()->setChecked(!groupBox()->isChecked());
646 QAccessibleWidgetV2::doAction(actionName);
649QStringList QAccessibleGroupBox::keyBindingsForAction(
const QString &)
const
651 return QStringList();
656#if QT_CONFIG(lineedit)
658
659
660
661
662
663
666
667
668
669QAccessibleLineEdit::QAccessibleLineEdit(QWidget *w,
const QString &name)
670: QAccessibleWidgetV2(w, QAccessible::EditableText, name)
672 addControllingSignal(
"textChanged(const QString&)"_L1);
673 addControllingSignal(
"returnPressed()"_L1);
677QLineEdit *QAccessibleLineEdit::lineEdit()
const
679 return qobject_cast<QLineEdit*>(object());
682QString QAccessibleLineEdit::text(QAccessible::Text t)
const
686 case QAccessible::Value:
687 str = lineEdit()->displayText();
693 str = QAccessibleWidgetV2::text(t);
694 if (str.isEmpty() && t == QAccessible::Description)
695 str = lineEdit()->placeholderText();
699void QAccessibleLineEdit::setText(QAccessible::Text t,
const QString &text)
701 if (t != QAccessible::Value) {
702 QAccessibleWidgetV2::setText(t, text);
706 QString newText = text;
707#if QT_CONFIG(validator)
708 if (lineEdit()->validator()) {
710 if (lineEdit()->validator()->validate(newText, pos) != QValidator::Acceptable)
714 lineEdit()->setText(newText);
717QAccessible::State QAccessibleLineEdit::state()
const
719 QAccessible::State state = QAccessibleWidgetV2::state();
721 QLineEdit *l = lineEdit();
722 state.editable =
true;
724 state.readOnly =
true;
726 if (l->echoMode() != QLineEdit::Normal)
727 state.passwordEdit =
true;
729 state.selectableText =
true;
733void *QAccessibleLineEdit::interface_cast(QAccessible::InterfaceType t)
735 if (t == QAccessible::TextInterface)
736 return static_cast<QAccessibleTextInterface*>(
this);
737 if (t == QAccessible::EditableTextInterface)
738 return static_cast<QAccessibleEditableTextInterface*>(
this);
739 return QAccessibleWidgetV2::interface_cast(t);
742void QAccessibleLineEdit::addSelection(
int startOffset,
int endOffset)
744 setSelection(0, startOffset, endOffset);
747QString QAccessibleLineEdit::attributes(
int offset,
int *startOffset,
int *endOffset)
const
750 *startOffset = *endOffset = offset;
754int QAccessibleLineEdit::cursorPosition()
const
756 return lineEdit()->cursorPosition();
759QRect QAccessibleLineEdit::characterRect(
int offset)
const
761 int x = lineEdit()->d_func()->control->cursorToX(offset);
762 int y = lineEdit()->textMargins().top();
763 QFontMetrics fm(lineEdit()->font());
764 const QString ch = text(offset, offset + 1);
767 int w = fm.horizontalAdvance(ch);
770 r.moveTo(lineEdit()->mapToGlobal(r.topLeft()));
774int QAccessibleLineEdit::selectionCount()
const
776 return lineEdit()->hasSelectedText() ? 1 : 0;
779int QAccessibleLineEdit::offsetAtPoint(
const QPoint &point)
const
781 QPoint p = lineEdit()->mapFromGlobal(point);
783 return lineEdit()->cursorPositionAt(p);
786void QAccessibleLineEdit::selection(
int selectionIndex,
int *startOffset,
int *endOffset)
const
788 *startOffset = *endOffset = 0;
789 if (selectionIndex != 0)
792 *startOffset = lineEdit()->selectionStart();
793 *endOffset = *startOffset + lineEdit()->selectedText().size();
796QString QAccessibleLineEdit::text(
int startOffset,
int endOffset)
const
798 if (startOffset > endOffset)
801 return lineEdit()->displayText().mid(startOffset, endOffset - startOffset);
804QString QAccessibleLineEdit::textBeforeOffset(
int offset, QAccessible::TextBoundaryType boundaryType,
805 int *startOffset,
int *endOffset)
const
808 offset = cursorPosition();
809 return QAccessibleTextInterface::textBeforeOffset(offset, boundaryType, startOffset, endOffset);
812QString QAccessibleLineEdit::textAfterOffset(
int offset, QAccessible::TextBoundaryType boundaryType,
813 int *startOffset,
int *endOffset)
const
816 offset = cursorPosition();
817 return QAccessibleTextInterface::textAfterOffset(offset, boundaryType, startOffset, endOffset);
820QString QAccessibleLineEdit::textAtOffset(
int offset, QAccessible::TextBoundaryType boundaryType,
821 int *startOffset,
int *endOffset)
const
824 offset = cursorPosition();
825 return QAccessibleTextInterface::textAtOffset(offset, boundaryType, startOffset, endOffset);
828void QAccessibleLineEdit::removeSelection(
int selectionIndex)
830 if (selectionIndex != 0)
833 lineEdit()->deselect();
836void QAccessibleLineEdit::setCursorPosition(
int position)
838 lineEdit()->setCursorPosition(position);
841void QAccessibleLineEdit::setSelection(
int selectionIndex,
int startOffset,
int endOffset)
843 if (selectionIndex != 0)
846 lineEdit()->setSelection(startOffset, endOffset - startOffset);
849int QAccessibleLineEdit::characterCount()
const
851 return lineEdit()->displayText().size();
854void QAccessibleLineEdit::scrollToSubstring(
int startIndex,
int endIndex)
856 lineEdit()->setCursorPosition(endIndex);
857 lineEdit()->setCursorPosition(startIndex);
860void QAccessibleLineEdit::deleteText(
int startOffset,
int endOffset)
862 lineEdit()->setText(lineEdit()->text().remove(startOffset, endOffset - startOffset));
865void QAccessibleLineEdit::insertText(
int offset,
const QString &text)
867 lineEdit()->setText(lineEdit()->text().insert(offset, text));
870void QAccessibleLineEdit::replaceText(
int startOffset,
int endOffset,
const QString &text)
872 lineEdit()->setText(lineEdit()->text().replace(startOffset, endOffset - startOffset, text));
877#if QT_CONFIG(progressbar)
878QAccessibleProgressBar::QAccessibleProgressBar(QWidget *o)
879 : QAccessibleDisplay(o)
881 Q_ASSERT(progressBar());
884void *QAccessibleProgressBar::interface_cast(QAccessible::InterfaceType t)
886 if (t == QAccessible::ValueInterface)
887 return static_cast<QAccessibleValueInterface*>(
this);
888 return QAccessibleDisplay::interface_cast(t);
891QVariant QAccessibleProgressBar::currentValue()
const
893 return progressBar()->value();
896QVariant QAccessibleProgressBar::maximumValue()
const
898 return progressBar()->maximum();
901QVariant QAccessibleProgressBar::minimumValue()
const
903 return progressBar()->minimum();
906QVariant QAccessibleProgressBar::minimumStepSize()
const
911 return (progressBar()->maximum() - progressBar()->minimum()) / 100.0;
914QProgressBar *QAccessibleProgressBar::progressBar()
const
916 return qobject_cast<QProgressBar *>(object());
921QAccessibleWindowContainer::QAccessibleWindowContainer(QWidget *w)
922 : QAccessibleWidgetV2(w)
926QString QAccessibleWindowContainer::text(QAccessible::Text)
const
931int QAccessibleWindowContainer::childCount()
const
933 if (container()->containedWindow() && QAccessible::queryAccessibleInterface(container()->containedWindow()))
938int QAccessibleWindowContainer::indexOfChild(
const QAccessibleInterface *child)
const
940 if (child->object() == container()->containedWindow())
945QAccessibleInterface *QAccessibleWindowContainer::child(
int i)
const
948 return QAccessible::queryAccessibleInterface(container()->containedWindow());
952QWindowContainer *QAccessibleWindowContainer::container()
const
954 return static_cast<QWindowContainer *>(widget());
957#if QT_CONFIG(messagebox)
959
960
961
962QAccessibleMessageBox::QAccessibleMessageBox(QWidget *widget)
963 : QAccessibleWidgetV2(widget, QAccessible::AlertMessage)
965 Q_ASSERT(qobject_cast<QMessageBox *>(widget));
968QMessageBox *QAccessibleMessageBox::messageBox()
const
970 return static_cast<QMessageBox *>(widget());
973QString QAccessibleMessageBox::text(QAccessible::Text t)
const
978 case QAccessible::Name:
979 str = QAccessibleWidgetV2::text(t);
981 str = messageBox()->text();
983 case QAccessible::Value:
984 str = messageBox()->text();
986 case QAccessible::Help:
987 str = messageBox()->informativeText();
990 str = QAccessibleWidgetV2::text(t);
Combined button and popup list for selecting options.