1 /************************************************************************* 2 * 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * Copyright 2000, 2010 Oracle and/or its affiliates. 6 * 7 * OpenOffice.org - a multi-platform office productivity suite 8 * 9 * This file is part of OpenOffice.org. 10 * 11 * OpenOffice.org is free software: you can redistribute it and/or modify 12 * it under the terms of the GNU Lesser General Public License version 3 13 * only, as published by the Free Software Foundation. 14 * 15 * OpenOffice.org is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU Lesser General Public License version 3 for more details 19 * (a copy is included in the LICENSE file that accompanied this code). 20 * 21 * You should have received a copy of the GNU Lesser General Public License 22 * version 3 along with OpenOffice.org. If not, see 23 * <http://www.openoffice.org/license.html> 24 * for a copy of the LGPLv3 License. 25 * 26 ************************************************************************/ 27 28 #include <vos/mutex.hxx> 29 #include <tools/list.hxx> 30 #include <tools/color.hxx> 31 #include <tools/string.hxx> 32 #ifndef _IMAGE_HXX 33 #include <vcl/image.hxx> 34 #endif 35 #include <rtl/uuid.h> 36 #include <comphelper/accessibleselectionhelper.hxx> 37 #include <com/sun/star/accessibility/XAccessibleTable.hpp> 38 39 #include <vector> 40 class SvxShowCharSet; 41 42 namespace svx 43 { 44 typedef ::cppu::ImplHelper1 < ::com::sun::star::accessibility::XAccessible 45 > OAccessibleHelper_Base_2; 46 47 class SvxShowCharSetAcc; 48 /** The class SvxShowCharSetVirtualAcc is used as a virtual class which contains the table and the scrollbar. 49 In the vcl control, the table and the scrollbar exists in one class. This is not feasible for the accessibility api. 50 */ 51 class SvxShowCharSetVirtualAcc : public ::comphelper::OAccessibleComponentHelper, 52 public OAccessibleHelper_Base_2 53 { 54 SvxShowCharSet* mpParent; // the vcl control 55 SvxShowCharSetAcc* m_pTable; // the table, which holds the characters shown by the vcl control 56 ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > m_xAcc; // the ref to the table 57 protected: 58 virtual ~SvxShowCharSetVirtualAcc(); 59 60 virtual void SAL_CALL disposing(); 61 62 virtual ::com::sun::star::awt::Rectangle SAL_CALL implGetBounds( ) throw (::com::sun::star::uno::RuntimeException); 63 public: 64 SvxShowCharSetVirtualAcc( SvxShowCharSet* pParent ); 65 66 // XInterface 67 DECLARE_XINTERFACE( ) 68 DECLARE_XTYPEPROVIDER( ) 69 70 // XAccessibleComponent 71 virtual void SAL_CALL grabFocus( ) throw (::com::sun::star::uno::RuntimeException); 72 virtual ::com::sun::star::uno::Any SAL_CALL getAccessibleKeyBinding( ) throw (::com::sun::star::uno::RuntimeException); 73 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); 74 //OAccessibleContextHelper 75 // XAccessibleContext - still waiting to be overwritten 76 virtual sal_Int32 SAL_CALL getAccessibleChildCount( ) throw (::com::sun::star::uno::RuntimeException); 77 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); 78 virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > SAL_CALL getAccessibleParent( ) throw (::com::sun::star::uno::RuntimeException); 79 virtual sal_Int16 SAL_CALL getAccessibleRole( ) throw (::com::sun::star::uno::RuntimeException); 80 virtual ::rtl::OUString SAL_CALL getAccessibleDescription( ) throw (::com::sun::star::uno::RuntimeException); 81 virtual ::rtl::OUString SAL_CALL getAccessibleName( ) throw (::com::sun::star::uno::RuntimeException); 82 virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessibleRelationSet > SAL_CALL getAccessibleRelationSet( ) throw (::com::sun::star::uno::RuntimeException); 83 virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessibleStateSet > SAL_CALL getAccessibleStateSet( ) throw (::com::sun::star::uno::RuntimeException); 84 85 virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessibleContext > SAL_CALL getAccessibleContext( ) throw (::com::sun::star::uno::RuntimeException) { return this; } 86 virtual sal_Int32 SAL_CALL getForeground( ) throw (::com::sun::star::uno::RuntimeException); 87 virtual sal_Int32 SAL_CALL getBackground( ) throw (::com::sun::star::uno::RuntimeException); 88 89 90 // call the fireEvent method from the table when it exists. 91 void SAL_CALL fireEvent( 92 const sal_Int16 _nEventId, 93 const ::com::sun::star::uno::Any& _rOldValue, 94 const ::com::sun::star::uno::Any& _rNewValue 95 ); 96 97 // simple access methods 98 inline SvxShowCharSetAcc* getTable() const { return m_pTable; } 99 inline SvxShowCharSet* getCharSetControl() const { return mpParent; } 100 }; 101 102 103 class SvxShowCharSetItemAcc; 104 // ---------------- 105 // - SvxShowCharSetItem - 106 // ---------------- 107 /** Simple struct to hold some information about the single items of the table. 108 */ 109 struct SvxShowCharSetItem 110 { 111 SvxShowCharSet& mrParent; 112 sal_uInt16 mnId; 113 XubString maText; 114 Rectangle maRect; 115 SvxShowCharSetItemAcc* m_pItem; 116 SvxShowCharSetAcc* m_pParent; 117 ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > m_xAcc; 118 119 SvxShowCharSetItem( SvxShowCharSet& rParent,SvxShowCharSetAcc* _pParent,sal_uInt16 _nPos ); 120 ~SvxShowCharSetItem(); 121 122 ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > GetAccessible(); 123 void ClearAccessible(); 124 }; 125 126 // ----------------------------------------------------------------------------- 127 128 typedef ::cppu::ImplHelper2 < ::com::sun::star::accessibility::XAccessible, 129 ::com::sun::star::accessibility::XAccessibleTable 130 > OAccessibleHelper_Base; 131 // --------------- 132 // - SvxShowCharSetAcc - 133 // --------------- 134 /** The table implemtentation of the vcl control. 135 */ 136 137 class SvxShowCharSetAcc : public ::comphelper::OAccessibleSelectionHelper, 138 public OAccessibleHelper_Base 139 { 140 ::std::vector< ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > > m_aChildren; 141 SvxShowCharSetVirtualAcc* m_pParent; // the virtual parent 142 protected: 143 virtual void SAL_CALL disposing(); 144 public: 145 SvxShowCharSetAcc( SvxShowCharSetVirtualAcc* _pParent ); 146 147 DECLARE_XINTERFACE( ) 148 DECLARE_XTYPEPROVIDER( ) 149 150 // XAccessibleComponent 151 virtual void SAL_CALL grabFocus( ) throw (::com::sun::star::uno::RuntimeException); 152 virtual ::com::sun::star::uno::Any SAL_CALL getAccessibleKeyBinding( ) throw (::com::sun::star::uno::RuntimeException); 153 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); 154 155 //OAccessibleContextHelper 156 // XAccessibleContext - still waiting to be overwritten 157 virtual sal_Int32 SAL_CALL getAccessibleChildCount( ) throw (::com::sun::star::uno::RuntimeException); 158 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); 159 virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > SAL_CALL getAccessibleParent( ) throw (::com::sun::star::uno::RuntimeException); 160 virtual sal_Int16 SAL_CALL getAccessibleRole( ) throw (::com::sun::star::uno::RuntimeException); 161 virtual ::rtl::OUString SAL_CALL getAccessibleDescription( ) throw (::com::sun::star::uno::RuntimeException); 162 virtual ::rtl::OUString SAL_CALL getAccessibleName( ) throw (::com::sun::star::uno::RuntimeException); 163 virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessibleRelationSet > SAL_CALL getAccessibleRelationSet( ) throw (::com::sun::star::uno::RuntimeException); 164 virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessibleStateSet > SAL_CALL getAccessibleStateSet( ) throw (::com::sun::star::uno::RuntimeException); 165 166 virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessibleContext > SAL_CALL getAccessibleContext( ) throw (::com::sun::star::uno::RuntimeException) { return this; } 167 virtual sal_Int32 SAL_CALL getForeground( ) throw (::com::sun::star::uno::RuntimeException); 168 virtual sal_Int32 SAL_CALL getBackground( ) throw (::com::sun::star::uno::RuntimeException); 169 170 // XAccessibleTable 171 virtual sal_Int32 SAL_CALL getAccessibleRowCount( ) throw (::com::sun::star::uno::RuntimeException); 172 virtual sal_Int32 SAL_CALL getAccessibleColumnCount( ) throw (::com::sun::star::uno::RuntimeException); 173 virtual ::rtl::OUString SAL_CALL getAccessibleRowDescription( sal_Int32 nRow ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException); 174 virtual ::rtl::OUString SAL_CALL getAccessibleColumnDescription( sal_Int32 nColumn ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException); 175 virtual sal_Int32 SAL_CALL getAccessibleRowExtentAt( sal_Int32 nRow, sal_Int32 nColumn ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException); 176 virtual sal_Int32 SAL_CALL getAccessibleColumnExtentAt( sal_Int32 nRow, sal_Int32 nColumn ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException); 177 virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessibleTable > SAL_CALL getAccessibleRowHeaders( ) throw (::com::sun::star::uno::RuntimeException); 178 virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessibleTable > SAL_CALL getAccessibleColumnHeaders( ) throw (::com::sun::star::uno::RuntimeException); 179 virtual ::com::sun::star::uno::Sequence< sal_Int32 > SAL_CALL getSelectedAccessibleRows( ) throw (::com::sun::star::uno::RuntimeException); 180 virtual ::com::sun::star::uno::Sequence< sal_Int32 > SAL_CALL getSelectedAccessibleColumns( ) throw (::com::sun::star::uno::RuntimeException); 181 virtual sal_Bool SAL_CALL isAccessibleRowSelected( sal_Int32 nRow ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException); 182 virtual sal_Bool SAL_CALL isAccessibleColumnSelected( sal_Int32 nColumn ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException); 183 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); 184 virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > SAL_CALL getAccessibleCaption( ) throw (::com::sun::star::uno::RuntimeException); 185 virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > SAL_CALL getAccessibleSummary( ) throw (::com::sun::star::uno::RuntimeException); 186 virtual sal_Bool SAL_CALL isAccessibleSelected( sal_Int32 nRow, sal_Int32 nColumn ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException); 187 virtual sal_Int32 SAL_CALL getAccessibleIndex( sal_Int32 nRow, sal_Int32 nColumn ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException); 188 virtual sal_Int32 SAL_CALL getAccessibleRow( sal_Int32 nChildIndex ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException); 189 virtual sal_Int32 SAL_CALL getAccessibleColumn( sal_Int32 nChildIndex ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException); 190 191 192 inline void SAL_CALL fireEvent( 193 const sal_Int16 _nEventId, 194 const ::com::sun::star::uno::Any& _rOldValue, 195 const ::com::sun::star::uno::Any& _rNewValue 196 ) 197 { 198 NotifyAccessibleEvent(_nEventId,_rOldValue,_rNewValue); 199 } 200 protected: 201 202 virtual ~SvxShowCharSetAcc(); 203 204 // OCommonAccessibleSelection 205 // return if the specified child is visible => watch for special ChildIndexes (ACCESSIBLE_SELECTION_CHILD_xxx) 206 virtual sal_Bool 207 implIsSelected( sal_Int32 nAccessibleChildIndex ) 208 throw (::com::sun::star::uno::RuntimeException); 209 210 // select the specified child => watch for special ChildIndexes (ACCESSIBLE_SELECTION_CHILD_xxx) 211 virtual void 212 implSelect( sal_Int32 nAccessibleChildIndex, sal_Bool bSelect ) 213 throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException); 214 215 // OCommonAccessibleComponent 216 /// implements the calculation of the bounding rectangle - still waiting to be overwritten 217 virtual ::com::sun::star::awt::Rectangle SAL_CALL implGetBounds( ) throw (::com::sun::star::uno::RuntimeException); 218 }; 219 220 // ---------------- 221 // - SvxShowCharSetItemAcc - 222 // ---------------- 223 /** The child implementation of the table. 224 */ 225 class SvxShowCharSetItemAcc : public ::comphelper::OAccessibleComponentHelper, 226 public OAccessibleHelper_Base_2 227 { 228 private: 229 SvxShowCharSetItem* mpParent; 230 protected: 231 virtual ~SvxShowCharSetItemAcc(); 232 233 // OCommonAccessibleComponent 234 /// implements the calculation of the bounding rectangle - still waiting to be overwritten 235 virtual ::com::sun::star::awt::Rectangle SAL_CALL implGetBounds( ) throw (::com::sun::star::uno::RuntimeException); 236 public: 237 238 // XInterface 239 DECLARE_XINTERFACE( ) 240 DECLARE_XTYPEPROVIDER( ) 241 242 SvxShowCharSetItemAcc( SvxShowCharSetItem* pParent ); 243 244 void ParentDestroyed(); 245 246 // XAccessibleComponent 247 virtual void SAL_CALL grabFocus( ) throw (::com::sun::star::uno::RuntimeException); 248 virtual ::com::sun::star::uno::Any SAL_CALL getAccessibleKeyBinding( ) throw (::com::sun::star::uno::RuntimeException); 249 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); 250 251 //OAccessibleContextHelper 252 // XAccessibleContext - still waiting to be overwritten 253 virtual sal_Int32 SAL_CALL getAccessibleChildCount( ) throw (::com::sun::star::uno::RuntimeException); 254 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); 255 virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > SAL_CALL getAccessibleParent( ) throw (::com::sun::star::uno::RuntimeException); 256 virtual sal_Int16 SAL_CALL getAccessibleRole( ) throw (::com::sun::star::uno::RuntimeException); 257 virtual ::rtl::OUString SAL_CALL getAccessibleDescription( ) throw (::com::sun::star::uno::RuntimeException); 258 virtual ::rtl::OUString SAL_CALL getAccessibleName( ) throw (::com::sun::star::uno::RuntimeException); 259 virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessibleRelationSet > SAL_CALL getAccessibleRelationSet( ) throw (::com::sun::star::uno::RuntimeException); 260 virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessibleStateSet > SAL_CALL getAccessibleStateSet( ) throw (::com::sun::star::uno::RuntimeException); 261 262 virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessibleContext > SAL_CALL getAccessibleContext( ) throw (::com::sun::star::uno::RuntimeException) { return this; } 263 264 virtual sal_Int32 SAL_CALL getForeground( ) throw (::com::sun::star::uno::RuntimeException) { return mpParent->m_pParent->getForeground(); } 265 virtual sal_Int32 SAL_CALL getBackground( ) throw (::com::sun::star::uno::RuntimeException) { return mpParent->m_pParent->getBackground(); } 266 267 inline void SAL_CALL fireEvent( 268 const sal_Int16 _nEventId, 269 const ::com::sun::star::uno::Any& _rOldValue, 270 const ::com::sun::star::uno::Any& _rNewValue 271 ) 272 { 273 NotifyAccessibleEvent(_nEventId,_rOldValue,_rNewValue); 274 } 275 }; 276 } 277 278 279