Warning, file /libraries/libqaccessibilityclient/examples/accessibleapps/mainwindow.cpp was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).

0001 /*
0002     SPDX-FileCopyrightText: 2012 Frederik Gladhorn <gladhorn@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0005 */
0006 
0007 #include "mainwindow.h"
0008 
0009 #include <QDialog>
0010 #include <QDockWidget>
0011 #include <QMenuBar>
0012 #include <QPointer>
0013 #include <QSettings>
0014 #include <qurl.h>
0015 #include <QClipboard>
0016 
0017 #include "qaccessibilityclient/registrycache_p.h"
0018 
0019 #include "accessibleproperties.h"
0020 #include "accessibletree.h"
0021 #include "eventview.h"
0022 #include "uiview.h"
0023 
0024 using namespace QAccessibleClient;
0025 
0026 MainWindow::MainWindow(QWidget *parent)
0027     : QMainWindow(parent)
0028 {
0029     setWindowTitle(QLatin1String("Randamizer"));
0030     m_registry = new QAccessibleClient::Registry(this);
0031 
0032     initUi();
0033     initActions();
0034     initMenu();
0035 
0036     QSettings settings(QStringLiteral("kde.org"), QStringLiteral("kdea11yapp"));
0037     QAccessibleClient::RegistryPrivateCacheApi cache(m_registry);
0038     cache.setCacheType(QAccessibleClient::RegistryPrivateCacheApi::CacheType(settings.value(QStringLiteral("cacheStrategy"), cache.cacheType()).toInt()));
0039     restoreGeometry(settings.value(QStringLiteral("geometry")).toByteArray());
0040     restoreState(settings.value(QStringLiteral("windowState")).toByteArray());
0041 
0042     m_eventsWidget->loadSettings(settings);
0043 
0044     connect(m_registry, SIGNAL(added(QAccessibleClient::AccessibleObject)), this, SLOT(added(QAccessibleClient::AccessibleObject)));
0045     connect(m_registry, SIGNAL(removed(QAccessibleClient::AccessibleObject)), this, SLOT(removed(QAccessibleClient::AccessibleObject)));
0046     connect(m_registry, SIGNAL(defunct(QAccessibleClient::AccessibleObject)), this, SLOT(defunct(QAccessibleClient::AccessibleObject)));
0047 
0048     connect(m_registry, SIGNAL(windowCreated(QAccessibleClient::AccessibleObject)), this, SLOT(windowCreated(QAccessibleClient::AccessibleObject)));
0049     connect(m_registry, SIGNAL(windowDestroyed(QAccessibleClient::AccessibleObject)), this, SLOT(windowDestroyed(QAccessibleClient::AccessibleObject)));
0050     connect(m_registry, SIGNAL(windowClosed(QAccessibleClient::AccessibleObject)), this, SLOT(windowClosed(QAccessibleClient::AccessibleObject)));
0051     connect(m_registry, SIGNAL(windowReparented(QAccessibleClient::AccessibleObject)), this, SLOT(windowReparented(QAccessibleClient::AccessibleObject)));
0052     connect(m_registry, SIGNAL(windowMinimized(QAccessibleClient::AccessibleObject)), this, SLOT(windowMinimized(QAccessibleClient::AccessibleObject)));
0053     connect(m_registry, SIGNAL(windowMaximized(QAccessibleClient::AccessibleObject)), this, SLOT(windowMaximized(QAccessibleClient::AccessibleObject)));
0054     connect(m_registry, SIGNAL(windowRestored(QAccessibleClient::AccessibleObject)), this, SLOT(windowRestored(QAccessibleClient::AccessibleObject)));
0055     connect(m_registry, SIGNAL(windowActivated(QAccessibleClient::AccessibleObject)), this, SLOT(windowActivated(QAccessibleClient::AccessibleObject)));
0056     connect(m_registry, SIGNAL(windowDeactivated(QAccessibleClient::AccessibleObject)), this, SLOT(windowDeactivated(QAccessibleClient::AccessibleObject)));
0057     connect(m_registry, SIGNAL(windowDesktopCreated(QAccessibleClient::AccessibleObject)), this, SLOT(windowDesktopCreated(QAccessibleClient::AccessibleObject)));
0058     connect(m_registry, SIGNAL(windowDesktopDestroyed(QAccessibleClient::AccessibleObject)), this, SLOT(windowDesktopDestroyed(QAccessibleClient::AccessibleObject)));
0059     connect(m_registry, SIGNAL(windowRaised(QAccessibleClient::AccessibleObject)), this, SLOT(windowRaised(QAccessibleClient::AccessibleObject)));
0060     connect(m_registry, SIGNAL(windowLowered(QAccessibleClient::AccessibleObject)), this, SLOT(windowLowered(QAccessibleClient::AccessibleObject)));
0061     connect(m_registry, SIGNAL(windowMoved(QAccessibleClient::AccessibleObject)), this, SLOT(windowMoved(QAccessibleClient::AccessibleObject)));
0062     connect(m_registry, SIGNAL(windowResized(QAccessibleClient::AccessibleObject)), this, SLOT(windowResized(QAccessibleClient::AccessibleObject)));
0063     connect(m_registry, SIGNAL(windowShaded(QAccessibleClient::AccessibleObject)), this, SLOT(windowShaded(QAccessibleClient::AccessibleObject)));
0064     connect(m_registry, SIGNAL(windowUnshaded(QAccessibleClient::AccessibleObject)), this, SLOT(windowUnshaded(QAccessibleClient::AccessibleObject)));
0065 
0066     connect(m_registry, SIGNAL(stateChanged(QAccessibleClient::AccessibleObject,QString,bool)), this, SLOT(stateChanged(QAccessibleClient::AccessibleObject,QString,bool)));
0067     connect(m_registry, SIGNAL(childAdded(QAccessibleClient::AccessibleObject,int)), this, SLOT(childAdded(QAccessibleClient::AccessibleObject,int)));
0068     connect(m_registry, SIGNAL(childRemoved(QAccessibleClient::AccessibleObject,int)), this, SLOT(childRemoved(QAccessibleClient::AccessibleObject,int)));
0069     connect(m_registry, SIGNAL(visibleDataChanged(QAccessibleClient::AccessibleObject)), this, SLOT(visibleDataChanged(QAccessibleClient::AccessibleObject)));
0070     connect(m_registry, SIGNAL(selectionChanged(QAccessibleClient::AccessibleObject)), this, SLOT(selectionChanged(QAccessibleClient::AccessibleObject)));
0071     connect(m_registry, SIGNAL(modelChanged(QAccessibleClient::AccessibleObject)), this, SLOT(modelChanged(QAccessibleClient::AccessibleObject)));
0072 
0073     connect(m_registry, SIGNAL(focusChanged(QAccessibleClient::AccessibleObject)), this, SLOT(focusChanged(QAccessibleClient::AccessibleObject)));
0074     connect(m_registry, SIGNAL(textCaretMoved(QAccessibleClient::AccessibleObject,int)), this, SLOT(textCaretMoved(QAccessibleClient::AccessibleObject,int)));
0075     connect(m_registry, SIGNAL(textSelectionChanged(QAccessibleClient::AccessibleObject)), this, SLOT(textSelectionChanged(QAccessibleClient::AccessibleObject)));
0076 
0077     connect(m_registry, SIGNAL(textInserted(QAccessibleClient::AccessibleObject,QString,int,int)), this, SLOT(textInserted(QAccessibleClient::AccessibleObject,QString,int,int)));
0078     connect(m_registry, SIGNAL(textRemoved(QAccessibleClient::AccessibleObject,QString,int,int)), this, SLOT(textRemoved(QAccessibleClient::AccessibleObject,QString,int,int)));
0079     connect(m_registry, SIGNAL(textChanged(QAccessibleClient::AccessibleObject,QString,int,int)), this, SLOT(textChanged(QAccessibleClient::AccessibleObject,QString,int,int)));
0080 
0081     connect(m_registry, SIGNAL(accessibleNameChanged(QAccessibleClient::AccessibleObject)), this, SLOT(accessibleNameChanged(QAccessibleClient::AccessibleObject)));
0082     connect(m_registry, SIGNAL(accessibleDescriptionChanged(QAccessibleClient::AccessibleObject)), this, SLOT(accessibleDescriptionChanged(QAccessibleClient::AccessibleObject)));
0083 
0084     m_registry->subscribeEventListeners(QAccessibleClient::Registry::AllEventListeners);
0085 }
0086 
0087 MainWindow::~MainWindow()
0088 {
0089     delete m_registry;
0090 }
0091 
0092 void MainWindow::MainWindow::closeEvent(QCloseEvent *event)
0093 {
0094     QSettings settings(QStringLiteral("kde.org"), QStringLiteral("kdea11yapp"));
0095     settings.setValue(QStringLiteral("cacheStrategy"), int(QAccessibleClient::RegistryPrivateCacheApi(m_registry).cacheType()));
0096     settings.setValue(QStringLiteral("geometry"), saveGeometry());
0097     settings.setValue(QStringLiteral("windowState"), saveState());
0098 
0099     m_eventsWidget->saveSettings(settings);
0100 
0101     settings.sync();
0102 
0103     QMainWindow::closeEvent(event);
0104 }
0105 
0106 void MainWindow::MainWindow::initActions()
0107 {
0108     m_resetTreeAction = new QAction(this);
0109     m_resetTreeAction->setText(QStringLiteral("Reset Tree"));
0110     m_resetTreeAction->setShortcut(QKeySequence(QKeySequence::Refresh));
0111     connect(m_resetTreeAction, SIGNAL(triggered()), m_accessibleObjectTreeModel, SLOT(resetModel()));
0112 
0113     m_followFocusAction = new QAction(this);
0114     m_followFocusAction->setText(QStringLiteral("Follow Focus"));
0115     m_followFocusAction->setCheckable(true);
0116     m_followFocusAction->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_F));
0117 
0118     m_showClientCacheAction = new QAction(this);
0119     m_showClientCacheAction->setText(QStringLiteral("Cache..."));
0120     connect(m_showClientCacheAction, SIGNAL(triggered()), this, SLOT(showClientCache()));
0121 
0122     m_enableA11yAction = new QAction(this);
0123     m_enableA11yAction->setText(QStringLiteral("Enable Accessibility"));
0124     m_enableA11yAction->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_E));
0125     m_enableA11yAction->setCheckable(true);
0126     m_enableA11yAction->setChecked(m_registry->isEnabled());
0127     connect(m_registry, SIGNAL(enabledChanged(bool)), m_enableA11yAction, SLOT(setChecked(bool)));
0128     connect(m_enableA11yAction, SIGNAL(toggled(bool)), m_registry, SLOT(setEnabled(bool)));
0129 
0130     m_enableScreenReaderAction = new QAction(this);
0131     m_enableScreenReaderAction->setText(QStringLiteral("Enable Screen Reader"));
0132     m_enableScreenReaderAction->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_R));
0133     m_enableScreenReaderAction->setCheckable(true);
0134     m_enableScreenReaderAction->setChecked(m_registry->isScreenReaderEnabled());
0135     connect(m_registry, SIGNAL(screenReaderEnabledChanged(bool)), m_enableScreenReaderAction, SLOT(setChecked(bool)));
0136     connect(m_enableScreenReaderAction, SIGNAL(toggled(bool)), m_registry, SLOT(setScreenReaderEnabled(bool)));
0137 
0138     m_quitAction = new QAction(tr("&Quit"), this);
0139     m_quitAction->setShortcuts(QKeySequence::Quit);
0140     connect(m_quitAction, SIGNAL(triggered()), this, SLOT(close()));
0141 
0142     m_copyValueAction = new QAction(tr("&Copy property value"), this);
0143     m_copyValueAction->setShortcuts(QKeySequence::Copy);
0144     connect(m_copyValueAction, SIGNAL(triggered()), this, SLOT(copyValue()));
0145 }
0146 
0147 void MainWindow::copyValue()
0148 {
0149     QModelIndex selected = m_propertyView->currentIndex();
0150 
0151     if (!selected.isValid())
0152         return;
0153 
0154     if (selected.column() == 0) {
0155         selected = m_propertyView->model()->index(selected.row(), 1, selected.parent());
0156         if (!selected.isValid())
0157             return;
0158     }
0159 
0160     QGuiApplication::clipboard()->setText(selected.data(Qt::DisplayRole).toString());
0161 }
0162 
0163 void MainWindow::MainWindow::initMenu()
0164 {
0165     QMenu *fileMenu = menuBar()->addMenu(QStringLiteral("&Tree"));
0166     fileMenu->addAction(m_resetTreeAction);
0167     fileMenu->addAction(m_followFocusAction);
0168     fileMenu->addSeparator();
0169     fileMenu->addAction(m_quitAction);
0170 
0171     QMenu *editMenu = menuBar()->addMenu(QStringLiteral("&Edit"));
0172     editMenu->addAction(m_copyValueAction);
0173 
0174     QMenu *settingsMenu = menuBar()->addMenu(QStringLiteral("&Settings"));
0175     QMenu *dockerMenu = settingsMenu->addMenu(QStringLiteral("Docker"));
0176     for (const QDockWidget *docker : findChildren<QDockWidget*>()) {
0177         dockerMenu->addAction(docker->toggleViewAction());
0178     }
0179     settingsMenu->addAction(m_showClientCacheAction);
0180     settingsMenu->addSeparator();
0181     settingsMenu->addAction(m_enableA11yAction);
0182     settingsMenu->addAction(m_enableScreenReaderAction);
0183 }
0184 
0185 void MainWindow::MainWindow::initUi()
0186 {
0187     setDockOptions(QMainWindow::AnimatedDocks | QMainWindow::AllowNestedDocks | QMainWindow::AllowTabbedDocks);
0188     //setTabPosition(Qt::AllDockWidgetAreas, QTabWidget::North);
0189 
0190     QDockWidget *treeDocker = new QDockWidget(QStringLiteral("Tree"), this);
0191     treeDocker->setObjectName(QStringLiteral("tree"));
0192     treeDocker->setFeatures(QDockWidget::DockWidgetClosable|QDockWidget::DockWidgetMovable|QDockWidget::DockWidgetFloatable);
0193     m_accessibleObjectTreeView = new QTreeView(treeDocker);
0194     m_accessibleObjectTreeView->setAccessibleName(QStringLiteral("Tree of accessibles"));
0195     m_accessibleObjectTreeView->setAccessibleDescription(QStringLiteral("Displays a hierachical tree of accessible objects"));
0196     m_accessibleObjectTreeView->setSelectionBehavior(QAbstractItemView::SelectRows);
0197     m_accessibleObjectTreeView->setEditTriggers(QAbstractItemView::NoEditTriggers);
0198     m_accessibleObjectTreeView->setAlternatingRowColors(true);
0199     treeDocker->setWidget(m_accessibleObjectTreeView);
0200 
0201     m_accessibleObjectTreeModel = new AccessibleTree(this);
0202     m_accessibleObjectTreeModel->setRegistry(m_registry);
0203     m_accessibleObjectTreeView->setModel(m_accessibleObjectTreeModel);
0204     m_accessibleObjectTreeView->setColumnWidth(0, 240);
0205     m_accessibleObjectTreeView->setContextMenuPolicy(Qt::CustomContextMenu);
0206     connect(m_accessibleObjectTreeView->selectionModel(), SIGNAL(currentChanged(QModelIndex,QModelIndex)), this, SLOT(selectionChanged(QModelIndex,QModelIndex)));
0207     connect(m_accessibleObjectTreeView, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(treeCustomContextMenuRequested(QPoint)));
0208 
0209     QDockWidget *propertyDocker = new QDockWidget(QStringLiteral("&Properties"), this);
0210     propertyDocker->setObjectName(QStringLiteral("properties"));
0211     propertyDocker->setFeatures(QDockWidget::DockWidgetClosable|QDockWidget::DockWidgetMovable|QDockWidget::DockWidgetFloatable);
0212     m_propertyView = new QTreeView(propertyDocker);
0213     propertyDocker->setWidget(m_propertyView);
0214     m_propertyView->setAccessibleName(QStringLiteral("List of properties"));
0215     m_propertyView->setAccessibleDescription(QStringLiteral("Displays a the properties of the selected accessible object"));
0216     m_propertyView->setRootIsDecorated(false);
0217     m_propertyView->setItemsExpandable(true);
0218     m_propertyView->setExpandsOnDoubleClick(false);
0219     m_propertyView->setEditTriggers(QAbstractItemView::DoubleClicked | QAbstractItemView::AnyKeyPressed | QAbstractItemView::EditKeyPressed);
0220     m_propertyModel = new ObjectProperties(this);
0221     m_propertyView->setModel(m_propertyModel);
0222     m_propertyView->setAlternatingRowColors(true);
0223     connect(m_propertyView, SIGNAL(doubleClicked(QModelIndex)), m_propertyModel, SLOT(doubleClicked(QModelIndex)));
0224 
0225     QDockWidget *uiDocker = new QDockWidget(QStringLiteral("&Boundaries"), this);
0226     uiDocker->setObjectName(QStringLiteral("boundaries"));
0227     uiDocker->setFeatures(QDockWidget::DockWidgetClosable|QDockWidget::DockWidgetMovable|QDockWidget::DockWidgetFloatable);
0228     m_uiview = new UiView(uiDocker);
0229     m_uiview->setAccessibleName(QStringLiteral("Boundaries"));
0230     m_uiview->setAccessibleDescription(QStringLiteral("Visualize the component boundaries"));
0231     uiDocker->setWidget(m_uiview);
0232 
0233     QDockWidget *eventsDocker = new QDockWidget(QStringLiteral("E&vents"), this);
0234     eventsDocker->setObjectName(QStringLiteral("events"));
0235     eventsDocker->setFeatures(QDockWidget::DockWidgetClosable|QDockWidget::DockWidgetMovable|QDockWidget::DockWidgetFloatable);
0236     m_eventsWidget = new EventsWidget(m_registry, eventsDocker);
0237     connect(m_eventsWidget, SIGNAL(anchorClicked(QUrl)), this, SLOT(anchorClicked(QUrl)));
0238     eventsDocker->setWidget(m_eventsWidget);
0239 
0240     addDockWidget(Qt::LeftDockWidgetArea, treeDocker);
0241     addDockWidget(Qt::RightDockWidgetArea, propertyDocker);
0242     addDockWidget(Qt::RightDockWidgetArea, uiDocker);
0243     addDockWidget(Qt::RightDockWidgetArea, eventsDocker);
0244     tabifyDockWidget(uiDocker, eventsDocker);
0245     tabifyDockWidget(uiDocker, propertyDocker);
0246 
0247     resize(minimumSize().expandedTo(QSize(760,520)));
0248 }
0249 
0250 void MainWindow::anchorClicked(const QUrl &url)
0251 {
0252     AccessibleObject object = m_registry->accessibleFromUrl(url);
0253     setCurrentObject(object);
0254 }
0255 
0256 void MainWindow::showClientCache()
0257 {
0258     QPointer<ClientCacheDialog> dlg(new ClientCacheDialog(m_registry, this));
0259     dlg->setWindowTitle(m_showClientCacheAction->text());
0260     if (dlg->exec() == QDialog::Accepted && dlg) {
0261     }
0262     if (dlg)
0263         dlg->deleteLater();
0264 }
0265 
0266 void MainWindow::setCurrentObject(const QAccessibleClient::AccessibleObject &object)
0267 {
0268     QModelIndex index = m_accessibleObjectTreeModel->indexForAccessible(object);
0269     if (index.isValid()) {
0270         QModelIndex other = m_accessibleObjectTreeModel->index(index.row(), index.column()+1, index.parent());
0271         Q_ASSERT(other.isValid());
0272         m_accessibleObjectTreeView->selectionModel()->select(QItemSelection(index, other), QItemSelectionModel::SelectCurrent);
0273         m_accessibleObjectTreeView->scrollTo(index);
0274 
0275         // Unlike calling setCurrentIndex the select call aboves doe not emit the selectionChanged signal. So, do explicit.
0276         selectionChanged(index, QModelIndex());
0277     } else {
0278         qWarning() << "No such indexForAccessible=" << object;
0279     }
0280 }
0281 
0282 void MainWindow::updateDetails(const AccessibleObject &object, bool force)
0283 {
0284     if (!force && object != m_propertyModel->currentObject())
0285         return;
0286 
0287     m_propertyModel->setAccessibleObject(object);
0288     for(int r = m_propertyModel->rowCount() - 1; r >= 0; --r)
0289         m_propertyView->setExpanded(m_propertyModel->indexFromItem(m_propertyModel->item(r, 0)), true);
0290     m_propertyView->resizeColumnToContents(0);
0291 }
0292 
0293 void MainWindow::stateChanged(const QAccessibleClient::AccessibleObject &object, const QString &state, bool active)
0294 {
0295     if (state == QLatin1String("focused")) {
0296         m_eventsWidget->addLog(object, EventsWidget::Focus, (active ? QStringLiteral("true") : QStringLiteral("false")));
0297     } else {
0298         QString s = state + QStringLiteral(": ") + (active ? QStringLiteral("true") : QStringLiteral("false"));
0299         m_eventsWidget->addLog(object, EventsWidget::StateChanged, s);
0300     }
0301     updateDetails(object);
0302 }
0303 
0304 void MainWindow::childAdded(const QAccessibleClient::AccessibleObject &object, int childIndex)
0305 {
0306     updateDetails(object);
0307     m_eventsWidget->addLog(object, EventsWidget::Object, QLatin1String("ChildAdded ") + QString::number(childIndex));
0308 }
0309 
0310 void MainWindow::childRemoved(const QAccessibleClient::AccessibleObject &object, int childIndex)
0311 {
0312     updateDetails(object);
0313     m_eventsWidget->addLog(object, EventsWidget::Object, QLatin1String("ChildRemoved ") + QString::number(childIndex));
0314 }
0315 
0316 void MainWindow::visibleDataChanged(const QAccessibleClient::AccessibleObject &object)
0317 {
0318     updateDetails(object);
0319     m_eventsWidget->addLog(object, EventsWidget::Object, QStringLiteral("VisibleDataChanged"));
0320 }
0321 
0322 void MainWindow::selectionChanged(const QAccessibleClient::AccessibleObject &object)
0323 {
0324     updateDetails(object);
0325     m_eventsWidget->addLog(object, EventsWidget::Table, QStringLiteral("SelectionChanged"));
0326 }
0327 
0328 void MainWindow::modelChanged(const QAccessibleClient::AccessibleObject &object)
0329 {
0330     updateDetails(object);
0331     m_eventsWidget->addLog(object, EventsWidget::Table, QStringLiteral("ModelChanged"));
0332 }
0333 
0334 void MainWindow::selectionChanged(const QModelIndex& current, const QModelIndex&)
0335 {
0336     QAccessibleClient::AccessibleObject acc;
0337     if (current.isValid() && current.internalPointer()) {
0338         acc = static_cast<AccessibleWrapper*>(current.internalPointer())->acc;
0339     }
0340     m_uiview->setAccessibleObject(acc);
0341     updateDetails(acc, true);
0342 }
0343 
0344 void MainWindow::treeCustomContextMenuRequested(const QPoint &pos)
0345 {
0346     QModelIndex current = m_accessibleObjectTreeView->currentIndex();
0347     if (!current.isValid())
0348         return;
0349     QAccessibleClient::AccessibleObject acc = static_cast<AccessibleWrapper*>(current.internalPointer())->acc;
0350     QMenu *menu = new QMenu(this);
0351     connect(menu, SIGNAL(aboutToHide()), menu, SLOT(deleteLater()));
0352     for (const QSharedPointer<QAction> &a : acc.actions()) {
0353         menu->addAction(a.data());
0354     }
0355     menu->popup(m_accessibleObjectTreeView->mapToGlobal(pos));
0356 }
0357 
0358 void MainWindow::added(const QAccessibleClient::AccessibleObject &object)
0359 {
0360     m_eventsWidget->addLog(object, EventsWidget::Object, QStringLiteral("Add Object"));
0361     m_accessibleObjectTreeModel->addAccessible(object);
0362 }
0363 
0364 void MainWindow::removed(const QAccessibleClient::AccessibleObject &object)
0365 {
0366     m_eventsWidget->addLog(object, EventsWidget::Object, QStringLiteral("RemoveObject"));
0367     m_accessibleObjectTreeModel->removeAccessible(object);
0368 }
0369 
0370 void MainWindow::defunct(const QAccessibleClient::AccessibleObject &object)
0371 {
0372     removed(object);
0373 }
0374 
0375 void MainWindow::windowCreated(const QAccessibleClient::AccessibleObject &object)
0376 {
0377     m_eventsWidget->addLog(object, EventsWidget::Window, QStringLiteral("Create"));
0378     m_accessibleObjectTreeModel->addAccessible(object);
0379 }
0380 
0381 void MainWindow::windowDestroyed(const QAccessibleClient::AccessibleObject &object)
0382 {
0383     m_eventsWidget->addLog(object, EventsWidget::Window, QStringLiteral("Destroy"));
0384     if (!m_accessibleObjectTreeModel->removeAccessible(object)) {
0385         // assume the app has gone
0386         m_accessibleObjectTreeModel->updateTopLevelApps();
0387     }
0388 }
0389 
0390 void MainWindow::windowClosed(const QAccessibleClient::AccessibleObject &object)
0391 {
0392     m_eventsWidget->addLog(object, EventsWidget::Window, QStringLiteral("WindowClose"));
0393 }
0394 
0395 void MainWindow::windowReparented(const QAccessibleClient::AccessibleObject &object)
0396 {
0397     m_eventsWidget->addLog(object, EventsWidget::Window, QStringLiteral("WindowReparent"));
0398 }
0399 
0400 void MainWindow::windowMinimized(const QAccessibleClient::AccessibleObject &object)
0401 {
0402     m_eventsWidget->addLog(object, EventsWidget::Window, QStringLiteral("WindowMinimize"));
0403 }
0404 
0405 void MainWindow::windowMaximized(const QAccessibleClient::AccessibleObject &object)
0406 {
0407     m_eventsWidget->addLog(object, EventsWidget::Window, QStringLiteral("WindowMaximize"));
0408 }
0409 
0410 void MainWindow::windowRestored(const QAccessibleClient::AccessibleObject &object)
0411 {
0412     m_eventsWidget->addLog(object, EventsWidget::Window, QStringLiteral("WindowRestore"));
0413 }
0414 
0415 void MainWindow::windowActivated(const QAccessibleClient::AccessibleObject &object)
0416 {
0417     m_eventsWidget->addLog(object, EventsWidget::Window, QStringLiteral("WindowActivate"));
0418 }
0419 
0420 void MainWindow::windowDeactivated(const QAccessibleClient::AccessibleObject &object)
0421 {
0422     m_eventsWidget->addLog(object, EventsWidget::Window, QStringLiteral("WindowDeactivate"));
0423 }
0424 
0425 void MainWindow::windowDesktopCreated(const QAccessibleClient::AccessibleObject &object)
0426 {
0427     m_eventsWidget->addLog(object, EventsWidget::Window, QStringLiteral("WindowDesktopCreate"));
0428 }
0429 
0430 void MainWindow::windowDesktopDestroyed(const QAccessibleClient::AccessibleObject &object)
0431 {
0432     m_eventsWidget->addLog(object, EventsWidget::Window, QStringLiteral("WindowDesktopDestroy"));
0433 }
0434 
0435 void MainWindow::windowRaised(const QAccessibleClient::AccessibleObject &object)
0436 {
0437     m_eventsWidget->addLog(object, EventsWidget::Window, QStringLiteral("WindowRaise"));
0438 }
0439 
0440 void MainWindow::windowLowered(const QAccessibleClient::AccessibleObject &object)
0441 {
0442     m_eventsWidget->addLog(object, EventsWidget::Window, QStringLiteral("WindowLower"));
0443 }
0444 
0445 void MainWindow::windowMoved(const QAccessibleClient::AccessibleObject &object)
0446 {
0447     m_eventsWidget->addLog(object, EventsWidget::Window, QStringLiteral("WindowMove"));
0448 }
0449 
0450 void MainWindow::windowResized(const QAccessibleClient::AccessibleObject &object)
0451 {
0452     m_eventsWidget->addLog(object, EventsWidget::Window, QStringLiteral("WindowResize"));
0453 }
0454 
0455 void MainWindow::windowShaded(const QAccessibleClient::AccessibleObject &object)
0456 {
0457     m_eventsWidget->addLog(object, EventsWidget::Window, QStringLiteral("WindowShade"));
0458 }
0459 
0460 void MainWindow::windowUnshaded(const QAccessibleClient::AccessibleObject &object)
0461 {
0462     m_eventsWidget->addLog(object, EventsWidget::Window, QStringLiteral("WindowUnshade"));
0463 }
0464 
0465 void MainWindow::focusChanged(const QAccessibleClient::AccessibleObject &object)
0466 {
0467     if (m_followFocusAction->isChecked()) {
0468         // We need to block the focus for the treeView while setting the current item
0469         // to prevent that setting that item would change focus to the treeView.
0470         Qt::FocusPolicy prevFocusPolicy = m_accessibleObjectTreeView->focusPolicy();
0471         m_accessibleObjectTreeView->setFocusPolicy(Qt::NoFocus);
0472 
0473         setCurrentObject(object);
0474 
0475         m_accessibleObjectTreeView->setFocusPolicy(prevFocusPolicy);
0476     } else {
0477         updateDetails(object);
0478     }
0479 }
0480 
0481 void MainWindow::MainWindow::textCaretMoved(const QAccessibleClient::AccessibleObject &object, int pos)
0482 {
0483     updateDetails(object);
0484     m_eventsWidget->addLog(object, EventsWidget::Text, QStringLiteral("Text caret moved (%1)").arg(pos));
0485 }
0486 
0487 void MainWindow::MainWindow::textSelectionChanged(const QAccessibleClient::AccessibleObject &object)
0488 {
0489     updateDetails(object);
0490     m_eventsWidget->addLog(object, EventsWidget::Text, QStringLiteral("TextSelectionChanged"));
0491 }
0492 
0493 QString descriptionForText(const QString& type, const QString& text, int startOffset, int endOffset)
0494 {
0495     QString shortText = text;
0496     if (shortText.length() > 50) {
0497         shortText.truncate(50);
0498         shortText.append(QLatin1String("..."));
0499     }
0500     QString desc = QStringLiteral("Text %1 (%2, %3): \"%4\"").arg(type).arg(QString::number(startOffset)).arg(QString::number(endOffset)).arg(shortText);
0501     return desc;
0502 }
0503 
0504 void MainWindow::textChanged(const QAccessibleClient::AccessibleObject &object, const QString& text, int startOffset, int endOffset)
0505 {
0506     updateDetails(object);
0507     m_eventsWidget->addLog(object, EventsWidget::Text, descriptionForText(QLatin1String("changed"), text, startOffset, endOffset));
0508 }
0509 
0510 void MainWindow::textInserted(const QAccessibleClient::AccessibleObject &object, const QString& text, int startOffset, int endOffset)
0511 {
0512     updateDetails(object);
0513     m_eventsWidget->addLog(object, EventsWidget::Text, descriptionForText(QLatin1String("inserted"), text, startOffset, endOffset));
0514 }
0515 
0516 void MainWindow::textRemoved(const QAccessibleClient::AccessibleObject &object, const QString& text, int startOffset, int endOffset)
0517 {
0518     updateDetails(object);
0519     m_eventsWidget->addLog(object, EventsWidget::Text, descriptionForText(QLatin1String("removed"), text, startOffset, endOffset));
0520 }
0521 
0522 void MainWindow::accessibleNameChanged(const QAccessibleClient::AccessibleObject &object)
0523 {
0524     updateDetails(object);
0525     m_eventsWidget->addLog(object, EventsWidget::NameChanged);
0526     m_accessibleObjectTreeModel->updateAccessible(object);
0527 }
0528 
0529 void MainWindow::accessibleDescriptionChanged(const QAccessibleClient::AccessibleObject &object)
0530 {
0531     updateDetails(object);
0532     m_eventsWidget->addLog(object, EventsWidget::DescriptionChanged);
0533     m_accessibleObjectTreeModel->updateAccessible(object);
0534 }
0535 
0536 #include "moc_mainwindow.cpp"