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
100841af79SAndrew Rist  *
110841af79SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
120841af79SAndrew Rist  *
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.
190841af79SAndrew Rist  *
200841af79SAndrew Rist  *************************************************************/
210841af79SAndrew Rist 
220841af79SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_accessibility.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir // includes --------------------------------------------------------------
28cdf0e10cSrcweir #include <accessibility/standard/accessiblemenubasecomponent.hxx>
29cdf0e10cSrcweir #include <accessibility/standard/vclxaccessiblemenu.hxx>
30cdf0e10cSrcweir #include <accessibility/standard/vclxaccessiblemenuitem.hxx>
31cdf0e10cSrcweir #include <accessibility/standard/vclxaccessiblemenuseparator.hxx>
32cdf0e10cSrcweir #include <toolkit/helper/externallock.hxx>
33cdf0e10cSrcweir #include <toolkit/helper/convert.hxx>
34cdf0e10cSrcweir 
35cdf0e10cSrcweir #include <com/sun/star/accessibility/AccessibleEventId.hpp>
36cdf0e10cSrcweir #include <com/sun/star/accessibility/AccessibleRole.hpp>
37cdf0e10cSrcweir #include <com/sun/star/accessibility/AccessibleStateType.hpp>
38cdf0e10cSrcweir 
39cdf0e10cSrcweir #include <unotools/accessiblestatesethelper.hxx>
40cdf0e10cSrcweir #include <vcl/svapp.hxx>
41cdf0e10cSrcweir #include <vcl/window.hxx>
42cdf0e10cSrcweir #include <vcl/menu.hxx>
43cdf0e10cSrcweir #include <tools/debug.hxx>
44cdf0e10cSrcweir 
45cdf0e10cSrcweir using namespace ::com::sun::star;
46cdf0e10cSrcweir using namespace ::com::sun::star::lang;
47cdf0e10cSrcweir using namespace ::com::sun::star::uno;
48cdf0e10cSrcweir using namespace ::com::sun::star::accessibility;
49cdf0e10cSrcweir using namespace ::comphelper;
50cdf0e10cSrcweir 
51cdf0e10cSrcweir 
52cdf0e10cSrcweir // -----------------------------------------------------------------------------
53cdf0e10cSrcweir // OAccessibleMenuBaseComponent
54cdf0e10cSrcweir // -----------------------------------------------------------------------------
55cdf0e10cSrcweir 
OAccessibleMenuBaseComponent(Menu * pMenu)56cdf0e10cSrcweir OAccessibleMenuBaseComponent::OAccessibleMenuBaseComponent( Menu* pMenu )
57cdf0e10cSrcweir 	:AccessibleExtendedComponentHelper_BASE( new VCLExternalSolarLock() )
58cdf0e10cSrcweir 	,m_pMenu( pMenu )
59cdf0e10cSrcweir 	,m_bEnabled( sal_False )
60cdf0e10cSrcweir 	,m_bFocused( sal_False )
61cdf0e10cSrcweir     ,m_bVisible( sal_False )
62cdf0e10cSrcweir 	,m_bSelected( sal_False )
63cdf0e10cSrcweir 	,m_bChecked( sal_False )
64cdf0e10cSrcweir {
65cdf0e10cSrcweir 	m_pExternalLock = static_cast< VCLExternalSolarLock* >( getExternalLock() );
66cdf0e10cSrcweir 
67cdf0e10cSrcweir 	if ( m_pMenu )
68cdf0e10cSrcweir 	{
69cdf0e10cSrcweir 		m_aAccessibleChildren.assign( m_pMenu->GetItemCount(), Reference< XAccessible >() );
70cdf0e10cSrcweir 		m_pMenu->AddEventListener( LINK( this, OAccessibleMenuBaseComponent, MenuEventListener ) );
71cdf0e10cSrcweir 	}
72cdf0e10cSrcweir }
73cdf0e10cSrcweir 
74cdf0e10cSrcweir // -----------------------------------------------------------------------------
75cdf0e10cSrcweir 
~OAccessibleMenuBaseComponent()76cdf0e10cSrcweir OAccessibleMenuBaseComponent::~OAccessibleMenuBaseComponent()
77cdf0e10cSrcweir {
78cdf0e10cSrcweir 	if ( m_pMenu )
79cdf0e10cSrcweir 		m_pMenu->RemoveEventListener( LINK( this, OAccessibleMenuBaseComponent, MenuEventListener ) );
80cdf0e10cSrcweir 
81cdf0e10cSrcweir 	delete m_pExternalLock;
82cdf0e10cSrcweir 	m_pExternalLock = NULL;
83cdf0e10cSrcweir }
84cdf0e10cSrcweir 
85cdf0e10cSrcweir // -----------------------------------------------------------------------------
86cdf0e10cSrcweir 
IsEnabled()87cdf0e10cSrcweir sal_Bool OAccessibleMenuBaseComponent::IsEnabled()
88cdf0e10cSrcweir {
89cdf0e10cSrcweir 	return sal_False;
90cdf0e10cSrcweir }
91cdf0e10cSrcweir 
92cdf0e10cSrcweir // -----------------------------------------------------------------------------
93cdf0e10cSrcweir 
IsFocused()94cdf0e10cSrcweir sal_Bool OAccessibleMenuBaseComponent::IsFocused()
95cdf0e10cSrcweir {
96cdf0e10cSrcweir 	return sal_False;
97cdf0e10cSrcweir }
98cdf0e10cSrcweir 
99cdf0e10cSrcweir // -----------------------------------------------------------------------------
100cdf0e10cSrcweir 
IsVisible()101cdf0e10cSrcweir sal_Bool OAccessibleMenuBaseComponent::IsVisible()
102cdf0e10cSrcweir {
103cdf0e10cSrcweir 	return sal_False;
104cdf0e10cSrcweir }
105cdf0e10cSrcweir 
106cdf0e10cSrcweir // -----------------------------------------------------------------------------
107cdf0e10cSrcweir 
IsSelected()108cdf0e10cSrcweir sal_Bool OAccessibleMenuBaseComponent::IsSelected()
109cdf0e10cSrcweir {
110cdf0e10cSrcweir 	return sal_False;
111cdf0e10cSrcweir }
112cdf0e10cSrcweir 
113cdf0e10cSrcweir // -----------------------------------------------------------------------------
114cdf0e10cSrcweir 
IsChecked()115cdf0e10cSrcweir sal_Bool OAccessibleMenuBaseComponent::IsChecked()
116cdf0e10cSrcweir {
117cdf0e10cSrcweir 	return sal_False;
118cdf0e10cSrcweir }
119cdf0e10cSrcweir 
120cdf0e10cSrcweir // -----------------------------------------------------------------------------
121cdf0e10cSrcweir 
SetStates()122cdf0e10cSrcweir void OAccessibleMenuBaseComponent::SetStates()
123cdf0e10cSrcweir {
124cdf0e10cSrcweir 	m_bEnabled = IsEnabled();
125cdf0e10cSrcweir 	m_bFocused = IsFocused();
126cdf0e10cSrcweir     m_bVisible = IsVisible();
127cdf0e10cSrcweir 	m_bSelected = IsSelected();
128cdf0e10cSrcweir 	m_bChecked = IsChecked();
129cdf0e10cSrcweir }
130cdf0e10cSrcweir 
131cdf0e10cSrcweir // -----------------------------------------------------------------------------
132cdf0e10cSrcweir 
SetEnabled(sal_Bool bEnabled)133cdf0e10cSrcweir void OAccessibleMenuBaseComponent::SetEnabled( sal_Bool bEnabled )
134cdf0e10cSrcweir {
135cdf0e10cSrcweir 	if ( m_bEnabled != bEnabled )
136cdf0e10cSrcweir 	{
137*21075d77SSteve Yin 		sal_Int16 nStateType=AccessibleStateType::ENABLED;
138*21075d77SSteve Yin 		if (IsMenuHideDisabledEntries())
139*21075d77SSteve Yin 		{
140*21075d77SSteve Yin 			nStateType = AccessibleStateType::VISIBLE;
141*21075d77SSteve Yin 		}
142cdf0e10cSrcweir         Any aOldValue[2], aNewValue[2];
143cdf0e10cSrcweir 		if ( m_bEnabled )
144cdf0e10cSrcweir         {
145cdf0e10cSrcweir             aOldValue[0] <<= AccessibleStateType::SENSITIVE;
146*21075d77SSteve Yin             aOldValue[1] <<= nStateType;
147cdf0e10cSrcweir         }
148cdf0e10cSrcweir 		else
149cdf0e10cSrcweir         {
150*21075d77SSteve Yin             aNewValue[0] <<= nStateType;
151cdf0e10cSrcweir             aNewValue[1] <<= AccessibleStateType::SENSITIVE;
152cdf0e10cSrcweir         }
153cdf0e10cSrcweir 		m_bEnabled = bEnabled;
154cdf0e10cSrcweir         NotifyAccessibleEvent( AccessibleEventId::STATE_CHANGED, aOldValue[0], aNewValue[0] );
155cdf0e10cSrcweir         NotifyAccessibleEvent( AccessibleEventId::STATE_CHANGED, aOldValue[1], aNewValue[1] );
156cdf0e10cSrcweir 	}
157cdf0e10cSrcweir }
158cdf0e10cSrcweir 
159cdf0e10cSrcweir // -----------------------------------------------------------------------------
160cdf0e10cSrcweir 
SetFocused(sal_Bool bFocused)161cdf0e10cSrcweir void OAccessibleMenuBaseComponent::SetFocused( sal_Bool bFocused )
162cdf0e10cSrcweir {
163cdf0e10cSrcweir 	if ( m_bFocused != bFocused )
164cdf0e10cSrcweir 	{
165cdf0e10cSrcweir 		Any aOldValue, aNewValue;
166cdf0e10cSrcweir 		if ( m_bFocused )
167cdf0e10cSrcweir 			aOldValue <<= AccessibleStateType::FOCUSED;
168cdf0e10cSrcweir 		else
169cdf0e10cSrcweir 			aNewValue <<= AccessibleStateType::FOCUSED;
170cdf0e10cSrcweir 		m_bFocused = bFocused;
171cdf0e10cSrcweir 		NotifyAccessibleEvent( AccessibleEventId::STATE_CHANGED, aOldValue, aNewValue );
172cdf0e10cSrcweir 	}
173cdf0e10cSrcweir }
174cdf0e10cSrcweir 
175cdf0e10cSrcweir // -----------------------------------------------------------------------------
176cdf0e10cSrcweir 
SetVisible(sal_Bool bVisible)177cdf0e10cSrcweir void OAccessibleMenuBaseComponent::SetVisible( sal_Bool bVisible )
178cdf0e10cSrcweir {
179cdf0e10cSrcweir     if ( m_bVisible != bVisible )
180cdf0e10cSrcweir 	{
181cdf0e10cSrcweir 		Any aOldValue, aNewValue;
182cdf0e10cSrcweir         if ( m_bVisible )
183cdf0e10cSrcweir 			aOldValue <<= AccessibleStateType::VISIBLE;
184cdf0e10cSrcweir 		else
185cdf0e10cSrcweir 			aNewValue <<= AccessibleStateType::VISIBLE;
186cdf0e10cSrcweir         m_bVisible = bVisible;
187cdf0e10cSrcweir 		NotifyAccessibleEvent( AccessibleEventId::STATE_CHANGED, aOldValue, aNewValue );
188cdf0e10cSrcweir 	}
189cdf0e10cSrcweir }
190cdf0e10cSrcweir 
191cdf0e10cSrcweir // -----------------------------------------------------------------------------
192cdf0e10cSrcweir 
SetSelected(sal_Bool bSelected)193cdf0e10cSrcweir void OAccessibleMenuBaseComponent::SetSelected( sal_Bool bSelected )
194cdf0e10cSrcweir {
195cdf0e10cSrcweir     if ( m_bSelected != bSelected )
196cdf0e10cSrcweir     {
197cdf0e10cSrcweir         Any aOldValue, aNewValue;
198cdf0e10cSrcweir         if ( m_bSelected )
199cdf0e10cSrcweir             aOldValue <<= AccessibleStateType::SELECTED;
200cdf0e10cSrcweir         else
201cdf0e10cSrcweir             aNewValue <<= AccessibleStateType::SELECTED;
202cdf0e10cSrcweir         m_bSelected = bSelected;
203cdf0e10cSrcweir         NotifyAccessibleEvent( AccessibleEventId::STATE_CHANGED, aOldValue, aNewValue );
204cdf0e10cSrcweir     }
205cdf0e10cSrcweir }
206cdf0e10cSrcweir 
207cdf0e10cSrcweir // -----------------------------------------------------------------------------
208cdf0e10cSrcweir 
SetChecked(sal_Bool bChecked)209cdf0e10cSrcweir void OAccessibleMenuBaseComponent::SetChecked( sal_Bool bChecked )
210cdf0e10cSrcweir {
211cdf0e10cSrcweir 	if ( m_bChecked != bChecked )
212cdf0e10cSrcweir 	{
213cdf0e10cSrcweir 		Any aOldValue, aNewValue;
214cdf0e10cSrcweir 		if ( m_bChecked )
215cdf0e10cSrcweir 			aOldValue <<= AccessibleStateType::CHECKED;
216cdf0e10cSrcweir 		else
217cdf0e10cSrcweir 			aNewValue <<= AccessibleStateType::CHECKED;
218cdf0e10cSrcweir 		m_bChecked = bChecked;
219cdf0e10cSrcweir 		NotifyAccessibleEvent( AccessibleEventId::STATE_CHANGED, aOldValue, aNewValue );
220cdf0e10cSrcweir 	}
221cdf0e10cSrcweir }
222cdf0e10cSrcweir 
223cdf0e10cSrcweir // -----------------------------------------------------------------------------
224cdf0e10cSrcweir 
UpdateEnabled(sal_Int32 i,sal_Bool bEnabled)225cdf0e10cSrcweir void OAccessibleMenuBaseComponent::UpdateEnabled( sal_Int32 i, sal_Bool bEnabled )
226cdf0e10cSrcweir {
227cdf0e10cSrcweir 	if ( i >= 0 && i < (sal_Int32)m_aAccessibleChildren.size() )
228cdf0e10cSrcweir 	{
229cdf0e10cSrcweir 		Reference< XAccessible > xChild( m_aAccessibleChildren[i] );
230cdf0e10cSrcweir 		if ( xChild.is() )
231cdf0e10cSrcweir 		{
232cdf0e10cSrcweir 			OAccessibleMenuBaseComponent* pComp = static_cast< OAccessibleMenuBaseComponent* >( xChild.get() );
233cdf0e10cSrcweir 			if ( pComp )
234cdf0e10cSrcweir 				pComp->SetEnabled( bEnabled );
235cdf0e10cSrcweir 		}
236cdf0e10cSrcweir 	}
237cdf0e10cSrcweir }
238cdf0e10cSrcweir 
239cdf0e10cSrcweir // -----------------------------------------------------------------------------
240cdf0e10cSrcweir 
UpdateFocused(sal_Int32 i,sal_Bool bFocused)241cdf0e10cSrcweir void OAccessibleMenuBaseComponent::UpdateFocused( sal_Int32 i, sal_Bool bFocused )
242cdf0e10cSrcweir {
243cdf0e10cSrcweir     if ( i >= 0 && i < (sal_Int32)m_aAccessibleChildren.size() )
244cdf0e10cSrcweir     {
245cdf0e10cSrcweir         Reference< XAccessible > xChild( m_aAccessibleChildren[i] );
246cdf0e10cSrcweir         if ( xChild.is() )
247cdf0e10cSrcweir         {
248cdf0e10cSrcweir             OAccessibleMenuBaseComponent* pComp = static_cast< OAccessibleMenuBaseComponent* >( xChild.get() );
249cdf0e10cSrcweir             if ( pComp )
250cdf0e10cSrcweir                 pComp->SetFocused( bFocused );
251cdf0e10cSrcweir         }
252cdf0e10cSrcweir     }
253cdf0e10cSrcweir }
254cdf0e10cSrcweir 
255cdf0e10cSrcweir // -----------------------------------------------------------------------------
256cdf0e10cSrcweir 
UpdateVisible()257cdf0e10cSrcweir void OAccessibleMenuBaseComponent::UpdateVisible()
258cdf0e10cSrcweir {
259cdf0e10cSrcweir     SetVisible( IsVisible() );
260cdf0e10cSrcweir 	for ( sal_uInt32 i = 0; i < m_aAccessibleChildren.size(); ++i )
261cdf0e10cSrcweir 	{
262cdf0e10cSrcweir 		Reference< XAccessible > xChild( m_aAccessibleChildren[i] );
263cdf0e10cSrcweir 		if ( xChild.is() )
264cdf0e10cSrcweir 		{
265cdf0e10cSrcweir 			OAccessibleMenuBaseComponent* pComp = static_cast< OAccessibleMenuBaseComponent* >( xChild.get() );
266cdf0e10cSrcweir 			if ( pComp )
267cdf0e10cSrcweir                 pComp->SetVisible( pComp->IsVisible() );
268cdf0e10cSrcweir 		}
269cdf0e10cSrcweir 	}
270cdf0e10cSrcweir }
271cdf0e10cSrcweir 
272cdf0e10cSrcweir // -----------------------------------------------------------------------------
273cdf0e10cSrcweir 
UpdateSelected(sal_Int32 i,sal_Bool bSelected)274cdf0e10cSrcweir void OAccessibleMenuBaseComponent::UpdateSelected( sal_Int32 i, sal_Bool bSelected )
275cdf0e10cSrcweir {
276cdf0e10cSrcweir 	NotifyAccessibleEvent( AccessibleEventId::SELECTION_CHANGED, Any(), Any() );
277cdf0e10cSrcweir 
278cdf0e10cSrcweir 	if ( i >= 0 && i < (sal_Int32)m_aAccessibleChildren.size() )
279cdf0e10cSrcweir 	{
280cdf0e10cSrcweir 		Reference< XAccessible > xChild( m_aAccessibleChildren[i] );
281cdf0e10cSrcweir 		if ( xChild.is() )
282cdf0e10cSrcweir 		{
283cdf0e10cSrcweir 			OAccessibleMenuBaseComponent* pComp = static_cast< OAccessibleMenuBaseComponent* >( xChild.get() );
284cdf0e10cSrcweir 			if ( pComp )
285cdf0e10cSrcweir 				pComp->SetSelected( bSelected );
286cdf0e10cSrcweir 		}
287cdf0e10cSrcweir 	}
288cdf0e10cSrcweir }
289cdf0e10cSrcweir 
290cdf0e10cSrcweir // -----------------------------------------------------------------------------
291cdf0e10cSrcweir 
UpdateChecked(sal_Int32 i,sal_Bool bChecked)292cdf0e10cSrcweir void OAccessibleMenuBaseComponent::UpdateChecked( sal_Int32 i, sal_Bool bChecked )
293cdf0e10cSrcweir {
294cdf0e10cSrcweir 	if ( i >= 0 && i < (sal_Int32)m_aAccessibleChildren.size() )
295cdf0e10cSrcweir 	{
296cdf0e10cSrcweir 		Reference< XAccessible > xChild( m_aAccessibleChildren[i] );
297cdf0e10cSrcweir 		if ( xChild.is() )
298cdf0e10cSrcweir 		{
299cdf0e10cSrcweir 			OAccessibleMenuBaseComponent* pComp = static_cast< OAccessibleMenuBaseComponent* >( xChild.get() );
300cdf0e10cSrcweir 			if ( pComp )
301cdf0e10cSrcweir 				pComp->SetChecked( bChecked );
302cdf0e10cSrcweir 		}
303cdf0e10cSrcweir 	}
304cdf0e10cSrcweir }
305cdf0e10cSrcweir 
306cdf0e10cSrcweir // -----------------------------------------------------------------------------
307cdf0e10cSrcweir 
UpdateAccessibleName(sal_Int32 i)308cdf0e10cSrcweir void OAccessibleMenuBaseComponent::UpdateAccessibleName( sal_Int32 i )
309cdf0e10cSrcweir {
310cdf0e10cSrcweir 	if ( i >= 0 && i < (sal_Int32)m_aAccessibleChildren.size() )
311cdf0e10cSrcweir 	{
312cdf0e10cSrcweir 		Reference< XAccessible > xChild( m_aAccessibleChildren[i] );
313cdf0e10cSrcweir 		if ( xChild.is() )
314cdf0e10cSrcweir 		{
315cdf0e10cSrcweir 			OAccessibleMenuItemComponent* pComp = static_cast< OAccessibleMenuItemComponent* >( xChild.get() );
316cdf0e10cSrcweir 			if ( pComp )
317cdf0e10cSrcweir 				pComp->SetAccessibleName( pComp->GetAccessibleName() );
318cdf0e10cSrcweir 		}
319cdf0e10cSrcweir 	}
320cdf0e10cSrcweir }
321cdf0e10cSrcweir 
322cdf0e10cSrcweir // -----------------------------------------------------------------------------
323cdf0e10cSrcweir 
UpdateItemText(sal_Int32 i)324cdf0e10cSrcweir void OAccessibleMenuBaseComponent::UpdateItemText( sal_Int32 i )
325cdf0e10cSrcweir {
326cdf0e10cSrcweir 	if ( i >= 0 && i < (sal_Int32)m_aAccessibleChildren.size() )
327cdf0e10cSrcweir 	{
328cdf0e10cSrcweir 		Reference< XAccessible > xChild( m_aAccessibleChildren[i] );
329cdf0e10cSrcweir 		if ( xChild.is() )
330cdf0e10cSrcweir 		{
331cdf0e10cSrcweir 			OAccessibleMenuItemComponent* pComp = static_cast< OAccessibleMenuItemComponent* >( xChild.get() );
332cdf0e10cSrcweir 			if ( pComp )
333cdf0e10cSrcweir 				pComp->SetItemText( pComp->GetItemText() );
334cdf0e10cSrcweir 		}
335cdf0e10cSrcweir 	}
336cdf0e10cSrcweir }
337cdf0e10cSrcweir 
338cdf0e10cSrcweir // -----------------------------------------------------------------------------
339cdf0e10cSrcweir 
GetChildCount()340cdf0e10cSrcweir sal_Int32 OAccessibleMenuBaseComponent::GetChildCount()
341cdf0e10cSrcweir {
342cdf0e10cSrcweir 	return m_aAccessibleChildren.size();
343cdf0e10cSrcweir }
344cdf0e10cSrcweir 
345cdf0e10cSrcweir // -----------------------------------------------------------------------------
346cdf0e10cSrcweir 
GetChild(sal_Int32 i)347cdf0e10cSrcweir Reference< XAccessible > OAccessibleMenuBaseComponent::GetChild( sal_Int32 i )
348cdf0e10cSrcweir {
349cdf0e10cSrcweir 	Reference< XAccessible > xChild = m_aAccessibleChildren[i];
350cdf0e10cSrcweir 	if ( !xChild.is() )
351cdf0e10cSrcweir 	{
352cdf0e10cSrcweir 		if ( m_pMenu )
353cdf0e10cSrcweir 		{
354cdf0e10cSrcweir 			// create a new child
355cdf0e10cSrcweir 			OAccessibleMenuBaseComponent* pChild;
356cdf0e10cSrcweir 
357cdf0e10cSrcweir 			if ( m_pMenu->GetItemType( (sal_uInt16)i ) == MENUITEM_SEPARATOR )
358cdf0e10cSrcweir 			{
359cdf0e10cSrcweir 				pChild = new VCLXAccessibleMenuSeparator( m_pMenu, (sal_uInt16)i );
360cdf0e10cSrcweir 			}
361cdf0e10cSrcweir 			else
362cdf0e10cSrcweir 			{
363cdf0e10cSrcweir 				PopupMenu* pPopupMenu = m_pMenu->GetPopupMenu( m_pMenu->GetItemId( (sal_uInt16)i ) );
364cdf0e10cSrcweir 				if ( pPopupMenu )
365cdf0e10cSrcweir 				{
366cdf0e10cSrcweir 					pChild = new VCLXAccessibleMenu( m_pMenu, (sal_uInt16)i, pPopupMenu );
367cdf0e10cSrcweir 					pPopupMenu->SetAccessible( pChild );
368cdf0e10cSrcweir 				}
369cdf0e10cSrcweir 				else
370cdf0e10cSrcweir 				{
371cdf0e10cSrcweir 					pChild = new VCLXAccessibleMenuItem( m_pMenu, (sal_uInt16)i );
372cdf0e10cSrcweir 				}
373cdf0e10cSrcweir 			}
374cdf0e10cSrcweir 
375cdf0e10cSrcweir 			// set states
376cdf0e10cSrcweir 			pChild->SetStates();
377cdf0e10cSrcweir 
378cdf0e10cSrcweir 			xChild = pChild;
379cdf0e10cSrcweir 
380cdf0e10cSrcweir 			// insert into menu item list
381cdf0e10cSrcweir 			m_aAccessibleChildren[i] = xChild;
382cdf0e10cSrcweir 		}
383cdf0e10cSrcweir 	}
384cdf0e10cSrcweir 
385cdf0e10cSrcweir     return xChild;
386cdf0e10cSrcweir }
387cdf0e10cSrcweir 
388cdf0e10cSrcweir // -----------------------------------------------------------------------------
389cdf0e10cSrcweir 
GetChildAt(const awt::Point & rPoint)390cdf0e10cSrcweir Reference< XAccessible > OAccessibleMenuBaseComponent::GetChildAt( const awt::Point& rPoint )
391cdf0e10cSrcweir {
392cdf0e10cSrcweir 	Reference< XAccessible > xChild;
393cdf0e10cSrcweir 	for ( sal_uInt32 i = 0, nCount = getAccessibleChildCount(); i < nCount; ++i )
394cdf0e10cSrcweir 	{
395cdf0e10cSrcweir 		Reference< XAccessible > xAcc = getAccessibleChild( i );
396cdf0e10cSrcweir 		if ( xAcc.is() )
397cdf0e10cSrcweir 		{
398cdf0e10cSrcweir 			Reference< XAccessibleComponent > xComp( xAcc->getAccessibleContext(), UNO_QUERY );
399cdf0e10cSrcweir 			if ( xComp.is() )
400cdf0e10cSrcweir 			{
401cdf0e10cSrcweir 				Rectangle aRect = VCLRectangle( xComp->getBounds() );
402cdf0e10cSrcweir 				Point aPos = VCLPoint( rPoint );
403cdf0e10cSrcweir 				if ( aRect.IsInside( aPos ) )
404cdf0e10cSrcweir 				{
405cdf0e10cSrcweir 					xChild = xAcc;
406cdf0e10cSrcweir 					break;
407cdf0e10cSrcweir 				}
408cdf0e10cSrcweir 			}
409cdf0e10cSrcweir 		}
410cdf0e10cSrcweir 	}
411cdf0e10cSrcweir 
412cdf0e10cSrcweir 	return xChild;
413cdf0e10cSrcweir }
414cdf0e10cSrcweir 
415cdf0e10cSrcweir // -----------------------------------------------------------------------------
416cdf0e10cSrcweir 
InsertChild(sal_Int32 i)417cdf0e10cSrcweir void OAccessibleMenuBaseComponent::InsertChild( sal_Int32 i )
418cdf0e10cSrcweir {
419cdf0e10cSrcweir 	if ( i > (sal_Int32)m_aAccessibleChildren.size() )
420cdf0e10cSrcweir 		i = m_aAccessibleChildren.size();
421cdf0e10cSrcweir 
422cdf0e10cSrcweir 	if ( i >= 0 )
423cdf0e10cSrcweir 	{
424cdf0e10cSrcweir 		// insert entry in child list
425cdf0e10cSrcweir 		m_aAccessibleChildren.insert( m_aAccessibleChildren.begin() + i, Reference< XAccessible >() );
426cdf0e10cSrcweir 
427cdf0e10cSrcweir 		// update item position of accessible children
428cdf0e10cSrcweir 		for ( sal_uInt32 j = i, nCount = m_aAccessibleChildren.size(); j < nCount; ++j )
429cdf0e10cSrcweir 		{
430cdf0e10cSrcweir 			Reference< XAccessible > xAcc( m_aAccessibleChildren[j] );
431cdf0e10cSrcweir 			if ( xAcc.is() )
432cdf0e10cSrcweir 			{
433cdf0e10cSrcweir 				OAccessibleMenuItemComponent* pComp = static_cast< OAccessibleMenuItemComponent* >( xAcc.get() );
434cdf0e10cSrcweir 				if ( pComp )
435cdf0e10cSrcweir 					pComp->SetItemPos( (sal_uInt16)j );
436cdf0e10cSrcweir 			}
437cdf0e10cSrcweir 		}
438cdf0e10cSrcweir 
439cdf0e10cSrcweir 		// send accessible child event
440cdf0e10cSrcweir 		Reference< XAccessible > xChild( GetChild( i ) );
441cdf0e10cSrcweir 		if ( xChild.is() )
442cdf0e10cSrcweir 		{
443cdf0e10cSrcweir 			Any aOldValue, aNewValue;
444cdf0e10cSrcweir 			aNewValue <<= xChild;
445cdf0e10cSrcweir 			NotifyAccessibleEvent( AccessibleEventId::CHILD, aOldValue, aNewValue );
446cdf0e10cSrcweir 		}
447cdf0e10cSrcweir 	}
448cdf0e10cSrcweir }
449cdf0e10cSrcweir 
450cdf0e10cSrcweir // -----------------------------------------------------------------------------
451cdf0e10cSrcweir 
RemoveChild(sal_Int32 i)452cdf0e10cSrcweir void OAccessibleMenuBaseComponent::RemoveChild( sal_Int32 i )
453cdf0e10cSrcweir {
454cdf0e10cSrcweir 	if ( i >= 0 && i < (sal_Int32)m_aAccessibleChildren.size() )
455cdf0e10cSrcweir 	{
456cdf0e10cSrcweir 		// keep the accessible of the removed item
457cdf0e10cSrcweir 		Reference< XAccessible > xChild( m_aAccessibleChildren[i] );
458cdf0e10cSrcweir 
459cdf0e10cSrcweir 		// remove entry in child list
460cdf0e10cSrcweir 		m_aAccessibleChildren.erase( m_aAccessibleChildren.begin() + i );
461cdf0e10cSrcweir 
462cdf0e10cSrcweir 		// update item position of accessible children
463cdf0e10cSrcweir 		for ( sal_uInt32 j = i, nCount = m_aAccessibleChildren.size(); j < nCount; ++j )
464cdf0e10cSrcweir 		{
465cdf0e10cSrcweir 			Reference< XAccessible > xAcc( m_aAccessibleChildren[j] );
466cdf0e10cSrcweir 			if ( xAcc.is() )
467cdf0e10cSrcweir 			{
468cdf0e10cSrcweir 				OAccessibleMenuItemComponent* pComp = static_cast< OAccessibleMenuItemComponent* >( xAcc.get() );
469cdf0e10cSrcweir 				if ( pComp )
470cdf0e10cSrcweir 					pComp->SetItemPos( (sal_uInt16)j );
471cdf0e10cSrcweir 			}
472cdf0e10cSrcweir 		}
473cdf0e10cSrcweir 
474cdf0e10cSrcweir 		// send accessible child event
475cdf0e10cSrcweir 		if ( xChild.is() )
476cdf0e10cSrcweir 		{
477cdf0e10cSrcweir 			Any aOldValue, aNewValue;
478cdf0e10cSrcweir 			aOldValue <<= xChild;
479cdf0e10cSrcweir 			NotifyAccessibleEvent( AccessibleEventId::CHILD, aOldValue, aNewValue );
480cdf0e10cSrcweir 
481cdf0e10cSrcweir 			Reference< XComponent > xComponent( xChild, UNO_QUERY );
482cdf0e10cSrcweir 			if ( xComponent.is() )
483cdf0e10cSrcweir 				xComponent->dispose();
484cdf0e10cSrcweir 		}
485cdf0e10cSrcweir 	}
486cdf0e10cSrcweir }
487cdf0e10cSrcweir 
488cdf0e10cSrcweir // -----------------------------------------------------------------------------
489cdf0e10cSrcweir 
IsHighlighted()490cdf0e10cSrcweir sal_Bool OAccessibleMenuBaseComponent::IsHighlighted()
491cdf0e10cSrcweir {
492cdf0e10cSrcweir 	return sal_False;
493cdf0e10cSrcweir }
494cdf0e10cSrcweir 
495cdf0e10cSrcweir // -----------------------------------------------------------------------------
496cdf0e10cSrcweir 
IsChildHighlighted()497cdf0e10cSrcweir sal_Bool OAccessibleMenuBaseComponent::IsChildHighlighted()
498cdf0e10cSrcweir {
499cdf0e10cSrcweir     sal_Bool bChildHighlighted = sal_False;
500cdf0e10cSrcweir 
501cdf0e10cSrcweir     for ( sal_uInt32 i = 0; i < m_aAccessibleChildren.size(); ++i )
502cdf0e10cSrcweir     {
503cdf0e10cSrcweir         Reference< XAccessible > xChild( m_aAccessibleChildren[i] );
504cdf0e10cSrcweir         if ( xChild.is() )
505cdf0e10cSrcweir         {
506cdf0e10cSrcweir             OAccessibleMenuBaseComponent* pComp = static_cast< OAccessibleMenuBaseComponent* >( xChild.get() );
507cdf0e10cSrcweir             if ( pComp && pComp->IsHighlighted() )
508cdf0e10cSrcweir             {
509cdf0e10cSrcweir                 bChildHighlighted = sal_True;
510cdf0e10cSrcweir                 break;
511cdf0e10cSrcweir             }
512cdf0e10cSrcweir         }
513cdf0e10cSrcweir     }
514cdf0e10cSrcweir 
515cdf0e10cSrcweir     return bChildHighlighted;
516cdf0e10cSrcweir }
517cdf0e10cSrcweir 
518cdf0e10cSrcweir // -----------------------------------------------------------------------------
519cdf0e10cSrcweir 
SelectChild(sal_Int32 i)520cdf0e10cSrcweir void OAccessibleMenuBaseComponent::SelectChild( sal_Int32 i )
521cdf0e10cSrcweir {
522cdf0e10cSrcweir 	// open the menu
523cdf0e10cSrcweir 	if ( getAccessibleRole() == AccessibleRole::MENU && !IsPopupMenuOpen() )
524cdf0e10cSrcweir 		Click();
525cdf0e10cSrcweir 
526cdf0e10cSrcweir 	// highlight the child
527cdf0e10cSrcweir 	if ( m_pMenu )
528cdf0e10cSrcweir         m_pMenu->HighlightItem( (sal_uInt16)i );
529cdf0e10cSrcweir }
530cdf0e10cSrcweir 
531cdf0e10cSrcweir // -----------------------------------------------------------------------------
532cdf0e10cSrcweir 
DeSelectAll()533cdf0e10cSrcweir void OAccessibleMenuBaseComponent::DeSelectAll()
534cdf0e10cSrcweir {
535cdf0e10cSrcweir 	if ( m_pMenu )
536cdf0e10cSrcweir 		m_pMenu->DeHighlight();
537cdf0e10cSrcweir }
538cdf0e10cSrcweir 
539cdf0e10cSrcweir // -----------------------------------------------------------------------------
540cdf0e10cSrcweir 
IsChildSelected(sal_Int32 i)541cdf0e10cSrcweir sal_Bool OAccessibleMenuBaseComponent::IsChildSelected( sal_Int32 i )
542cdf0e10cSrcweir {
543cdf0e10cSrcweir     sal_Bool bSelected = sal_False;
544cdf0e10cSrcweir 
545cdf0e10cSrcweir     if ( m_pMenu && m_pMenu->IsHighlighted( (sal_uInt16)i ) )
546cdf0e10cSrcweir         bSelected = sal_True;
547cdf0e10cSrcweir 
548cdf0e10cSrcweir     return bSelected;
549cdf0e10cSrcweir }
550cdf0e10cSrcweir 
551cdf0e10cSrcweir // -----------------------------------------------------------------------------
552cdf0e10cSrcweir 
Select()553cdf0e10cSrcweir void OAccessibleMenuBaseComponent::Select()
554cdf0e10cSrcweir {
555cdf0e10cSrcweir }
556cdf0e10cSrcweir 
557cdf0e10cSrcweir // -----------------------------------------------------------------------------
558cdf0e10cSrcweir 
DeSelect()559cdf0e10cSrcweir void OAccessibleMenuBaseComponent::DeSelect()
560cdf0e10cSrcweir {
561cdf0e10cSrcweir }
562cdf0e10cSrcweir 
563cdf0e10cSrcweir // -----------------------------------------------------------------------------
564cdf0e10cSrcweir 
Click()565cdf0e10cSrcweir void OAccessibleMenuBaseComponent::Click()
566cdf0e10cSrcweir {
567cdf0e10cSrcweir }
568cdf0e10cSrcweir 
569cdf0e10cSrcweir // -----------------------------------------------------------------------------
570cdf0e10cSrcweir 
IsPopupMenuOpen()571cdf0e10cSrcweir sal_Bool OAccessibleMenuBaseComponent::IsPopupMenuOpen()
572cdf0e10cSrcweir {
573cdf0e10cSrcweir     return sal_False;
574cdf0e10cSrcweir }
575cdf0e10cSrcweir 
576cdf0e10cSrcweir // -----------------------------------------------------------------------------
577cdf0e10cSrcweir 
IMPL_LINK(OAccessibleMenuBaseComponent,MenuEventListener,VclSimpleEvent *,pEvent)578cdf0e10cSrcweir IMPL_LINK( OAccessibleMenuBaseComponent, MenuEventListener, VclSimpleEvent*, pEvent )
579cdf0e10cSrcweir {
580cdf0e10cSrcweir 	DBG_ASSERT( pEvent && pEvent->ISA( VclMenuEvent ), "OAccessibleMenuBaseComponent - Unknown MenuEvent!" );
581cdf0e10cSrcweir 	if ( pEvent && pEvent->ISA( VclMenuEvent ) )
582cdf0e10cSrcweir 	{
583cdf0e10cSrcweir 		DBG_ASSERT( ((VclMenuEvent*)pEvent)->GetMenu(), "OAccessibleMenuBaseComponent - Menu?" );
584cdf0e10cSrcweir 		ProcessMenuEvent( *(VclMenuEvent*)pEvent );
585cdf0e10cSrcweir 	}
586cdf0e10cSrcweir 	return 0;
587cdf0e10cSrcweir }
588cdf0e10cSrcweir 
589cdf0e10cSrcweir // -----------------------------------------------------------------------------
590cdf0e10cSrcweir 
ProcessMenuEvent(const VclMenuEvent & rVclMenuEvent)591cdf0e10cSrcweir void OAccessibleMenuBaseComponent::ProcessMenuEvent( const VclMenuEvent& rVclMenuEvent )
592cdf0e10cSrcweir {
593cdf0e10cSrcweir 	sal_uInt16 nItemPos = rVclMenuEvent.GetItemPos();
594cdf0e10cSrcweir 
595cdf0e10cSrcweir 	switch ( rVclMenuEvent.GetId() )
596cdf0e10cSrcweir 	{
597cdf0e10cSrcweir         case VCLEVENT_MENU_SHOW:
598cdf0e10cSrcweir         case VCLEVENT_MENU_HIDE:
599cdf0e10cSrcweir         {
600cdf0e10cSrcweir             UpdateVisible();
601cdf0e10cSrcweir         }
602cdf0e10cSrcweir         break;
603cdf0e10cSrcweir 		case VCLEVENT_MENU_HIGHLIGHT:
604cdf0e10cSrcweir 		{
605cdf0e10cSrcweir             SetFocused( sal_False );
606cdf0e10cSrcweir             UpdateFocused( nItemPos, sal_True );
607cdf0e10cSrcweir             UpdateSelected( nItemPos, sal_True );
608cdf0e10cSrcweir         }
609cdf0e10cSrcweir 		break;
610cdf0e10cSrcweir 		case VCLEVENT_MENU_DEHIGHLIGHT:
611cdf0e10cSrcweir 		{
612cdf0e10cSrcweir             UpdateFocused( nItemPos, sal_False );
613cdf0e10cSrcweir             UpdateSelected( nItemPos, sal_False );
614cdf0e10cSrcweir         }
615cdf0e10cSrcweir 		break;
616cdf0e10cSrcweir 		case VCLEVENT_MENU_SUBMENUACTIVATE:
617cdf0e10cSrcweir 		{
618cdf0e10cSrcweir 		}
619cdf0e10cSrcweir 		break;
620cdf0e10cSrcweir 		case VCLEVENT_MENU_SUBMENUDEACTIVATE:
621cdf0e10cSrcweir 		{
622cdf0e10cSrcweir             UpdateFocused( nItemPos, sal_True );
623cdf0e10cSrcweir 		}
624cdf0e10cSrcweir 		break;
625cdf0e10cSrcweir 		case VCLEVENT_MENU_ENABLE:
626cdf0e10cSrcweir 		{
627cdf0e10cSrcweir 			UpdateEnabled( nItemPos, sal_True );
628cdf0e10cSrcweir 		}
629cdf0e10cSrcweir 		break;
630cdf0e10cSrcweir 		case VCLEVENT_MENU_DISABLE:
631cdf0e10cSrcweir 		{
632cdf0e10cSrcweir 			UpdateEnabled( nItemPos, sal_False );
633cdf0e10cSrcweir 		}
634cdf0e10cSrcweir 		break;
635cdf0e10cSrcweir 		case VCLEVENT_MENU_SUBMENUCHANGED:
636cdf0e10cSrcweir 		{
637cdf0e10cSrcweir 			RemoveChild( nItemPos );
638cdf0e10cSrcweir 			InsertChild( nItemPos );
639cdf0e10cSrcweir 		}
640cdf0e10cSrcweir 		break;
641cdf0e10cSrcweir 		case VCLEVENT_MENU_INSERTITEM:
642cdf0e10cSrcweir 		{
643cdf0e10cSrcweir 			InsertChild( nItemPos );
644cdf0e10cSrcweir 		}
645cdf0e10cSrcweir 		break;
646cdf0e10cSrcweir 		case VCLEVENT_MENU_REMOVEITEM:
647cdf0e10cSrcweir 		{
648cdf0e10cSrcweir 			RemoveChild( nItemPos );
649cdf0e10cSrcweir 		}
650cdf0e10cSrcweir 		break;
651cdf0e10cSrcweir 		case VCLEVENT_MENU_ACCESSIBLENAMECHANGED:
652cdf0e10cSrcweir 		{
653cdf0e10cSrcweir 			UpdateAccessibleName( nItemPos );
654cdf0e10cSrcweir 		}
655cdf0e10cSrcweir 		break;
656cdf0e10cSrcweir 		case VCLEVENT_MENU_ITEMTEXTCHANGED:
657cdf0e10cSrcweir 		{
658cdf0e10cSrcweir 			UpdateAccessibleName( nItemPos );
659cdf0e10cSrcweir 			UpdateItemText( nItemPos );
660cdf0e10cSrcweir 		}
661cdf0e10cSrcweir 		break;
662cdf0e10cSrcweir 		case VCLEVENT_MENU_ITEMCHECKED:
663cdf0e10cSrcweir 		{
664cdf0e10cSrcweir 			UpdateChecked( nItemPos, sal_True );
665cdf0e10cSrcweir 		}
666cdf0e10cSrcweir 		break;
667cdf0e10cSrcweir 		case VCLEVENT_MENU_ITEMUNCHECKED:
668cdf0e10cSrcweir 		{
669cdf0e10cSrcweir 			UpdateChecked( nItemPos, sal_False );
670cdf0e10cSrcweir 		}
671cdf0e10cSrcweir 		break;
672cdf0e10cSrcweir         case VCLEVENT_OBJECT_DYING:
673cdf0e10cSrcweir         {
674cdf0e10cSrcweir 			if ( m_pMenu )
675cdf0e10cSrcweir 			{
676cdf0e10cSrcweir 				m_pMenu->RemoveEventListener( LINK( this, OAccessibleMenuBaseComponent, MenuEventListener ) );
677cdf0e10cSrcweir 
678cdf0e10cSrcweir 				m_pMenu = NULL;
679cdf0e10cSrcweir 
680cdf0e10cSrcweir 				// dispose all menu items
681cdf0e10cSrcweir 				for ( sal_uInt32 i = 0; i < m_aAccessibleChildren.size(); ++i )
682cdf0e10cSrcweir 				{
683cdf0e10cSrcweir 					Reference< XComponent > xComponent( m_aAccessibleChildren[i], UNO_QUERY );
684cdf0e10cSrcweir 					if ( xComponent.is() )
685cdf0e10cSrcweir 						xComponent->dispose();
686cdf0e10cSrcweir 				}
687cdf0e10cSrcweir 				m_aAccessibleChildren.clear();
688cdf0e10cSrcweir 			}
689cdf0e10cSrcweir         }
690cdf0e10cSrcweir         break;
691cdf0e10cSrcweir 		default:
692cdf0e10cSrcweir 		{
693cdf0e10cSrcweir 		}
694cdf0e10cSrcweir 		break;
695cdf0e10cSrcweir 	}
696cdf0e10cSrcweir }
697cdf0e10cSrcweir 
698cdf0e10cSrcweir // -----------------------------------------------------------------------------
699cdf0e10cSrcweir // XInterface
700cdf0e10cSrcweir // -----------------------------------------------------------------------------
701cdf0e10cSrcweir 
IMPLEMENT_FORWARD_XINTERFACE2(OAccessibleMenuBaseComponent,AccessibleExtendedComponentHelper_BASE,OAccessibleMenuBaseComponent_BASE)702cdf0e10cSrcweir IMPLEMENT_FORWARD_XINTERFACE2( OAccessibleMenuBaseComponent, AccessibleExtendedComponentHelper_BASE, OAccessibleMenuBaseComponent_BASE )
703cdf0e10cSrcweir 
704cdf0e10cSrcweir // -----------------------------------------------------------------------------
705cdf0e10cSrcweir // XTypeProvider
706cdf0e10cSrcweir // -----------------------------------------------------------------------------
707cdf0e10cSrcweir 
708cdf0e10cSrcweir IMPLEMENT_FORWARD_XTYPEPROVIDER2( OAccessibleMenuBaseComponent, AccessibleExtendedComponentHelper_BASE, OAccessibleMenuBaseComponent_BASE )
709cdf0e10cSrcweir 
710cdf0e10cSrcweir // -----------------------------------------------------------------------------
711cdf0e10cSrcweir // XComponent
712cdf0e10cSrcweir // -----------------------------------------------------------------------------
713cdf0e10cSrcweir 
714cdf0e10cSrcweir void OAccessibleMenuBaseComponent::disposing()
715cdf0e10cSrcweir {
716cdf0e10cSrcweir 	AccessibleExtendedComponentHelper_BASE::disposing();
717cdf0e10cSrcweir 
718cdf0e10cSrcweir 	if ( m_pMenu )
719cdf0e10cSrcweir 	{
720cdf0e10cSrcweir 		m_pMenu->RemoveEventListener( LINK( this, OAccessibleMenuBaseComponent, MenuEventListener ) );
721cdf0e10cSrcweir 
722cdf0e10cSrcweir 		m_pMenu = NULL;
723cdf0e10cSrcweir 
724cdf0e10cSrcweir 		// dispose all menu items
725cdf0e10cSrcweir 		for ( sal_uInt32 i = 0; i < m_aAccessibleChildren.size(); ++i )
726cdf0e10cSrcweir 		{
727cdf0e10cSrcweir 			Reference< XComponent > xComponent( m_aAccessibleChildren[i], UNO_QUERY );
728cdf0e10cSrcweir 			if ( xComponent.is() )
729cdf0e10cSrcweir 				xComponent->dispose();
730cdf0e10cSrcweir 		}
731cdf0e10cSrcweir 		m_aAccessibleChildren.clear();
732cdf0e10cSrcweir 	}
733cdf0e10cSrcweir }
734cdf0e10cSrcweir 
735cdf0e10cSrcweir // -----------------------------------------------------------------------------
736cdf0e10cSrcweir // XServiceInfo
737cdf0e10cSrcweir // -----------------------------------------------------------------------------
738cdf0e10cSrcweir 
supportsService(const::rtl::OUString & rServiceName)739cdf0e10cSrcweir sal_Bool OAccessibleMenuBaseComponent::supportsService( const ::rtl::OUString& rServiceName ) throw (RuntimeException)
740cdf0e10cSrcweir {
741cdf0e10cSrcweir 	Sequence< ::rtl::OUString > aNames( getSupportedServiceNames() );
742cdf0e10cSrcweir 	const ::rtl::OUString* pNames = aNames.getConstArray();
743cdf0e10cSrcweir 	const ::rtl::OUString* pEnd = pNames + aNames.getLength();
744cdf0e10cSrcweir 	for ( ; pNames != pEnd && !pNames->equals( rServiceName ); ++pNames )
745cdf0e10cSrcweir 		;
746cdf0e10cSrcweir 
747cdf0e10cSrcweir 	return pNames != pEnd;
748cdf0e10cSrcweir }
749cdf0e10cSrcweir 
750cdf0e10cSrcweir // -----------------------------------------------------------------------------
751cdf0e10cSrcweir // XAccessible
752cdf0e10cSrcweir // -----------------------------------------------------------------------------
753cdf0e10cSrcweir 
getAccessibleContext()754cdf0e10cSrcweir Reference< XAccessibleContext > OAccessibleMenuBaseComponent::getAccessibleContext(  ) throw (RuntimeException)
755cdf0e10cSrcweir {
756cdf0e10cSrcweir 	OExternalLockGuard aGuard( this );
757cdf0e10cSrcweir 
758cdf0e10cSrcweir 	return this;
759cdf0e10cSrcweir }
760cdf0e10cSrcweir 
761cdf0e10cSrcweir // -----------------------------------------------------------------------------
762cdf0e10cSrcweir // XAccessibleContext
763cdf0e10cSrcweir // -----------------------------------------------------------------------------
764cdf0e10cSrcweir 
getAccessibleStateSet()765cdf0e10cSrcweir Reference< XAccessibleStateSet > OAccessibleMenuBaseComponent::getAccessibleStateSet(  ) throw (RuntimeException)
766cdf0e10cSrcweir {
767cdf0e10cSrcweir 	OExternalLockGuard aGuard( this );
768cdf0e10cSrcweir 
769cdf0e10cSrcweir 	utl::AccessibleStateSetHelper* pStateSetHelper = new utl::AccessibleStateSetHelper;
770cdf0e10cSrcweir 	Reference< XAccessibleStateSet > xSet = pStateSetHelper;
771cdf0e10cSrcweir 
772cdf0e10cSrcweir 	if ( !rBHelper.bDisposed && !rBHelper.bInDispose )
773cdf0e10cSrcweir 	{
774cdf0e10cSrcweir 		FillAccessibleStateSet( *pStateSetHelper );
775cdf0e10cSrcweir 	}
776cdf0e10cSrcweir 	else
777cdf0e10cSrcweir 	{
778cdf0e10cSrcweir         pStateSetHelper->AddState( AccessibleStateType::DEFUNC );
779cdf0e10cSrcweir 	}
780cdf0e10cSrcweir 
781cdf0e10cSrcweir 	return xSet;
782cdf0e10cSrcweir }
783cdf0e10cSrcweir 
784cdf0e10cSrcweir // -----------------------------------------------------------------------------
785*21075d77SSteve Yin 
IsMenuHideDisabledEntries()786*21075d77SSteve Yin sal_Bool OAccessibleMenuBaseComponent::IsMenuHideDisabledEntries()
787*21075d77SSteve Yin {
788*21075d77SSteve Yin 	return sal_False;
789*21075d77SSteve Yin }
790*21075d77SSteve Yin 
791