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 <com/sun/star/accessibility/AccessibleRole.hpp>
21 : #include <com/sun/star/accessibility/AccessibleEventId.hpp>
22 : #include <unotools/accessiblestatesethelper.hxx>
23 : #include <com/sun/star/accessibility/AccessibleStateType.hpp>
24 : #include <com/sun/star/beans/PropertyChangeEvent.hpp>
25 : #include <com/sun/star/awt/XWindow.hpp>
26 : #include <cppuhelper/supportsservice.hxx>
27 : #include <cppuhelper/typeprovider.hxx>
28 : #include <toolkit/helper/vclunohelper.hxx>
29 : #include <toolkit/helper/convert.hxx>
30 : #include <vcl/svapp.hxx>
31 : #include <vcl/settings.hxx>
32 : #include <osl/mutex.hxx>
33 : #include <rtl/uuid.h>
34 : #include <tools/debug.hxx>
35 : #include <tools/gen.hxx>
36 :
37 : #include <svx/dialogs.hrc>
38 : #include "accessibility.hrc"
39 : #include <svx/dlgctrl.hxx>
40 :
41 : #include <svx/dialmgr.hxx>
42 : #include <comphelper/accessibleeventnotifier.hxx>
43 :
44 : #include <unotools/accessiblerelationsethelper.hxx>
45 :
46 : #include "svxpixelctlaccessiblecontext.hxx"
47 : #include <com/sun/star/accessibility/AccessibleRelationType.hpp>
48 :
49 : using namespace ::cppu;
50 : using namespace ::osl;
51 : using namespace ::rtl;
52 : using namespace ::com::sun::star;
53 : using namespace ::com::sun::star::uno;
54 : using namespace ::com::sun::star::accessibility;
55 :
56 0 : SvxPixelCtlAccessible::SvxPixelCtlAccessible( SvxPixelCtl& rControl) :
57 : SvxPixelCtlAccessible_BASE(m_aMutex),
58 : mrPixelCtl(rControl),
59 0 : mnClientId(0)
60 : {
61 0 : }
62 :
63 0 : SvxPixelCtlAccessible::~SvxPixelCtlAccessible()
64 : {
65 0 : if( IsAlive() )
66 : {
67 0 : osl_atomic_increment( &m_refCount );
68 0 : dispose(); // set mpRepr = NULL & release all childs
69 : }
70 0 : }
71 : /*-- 04.02.2002 14:11:55---------------------------------------------------
72 :
73 : -----------------------------------------------------------------------*/
74 0 : uno::Reference< XAccessibleContext > SvxPixelCtlAccessible::getAccessibleContext( )
75 : throw (uno::RuntimeException, std::exception)
76 : {
77 0 : return this;
78 : }
79 :
80 0 : sal_Int32 SvxPixelCtlAccessible::getAccessibleChildCount( ) throw (uno::RuntimeException, std::exception)
81 : {
82 0 : ::osl::MutexGuard aGuard( m_aMutex );
83 0 : return mrPixelCtl.GetSquares();
84 : }
85 : /*-- 04.02.2002 14:11:56---------------------------------------------------
86 :
87 : -----------------------------------------------------------------------*/
88 0 : uno::Reference< XAccessible > SvxPixelCtlAccessible::getAccessibleChild( sal_Int32 i )
89 : throw (lang::IndexOutOfBoundsException, uno::RuntimeException, std::exception)
90 : {
91 0 : ::osl::MutexGuard aGuard( m_aMutex );
92 0 : if ( i < 0 || i >= getAccessibleChildCount())
93 0 : throw lang::IndexOutOfBoundsException();
94 0 : uno::Reference <XAccessible> xAcc;
95 0 : return CreateChild(i, mrPixelCtl.IndexToPoint(i));
96 : }
97 :
98 :
99 :
100 0 : uno::Reference< XAccessible > SvxPixelCtlAccessible::getAccessibleParent( )
101 : throw (uno::RuntimeException, std::exception)
102 : {
103 0 : ::osl::MutexGuard aGuard( m_aMutex );
104 0 : return mrPixelCtl.GetParent()->GetAccessible( true );
105 : }
106 :
107 0 : sal_Int32 SvxPixelCtlAccessible::getAccessibleIndexInParent( )
108 : throw (uno::RuntimeException, std::exception)
109 : {
110 0 : ::osl::MutexGuard aGuard( m_aMutex );
111 0 : sal_uInt16 nIdx = 0;
112 0 : Window* pTabPage = mrPixelCtl.GetParent();
113 0 : sal_uInt16 nChildren = pTabPage->GetChildCount();
114 0 : for(nIdx = 0; nIdx < nChildren; nIdx++)
115 0 : if(pTabPage->GetChild( nIdx ) == &mrPixelCtl)
116 0 : break;
117 0 : return nIdx;
118 : }
119 : /*-- 04.02.2002 14:11:57---------------------------------------------------
120 :
121 : -----------------------------------------------------------------------*/
122 0 : sal_Int16 SvxPixelCtlAccessible::getAccessibleRole( ) throw (uno::RuntimeException, std::exception)
123 : {
124 0 : return AccessibleRole::LIST;
125 : }
126 :
127 0 : OUString SvxPixelCtlAccessible::getAccessibleDescription( )
128 : throw (uno::RuntimeException, std::exception)
129 : {
130 :
131 0 : ::osl::MutexGuard aGuard( m_aMutex );
132 0 : return mrPixelCtl.GetAccessibleDescription();
133 : }
134 :
135 0 : OUString SvxPixelCtlAccessible::getAccessibleName( )
136 : throw (uno::RuntimeException, std::exception)
137 : {
138 :
139 0 : ::osl::MutexGuard aGuard( m_aMutex );
140 0 : return mrPixelCtl.GetAccessibleName();
141 : }
142 :
143 0 : uno::Reference< XAccessibleRelationSet > SvxPixelCtlAccessible::getAccessibleRelationSet( )
144 : throw (uno::RuntimeException, std::exception)
145 : {
146 0 : ::osl::MutexGuard aGuard( m_aMutex );
147 0 : utl::AccessibleRelationSetHelper* rRelationSet = new utl::AccessibleRelationSetHelper;
148 0 : uno::Reference< css::accessibility::XAccessibleRelationSet > rSet = rRelationSet;
149 0 : Window *pLabeledBy = mrPixelCtl.GetAccessibleRelationLabeledBy();
150 0 : if ( pLabeledBy && pLabeledBy != &mrPixelCtl )
151 : {
152 0 : uno::Sequence< uno::Reference< uno::XInterface > > aSequence(1);
153 0 : aSequence[0] = pLabeledBy->GetAccessible();
154 0 : rRelationSet->AddRelation( css::accessibility::AccessibleRelation( css::accessibility::AccessibleRelationType::LABELED_BY, aSequence ) );
155 : }
156 :
157 0 : Window* pMemberOf = mrPixelCtl.GetAccessibleRelationMemberOf();
158 0 : if ( pMemberOf && pMemberOf != &mrPixelCtl )
159 : {
160 0 : uno::Sequence< uno::Reference< uno::XInterface > > aSequence(1);
161 0 : aSequence[0] = pMemberOf->GetAccessible();
162 0 : rRelationSet->AddRelation( css::accessibility::AccessibleRelation( css::accessibility::AccessibleRelationType::MEMBER_OF, aSequence ) );
163 : }
164 0 : return rSet;
165 : }
166 :
167 :
168 0 : uno::Reference< XAccessibleStateSet > SvxPixelCtlAccessible::getAccessibleStateSet( )
169 : throw (uno::RuntimeException, std::exception)
170 : {
171 0 : ::osl::MutexGuard aGuard( m_aMutex );
172 0 : utl::AccessibleStateSetHelper* pStateSetHelper = new utl::AccessibleStateSetHelper;
173 0 : uno::Reference< XAccessibleStateSet > xRet = pStateSetHelper;
174 :
175 : const sal_Int16 aStandardStates[] =
176 : {
177 : AccessibleStateType::FOCUSABLE,
178 : AccessibleStateType::SELECTABLE,
179 : AccessibleStateType::SHOWING,
180 : AccessibleStateType::VISIBLE,
181 : AccessibleStateType::OPAQUE,
182 : 0
183 0 : };
184 :
185 0 : sal_Int16 nState = 0;
186 0 : while(aStandardStates[nState])
187 : {
188 0 : pStateSetHelper->AddState(aStandardStates[nState++]);
189 : }
190 0 : if(mrPixelCtl.IsEnabled())
191 0 : pStateSetHelper->AddState(AccessibleStateType::ENABLED);
192 0 : if(mrPixelCtl.HasFocus())
193 0 : pStateSetHelper->AddState(AccessibleStateType::FOCUSED);
194 0 : pStateSetHelper->AddState(AccessibleStateType::MANAGES_DESCENDANTS);
195 :
196 0 : return xRet;
197 : }
198 :
199 :
200 0 : com::sun::star::lang::Locale SvxPixelCtlAccessible::getLocale( )
201 : throw (IllegalAccessibleComponentStateException, uno::RuntimeException, std::exception)
202 : {
203 0 : ::osl::MutexGuard aGuard( m_aMutex );
204 0 : if( getAccessibleParent().is() )
205 : {
206 0 : uno::Reference< XAccessibleContext > xParentContext( getAccessibleParent()->getAccessibleContext() );
207 0 : if( xParentContext.is() )
208 0 : return xParentContext->getLocale();
209 : }
210 :
211 : // No locale and no parent. Therefore throw exception to indicate this
212 : // cluelessness.
213 0 : throw IllegalAccessibleComponentStateException();
214 : }
215 :
216 :
217 0 : sal_Bool SvxPixelCtlAccessible::containsPoint( const awt::Point& aPt )
218 : throw (uno::RuntimeException, std::exception)
219 : {
220 0 : ::osl::MutexGuard aGuard( m_aMutex );
221 0 : Point aPoint(aPt.X, aPt.Y);
222 0 : return (aPoint.X() >= 0)
223 0 : && (aPoint.X() < mrPixelCtl.GetSizePixel().getWidth())
224 0 : && (aPoint.Y() >= 0)
225 0 : && (aPoint.Y() < mrPixelCtl.GetSizePixel().getHeight());
226 : }
227 0 : uno::Reference<XAccessible > SAL_CALL SvxPixelCtlAccessible::getAccessibleAtPoint (
228 : const awt::Point& aPoint)
229 : throw (uno::RuntimeException, std::exception)
230 : {
231 0 : ::osl::MutexGuard aGuard( m_aMutex );
232 0 : ensureIsAlive();
233 0 : uno::Reference <XAccessible> xAcc;
234 :
235 0 : Point childPoint;
236 0 : childPoint.X() = aPoint.X;
237 0 : childPoint.Y() = aPoint.Y;
238 :
239 0 : Point pt= mrPixelCtl.PixelToLogic(childPoint);
240 0 : long nIndex = mrPixelCtl.PointToIndex(pt);
241 0 : return CreateChild(nIndex, mrPixelCtl.IndexToPoint(nIndex));
242 : }
243 :
244 0 : awt::Rectangle SvxPixelCtlAccessible::getBounds( ) throw (uno::RuntimeException, std::exception)
245 : {
246 0 : ::osl::MutexGuard aGuard( m_aMutex );
247 0 : awt::Rectangle aRet;
248 0 : Size aSz = mrPixelCtl.GetSizePixel();
249 0 : Point aPos = mrPixelCtl.GetPosPixel();
250 0 : aRet.X = aPos.X();
251 0 : aRet.Y = aPos.Y();
252 0 : aRet.Width = aSz.Width();
253 0 : aRet.Height = aSz.Height();
254 0 : return aRet;
255 : }
256 :
257 0 : awt::Point SvxPixelCtlAccessible::getLocation( ) throw (uno::RuntimeException, std::exception)
258 : {
259 0 : ::osl::MutexGuard aGuard( m_aMutex );
260 0 : Point aPos;
261 0 : aPos = mrPixelCtl.GetPosPixel();
262 0 : awt::Point aRet(aPos.X(), aPos.Y());
263 0 : return aRet;
264 : }
265 :
266 0 : awt::Point SvxPixelCtlAccessible::getLocationOnScreen( ) throw (uno::RuntimeException, std::exception)
267 : {
268 0 : ::osl::MutexGuard aGuard( m_aMutex );
269 0 : Rectangle rect = mrPixelCtl.GetWindowExtentsRelative(NULL);
270 0 : return awt::Point(rect.Left(),rect.Top() );
271 : }
272 :
273 0 : awt::Size SvxPixelCtlAccessible::getSize( ) throw (uno::RuntimeException, std::exception)
274 : {
275 0 : ::osl::MutexGuard aGuard( m_aMutex );
276 0 : Size aSz = mrPixelCtl.GetSizePixel();
277 0 : return awt::Size(aSz.Width(),aSz.Height());
278 : }
279 0 : void SvxPixelCtlAccessible::grabFocus( ) throw (uno::RuntimeException, std::exception)
280 : {
281 0 : ::osl::MutexGuard aGuard( m_aMutex );
282 0 : mrPixelCtl.GrabFocus();
283 0 : }
284 :
285 0 : sal_Int32 SvxPixelCtlAccessible::getForeground( )
286 : throw (::com::sun::star::uno::RuntimeException, std::exception)
287 : {
288 0 : ::osl::MutexGuard aGuard( m_aMutex );
289 0 : return mrPixelCtl.GetControlForeground().GetColor();
290 : }
291 :
292 0 : sal_Int32 SvxPixelCtlAccessible::getBackground( )
293 : throw (::com::sun::star::uno::RuntimeException, std::exception)
294 : {
295 0 : ::osl::MutexGuard aGuard( m_aMutex );
296 0 : return mrPixelCtl.GetControlBackground().GetColor();
297 : }
298 :
299 0 : OUString SvxPixelCtlAccessible::getImplementationName( ) throw (uno::RuntimeException, std::exception)
300 : {
301 0 : return OUString("SvxPixelCtlAccessible");
302 : }
303 :
304 0 : sal_Bool SvxPixelCtlAccessible::supportsService( const OUString& rServiceName )
305 : throw (uno::RuntimeException, std::exception)
306 : {
307 0 : return cppu::supportsService( this, rServiceName );
308 : }
309 :
310 0 : uno::Sequence< OUString > SvxPixelCtlAccessible::getSupportedServiceNames( )
311 : throw (uno::RuntimeException, std::exception)
312 : {
313 0 : uno::Sequence< OUString > aRet(2);
314 0 : OUString* pArray = aRet.getArray();
315 0 : pArray[0] = "Accessible";
316 0 : pArray[1] = "AccessibleContext";
317 0 : pArray[2] = "AccessibleComponent";
318 0 : return aRet;
319 : }
320 :
321 :
322 : // XAccessibleSelection
323 :
324 0 : void SAL_CALL SvxPixelCtlAccessible::selectAccessibleChild( sal_Int32 nChildIndex ) throw (lang::IndexOutOfBoundsException, RuntimeException, std::exception)
325 : {
326 0 : ::osl::MutexGuard aGuard( m_aMutex );
327 :
328 0 : if ( nChildIndex < 0 || nChildIndex >= getAccessibleChildCount())
329 0 : throw lang::IndexOutOfBoundsException();
330 :
331 0 : long nIndex = mrPixelCtl.ShowPosition(mrPixelCtl.IndexToPoint(nChildIndex));
332 0 : NotifyChild(nIndex,sal_True,sal_False);
333 0 : }
334 :
335 0 : sal_Bool SAL_CALL SvxPixelCtlAccessible::isAccessibleChildSelected( sal_Int32 nChildIndex ) throw (lang::IndexOutOfBoundsException, RuntimeException, std::exception)
336 : {
337 0 : ::osl::MutexGuard aGuard( m_aMutex );
338 :
339 0 : return mrPixelCtl.GetFoucsPosIndex() == nChildIndex;
340 : }
341 :
342 0 : void SAL_CALL SvxPixelCtlAccessible::clearAccessibleSelection( ) throw (RuntimeException, std::exception)
343 : {
344 0 : }
345 :
346 0 : void SAL_CALL SvxPixelCtlAccessible::selectAllAccessibleChildren( ) throw (RuntimeException, std::exception)
347 : {
348 0 : }
349 :
350 0 : sal_Int32 SAL_CALL SvxPixelCtlAccessible::getSelectedAccessibleChildCount( ) throw (RuntimeException, std::exception)
351 : {
352 0 : return 1;
353 : }
354 :
355 0 : uno::Reference< XAccessible > SAL_CALL SvxPixelCtlAccessible::getSelectedAccessibleChild( sal_Int32 nSelectedChildIndex ) throw (lang::IndexOutOfBoundsException, RuntimeException, std::exception)
356 : {
357 0 : ::osl::MutexGuard aGuard( m_aMutex );
358 :
359 0 : if ( nSelectedChildIndex >= 1)
360 0 : throw lang::IndexOutOfBoundsException();
361 :
362 0 : uno::Reference< XAccessible > xChild;
363 0 : if(m_xCurChild.is())
364 : {
365 0 : xChild = m_xCurChild;
366 : }
367 0 : return xChild;
368 : }
369 :
370 0 : void SAL_CALL SvxPixelCtlAccessible::deselectAccessibleChild( sal_Int32 ) throw (lang::IndexOutOfBoundsException, RuntimeException, std::exception)
371 : {
372 0 : }
373 :
374 : // Added by lq
375 0 : void SvxPixelCtlAccessible::ensureIsAlive() const
376 : throw ( lang::DisposedException )
377 : {
378 0 : if( !IsAlive() )
379 0 : throw lang::DisposedException();
380 0 : }
381 :
382 : //XAccessibleEventBroadcaster
383 0 : void SAL_CALL SvxPixelCtlAccessible::addAccessibleEventListener( const uno::Reference< XAccessibleEventListener >& xListener ) throw( RuntimeException, std::exception )
384 : {
385 0 : if (xListener.is())
386 : {
387 0 : ::osl::MutexGuard aGuard( m_aMutex );
388 0 : if (!mnClientId)
389 0 : mnClientId = comphelper::AccessibleEventNotifier::registerClient( );
390 0 : comphelper::AccessibleEventNotifier::addEventListener( mnClientId, xListener );
391 : }
392 0 : }
393 :
394 0 : void SAL_CALL SvxPixelCtlAccessible::removeAccessibleEventListener( const uno::Reference< XAccessibleEventListener >& xListener )
395 : throw( RuntimeException, std::exception )
396 : {
397 0 : if (xListener.is())
398 : {
399 0 : ::osl::MutexGuard aGuard( m_aMutex );
400 :
401 0 : sal_Int32 nListenerCount = comphelper::AccessibleEventNotifier::removeEventListener( mnClientId, xListener );
402 0 : if ( !nListenerCount )
403 : {
404 0 : comphelper::AccessibleEventNotifier::revokeClient( mnClientId );
405 0 : mnClientId = 0;
406 0 : }
407 : }
408 0 : }
409 0 : void SvxPixelCtlAccessible::CommitChange( const AccessibleEventObject& rEvent )
410 : {
411 0 : if (mnClientId)
412 0 : comphelper::AccessibleEventNotifier::addEvent( mnClientId, rEvent );
413 0 : }
414 :
415 : //Solution:Add the event handling method
416 0 : void SvxPixelCtlAccessible::FireAccessibleEvent (short nEventId, const ::com::sun::star::uno::Any& rOld, const ::com::sun::star::uno::Any& rNew)
417 : {
418 0 : const uno::Reference< XInterface > xSource( *this );
419 0 : CommitChange( AccessibleEventObject( xSource, nEventId, rNew,rOld ) );
420 0 : }
421 :
422 0 : void SAL_CALL SvxPixelCtlAccessible::disposing()
423 : {
424 0 : if( !rBHelper.bDisposed )
425 : {
426 : {
427 0 : ::osl::MutexGuard aGuard( m_aMutex );
428 0 : if ( mnClientId )
429 : {
430 0 : comphelper::AccessibleEventNotifier::revokeClientNotifyDisposing( mnClientId, *this );
431 0 : mnClientId = 0;
432 0 : }
433 : }
434 : //mxParent = uno::Reference< XAccessible >();
435 :
436 : }
437 0 : }
438 :
439 0 : void SvxPixelCtlAccessible::NotifyChild(long nIndex,sal_Bool bSelect ,sal_Bool bCheck)
440 : {
441 : DBG_ASSERT( !(!bSelect && !bCheck),"" );//non is false
442 :
443 0 : SvxPixelCtlAccessibleChild *pChild= NULL;
444 :
445 0 : if (m_xCurChild.is())
446 : {
447 0 : pChild= static_cast<SvxPixelCtlAccessibleChild*>(m_xCurChild.get());
448 : DBG_ASSERT(pChild,"Child Must be Valid");
449 0 : if (pChild->getAccessibleIndexInParent() == nIndex )
450 : {
451 0 : if (bSelect)
452 : {
453 0 : pChild->SelectChild(sal_True);
454 : }
455 0 : if (bCheck)
456 : {
457 0 : pChild->ChangePixelColorOrBG(sal_Bool(mrPixelCtl.GetBitmapPixel(sal_uInt16(nIndex))));
458 0 : pChild->CheckChild();
459 : }
460 0 : return ;
461 : }
462 : }
463 0 : uno::Reference <XAccessible> xNewChild =CreateChild(nIndex, mrPixelCtl.IndexToPoint(nIndex));
464 0 : SvxPixelCtlAccessibleChild *pNewChild= static_cast<SvxPixelCtlAccessibleChild*>(xNewChild.get());
465 : DBG_ASSERT(pNewChild,"Child Must be Valid");
466 :
467 0 : Any aNewValue,aOldValue;
468 0 : aNewValue<<= xNewChild;
469 : FireAccessibleEvent( AccessibleEventId::ACTIVE_DESCENDANT_CHANGED,
470 : aOldValue,
471 0 : aNewValue );
472 :
473 0 : if (bSelect)
474 : {
475 0 : if (pChild)
476 : {
477 0 : pChild->SelectChild(sal_False);
478 : }
479 0 : pNewChild->SelectChild(sal_True);
480 : }
481 0 : if (bCheck)
482 : {
483 0 : pNewChild->CheckChild();
484 : }
485 0 : m_xCurChild= xNewChild;
486 :
487 :
488 : }
489 :
490 0 : uno::Reference<XAccessible> SvxPixelCtlAccessible::CreateChild (long nIndex,Point mPoint)
491 : {
492 0 : long nX = mPoint.X();
493 0 : long nY = mPoint.Y();
494 0 : if( Application::GetSettings().GetLayoutRTL())
495 : {
496 0 : nX = (sal_uInt16) mrPixelCtl.GetWidth() - 1 - nX;
497 : }
498 :
499 0 : sal_Bool bPixelColorOrBG= sal_Bool(mrPixelCtl.GetBitmapPixel(sal_uInt16(nIndex)));
500 0 : Size size(mrPixelCtl.GetWidth() / mrPixelCtl.GetLineCount(),mrPixelCtl.GetHeight() / mrPixelCtl.GetLineCount());
501 0 : uno::Reference<XAccessible> xChild;
502 0 : xChild = new SvxPixelCtlAccessibleChild(mrPixelCtl,
503 : bPixelColorOrBG,
504 : Point(nX,nY),
505 : Rectangle(mPoint,size),
506 : this,
507 0 : nIndex);
508 :
509 0 : return xChild;
510 : }
511 :
512 :
513 0 : void SvxPixelCtlAccessible::LoseFocus()
514 : {
515 0 : m_xCurChild = uno::Reference< XAccessible >() ;
516 0 : }
517 :
518 0 : void SvxPixelCtlAccessibleChild::CheckChild()
519 : {
520 0 : Any aChecked;
521 0 : aChecked <<= AccessibleStateType::CHECKED;
522 :
523 0 : if (m_bPixelColorOrBG)//Current Child State
524 : {
525 : FireAccessibleEvent( AccessibleEventId::STATE_CHANGED,
526 : Any(),
527 0 : aChecked);
528 : }
529 : else
530 : {
531 : FireAccessibleEvent( AccessibleEventId::STATE_CHANGED,
532 : aChecked,
533 0 : Any() );
534 0 : }
535 0 : }
536 :
537 0 : void SvxPixelCtlAccessibleChild::SelectChild( sal_Bool bSelect)
538 : {
539 0 : Any aSelected;
540 0 : aSelected <<= AccessibleStateType::SELECTED;
541 :
542 0 : if (bSelect)
543 : {
544 : FireAccessibleEvent( AccessibleEventId::STATE_CHANGED,
545 : Any(),
546 0 : aSelected);
547 : }
548 : else
549 : {
550 : FireAccessibleEvent( AccessibleEventId::STATE_CHANGED,
551 : aSelected,
552 0 : Any());
553 0 : }
554 0 : }
555 0 : void SvxPixelCtlAccessibleChild::FireAccessibleEvent (
556 : short nEventId,
557 : const ::com::sun::star::uno::Any& rOld,
558 : const ::com::sun::star::uno::Any& rNew)
559 : {
560 0 : const uno::Reference< XInterface > xSource( *this );
561 0 : CommitChange( AccessibleEventObject( xSource, nEventId, rNew,rOld ) );
562 0 : }
563 :
564 0 : SvxPixelCtlAccessibleChild::SvxPixelCtlAccessibleChild(
565 : SvxPixelCtl& rWindow,
566 : sal_Bool bPixelColorOrBG,
567 : const Point &aPoint,
568 : const Rectangle& rBoundingBox,
569 : const uno::Reference<XAccessible>& rxParent,
570 : long nIndexInParent ) :
571 : SvxPixelCtlAccessibleChild_BASE( m_aMutex ),
572 : mrParentWindow( rWindow ),
573 : mxParent(rxParent),
574 : m_bPixelColorOrBG(bPixelColorOrBG),
575 : maPoint(aPoint),
576 : mpBoundingBox( new Rectangle( rBoundingBox ) ),
577 : mnIndexInParent( nIndexInParent ),
578 0 : mnClientId( 0 )
579 : {
580 0 : }
581 :
582 :
583 0 : SvxPixelCtlAccessibleChild::~SvxPixelCtlAccessibleChild()
584 : {
585 0 : if( IsAlive() )
586 : {
587 0 : osl_atomic_increment( &m_refCount );
588 0 : dispose(); // set mpRepr = NULL & release all childs
589 : }
590 0 : }
591 :
592 : //===== XAccessible =========================================================
593 :
594 0 : uno::Reference< XAccessibleContext> SAL_CALL SvxPixelCtlAccessibleChild::getAccessibleContext( void ) throw( RuntimeException, std::exception )
595 : {
596 0 : return this;
597 : }
598 :
599 : //===== XAccessibleComponent ================================================
600 :
601 0 : sal_Bool SAL_CALL SvxPixelCtlAccessibleChild::containsPoint( const awt::Point& rPoint ) throw( RuntimeException, std::exception )
602 : {
603 : // no guard -> done in getBounds()
604 : // return GetBoundingBox().IsInside( VCLPoint( rPoint ) );
605 0 : return Rectangle( Point( 0, 0 ), GetBoundingBox().GetSize() ).IsInside( VCLPoint( rPoint ) );
606 : }
607 :
608 0 : uno::Reference< XAccessible > SAL_CALL SvxPixelCtlAccessibleChild::getAccessibleAtPoint( const awt::Point& ) throw( RuntimeException, std::exception )
609 : {
610 0 : return uno::Reference< XAccessible >();
611 : }
612 :
613 0 : awt::Rectangle SAL_CALL SvxPixelCtlAccessibleChild::getBounds() throw( RuntimeException, std::exception )
614 : {
615 : // no guard -> done in getBoundingBox()
616 : //Modified by lq, 09/26
617 : //return AWTRectangle( GetBoundingBox() );
618 0 : awt::Rectangle rect = AWTRectangle( GetBoundingBox() );
619 0 : rect.X = rect.X + mrParentWindow.GetClientWindowExtentsRelative(NULL).Left()-mrParentWindow.GetWindowExtentsRelative(NULL).Left();
620 0 : rect.Y = rect.Y + mrParentWindow.GetClientWindowExtentsRelative(NULL).Top()-mrParentWindow.GetWindowExtentsRelative(NULL).Top();
621 0 : return rect;
622 : // End
623 : }
624 :
625 0 : awt::Point SAL_CALL SvxPixelCtlAccessibleChild::getLocation() throw( RuntimeException, std::exception )
626 : {
627 : // no guard -> done in getBoundingBox()
628 0 : return AWTPoint( GetBoundingBox().TopLeft() );
629 : }
630 :
631 0 : awt::Point SAL_CALL SvxPixelCtlAccessibleChild::getLocationOnScreen() throw( RuntimeException, std::exception )
632 : {
633 : // no guard -> done in getBoundingBoxOnScreen()
634 0 : return AWTPoint( GetBoundingBoxOnScreen().TopLeft() );
635 : }
636 :
637 0 : awt::Size SAL_CALL SvxPixelCtlAccessibleChild::getSize() throw( RuntimeException, std::exception )
638 : {
639 : // no guard -> done in getBoundingBox()
640 0 : return AWTSize( GetBoundingBox().GetSize() );
641 : }
642 :
643 0 : void SAL_CALL SvxPixelCtlAccessibleChild::grabFocus() throw( RuntimeException, std::exception )
644 : {
645 0 : }
646 :
647 0 : sal_Int32 SvxPixelCtlAccessibleChild::getForeground( )
648 : throw (::com::sun::star::uno::RuntimeException, std::exception)
649 : {
650 : //::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
651 0 : ::osl::MutexGuard aGuard( m_aMutex );
652 0 : ThrowExceptionIfNotAlive();
653 0 : return mrParentWindow.GetControlForeground().GetColor();
654 : }
655 0 : sal_Int32 SvxPixelCtlAccessibleChild::getBackground( )
656 : throw (::com::sun::star::uno::RuntimeException, std::exception)
657 : {
658 : //::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
659 0 : ::osl::MutexGuard aGuard( m_aMutex );
660 :
661 0 : ThrowExceptionIfNotAlive();
662 0 : return mrParentWindow.GetControlBackground().GetColor();
663 : }
664 :
665 : //===== XAccessibleContext ==================================================
666 :
667 0 : sal_Int32 SAL_CALL SvxPixelCtlAccessibleChild::getAccessibleChildCount( void ) throw( RuntimeException, std::exception )
668 : {
669 0 : return 0;
670 : }
671 :
672 0 : uno::Reference< XAccessible > SAL_CALL SvxPixelCtlAccessibleChild::getAccessibleChild( sal_Int32 )
673 : throw (lang::IndexOutOfBoundsException, uno::RuntimeException, std::exception)
674 : {
675 0 : throw lang::IndexOutOfBoundsException();
676 : }
677 :
678 0 : uno::Reference< XAccessible > SAL_CALL SvxPixelCtlAccessibleChild::getAccessibleParent( void ) throw( RuntimeException, std::exception )
679 : {
680 0 : return mxParent;
681 : }
682 :
683 0 : sal_Int32 SAL_CALL SvxPixelCtlAccessibleChild::getAccessibleIndexInParent( void ) throw( RuntimeException, std::exception )
684 : {
685 0 : return mnIndexInParent;
686 : }
687 :
688 0 : sal_Int16 SAL_CALL SvxPixelCtlAccessibleChild::getAccessibleRole( void ) throw( RuntimeException, std::exception )
689 : {
690 0 : return AccessibleRole::CHECK_BOX;
691 : }
692 :
693 0 : OUString SAL_CALL SvxPixelCtlAccessibleChild::getAccessibleDescription( void ) throw( RuntimeException, std::exception )
694 : {
695 0 : ::osl::MutexGuard aGuard( m_aMutex );
696 :
697 0 : return GetName();
698 : }
699 :
700 0 : OUString SAL_CALL SvxPixelCtlAccessibleChild::getAccessibleName( void ) throw( RuntimeException, std::exception )
701 : {
702 0 : ::osl::MutexGuard aGuard( m_aMutex );
703 0 : return GetName();
704 : }
705 :
706 : /** Return empty uno::Reference to indicate that the relation set is not
707 : supported.
708 : */
709 0 : uno::Reference<XAccessibleRelationSet> SAL_CALL SvxPixelCtlAccessibleChild::getAccessibleRelationSet( void ) throw( RuntimeException, std::exception )
710 : {
711 0 : return uno::Reference< XAccessibleRelationSet >();
712 : }
713 :
714 0 : uno::Reference< XAccessibleStateSet > SAL_CALL SvxPixelCtlAccessibleChild::getAccessibleStateSet( void ) throw( RuntimeException, std::exception )
715 : {
716 0 : ::osl::MutexGuard aGuard( m_aMutex );
717 0 : utl::AccessibleStateSetHelper* pStateSetHelper = new utl::AccessibleStateSetHelper;
718 :
719 0 : if( IsAlive() )
720 : {
721 :
722 0 : pStateSetHelper->AddState( AccessibleStateType::TRANSIENT );
723 0 : pStateSetHelper->AddState( AccessibleStateType::ENABLED );
724 0 : pStateSetHelper->AddState( AccessibleStateType::OPAQUE );
725 0 : pStateSetHelper->AddState( AccessibleStateType::SELECTABLE );
726 0 : pStateSetHelper->AddState( AccessibleStateType::SHOWING );
727 0 : pStateSetHelper->AddState( AccessibleStateType::VISIBLE );
728 :
729 0 : long nIndex = mrParentWindow.GetFoucsPosIndex();
730 0 : if ( nIndex == mnIndexInParent)
731 : {
732 0 : pStateSetHelper->AddState( AccessibleStateType::SELECTED );
733 : }
734 0 : if (mrParentWindow.GetBitmapPixel(sal_uInt16(mnIndexInParent)))
735 : {
736 0 : pStateSetHelper->AddState( AccessibleStateType::CHECKED );
737 : }
738 : }
739 : else
740 0 : pStateSetHelper->AddState( AccessibleStateType::DEFUNC );
741 :
742 0 : return pStateSetHelper;
743 : }
744 :
745 0 : lang::Locale SAL_CALL SvxPixelCtlAccessibleChild::getLocale( void ) throw( IllegalAccessibleComponentStateException, RuntimeException, std::exception )
746 : {
747 0 : ::osl::MutexGuard aGuard( m_aMutex );
748 0 : if( mxParent.is() )
749 : {
750 0 : uno::Reference< XAccessibleContext > xParentContext( mxParent->getAccessibleContext() );
751 0 : if( xParentContext.is() )
752 0 : return xParentContext->getLocale();
753 : }
754 :
755 : // No locale and no parent. Therefore throw exception to indicate this
756 : // cluelessness.
757 0 : throw IllegalAccessibleComponentStateException();
758 : }
759 :
760 0 : void SAL_CALL SvxPixelCtlAccessibleChild::addAccessibleEventListener( const uno::Reference< XAccessibleEventListener >& xListener )
761 : throw( RuntimeException, std::exception )
762 : {
763 0 : if (xListener.is())
764 : {
765 0 : ::osl::MutexGuard aGuard( m_aMutex );
766 0 : if (!mnClientId)
767 0 : mnClientId = comphelper::AccessibleEventNotifier::registerClient( );
768 0 : comphelper::AccessibleEventNotifier::addEventListener( mnClientId, xListener );
769 : }
770 0 : }
771 :
772 0 : void SAL_CALL SvxPixelCtlAccessibleChild::removeAccessibleEventListener( const uno::Reference< XAccessibleEventListener >& xListener )
773 : throw( RuntimeException, std::exception )
774 : {
775 0 : if (xListener.is())
776 : {
777 0 : ::osl::MutexGuard aGuard( m_aMutex );
778 :
779 0 : sal_Int32 nListenerCount = comphelper::AccessibleEventNotifier::removeEventListener( mnClientId, xListener );
780 0 : if ( !nListenerCount )
781 : {
782 : // no listeners anymore
783 : // -> revoke ourself. This may lead to the notifier thread dying (if we were the last client),
784 : // and at least to us not firing any events anymore, in case somebody calls
785 : // NotifyAccessibleEvent, again
786 0 : comphelper::AccessibleEventNotifier::revokeClient( mnClientId );
787 0 : mnClientId = 0;
788 0 : }
789 : }
790 0 : }
791 :
792 :
793 : //===== XServiceInfo ========================================================
794 0 : OUString SAL_CALL SvxPixelCtlAccessibleChild::getImplementationName( void ) throw( RuntimeException, std::exception )
795 : {
796 0 : return OUString( RTL_CONSTASCII_USTRINGPARAM( "SvxPixelCtlAccessibleChild" ) );
797 : }
798 :
799 0 : sal_Bool SAL_CALL SvxPixelCtlAccessibleChild::supportsService( const OUString& rServiceName ) throw( RuntimeException, std::exception )
800 : {
801 0 : return cppu::supportsService( this, rServiceName );
802 : }
803 :
804 0 : Sequence< OUString > SAL_CALL SvxPixelCtlAccessibleChild::getSupportedServiceNames( void ) throw( RuntimeException, std::exception )
805 : {
806 0 : uno::Sequence< OUString > aRet(3);
807 0 : OUString* pArray = aRet.getArray();
808 0 : pArray[0] = "Accessible";
809 0 : pArray[1] = "AccessibleContext";
810 0 : pArray[2] = "AccessibleComponent";
811 0 : return aRet;
812 : }
813 :
814 : //===== internal ============================================================
815 :
816 0 : void SvxPixelCtlAccessibleChild::CommitChange( const AccessibleEventObject& rEvent )
817 : {
818 0 : if (mnClientId)
819 0 : comphelper::AccessibleEventNotifier::addEvent( mnClientId, rEvent );
820 0 : }
821 :
822 0 : void SAL_CALL SvxPixelCtlAccessibleChild::disposing()
823 : {
824 0 : if( !rBHelper.bDisposed )
825 : {
826 0 : ::osl::MutexGuard aGuard( m_aMutex );
827 :
828 : // Send a disposing to all listeners.
829 0 : if ( mnClientId )
830 : {
831 0 : comphelper::AccessibleEventNotifier::revokeClientNotifyDisposing( mnClientId, *this );
832 0 : mnClientId = 0;
833 : }
834 :
835 0 : mxParent = uno::Reference< XAccessible >();
836 :
837 0 : delete mpBoundingBox;
838 : }
839 0 : }
840 :
841 0 : void SvxPixelCtlAccessibleChild::ThrowExceptionIfNotAlive( void ) throw( lang::DisposedException )
842 : {
843 0 : if( IsNotAlive() )
844 0 : throw lang::DisposedException();
845 0 : }
846 :
847 0 : Rectangle SvxPixelCtlAccessibleChild::GetBoundingBoxOnScreen( void ) throw( RuntimeException )
848 : {
849 0 : ::osl::MutexGuard aGuard( m_aMutex );
850 :
851 : // no ThrowExceptionIfNotAlive() because its done in GetBoundingBox()
852 0 : Rectangle aRect( GetBoundingBox() );
853 :
854 0 : return Rectangle( mrParentWindow.OutputToAbsoluteScreenPixel( aRect.TopLeft() ), aRect.GetSize() );
855 : }
856 :
857 0 : Rectangle SvxPixelCtlAccessibleChild::GetBoundingBox( void ) throw( RuntimeException )
858 : {
859 : // no guard necessary, because no one changes mpBoundingBox after creating it
860 0 : ThrowExceptionIfNotAlive();
861 :
862 0 : return *mpBoundingBox;
863 : }
864 :
865 0 : OUString SvxPixelCtlAccessibleChild::GetName()
866 : {
867 0 : sal_Int32 nXIndex = mnIndexInParent % mrParentWindow.GetLineCount();
868 0 : sal_Int32 nYIndex = mnIndexInParent / mrParentWindow.GetLineCount();
869 :
870 0 : OUString str;
871 0 : str += "(";
872 0 : str += OUString::number(nXIndex);
873 0 : str += ",";
874 0 : str += OUString::number(nYIndex);
875 0 : str += ")";
876 0 : return str;
877 0 : }
878 :
879 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|