xref: /AOO41X/main/accessibility/source/extended/AccessibleGridControlTableCell.cxx (revision 79aad27f7f29270c03e208e3d687e8e3850af11d)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_accessibility.hxx"
26 
27 #include "accessibility/extended/AccessibleGridControlTableCell.hxx"
28 #include <svtools/accessibletable.hxx>
29 #include "accessibility/extended/AccessibleGridControl.hxx"
30 #include <tools/gen.hxx>
31 #include <toolkit/helper/vclunohelper.hxx>
32 #include <com/sun/star/accessibility/AccessibleEventId.hpp>
33 
34 namespace accessibility
35 {
36     namespace
37     {
checkIndex_Impl(sal_Int32 _nIndex,const::rtl::OUString & _sText)38         void checkIndex_Impl( sal_Int32 _nIndex, const ::rtl::OUString& _sText ) throw (::com::sun::star::lang::IndexOutOfBoundsException)
39         {
40             if ( _nIndex >= _sText.getLength() )
41                 throw ::com::sun::star::lang::IndexOutOfBoundsException();
42         }
43 
getIndex_Impl(sal_Int32 _nRow,sal_uInt16 _nColumn,sal_uInt16 _nColumnCount)44         sal_Int32 getIndex_Impl( sal_Int32 _nRow, sal_uInt16 _nColumn, sal_uInt16 _nColumnCount )
45         {
46             return _nRow * _nColumnCount + _nColumn;
47         }
48     }
49     using namespace ::com::sun::star::lang;
50     using namespace utl;
51     using namespace comphelper;
52     using ::rtl::OUString;
53     using ::accessibility::AccessibleGridControl;
54     using namespace ::com::sun::star::uno;
55     using ::com::sun::star::accessibility::XAccessible;
56     using namespace ::com::sun::star::accessibility;
57     using namespace ::svt;
58     using namespace ::svt::table;
59 
60 
61     // =============================================================================
62     // = AccessibleGridControlCell
63     // =============================================================================
64     // -----------------------------------------------------------------------------
AccessibleGridControlCell(const Reference<XAccessible> & _rxParent,IAccessibleTable & _rTable,sal_Int32 _nRowPos,sal_uInt16 _nColPos,AccessibleTableControlObjType _eType)65     AccessibleGridControlCell::AccessibleGridControlCell(
66             const Reference< XAccessible >& _rxParent, IAccessibleTable& _rTable,
67             sal_Int32 _nRowPos, sal_uInt16 _nColPos, AccessibleTableControlObjType _eType )
68         :AccessibleGridControlBase( _rxParent, _rTable, _eType )
69         ,m_nRowPos( _nRowPos )
70         ,m_nColPos( _nColPos )
71     {
72         // set accessible name here, because for that we need the position of the cell
73         // and so the base class isn't capable of doing this
74         ::rtl::OUString aAccName;
75         if(_eType == TCTYPE_TABLECELL)
76             aAccName = _rTable.GetAccessibleObjectName( TCTYPE_TABLECELL, _nRowPos, _nColPos );
77         else if(_eType == TCTYPE_ROWHEADERCELL)
78             aAccName = _rTable.GetAccessibleObjectName( TCTYPE_ROWHEADERCELL, _nRowPos, 0 );
79         else if(_eType == TCTYPE_COLUMNHEADERCELL)
80             aAccName = _rTable.GetAccessibleObjectName( TCTYPE_COLUMNHEADERCELL, 0, _nRowPos );
81         implSetName( aAccName );
82     }
83 
84     // -----------------------------------------------------------------------------
~AccessibleGridControlCell()85     AccessibleGridControlCell::~AccessibleGridControlCell()
86     {
87     }
88 
89     // -----------------------------------------------------------------------------
grabFocus()90     void SAL_CALL AccessibleGridControlCell::grabFocus() throw ( RuntimeException )
91     {
92         TCSolarGuard aSolarGuard;
93         ::osl::MutexGuard aGuard( getOslMutex() );
94         m_aTable.GoToCell( m_nColPos, m_nRowPos );
95     }
96     //// -----------------------------------------------------------------------------
97     // implementation of a table cell
implGetText()98     ::rtl::OUString AccessibleGridControlTableCell::implGetText()
99     {
100         ensureIsAlive();
101         return m_aTable.GetAccessibleCellText( getRowPos(),  getColumnPos() );
102     }
103 
implGetLocale()104     ::com::sun::star::lang::Locale AccessibleGridControlTableCell::implGetLocale()
105     {
106         ensureIsAlive();
107         return m_aTable.GetAccessible()->getAccessibleContext()->getLocale();
108     }
109 
implGetSelection(sal_Int32 & nStartIndex,sal_Int32 & nEndIndex)110     void AccessibleGridControlTableCell::implGetSelection( sal_Int32& nStartIndex, sal_Int32& nEndIndex )
111     {
112         nStartIndex = 0;
113         nEndIndex = 0;
114     }
115 
AccessibleGridControlTableCell(const Reference<XAccessible> & _rxParent,IAccessibleTable & _rTable,sal_Int32 _nRowPos,sal_uInt16 _nColPos,AccessibleTableControlObjType eObjType)116     AccessibleGridControlTableCell::AccessibleGridControlTableCell(const Reference<XAccessible >& _rxParent,
117                                 IAccessibleTable& _rTable,
118                                 sal_Int32 _nRowPos,
119                                 sal_uInt16 _nColPos,
120                                 AccessibleTableControlObjType  eObjType)
121         :AccessibleGridControlCell( _rxParent, _rTable, _nRowPos, _nColPos, eObjType )
122     {
123     }
124 
125     // XInterface -------------------------------------------------------------
126 
127     /** Queries for a new interface. */
queryInterface(const::com::sun::star::uno::Type & rType)128     ::com::sun::star::uno::Any SAL_CALL AccessibleGridControlTableCell::queryInterface(
129             const ::com::sun::star::uno::Type& rType )
130         throw ( ::com::sun::star::uno::RuntimeException )
131     {
132         Any aRet = AccessibleGridControlCell::queryInterface(rType);
133         if ( !aRet.hasValue() )
134             aRet = AccessibleTextHelper_BASE::queryInterface(rType);
135         return aRet;
136     }
137 
138     /** Aquires the object (calls acquire() on base class). */
acquire()139     void SAL_CALL AccessibleGridControlTableCell::acquire() throw ()
140     {
141         AccessibleGridControlCell::acquire();
142     }
143 
144     /** Releases the object (calls release() on base class). */
release()145     void SAL_CALL AccessibleGridControlTableCell::release() throw ()
146     {
147         AccessibleGridControlCell::release();
148     }
149 
getCharacterBounds(sal_Int32 nIndex)150     ::com::sun::star::awt::Rectangle SAL_CALL AccessibleGridControlTableCell::getCharacterBounds( sal_Int32 nIndex ) throw (IndexOutOfBoundsException, RuntimeException)
151     {
152         TCSolarGuard aSolarGuard;
153         ::osl::MutexGuard aGuard( getOslMutex() );
154 
155         ensureIsAlive();
156         if ( !implIsValidIndex( nIndex, implGetText().getLength() ) )
157             throw IndexOutOfBoundsException();
158 
159         ::com::sun::star::awt::Rectangle aRect;
160 
161         if ( &m_aTable )
162             aRect = AWTRectangle( m_aTable.GetFieldCharacterBounds( getRowPos(), getColumnPos(), nIndex ) );
163         return aRect;
164     }
165 
getIndexAtPoint(const::com::sun::star::awt::Point & _aPoint)166     sal_Int32 SAL_CALL AccessibleGridControlTableCell::getIndexAtPoint( const ::com::sun::star::awt::Point& _aPoint ) throw (RuntimeException)
167     {
168         TCSolarGuard aSolarGuard;
169         ::osl::MutexGuard aGuard( getOslMutex() );
170         ensureIsAlive();
171 
172         return m_aTable.GetFieldIndexAtPoint( getRowPos(), getColumnPos(), VCLPoint( _aPoint ) );
173     }
174 
175     /** @return
176             The name of this class.
177     */
getImplementationName()178     ::rtl::OUString SAL_CALL AccessibleGridControlTableCell::getImplementationName()
179         throw ( ::com::sun::star::uno::RuntimeException )
180     {
181         return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.accessibility.AccessibleGridControlTableCell" ) );
182     }
183 
184     /** @return  The count of visible children. */
getAccessibleChildCount()185     sal_Int32 SAL_CALL AccessibleGridControlTableCell::getAccessibleChildCount()
186         throw ( ::com::sun::star::uno::RuntimeException )
187     {
188         return 0;
189     }
190 
191     /** @return  The XAccessible interface of the specified child. */
192     ::com::sun::star::uno::Reference<
193         ::com::sun::star::accessibility::XAccessible > SAL_CALL
getAccessibleChild(sal_Int32)194         AccessibleGridControlTableCell::getAccessibleChild( sal_Int32 )
195             throw ( ::com::sun::star::lang::IndexOutOfBoundsException,
196                     ::com::sun::star::uno::RuntimeException )
197     {
198         throw ::com::sun::star::lang::IndexOutOfBoundsException();
199     }
200 
201     /** Creates a new AccessibleStateSetHelper and fills it with states of the
202         current object.
203         @return
204             A filled AccessibleStateSetHelper.
205     */
implCreateStateSetHelper()206     ::utl::AccessibleStateSetHelper* AccessibleGridControlTableCell::implCreateStateSetHelper()
207     {
208         TCSolarGuard aSolarGuard;
209         ::osl::MutexGuard aGuard( getOslMutex() );
210 
211         ::utl::AccessibleStateSetHelper* pStateSetHelper = new ::utl::AccessibleStateSetHelper;
212 
213         if( isAlive() )
214         {
215             // SHOWING done with mxParent
216             if( implIsShowing() )
217                 pStateSetHelper->AddState( AccessibleStateType::SHOWING );
218 
219             m_aTable.FillAccessibleStateSetForCell( *pStateSetHelper, getRowPos(), static_cast< sal_uInt16 >( getColumnPos() ) );
220         }
221         else
222             pStateSetHelper->AddState( AccessibleStateType::DEFUNC );
223 
224         return pStateSetHelper;
225     }
226 
227 
228     // XAccessible ------------------------------------------------------------
229 
230     /** @return  The XAccessibleContext interface of this object. */
getAccessibleContext()231     Reference< XAccessibleContext > SAL_CALL AccessibleGridControlTableCell::getAccessibleContext() throw ( RuntimeException )
232     {
233         ensureIsAlive();
234         return this;
235     }
236 
237     // XAccessibleContext -----------------------------------------------------
238 
getAccessibleIndexInParent()239     sal_Int32 SAL_CALL AccessibleGridControlTableCell::getAccessibleIndexInParent()
240             throw ( ::com::sun::star::uno::RuntimeException )
241     {
242         TCSolarGuard aSolarGuard;
243         ::osl::MutexGuard aGuard( getOslMutex() );
244         ensureIsAlive();
245 
246         return ( getRowPos() * m_aTable.GetColumnCount() ) + getColumnPos();
247     }
248 
getCaretPosition()249     sal_Int32 SAL_CALL AccessibleGridControlTableCell::getCaretPosition(  ) throw (::com::sun::star::uno::RuntimeException)
250     {
251         return -1;
252     }
setCaretPosition(sal_Int32 nIndex)253     sal_Bool SAL_CALL AccessibleGridControlTableCell::setCaretPosition ( sal_Int32 nIndex ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException)
254     {
255         TCSolarGuard aSolarGuard;
256         ::osl::MutexGuard aGuard( getOslMutex() );
257 
258         if ( !implIsValidRange( nIndex, nIndex, implGetText().getLength() ) )
259             throw IndexOutOfBoundsException();
260 
261         return sal_False;
262     }
getCharacter(sal_Int32 nIndex)263     sal_Unicode SAL_CALL AccessibleGridControlTableCell::getCharacter( sal_Int32 nIndex ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException)
264     {
265         TCSolarGuard aSolarGuard;
266         ::osl::MutexGuard aGuard( getOslMutex() );
267         return OCommonAccessibleText::getCharacter( nIndex );
268     }
getCharacterAttributes(sal_Int32 nIndex,const::com::sun::star::uno::Sequence<::rtl::OUString> &)269     ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue > SAL_CALL AccessibleGridControlTableCell::getCharacterAttributes( sal_Int32 nIndex, const ::com::sun::star::uno::Sequence< ::rtl::OUString >& ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException)
270     {
271         TCSolarGuard aSolarGuard;
272         ::osl::MutexGuard aGuard( getOslMutex() );
273 
274         ::rtl::OUString sText( implGetText() );
275 
276         if ( !implIsValidIndex( nIndex, sText.getLength() ) )
277             throw IndexOutOfBoundsException();
278 
279         return ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >();
280     }
getCharacterCount()281     sal_Int32 SAL_CALL AccessibleGridControlTableCell::getCharacterCount(  ) throw (::com::sun::star::uno::RuntimeException)
282     {
283         TCSolarGuard aSolarGuard;
284         ::osl::MutexGuard aGuard( getOslMutex() );
285         return OCommonAccessibleText::getCharacterCount(  );
286     }
287 
getSelectedText()288     ::rtl::OUString SAL_CALL AccessibleGridControlTableCell::getSelectedText(  ) throw (::com::sun::star::uno::RuntimeException)
289     {
290         TCSolarGuard aSolarGuard;
291         ::osl::MutexGuard aGuard( getOslMutex() );
292         return OCommonAccessibleText::getSelectedText(  );
293     }
getSelectionStart()294     sal_Int32 SAL_CALL AccessibleGridControlTableCell::getSelectionStart(  ) throw (::com::sun::star::uno::RuntimeException)
295     {
296         TCSolarGuard aSolarGuard;
297         ::osl::MutexGuard aGuard( getOslMutex() );
298         return OCommonAccessibleText::getSelectionStart(  );
299     }
getSelectionEnd()300     sal_Int32 SAL_CALL AccessibleGridControlTableCell::getSelectionEnd(  ) throw (::com::sun::star::uno::RuntimeException)
301     {
302         TCSolarGuard aSolarGuard;
303         ::osl::MutexGuard aGuard( getOslMutex() );
304         return OCommonAccessibleText::getSelectionEnd(  );
305     }
setSelection(sal_Int32 nStartIndex,sal_Int32 nEndIndex)306     sal_Bool SAL_CALL AccessibleGridControlTableCell::setSelection( sal_Int32 nStartIndex, sal_Int32 nEndIndex ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException)
307     {
308         TCSolarGuard aSolarGuard;
309         ::osl::MutexGuard aGuard( getOslMutex() );
310         if ( !implIsValidRange( nStartIndex, nEndIndex, implGetText().getLength() ) )
311             throw IndexOutOfBoundsException();
312 
313         return sal_False;
314     }
getText()315     ::rtl::OUString SAL_CALL AccessibleGridControlTableCell::getText(  ) throw (::com::sun::star::uno::RuntimeException)
316     {
317         TCSolarGuard aSolarGuard;
318         ::osl::MutexGuard aGuard( getOslMutex() );
319         return OCommonAccessibleText::getText(  );
320     }
getTextRange(sal_Int32 nStartIndex,sal_Int32 nEndIndex)321     ::rtl::OUString SAL_CALL AccessibleGridControlTableCell::getTextRange( sal_Int32 nStartIndex, sal_Int32 nEndIndex ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException)
322     {
323         TCSolarGuard aSolarGuard;
324         ::osl::MutexGuard aGuard( getOslMutex() );
325         return OCommonAccessibleText::getTextRange( nStartIndex, nEndIndex );
326     }
getTextAtIndex(sal_Int32 nIndex,sal_Int16 aTextType)327     ::com::sun::star::accessibility::TextSegment SAL_CALL AccessibleGridControlTableCell::getTextAtIndex( sal_Int32 nIndex, sal_Int16 aTextType ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException)
328     {
329         TCSolarGuard aSolarGuard;
330         ::osl::MutexGuard aGuard( getOslMutex() );
331         return OCommonAccessibleText::getTextAtIndex( nIndex ,aTextType);
332     }
getTextBeforeIndex(sal_Int32 nIndex,sal_Int16 aTextType)333     ::com::sun::star::accessibility::TextSegment SAL_CALL AccessibleGridControlTableCell::getTextBeforeIndex( sal_Int32 nIndex, sal_Int16 aTextType ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException)
334     {
335         TCSolarGuard aSolarGuard;
336         ::osl::MutexGuard aGuard( getOslMutex() );
337         return OCommonAccessibleText::getTextBeforeIndex( nIndex ,aTextType);
338     }
getTextBehindIndex(sal_Int32 nIndex,sal_Int16 aTextType)339     ::com::sun::star::accessibility::TextSegment SAL_CALL AccessibleGridControlTableCell::getTextBehindIndex( sal_Int32 nIndex, sal_Int16 aTextType ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException)
340     {
341         TCSolarGuard aSolarGuard;
342         ::osl::MutexGuard aGuard( getOslMutex() );
343         return OCommonAccessibleText::getTextBehindIndex( nIndex ,aTextType);
344     }
copyText(sal_Int32 nStartIndex,sal_Int32 nEndIndex)345     sal_Bool SAL_CALL AccessibleGridControlTableCell::copyText( sal_Int32 nStartIndex, sal_Int32 nEndIndex ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException)
346     {
347         TCSolarGuard aSolarGuard;
348         ::osl::MutexGuard aGuard( getOslMutex() );
349         ::rtl::OUString sText = implGetText();
350         checkIndex_Impl( nStartIndex, sText );
351         checkIndex_Impl( nEndIndex, sText );
352 
353         //!!! don't know how to put a string into the clipboard
354         return sal_False;
355     }
356 
implGetBoundingBox()357     Rectangle AccessibleGridControlTableCell::implGetBoundingBox()
358     {
359         Window* pParent = m_aTable.GetAccessibleParentWindow();
360         DBG_ASSERT( pParent, "implGetBoundingBox - missing parent window" );
361         Rectangle aGridRect = m_aTable.GetWindowExtentsRelative( pParent );
362         sal_Int32 nIndex = getAccessibleIndexInParent();
363         Rectangle aCellRect = m_aTable.calcCellRect(nIndex%m_aTable.GetColumnCount(), nIndex/m_aTable.GetColumnCount());
364         long nX = aGridRect.Left() + aCellRect.Left();
365         long nY = aGridRect.Top() + aCellRect.Top();
366         Rectangle aCell( Point( nX, nY ), aCellRect.GetSize());
367         return aCell;
368     }
369     // -----------------------------------------------------------------------------
implGetBoundingBoxOnScreen()370     Rectangle AccessibleGridControlTableCell::implGetBoundingBoxOnScreen()
371     {
372         Rectangle aGridRect = m_aTable.GetWindowExtentsRelative( NULL );
373         sal_Int32 nIndex = getAccessibleIndexInParent();
374         Rectangle aCellRect = m_aTable.calcCellRect(nIndex%m_aTable.GetColumnCount(), nIndex/m_aTable.GetColumnCount());
375         long nX = aGridRect.Left() + aCellRect.Left();
376         long nY = aGridRect.Top() + aCellRect.Top();
377         Rectangle aCell( Point( nX, nY ), aCellRect.GetSize());
378         return aCell;
379     }
380 }
381