xref: /aoo42x/main/sw/source/core/access/accfield.cxx (revision 870262e3)
1d3553c6bSHerbert Dürr /**************************************************************
2ca62e2c2SSteve Yin  *
3d3553c6bSHerbert Dürr  * Licensed to the Apache Software Foundation (ASF) under one
4d3553c6bSHerbert Dürr  * or more contributor license agreements.  See the NOTICE file
5d3553c6bSHerbert Dürr  * distributed with this work for additional information
6d3553c6bSHerbert Dürr  * regarding copyright ownership.  The ASF licenses this file
7d3553c6bSHerbert Dürr  * to you under the Apache License, Version 2.0 (the
8d3553c6bSHerbert Dürr  * "License"); you may not use this file except in compliance
9d3553c6bSHerbert Dürr  * with the License.  You may obtain a copy of the License at
10d3553c6bSHerbert Dürr  *
11d3553c6bSHerbert Dürr  *   http://www.apache.org/licenses/LICENSE-2.0
12d3553c6bSHerbert Dürr  *
13d3553c6bSHerbert Dürr  * Unless required by applicable law or agreed to in writing,
14d3553c6bSHerbert Dürr  * software distributed under the License is distributed on an
15d3553c6bSHerbert Dürr  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16d3553c6bSHerbert Dürr  * KIND, either express or implied.  See the License for the
17d3553c6bSHerbert Dürr  * specific language governing permissions and limitations
18d3553c6bSHerbert Dürr  * under the License.
19d3553c6bSHerbert Dürr  *
20d3553c6bSHerbert Dürr  *************************************************************/
21ca62e2c2SSteve Yin 
22ca62e2c2SSteve Yin // MARKER(update_precomp.py): autogen include statement, do not remove
23ca62e2c2SSteve Yin #include "precompiled_sw.hxx"
24ca62e2c2SSteve Yin 
25ca62e2c2SSteve Yin #ifndef COMPHELPER_ACCESSIBLE_KEYBINDING_HELPER_HXX
26ca62e2c2SSteve Yin #include <comphelper/accessiblekeybindinghelper.hxx>
27ca62e2c2SSteve Yin #endif
28ca62e2c2SSteve Yin #ifndef _SWURL_HXX //autogen
29ca62e2c2SSteve Yin #include <swurl.hxx>
30ca62e2c2SSteve Yin #endif
31ca62e2c2SSteve Yin #ifndef _VOS_MUTEX_HXX_ //autogen
32ca62e2c2SSteve Yin #include <vos/mutex.hxx>
33ca62e2c2SSteve Yin #endif
34ca62e2c2SSteve Yin #ifndef _SV_SVAPP_HXX //autogen
35ca62e2c2SSteve Yin #include <vcl/svapp.hxx>
36ca62e2c2SSteve Yin #endif
37ca62e2c2SSteve Yin #ifndef _NDTXT_HXX
38ca62e2c2SSteve Yin #include <ndtxt.hxx>
39ca62e2c2SSteve Yin #endif
40ca62e2c2SSteve Yin #ifndef _TXTINET_HXX
41ca62e2c2SSteve Yin #include <txtinet.hxx>
42ca62e2c2SSteve Yin #endif
43ca62e2c2SSteve Yin 
44ca62e2c2SSteve Yin #ifndef _ACCPARA_HXX
45ca62e2c2SSteve Yin #include <accpara.hxx>
46ca62e2c2SSteve Yin #endif
47ca62e2c2SSteve Yin #ifndef _ACCFIELD_HXX
48ca62e2c2SSteve Yin #include <accfield.hxx>
49ca62e2c2SSteve Yin #endif
50ca62e2c2SSteve Yin 
51ca62e2c2SSteve Yin #include <comphelper/processfactory.hxx>
52ca62e2c2SSteve Yin 
53ca62e2c2SSteve Yin #ifndef _COM_SUN_STAR_FRAME_XDESKTOP_HPP_
54ca62e2c2SSteve Yin #include <com/sun/star/frame/XDesktop.hpp>
55ca62e2c2SSteve Yin #endif
56ca62e2c2SSteve Yin #ifndef _COM_SUN_STAR_FRAME_XCOMPONENTLOADER_HPP_
57ca62e2c2SSteve Yin #include <com/sun/star/frame/XComponentLoader.hpp>
58ca62e2c2SSteve Yin #endif
59ca62e2c2SSteve Yin #ifndef _COM_SUN_STAR_DOCUMENT_XLINKTARGETSUPPLIER_HPP_
60ca62e2c2SSteve Yin #include <com/sun/star/document/XLinkTargetSupplier.hpp>
61ca62e2c2SSteve Yin #endif
62ca62e2c2SSteve Yin #ifndef COMPHELPER_ACCESSIBLE_EVENT_NOTIFIER
63ca62e2c2SSteve Yin #include <comphelper/accessibleeventnotifier.hxx>
64ca62e2c2SSteve Yin #endif
65ca62e2c2SSteve Yin 
66ca62e2c2SSteve Yin //Add end
67ca62e2c2SSteve Yin 
68ca62e2c2SSteve Yin using namespace ::com::sun::star;
69ca62e2c2SSteve Yin using namespace ::com::sun::star::beans;
70ca62e2c2SSteve Yin using namespace ::com::sun::star::lang;
71ca62e2c2SSteve Yin using namespace ::com::sun::star::uno;
72ca62e2c2SSteve Yin using namespace ::com::sun::star::accessibility;
73ca62e2c2SSteve Yin // using namespace ::rtl;
74ca62e2c2SSteve Yin 
SwAccessibleField(SwField * pSwFld,SwAccessibleParagraph * p,sal_Int16 nRole)75ca62e2c2SSteve Yin SwAccessibleField::SwAccessibleField( SwField *pSwFld,SwAccessibleParagraph *p,sal_Int16 nRole) :
76ca62e2c2SSteve Yin 	m_xPara( p ),m_pSwField(pSwFld),m_nRole(nRole)
77ca62e2c2SSteve Yin {
78ca62e2c2SSteve Yin 	m_nClientId=0;
79ca62e2c2SSteve Yin }
80ca62e2c2SSteve Yin 
81ca62e2c2SSteve Yin uno::Reference< XAccessibleContext > SAL_CALL
getAccessibleContext(void)82ca62e2c2SSteve Yin 	SwAccessibleField::getAccessibleContext( void )
83ca62e2c2SSteve Yin         throw (::com::sun::star::uno::RuntimeException)
84ca62e2c2SSteve Yin {
85ca62e2c2SSteve Yin 	uno::Reference < XAccessibleContext > xRet( this );
86ca62e2c2SSteve Yin 	return xRet;
87ca62e2c2SSteve Yin }
88ca62e2c2SSteve Yin 
getAccessibleChildCount(void)89ca62e2c2SSteve Yin sal_Int32 SAL_CALL SwAccessibleField::getAccessibleChildCount( void )
90ca62e2c2SSteve Yin         throw (::com::sun::star::uno::RuntimeException)
91ca62e2c2SSteve Yin {
92ca62e2c2SSteve Yin 	vos::OGuard aGuard(Application::GetSolarMutex());
93ca62e2c2SSteve Yin 	return 0;
94ca62e2c2SSteve Yin }
95ca62e2c2SSteve Yin 
96ca62e2c2SSteve Yin uno::Reference< XAccessible> SAL_CALL
getAccessibleChild(long)97ca62e2c2SSteve Yin 	SwAccessibleField::getAccessibleChild( long )
98ca62e2c2SSteve Yin         throw (::com::sun::star::uno::RuntimeException,
99ca62e2c2SSteve Yin 				::com::sun::star::lang::IndexOutOfBoundsException)
100ca62e2c2SSteve Yin {
101ca62e2c2SSteve Yin 	vos::OGuard aGuard(Application::GetSolarMutex());
102ca62e2c2SSteve Yin 	return uno::Reference< XAccessible >();
103ca62e2c2SSteve Yin }
104ca62e2c2SSteve Yin 
getAccessibleParent(void)105ca62e2c2SSteve Yin uno::Reference< XAccessible> SAL_CALL SwAccessibleField::getAccessibleParent (void)
106ca62e2c2SSteve Yin         throw (::com::sun::star::uno::RuntimeException)
107ca62e2c2SSteve Yin {
108ca62e2c2SSteve Yin 	vos::OGuard aGuard(Application::GetSolarMutex());
109ca62e2c2SSteve Yin 
110ca62e2c2SSteve Yin 	uno::Reference< XAccessible > xParent(static_cast<XAccessible*>(m_xPara.getBodyPtr()),UNO_QUERY);
111ca62e2c2SSteve Yin 	return xParent;
112ca62e2c2SSteve Yin }
113ca62e2c2SSteve Yin 
getAccessibleIndexInParent(void)114ca62e2c2SSteve Yin sal_Int32 SAL_CALL SwAccessibleField::getAccessibleIndexInParent (void)
115ca62e2c2SSteve Yin         throw (::com::sun::star::uno::RuntimeException)
116ca62e2c2SSteve Yin {
117ca62e2c2SSteve Yin 	vos::OGuard aGuard(Application::GetSolarMutex());
118ca62e2c2SSteve Yin 	return 0;
119ca62e2c2SSteve Yin }
120ca62e2c2SSteve Yin 
getAccessibleRole(void)121ca62e2c2SSteve Yin sal_Int16 SAL_CALL SwAccessibleField::getAccessibleRole (void)
122ca62e2c2SSteve Yin         throw (::com::sun::star::uno::RuntimeException)
123ca62e2c2SSteve Yin {
124ca62e2c2SSteve Yin 	return m_nRole;
125ca62e2c2SSteve Yin }
126ca62e2c2SSteve Yin 
getAccessibleDescription(void)127ca62e2c2SSteve Yin rtl::OUString SAL_CALL SwAccessibleField::getAccessibleDescription (void)
128ca62e2c2SSteve Yin         throw (::com::sun::star::uno::RuntimeException)
129ca62e2c2SSteve Yin {
130*870262e3SDon Lewis 	ASSERT( sal_False, "description needs to be overloaded" );
131ca62e2c2SSteve Yin 	//THROW_RUNTIME_EXCEPTION( XAccessibleContext, "internal error (method must be overloaded)" );
132ca62e2c2SSteve Yin 	return rtl::OUString();
133ca62e2c2SSteve Yin }
134ca62e2c2SSteve Yin 
getAccessibleName(void)135ca62e2c2SSteve Yin rtl::OUString SAL_CALL SwAccessibleField::getAccessibleName (void)
136ca62e2c2SSteve Yin         throw (::com::sun::star::uno::RuntimeException)
137ca62e2c2SSteve Yin {
138ca62e2c2SSteve Yin 	return rtl::OUString();
139ca62e2c2SSteve Yin }
140ca62e2c2SSteve Yin 
141ca62e2c2SSteve Yin uno::Reference< XAccessibleRelationSet> SAL_CALL
getAccessibleRelationSet(void)142ca62e2c2SSteve Yin 	SwAccessibleField::getAccessibleRelationSet (void)
143ca62e2c2SSteve Yin         throw (::com::sun::star::uno::RuntimeException)
144ca62e2c2SSteve Yin {
145ca62e2c2SSteve Yin 	return NULL;
146ca62e2c2SSteve Yin }
147ca62e2c2SSteve Yin 
148ca62e2c2SSteve Yin uno::Reference<XAccessibleStateSet> SAL_CALL
getAccessibleStateSet(void)149ca62e2c2SSteve Yin 	SwAccessibleField::getAccessibleStateSet (void)
150ca62e2c2SSteve Yin         throw (::com::sun::star::uno::RuntimeException)
151ca62e2c2SSteve Yin {
152ca62e2c2SSteve Yin 	vos::OGuard aGuard(Application::GetSolarMutex());
153ca62e2c2SSteve Yin 	return uno::Reference<XAccessibleStateSet>();
154ca62e2c2SSteve Yin }
155ca62e2c2SSteve Yin 
getLocale(void)156ca62e2c2SSteve Yin com::sun::star::lang::Locale SAL_CALL SwAccessibleField::getLocale (void)
157ca62e2c2SSteve Yin 		throw (::com::sun::star::accessibility::IllegalAccessibleComponentStateException, ::com::sun::star::uno::RuntimeException)
158ca62e2c2SSteve Yin {
159ca62e2c2SSteve Yin 	vos::OGuard aGuard(Application::GetSolarMutex());
160ca62e2c2SSteve Yin 
161ca62e2c2SSteve Yin 	com::sun::star::lang::Locale aLoc( Application::GetSettings().GetLocale() );
162ca62e2c2SSteve Yin 	return aLoc;
163ca62e2c2SSteve Yin }
164ca62e2c2SSteve Yin 
lcl_PointInRectangle(const awt::Point & aPoint,const awt::Rectangle & aRect)165ca62e2c2SSteve Yin static sal_Bool lcl_PointInRectangle(const awt::Point & aPoint,
166ca62e2c2SSteve Yin                                      const awt::Rectangle & aRect)
167ca62e2c2SSteve Yin {
168ca62e2c2SSteve Yin     long nDiffX = aPoint.X - aRect.X;
169ca62e2c2SSteve Yin     long nDiffY = aPoint.Y - aRect.Y;
170ca62e2c2SSteve Yin 
171ca62e2c2SSteve Yin     return
172ca62e2c2SSteve Yin         nDiffX >= 0 && nDiffX < aRect.Width && nDiffY >= 0 &&
173ca62e2c2SSteve Yin         nDiffY < aRect.Height;
174ca62e2c2SSteve Yin 
175ca62e2c2SSteve Yin }
176ca62e2c2SSteve Yin 
containsPoint(const::com::sun::star::awt::Point & aPoint)177ca62e2c2SSteve Yin sal_Bool SAL_CALL SwAccessibleField::containsPoint(
178ca62e2c2SSteve Yin 			const ::com::sun::star::awt::Point& aPoint )
179ca62e2c2SSteve Yin 		throw (RuntimeException)
180ca62e2c2SSteve Yin {
181ca62e2c2SSteve Yin     awt::Rectangle aPixBounds = getBoundsImpl(sal_True);
182ca62e2c2SSteve Yin     aPixBounds.X = 0;
183ca62e2c2SSteve Yin     aPixBounds.Y = 0;
184ca62e2c2SSteve Yin 
185ca62e2c2SSteve Yin     return lcl_PointInRectangle(aPoint, aPixBounds);
186ca62e2c2SSteve Yin }
187ca62e2c2SSteve Yin 
getAccessibleAtPoint(const awt::Point & aPoint)188ca62e2c2SSteve Yin uno::Reference< XAccessible > SAL_CALL SwAccessibleField::getAccessibleAtPoint(
189ca62e2c2SSteve Yin 				const awt::Point& aPoint )
190ca62e2c2SSteve Yin 		throw (RuntimeException)
191ca62e2c2SSteve Yin {
192ca62e2c2SSteve Yin 	vos::OGuard aGuard(Application::GetSolarMutex());
193ca62e2c2SSteve Yin 
194ca62e2c2SSteve Yin 	uno::Reference< XAccessible > xAcc;
195ca62e2c2SSteve Yin 	awt::Rectangle rc = getBounds();
196ca62e2c2SSteve Yin 	if(aPoint.X >= rc.X && aPoint.X <= rc.X + rc.Width &&
197ca62e2c2SSteve Yin 		aPoint.Y >= rc.Y && aPoint.Y <= rc.Y + rc.Height )
198ca62e2c2SSteve Yin 	{
199ca62e2c2SSteve Yin 		xAcc =this;
200ca62e2c2SSteve Yin 	}
201ca62e2c2SSteve Yin 	return xAcc;
202ca62e2c2SSteve Yin }
203ca62e2c2SSteve Yin 
204ca62e2c2SSteve Yin 
205ca62e2c2SSteve Yin /**
206ca62e2c2SSteve Yin    Get bounding box.
207ca62e2c2SSteve Yin 
208ca62e2c2SSteve Yin    There are two modes.
209ca62e2c2SSteve Yin 
210ca62e2c2SSteve Yin    - realative
211ca62e2c2SSteve Yin 
212ca62e2c2SSteve Yin      Return bounding box relative to parent if parent is no root
213ca62e2c2SSteve Yin      frame. Otherwise return the absolute bounding box.
214ca62e2c2SSteve Yin 
215ca62e2c2SSteve Yin    - absolute
216ca62e2c2SSteve Yin 
217ca62e2c2SSteve Yin      Return the absolute bounding box.
218ca62e2c2SSteve Yin 
219ca62e2c2SSteve Yin    @param bRelative
220ca62e2c2SSteve Yin    true: Use relative mode.
221ca62e2c2SSteve Yin    false: Use absolute mode.
222ca62e2c2SSteve Yin */
getBoundsImpl(sal_Bool)223ca62e2c2SSteve Yin awt::Rectangle SAL_CALL SwAccessibleField::getBoundsImpl( sal_Bool )
224ca62e2c2SSteve Yin 		throw (RuntimeException)
225ca62e2c2SSteve Yin {
226ca62e2c2SSteve Yin 	vos::OGuard aGuard(Application::GetSolarMutex());
227ca62e2c2SSteve Yin 	return awt::Rectangle();
228ca62e2c2SSteve Yin }
229ca62e2c2SSteve Yin 
getBounds()230ca62e2c2SSteve Yin awt::Rectangle SAL_CALL SwAccessibleField::getBounds()
231ca62e2c2SSteve Yin 		throw (RuntimeException)
232ca62e2c2SSteve Yin {
233ca62e2c2SSteve Yin     return getBoundsImpl(sal_True);
234ca62e2c2SSteve Yin }
235ca62e2c2SSteve Yin 
getLocation()236ca62e2c2SSteve Yin awt::Point SAL_CALL SwAccessibleField::getLocation()
237ca62e2c2SSteve Yin     throw (RuntimeException)
238ca62e2c2SSteve Yin {
239ca62e2c2SSteve Yin     awt::Rectangle aRect = getBoundsImpl(sal_True);
240ca62e2c2SSteve Yin     awt::Point aPoint(aRect.X, aRect.Y);
241ca62e2c2SSteve Yin 
242ca62e2c2SSteve Yin     return aPoint;
243ca62e2c2SSteve Yin }
244ca62e2c2SSteve Yin 
245ca62e2c2SSteve Yin 
getLocationOnScreen()246ca62e2c2SSteve Yin awt::Point SAL_CALL SwAccessibleField::getLocationOnScreen()
247ca62e2c2SSteve Yin 		throw (RuntimeException)
248ca62e2c2SSteve Yin {
249ca62e2c2SSteve Yin     awt::Rectangle aRect = getBoundsImpl(sal_False);
250ca62e2c2SSteve Yin     //Point aPixPos = m_xPara->getLocationOnScreen();
251ca62e2c2SSteve Yin     return awt::Point( aRect.X,aRect.Y);//aPixPos.X() + aRect.nLeft , aPixPos.Y() + + aRect.nRight );
252ca62e2c2SSteve Yin }
253ca62e2c2SSteve Yin 
254ca62e2c2SSteve Yin 
getSize()255ca62e2c2SSteve Yin awt::Size SAL_CALL SwAccessibleField::getSize()
256ca62e2c2SSteve Yin 		throw (RuntimeException)
257ca62e2c2SSteve Yin {
258ca62e2c2SSteve Yin     awt::Rectangle aRect = getBoundsImpl(sal_False);
259ca62e2c2SSteve Yin 	awt::Size aSize( aRect.Width, aRect.Height );
260ca62e2c2SSteve Yin 
261ca62e2c2SSteve Yin 	return aSize;
262ca62e2c2SSteve Yin }
263ca62e2c2SSteve Yin 
grabFocus()264ca62e2c2SSteve Yin void SAL_CALL SwAccessibleField::grabFocus()
265ca62e2c2SSteve Yin 		throw (RuntimeException)
266ca62e2c2SSteve Yin {
267ca62e2c2SSteve Yin 	vos::OGuard aGuard(Application::GetSolarMutex());
268ca62e2c2SSteve Yin 	return;
269ca62e2c2SSteve Yin }
270ca62e2c2SSteve Yin 
271ca62e2c2SSteve Yin 
getForeground()272ca62e2c2SSteve Yin sal_Int32 SAL_CALL SwAccessibleField::getForeground()
273ca62e2c2SSteve Yin 		throw (::com::sun::star::uno::RuntimeException)
274ca62e2c2SSteve Yin {
275ca62e2c2SSteve Yin 	return 0;
276ca62e2c2SSteve Yin }
277ca62e2c2SSteve Yin 
getBackground()278ca62e2c2SSteve Yin sal_Int32 SAL_CALL SwAccessibleField::getBackground()
279ca62e2c2SSteve Yin 		throw (::com::sun::star::uno::RuntimeException)
280ca62e2c2SSteve Yin {
281ca62e2c2SSteve Yin 	return 0xffffff;
282ca62e2c2SSteve Yin }
queryInterface(const::com::sun::star::uno::Type & rType)283ca62e2c2SSteve Yin ::com::sun::star::uno::Any SAL_CALL SwAccessibleField::queryInterface(
284ca62e2c2SSteve Yin         const ::com::sun::star::uno::Type& rType )
285ca62e2c2SSteve Yin         throw (::com::sun::star::uno::RuntimeException)
286ca62e2c2SSteve Yin {
287ca62e2c2SSteve Yin 	Any aRet;
288ca62e2c2SSteve Yin     if ( rType == ::getCppuType((uno::Reference<XAccessibleContext> *)0) )
289ca62e2c2SSteve Yin     {
290ca62e2c2SSteve Yin         Reference<XAccessibleContext> aAccContext = (XAccessibleContext *) this; // resolve ambiguity
291ca62e2c2SSteve Yin         aRet <<= aAccContext;
292ca62e2c2SSteve Yin     }
293ca62e2c2SSteve Yin     else if ( rType == ::getCppuType((Reference<XAccessibleComponent> *)0) )
294ca62e2c2SSteve Yin     {
295ca62e2c2SSteve Yin         Reference<XAccessibleComponent> aAccEditComponent = this;
296ca62e2c2SSteve Yin         aRet <<= aAccEditComponent;
297ca62e2c2SSteve Yin     }
298ca62e2c2SSteve Yin 	if (rType == ::getCppuType((Reference<XAccessibleEventBroadcaster> *)0))
299ca62e2c2SSteve Yin 	{
300ca62e2c2SSteve Yin         Reference<XAccessibleEventBroadcaster> aAccBroadcaster= this;
301ca62e2c2SSteve Yin         aRet <<= aAccBroadcaster;
302ca62e2c2SSteve Yin 	}
303ca62e2c2SSteve Yin 	return aRet;
304ca62e2c2SSteve Yin }
305ca62e2c2SSteve Yin 
acquire()306ca62e2c2SSteve Yin void SAL_CALL SwAccessibleField::acquire(  ) throw ()
307ca62e2c2SSteve Yin {
308ca62e2c2SSteve Yin }
release()309ca62e2c2SSteve Yin void SAL_CALL SwAccessibleField::release(  ) throw ()
310ca62e2c2SSteve Yin {
311ca62e2c2SSteve Yin }
312ca62e2c2SSteve Yin 
addEventListener(const Reference<XAccessibleEventListener> & xListener)313ca62e2c2SSteve Yin void SAL_CALL SwAccessibleField::addEventListener(
314ca62e2c2SSteve Yin 			const Reference< XAccessibleEventListener >& xListener )
315ca62e2c2SSteve Yin 		throw (::com::sun::star::uno::RuntimeException)
316ca62e2c2SSteve Yin {
317ca62e2c2SSteve Yin 	//DBG_MSG( "accessible event listener added" )
318ca62e2c2SSteve Yin 
319ca62e2c2SSteve Yin 	if (xListener.is())
320ca62e2c2SSteve Yin     {
321ca62e2c2SSteve Yin     	vos::OGuard aGuard(Application::GetSolarMutex());
322ca62e2c2SSteve Yin 		if (!m_nClientId)
323ca62e2c2SSteve Yin             m_nClientId = comphelper::AccessibleEventNotifier::registerClient( );
324ca62e2c2SSteve Yin 		comphelper::AccessibleEventNotifier::addEventListener( m_nClientId, xListener );
325ca62e2c2SSteve Yin     }
326ca62e2c2SSteve Yin }
327ca62e2c2SSteve Yin 
removeEventListener(const Reference<XAccessibleEventListener> & xListener)328ca62e2c2SSteve Yin void SAL_CALL SwAccessibleField::removeEventListener(
329ca62e2c2SSteve Yin 			const Reference< XAccessibleEventListener >& xListener )
330ca62e2c2SSteve Yin 		throw (::com::sun::star::uno::RuntimeException)
331ca62e2c2SSteve Yin {
332ca62e2c2SSteve Yin 	//DBG_MSG( "accessible event listener removed" )
333ca62e2c2SSteve Yin 
334ca62e2c2SSteve Yin 	if (xListener.is())
335ca62e2c2SSteve Yin 	{
336ca62e2c2SSteve Yin     	vos::OGuard aGuard(Application::GetSolarMutex());
337ca62e2c2SSteve Yin 		sal_Int32 nListenerCount = comphelper::AccessibleEventNotifier::removeEventListener( m_nClientId, xListener );
338ca62e2c2SSteve Yin 		if ( !nListenerCount )
339ca62e2c2SSteve Yin 		{
340ca62e2c2SSteve Yin 			// no listeners anymore
341ca62e2c2SSteve Yin 			// -> revoke ourself. This may lead to the notifier thread dying (if we were the last client),
342ca62e2c2SSteve Yin 			// and at least to us not firing any events anymore, in case somebody calls
343ca62e2c2SSteve Yin 			// NotifyAccessibleEvent, again
344ca62e2c2SSteve Yin 			comphelper::AccessibleEventNotifier::revokeClient( m_nClientId );
345ca62e2c2SSteve Yin 			m_nClientId = 0;
346ca62e2c2SSteve Yin 		}
347ca62e2c2SSteve Yin 	}
348ca62e2c2SSteve Yin }
349