1 /*
2  * SPDX-FileCopyrightText: 2012 Amandeep Singh <aman.dedman@gmail.com>
3  *
4  * SPDX-License-Identifier: GPL-2.0-or-later
5  */
6 
7 #ifndef KITEMLISTVIEWACCESSIBLE_H
8 #define KITEMLISTVIEWACCESSIBLE_H
9 
10 #ifndef QT_NO_ACCESSIBILITY
11 
12 #include "dolphin_export.h"
13 
14 #include <QAccessible>
15 #include <QAccessibleObject>
16 #include <QAccessibleWidget>
17 #include <QPointer>
18 
19 class KItemListView;
20 class KItemListContainer;
21 
22 class DOLPHIN_EXPORT KItemListViewAccessible: public QAccessibleObject, public QAccessibleTableInterface
23 {
24 public:
25     explicit KItemListViewAccessible(KItemListView* view);
26     ~KItemListViewAccessible() override;
27 
28     void* interface_cast(QAccessible::InterfaceType type) override;
29 
30     QAccessible::Role role() const override;
31     QAccessible::State state() const override;
32     QString text(QAccessible::Text t) const override;
33     QRect rect() const override;
34 
35     QAccessibleInterface* child(int index) const override;
36     int childCount() const override;
37     int indexOfChild(const QAccessibleInterface*) const override;
38     QAccessibleInterface* childAt(int x, int y) const override;
39     QAccessibleInterface* parent() const override;
40 
41     // Table interface
42     QAccessibleInterface* cellAt(int row, int column) const override;
43     QAccessibleInterface* caption() const override;
44     QAccessibleInterface* summary() const override;
45     QString columnDescription(int column) const override;
46     QString rowDescription(int row) const override;
47     int columnCount() const override;
48     int rowCount() const override;
49 
50     // Selection
51     int selectedCellCount() const override;
52     int selectedColumnCount() const override;
53     int selectedRowCount() const override;
54     QList<QAccessibleInterface*> selectedCells() const override;
55     QList<int> selectedColumns() const override;
56     QList<int> selectedRows() const override;
57     bool isColumnSelected(int column) const override;
58     bool isRowSelected(int row) const override;
59     bool selectRow(int row) override;
60     bool selectColumn(int column) override;
61     bool unselectRow(int row) override;
62     bool unselectColumn(int column) override;
63     void modelChange(QAccessibleTableModelChangeEvent*) override;
64 
65     KItemListView* view() const;
66 
67 protected:
68     virtual void modelReset();
69     /**
70      * Create an QAccessibleTableCellInterface representing the table
71      * cell at the @index. Index is 0-based.
72      */
73     inline QAccessibleInterface* cell(int index) const;
74 
75 private:
76     class AccessibleIdWrapper {
77     public:
78         AccessibleIdWrapper();
79         bool isValid;
80         QAccessible::Id id;
81     };
82     mutable QVector<AccessibleIdWrapper> m_cells;
83 };
84 
85 class DOLPHIN_EXPORT KItemListAccessibleCell: public QAccessibleInterface, public QAccessibleTableCellInterface
86 {
87 public:
88     KItemListAccessibleCell(KItemListView* view, int m_index);
89 
90     void* interface_cast(QAccessible::InterfaceType type) override;
91     QObject* object() const override;
92     bool isValid() const override;
93     QAccessible::Role role() const override;
94     QAccessible::State state() const override;
95     QRect rect() const override;
96     QString text(QAccessible::Text t) const override;
97     void setText(QAccessible::Text t, const QString& text) override;
98 
99     QAccessibleInterface* child(int index) const override;
100     int childCount() const override;
101     QAccessibleInterface* childAt(int x, int y) const override;
102     int indexOfChild(const QAccessibleInterface*) const override;
103 
104     QAccessibleInterface* parent() const override;
105     bool isExpandable() const;
106 
107     // Cell Interface
108     int columnExtent() const override;
109     QList<QAccessibleInterface*> columnHeaderCells() const override;
110     int columnIndex() const override;
111     int rowExtent() const override;
112     QList<QAccessibleInterface*> rowHeaderCells() const override;
113     int rowIndex() const override;
114     bool isSelected() const override;
115     QAccessibleInterface* table() const override;
116 
117     inline int index() const;
118 
119 private:
120     QPointer<KItemListView> m_view;
121     int m_index;
122 };
123 
124 class DOLPHIN_EXPORT KItemListContainerAccessible : public QAccessibleWidget
125 {
126 public:
127     explicit KItemListContainerAccessible(KItemListContainer* container);
128     ~KItemListContainerAccessible() override;
129 
130     QAccessibleInterface* child(int index) const override;
131     int childCount() const override;
132     int indexOfChild(const QAccessibleInterface* child) const override;
133 
134 private:
135     const KItemListContainer* container() const;
136 };
137 
138 #endif // QT_NO_ACCESSIBILITY
139 
140 #endif
141