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