xref: /trunk/main/accessibility/source/extended/AccessibleBrowseBoxTableCell.cxx (revision 1ecadb572e7010ff3b3382ad9bf179dbc6efadbb)
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 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_accessibility.hxx"
30 
31 #include "accessibility/extended/AccessibleBrowseBoxTableCell.hxx"
32 #include <svtools/accessibletableprovider.hxx>
33 #include "accessibility/extended/AccessibleBrowseBox.hxx"
34 #include <tools/gen.hxx>
35 #include <toolkit/helper/vclunohelper.hxx>
36 #include <com/sun/star/accessibility/AccessibleEventId.hpp>
37 
38 namespace accessibility
39 {
40     namespace
41     {
42         void checkIndex_Impl( sal_Int32 _nIndex, const ::rtl::OUString& _sText ) throw (::com::sun::star::lang::IndexOutOfBoundsException)
43         {
44             if ( _nIndex >= _sText.getLength() )
45                 throw ::com::sun::star::lang::IndexOutOfBoundsException();
46         }
47 
48         sal_Int32 getIndex_Impl( sal_Int32 _nRow, sal_uInt16 _nColumn, sal_uInt16 _nColumnCount )
49         {
50             return _nRow * _nColumnCount + _nColumn;
51         }
52     }
53     using namespace ::com::sun::star::lang;
54     using namespace utl;
55     using namespace comphelper;
56     using ::rtl::OUString;
57     using ::accessibility::AccessibleBrowseBox;
58     using namespace ::com::sun::star::uno;
59     using ::com::sun::star::accessibility::XAccessible;
60     using namespace ::com::sun::star::accessibility;
61     using namespace ::svt;
62 
63 
64     // implementation of a table cell
65     ::rtl::OUString AccessibleBrowseBoxTableCell::implGetText()
66     {
67         ensureIsAlive();
68         return mpBrowseBox->GetAccessibleCellText( getRowPos(), static_cast< sal_uInt16 >( getColumnPos() ) );
69     }
70 
71     ::com::sun::star::lang::Locale AccessibleBrowseBoxTableCell::implGetLocale()
72     {
73         ensureIsAlive();
74         return mpBrowseBox->GetAccessible()->getAccessibleContext()->getLocale();
75     }
76 
77     void AccessibleBrowseBoxTableCell::implGetSelection( sal_Int32& nStartIndex, sal_Int32& nEndIndex )
78     {
79         nStartIndex = 0;
80         nEndIndex = 0;
81     }
82 
83     AccessibleBrowseBoxTableCell::AccessibleBrowseBoxTableCell(const Reference<XAccessible >& _rxParent,
84                                 IAccessibleTableProvider& _rBrowseBox,
85                                 const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindow >& _xFocusWindow,
86                                 sal_Int32 _nRowPos,
87                                 sal_uInt16 _nColPos,
88                                 sal_Int32 _nOffset )
89         :AccessibleBrowseBoxCell( _rxParent, _rBrowseBox, _xFocusWindow, _nRowPos, _nColPos )
90     {
91         m_nOffset = ( OFFSET_DEFAULT == _nOffset ) ? (sal_Int32)BBINDEX_FIRSTCONTROL : _nOffset;
92         sal_Int32 nIndex = getIndex_Impl( _nRowPos, _nColPos, _rBrowseBox.GetColumnCount() );
93        setAccessibleName( _rBrowseBox.GetAccessibleObjectName( BBTYPE_TABLECELL, nIndex ) );
94        setAccessibleDescription( _rBrowseBox.GetAccessibleObjectDescription( BBTYPE_TABLECELL, nIndex ) );
95         // Need to register as event listener
96         Reference< XComponent > xComponent(_rxParent, UNO_QUERY);
97         if( xComponent.is() )
98             xComponent->addEventListener(static_cast< XEventListener *> (this));
99     }
100 
101     void AccessibleBrowseBoxTableCell::nameChanged( const ::rtl::OUString& rNewName, const ::rtl::OUString& rOldName )
102     {
103         implSetName( rNewName );
104         Any aOldValue, aNewValue;
105         aOldValue <<= rOldName;
106         aNewValue <<= rNewName;
107         commitEvent( AccessibleEventId::NAME_CHANGED, aOldValue, aNewValue );
108     }
109 
110     // XInterface -------------------------------------------------------------
111 
112     /** Queries for a new interface. */
113     ::com::sun::star::uno::Any SAL_CALL AccessibleBrowseBoxTableCell::queryInterface(
114             const ::com::sun::star::uno::Type& rType )
115         throw ( ::com::sun::star::uno::RuntimeException )
116     {
117         Any aRet = AccessibleBrowseBoxCell::queryInterface(rType);
118         if ( !aRet.hasValue() )
119             aRet = AccessibleTextHelper_BASE::queryInterface(rType);
120         return aRet;
121     }
122 
123     /** Aquires the object (calls acquire() on base class). */
124     void SAL_CALL AccessibleBrowseBoxTableCell::acquire() throw ()
125     {
126         AccessibleBrowseBoxCell::acquire();
127     }
128 
129     /** Releases the object (calls release() on base class). */
130     void SAL_CALL AccessibleBrowseBoxTableCell::release() throw ()
131     {
132         AccessibleBrowseBoxCell::release();
133     }
134 
135     ::com::sun::star::awt::Rectangle SAL_CALL AccessibleBrowseBoxTableCell::getCharacterBounds( sal_Int32 nIndex ) throw (IndexOutOfBoundsException, RuntimeException)
136     {
137         BBSolarGuard aSolarGuard;
138         ::osl::MutexGuard aGuard( getOslMutex() );
139 
140         ensureIsAlive();
141         if ( !implIsValidIndex( nIndex, implGetText().getLength() ) )
142             throw IndexOutOfBoundsException();
143 
144         ::com::sun::star::awt::Rectangle aRect;
145 
146         if ( mpBrowseBox )
147         {
148             aRect = AWTRectangle( mpBrowseBox->GetFieldCharacterBounds( getRowPos(), getColumnPos(), nIndex ) );
149         }
150 
151         return aRect;
152     }
153 
154     sal_Int32 SAL_CALL AccessibleBrowseBoxTableCell::getIndexAtPoint( const ::com::sun::star::awt::Point& _aPoint ) throw (RuntimeException)
155     {
156         //! TODO CTL bidi
157         // DBG_ASSERT(0,"Need to be done by base class!");
158         BBSolarGuard aSolarGuard;
159         ::osl::MutexGuard aGuard( getOslMutex() );
160         ensureIsAlive();
161 
162         return mpBrowseBox->GetFieldIndexAtPoint( getRowPos(), getColumnPos(), VCLPoint( _aPoint ) );
163     }
164 
165     /** @return
166             The name of this class.
167     */
168     ::rtl::OUString SAL_CALL AccessibleBrowseBoxTableCell::getImplementationName()
169         throw ( ::com::sun::star::uno::RuntimeException )
170     {
171         return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.svtools.AccessibleBrowseBoxTableCell" ) );
172     }
173 
174     /** @return  The count of visible children. */
175     sal_Int32 SAL_CALL AccessibleBrowseBoxTableCell::getAccessibleChildCount()
176         throw ( ::com::sun::star::uno::RuntimeException )
177     {
178         return 0;
179     }
180 
181     /** @return  The XAccessible interface of the specified child. */
182     ::com::sun::star::uno::Reference<
183         ::com::sun::star::accessibility::XAccessible > SAL_CALL
184         AccessibleBrowseBoxTableCell::getAccessibleChild( sal_Int32 )
185             throw ( ::com::sun::star::lang::IndexOutOfBoundsException,
186                     ::com::sun::star::uno::RuntimeException )
187     {
188         throw ::com::sun::star::lang::IndexOutOfBoundsException();
189     }
190 
191     /** Creates a new AccessibleStateSetHelper and fills it with states of the
192         current object.
193         @return
194             A filled AccessibleStateSetHelper.
195     */
196     ::utl::AccessibleStateSetHelper* AccessibleBrowseBoxTableCell::implCreateStateSetHelper()
197     {
198         BBSolarGuard aSolarGuard;
199         ::osl::MutexGuard aGuard( getOslMutex() );
200 
201         ::utl::AccessibleStateSetHelper* pStateSetHelper = new ::utl::AccessibleStateSetHelper;
202 
203         if( isAlive() )
204         {
205             // SHOWING done with mxParent
206             if( implIsShowing() )
207                 pStateSetHelper->AddState( AccessibleStateType::SHOWING );
208 
209             mpBrowseBox->FillAccessibleStateSetForCell( *pStateSetHelper, getRowPos(), static_cast< sal_uInt16 >( getColumnPos() ) );
210         }
211         else
212             pStateSetHelper->AddState( AccessibleStateType::DEFUNC );
213 
214         return pStateSetHelper;
215     }
216 
217 
218     // XAccessible ------------------------------------------------------------
219 
220     /** @return  The XAccessibleContext interface of this object. */
221     Reference< XAccessibleContext > SAL_CALL AccessibleBrowseBoxTableCell::getAccessibleContext() throw ( RuntimeException )
222     {
223         ensureIsAlive();
224         return this;
225     }
226 
227     // XAccessibleContext -----------------------------------------------------
228 
229     sal_Int32 SAL_CALL AccessibleBrowseBoxTableCell::getAccessibleIndexInParent()
230             throw ( ::com::sun::star::uno::RuntimeException )
231     {
232         BBSolarGuard aSolarGuard;
233         ::osl::MutexGuard aGuard( getOslMutex() );
234         ensureIsAlive();
235 
236         return /*BBINDEX_FIRSTCONTROL*/ m_nOffset + ( getRowPos() * mpBrowseBox->GetColumnCount() ) + getColumnPos();
237     }
238 
239     sal_Int32 SAL_CALL AccessibleBrowseBoxTableCell::getCaretPosition(  ) throw (::com::sun::star::uno::RuntimeException)
240     {
241         return -1;
242     }
243     sal_Bool SAL_CALL AccessibleBrowseBoxTableCell::setCaretPosition ( sal_Int32 nIndex ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException)
244     {
245         BBSolarGuard aSolarGuard;
246         ::osl::MutexGuard aGuard( getOslMutex() );
247 
248         if ( !implIsValidRange( nIndex, nIndex, implGetText().getLength() ) )
249             throw IndexOutOfBoundsException();
250 
251         return sal_False;
252     }
253     sal_Unicode SAL_CALL AccessibleBrowseBoxTableCell::getCharacter( sal_Int32 nIndex ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException)
254     {
255         BBSolarGuard aSolarGuard;
256         ::osl::MutexGuard aGuard( getOslMutex() );
257         return OCommonAccessibleText::getCharacter( nIndex );
258     }
259     ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue > SAL_CALL AccessibleBrowseBoxTableCell::getCharacterAttributes( sal_Int32 nIndex, const ::com::sun::star::uno::Sequence< ::rtl::OUString >& ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException)
260     {
261         BBSolarGuard aSolarGuard;
262         ::osl::MutexGuard aGuard( getOslMutex() );
263 
264         ::rtl::OUString sText( implGetText() );
265 
266         if ( !implIsValidIndex( nIndex, sText.getLength() ) )
267             throw IndexOutOfBoundsException();
268 
269         return ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >();
270     }
271     sal_Int32 SAL_CALL AccessibleBrowseBoxTableCell::getCharacterCount(  ) throw (::com::sun::star::uno::RuntimeException)
272     {
273         BBSolarGuard aSolarGuard;
274         ::osl::MutexGuard aGuard( getOslMutex() );
275         return OCommonAccessibleText::getCharacterCount(  );
276     }
277 
278     ::rtl::OUString SAL_CALL AccessibleBrowseBoxTableCell::getSelectedText(  ) throw (::com::sun::star::uno::RuntimeException)
279     {
280         BBSolarGuard aSolarGuard;
281         ::osl::MutexGuard aGuard( getOslMutex() );
282         return OCommonAccessibleText::getSelectedText(  );
283     }
284     sal_Int32 SAL_CALL AccessibleBrowseBoxTableCell::getSelectionStart(  ) throw (::com::sun::star::uno::RuntimeException)
285     {
286         BBSolarGuard aSolarGuard;
287         ::osl::MutexGuard aGuard( getOslMutex() );
288         return OCommonAccessibleText::getSelectionStart(  );
289     }
290     sal_Int32 SAL_CALL AccessibleBrowseBoxTableCell::getSelectionEnd(  ) throw (::com::sun::star::uno::RuntimeException)
291     {
292         BBSolarGuard aSolarGuard;
293         ::osl::MutexGuard aGuard( getOslMutex() );
294         return OCommonAccessibleText::getSelectionEnd(  );
295     }
296     sal_Bool SAL_CALL AccessibleBrowseBoxTableCell::setSelection( sal_Int32 nStartIndex, sal_Int32 nEndIndex ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException)
297     {
298         BBSolarGuard aSolarGuard;
299         ::osl::MutexGuard aGuard( getOslMutex() );
300         if ( !implIsValidRange( nStartIndex, nEndIndex, implGetText().getLength() ) )
301             throw IndexOutOfBoundsException();
302 
303         return sal_False;
304     }
305     ::rtl::OUString SAL_CALL AccessibleBrowseBoxTableCell::getText(  ) throw (::com::sun::star::uno::RuntimeException)
306     {
307         BBSolarGuard aSolarGuard;
308         ::osl::MutexGuard aGuard( getOslMutex() );
309         return OCommonAccessibleText::getText(  );
310     }
311     ::rtl::OUString SAL_CALL AccessibleBrowseBoxTableCell::getTextRange( sal_Int32 nStartIndex, sal_Int32 nEndIndex ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException)
312     {
313         BBSolarGuard aSolarGuard;
314         ::osl::MutexGuard aGuard( getOslMutex() );
315         return OCommonAccessibleText::getTextRange( nStartIndex, nEndIndex );
316     }
317     ::com::sun::star::accessibility::TextSegment SAL_CALL AccessibleBrowseBoxTableCell::getTextAtIndex( sal_Int32 nIndex, sal_Int16 aTextType ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException)
318     {
319         BBSolarGuard aSolarGuard;
320         ::osl::MutexGuard aGuard( getOslMutex() );
321         return OCommonAccessibleText::getTextAtIndex( nIndex ,aTextType);
322     }
323     ::com::sun::star::accessibility::TextSegment SAL_CALL AccessibleBrowseBoxTableCell::getTextBeforeIndex( sal_Int32 nIndex, sal_Int16 aTextType ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException)
324     {
325         BBSolarGuard aSolarGuard;
326         ::osl::MutexGuard aGuard( getOslMutex() );
327         return OCommonAccessibleText::getTextBeforeIndex( nIndex ,aTextType);
328     }
329     ::com::sun::star::accessibility::TextSegment SAL_CALL AccessibleBrowseBoxTableCell::getTextBehindIndex( sal_Int32 nIndex, sal_Int16 aTextType ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException)
330     {
331         BBSolarGuard aSolarGuard;
332         ::osl::MutexGuard aGuard( getOslMutex() );
333         return OCommonAccessibleText::getTextBehindIndex( nIndex ,aTextType);
334     }
335     sal_Bool SAL_CALL AccessibleBrowseBoxTableCell::copyText( sal_Int32 nStartIndex, sal_Int32 nEndIndex ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException)
336     {
337         BBSolarGuard aSolarGuard;
338         ::osl::MutexGuard aGuard( getOslMutex() );
339         ::rtl::OUString sText = implGetText();
340         checkIndex_Impl( nStartIndex, sText );
341         checkIndex_Impl( nEndIndex, sText );
342 
343         //!!! don't know how to put a string into the clipboard
344         return sal_False;
345     }
346     void AccessibleBrowseBoxTableCell::disposing( const EventObject& _rSource ) throw (RuntimeException)
347     {
348             if ( _rSource.Source == mxParent )
349             {
350                     dispose();
351             }
352     }
353 
354 }
355