1*0841af79SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*0841af79SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*0841af79SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*0841af79SAndrew Rist  * distributed with this work for additional information
6*0841af79SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*0841af79SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*0841af79SAndrew Rist  * "License"); you may not use this file except in compliance
9*0841af79SAndrew Rist  * with the License.  You may obtain a copy of the License at
10*0841af79SAndrew Rist  *
11*0841af79SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*0841af79SAndrew Rist  *
13*0841af79SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*0841af79SAndrew Rist  * software distributed under the License is distributed on an
15*0841af79SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*0841af79SAndrew Rist  * KIND, either express or implied.  See the License for the
17*0841af79SAndrew Rist  * specific language governing permissions and limitations
18*0841af79SAndrew Rist  * under the License.
19*0841af79SAndrew Rist  *
20*0841af79SAndrew Rist  *************************************************************/
21*0841af79SAndrew Rist 
22*0841af79SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_accessibility.hxx"
26cdf0e10cSrcweir #include "accessibility/extended/AccessibleBrowseBox.hxx"
27cdf0e10cSrcweir #include "accessibility/extended/AccessibleBrowseBoxTable.hxx"
28cdf0e10cSrcweir #include "accessibility/extended/AccessibleBrowseBoxHeaderBar.hxx"
29cdf0e10cSrcweir #include <svtools/accessibletableprovider.hxx>
30cdf0e10cSrcweir #include <comphelper/types.hxx>
31cdf0e10cSrcweir #include <toolkit/helper/vclunohelper.hxx>
32cdf0e10cSrcweir 
33cdf0e10cSrcweir // ============================================================================
34cdf0e10cSrcweir 
35cdf0e10cSrcweir namespace accessibility
36cdf0e10cSrcweir {
37cdf0e10cSrcweir 
38cdf0e10cSrcweir // ============================================================================
39cdf0e10cSrcweir 
40cdf0e10cSrcweir using ::rtl::OUString;
41cdf0e10cSrcweir 
42cdf0e10cSrcweir using namespace ::com::sun::star::uno;
43cdf0e10cSrcweir using namespace ::com::sun::star;
44cdf0e10cSrcweir using namespace ::com::sun::star::lang;
45cdf0e10cSrcweir using namespace ::com::sun::star::accessibility;
46cdf0e10cSrcweir using namespace ::svt;
47cdf0e10cSrcweir 
48cdf0e10cSrcweir // ============================================================================
49cdf0e10cSrcweir class AccessibleBrowseBoxImpl
50cdf0e10cSrcweir {
51cdf0e10cSrcweir public:
52cdf0e10cSrcweir     /// the XAccessible which created the AccessibleBrowseBox
53cdf0e10cSrcweir     WeakReference< XAccessible >                                m_aCreator;
54cdf0e10cSrcweir 
55cdf0e10cSrcweir 	/** The data table child. */
56cdf0e10cSrcweir     Reference<
57cdf0e10cSrcweir         ::com::sun::star::accessibility::XAccessible >          mxTable;
58cdf0e10cSrcweir 	AccessibleBrowseBoxTable*									m_pTable;
59cdf0e10cSrcweir 
60cdf0e10cSrcweir     /** The header bar for rows ("handle column"). */
61cdf0e10cSrcweir     Reference<
62cdf0e10cSrcweir         ::com::sun::star::accessibility::XAccessible >	        mxRowHeaderBar;
63cdf0e10cSrcweir 	AccessibleBrowseBoxHeaderBar*								m_pRowHeaderBar;
64cdf0e10cSrcweir 
65cdf0e10cSrcweir     /** The header bar for columns (first row of the table). */
66cdf0e10cSrcweir     Reference<
67cdf0e10cSrcweir         ::com::sun::star::accessibility::XAccessible >	        mxColumnHeaderBar;
68cdf0e10cSrcweir 	AccessibleBrowseBoxHeaderBar*								m_pColumnHeaderBar;
69cdf0e10cSrcweir };
70cdf0e10cSrcweir 
71cdf0e10cSrcweir // Ctor/Dtor/disposing --------------------------------------------------------
72cdf0e10cSrcweir 
DBG_NAME(AccessibleBrowseBox)73cdf0e10cSrcweir DBG_NAME( AccessibleBrowseBox )
74cdf0e10cSrcweir 
75cdf0e10cSrcweir AccessibleBrowseBox::AccessibleBrowseBox(
76cdf0e10cSrcweir             const Reference< XAccessible >& _rxParent, const Reference< XAccessible >& _rxCreator,
77cdf0e10cSrcweir             IAccessibleTableProvider& _rBrowseBox )
78cdf0e10cSrcweir     : AccessibleBrowseBoxBase( _rxParent, _rBrowseBox,NULL, BBTYPE_BROWSEBOX )
79cdf0e10cSrcweir {
80cdf0e10cSrcweir     DBG_CTOR( AccessibleBrowseBox, NULL );
81cdf0e10cSrcweir 	m_pImpl.reset( new AccessibleBrowseBoxImpl() );
82cdf0e10cSrcweir     m_pImpl->m_aCreator = _rxCreator;
83cdf0e10cSrcweir 
84cdf0e10cSrcweir     m_xFocusWindow = VCLUnoHelper::GetInterface(mpBrowseBox->GetWindowInstance());
85cdf0e10cSrcweir }
86cdf0e10cSrcweir // -----------------------------------------------------------------------------
setCreator(const Reference<XAccessible> & _rxCreator)87cdf0e10cSrcweir void AccessibleBrowseBox::setCreator( const Reference< XAccessible >& _rxCreator )
88cdf0e10cSrcweir {
89cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 0
90cdf0e10cSrcweir     Reference< XAccessible > xCreator = (Reference< XAccessible >)m_pImpl->m_aCreator;
91cdf0e10cSrcweir     DBG_ASSERT( !xCreator.is(), "accessibility/extended/AccessibleBrowseBox::setCreator: creator already set!" );
92cdf0e10cSrcweir #endif
93cdf0e10cSrcweir     m_pImpl->m_aCreator = _rxCreator;
94cdf0e10cSrcweir }
95cdf0e10cSrcweir 
96cdf0e10cSrcweir // -----------------------------------------------------------------------------
~AccessibleBrowseBox()97cdf0e10cSrcweir AccessibleBrowseBox::~AccessibleBrowseBox()
98cdf0e10cSrcweir {
99cdf0e10cSrcweir     DBG_DTOR( AccessibleBrowseBox, NULL );
100cdf0e10cSrcweir }
101cdf0e10cSrcweir // -----------------------------------------------------------------------------
102cdf0e10cSrcweir 
disposing()103cdf0e10cSrcweir void SAL_CALL AccessibleBrowseBox::disposing()
104cdf0e10cSrcweir {
105cdf0e10cSrcweir     ::osl::MutexGuard aGuard( getOslMutex() );
106cdf0e10cSrcweir 
107cdf0e10cSrcweir 	m_pImpl->m_pTable			= NULL;
108cdf0e10cSrcweir 	m_pImpl->m_pColumnHeaderBar	= NULL;
109cdf0e10cSrcweir 	m_pImpl->m_pRowHeaderBar	= NULL;
110cdf0e10cSrcweir     m_pImpl->m_aCreator         = Reference< XAccessible >();
111cdf0e10cSrcweir 
112cdf0e10cSrcweir     Reference< XAccessible >  xTable = m_pImpl->mxTable;
113cdf0e10cSrcweir 
114cdf0e10cSrcweir 	Reference< XComponent > xComp( m_pImpl->mxTable, UNO_QUERY );
115cdf0e10cSrcweir 	if ( xComp.is() )
116cdf0e10cSrcweir 	{
117cdf0e10cSrcweir 		xComp->dispose();
118cdf0e10cSrcweir 
119cdf0e10cSrcweir 	}
120cdf0e10cSrcweir //!    ::comphelper::disposeComponent(m_pImpl->mxTable);
121cdf0e10cSrcweir     ::comphelper::disposeComponent(m_pImpl->mxRowHeaderBar);
122cdf0e10cSrcweir     ::comphelper::disposeComponent(m_pImpl->mxColumnHeaderBar);
123cdf0e10cSrcweir 
124cdf0e10cSrcweir     AccessibleBrowseBoxBase::disposing();
125cdf0e10cSrcweir }
126cdf0e10cSrcweir // -----------------------------------------------------------------------------
127cdf0e10cSrcweir 
128cdf0e10cSrcweir // XAccessibleContext ---------------------------------------------------------
129cdf0e10cSrcweir 
getAccessibleChildCount()130cdf0e10cSrcweir sal_Int32 SAL_CALL AccessibleBrowseBox::getAccessibleChildCount()
131cdf0e10cSrcweir     throw ( uno::RuntimeException )
132cdf0e10cSrcweir {
133cdf0e10cSrcweir     BBSolarGuard aSolarGuard;
134cdf0e10cSrcweir     ::osl::MutexGuard aGuard( getOslMutex() );
135cdf0e10cSrcweir     ensureIsAlive();
136cdf0e10cSrcweir     return BBINDEX_FIRSTCONTROL + mpBrowseBox->GetAccessibleControlCount();
137cdf0e10cSrcweir }
138cdf0e10cSrcweir // -----------------------------------------------------------------------------
139cdf0e10cSrcweir 
140cdf0e10cSrcweir Reference< XAccessible > SAL_CALL
getAccessibleChild(sal_Int32 nChildIndex)141cdf0e10cSrcweir AccessibleBrowseBox::getAccessibleChild( sal_Int32 nChildIndex )
142cdf0e10cSrcweir     throw ( lang::IndexOutOfBoundsException, uno::RuntimeException )
143cdf0e10cSrcweir {
144cdf0e10cSrcweir     BBSolarGuard aSolarGuard;
145cdf0e10cSrcweir     ::osl::MutexGuard aGuard( getOslMutex() );
146cdf0e10cSrcweir     ensureIsAlive();
147cdf0e10cSrcweir 
148cdf0e10cSrcweir     Reference< XAccessible > xRet;
149cdf0e10cSrcweir     if( nChildIndex >= 0 )
150cdf0e10cSrcweir     {
151cdf0e10cSrcweir         if( nChildIndex < BBINDEX_FIRSTCONTROL )
152cdf0e10cSrcweir             xRet = implGetFixedChild( nChildIndex );
153cdf0e10cSrcweir         else
154cdf0e10cSrcweir         {
155cdf0e10cSrcweir             // additional controls
156cdf0e10cSrcweir             nChildIndex -= BBINDEX_FIRSTCONTROL;
157cdf0e10cSrcweir             if( nChildIndex < mpBrowseBox->GetAccessibleControlCount() )
158cdf0e10cSrcweir                 xRet = mpBrowseBox->CreateAccessibleControl( nChildIndex );
159cdf0e10cSrcweir         }
160cdf0e10cSrcweir     }
161cdf0e10cSrcweir 
162cdf0e10cSrcweir     if( !xRet.is() )
163cdf0e10cSrcweir         throw lang::IndexOutOfBoundsException();
164cdf0e10cSrcweir     return xRet;
165cdf0e10cSrcweir }
166cdf0e10cSrcweir // -----------------------------------------------------------------------------
167cdf0e10cSrcweir 
168cdf0e10cSrcweir //sal_Int16 SAL_CALL AccessibleBrowseBox::getAccessibleRole()
169cdf0e10cSrcweir //    throw ( uno::RuntimeException )
170cdf0e10cSrcweir //{
171cdf0e10cSrcweir //    ensureIsAlive();
172cdf0e10cSrcweir //    return AccessibleRole::PANEL;
173cdf0e10cSrcweir //}
174cdf0e10cSrcweir // -----------------------------------------------------------------------------
175cdf0e10cSrcweir 
176cdf0e10cSrcweir // XAccessibleComponent -------------------------------------------------------
177cdf0e10cSrcweir 
178cdf0e10cSrcweir Reference< XAccessible > SAL_CALL
getAccessibleAtPoint(const awt::Point & rPoint)179cdf0e10cSrcweir AccessibleBrowseBox::getAccessibleAtPoint( const awt::Point& rPoint )
180cdf0e10cSrcweir     throw ( uno::RuntimeException )
181cdf0e10cSrcweir {
182cdf0e10cSrcweir     BBSolarGuard aSolarGuard;
183cdf0e10cSrcweir     ::osl::MutexGuard aGuard( getOslMutex() );
184cdf0e10cSrcweir     ensureIsAlive();
185cdf0e10cSrcweir 
186cdf0e10cSrcweir     Reference< XAccessible > xChild;
187cdf0e10cSrcweir     sal_Int32 nIndex = 0;
188cdf0e10cSrcweir     if( mpBrowseBox->ConvertPointToControlIndex( nIndex, VCLPoint( rPoint ) ) )
189cdf0e10cSrcweir         xChild = mpBrowseBox->CreateAccessibleControl( nIndex );
190cdf0e10cSrcweir     else
191cdf0e10cSrcweir     {
192cdf0e10cSrcweir         // try whether point is in one of the fixed children
193cdf0e10cSrcweir         // (table, header bars, corner control)
194cdf0e10cSrcweir         Point aPoint( VCLPoint( rPoint ) );
195cdf0e10cSrcweir         for( nIndex = 0; (nIndex < BBINDEX_FIRSTCONTROL) && !xChild.is(); ++nIndex )
196cdf0e10cSrcweir         {
197cdf0e10cSrcweir             Reference< XAccessible > xCurrChild( implGetFixedChild( nIndex ) );
198cdf0e10cSrcweir             Reference< XAccessibleComponent >
199cdf0e10cSrcweir                 xCurrChildComp( xCurrChild, uno::UNO_QUERY );
200cdf0e10cSrcweir 
201cdf0e10cSrcweir             if( xCurrChildComp.is() &&
202cdf0e10cSrcweir                     VCLRectangle( xCurrChildComp->getBounds() ).IsInside( aPoint ) )
203cdf0e10cSrcweir                 xChild = xCurrChild;
204cdf0e10cSrcweir         }
205cdf0e10cSrcweir     }
206cdf0e10cSrcweir     return xChild;
207cdf0e10cSrcweir }
208cdf0e10cSrcweir // -----------------------------------------------------------------------------
209cdf0e10cSrcweir 
grabFocus()210cdf0e10cSrcweir void SAL_CALL AccessibleBrowseBox::grabFocus()
211cdf0e10cSrcweir     throw ( uno::RuntimeException )
212cdf0e10cSrcweir {
213cdf0e10cSrcweir     BBSolarGuard aSolarGuard;
214cdf0e10cSrcweir     ::osl::MutexGuard aGuard( getOslMutex() );
215cdf0e10cSrcweir     ensureIsAlive();
216cdf0e10cSrcweir     mpBrowseBox->GrabFocus();
217cdf0e10cSrcweir }
218cdf0e10cSrcweir // -----------------------------------------------------------------------------
219cdf0e10cSrcweir 
getAccessibleKeyBinding()220cdf0e10cSrcweir Any SAL_CALL AccessibleBrowseBox::getAccessibleKeyBinding()
221cdf0e10cSrcweir     throw ( uno::RuntimeException )
222cdf0e10cSrcweir {
223cdf0e10cSrcweir     ensureIsAlive();
224cdf0e10cSrcweir 	return Any();
225cdf0e10cSrcweir }
226cdf0e10cSrcweir // -----------------------------------------------------------------------------
227cdf0e10cSrcweir 
228cdf0e10cSrcweir // XServiceInfo ---------------------------------------------------------------
229cdf0e10cSrcweir 
getImplementationName()230cdf0e10cSrcweir OUString SAL_CALL AccessibleBrowseBox::getImplementationName()
231cdf0e10cSrcweir     throw ( uno::RuntimeException )
232cdf0e10cSrcweir {
233cdf0e10cSrcweir     return OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.svtools.AccessibleBrowseBox" ) );
234cdf0e10cSrcweir }
235cdf0e10cSrcweir // -----------------------------------------------------------------------------
236cdf0e10cSrcweir 
237cdf0e10cSrcweir // internal virtual methods ---------------------------------------------------
238cdf0e10cSrcweir 
implGetBoundingBox()239cdf0e10cSrcweir Rectangle AccessibleBrowseBox::implGetBoundingBox()
240cdf0e10cSrcweir {
241cdf0e10cSrcweir     Window* pParent = mpBrowseBox->GetAccessibleParentWindow();
242cdf0e10cSrcweir     DBG_ASSERT( pParent, "implGetBoundingBox - missing parent window" );
243cdf0e10cSrcweir     return mpBrowseBox->GetWindowExtentsRelative( pParent );
244cdf0e10cSrcweir }
245cdf0e10cSrcweir // -----------------------------------------------------------------------------
246cdf0e10cSrcweir 
implGetBoundingBoxOnScreen()247cdf0e10cSrcweir Rectangle AccessibleBrowseBox::implGetBoundingBoxOnScreen()
248cdf0e10cSrcweir {
249cdf0e10cSrcweir     return mpBrowseBox->GetWindowExtentsRelative( NULL );
250cdf0e10cSrcweir }
251cdf0e10cSrcweir // -----------------------------------------------------------------------------
252cdf0e10cSrcweir 
253cdf0e10cSrcweir // internal helper methods ----------------------------------------------------
254cdf0e10cSrcweir 
implGetTable()255cdf0e10cSrcweir Reference< XAccessible > AccessibleBrowseBox::implGetTable()
256cdf0e10cSrcweir {
257cdf0e10cSrcweir     if( !m_pImpl->mxTable.is() )
258cdf0e10cSrcweir 	{
259cdf0e10cSrcweir         m_pImpl->m_pTable = createAccessibleTable();
260cdf0e10cSrcweir 		m_pImpl->mxTable  = m_pImpl->m_pTable;
261cdf0e10cSrcweir 
262cdf0e10cSrcweir 	}
263cdf0e10cSrcweir     return m_pImpl->mxTable;
264cdf0e10cSrcweir }
265cdf0e10cSrcweir // -----------------------------------------------------------------------------
266cdf0e10cSrcweir 
267cdf0e10cSrcweir Reference< XAccessible >
implGetHeaderBar(AccessibleBrowseBoxObjType eObjType)268cdf0e10cSrcweir AccessibleBrowseBox::implGetHeaderBar( AccessibleBrowseBoxObjType eObjType )
269cdf0e10cSrcweir {
270cdf0e10cSrcweir     Reference< XAccessible > xRet;
271cdf0e10cSrcweir     Reference< XAccessible >* pxMember = NULL;
272cdf0e10cSrcweir 
273cdf0e10cSrcweir     if( eObjType == BBTYPE_ROWHEADERBAR )
274cdf0e10cSrcweir         pxMember = &m_pImpl->mxRowHeaderBar;
275cdf0e10cSrcweir     else if( eObjType ==  BBTYPE_COLUMNHEADERBAR )
276cdf0e10cSrcweir         pxMember = &m_pImpl->mxColumnHeaderBar;
277cdf0e10cSrcweir 
278cdf0e10cSrcweir     if( pxMember )
279cdf0e10cSrcweir     {
280cdf0e10cSrcweir         if( !pxMember->is() )
281cdf0e10cSrcweir 		{
282cdf0e10cSrcweir 			AccessibleBrowseBoxHeaderBar* pHeaderBar = new AccessibleBrowseBoxHeaderBar(
283cdf0e10cSrcweir                 (Reference< XAccessible >)m_pImpl->m_aCreator, *mpBrowseBox, eObjType );
284cdf0e10cSrcweir 
285cdf0e10cSrcweir             if ( BBTYPE_COLUMNHEADERBAR == eObjType)
286cdf0e10cSrcweir 				m_pImpl->m_pColumnHeaderBar = pHeaderBar;
287cdf0e10cSrcweir 			else
288cdf0e10cSrcweir 				m_pImpl->m_pRowHeaderBar	= pHeaderBar;
289cdf0e10cSrcweir 
290cdf0e10cSrcweir             *pxMember = pHeaderBar;
291cdf0e10cSrcweir 		}
292cdf0e10cSrcweir         xRet = *pxMember;
293cdf0e10cSrcweir     }
294cdf0e10cSrcweir     return xRet;
295cdf0e10cSrcweir }
296cdf0e10cSrcweir // -----------------------------------------------------------------------------
297cdf0e10cSrcweir 
298cdf0e10cSrcweir Reference< XAccessible >
implGetFixedChild(sal_Int32 nChildIndex)299cdf0e10cSrcweir AccessibleBrowseBox::implGetFixedChild( sal_Int32 nChildIndex )
300cdf0e10cSrcweir {
301cdf0e10cSrcweir     Reference< XAccessible > xRet;
302cdf0e10cSrcweir     switch( nChildIndex )
303cdf0e10cSrcweir     {
304cdf0e10cSrcweir         case BBINDEX_COLUMNHEADERBAR:
305cdf0e10cSrcweir             xRet = implGetHeaderBar( BBTYPE_COLUMNHEADERBAR );
306cdf0e10cSrcweir         break;
307cdf0e10cSrcweir         case BBINDEX_ROWHEADERBAR:
308cdf0e10cSrcweir             xRet = implGetHeaderBar( BBTYPE_ROWHEADERBAR );
309cdf0e10cSrcweir         break;
310cdf0e10cSrcweir         case BBINDEX_TABLE:
311cdf0e10cSrcweir             xRet = implGetTable();
312cdf0e10cSrcweir         break;
313cdf0e10cSrcweir     }
314cdf0e10cSrcweir     return xRet;
315cdf0e10cSrcweir }
316cdf0e10cSrcweir // -----------------------------------------------------------------------------
createAccessibleTable()317cdf0e10cSrcweir AccessibleBrowseBoxTable* AccessibleBrowseBox::createAccessibleTable()
318cdf0e10cSrcweir {
319cdf0e10cSrcweir     Reference< XAccessible > xCreator = (Reference< XAccessible >)m_pImpl->m_aCreator;
320cdf0e10cSrcweir     DBG_ASSERT( xCreator.is(), "accessibility/extended/AccessibleBrowseBox::createAccessibleTable: my creator died - how this?" );
321cdf0e10cSrcweir 	return new AccessibleBrowseBoxTable( xCreator, *mpBrowseBox );
322cdf0e10cSrcweir }
323cdf0e10cSrcweir // -----------------------------------------------------------------------------
commitTableEvent(sal_Int16 _nEventId,const Any & _rNewValue,const Any & _rOldValue)324cdf0e10cSrcweir void AccessibleBrowseBox::commitTableEvent(sal_Int16 _nEventId,const Any& _rNewValue,const Any& _rOldValue)
325cdf0e10cSrcweir {
326cdf0e10cSrcweir 	if ( m_pImpl->mxTable.is() )
327cdf0e10cSrcweir 	{
328cdf0e10cSrcweir 		m_pImpl->m_pTable->commitEvent(_nEventId,_rNewValue,_rOldValue);
329cdf0e10cSrcweir 	}
330cdf0e10cSrcweir }
331cdf0e10cSrcweir // -----------------------------------------------------------------------------
commitHeaderBarEvent(sal_Int16 _nEventId,const Any & _rNewValue,const Any & _rOldValue,sal_Bool _bColumnHeaderBar)332cdf0e10cSrcweir void AccessibleBrowseBox::commitHeaderBarEvent(	sal_Int16 _nEventId,
333cdf0e10cSrcweir 												const Any& _rNewValue,
334cdf0e10cSrcweir 												const Any& _rOldValue,sal_Bool _bColumnHeaderBar)
335cdf0e10cSrcweir {
336cdf0e10cSrcweir 	Reference< XAccessible > xHeaderBar = _bColumnHeaderBar ? m_pImpl->mxColumnHeaderBar : m_pImpl->mxRowHeaderBar;
337cdf0e10cSrcweir 	AccessibleBrowseBoxHeaderBar* pHeaderBar = _bColumnHeaderBar ? m_pImpl->m_pColumnHeaderBar : m_pImpl->m_pRowHeaderBar;
338cdf0e10cSrcweir 	if ( xHeaderBar.is() )
339cdf0e10cSrcweir 		pHeaderBar->commitEvent(_nEventId,_rNewValue,_rOldValue);
340cdf0e10cSrcweir }
341cdf0e10cSrcweir 
342cdf0e10cSrcweir // ============================================================================
343cdf0e10cSrcweir // = AccessibleBrowseBoxAccess
344cdf0e10cSrcweir // ============================================================================
DBG_NAME(AccessibleBrowseBoxAccess)345cdf0e10cSrcweir DBG_NAME( AccessibleBrowseBoxAccess )
346cdf0e10cSrcweir // -----------------------------------------------------------------------------
347cdf0e10cSrcweir AccessibleBrowseBoxAccess::AccessibleBrowseBoxAccess( const Reference< XAccessible >& _rxParent, IAccessibleTableProvider& _rBrowseBox )
348cdf0e10cSrcweir         :m_xParent( _rxParent )
349cdf0e10cSrcweir         ,m_rBrowseBox( _rBrowseBox )
350cdf0e10cSrcweir         ,m_pContext( NULL )
351cdf0e10cSrcweir {
352cdf0e10cSrcweir     DBG_CTOR( AccessibleBrowseBoxAccess, NULL );
353cdf0e10cSrcweir }
354cdf0e10cSrcweir 
355cdf0e10cSrcweir // -----------------------------------------------------------------------------
~AccessibleBrowseBoxAccess()356cdf0e10cSrcweir AccessibleBrowseBoxAccess::~AccessibleBrowseBoxAccess()
357cdf0e10cSrcweir {
358cdf0e10cSrcweir     DBG_DTOR( AccessibleBrowseBoxAccess, NULL );
359cdf0e10cSrcweir }
360cdf0e10cSrcweir 
361cdf0e10cSrcweir // -----------------------------------------------------------------------------
dispose()362cdf0e10cSrcweir void AccessibleBrowseBoxAccess::dispose()
363cdf0e10cSrcweir {
364cdf0e10cSrcweir     ::osl::MutexGuard aGuard( m_aMutex );
365cdf0e10cSrcweir 
366cdf0e10cSrcweir     m_pContext = NULL;
367cdf0e10cSrcweir     ::comphelper::disposeComponent( m_xContext );
368cdf0e10cSrcweir }
369cdf0e10cSrcweir 
370cdf0e10cSrcweir // -----------------------------------------------------------------------------
getAccessibleContext()371cdf0e10cSrcweir Reference< XAccessibleContext > SAL_CALL AccessibleBrowseBoxAccess::getAccessibleContext() throw ( RuntimeException )
372cdf0e10cSrcweir {
373cdf0e10cSrcweir     ::osl::MutexGuard aGuard( m_aMutex );
374cdf0e10cSrcweir 
375cdf0e10cSrcweir     DBG_ASSERT( ( m_pContext && m_xContext.is() ) || ( !m_pContext && !m_xContext.is() ),
376cdf0e10cSrcweir         "accessibility/extended/AccessibleBrowseBoxAccess::getAccessibleContext: inconsistency!" );
377cdf0e10cSrcweir 
378cdf0e10cSrcweir     // if the context died meanwhile (we're no listener, so it won't tell us explicitily when this happens),
379cdf0e10cSrcweir     // then reset an re-create.
380cdf0e10cSrcweir     if ( m_pContext && !m_pContext->isAlive() )
381cdf0e10cSrcweir         m_xContext = m_pContext = NULL;
382cdf0e10cSrcweir 
383cdf0e10cSrcweir     if ( !m_xContext.is() )
384cdf0e10cSrcweir         m_xContext = m_pContext = new AccessibleBrowseBox( m_xParent, this, m_rBrowseBox );
385cdf0e10cSrcweir 
386cdf0e10cSrcweir     return m_xContext;
387cdf0e10cSrcweir }
388cdf0e10cSrcweir 
389cdf0e10cSrcweir // -----------------------------------------------------------------------------
isContextAlive() const390cdf0e10cSrcweir bool AccessibleBrowseBoxAccess::isContextAlive() const
391cdf0e10cSrcweir {
392cdf0e10cSrcweir     return  ( NULL != m_pContext ) && m_pContext->isAlive();
393cdf0e10cSrcweir }
394cdf0e10cSrcweir 
395cdf0e10cSrcweir // ============================================================================
396cdf0e10cSrcweir 
397cdf0e10cSrcweir }   // namespace accessibility
398