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