Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <osl/mutex.hxx>
21 : #include <tools/string.hxx>
22 : #include <vcl/image.hxx>
23 : #include <comphelper/accessibleselectionhelper.hxx>
24 : #include <com/sun/star/accessibility/XAccessibleTable.hpp>
25 :
26 : #include <vector>
27 : class SvxShowCharSet;
28 :
29 : namespace svx
30 : {
31 : typedef ::cppu::ImplHelper1 < ::com::sun::star::accessibility::XAccessible
32 : > OAccessibleHelper_Base_2;
33 :
34 : class SvxShowCharSetAcc;
35 : /** The class SvxShowCharSetVirtualAcc is used as a virtual class which contains the table and the scrollbar.
36 : In the vcl control, the table and the scrollbar exists in one class. This is not feasible for the accessibility api.
37 : */
38 : class SvxShowCharSetVirtualAcc : public ::comphelper::OAccessibleComponentHelper,
39 : public OAccessibleHelper_Base_2
40 : {
41 : SvxShowCharSet* mpParent; // the vcl control
42 : SvxShowCharSetAcc* m_pTable; // the table, which holds the characters shown by the vcl control
43 : ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > m_xAcc; // the ref to the table
44 : protected:
45 : virtual ~SvxShowCharSetVirtualAcc();
46 :
47 : virtual void SAL_CALL disposing();
48 :
49 : virtual ::com::sun::star::awt::Rectangle SAL_CALL implGetBounds( ) throw (::com::sun::star::uno::RuntimeException);
50 : public:
51 : SvxShowCharSetVirtualAcc( SvxShowCharSet* pParent );
52 :
53 : // XInterface
54 : DECLARE_XINTERFACE( )
55 : DECLARE_XTYPEPROVIDER( )
56 :
57 : // XAccessibleComponent
58 : virtual void SAL_CALL grabFocus( ) throw (::com::sun::star::uno::RuntimeException);
59 : virtual ::com::sun::star::uno::Any SAL_CALL getAccessibleKeyBinding( ) throw (::com::sun::star::uno::RuntimeException);
60 : virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > SAL_CALL getAccessibleAtPoint( const ::com::sun::star::awt::Point& aPoint ) throw (::com::sun::star::uno::RuntimeException);
61 : //OAccessibleContextHelper
62 : // XAccessibleContext - still waiting to be overwritten
63 : virtual sal_Int32 SAL_CALL getAccessibleChildCount( ) throw (::com::sun::star::uno::RuntimeException);
64 : virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > SAL_CALL getAccessibleChild( sal_Int32 i ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException);
65 : virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > SAL_CALL getAccessibleParent( ) throw (::com::sun::star::uno::RuntimeException);
66 : virtual sal_Int16 SAL_CALL getAccessibleRole( ) throw (::com::sun::star::uno::RuntimeException);
67 : virtual ::rtl::OUString SAL_CALL getAccessibleDescription( ) throw (::com::sun::star::uno::RuntimeException);
68 : virtual ::rtl::OUString SAL_CALL getAccessibleName( ) throw (::com::sun::star::uno::RuntimeException);
69 : virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessibleRelationSet > SAL_CALL getAccessibleRelationSet( ) throw (::com::sun::star::uno::RuntimeException);
70 : virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessibleStateSet > SAL_CALL getAccessibleStateSet( ) throw (::com::sun::star::uno::RuntimeException);
71 :
72 0 : virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessibleContext > SAL_CALL getAccessibleContext( ) throw (::com::sun::star::uno::RuntimeException) { return this; }
73 : virtual sal_Int32 SAL_CALL getForeground( ) throw (::com::sun::star::uno::RuntimeException);
74 : virtual sal_Int32 SAL_CALL getBackground( ) throw (::com::sun::star::uno::RuntimeException);
75 :
76 :
77 : // call the fireEvent method from the table when it exists.
78 : void SAL_CALL fireEvent(
79 : const sal_Int16 _nEventId,
80 : const ::com::sun::star::uno::Any& _rOldValue,
81 : const ::com::sun::star::uno::Any& _rNewValue
82 : );
83 :
84 : // simple access methods
85 0 : inline SvxShowCharSetAcc* getTable() const { return m_pTable; }
86 0 : inline SvxShowCharSet* getCharSetControl() const { return mpParent; }
87 : };
88 :
89 :
90 : class SvxShowCharSetItemAcc;
91 : // ----------------
92 : // - SvxShowCharSetItem -
93 : // ----------------
94 : /** Simple struct to hold some information about the single items of the table.
95 : */
96 : struct SvxShowCharSetItem
97 : {
98 : SvxShowCharSet& mrParent;
99 : sal_uInt16 mnId;
100 : XubString maText;
101 : Rectangle maRect;
102 : SvxShowCharSetItemAcc* m_pItem;
103 : SvxShowCharSetAcc* m_pParent;
104 : ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > m_xAcc;
105 :
106 : SvxShowCharSetItem( SvxShowCharSet& rParent,SvxShowCharSetAcc* _pParent,sal_uInt16 _nPos );
107 : ~SvxShowCharSetItem();
108 :
109 : ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > GetAccessible();
110 : void ClearAccessible();
111 : };
112 :
113 : // -----------------------------------------------------------------------------
114 :
115 : typedef ::cppu::ImplHelper2 < ::com::sun::star::accessibility::XAccessible,
116 : ::com::sun::star::accessibility::XAccessibleTable
117 : > OAccessibleHelper_Base;
118 : // ---------------
119 : // - SvxShowCharSetAcc -
120 : // ---------------
121 : /** The table implemtentation of the vcl control.
122 : */
123 :
124 : class SvxShowCharSetAcc : public ::comphelper::OAccessibleSelectionHelper,
125 : public OAccessibleHelper_Base
126 : {
127 : ::std::vector< ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > > m_aChildren;
128 : SvxShowCharSetVirtualAcc* m_pParent; // the virtual parent
129 : protected:
130 : virtual void SAL_CALL disposing();
131 : public:
132 : SvxShowCharSetAcc( SvxShowCharSetVirtualAcc* _pParent );
133 :
134 : DECLARE_XINTERFACE( )
135 : DECLARE_XTYPEPROVIDER( )
136 :
137 : // XAccessibleComponent
138 : virtual void SAL_CALL grabFocus( ) throw (::com::sun::star::uno::RuntimeException);
139 : virtual ::com::sun::star::uno::Any SAL_CALL getAccessibleKeyBinding( ) throw (::com::sun::star::uno::RuntimeException);
140 : virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > SAL_CALL getAccessibleAtPoint( const ::com::sun::star::awt::Point& aPoint ) throw (::com::sun::star::uno::RuntimeException);
141 :
142 : //OAccessibleContextHelper
143 : // XAccessibleContext - still waiting to be overwritten
144 : virtual sal_Int32 SAL_CALL getAccessibleChildCount( ) throw (::com::sun::star::uno::RuntimeException);
145 : virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > SAL_CALL getAccessibleChild( sal_Int32 i ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException);
146 : virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > SAL_CALL getAccessibleParent( ) throw (::com::sun::star::uno::RuntimeException);
147 : virtual sal_Int16 SAL_CALL getAccessibleRole( ) throw (::com::sun::star::uno::RuntimeException);
148 : virtual ::rtl::OUString SAL_CALL getAccessibleDescription( ) throw (::com::sun::star::uno::RuntimeException);
149 : virtual ::rtl::OUString SAL_CALL getAccessibleName( ) throw (::com::sun::star::uno::RuntimeException);
150 : virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessibleRelationSet > SAL_CALL getAccessibleRelationSet( ) throw (::com::sun::star::uno::RuntimeException);
151 : virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessibleStateSet > SAL_CALL getAccessibleStateSet( ) throw (::com::sun::star::uno::RuntimeException);
152 :
153 0 : virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessibleContext > SAL_CALL getAccessibleContext( ) throw (::com::sun::star::uno::RuntimeException) { return this; }
154 : virtual sal_Int32 SAL_CALL getForeground( ) throw (::com::sun::star::uno::RuntimeException);
155 : virtual sal_Int32 SAL_CALL getBackground( ) throw (::com::sun::star::uno::RuntimeException);
156 :
157 : // XAccessibleTable
158 : virtual sal_Int32 SAL_CALL getAccessibleRowCount( ) throw (::com::sun::star::uno::RuntimeException);
159 : virtual sal_Int32 SAL_CALL getAccessibleColumnCount( ) throw (::com::sun::star::uno::RuntimeException);
160 : virtual ::rtl::OUString SAL_CALL getAccessibleRowDescription( sal_Int32 nRow ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException);
161 : virtual ::rtl::OUString SAL_CALL getAccessibleColumnDescription( sal_Int32 nColumn ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException);
162 : virtual sal_Int32 SAL_CALL getAccessibleRowExtentAt( sal_Int32 nRow, sal_Int32 nColumn ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException);
163 : virtual sal_Int32 SAL_CALL getAccessibleColumnExtentAt( sal_Int32 nRow, sal_Int32 nColumn ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException);
164 : virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessibleTable > SAL_CALL getAccessibleRowHeaders( ) throw (::com::sun::star::uno::RuntimeException);
165 : virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessibleTable > SAL_CALL getAccessibleColumnHeaders( ) throw (::com::sun::star::uno::RuntimeException);
166 : virtual ::com::sun::star::uno::Sequence< sal_Int32 > SAL_CALL getSelectedAccessibleRows( ) throw (::com::sun::star::uno::RuntimeException);
167 : virtual ::com::sun::star::uno::Sequence< sal_Int32 > SAL_CALL getSelectedAccessibleColumns( ) throw (::com::sun::star::uno::RuntimeException);
168 : virtual sal_Bool SAL_CALL isAccessibleRowSelected( sal_Int32 nRow ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException);
169 : virtual sal_Bool SAL_CALL isAccessibleColumnSelected( sal_Int32 nColumn ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException);
170 : virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > SAL_CALL getAccessibleCellAt( sal_Int32 nRow, sal_Int32 nColumn ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException);
171 : virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > SAL_CALL getAccessibleCaption( ) throw (::com::sun::star::uno::RuntimeException);
172 : virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > SAL_CALL getAccessibleSummary( ) throw (::com::sun::star::uno::RuntimeException);
173 : virtual sal_Bool SAL_CALL isAccessibleSelected( sal_Int32 nRow, sal_Int32 nColumn ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException);
174 : virtual sal_Int32 SAL_CALL getAccessibleIndex( sal_Int32 nRow, sal_Int32 nColumn ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException);
175 : virtual sal_Int32 SAL_CALL getAccessibleRow( sal_Int32 nChildIndex ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException);
176 : virtual sal_Int32 SAL_CALL getAccessibleColumn( sal_Int32 nChildIndex ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException);
177 :
178 :
179 0 : inline void SAL_CALL fireEvent(
180 : const sal_Int16 _nEventId,
181 : const ::com::sun::star::uno::Any& _rOldValue,
182 : const ::com::sun::star::uno::Any& _rNewValue
183 : )
184 : {
185 0 : NotifyAccessibleEvent(_nEventId,_rOldValue,_rNewValue);
186 0 : }
187 : protected:
188 :
189 : virtual ~SvxShowCharSetAcc();
190 :
191 : // OCommonAccessibleSelection
192 : // return if the specified child is visible => watch for special ChildIndexes (ACCESSIBLE_SELECTION_CHILD_xxx)
193 : virtual sal_Bool
194 : implIsSelected( sal_Int32 nAccessibleChildIndex )
195 : throw (::com::sun::star::uno::RuntimeException);
196 :
197 : // select the specified child => watch for special ChildIndexes (ACCESSIBLE_SELECTION_CHILD_xxx)
198 : virtual void
199 : implSelect( sal_Int32 nAccessibleChildIndex, sal_Bool bSelect )
200 : throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException);
201 :
202 : // OCommonAccessibleComponent
203 : /// implements the calculation of the bounding rectangle - still waiting to be overwritten
204 : virtual ::com::sun::star::awt::Rectangle SAL_CALL implGetBounds( ) throw (::com::sun::star::uno::RuntimeException);
205 : };
206 :
207 : // ----------------
208 : // - SvxShowCharSetItemAcc -
209 : // ----------------
210 : /** The child implementation of the table.
211 : */
212 : class SvxShowCharSetItemAcc : public ::comphelper::OAccessibleComponentHelper,
213 : public OAccessibleHelper_Base_2
214 : {
215 : private:
216 : SvxShowCharSetItem* mpParent;
217 : protected:
218 : virtual ~SvxShowCharSetItemAcc();
219 :
220 : // OCommonAccessibleComponent
221 : /// implements the calculation of the bounding rectangle - still waiting to be overwritten
222 : virtual ::com::sun::star::awt::Rectangle SAL_CALL implGetBounds( ) throw (::com::sun::star::uno::RuntimeException);
223 : public:
224 :
225 : // XInterface
226 : DECLARE_XINTERFACE( )
227 : DECLARE_XTYPEPROVIDER( )
228 :
229 : SvxShowCharSetItemAcc( SvxShowCharSetItem* pParent );
230 :
231 : void ParentDestroyed();
232 :
233 : // XAccessibleComponent
234 : virtual void SAL_CALL grabFocus( ) throw (::com::sun::star::uno::RuntimeException);
235 : virtual ::com::sun::star::uno::Any SAL_CALL getAccessibleKeyBinding( ) throw (::com::sun::star::uno::RuntimeException);
236 : virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > SAL_CALL getAccessibleAtPoint( const ::com::sun::star::awt::Point& aPoint ) throw (::com::sun::star::uno::RuntimeException);
237 :
238 : //OAccessibleContextHelper
239 : // XAccessibleContext - still waiting to be overwritten
240 : virtual sal_Int32 SAL_CALL getAccessibleChildCount( ) throw (::com::sun::star::uno::RuntimeException);
241 : virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > SAL_CALL getAccessibleChild( sal_Int32 i ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException);
242 : virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > SAL_CALL getAccessibleParent( ) throw (::com::sun::star::uno::RuntimeException);
243 : virtual sal_Int16 SAL_CALL getAccessibleRole( ) throw (::com::sun::star::uno::RuntimeException);
244 : virtual ::rtl::OUString SAL_CALL getAccessibleDescription( ) throw (::com::sun::star::uno::RuntimeException);
245 : virtual ::rtl::OUString SAL_CALL getAccessibleName( ) throw (::com::sun::star::uno::RuntimeException);
246 : virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessibleRelationSet > SAL_CALL getAccessibleRelationSet( ) throw (::com::sun::star::uno::RuntimeException);
247 : virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessibleStateSet > SAL_CALL getAccessibleStateSet( ) throw (::com::sun::star::uno::RuntimeException);
248 :
249 0 : virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessibleContext > SAL_CALL getAccessibleContext( ) throw (::com::sun::star::uno::RuntimeException) { return this; }
250 :
251 0 : virtual sal_Int32 SAL_CALL getForeground( ) throw (::com::sun::star::uno::RuntimeException) { return mpParent->m_pParent->getForeground(); }
252 0 : virtual sal_Int32 SAL_CALL getBackground( ) throw (::com::sun::star::uno::RuntimeException) { return mpParent->m_pParent->getBackground(); }
253 :
254 0 : inline void SAL_CALL fireEvent(
255 : const sal_Int16 _nEventId,
256 : const ::com::sun::star::uno::Any& _rOldValue,
257 : const ::com::sun::star::uno::Any& _rNewValue
258 : )
259 : {
260 0 : NotifyAccessibleEvent(_nEventId,_rOldValue,_rNewValue);
261 0 : }
262 : };
263 : }
264 :
265 :
266 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|