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