xref: /trunk/main/accessibility/source/extended/accessiblelistboxentry.cxx (revision cf6516809c57e1bb0a940545cca99cdad54d4ce2)
10841af79SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
30841af79SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
40841af79SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
50841af79SAndrew Rist  * distributed with this work for additional information
60841af79SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
70841af79SAndrew Rist  * to you under the Apache License, Version 2.0 (the
80841af79SAndrew Rist  * "License"); you may not use this file except in compliance
90841af79SAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
110841af79SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
130841af79SAndrew Rist  * Unless required by applicable law or agreed to in writing,
140841af79SAndrew Rist  * software distributed under the License is distributed on an
150841af79SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
160841af79SAndrew Rist  * KIND, either express or implied.  See the License for the
170841af79SAndrew Rist  * specific language governing permissions and limitations
180841af79SAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
200841af79SAndrew Rist  *************************************************************/
210841af79SAndrew Rist 
220841af79SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_accessibility.hxx"
26cdf0e10cSrcweir #include "accessibility/extended/accessiblelistboxentry.hxx"
27cdf0e10cSrcweir #include <svtools/svtreebx.hxx>
2821075d77SSteve Yin #include <accessibility/helper/accresmgr.hxx>
29cdf0e10cSrcweir #include <svtools/stringtransfer.hxx>
30cdf0e10cSrcweir #include <com/sun/star/awt/Point.hpp>
31cdf0e10cSrcweir #include <com/sun/star/awt/Rectangle.hpp>
32cdf0e10cSrcweir #include <com/sun/star/awt/Size.hpp>
33cdf0e10cSrcweir #include <com/sun/star/accessibility/AccessibleEventId.hpp>
34cdf0e10cSrcweir #include <com/sun/star/accessibility/AccessibleRelationType.hpp>
35cdf0e10cSrcweir #include <com/sun/star/accessibility/AccessibleRole.hpp>
36cdf0e10cSrcweir #include <com/sun/star/accessibility/AccessibleStateType.hpp>
37cdf0e10cSrcweir #include <tools/debug.hxx>
38cdf0e10cSrcweir #include <vcl/svapp.hxx>
39cdf0e10cSrcweir #include <vcl/controllayout.hxx>
40cdf0e10cSrcweir #include <toolkit/awt/vclxwindow.hxx>
41cdf0e10cSrcweir #include <toolkit/helper/convert.hxx>
42cdf0e10cSrcweir #include <unotools/accessiblestatesethelper.hxx>
43cdf0e10cSrcweir #include <unotools/accessiblerelationsethelper.hxx>
44cdf0e10cSrcweir #include <cppuhelper/typeprovider.hxx>
45cdf0e10cSrcweir #include <comphelper/sequence.hxx>
46cdf0e10cSrcweir #include <comphelper/accessibleeventnotifier.hxx>
47cdf0e10cSrcweir #include <toolkit/helper/vclunohelper.hxx>
4821075d77SSteve Yin #include <accessibility/helper/accessiblestrings.hrc>
4921075d77SSteve Yin #ifndef _COM_SUN_STAR_ACCESSIBILITY_XACCESSIBLEVALUE_HPP_
5021075d77SSteve Yin #include <com/sun/star/accessibility/XAccessibleValue.hpp>
5121075d77SSteve Yin #endif
52cdf0e10cSrcweir #define ACCESSIBLE_ACTION_COUNT 1
53cdf0e10cSrcweir 
54cdf0e10cSrcweir namespace
55cdf0e10cSrcweir {
checkActionIndex_Impl(sal_Int32 _nIndex)56cdf0e10cSrcweir     void checkActionIndex_Impl( sal_Int32 _nIndex ) throw (::com::sun::star::lang::IndexOutOfBoundsException)
57cdf0e10cSrcweir     {
58cdf0e10cSrcweir         if ( _nIndex < 0 || _nIndex >= ACCESSIBLE_ACTION_COUNT )
59cdf0e10cSrcweir             // only three actions
60cdf0e10cSrcweir             throw ::com::sun::star::lang::IndexOutOfBoundsException();
61cdf0e10cSrcweir     }
62cdf0e10cSrcweir }
63cdf0e10cSrcweir 
64cdf0e10cSrcweir //........................................................................
65cdf0e10cSrcweir namespace accessibility
66cdf0e10cSrcweir {
67cdf0e10cSrcweir     //........................................................................
68cdf0e10cSrcweir     // class ALBSolarGuard ---------------------------------------------------------
69cdf0e10cSrcweir 
7007a3d7f1SPedro Giffuni     /** Acquire the solar mutex. */
71cdf0e10cSrcweir     class ALBSolarGuard : public ::vos::OGuard
72cdf0e10cSrcweir     {
73cdf0e10cSrcweir     public:
ALBSolarGuard()74cdf0e10cSrcweir         inline ALBSolarGuard() : ::vos::OGuard( Application::GetSolarMutex() ) {}
75cdf0e10cSrcweir     };
76cdf0e10cSrcweir 
77cdf0e10cSrcweir     // class AccessibleListBoxEntry -----------------------------------------------------
78cdf0e10cSrcweir 
79cdf0e10cSrcweir     using namespace ::com::sun::star::accessibility;
80cdf0e10cSrcweir     using namespace ::com::sun::star::uno;
81cdf0e10cSrcweir     using namespace ::com::sun::star::lang;
82cdf0e10cSrcweir     using namespace ::com::sun::star;
8321075d77SSteve Yin     using namespace ::comphelper;
DBG_NAME(AccessibleListBoxEntry)84cdf0e10cSrcweir     DBG_NAME(AccessibleListBoxEntry)
85cdf0e10cSrcweir 
86cdf0e10cSrcweir     // -----------------------------------------------------------------------------
87cdf0e10cSrcweir     // Ctor() and Dtor()
88cdf0e10cSrcweir     // -----------------------------------------------------------------------------
89cdf0e10cSrcweir     AccessibleListBoxEntry::AccessibleListBoxEntry( SvTreeListBox& _rListBox,
90cdf0e10cSrcweir                                                     SvLBoxEntry* _pEntry,
91cdf0e10cSrcweir                                                     const Reference< XAccessible >& _xParent ) :
92cdf0e10cSrcweir 
93cdf0e10cSrcweir         AccessibleListBoxEntry_BASE ( m_aMutex ),
94cdf0e10cSrcweir         ListBoxAccessibleBase( _rListBox ),
95cdf0e10cSrcweir 
9621075d77SSteve Yin         m_pSvLBoxEntry  ( _pEntry ),
97cdf0e10cSrcweir         m_nClientId     ( 0 ),
98cdf0e10cSrcweir         m_aParent       ( _xParent )
99cdf0e10cSrcweir 
100cdf0e10cSrcweir     {
101cdf0e10cSrcweir         DBG_CTOR( AccessibleListBoxEntry, NULL );
102cdf0e10cSrcweir 
103cdf0e10cSrcweir         _rListBox.FillEntryPath( _pEntry, m_aEntryPath );
104cdf0e10cSrcweir     }
105cdf0e10cSrcweir     // -----------------------------------------------------------------------------
~AccessibleListBoxEntry()106cdf0e10cSrcweir     AccessibleListBoxEntry::~AccessibleListBoxEntry()
107cdf0e10cSrcweir     {
108cdf0e10cSrcweir         DBG_DTOR( AccessibleListBoxEntry, NULL );
109cdf0e10cSrcweir 
110cdf0e10cSrcweir         if ( IsAlive_Impl() )
111cdf0e10cSrcweir         {
112cdf0e10cSrcweir             // increment ref count to prevent double call of Dtor
113cdf0e10cSrcweir             osl_incrementInterlockedCount( &m_refCount );
114cdf0e10cSrcweir             dispose();
115cdf0e10cSrcweir         }
116cdf0e10cSrcweir     }
117cdf0e10cSrcweir 
NotifyAccessibleEvent(sal_Int16 _nEventId,const::com::sun::star::uno::Any & _aOldValue,const::com::sun::star::uno::Any & _aNewValue)11821075d77SSteve Yin     void AccessibleListBoxEntry::NotifyAccessibleEvent( sal_Int16 _nEventId,
11921075d77SSteve Yin                                                 const ::com::sun::star::uno::Any& _aOldValue,
12021075d77SSteve Yin                                                 const ::com::sun::star::uno::Any& _aNewValue )
12121075d77SSteve Yin     {
12221075d77SSteve Yin         Reference< uno::XInterface > xSource( *this );
12321075d77SSteve Yin         AccessibleEventObject aEventObj( xSource, _nEventId, _aNewValue, _aOldValue );
12421075d77SSteve Yin 
12521075d77SSteve Yin         if (m_nClientId)
12621075d77SSteve Yin             comphelper::AccessibleEventNotifier::addEvent( m_nClientId, aEventObj );
12721075d77SSteve Yin     }
12821075d77SSteve Yin 
12921075d77SSteve Yin 
130cdf0e10cSrcweir     // -----------------------------------------------------------------------------
GetBoundingBox_Impl() const131cdf0e10cSrcweir     Rectangle AccessibleListBoxEntry::GetBoundingBox_Impl() const
132cdf0e10cSrcweir     {
133cdf0e10cSrcweir         Rectangle aRect;
134cdf0e10cSrcweir         SvLBoxEntry* pEntry = getListBox()->GetEntryFromPath( m_aEntryPath );
135cdf0e10cSrcweir         if ( pEntry )
136cdf0e10cSrcweir         {
137cdf0e10cSrcweir             aRect = getListBox()->GetBoundingRect( pEntry );
138cdf0e10cSrcweir             SvLBoxEntry* pParent = getListBox()->GetParent( pEntry );
139cdf0e10cSrcweir             if ( pParent )
140cdf0e10cSrcweir             {
141cdf0e10cSrcweir                 // position relative to parent entry
142cdf0e10cSrcweir                 Point aTopLeft = aRect.TopLeft();
143cdf0e10cSrcweir                 aTopLeft -= getListBox()->GetBoundingRect( pParent ).TopLeft();
144cdf0e10cSrcweir                 aRect = Rectangle( aTopLeft, aRect.GetSize() );
145cdf0e10cSrcweir             }
146cdf0e10cSrcweir         }
147cdf0e10cSrcweir 
148cdf0e10cSrcweir         return aRect;
149cdf0e10cSrcweir     }
150cdf0e10cSrcweir     // -----------------------------------------------------------------------------
GetBoundingBoxOnScreen_Impl() const151cdf0e10cSrcweir     Rectangle AccessibleListBoxEntry::GetBoundingBoxOnScreen_Impl() const
152cdf0e10cSrcweir     {
153cdf0e10cSrcweir         Rectangle aRect;
154cdf0e10cSrcweir         SvLBoxEntry* pEntry = getListBox()->GetEntryFromPath( m_aEntryPath );
155cdf0e10cSrcweir         if ( pEntry )
156cdf0e10cSrcweir         {
157cdf0e10cSrcweir             aRect = getListBox()->GetBoundingRect( pEntry );
158cdf0e10cSrcweir             Point aTopLeft = aRect.TopLeft();
159cdf0e10cSrcweir             aTopLeft += getListBox()->GetWindowExtentsRelative( NULL ).TopLeft();
160cdf0e10cSrcweir             aRect = Rectangle( aTopLeft, aRect.GetSize() );
161cdf0e10cSrcweir         }
162cdf0e10cSrcweir 
163cdf0e10cSrcweir         return aRect;
164cdf0e10cSrcweir     }
165cdf0e10cSrcweir     // -----------------------------------------------------------------------------
IsAlive_Impl() const166cdf0e10cSrcweir     sal_Bool AccessibleListBoxEntry::IsAlive_Impl() const
167cdf0e10cSrcweir     {
168cdf0e10cSrcweir         return ( !rBHelper.bDisposed && !rBHelper.bInDispose && isAlive() );
169cdf0e10cSrcweir     }
170cdf0e10cSrcweir     // -----------------------------------------------------------------------------
IsShowing_Impl() const171cdf0e10cSrcweir     sal_Bool AccessibleListBoxEntry::IsShowing_Impl() const
172cdf0e10cSrcweir     {
173cdf0e10cSrcweir         Reference< XAccessible > xParent = implGetParentAccessible( );
174cdf0e10cSrcweir 
175cdf0e10cSrcweir         sal_Bool bShowing = sal_False;
176cdf0e10cSrcweir         Reference< XAccessibleContext > m_xParentContext =
177cdf0e10cSrcweir             xParent.is() ? xParent->getAccessibleContext() : Reference< XAccessibleContext >();
178cdf0e10cSrcweir         if( m_xParentContext.is() )
179cdf0e10cSrcweir         {
180cdf0e10cSrcweir             Reference< XAccessibleComponent > xParentComp( m_xParentContext, uno::UNO_QUERY );
181cdf0e10cSrcweir             if( xParentComp.is() )
182cdf0e10cSrcweir                 bShowing = GetBoundingBox_Impl().IsOver( VCLRectangle( xParentComp->getBounds() ) );
183cdf0e10cSrcweir         }
184cdf0e10cSrcweir 
185cdf0e10cSrcweir         return bShowing;
186cdf0e10cSrcweir     }
187cdf0e10cSrcweir     // -----------------------------------------------------------------------------
GetBoundingBox()188cdf0e10cSrcweir     Rectangle AccessibleListBoxEntry::GetBoundingBox() throw ( lang::DisposedException )
189cdf0e10cSrcweir     {
190cdf0e10cSrcweir         ALBSolarGuard aSolarGuard;
191cdf0e10cSrcweir         ::osl::MutexGuard aGuard( m_aMutex );
192cdf0e10cSrcweir 
193cdf0e10cSrcweir         EnsureIsAlive();
194cdf0e10cSrcweir         return GetBoundingBox_Impl();
195cdf0e10cSrcweir     }
196cdf0e10cSrcweir     // -----------------------------------------------------------------------------
GetBoundingBoxOnScreen()197cdf0e10cSrcweir     Rectangle AccessibleListBoxEntry::GetBoundingBoxOnScreen() throw ( lang::DisposedException )
198cdf0e10cSrcweir     {
199cdf0e10cSrcweir         ALBSolarGuard aSolarGuard;
200cdf0e10cSrcweir         ::osl::MutexGuard aGuard( m_aMutex );
201cdf0e10cSrcweir 
202cdf0e10cSrcweir         EnsureIsAlive();
203cdf0e10cSrcweir         return GetBoundingBoxOnScreen_Impl();
204cdf0e10cSrcweir     }
205cdf0e10cSrcweir     // -----------------------------------------------------------------------------
EnsureIsAlive() const206cdf0e10cSrcweir     void AccessibleListBoxEntry::EnsureIsAlive() const throw ( lang::DisposedException )
207cdf0e10cSrcweir     {
208cdf0e10cSrcweir         if ( !IsAlive_Impl() )
209cdf0e10cSrcweir             throw lang::DisposedException();
210cdf0e10cSrcweir     }
211cdf0e10cSrcweir     // -----------------------------------------------------------------------------
implGetText()212cdf0e10cSrcweir     ::rtl::OUString AccessibleListBoxEntry::implGetText()
213cdf0e10cSrcweir     {
214cdf0e10cSrcweir         ::rtl::OUString sRet;
215cdf0e10cSrcweir         SvLBoxEntry* pEntry = getListBox()->GetEntryFromPath( m_aEntryPath );
216cdf0e10cSrcweir         if ( pEntry )
21721075d77SSteve Yin             sRet = getListBox()->SearchEntryTextWithHeadTitle( pEntry );
218cdf0e10cSrcweir         return sRet;
219cdf0e10cSrcweir     }
220cdf0e10cSrcweir     // -----------------------------------------------------------------------------
implGetLocale()221cdf0e10cSrcweir     Locale AccessibleListBoxEntry::implGetLocale()
222cdf0e10cSrcweir     {
223cdf0e10cSrcweir         Locale aLocale;
224cdf0e10cSrcweir         aLocale = Application::GetSettings().GetUILocale();
225cdf0e10cSrcweir 
226cdf0e10cSrcweir         return aLocale;
227cdf0e10cSrcweir     }
implGetSelection(sal_Int32 & nStartIndex,sal_Int32 & nEndIndex)228cdf0e10cSrcweir     void AccessibleListBoxEntry::implGetSelection( sal_Int32& nStartIndex, sal_Int32& nEndIndex )
229cdf0e10cSrcweir     {
230cdf0e10cSrcweir         nStartIndex = 0;
231cdf0e10cSrcweir         nEndIndex = 0;
232cdf0e10cSrcweir     }
233cdf0e10cSrcweir     // -----------------------------------------------------------------------------
234cdf0e10cSrcweir     // XTypeProvider
235cdf0e10cSrcweir     // -----------------------------------------------------------------------------
236cdf0e10cSrcweir     // -----------------------------------------------------------------------------
getImplementationId()237cdf0e10cSrcweir     Sequence< sal_Int8 > AccessibleListBoxEntry::getImplementationId() throw (RuntimeException)
238cdf0e10cSrcweir     {
239cdf0e10cSrcweir         static ::cppu::OImplementationId* pId = NULL;
240cdf0e10cSrcweir 
241cdf0e10cSrcweir         if ( !pId )
242cdf0e10cSrcweir         {
243cdf0e10cSrcweir             ::osl::Guard< ::osl::Mutex > aGuard( m_aMutex );
244cdf0e10cSrcweir 
245cdf0e10cSrcweir             if ( !pId )
246cdf0e10cSrcweir             {
247cdf0e10cSrcweir                 static ::cppu::OImplementationId aId;
248cdf0e10cSrcweir                 pId = &aId;
249cdf0e10cSrcweir             }
250cdf0e10cSrcweir         }
251cdf0e10cSrcweir         return pId->getImplementationId();
252cdf0e10cSrcweir     }
253cdf0e10cSrcweir 
254cdf0e10cSrcweir     // -----------------------------------------------------------------------------
255cdf0e10cSrcweir     // XComponent/ListBoxAccessibleBase
256cdf0e10cSrcweir     // -----------------------------------------------------------------------------
dispose()257cdf0e10cSrcweir     void SAL_CALL AccessibleListBoxEntry::dispose() throw ( uno::RuntimeException )
258cdf0e10cSrcweir     {
259cdf0e10cSrcweir         AccessibleListBoxEntry_BASE::dispose();
260cdf0e10cSrcweir     }
261cdf0e10cSrcweir 
262cdf0e10cSrcweir     // -----------------------------------------------------------------------------
263cdf0e10cSrcweir     // XComponent
264cdf0e10cSrcweir     // -----------------------------------------------------------------------------
disposing()265cdf0e10cSrcweir     void SAL_CALL AccessibleListBoxEntry::disposing()
266cdf0e10cSrcweir     {
267cdf0e10cSrcweir         ALBSolarGuard();
268cdf0e10cSrcweir         ::osl::MutexGuard aGuard( m_aMutex );
269cdf0e10cSrcweir 
270cdf0e10cSrcweir         Reference< XAccessible > xKeepAlive( this );
271cdf0e10cSrcweir 
272cdf0e10cSrcweir         // Send a disposing to all listeners.
273cdf0e10cSrcweir         if ( m_nClientId )
274cdf0e10cSrcweir         {
275cdf0e10cSrcweir             ::comphelper::AccessibleEventNotifier::TClientId nId = m_nClientId;
276cdf0e10cSrcweir             m_nClientId =  0;
277cdf0e10cSrcweir             ::comphelper::AccessibleEventNotifier::revokeClientNotifyDisposing( nId, *this );
278cdf0e10cSrcweir         }
279cdf0e10cSrcweir 
280cdf0e10cSrcweir         // clean up
281cdf0e10cSrcweir         {
282cdf0e10cSrcweir 
283cdf0e10cSrcweir             ListBoxAccessibleBase::disposing();
284cdf0e10cSrcweir         }
285cdf0e10cSrcweir         m_aParent = WeakReference< XAccessible >();
286cdf0e10cSrcweir     }
287cdf0e10cSrcweir     // -----------------------------------------------------------------------------
288cdf0e10cSrcweir     // XServiceInfo
289cdf0e10cSrcweir     // -----------------------------------------------------------------------------
getImplementationName()290cdf0e10cSrcweir     ::rtl::OUString SAL_CALL AccessibleListBoxEntry::getImplementationName() throw(RuntimeException)
291cdf0e10cSrcweir     {
292cdf0e10cSrcweir         return getImplementationName_Static();
293cdf0e10cSrcweir     }
294cdf0e10cSrcweir     // -----------------------------------------------------------------------------
getSupportedServiceNames()295cdf0e10cSrcweir     Sequence< ::rtl::OUString > SAL_CALL AccessibleListBoxEntry::getSupportedServiceNames() throw(RuntimeException)
296cdf0e10cSrcweir     {
297cdf0e10cSrcweir         return getSupportedServiceNames_Static();
298cdf0e10cSrcweir     }
299cdf0e10cSrcweir     // -----------------------------------------------------------------------------
supportsService(const::rtl::OUString & _rServiceName)300cdf0e10cSrcweir     sal_Bool SAL_CALL AccessibleListBoxEntry::supportsService( const ::rtl::OUString& _rServiceName ) throw (RuntimeException)
301cdf0e10cSrcweir     {
302cdf0e10cSrcweir         Sequence< ::rtl::OUString > aSupported( getSupportedServiceNames() );
303cdf0e10cSrcweir         const ::rtl::OUString* pSupported = aSupported.getConstArray();
304cdf0e10cSrcweir         const ::rtl::OUString* pEnd = pSupported + aSupported.getLength();
305cdf0e10cSrcweir         for ( ; pSupported != pEnd && !pSupported->equals(_rServiceName); ++pSupported )
306cdf0e10cSrcweir             ;
307cdf0e10cSrcweir 
308cdf0e10cSrcweir         return pSupported != pEnd;
309cdf0e10cSrcweir     }
310cdf0e10cSrcweir     // -----------------------------------------------------------------------------
311cdf0e10cSrcweir     // XServiceInfo - static methods
312cdf0e10cSrcweir     // -----------------------------------------------------------------------------
getSupportedServiceNames_Static(void)313cdf0e10cSrcweir     Sequence< ::rtl::OUString > AccessibleListBoxEntry::getSupportedServiceNames_Static(void) throw( RuntimeException )
314cdf0e10cSrcweir     {
315cdf0e10cSrcweir         Sequence< ::rtl::OUString > aSupported(3);
316cdf0e10cSrcweir         aSupported[0] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.accessibility.AccessibleContext") );
317cdf0e10cSrcweir         aSupported[1] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.accessibility.AccessibleComponent") );
318cdf0e10cSrcweir         aSupported[2] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.awt.AccessibleTreeListBoxEntry") );
319cdf0e10cSrcweir         return aSupported;
320cdf0e10cSrcweir     }
321cdf0e10cSrcweir     // -----------------------------------------------------------------------------
getImplementationName_Static(void)322cdf0e10cSrcweir     ::rtl::OUString AccessibleListBoxEntry::getImplementationName_Static(void) throw( RuntimeException )
323cdf0e10cSrcweir     {
324cdf0e10cSrcweir         return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.comp.svtools.AccessibleTreeListBoxEntry") );
325cdf0e10cSrcweir     }
326cdf0e10cSrcweir     // -----------------------------------------------------------------------------
327cdf0e10cSrcweir     // XAccessible
328cdf0e10cSrcweir     // -----------------------------------------------------------------------------
getAccessibleContext()329cdf0e10cSrcweir     Reference< XAccessibleContext > SAL_CALL AccessibleListBoxEntry::getAccessibleContext(  ) throw (RuntimeException)
330cdf0e10cSrcweir     {
331cdf0e10cSrcweir         EnsureIsAlive();
332cdf0e10cSrcweir         return this;
333cdf0e10cSrcweir     }
334cdf0e10cSrcweir     // -----------------------------------------------------------------------------
335cdf0e10cSrcweir     // XAccessibleContext
336cdf0e10cSrcweir     // -----------------------------------------------------------------------------
getAccessibleChildCount()337cdf0e10cSrcweir     sal_Int32 SAL_CALL AccessibleListBoxEntry::getAccessibleChildCount(  ) throw (RuntimeException)
338cdf0e10cSrcweir     {
339cdf0e10cSrcweir         ALBSolarGuard aSolarGuard;
340cdf0e10cSrcweir         ::osl::MutexGuard aGuard( m_aMutex );
341cdf0e10cSrcweir 
342cdf0e10cSrcweir         EnsureIsAlive();
343cdf0e10cSrcweir         SvLBoxEntry* pEntry = getListBox()->GetEntryFromPath( m_aEntryPath );
344cdf0e10cSrcweir         sal_Int32 nCount = 0;
345cdf0e10cSrcweir         if ( pEntry )
346cdf0e10cSrcweir             nCount = getListBox()->GetLevelChildCount( pEntry );
347cdf0e10cSrcweir 
348cdf0e10cSrcweir         return nCount;
349cdf0e10cSrcweir     }
350cdf0e10cSrcweir     // -----------------------------------------------------------------------------
getAccessibleChild(sal_Int32 i)351cdf0e10cSrcweir     Reference< XAccessible > SAL_CALL AccessibleListBoxEntry::getAccessibleChild( sal_Int32 i ) throw (IndexOutOfBoundsException,RuntimeException)
352cdf0e10cSrcweir     {
353cdf0e10cSrcweir         ALBSolarGuard aSolarGuard;
354cdf0e10cSrcweir         ::osl::MutexGuard aGuard( m_aMutex );
355cdf0e10cSrcweir         EnsureIsAlive();
356cdf0e10cSrcweir 
35721075d77SSteve Yin //      SvLBoxEntry* pParent = getListBox()->GetEntryFromPath( m_aEntryPath );
35821075d77SSteve Yin //      SvLBoxEntry* pEntry = pParent ? getListBox()->GetEntry( pParent, i ) : NULL;
35921075d77SSteve Yin         SvLBoxEntry* pEntry =GetRealChild(i);
360cdf0e10cSrcweir         if ( !pEntry )
361cdf0e10cSrcweir             throw IndexOutOfBoundsException();
362cdf0e10cSrcweir 
363cdf0e10cSrcweir         return new AccessibleListBoxEntry( *getListBox(), pEntry, this );
364cdf0e10cSrcweir     }
365cdf0e10cSrcweir 
366cdf0e10cSrcweir     // -----------------------------------------------------------------------------
implGetParentAccessible() const367cdf0e10cSrcweir     Reference< XAccessible > AccessibleListBoxEntry::implGetParentAccessible( ) const
368cdf0e10cSrcweir     {
369cdf0e10cSrcweir         Reference< XAccessible > xParent = (Reference< XAccessible >)m_aParent;
370cdf0e10cSrcweir         if ( !xParent.is() )
371cdf0e10cSrcweir         {
372cdf0e10cSrcweir             DBG_ASSERT( m_aEntryPath.size(), "AccessibleListBoxEntry::getAccessibleParent: invalid path!" );
373cdf0e10cSrcweir             if ( 1 == m_aEntryPath.size() )
374cdf0e10cSrcweir             {   // we're a top level entry
375cdf0e10cSrcweir                 // -> our parent is the tree listbox itself
376cdf0e10cSrcweir                 if ( getListBox() )
377cdf0e10cSrcweir                     xParent = getListBox()->GetAccessible( );
378cdf0e10cSrcweir             }
379cdf0e10cSrcweir             else
380cdf0e10cSrcweir             {   // we have a entry as parent -> get it's accessible
381cdf0e10cSrcweir 
382cdf0e10cSrcweir                 // shorten our access path by one
383cdf0e10cSrcweir                 ::std::deque< sal_Int32 > aParentPath( m_aEntryPath );
384cdf0e10cSrcweir                 aParentPath.pop_back();
385cdf0e10cSrcweir 
386cdf0e10cSrcweir                 // get the entry for this shortened access path
387cdf0e10cSrcweir                 SvLBoxEntry* pParentEntry = getListBox()->GetEntryFromPath( m_aEntryPath );
388cdf0e10cSrcweir                 DBG_ASSERT( pParentEntry, "AccessibleListBoxEntry::implGetParentAccessible: could not obtain a parent entry!" );
389cdf0e10cSrcweir 
39021075d77SSteve Yin                 if ( pParentEntry )
39121075d77SSteve Yin                     pParentEntry = getListBox()->GetParent(pParentEntry);
392cdf0e10cSrcweir                 if ( pParentEntry )
393cdf0e10cSrcweir                     xParent = new AccessibleListBoxEntry( *getListBox(), pParentEntry, NULL );
394cdf0e10cSrcweir                     // note that we pass NULL here as parent-accessible:
395cdf0e10cSrcweir                     // this is allowed, as the AccessibleListBoxEntry class will create it's parent
396cdf0e10cSrcweir                     // when needed
397cdf0e10cSrcweir             }
398cdf0e10cSrcweir         }
399cdf0e10cSrcweir 
400cdf0e10cSrcweir         return xParent;
401cdf0e10cSrcweir     }
402cdf0e10cSrcweir 
403cdf0e10cSrcweir     // -----------------------------------------------------------------------------
getAccessibleParent()404cdf0e10cSrcweir     Reference< XAccessible > SAL_CALL AccessibleListBoxEntry::getAccessibleParent(  ) throw (RuntimeException)
405cdf0e10cSrcweir     {
406cdf0e10cSrcweir         ALBSolarGuard aSolarGuard;
407cdf0e10cSrcweir         ::osl::MutexGuard aGuard( m_aMutex );
408cdf0e10cSrcweir         EnsureIsAlive();
409cdf0e10cSrcweir 
410cdf0e10cSrcweir         return implGetParentAccessible( );
411cdf0e10cSrcweir     }
412cdf0e10cSrcweir     // -----------------------------------------------------------------------------
getAccessibleIndexInParent()413cdf0e10cSrcweir     sal_Int32 SAL_CALL AccessibleListBoxEntry::getAccessibleIndexInParent(  ) throw (RuntimeException)
414cdf0e10cSrcweir     {
415cdf0e10cSrcweir         ::osl::MutexGuard aGuard( m_aMutex );
416cdf0e10cSrcweir 
417cdf0e10cSrcweir         DBG_ASSERT( !m_aEntryPath.empty(), "empty path" );
418cdf0e10cSrcweir         return m_aEntryPath.empty() ? -1 : m_aEntryPath.back();
419cdf0e10cSrcweir     }
420cdf0e10cSrcweir     // -----------------------------------------------------------------------------
getRoleType()42121075d77SSteve Yin     sal_Int32 SAL_CALL AccessibleListBoxEntry::getRoleType()
42221075d77SSteve Yin     {
42321075d77SSteve Yin         sal_Int32 nCase = 0;
42421075d77SSteve Yin         SvLBoxEntry* pEntry = getListBox()->GetEntry(0);
42521075d77SSteve Yin         if ( pEntry )
42621075d77SSteve Yin         {
42721075d77SSteve Yin             if( pEntry->HasChildsOnDemand() || getListBox()->GetChildCount(pEntry) > 0  )
42821075d77SSteve Yin             {
42921075d77SSteve Yin                 nCase = 1;
43021075d77SSteve Yin                 return nCase;
43121075d77SSteve Yin             }
43221075d77SSteve Yin         }
43321075d77SSteve Yin 
43421075d77SSteve Yin         sal_Bool bHasButtons = (getListBox()->GetStyle() & WB_HASBUTTONS)!=0;
43521075d77SSteve Yin         if( !(getListBox()->GetTreeFlags() & TREEFLAG_CHKBTN) )
43621075d77SSteve Yin         {
43721075d77SSteve Yin             if( bHasButtons )
43821075d77SSteve Yin                 nCase = 1;
43921075d77SSteve Yin         }
44021075d77SSteve Yin         else
44121075d77SSteve Yin         {
44221075d77SSteve Yin             if( bHasButtons )
44321075d77SSteve Yin                 nCase = 2;
44421075d77SSteve Yin              else
44521075d77SSteve Yin                 nCase = 3;
44621075d77SSteve Yin         }
44721075d77SSteve Yin         return nCase;
44821075d77SSteve Yin     }
getAccessibleRole()449cdf0e10cSrcweir     sal_Int16 SAL_CALL AccessibleListBoxEntry::getAccessibleRole(  ) throw (RuntimeException)
450cdf0e10cSrcweir     {
45121075d77SSteve Yin         SvTreeListBox* pBox = getListBox();
45221075d77SSteve Yin         if(pBox)
45321075d77SSteve Yin         {
45421075d77SSteve Yin             short nType = pBox->GetAllEntriesAccessibleRoleType();
45521075d77SSteve Yin             if( nType == TREEBOX_ALLITEM_ACCROLE_TYPE_TREE)
45621075d77SSteve Yin                     return AccessibleRole::TREE_ITEM;
45721075d77SSteve Yin             else if( nType == TREEBOX_ALLITEM_ACCROLE_TYPE_LIST)
45821075d77SSteve Yin                     return AccessibleRole::LIST_ITEM;
45921075d77SSteve Yin         }
46021075d77SSteve Yin 
46121075d77SSteve Yin         sal_uInt16 treeFlag = pBox->GetTreeFlags();
46221075d77SSteve Yin         if(treeFlag & TREEFLAG_CHKBTN )
46321075d77SSteve Yin         {
46421075d77SSteve Yin             SvLBoxEntry* pEntry = pBox->GetEntryFromPath( m_aEntryPath );
46521075d77SSteve Yin             SvButtonState eState = pBox->GetCheckButtonState( pEntry );
46621075d77SSteve Yin             switch( eState )
46721075d77SSteve Yin             {
46821075d77SSteve Yin                 case SV_BUTTON_CHECKED:
46921075d77SSteve Yin                 case SV_BUTTON_UNCHECKED:
47021075d77SSteve Yin                     return AccessibleRole::CHECK_BOX;
47121075d77SSteve Yin                 case SV_BUTTON_TRISTATE:
47221075d77SSteve Yin                 default:
473cdf0e10cSrcweir                     return AccessibleRole::LABEL;
474cdf0e10cSrcweir             }
47521075d77SSteve Yin         }
47621075d77SSteve Yin         else
47721075d77SSteve Yin         {
47821075d77SSteve Yin 
47921075d77SSteve Yin         if(getRoleType() == 0)
48021075d77SSteve Yin             return AccessibleRole::LIST_ITEM;
48121075d77SSteve Yin         else
48221075d77SSteve Yin             //o is: return AccessibleRole::LABEL;
48321075d77SSteve Yin             return AccessibleRole::TREE_ITEM;
48421075d77SSteve Yin         }
48521075d77SSteve Yin     }
486cdf0e10cSrcweir     // -----------------------------------------------------------------------------
getAccessibleDescription()487cdf0e10cSrcweir     ::rtl::OUString SAL_CALL AccessibleListBoxEntry::getAccessibleDescription(  ) throw (RuntimeException)
488cdf0e10cSrcweir     {
489cdf0e10cSrcweir         // no description for every item
49021075d77SSteve Yin         SvLBoxEntry* pEntry = getListBox()->GetEntryFromPath( m_aEntryPath );
49121075d77SSteve Yin         if( getAccessibleRole() == AccessibleRole::TREE_ITEM )
49221075d77SSteve Yin         {
49321075d77SSteve Yin             return getListBox()->GetEntryLongDescription( pEntry );
49421075d77SSteve Yin         }
495*c938ccdaSJohn Bampton         //want to cout the real column number in the list box.
49621075d77SSteve Yin         sal_uInt16 iRealItemCount = 0;
49721075d77SSteve Yin         sal_uInt16 iCount = 0;
49821075d77SSteve Yin         sal_uInt16 iTotleItemCount = pEntry->ItemCount();
49921075d77SSteve Yin         SvLBoxItem* pItem;
50021075d77SSteve Yin         while( iCount < iTotleItemCount )
50121075d77SSteve Yin         {
50221075d77SSteve Yin             pItem = pEntry->GetItem( iCount );
50321075d77SSteve Yin             if ( pItem->IsA() == SV_ITEM_ID_LBOXSTRING &&
50421075d77SSteve Yin                  static_cast<SvLBoxString*>( pItem )->GetText().Len() > 0 )
50521075d77SSteve Yin             {
50621075d77SSteve Yin                 iRealItemCount++;
50721075d77SSteve Yin             }
50821075d77SSteve Yin             iCount++;
50921075d77SSteve Yin         }
51021075d77SSteve Yin         if(iRealItemCount<=1  )
51121075d77SSteve Yin         {
512cdf0e10cSrcweir             return ::rtl::OUString();
513cdf0e10cSrcweir         }
51421075d77SSteve Yin         else
51521075d77SSteve Yin         {
51621075d77SSteve Yin             return getListBox()->SearchEntryTextWithHeadTitle( pEntry );
51721075d77SSteve Yin         }
51821075d77SSteve Yin 
51921075d77SSteve Yin     }
520cdf0e10cSrcweir     // -----------------------------------------------------------------------------
getAccessibleName()521cdf0e10cSrcweir     ::rtl::OUString SAL_CALL AccessibleListBoxEntry::getAccessibleName(  ) throw (RuntimeException)
522cdf0e10cSrcweir     {
523cdf0e10cSrcweir         ::osl::MutexGuard aGuard( m_aMutex );
524cdf0e10cSrcweir 
525cdf0e10cSrcweir         EnsureIsAlive();
52621075d77SSteve Yin 
52721075d77SSteve Yin         ::rtl::OUString sRet;
52821075d77SSteve Yin         sRet = implGetText();
52921075d77SSteve Yin 
53021075d77SSteve Yin         SvLBoxEntry* pEntry = getListBox()->GetEntryFromPath( m_aEntryPath );
53121075d77SSteve Yin 
53221075d77SSteve Yin         String altText = getListBox()->GetEntryAltText( pEntry );
53321075d77SSteve Yin         if( altText.Len() > 0 )
53421075d77SSteve Yin         {
53521075d77SSteve Yin             sRet += ::rtl::OUString(' ');
53621075d77SSteve Yin             sRet += altText;
53721075d77SSteve Yin         }
53821075d77SSteve Yin 
53921075d77SSteve Yin         // IA2 CWS. Removed for now - only used in Sw/Sd/ScContentLBoxString, they should decide if they need this
54021075d77SSteve Yin         // if ( pEntry && pEntry->IsMarked())
54121075d77SSteve Yin         //  sRet = sRet + ::rtl::OUString(TK_RES_STRING(STR_SVT_ACC_LISTENTRY_SELCTED_STATE));
54221075d77SSteve Yin 
54321075d77SSteve Yin         return sRet;
544cdf0e10cSrcweir     }
545cdf0e10cSrcweir     // -----------------------------------------------------------------------------
getAccessibleRelationSet()546cdf0e10cSrcweir     Reference< XAccessibleRelationSet > SAL_CALL AccessibleListBoxEntry::getAccessibleRelationSet(  ) throw (RuntimeException)
547cdf0e10cSrcweir     {
548cdf0e10cSrcweir         Reference< XAccessibleRelationSet > xRelSet;
549cdf0e10cSrcweir         Reference< XAccessible > xParent;
550cdf0e10cSrcweir         if ( m_aEntryPath.size() > 1 ) // not a root entry
551cdf0e10cSrcweir             xParent = implGetParentAccessible();
552cdf0e10cSrcweir         if ( xParent.is() )
553cdf0e10cSrcweir         {
554cdf0e10cSrcweir             utl::AccessibleRelationSetHelper* pRelationSetHelper = new utl::AccessibleRelationSetHelper;
555cdf0e10cSrcweir             Sequence< Reference< XInterface > > aSequence(1);
556cdf0e10cSrcweir             aSequence[0] = xParent;
557cdf0e10cSrcweir             pRelationSetHelper->AddRelation(
558cdf0e10cSrcweir                 AccessibleRelation( AccessibleRelationType::NODE_CHILD_OF, aSequence ) );
559cdf0e10cSrcweir             xRelSet = pRelationSetHelper;
560cdf0e10cSrcweir         }
561cdf0e10cSrcweir         return xRelSet;
562cdf0e10cSrcweir     }
563cdf0e10cSrcweir     // -----------------------------------------------------------------------------
getAccessibleStateSet()564cdf0e10cSrcweir     Reference< XAccessibleStateSet > SAL_CALL AccessibleListBoxEntry::getAccessibleStateSet(  ) throw (RuntimeException)
565cdf0e10cSrcweir     {
566cdf0e10cSrcweir         ::osl::MutexGuard aGuard( m_aMutex );
567cdf0e10cSrcweir 
568cdf0e10cSrcweir         utl::AccessibleStateSetHelper* pStateSetHelper = new utl::AccessibleStateSetHelper;
569cdf0e10cSrcweir         Reference< XAccessibleStateSet > xStateSet = pStateSetHelper;
570cdf0e10cSrcweir 
571cdf0e10cSrcweir         if ( IsAlive_Impl() )
572cdf0e10cSrcweir         {
57321075d77SSteve Yin             switch(getAccessibleRole())
57421075d77SSteve Yin             {
57521075d77SSteve Yin                 case AccessibleRole::LABEL:
576cdf0e10cSrcweir                     pStateSetHelper->AddState( AccessibleStateType::TRANSIENT );
577cdf0e10cSrcweir                     pStateSetHelper->AddState( AccessibleStateType::SELECTABLE );
578cdf0e10cSrcweir                     pStateSetHelper->AddState( AccessibleStateType::ENABLED );
579cdf0e10cSrcweir                     if ( getListBox()->IsInplaceEditingEnabled() )
580cdf0e10cSrcweir                         pStateSetHelper->AddState( AccessibleStateType::EDITABLE );
581cdf0e10cSrcweir                     if ( IsShowing_Impl() )
582cdf0e10cSrcweir                             pStateSetHelper->AddState( AccessibleStateType::SHOWING );
58321075d77SSteve Yin                     break;
58421075d77SSteve Yin                 case AccessibleRole::CHECK_BOX:
58521075d77SSteve Yin                     pStateSetHelper->AddState( AccessibleStateType::TRANSIENT );
58621075d77SSteve Yin                     pStateSetHelper->AddState( AccessibleStateType::SELECTABLE );
58721075d77SSteve Yin                     pStateSetHelper->AddState( AccessibleStateType::ENABLED );
58821075d77SSteve Yin                     if ( IsShowing_Impl() )
58921075d77SSteve Yin                             pStateSetHelper->AddState( AccessibleStateType::SHOWING );
59021075d77SSteve Yin                     break;
59121075d77SSteve Yin             }
592cdf0e10cSrcweir             getListBox()->FillAccessibleEntryStateSet(
593cdf0e10cSrcweir                 getListBox()->GetEntryFromPath( m_aEntryPath ), *pStateSetHelper );
594cdf0e10cSrcweir         }
595cdf0e10cSrcweir         else
596cdf0e10cSrcweir             pStateSetHelper->AddState( AccessibleStateType::DEFUNC );
597cdf0e10cSrcweir 
598cdf0e10cSrcweir         return xStateSet;
599cdf0e10cSrcweir     }
600cdf0e10cSrcweir     // -----------------------------------------------------------------------------
getLocale()601cdf0e10cSrcweir     Locale SAL_CALL AccessibleListBoxEntry::getLocale(  ) throw (IllegalAccessibleComponentStateException, RuntimeException)
602cdf0e10cSrcweir     {
603cdf0e10cSrcweir         ALBSolarGuard aSolarGuard;
604cdf0e10cSrcweir         ::osl::MutexGuard aGuard( m_aMutex );
605cdf0e10cSrcweir 
606cdf0e10cSrcweir         return implGetLocale();
607cdf0e10cSrcweir     }
608cdf0e10cSrcweir     // -----------------------------------------------------------------------------
609cdf0e10cSrcweir     // XAccessibleComponent
610cdf0e10cSrcweir     // -----------------------------------------------------------------------------
containsPoint(const awt::Point & rPoint)611cdf0e10cSrcweir     sal_Bool SAL_CALL AccessibleListBoxEntry::containsPoint( const awt::Point& rPoint ) throw (RuntimeException)
612cdf0e10cSrcweir     {
613cdf0e10cSrcweir         return Rectangle( Point(), GetBoundingBox().GetSize() ).IsInside( VCLPoint( rPoint ) );
614cdf0e10cSrcweir     }
615cdf0e10cSrcweir     // -----------------------------------------------------------------------------
getAccessibleAtPoint(const awt::Point & _aPoint)616cdf0e10cSrcweir     Reference< XAccessible > SAL_CALL AccessibleListBoxEntry::getAccessibleAtPoint( const awt::Point& _aPoint ) throw (RuntimeException)
617cdf0e10cSrcweir     {
618cdf0e10cSrcweir         ALBSolarGuard aSolarGuard;
619cdf0e10cSrcweir         ::osl::MutexGuard aGuard( m_aMutex );
620cdf0e10cSrcweir 
621cdf0e10cSrcweir         EnsureIsAlive();
622cdf0e10cSrcweir         SvLBoxEntry* pEntry = getListBox()->GetEntry( VCLPoint( _aPoint ) );
623cdf0e10cSrcweir         if ( !pEntry )
624cdf0e10cSrcweir             throw RuntimeException();
625cdf0e10cSrcweir 
626cdf0e10cSrcweir         Reference< XAccessible > xAcc;
627cdf0e10cSrcweir         AccessibleListBoxEntry* pAccEntry = new AccessibleListBoxEntry( *getListBox(), pEntry, this );
628cdf0e10cSrcweir         Rectangle aRect = pAccEntry->GetBoundingBox_Impl();
629cdf0e10cSrcweir         if ( aRect.IsInside( VCLPoint( _aPoint ) ) )
630cdf0e10cSrcweir             xAcc = pAccEntry;
631cdf0e10cSrcweir         return xAcc;
632cdf0e10cSrcweir     }
633cdf0e10cSrcweir     // -----------------------------------------------------------------------------
getBounds()634cdf0e10cSrcweir     awt::Rectangle SAL_CALL AccessibleListBoxEntry::getBounds(  ) throw (RuntimeException)
635cdf0e10cSrcweir     {
636cdf0e10cSrcweir         return AWTRectangle( GetBoundingBox() );
637cdf0e10cSrcweir     }
638cdf0e10cSrcweir     // -----------------------------------------------------------------------------
getLocation()639cdf0e10cSrcweir     awt::Point SAL_CALL AccessibleListBoxEntry::getLocation(  ) throw (RuntimeException)
640cdf0e10cSrcweir     {
641cdf0e10cSrcweir         return AWTPoint( GetBoundingBox().TopLeft() );
642cdf0e10cSrcweir     }
643cdf0e10cSrcweir     // -----------------------------------------------------------------------------
getLocationOnScreen()644cdf0e10cSrcweir     awt::Point SAL_CALL AccessibleListBoxEntry::getLocationOnScreen(  ) throw (RuntimeException)
645cdf0e10cSrcweir     {
646cdf0e10cSrcweir         return AWTPoint( GetBoundingBoxOnScreen().TopLeft() );
647cdf0e10cSrcweir     }
648cdf0e10cSrcweir     // -----------------------------------------------------------------------------
getSize()649cdf0e10cSrcweir     awt::Size SAL_CALL AccessibleListBoxEntry::getSize(  ) throw (RuntimeException)
650cdf0e10cSrcweir     {
651cdf0e10cSrcweir         return AWTSize( GetBoundingBox().GetSize() );
652cdf0e10cSrcweir     }
653cdf0e10cSrcweir     // -----------------------------------------------------------------------------
grabFocus()654cdf0e10cSrcweir     void SAL_CALL AccessibleListBoxEntry::grabFocus(  ) throw (RuntimeException)
655cdf0e10cSrcweir     {
656cdf0e10cSrcweir         // do nothing, because no focus for each item
657cdf0e10cSrcweir     }
658cdf0e10cSrcweir     // -----------------------------------------------------------------------------
getForeground()659cdf0e10cSrcweir     sal_Int32 AccessibleListBoxEntry::getForeground(    ) throw (RuntimeException)
660cdf0e10cSrcweir     {
661cdf0e10cSrcweir         ALBSolarGuard aSolarGuard;
662cdf0e10cSrcweir         ::osl::MutexGuard aGuard( m_aMutex );
663cdf0e10cSrcweir 
664cdf0e10cSrcweir         sal_Int32 nColor = 0;
665cdf0e10cSrcweir         Reference< XAccessible > xParent = getAccessibleParent();
666cdf0e10cSrcweir         if ( xParent.is() )
667cdf0e10cSrcweir         {
668cdf0e10cSrcweir             Reference< XAccessibleComponent > xParentComp( xParent->getAccessibleContext(), UNO_QUERY );
669cdf0e10cSrcweir             if ( xParentComp.is() )
670cdf0e10cSrcweir                 nColor = xParentComp->getForeground();
671cdf0e10cSrcweir         }
672cdf0e10cSrcweir 
673cdf0e10cSrcweir         return nColor;
674cdf0e10cSrcweir     }
675cdf0e10cSrcweir     // -----------------------------------------------------------------------------
getBackground()676cdf0e10cSrcweir     sal_Int32 AccessibleListBoxEntry::getBackground(  ) throw (RuntimeException)
677cdf0e10cSrcweir     {
678cdf0e10cSrcweir         ALBSolarGuard aSolarGuard;
679cdf0e10cSrcweir         ::osl::MutexGuard aGuard( m_aMutex );
680cdf0e10cSrcweir 
681cdf0e10cSrcweir         sal_Int32 nColor = 0;
682cdf0e10cSrcweir         Reference< XAccessible > xParent = getAccessibleParent();
683cdf0e10cSrcweir         if ( xParent.is() )
684cdf0e10cSrcweir         {
685cdf0e10cSrcweir             Reference< XAccessibleComponent > xParentComp( xParent->getAccessibleContext(), UNO_QUERY );
686cdf0e10cSrcweir             if ( xParentComp.is() )
687cdf0e10cSrcweir                 nColor = xParentComp->getBackground();
688cdf0e10cSrcweir         }
689cdf0e10cSrcweir 
690cdf0e10cSrcweir         return nColor;
691cdf0e10cSrcweir     }
692cdf0e10cSrcweir     // -----------------------------------------------------------------------------
693cdf0e10cSrcweir     // XAccessibleText
694cdf0e10cSrcweir     // -----------------------------------------------------------------------------
695cdf0e10cSrcweir     // -----------------------------------------------------------------------------
getCharacterBounds(sal_Int32 nIndex)696cdf0e10cSrcweir     awt::Rectangle SAL_CALL AccessibleListBoxEntry::getCharacterBounds( sal_Int32 nIndex ) throw (IndexOutOfBoundsException, RuntimeException)
697cdf0e10cSrcweir     {
698cdf0e10cSrcweir         ALBSolarGuard aSolarGuard;
699cdf0e10cSrcweir         ::osl::MutexGuard aGuard( m_aMutex );
700cdf0e10cSrcweir 
701cdf0e10cSrcweir         EnsureIsAlive();
702cdf0e10cSrcweir 
703cdf0e10cSrcweir         if ( !implIsValidIndex( nIndex, implGetText().getLength() ) )
704cdf0e10cSrcweir             throw IndexOutOfBoundsException();
705cdf0e10cSrcweir 
706cdf0e10cSrcweir         awt::Rectangle aBounds( 0, 0, 0, 0 );
707cdf0e10cSrcweir         SvLBoxEntry* pEntry = getListBox()->GetEntryFromPath( m_aEntryPath );
708cdf0e10cSrcweir         if ( pEntry )
709cdf0e10cSrcweir         {
710cdf0e10cSrcweir             ::vcl::ControlLayoutData aLayoutData;
711cdf0e10cSrcweir             Rectangle aItemRect = GetBoundingBox();
712cdf0e10cSrcweir             getListBox()->RecordLayoutData( &aLayoutData, aItemRect );
713cdf0e10cSrcweir             Rectangle aCharRect = aLayoutData.GetCharacterBounds( nIndex );
714cdf0e10cSrcweir             aCharRect.Move( -aItemRect.Left(), -aItemRect.Top() );
715cdf0e10cSrcweir             aBounds = AWTRectangle( aCharRect );
716cdf0e10cSrcweir         }
717cdf0e10cSrcweir 
718cdf0e10cSrcweir         return aBounds;
719cdf0e10cSrcweir     }
720cdf0e10cSrcweir     // -----------------------------------------------------------------------------
getIndexAtPoint(const awt::Point & aPoint)721cdf0e10cSrcweir     sal_Int32 SAL_CALL AccessibleListBoxEntry::getIndexAtPoint( const awt::Point& aPoint ) throw (RuntimeException)
722cdf0e10cSrcweir     {
723cdf0e10cSrcweir         ALBSolarGuard aSolarGuard;
724cdf0e10cSrcweir         ::osl::MutexGuard aGuard( m_aMutex );
725cdf0e10cSrcweir         EnsureIsAlive();
72621075d77SSteve Yin         if(aPoint.X==0 && aPoint.Y==0) return 0;
727cdf0e10cSrcweir 
728cdf0e10cSrcweir         sal_Int32 nIndex = -1;
729cdf0e10cSrcweir         SvLBoxEntry* pEntry = getListBox()->GetEntryFromPath( m_aEntryPath );
730cdf0e10cSrcweir         if ( pEntry )
731cdf0e10cSrcweir         {
732cdf0e10cSrcweir             ::vcl::ControlLayoutData aLayoutData;
733cdf0e10cSrcweir             Rectangle aItemRect = GetBoundingBox();
734cdf0e10cSrcweir             getListBox()->RecordLayoutData( &aLayoutData, aItemRect );
735cdf0e10cSrcweir             Point aPnt( VCLPoint( aPoint ) );
736cdf0e10cSrcweir             aPnt += aItemRect.TopLeft();
737cdf0e10cSrcweir             nIndex = aLayoutData.GetIndexForPoint( aPnt );
738cdf0e10cSrcweir         }
739cdf0e10cSrcweir 
740cdf0e10cSrcweir         return nIndex;
741cdf0e10cSrcweir     }
742cdf0e10cSrcweir     // -----------------------------------------------------------------------------
copyText(sal_Int32 nStartIndex,sal_Int32 nEndIndex)743cdf0e10cSrcweir     sal_Bool SAL_CALL AccessibleListBoxEntry::copyText( sal_Int32 nStartIndex, sal_Int32 nEndIndex ) throw (IndexOutOfBoundsException, RuntimeException)
744cdf0e10cSrcweir     {
745cdf0e10cSrcweir         ALBSolarGuard aSolarGuard;
746cdf0e10cSrcweir         ::osl::MutexGuard aGuard( m_aMutex );
747cdf0e10cSrcweir         EnsureIsAlive();
748cdf0e10cSrcweir 
749cdf0e10cSrcweir         String sText = getText();
750cdf0e10cSrcweir         if  ( ( 0 > nStartIndex ) || ( sText.Len() <= nStartIndex )
751cdf0e10cSrcweir             || ( 0 > nEndIndex ) || ( sText.Len() <= nEndIndex ) )
752cdf0e10cSrcweir             throw IndexOutOfBoundsException();
753cdf0e10cSrcweir 
754cdf0e10cSrcweir         sal_Int32 nLen = nEndIndex - nStartIndex + 1;
755cdf0e10cSrcweir         ::svt::OStringTransfer::CopyString( sText.Copy( (sal_uInt16)nStartIndex, (sal_uInt16)nLen ), getListBox() );
756cdf0e10cSrcweir 
757cdf0e10cSrcweir         return sal_True;
758cdf0e10cSrcweir     }
759cdf0e10cSrcweir     // -----------------------------------------------------------------------------
760cdf0e10cSrcweir     // XAccessibleEventBroadcaster
761cdf0e10cSrcweir     // -----------------------------------------------------------------------------
addEventListener(const Reference<XAccessibleEventListener> & xListener)762cdf0e10cSrcweir     void SAL_CALL AccessibleListBoxEntry::addEventListener( const Reference< XAccessibleEventListener >& xListener ) throw (RuntimeException)
763cdf0e10cSrcweir     {
764cdf0e10cSrcweir         if (xListener.is())
765cdf0e10cSrcweir         {
766cdf0e10cSrcweir             ::osl::MutexGuard aGuard( m_aMutex );
767cdf0e10cSrcweir             if (!m_nClientId)
768cdf0e10cSrcweir                 m_nClientId = comphelper::AccessibleEventNotifier::registerClient( );
769cdf0e10cSrcweir             comphelper::AccessibleEventNotifier::addEventListener( m_nClientId, xListener );
770cdf0e10cSrcweir         }
771cdf0e10cSrcweir     }
772cdf0e10cSrcweir     // -----------------------------------------------------------------------------
removeEventListener(const Reference<XAccessibleEventListener> & xListener)773cdf0e10cSrcweir     void SAL_CALL AccessibleListBoxEntry::removeEventListener( const Reference< XAccessibleEventListener >& xListener ) throw (RuntimeException)
774cdf0e10cSrcweir     {
775cdf0e10cSrcweir         if (xListener.is())
776cdf0e10cSrcweir         {
777cdf0e10cSrcweir             ::osl::MutexGuard aGuard( m_aMutex );
778cdf0e10cSrcweir 
779cdf0e10cSrcweir             sal_Int32 nListenerCount = comphelper::AccessibleEventNotifier::removeEventListener( m_nClientId, xListener );
780cdf0e10cSrcweir             if ( !nListenerCount )
781cdf0e10cSrcweir             {
782cdf0e10cSrcweir                 // no listeners anymore
783cdf0e10cSrcweir                 // -> revoke ourself. This may lead to the notifier thread dying (if we were the last client),
784cdf0e10cSrcweir                 // and at least to us not firing any events anymore, in case somebody calls
785cdf0e10cSrcweir                 // NotifyAccessibleEvent, again
786cdf0e10cSrcweir                 sal_Int32 nId = m_nClientId;
787cdf0e10cSrcweir                 m_nClientId = 0;
788cdf0e10cSrcweir                 comphelper::AccessibleEventNotifier::revokeClient( nId );
789cdf0e10cSrcweir 
790cdf0e10cSrcweir             }
791cdf0e10cSrcweir         }
792cdf0e10cSrcweir     }
793cdf0e10cSrcweir     // -----------------------------------------------------------------------------
794cdf0e10cSrcweir     // XAccessibleAction
795cdf0e10cSrcweir     // -----------------------------------------------------------------------------
getAccessibleActionCount()796cdf0e10cSrcweir     sal_Int32 SAL_CALL AccessibleListBoxEntry::getAccessibleActionCount(  ) throw (RuntimeException)
797cdf0e10cSrcweir     {
798cdf0e10cSrcweir         ::osl::MutexGuard aGuard( m_aMutex );
799cdf0e10cSrcweir 
800cdf0e10cSrcweir         // three actions supported
80121075d77SSteve Yin         SvTreeListBox* pBox = getListBox();
80221075d77SSteve Yin         sal_uInt16 treeFlag = pBox->GetTreeFlags();
80321075d77SSteve Yin         sal_Bool bHasButtons = (getListBox()->GetStyle() & WB_HASBUTTONS)!=0;
80421075d77SSteve Yin         if( (treeFlag & TREEFLAG_CHKBTN) && !bHasButtons)
80521075d77SSteve Yin         {
80621075d77SSteve Yin             sal_Int16 role = getAccessibleRole();
80721075d77SSteve Yin             if ( role == AccessibleRole::CHECK_BOX )
80821075d77SSteve Yin                 return 2;
80921075d77SSteve Yin             else if ( role == AccessibleRole::LABEL )
81021075d77SSteve Yin                 return 0;
81121075d77SSteve Yin         }
81221075d77SSteve Yin         else
813cdf0e10cSrcweir             return ACCESSIBLE_ACTION_COUNT;
81421075d77SSteve Yin         return 0;
815cdf0e10cSrcweir     }
816cdf0e10cSrcweir     // -----------------------------------------------------------------------------
doAccessibleAction(sal_Int32 nIndex)817cdf0e10cSrcweir     sal_Bool SAL_CALL AccessibleListBoxEntry::doAccessibleAction( sal_Int32 nIndex ) throw (IndexOutOfBoundsException, RuntimeException)
818cdf0e10cSrcweir     {
819cdf0e10cSrcweir         ALBSolarGuard aSolarGuard;
820cdf0e10cSrcweir         ::osl::MutexGuard aGuard( m_aMutex );
821cdf0e10cSrcweir 
822cdf0e10cSrcweir         sal_Bool bRet = sal_False;
823cdf0e10cSrcweir         checkActionIndex_Impl( nIndex );
824cdf0e10cSrcweir         EnsureIsAlive();
82521075d77SSteve Yin         sal_uInt16 treeFlag = getListBox()->GetTreeFlags();
82621075d77SSteve Yin         if( nIndex == 0 && (treeFlag & TREEFLAG_CHKBTN) )
82721075d77SSteve Yin         {
82821075d77SSteve Yin             if(getAccessibleRole() == AccessibleRole::CHECK_BOX)
82921075d77SSteve Yin             {
83021075d77SSteve Yin                 SvLBoxEntry* pEntry = getListBox()->GetEntryFromPath( m_aEntryPath );
83121075d77SSteve Yin                 SvButtonState state = getListBox()->GetCheckButtonState( pEntry );
83221075d77SSteve Yin                 if ( state == SV_BUTTON_CHECKED )
83321075d77SSteve Yin                     getListBox()->SetCheckButtonState(pEntry, (SvButtonState)SV_BMP_UNCHECKED);
83421075d77SSteve Yin                 else if (state == SV_BMP_UNCHECKED)
83521075d77SSteve Yin                     getListBox()->SetCheckButtonState(pEntry, (SvButtonState)SV_BUTTON_CHECKED);
83621075d77SSteve Yin             }
83721075d77SSteve Yin         }else if( (nIndex == 1 && (treeFlag & TREEFLAG_CHKBTN) ) || (nIndex == 0) )
83821075d77SSteve Yin         {
839cdf0e10cSrcweir             SvLBoxEntry* pEntry = getListBox()->GetEntryFromPath( m_aEntryPath );
840cdf0e10cSrcweir             if ( pEntry )
841cdf0e10cSrcweir             {
842cdf0e10cSrcweir                 if ( getListBox()->IsExpanded( pEntry ) )
843cdf0e10cSrcweir                     getListBox()->Collapse( pEntry );
844cdf0e10cSrcweir                 else
845cdf0e10cSrcweir                     getListBox()->Expand( pEntry );
846cdf0e10cSrcweir                 bRet = sal_True;
847cdf0e10cSrcweir             }
84821075d77SSteve Yin         }
849cdf0e10cSrcweir         return bRet;
850cdf0e10cSrcweir     }
851cdf0e10cSrcweir     // -----------------------------------------------------------------------------
getAccessibleActionDescription(sal_Int32 nIndex)852cdf0e10cSrcweir     ::rtl::OUString SAL_CALL AccessibleListBoxEntry::getAccessibleActionDescription( sal_Int32 nIndex ) throw (IndexOutOfBoundsException, RuntimeException)
853cdf0e10cSrcweir     {
854cdf0e10cSrcweir         ALBSolarGuard aSolarGuard;
855cdf0e10cSrcweir         ::osl::MutexGuard aGuard( m_aMutex );
856cdf0e10cSrcweir 
857cdf0e10cSrcweir         checkActionIndex_Impl( nIndex );
858cdf0e10cSrcweir         EnsureIsAlive();
859cdf0e10cSrcweir 
860cdf0e10cSrcweir         static const ::rtl::OUString sActionDesc( RTL_CONSTASCII_USTRINGPARAM( "toggleExpand" ) );
86121075d77SSteve Yin         static const ::rtl::OUString sActionDesc1( RTL_CONSTASCII_USTRINGPARAM( "Check" ) );
86221075d77SSteve Yin         static const ::rtl::OUString sActionDesc2( RTL_CONSTASCII_USTRINGPARAM( "UnCheck" ) );
86321075d77SSteve Yin         // sal_Bool bHasButtons = (getListBox()->GetStyle() & WB_HASBUTTONS)!=0;
86421075d77SSteve Yin         SvLBoxEntry* pEntry = getListBox()->GetEntryFromPath( m_aEntryPath );
86521075d77SSteve Yin         SvButtonState state = getListBox()->GetCheckButtonState( pEntry );
86621075d77SSteve Yin         sal_uInt16 treeFlag = getListBox()->GetTreeFlags();
86721075d77SSteve Yin         if(nIndex == 0 && (treeFlag & TREEFLAG_CHKBTN))
86821075d77SSteve Yin         {
86921075d77SSteve Yin             if(getAccessibleRole() == AccessibleRole::CHECK_BOX)
87021075d77SSteve Yin             {
87121075d77SSteve Yin                 if ( state == SV_BUTTON_CHECKED )
87221075d77SSteve Yin                     return sActionDesc2;
87321075d77SSteve Yin                 else if (state == SV_BMP_UNCHECKED)
87421075d77SSteve Yin                     return sActionDesc1;
87521075d77SSteve Yin             }
87621075d77SSteve Yin             else
87721075d77SSteve Yin             {
87821075d77SSteve Yin                 //Sometimes, a List or Tree may have both checkbox and label at the same time
87921075d77SSteve Yin                 return ::rtl::OUString();
88021075d77SSteve Yin             }
88121075d77SSteve Yin         }else if( (nIndex == 1 && (treeFlag & TREEFLAG_CHKBTN)) || nIndex == 0 )
88221075d77SSteve Yin         {
88321075d77SSteve Yin             if( pEntry->HasChilds() || pEntry->HasChildsOnDemand() )
88421075d77SSteve Yin                 return getListBox()->IsExpanded( pEntry ) ? \
88521075d77SSteve Yin                 ::rtl::OUString(TK_RES_STRING(STR_SVT_ACC_ACTION_COLLAPSE)) :
88621075d77SSteve Yin                 ::rtl::OUString(TK_RES_STRING(STR_SVT_ACC_ACTION_EXPAND));
88721075d77SSteve Yin             return ::rtl::OUString();
88821075d77SSteve Yin 
88921075d77SSteve Yin         }
89021075d77SSteve Yin         throw IndexOutOfBoundsException();
891cdf0e10cSrcweir     }
892cdf0e10cSrcweir     // -----------------------------------------------------------------------------
getAccessibleActionKeyBinding(sal_Int32 nIndex)893cdf0e10cSrcweir     Reference< XAccessibleKeyBinding > AccessibleListBoxEntry::getAccessibleActionKeyBinding( sal_Int32 nIndex ) throw (IndexOutOfBoundsException, RuntimeException)
894cdf0e10cSrcweir     {
895cdf0e10cSrcweir         ::osl::MutexGuard aGuard( m_aMutex );
896cdf0e10cSrcweir 
897cdf0e10cSrcweir         Reference< XAccessibleKeyBinding > xRet;
898cdf0e10cSrcweir         checkActionIndex_Impl( nIndex );
899cdf0e10cSrcweir         // ... which key?
900cdf0e10cSrcweir         return xRet;
901cdf0e10cSrcweir     }
902cdf0e10cSrcweir     // -----------------------------------------------------------------------------
903cdf0e10cSrcweir     // XAccessibleSelection
904cdf0e10cSrcweir     // -----------------------------------------------------------------------------
selectAccessibleChild(sal_Int32 nChildIndex)905cdf0e10cSrcweir     void SAL_CALL AccessibleListBoxEntry::selectAccessibleChild( sal_Int32 nChildIndex ) throw (IndexOutOfBoundsException, RuntimeException)
906cdf0e10cSrcweir     {
907cdf0e10cSrcweir         ALBSolarGuard aSolarGuard;
908cdf0e10cSrcweir         ::osl::MutexGuard aGuard( m_aMutex );
909cdf0e10cSrcweir 
910cdf0e10cSrcweir         EnsureIsAlive();
91121075d77SSteve Yin         SvLBoxEntry* pEntry = GetRealChild(nChildIndex);
912cdf0e10cSrcweir         if ( !pEntry )
913cdf0e10cSrcweir             throw IndexOutOfBoundsException();
914cdf0e10cSrcweir 
915cdf0e10cSrcweir         getListBox()->Select( pEntry, sal_True );
916cdf0e10cSrcweir     }
917cdf0e10cSrcweir     // -----------------------------------------------------------------------------
isAccessibleChildSelected(sal_Int32 nChildIndex)918cdf0e10cSrcweir     sal_Bool SAL_CALL AccessibleListBoxEntry::isAccessibleChildSelected( sal_Int32 nChildIndex ) throw (IndexOutOfBoundsException, RuntimeException)
919cdf0e10cSrcweir     {
920cdf0e10cSrcweir         ALBSolarGuard aSolarGuard;
921cdf0e10cSrcweir         ::osl::MutexGuard aGuard( m_aMutex );
922cdf0e10cSrcweir 
923cdf0e10cSrcweir         EnsureIsAlive();
924cdf0e10cSrcweir 
925cdf0e10cSrcweir         SvLBoxEntry* pParent = getListBox()->GetEntryFromPath( m_aEntryPath );
926cdf0e10cSrcweir         SvLBoxEntry* pEntry = getListBox()->GetEntry( pParent, nChildIndex );
927cdf0e10cSrcweir         if ( !pEntry )
928cdf0e10cSrcweir             throw IndexOutOfBoundsException();
929cdf0e10cSrcweir 
930cdf0e10cSrcweir         return getListBox()->IsSelected( pEntry );
931cdf0e10cSrcweir     }
932cdf0e10cSrcweir     // -----------------------------------------------------------------------------
clearAccessibleSelection()933cdf0e10cSrcweir     void SAL_CALL AccessibleListBoxEntry::clearAccessibleSelection(  ) throw (RuntimeException)
934cdf0e10cSrcweir     {
935cdf0e10cSrcweir         ALBSolarGuard aSolarGuard;
936cdf0e10cSrcweir         ::osl::MutexGuard aGuard( m_aMutex );
937cdf0e10cSrcweir 
938cdf0e10cSrcweir         EnsureIsAlive();
939cdf0e10cSrcweir 
940cdf0e10cSrcweir         SvLBoxEntry* pParent = getListBox()->GetEntryFromPath( m_aEntryPath );
941cdf0e10cSrcweir         if ( !pParent )
942cdf0e10cSrcweir             throw RuntimeException();
943cdf0e10cSrcweir         sal_Int32 i, nCount = 0;
944cdf0e10cSrcweir         nCount = getListBox()->GetLevelChildCount( pParent );
945cdf0e10cSrcweir         for ( i = 0; i < nCount; ++i )
946cdf0e10cSrcweir         {
947cdf0e10cSrcweir             SvLBoxEntry* pEntry = getListBox()->GetEntry( pParent, i );
948cdf0e10cSrcweir             if ( getListBox()->IsSelected( pEntry ) )
949cdf0e10cSrcweir                 getListBox()->Select( pEntry, sal_False );
950cdf0e10cSrcweir         }
951cdf0e10cSrcweir     }
952cdf0e10cSrcweir     // -----------------------------------------------------------------------------
selectAllAccessibleChildren()953cdf0e10cSrcweir     void SAL_CALL AccessibleListBoxEntry::selectAllAccessibleChildren(  ) throw (RuntimeException)
954cdf0e10cSrcweir     {
955cdf0e10cSrcweir         ALBSolarGuard aSolarGuard;
956cdf0e10cSrcweir         ::osl::MutexGuard aGuard( m_aMutex );
957cdf0e10cSrcweir 
958cdf0e10cSrcweir         EnsureIsAlive();
959cdf0e10cSrcweir 
960cdf0e10cSrcweir         SvLBoxEntry* pParent = getListBox()->GetEntryFromPath( m_aEntryPath );
961cdf0e10cSrcweir         if ( !pParent )
962cdf0e10cSrcweir             throw RuntimeException();
963cdf0e10cSrcweir         sal_Int32 i, nCount = 0;
964cdf0e10cSrcweir         nCount = getListBox()->GetLevelChildCount( pParent );
965cdf0e10cSrcweir         for ( i = 0; i < nCount; ++i )
966cdf0e10cSrcweir         {
967cdf0e10cSrcweir             SvLBoxEntry* pEntry = getListBox()->GetEntry( pParent, i );
968cdf0e10cSrcweir             if ( !getListBox()->IsSelected( pEntry ) )
969cdf0e10cSrcweir                 getListBox()->Select( pEntry, sal_True );
970cdf0e10cSrcweir         }
971cdf0e10cSrcweir     }
972cdf0e10cSrcweir     // -----------------------------------------------------------------------------
getSelectedAccessibleChildCount()973cdf0e10cSrcweir     sal_Int32 SAL_CALL AccessibleListBoxEntry::getSelectedAccessibleChildCount(  ) throw (RuntimeException)
974cdf0e10cSrcweir     {
975cdf0e10cSrcweir         ALBSolarGuard aSolarGuard;
976cdf0e10cSrcweir         ::osl::MutexGuard aGuard( m_aMutex );
977cdf0e10cSrcweir 
978cdf0e10cSrcweir         EnsureIsAlive();
979cdf0e10cSrcweir 
980cdf0e10cSrcweir         sal_Int32 i, nSelCount = 0, nCount = 0;
981cdf0e10cSrcweir 
982cdf0e10cSrcweir         SvLBoxEntry* pParent = getListBox()->GetEntryFromPath( m_aEntryPath );
983cdf0e10cSrcweir         if ( !pParent )
984cdf0e10cSrcweir             throw RuntimeException();
985cdf0e10cSrcweir         nCount = getListBox()->GetLevelChildCount( pParent );
986cdf0e10cSrcweir         for ( i = 0; i < nCount; ++i )
987cdf0e10cSrcweir         {
988cdf0e10cSrcweir             SvLBoxEntry* pEntry = getListBox()->GetEntry( pParent, i );
989cdf0e10cSrcweir             if ( getListBox()->IsSelected( pEntry ) )
990cdf0e10cSrcweir                 ++nSelCount;
991cdf0e10cSrcweir         }
992cdf0e10cSrcweir 
993cdf0e10cSrcweir         return nSelCount;
994cdf0e10cSrcweir     }
995cdf0e10cSrcweir     // -----------------------------------------------------------------------------
getSelectedAccessibleChild(sal_Int32 nSelectedChildIndex)996cdf0e10cSrcweir     Reference< XAccessible > SAL_CALL AccessibleListBoxEntry::getSelectedAccessibleChild( sal_Int32 nSelectedChildIndex ) throw (IndexOutOfBoundsException, RuntimeException)
997cdf0e10cSrcweir     {
998cdf0e10cSrcweir         ALBSolarGuard aSolarGuard;
999cdf0e10cSrcweir         ::osl::MutexGuard aGuard( m_aMutex );
1000cdf0e10cSrcweir 
1001cdf0e10cSrcweir         EnsureIsAlive();
1002cdf0e10cSrcweir 
1003cdf0e10cSrcweir         if ( nSelectedChildIndex < 0 || nSelectedChildIndex >= getSelectedAccessibleChildCount() )
1004cdf0e10cSrcweir             throw IndexOutOfBoundsException();
1005cdf0e10cSrcweir 
1006cdf0e10cSrcweir         Reference< XAccessible > xChild;
1007cdf0e10cSrcweir         sal_Int32 i, nSelCount = 0, nCount = 0;
1008cdf0e10cSrcweir 
1009cdf0e10cSrcweir         SvLBoxEntry* pParent = getListBox()->GetEntryFromPath( m_aEntryPath );
1010cdf0e10cSrcweir         if ( !pParent )
1011cdf0e10cSrcweir             throw RuntimeException();
1012cdf0e10cSrcweir         nCount = getListBox()->GetLevelChildCount( pParent );
1013cdf0e10cSrcweir         for ( i = 0; i < nCount; ++i )
1014cdf0e10cSrcweir         {
1015cdf0e10cSrcweir             SvLBoxEntry* pEntry = getListBox()->GetEntry( pParent, i );
1016cdf0e10cSrcweir             if ( getListBox()->IsSelected( pEntry ) )
1017cdf0e10cSrcweir                 ++nSelCount;
1018cdf0e10cSrcweir 
1019cdf0e10cSrcweir             if ( nSelCount == ( nSelectedChildIndex + 1 ) )
1020cdf0e10cSrcweir             {
1021cdf0e10cSrcweir                 xChild = new AccessibleListBoxEntry( *getListBox(), pEntry, this );
1022cdf0e10cSrcweir                 break;
1023cdf0e10cSrcweir             }
1024cdf0e10cSrcweir         }
1025cdf0e10cSrcweir 
1026cdf0e10cSrcweir         return xChild;
1027cdf0e10cSrcweir     }
1028cdf0e10cSrcweir     // -----------------------------------------------------------------------------
deselectAccessibleChild(sal_Int32 nSelectedChildIndex)1029cdf0e10cSrcweir     void SAL_CALL AccessibleListBoxEntry::deselectAccessibleChild( sal_Int32 nSelectedChildIndex ) throw (IndexOutOfBoundsException, RuntimeException)
1030cdf0e10cSrcweir     {
1031cdf0e10cSrcweir         ALBSolarGuard aSolarGuard;
1032cdf0e10cSrcweir         ::osl::MutexGuard aGuard( m_aMutex );
1033cdf0e10cSrcweir 
1034cdf0e10cSrcweir         EnsureIsAlive();
1035cdf0e10cSrcweir 
1036cdf0e10cSrcweir         SvLBoxEntry* pParent = getListBox()->GetEntryFromPath( m_aEntryPath );
1037cdf0e10cSrcweir         SvLBoxEntry* pEntry = getListBox()->GetEntry( pParent, nSelectedChildIndex );
1038cdf0e10cSrcweir         if ( !pEntry )
1039cdf0e10cSrcweir             throw IndexOutOfBoundsException();
1040cdf0e10cSrcweir 
1041cdf0e10cSrcweir         getListBox()->Select( pEntry, sal_False );
1042cdf0e10cSrcweir     }
getCaretPosition()1043cdf0e10cSrcweir     sal_Int32 SAL_CALL AccessibleListBoxEntry::getCaretPosition(  ) throw (::com::sun::star::uno::RuntimeException)
1044cdf0e10cSrcweir     {
1045cdf0e10cSrcweir         return -1;
1046cdf0e10cSrcweir     }
setCaretPosition(sal_Int32 nIndex)1047cdf0e10cSrcweir     sal_Bool SAL_CALL AccessibleListBoxEntry::setCaretPosition ( sal_Int32 nIndex ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException)
1048cdf0e10cSrcweir     {
1049cdf0e10cSrcweir         ALBSolarGuard aSolarGuard;
1050cdf0e10cSrcweir         ::osl::MutexGuard aGuard( m_aMutex );
1051cdf0e10cSrcweir         EnsureIsAlive();
1052cdf0e10cSrcweir 
1053cdf0e10cSrcweir         if ( !implIsValidRange( nIndex, nIndex, implGetText().getLength() ) )
1054cdf0e10cSrcweir             throw IndexOutOfBoundsException();
1055cdf0e10cSrcweir 
1056cdf0e10cSrcweir         return sal_False;
1057cdf0e10cSrcweir     }
getCharacter(sal_Int32 nIndex)1058cdf0e10cSrcweir     sal_Unicode SAL_CALL AccessibleListBoxEntry::getCharacter( sal_Int32 nIndex ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException)
1059cdf0e10cSrcweir     {
1060cdf0e10cSrcweir         ALBSolarGuard aSolarGuard;
1061cdf0e10cSrcweir         ::osl::MutexGuard aGuard( m_aMutex );
1062cdf0e10cSrcweir         EnsureIsAlive();
1063cdf0e10cSrcweir         return OCommonAccessibleText::getCharacter( nIndex );
1064cdf0e10cSrcweir     }
getCharacterAttributes(sal_Int32 nIndex,const::com::sun::star::uno::Sequence<::rtl::OUString> &)1065cdf0e10cSrcweir     ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue > SAL_CALL AccessibleListBoxEntry::getCharacterAttributes( sal_Int32 nIndex, const ::com::sun::star::uno::Sequence< ::rtl::OUString >& ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException)
1066cdf0e10cSrcweir     {
1067cdf0e10cSrcweir         ALBSolarGuard aSolarGuard;
1068cdf0e10cSrcweir         ::osl::MutexGuard aGuard( m_aMutex );
1069cdf0e10cSrcweir         EnsureIsAlive();
1070cdf0e10cSrcweir 
1071cdf0e10cSrcweir         ::rtl::OUString sText( implGetText() );
1072cdf0e10cSrcweir 
1073cdf0e10cSrcweir         if ( !implIsValidIndex( nIndex, sText.getLength() ) )
1074cdf0e10cSrcweir             throw IndexOutOfBoundsException();
1075cdf0e10cSrcweir 
1076cdf0e10cSrcweir         return ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >();
1077cdf0e10cSrcweir     }
getCharacterCount()1078cdf0e10cSrcweir     sal_Int32 SAL_CALL AccessibleListBoxEntry::getCharacterCount(  ) throw (::com::sun::star::uno::RuntimeException)
1079cdf0e10cSrcweir     {
1080cdf0e10cSrcweir         ALBSolarGuard aSolarGuard;
1081cdf0e10cSrcweir         ::osl::MutexGuard aGuard( m_aMutex );
1082cdf0e10cSrcweir         EnsureIsAlive();
1083cdf0e10cSrcweir         return OCommonAccessibleText::getCharacterCount(  );
1084cdf0e10cSrcweir     }
1085cdf0e10cSrcweir 
getSelectedText()1086cdf0e10cSrcweir     ::rtl::OUString SAL_CALL AccessibleListBoxEntry::getSelectedText(  ) throw (::com::sun::star::uno::RuntimeException)
1087cdf0e10cSrcweir     {
1088cdf0e10cSrcweir         ALBSolarGuard aSolarGuard;
1089cdf0e10cSrcweir         ::osl::MutexGuard aGuard( m_aMutex );
1090cdf0e10cSrcweir         EnsureIsAlive();
1091cdf0e10cSrcweir         return OCommonAccessibleText::getSelectedText(  );
1092cdf0e10cSrcweir     }
getSelectionStart()1093cdf0e10cSrcweir     sal_Int32 SAL_CALL AccessibleListBoxEntry::getSelectionStart(  ) throw (::com::sun::star::uno::RuntimeException)
1094cdf0e10cSrcweir     {
1095cdf0e10cSrcweir         ALBSolarGuard aSolarGuard;
1096cdf0e10cSrcweir         ::osl::MutexGuard aGuard( m_aMutex );
1097cdf0e10cSrcweir         EnsureIsAlive();
1098cdf0e10cSrcweir         return OCommonAccessibleText::getSelectionStart(  );
1099cdf0e10cSrcweir     }
getSelectionEnd()1100cdf0e10cSrcweir     sal_Int32 SAL_CALL AccessibleListBoxEntry::getSelectionEnd(  ) throw (::com::sun::star::uno::RuntimeException)
1101cdf0e10cSrcweir     {
1102cdf0e10cSrcweir         ALBSolarGuard aSolarGuard;
1103cdf0e10cSrcweir         ::osl::MutexGuard aGuard( m_aMutex );
1104cdf0e10cSrcweir         EnsureIsAlive();
1105cdf0e10cSrcweir         return OCommonAccessibleText::getSelectionEnd(  );
1106cdf0e10cSrcweir     }
setSelection(sal_Int32 nStartIndex,sal_Int32 nEndIndex)1107cdf0e10cSrcweir     sal_Bool SAL_CALL AccessibleListBoxEntry::setSelection( sal_Int32 nStartIndex, sal_Int32 nEndIndex ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException)
1108cdf0e10cSrcweir     {
1109cdf0e10cSrcweir         ALBSolarGuard aSolarGuard;
1110cdf0e10cSrcweir         ::osl::MutexGuard aGuard( m_aMutex );
1111cdf0e10cSrcweir         EnsureIsAlive();
1112cdf0e10cSrcweir 
1113cdf0e10cSrcweir         if ( !implIsValidRange( nStartIndex, nEndIndex, implGetText().getLength() ) )
1114cdf0e10cSrcweir             throw IndexOutOfBoundsException();
1115cdf0e10cSrcweir 
1116cdf0e10cSrcweir         return sal_False;
1117cdf0e10cSrcweir     }
getText()1118cdf0e10cSrcweir     ::rtl::OUString SAL_CALL AccessibleListBoxEntry::getText(  ) throw (::com::sun::star::uno::RuntimeException)
1119cdf0e10cSrcweir     {
1120cdf0e10cSrcweir         ALBSolarGuard aSolarGuard;
1121cdf0e10cSrcweir         ::osl::MutexGuard aGuard( m_aMutex );
1122cdf0e10cSrcweir         EnsureIsAlive();
1123cdf0e10cSrcweir         return OCommonAccessibleText::getText(  );
1124cdf0e10cSrcweir     }
getTextRange(sal_Int32 nStartIndex,sal_Int32 nEndIndex)1125cdf0e10cSrcweir     ::rtl::OUString SAL_CALL AccessibleListBoxEntry::getTextRange( sal_Int32 nStartIndex, sal_Int32 nEndIndex ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException)
1126cdf0e10cSrcweir     {
1127cdf0e10cSrcweir         ALBSolarGuard aSolarGuard;
1128cdf0e10cSrcweir         ::osl::MutexGuard aGuard( m_aMutex );
1129cdf0e10cSrcweir         EnsureIsAlive();
1130cdf0e10cSrcweir         return OCommonAccessibleText::getTextRange( nStartIndex, nEndIndex );
1131cdf0e10cSrcweir     }
getTextAtIndex(sal_Int32 nIndex,sal_Int16 aTextType)1132cdf0e10cSrcweir     ::com::sun::star::accessibility::TextSegment SAL_CALL AccessibleListBoxEntry::getTextAtIndex( sal_Int32 nIndex, sal_Int16 aTextType ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException)
1133cdf0e10cSrcweir     {
1134cdf0e10cSrcweir         ALBSolarGuard aSolarGuard;
1135cdf0e10cSrcweir         ::osl::MutexGuard aGuard( m_aMutex );
1136cdf0e10cSrcweir         EnsureIsAlive();
1137cdf0e10cSrcweir         return OCommonAccessibleText::getTextAtIndex( nIndex ,aTextType);
1138cdf0e10cSrcweir     }
getTextBeforeIndex(sal_Int32 nIndex,sal_Int16 aTextType)1139cdf0e10cSrcweir     ::com::sun::star::accessibility::TextSegment SAL_CALL AccessibleListBoxEntry::getTextBeforeIndex( sal_Int32 nIndex, sal_Int16 aTextType ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException)
1140cdf0e10cSrcweir     {
1141cdf0e10cSrcweir         ALBSolarGuard aSolarGuard;
1142cdf0e10cSrcweir         ::osl::MutexGuard aGuard( m_aMutex );
1143cdf0e10cSrcweir         EnsureIsAlive();
1144cdf0e10cSrcweir         return OCommonAccessibleText::getTextBeforeIndex( nIndex ,aTextType);
1145cdf0e10cSrcweir     }
getTextBehindIndex(sal_Int32 nIndex,sal_Int16 aTextType)1146cdf0e10cSrcweir     ::com::sun::star::accessibility::TextSegment SAL_CALL AccessibleListBoxEntry::getTextBehindIndex( sal_Int32 nIndex, sal_Int16 aTextType ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException)
1147cdf0e10cSrcweir     {
1148cdf0e10cSrcweir         ALBSolarGuard aSolarGuard;
1149cdf0e10cSrcweir         ::osl::MutexGuard aGuard( m_aMutex );
1150cdf0e10cSrcweir         EnsureIsAlive();
1151cdf0e10cSrcweir 
1152cdf0e10cSrcweir         return OCommonAccessibleText::getTextBehindIndex( nIndex ,aTextType);
1153cdf0e10cSrcweir     }
115421075d77SSteve Yin     // -----------------------------------------------------------------------------
115521075d77SSteve Yin     // XAccessibleValue
115621075d77SSteve Yin     // -----------------------------------------------------------------------------
115721075d77SSteve Yin 
getCurrentValue()115821075d77SSteve Yin     Any AccessibleListBoxEntry::getCurrentValue(  ) throw (RuntimeException)
115921075d77SSteve Yin     {
116021075d77SSteve Yin         ::osl::MutexGuard aGuard( m_aMutex );
116121075d77SSteve Yin         Any aValue;
116221075d77SSteve Yin         sal_Int32 level = ((sal_Int32) m_aEntryPath.size() - 1);
116321075d77SSteve Yin         level = level < 0 ?  0: level;
116421075d77SSteve Yin         aValue <<= level;
116521075d77SSteve Yin         return aValue;
116621075d77SSteve Yin     }
116721075d77SSteve Yin 
116821075d77SSteve Yin     // -----------------------------------------------------------------------------
116921075d77SSteve Yin 
setCurrentValue(const Any & aNumber)117021075d77SSteve Yin     sal_Bool AccessibleListBoxEntry::setCurrentValue( const Any& aNumber ) throw (RuntimeException)
117121075d77SSteve Yin     {
117221075d77SSteve Yin         ::osl::MutexGuard aGuard( m_aMutex );
117321075d77SSteve Yin 
117421075d77SSteve Yin 
117521075d77SSteve Yin         sal_Bool bReturn = sal_False;
117621075d77SSteve Yin         SvTreeListBox* pBox = getListBox();
117721075d77SSteve Yin         if(getAccessibleRole() == AccessibleRole::CHECK_BOX)
117821075d77SSteve Yin         {
117921075d77SSteve Yin             SvLBoxEntry* pEntry = pBox->GetEntryFromPath( m_aEntryPath );
118021075d77SSteve Yin             if ( pEntry )
118121075d77SSteve Yin             {
11823e60c8baSPavel Janík                 sal_Int32 nValue(0), nValueMin(0), nValueMax(0);
118321075d77SSteve Yin                 aNumber >>= nValue;
118421075d77SSteve Yin                 getMinimumValue() >>= nValueMin;
118521075d77SSteve Yin                 getMaximumValue() >>= nValueMax;
118621075d77SSteve Yin 
118721075d77SSteve Yin                 if ( nValue < nValueMin )
118821075d77SSteve Yin                     nValue = nValueMin;
118921075d77SSteve Yin                 else if ( nValue > nValueMax )
119021075d77SSteve Yin                     nValue = nValueMax;
119121075d77SSteve Yin 
119221075d77SSteve Yin                 pBox->SetCheckButtonState(pEntry,  (SvButtonState) nValue );
119321075d77SSteve Yin                 bReturn = sal_True;
119421075d77SSteve Yin             }
119521075d77SSteve Yin         }
119621075d77SSteve Yin 
119721075d77SSteve Yin         return bReturn;
119821075d77SSteve Yin     }
119921075d77SSteve Yin 
120021075d77SSteve Yin     // -----------------------------------------------------------------------------
120121075d77SSteve Yin 
getMaximumValue()120221075d77SSteve Yin     Any AccessibleListBoxEntry::getMaximumValue(  ) throw (RuntimeException)
120321075d77SSteve Yin     {
120421075d77SSteve Yin         ::osl::MutexGuard aGuard( m_aMutex );
120521075d77SSteve Yin 
120621075d77SSteve Yin         Any aValue;
120721075d77SSteve Yin         // SvTreeListBox* pBox = getListBox();
120821075d77SSteve Yin         switch(getAccessibleRole())
120921075d77SSteve Yin         {
121021075d77SSteve Yin             case AccessibleRole::CHECK_BOX:
121121075d77SSteve Yin                 aValue <<= (sal_Int32)1;
121221075d77SSteve Yin                 break;
121321075d77SSteve Yin             case AccessibleRole::LABEL:
121421075d77SSteve Yin             default:
121521075d77SSteve Yin                 break;
121621075d77SSteve Yin         }
121721075d77SSteve Yin 
121821075d77SSteve Yin         return aValue;
121921075d77SSteve Yin     }
122021075d77SSteve Yin 
122121075d77SSteve Yin     // -----------------------------------------------------------------------------
122221075d77SSteve Yin 
getMinimumValue()122321075d77SSteve Yin     Any AccessibleListBoxEntry::getMinimumValue(  ) throw (RuntimeException)
122421075d77SSteve Yin     {
122521075d77SSteve Yin         ::osl::MutexGuard aGuard( m_aMutex );
122621075d77SSteve Yin 
122721075d77SSteve Yin         Any aValue;
122821075d77SSteve Yin         // SvTreeListBox* pBox = getListBox();
122921075d77SSteve Yin         switch(getAccessibleRole())
123021075d77SSteve Yin         {
123121075d77SSteve Yin             case AccessibleRole::CHECK_BOX:
123221075d77SSteve Yin                 aValue <<= (sal_Int32)0;
123321075d77SSteve Yin                 break;
123421075d77SSteve Yin             case AccessibleRole::LABEL:
123521075d77SSteve Yin             default:
123621075d77SSteve Yin                 break;
123721075d77SSteve Yin         }
123821075d77SSteve Yin 
123921075d77SSteve Yin         return aValue;
124021075d77SSteve Yin     }
124121075d77SSteve Yin 
124221075d77SSteve Yin     // -----------------------------------------------------------------------------
124321075d77SSteve Yin 
GetRealChild(sal_Int32 nIndex)124421075d77SSteve Yin     SvLBoxEntry * AccessibleListBoxEntry::GetRealChild(sal_Int32 nIndex)
124521075d77SSteve Yin     {
124621075d77SSteve Yin         SvLBoxEntry* pEntry =NULL;
124721075d77SSteve Yin         SvLBoxEntry* pParent = getListBox()->GetEntryFromPath( m_aEntryPath );
124821075d77SSteve Yin         if (pParent)
124921075d77SSteve Yin         {
125021075d77SSteve Yin             pEntry = getListBox()->GetEntry( pParent, nIndex );
125121075d77SSteve Yin             if ( !pEntry && getAccessibleChildCount() > 0 )
125221075d77SSteve Yin             {
125321075d77SSteve Yin                 getListBox()->RequestingChilds(pParent);
125421075d77SSteve Yin                 pEntry = getListBox()->GetEntry( pParent, nIndex );
125521075d77SSteve Yin             }
125621075d77SSteve Yin         }
125721075d77SSteve Yin         return pEntry;
125821075d77SSteve Yin     }
1259cdf0e10cSrcweir //........................................................................
1260cdf0e10cSrcweir }// namespace accessibility
1261cdf0e10cSrcweir //........................................................................
1262