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 :
21 : #include "AccessibleTreeNode.hxx"
22 :
23 : #include "taskpane/TaskPaneTreeNode.hxx"
24 : #include "taskpane/ControlContainer.hxx"
25 :
26 : #include "sdresid.hxx"
27 : #include "accessibility.hrc"
28 : #include <com/sun/star/accessibility/AccessibleRole.hpp>
29 : #include <com/sun/star/accessibility/AccessibleEventId.hpp>
30 : #include <comphelper/accessibleeventnotifier.hxx>
31 :
32 : #include <vcl/svapp.hxx>
33 : #include <vcl/window.hxx>
34 : #include <svtools/colorcfg.hxx>
35 :
36 : using ::rtl::OUString;
37 : using namespace ::com::sun::star;
38 : using namespace ::com::sun::star::uno;
39 : using namespace ::com::sun::star::accessibility;
40 : using namespace ::sd::toolpanel;
41 :
42 : namespace accessibility {
43 :
44 :
45 :
46 : //===== AccessibleTreeNode =============================================
47 :
48 0 : AccessibleTreeNode::AccessibleTreeNode(
49 : ::sd::toolpanel::TreeNode& rNode,
50 : const OUString& rsName,
51 : const OUString& rsDescription,
52 : sal_Int16 eRole)
53 : : AccessibleTreeNodeBase(MutexOwner::maMutex),
54 : mxParent(NULL),
55 : mrTreeNode(rNode),
56 0 : mrStateSet(new ::utl::AccessibleStateSetHelper()),
57 : msName(rsName),
58 : msDescription(rsDescription),
59 : meRole(eRole),
60 0 : mnClientId(0)
61 : {
62 0 : ::Window* pWindow = mrTreeNode.GetWindow();
63 0 : if (pWindow != NULL)
64 : {
65 0 : ::Window* pParentWindow = pWindow->GetAccessibleParentWindow();
66 0 : if (pParentWindow != NULL && pParentWindow != pWindow)
67 0 : mxParent = pParentWindow->GetAccessible();
68 : }
69 0 : CommonConstructor();
70 0 : }
71 :
72 :
73 :
74 :
75 0 : void AccessibleTreeNode::CommonConstructor (void)
76 : {
77 0 : UpdateStateSet();
78 :
79 0 : Link aStateChangeLink (LINK(this,AccessibleTreeNode,StateChangeListener));
80 0 : mrTreeNode.AddStateChangeListener(aStateChangeLink);
81 :
82 0 : if (mrTreeNode.GetWindow() != NULL)
83 : {
84 0 : Link aWindowEventLink (LINK(this,AccessibleTreeNode,WindowEventListener));
85 0 : mrTreeNode.GetWindow()->AddEventListener(aWindowEventLink);
86 : }
87 0 : }
88 :
89 :
90 :
91 :
92 0 : AccessibleTreeNode::~AccessibleTreeNode (void)
93 : {
94 : OSL_ASSERT(IsDisposed());
95 0 : }
96 :
97 :
98 :
99 :
100 0 : void AccessibleTreeNode::FireAccessibleEvent (
101 : short nEventId,
102 : const uno::Any& rOldValue,
103 : const uno::Any& rNewValue )
104 : {
105 0 : if (mnClientId != 0)
106 : {
107 0 : AccessibleEventObject aEventObject;
108 :
109 0 : aEventObject.Source = Reference<XWeak>(this);
110 0 : aEventObject.EventId = nEventId;
111 0 : aEventObject.NewValue = rNewValue;
112 0 : aEventObject.OldValue = rOldValue;
113 :
114 0 : comphelper::AccessibleEventNotifier::addEvent (mnClientId, aEventObject);
115 : }
116 0 : }
117 :
118 :
119 :
120 :
121 0 : void SAL_CALL AccessibleTreeNode::disposing (void)
122 : {
123 : // We are still listening to the tree node and its window. Both
124 : // probably are by now more or less dead and we must not call them to
125 : // unregister.
126 :
127 0 : if (mnClientId != 0)
128 : {
129 0 : comphelper::AccessibleEventNotifier::revokeClientNotifyDisposing( mnClientId, *this );
130 0 : mnClientId = 0;
131 : }
132 0 : }
133 :
134 :
135 :
136 :
137 : //===== XAccessible =========================================================
138 :
139 : Reference<XAccessibleContext > SAL_CALL
140 0 : AccessibleTreeNode::getAccessibleContext (void)
141 : throw (uno::RuntimeException)
142 : {
143 0 : ThrowIfDisposed ();
144 0 : return this;
145 : }
146 :
147 :
148 :
149 :
150 : //===== XAccessibleContext ==================================================
151 :
152 0 : sal_Int32 SAL_CALL AccessibleTreeNode::getAccessibleChildCount (void)
153 : throw (RuntimeException)
154 : {
155 0 : ThrowIfDisposed();
156 0 : const SolarMutexGuard aSolarGuard;
157 0 : return mrTreeNode.GetControlContainer().GetControlCount();
158 : }
159 :
160 :
161 :
162 :
163 : Reference<XAccessible > SAL_CALL
164 0 : AccessibleTreeNode::getAccessibleChild (sal_Int32 nIndex)
165 : throw (lang::IndexOutOfBoundsException, RuntimeException)
166 : {
167 0 : ThrowIfDisposed();
168 0 : const SolarMutexGuard aSolarGuard;
169 :
170 0 : if (nIndex<0 || (sal_uInt32)nIndex>=mrTreeNode.GetControlContainer().GetControlCount())
171 0 : throw lang::IndexOutOfBoundsException();
172 :
173 0 : Reference<XAccessible> xChild;
174 :
175 0 : ::sd::toolpanel::TreeNode* pNode = mrTreeNode.GetControlContainer().GetControl(nIndex);
176 0 : if (pNode != NULL)
177 0 : xChild = pNode->GetAccessibleObject();
178 :
179 0 : return xChild;
180 : }
181 :
182 :
183 :
184 :
185 0 : Reference<XAccessible > SAL_CALL AccessibleTreeNode::getAccessibleParent (void)
186 : throw (uno::RuntimeException)
187 : {
188 0 : ThrowIfDisposed();
189 0 : const SolarMutexGuard aSolarGuard;
190 0 : return mxParent;
191 : }
192 :
193 :
194 :
195 :
196 0 : sal_Int32 SAL_CALL AccessibleTreeNode::getAccessibleIndexInParent (void)
197 : throw (uno::RuntimeException)
198 : {
199 : OSL_ASSERT(getAccessibleParent().is());
200 0 : ThrowIfDisposed();
201 0 : const SolarMutexGuard aSolarGuard;
202 0 : sal_Int32 nIndexInParent(-1);
203 :
204 :
205 0 : Reference<XAccessibleContext> xParentContext (getAccessibleParent()->getAccessibleContext());
206 0 : if (xParentContext.is())
207 : {
208 0 : sal_Int32 nChildCount (xParentContext->getAccessibleChildCount());
209 0 : for (sal_Int32 i=0; i<nChildCount; ++i)
210 0 : if (xParentContext->getAccessibleChild(i).get()
211 : == static_cast<XAccessible*>(this))
212 : {
213 0 : nIndexInParent = i;
214 0 : break;
215 : }
216 : }
217 :
218 0 : return nIndexInParent;
219 : }
220 :
221 :
222 :
223 :
224 0 : sal_Int16 SAL_CALL AccessibleTreeNode::getAccessibleRole (void)
225 : throw (uno::RuntimeException)
226 : {
227 0 : ThrowIfDisposed();
228 0 : return meRole;
229 : }
230 :
231 :
232 :
233 :
234 0 : ::rtl::OUString SAL_CALL AccessibleTreeNode::getAccessibleDescription (void)
235 : throw (uno::RuntimeException)
236 : {
237 0 : ThrowIfDisposed();
238 0 : return msDescription;
239 : }
240 :
241 :
242 :
243 :
244 0 : ::rtl::OUString SAL_CALL AccessibleTreeNode::getAccessibleName (void)
245 : throw (uno::RuntimeException)
246 : {
247 0 : ThrowIfDisposed();
248 0 : return msName;
249 : }
250 :
251 :
252 :
253 :
254 : Reference<XAccessibleRelationSet> SAL_CALL
255 0 : AccessibleTreeNode::getAccessibleRelationSet (void)
256 : throw (uno::RuntimeException)
257 : {
258 0 : ThrowIfDisposed();
259 0 : return Reference<XAccessibleRelationSet>();
260 : }
261 :
262 :
263 :
264 :
265 : Reference<XAccessibleStateSet > SAL_CALL
266 0 : AccessibleTreeNode::getAccessibleStateSet (void)
267 : throw (uno::RuntimeException)
268 : {
269 0 : ThrowIfDisposed();
270 0 : const SolarMutexGuard aSolarGuard;
271 0 : return mrStateSet.get();
272 : }
273 :
274 :
275 :
276 :
277 0 : void AccessibleTreeNode::UpdateStateSet (void)
278 : {
279 0 : if (mrTreeNode.IsExpandable())
280 : {
281 0 : UpdateState(AccessibleStateType::EXPANDABLE, true);
282 0 : UpdateState(AccessibleStateType::EXPANDED, mrTreeNode.IsExpanded());
283 : }
284 :
285 0 : UpdateState(AccessibleStateType::FOCUSABLE, true);
286 :
287 0 : ::Window* pWindow = mrTreeNode.GetWindow();
288 0 : if (pWindow != NULL)
289 : {
290 0 : UpdateState(AccessibleStateType::ENABLED, pWindow->IsEnabled());
291 0 : UpdateState(AccessibleStateType::FOCUSED, pWindow->HasFocus());
292 0 : UpdateState(AccessibleStateType::VISIBLE, pWindow->IsVisible());
293 0 : UpdateState(AccessibleStateType::SHOWING, pWindow->IsReallyVisible());
294 : }
295 0 : }
296 :
297 :
298 :
299 :
300 0 : void AccessibleTreeNode::UpdateState(
301 : sal_Int16 aState,
302 : bool bValue)
303 : {
304 0 : if ((mrStateSet->contains(aState)!=sal_False) != bValue)
305 : {
306 0 : if (bValue)
307 : {
308 0 : mrStateSet->AddState(aState);
309 0 : FireAccessibleEvent(AccessibleEventId::STATE_CHANGED, Any(),Any(aState));
310 : }
311 : else
312 : {
313 0 : mrStateSet->RemoveState(aState);
314 0 : FireAccessibleEvent(AccessibleEventId::STATE_CHANGED, Any(aState),Any());
315 : }
316 : }
317 0 : }
318 :
319 :
320 :
321 :
322 0 : lang::Locale SAL_CALL AccessibleTreeNode::getLocale (void)
323 : throw (IllegalAccessibleComponentStateException,
324 : RuntimeException)
325 : {
326 0 : ThrowIfDisposed ();
327 0 : Reference<XAccessibleContext> xParentContext;
328 0 : Reference<XAccessible> xParent (getAccessibleParent());
329 0 : if (xParent.is())
330 0 : xParentContext = xParent->getAccessibleContext();
331 :
332 0 : if (xParentContext.is())
333 0 : return xParentContext->getLocale();
334 : else
335 : // Strange, no parent! Anyway, return the default locale.
336 0 : return Application::GetSettings().GetLanguageTag().getLocale();
337 : }
338 :
339 :
340 :
341 :
342 0 : void SAL_CALL AccessibleTreeNode::addAccessibleEventListener(
343 : const Reference<XAccessibleEventListener >& rxListener)
344 : throw (RuntimeException)
345 : {
346 0 : if (rxListener.is())
347 : {
348 0 : const osl::MutexGuard aGuard(maMutex);
349 :
350 0 : if (IsDisposed())
351 : {
352 0 : uno::Reference<uno::XInterface> x ((lang::XComponent *)this, uno::UNO_QUERY);
353 0 : rxListener->disposing (lang::EventObject (x));
354 : }
355 : else
356 : {
357 0 : if (mnClientId == 0)
358 0 : mnClientId = comphelper::AccessibleEventNotifier::registerClient();
359 0 : if (mnClientId != 0)
360 0 : comphelper::AccessibleEventNotifier::addEventListener(mnClientId, rxListener);
361 0 : }
362 : }
363 0 : }
364 :
365 :
366 :
367 :
368 0 : void SAL_CALL AccessibleTreeNode::removeAccessibleEventListener(
369 : const Reference<XAccessibleEventListener >& rxListener)
370 : throw (RuntimeException)
371 : {
372 0 : ThrowIfDisposed();
373 0 : if (rxListener.is())
374 : {
375 0 : const osl::MutexGuard aGuard(maMutex);
376 :
377 0 : sal_Int32 nListenerCount = comphelper::AccessibleEventNotifier::removeEventListener( mnClientId, rxListener );
378 0 : if ( !nListenerCount )
379 : {
380 : // no listeners anymore
381 : // -> revoke ourself. This may lead to the notifier thread dying (if we were the last client),
382 : // and at least to us not firing any events anymore, in case somebody calls
383 : // NotifyAccessibleEvent, again
384 0 : if (mnClientId != 0)
385 : {
386 0 : comphelper::AccessibleEventNotifier::revokeClient( mnClientId );
387 0 : mnClientId = 0;
388 : }
389 0 : }
390 : }
391 0 : }
392 :
393 :
394 :
395 :
396 : //===== XAccessibleComponent ==================================================
397 :
398 0 : sal_Bool SAL_CALL AccessibleTreeNode::containsPoint (const awt::Point& aPoint)
399 : throw (RuntimeException)
400 : {
401 0 : ThrowIfDisposed();
402 0 : const awt::Rectangle aBBox (getBounds());
403 : return (aPoint.X >= 0)
404 : && (aPoint.X < aBBox.Width)
405 : && (aPoint.Y >= 0)
406 0 : && (aPoint.Y < aBBox.Height);
407 : }
408 :
409 :
410 :
411 :
412 : Reference<XAccessible> SAL_CALL
413 0 : AccessibleTreeNode::getAccessibleAtPoint (const awt::Point& aPoint)
414 : throw (RuntimeException)
415 : {
416 0 : ThrowIfDisposed();
417 0 : Reference<XAccessible> xChildAtPoint;
418 0 : const SolarMutexGuard aSolarGuard;
419 :
420 0 : sal_Int32 nChildCount = getAccessibleChildCount();
421 0 : for (sal_Int32 nIndex=0; nIndex<nChildCount; ++nIndex)
422 : {
423 : Reference<XAccessibleComponent> xChildComponent(
424 0 : getAccessibleChild(nIndex), UNO_QUERY);
425 0 : if (xChildComponent.is())
426 : {
427 0 : awt::Point aChildPoint(aPoint);
428 0 : awt::Point aChildOrigin(xChildComponent->getLocation());
429 0 : aChildPoint.X -= aChildOrigin.X;
430 0 : aChildPoint.Y -= aChildOrigin.Y;
431 0 : if (xChildComponent->containsPoint(aChildPoint))
432 : {
433 0 : xChildAtPoint = getAccessibleChild(nIndex);
434 : break;
435 : }
436 : }
437 0 : }
438 :
439 0 : return xChildAtPoint;
440 : }
441 :
442 :
443 :
444 :
445 0 : awt::Rectangle SAL_CALL AccessibleTreeNode::getBounds (void)
446 : throw (RuntimeException)
447 : {
448 0 : ThrowIfDisposed ();
449 :
450 0 : awt::Rectangle aBBox;
451 :
452 0 : ::Window* pWindow = mrTreeNode.GetWindow();
453 0 : if (pWindow != NULL)
454 : {
455 0 : Point aPosition;
456 0 : if (mxParent.is())
457 : {
458 0 : aPosition = pWindow->OutputToAbsoluteScreenPixel(Point(0,0));
459 : Reference<XAccessibleComponent> xParentComponent (
460 0 : mxParent->getAccessibleContext(), UNO_QUERY);
461 0 : if (xParentComponent.is())
462 : {
463 0 : awt::Point aParentPosition (xParentComponent->getLocationOnScreen());
464 0 : aPosition.X() -= aParentPosition.X;
465 0 : aPosition.Y() -= aParentPosition.Y;
466 0 : }
467 : }
468 : else
469 0 : aPosition = pWindow->GetPosPixel();
470 0 : aBBox.X = aPosition.X();
471 0 : aBBox.Y = aPosition.Y();
472 :
473 0 : Size aSize (pWindow->GetSizePixel());
474 0 : aBBox.Width = aSize.Width();
475 0 : aBBox.Height = aSize.Height();
476 : }
477 :
478 0 : return aBBox;
479 : }
480 :
481 :
482 :
483 :
484 0 : awt::Point SAL_CALL AccessibleTreeNode::getLocation (void)
485 : throw (uno::RuntimeException)
486 : {
487 0 : ThrowIfDisposed();
488 0 : const awt::Rectangle aBBox (getBounds());
489 0 : return awt::Point(aBBox.X,aBBox.Y);
490 : }
491 :
492 :
493 :
494 :
495 : /** Calculate the location on screen from the parent's location on screen
496 : and our own relative location.
497 : */
498 0 : awt::Point SAL_CALL AccessibleTreeNode::getLocationOnScreen()
499 : throw (uno::RuntimeException)
500 : {
501 0 : ThrowIfDisposed();
502 0 : const SolarMutexGuard aSolarGuard;
503 0 : awt::Point aLocationOnScreen;
504 :
505 0 : ::Window* pWindow = mrTreeNode.GetWindow();
506 0 : if (pWindow != NULL)
507 : {
508 0 : Point aPoint (pWindow->OutputToAbsoluteScreenPixel(Point(0,0)));
509 0 : aLocationOnScreen.X = aPoint.X();
510 0 : aLocationOnScreen.Y = aPoint.Y();
511 : }
512 :
513 0 : return aLocationOnScreen;
514 : }
515 :
516 :
517 :
518 :
519 0 : awt::Size SAL_CALL AccessibleTreeNode::getSize (void)
520 : throw (uno::RuntimeException)
521 : {
522 0 : ThrowIfDisposed();
523 0 : const awt::Rectangle aBBox (getBounds());
524 0 : return awt::Size(aBBox.Width,aBBox.Height);
525 : }
526 :
527 :
528 :
529 :
530 0 : void SAL_CALL AccessibleTreeNode::grabFocus (void)
531 : throw (uno::RuntimeException)
532 : {
533 0 : ThrowIfDisposed();
534 0 : const SolarMutexGuard aSolarGuard;
535 :
536 0 : if (mrTreeNode.GetWindow() != NULL)
537 0 : mrTreeNode.GetWindow()->GrabFocus();
538 0 : }
539 :
540 :
541 :
542 :
543 0 : sal_Int32 SAL_CALL AccessibleTreeNode::getForeground (void)
544 : throw (RuntimeException)
545 : {
546 0 : ThrowIfDisposed();
547 0 : svtools::ColorConfig aColorConfig;
548 0 : sal_uInt32 nColor = aColorConfig.GetColorValue( svtools::FONTCOLOR ).nColor;
549 0 : return static_cast<sal_Int32>(nColor);
550 : }
551 :
552 :
553 :
554 :
555 0 : sal_Int32 SAL_CALL AccessibleTreeNode::getBackground (void)
556 : throw (RuntimeException)
557 : {
558 0 : ThrowIfDisposed();
559 0 : sal_uInt32 nColor = Application::GetSettings().GetStyleSettings().GetWindowColor().GetColor();
560 0 : return static_cast<sal_Int32>(nColor);
561 : }
562 :
563 :
564 :
565 :
566 : //===== XServiceInfo ========================================================
567 :
568 : ::rtl::OUString SAL_CALL
569 0 : AccessibleTreeNode::getImplementationName (void)
570 : throw (::com::sun::star::uno::RuntimeException)
571 : {
572 0 : return OUString("AccessibleTreeNode");
573 : }
574 :
575 :
576 :
577 :
578 : sal_Bool SAL_CALL
579 0 : AccessibleTreeNode::supportsService (const OUString& sServiceName)
580 : throw (::com::sun::star::uno::RuntimeException)
581 : {
582 0 : ThrowIfDisposed ();
583 :
584 : // Iterate over all supported service names and return true if on of them
585 : // matches the given name.
586 : uno::Sequence< ::rtl::OUString> aSupportedServices (
587 0 : getSupportedServiceNames ());
588 0 : for (int i=0; i<aSupportedServices.getLength(); i++)
589 0 : if (sServiceName == aSupportedServices[i])
590 0 : return sal_True;
591 0 : return sal_False;
592 : }
593 :
594 :
595 :
596 :
597 : uno::Sequence< ::rtl::OUString> SAL_CALL
598 0 : AccessibleTreeNode::getSupportedServiceNames (void)
599 : throw (::com::sun::star::uno::RuntimeException)
600 : {
601 0 : ThrowIfDisposed ();
602 : static const OUString sServiceNames[2] = {
603 : OUString("com.sun.star.accessibility.Accessible"),
604 : OUString("com.sun.star.accessibility.AccessibleContext"),
605 0 : };
606 0 : return uno::Sequence<OUString> (sServiceNames, 2);
607 : }
608 :
609 :
610 :
611 :
612 0 : void AccessibleTreeNode::ThrowIfDisposed (void)
613 : throw (lang::DisposedException)
614 : {
615 0 : if (rBHelper.bDisposed || rBHelper.bInDispose)
616 : {
617 : OSL_TRACE ("Calling disposed object. Throwing exception:");
618 : throw lang::DisposedException ("object has been already disposed",
619 0 : static_cast<uno::XWeak*>(this));
620 : }
621 0 : }
622 :
623 :
624 :
625 0 : sal_Bool AccessibleTreeNode::IsDisposed (void)
626 : {
627 0 : return (rBHelper.bDisposed || rBHelper.bInDispose);
628 : }
629 :
630 :
631 :
632 :
633 0 : IMPL_LINK(AccessibleTreeNode, StateChangeListener, TreeNodeStateChangeEvent*, pEvent)
634 : {
635 0 : if (rBHelper.bDisposed || rBHelper.bInDispose)
636 0 : return 1; // mrTreeNode is probably dead
637 :
638 : OSL_ASSERT(pEvent!=NULL);
639 : OSL_ASSERT(&pEvent->mrSource==&mrTreeNode);
640 :
641 0 : switch(pEvent->meEventId)
642 : {
643 : case EID_CHILD_ADDED:
644 0 : if (pEvent->mpChild != NULL)
645 : FireAccessibleEvent(AccessibleEventId::CHILD,
646 : Any(),
647 0 : Any(pEvent->mpChild->GetAccessibleObject()));
648 : else
649 0 : FireAccessibleEvent(AccessibleEventId::INVALIDATE_ALL_CHILDREN,Any(),Any());
650 0 : break;
651 :
652 : case EID_ALL_CHILDREN_REMOVED:
653 0 : FireAccessibleEvent(AccessibleEventId::INVALIDATE_ALL_CHILDREN,Any(),Any());
654 0 : break;
655 :
656 : case EID_EXPANSION_STATE_CHANGED:
657 : case EID_FOCUSED_STATE_CHANGED:
658 : case EID_SHOWING_STATE_CHANGED:
659 0 : UpdateStateSet();
660 0 : break;
661 : }
662 0 : return 1;
663 : }
664 :
665 :
666 :
667 :
668 0 : IMPL_LINK(AccessibleTreeNode, WindowEventListener, VclWindowEvent*, pEvent)
669 : {
670 0 : if (rBHelper.bDisposed || rBHelper.bInDispose)
671 0 : return 1; // mrTreeNode is probably dead
672 :
673 0 : switch (pEvent->GetId())
674 : {
675 : case VCLEVENT_WINDOW_HIDE:
676 : // This event may be sent while the window is destroyed so do
677 : // not call UpdateStateSet() which calls back to the window but
678 : // just set the two states VISIBLE and SHOWING to false.
679 0 : UpdateState(AccessibleStateType::VISIBLE, false);
680 0 : UpdateState(AccessibleStateType::SHOWING, false);
681 0 : break;
682 :
683 : case VCLEVENT_WINDOW_SHOW:
684 : case VCLEVENT_WINDOW_DATACHANGED:
685 0 : UpdateStateSet();
686 0 : break;
687 :
688 : case VCLEVENT_WINDOW_MOVE:
689 : case VCLEVENT_WINDOW_RESIZE:
690 0 : FireAccessibleEvent(AccessibleEventId::BOUNDRECT_CHANGED,Any(),Any());
691 0 : break;
692 :
693 : case VCLEVENT_WINDOW_GETFOCUS:
694 : case VCLEVENT_WINDOW_LOSEFOCUS:
695 0 : UpdateStateSet();
696 0 : break;
697 : }
698 0 : return 1;
699 : }
700 :
701 : } // end of namespace ::accessibility
702 :
703 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|