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 "AccessibleDataPilotControl.hxx"
21 : #include "fieldwnd.hxx"
22 :
23 : #include <com/sun/star/accessibility/AccessibleRole.hpp>
24 : #include <com/sun/star/accessibility/AccessibleStateType.hpp>
25 : #include <com/sun/star/accessibility/AccessibleEventId.hpp>
26 :
27 : #include <unotools/accessiblestatesethelper.hxx>
28 : #include <comphelper/servicehelper.hxx>
29 : #include <tools/gen.hxx>
30 : #include <toolkit/helper/convert.hxx>
31 : #include <vcl/svapp.hxx>
32 :
33 : using namespace ::com::sun::star;
34 : using namespace ::com::sun::star::accessibility;
35 :
36 : class ScAccessibleDataPilotButton
37 : : public ScAccessibleContextBase
38 : {
39 : public:
40 : //===== internal ========================================================
41 : ScAccessibleDataPilotButton(
42 : const ::com::sun::star::uno::Reference<
43 : ::com::sun::star::accessibility::XAccessible>& rxParent,
44 : ScDPFieldControlBase* pFieldWindow,
45 : sal_Int32 nIndex);
46 :
47 : virtual void Init();
48 :
49 : using ScAccessibleContextBase::disposing;
50 : virtual void SAL_CALL disposing();
51 :
52 0 : void SetIndex(sal_Int32 nIndex) { mnIndex = nIndex; }
53 : void NameChanged();
54 : void SetFocused();
55 : void ResetFocused();
56 : protected:
57 : virtual ~ScAccessibleDataPilotButton(void);
58 : public:
59 : ///===== XAccessibleComponent ============================================
60 :
61 : virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible >
62 : SAL_CALL getAccessibleAtPoint(
63 : const ::com::sun::star::awt::Point& rPoint )
64 : throw (::com::sun::star::uno::RuntimeException);
65 :
66 : virtual sal_Bool SAL_CALL isVisible( )
67 : throw (::com::sun::star::uno::RuntimeException);
68 :
69 : virtual void SAL_CALL grabFocus( )
70 : throw (::com::sun::star::uno::RuntimeException);
71 :
72 : virtual sal_Int32 SAL_CALL getForeground( )
73 : throw (::com::sun::star::uno::RuntimeException);
74 :
75 : virtual sal_Int32 SAL_CALL getBackground( )
76 : throw (::com::sun::star::uno::RuntimeException);
77 :
78 : ///===== XAccessibleContext ==============================================
79 :
80 : /// Return the number of currently visible children.
81 : virtual sal_Int32 SAL_CALL
82 : getAccessibleChildCount(void) throw (::com::sun::star::uno::RuntimeException);
83 :
84 : /// Return the specified child or NULL if index is invalid.
85 : virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible> SAL_CALL
86 : getAccessibleChild(sal_Int32 nIndex)
87 : throw (::com::sun::star::uno::RuntimeException,
88 : ::com::sun::star::lang::IndexOutOfBoundsException);
89 :
90 : /// Return this objects index among the parents children.
91 : virtual sal_Int32 SAL_CALL
92 : getAccessibleIndexInParent(void)
93 : throw (::com::sun::star::uno::RuntimeException);
94 :
95 : /// Return the set of current states.
96 : virtual ::com::sun::star::uno::Reference<
97 : ::com::sun::star::accessibility::XAccessibleStateSet> SAL_CALL
98 : getAccessibleStateSet(void)
99 : throw (::com::sun::star::uno::RuntimeException);
100 :
101 : ///===== XServiceInfo ====================================================
102 :
103 : /** Returns an identifier for the implementation of this object.
104 : */
105 : virtual ::rtl::OUString SAL_CALL
106 : getImplementationName(void)
107 : throw (::com::sun::star::uno::RuntimeException);
108 :
109 : ///===== XTypeProvider ===================================================
110 :
111 : /** Returns a implementation id.
112 : */
113 : virtual ::com::sun::star::uno::Sequence<sal_Int8> SAL_CALL
114 : getImplementationId(void)
115 : throw (::com::sun::star::uno::RuntimeException);
116 :
117 : protected:
118 : /// Return this object's description.
119 : virtual ::rtl::OUString SAL_CALL
120 : createAccessibleDescription(void)
121 : throw (::com::sun::star::uno::RuntimeException);
122 :
123 : /// Return the object's current name.
124 : virtual ::rtl::OUString SAL_CALL
125 : createAccessibleName(void)
126 : throw (::com::sun::star::uno::RuntimeException);
127 :
128 : /// Return the object's current bounding box relative to the desktop.
129 : virtual Rectangle GetBoundingBoxOnScreen(void) const
130 : throw (::com::sun::star::uno::RuntimeException);
131 :
132 : /// Return the object's current bounding box relative to the parent object.
133 : virtual Rectangle GetBoundingBox(void) const
134 : throw (::com::sun::star::uno::RuntimeException);
135 :
136 : private:
137 : ScDPFieldControlBase* mpFieldWindow;
138 : sal_Int32 mnIndex;
139 : };
140 :
141 : //===== internal ========================================================
142 0 : ScAccessibleDataPilotControl::ScAccessibleDataPilotControl(
143 : const uno::Reference<XAccessible>& rxParent,
144 : ScDPFieldControlBase* pFieldWindow)
145 : :
146 : ScAccessibleContextBase(rxParent, AccessibleRole::GROUP_BOX),
147 0 : mpFieldWindow(pFieldWindow)
148 : {
149 0 : if (mpFieldWindow)
150 0 : maChildren.resize(mpFieldWindow->GetFieldCount());
151 0 : }
152 :
153 0 : ScAccessibleDataPilotControl::~ScAccessibleDataPilotControl(void)
154 : {
155 0 : if (!IsDefunc() && !rBHelper.bInDispose)
156 : {
157 : // increment refcount to prevent double call off dtor
158 0 : osl_atomic_increment( &m_refCount );
159 : // call dispose to inform object wich have a weak reference to this object
160 0 : dispose();
161 : }
162 0 : }
163 :
164 0 : void ScAccessibleDataPilotControl::Init()
165 : {
166 0 : }
167 :
168 0 : void SAL_CALL ScAccessibleDataPilotControl::disposing()
169 : {
170 0 : SolarMutexGuard aGuard;
171 0 : mpFieldWindow = NULL;
172 :
173 0 : ScAccessibleContextBase::disposing();
174 0 : }
175 :
176 0 : void ScAccessibleDataPilotControl::AddField(sal_Int32 nNewIndex)
177 : {
178 0 : sal_Bool bAdded(sal_False);
179 0 : if (static_cast<size_t>(nNewIndex) == maChildren.size())
180 : {
181 0 : maChildren.push_back(AccessibleWeak());
182 0 : bAdded = sal_True;
183 : }
184 0 : else if (static_cast<size_t>(nNewIndex) < maChildren.size())
185 : {
186 0 : ::std::vector < AccessibleWeak >::iterator aItr = maChildren.begin() + nNewIndex;
187 0 : maChildren.insert(aItr, AccessibleWeak());
188 :
189 0 : ::std::vector < AccessibleWeak >::iterator aEndItr = maChildren.end();
190 0 : aItr = maChildren.begin() + nNewIndex + 1;
191 0 : uno::Reference< XAccessible > xTempAcc;
192 0 : sal_Int32 nIndex = nNewIndex + 1;
193 0 : while (aItr != aEndItr)
194 : {
195 0 : xTempAcc = aItr->xWeakAcc;
196 0 : if (xTempAcc.is() && aItr->pAcc)
197 0 : aItr->pAcc->SetIndex(nIndex);
198 0 : ++nIndex;
199 0 : ++aItr;
200 : }
201 0 : bAdded = sal_True;
202 : }
203 : else
204 : {
205 : OSL_FAIL("did not recognize a child count change");
206 : }
207 :
208 0 : if (bAdded)
209 : {
210 0 : AccessibleEventObject aEvent;
211 0 : aEvent.EventId = AccessibleEventId::CHILD;
212 0 : aEvent.Source = uno::Reference< XAccessibleContext >(this);
213 0 : aEvent.NewValue <<= getAccessibleChild(nNewIndex);
214 :
215 0 : CommitChange(aEvent); // new child - event
216 : }
217 0 : }
218 :
219 0 : void ScAccessibleDataPilotControl::MoveField(sal_Int32 nOldIndex, sal_Int32 nNewIndex)
220 : {
221 0 : RemoveField(nOldIndex);
222 0 : if (nNewIndex > nOldIndex)
223 0 : --nNewIndex;
224 0 : AddField(nNewIndex);
225 0 : }
226 :
227 0 : void ScAccessibleDataPilotControl::RemoveField(sal_Int32 nOldIndex)
228 : {
229 0 : sal_Bool bRemoved(sal_False);
230 0 : uno::Reference< XAccessible > xTempAcc;
231 0 : ScAccessibleDataPilotButton* pField = NULL;
232 0 : if (static_cast<size_t>(nOldIndex) < maChildren.size())
233 : {
234 0 : xTempAcc = getAccessibleChild(nOldIndex);
235 0 : pField = maChildren[nOldIndex].pAcc;
236 :
237 0 : ::std::vector < AccessibleWeak >::iterator aItr = maChildren.begin() + nOldIndex;
238 0 : aItr = maChildren.erase(aItr);
239 :
240 0 : ::std::vector < AccessibleWeak >::iterator aEndItr = maChildren.end();
241 0 : uno::Reference< XAccessible > xItrAcc;
242 0 : while (aItr != aEndItr)
243 : {
244 0 : xItrAcc = aItr->xWeakAcc;
245 0 : if (xItrAcc.is() && aItr->pAcc)
246 0 : aItr->pAcc->SetIndex(nOldIndex);
247 0 : ++nOldIndex;
248 0 : ++aItr;
249 : }
250 0 : bRemoved = sal_True;
251 : }
252 : else
253 : {
254 : OSL_FAIL("did not recognize a child count change");
255 : }
256 :
257 0 : if (bRemoved)
258 : {
259 0 : AccessibleEventObject aEvent;
260 0 : aEvent.EventId = AccessibleEventId::CHILD;
261 0 : aEvent.Source = uno::Reference< XAccessibleContext >(this);
262 0 : aEvent.NewValue <<= xTempAcc;
263 :
264 0 : CommitChange(aEvent); // gone child - event
265 :
266 0 : if (pField)
267 0 : pField->dispose();
268 0 : }
269 0 : }
270 :
271 0 : void ScAccessibleDataPilotControl::FieldFocusChange(sal_Int32 nOldIndex, sal_Int32 nNewIndex)
272 : {
273 : OSL_ENSURE(static_cast<size_t>(nOldIndex) < maChildren.size() &&
274 : static_cast<size_t>(nNewIndex) < maChildren.size(), "did not recognize a child count change");
275 :
276 0 : uno::Reference < XAccessible > xTempAcc = maChildren[nOldIndex].xWeakAcc;
277 0 : if (xTempAcc.is() && maChildren[nOldIndex].pAcc)
278 0 : maChildren[nOldIndex].pAcc->ResetFocused();
279 :
280 0 : xTempAcc = maChildren[nNewIndex].xWeakAcc;
281 0 : if (xTempAcc.is() && maChildren[nNewIndex].pAcc)
282 0 : maChildren[nNewIndex].pAcc->SetFocused();
283 0 : }
284 :
285 0 : void ScAccessibleDataPilotControl::FieldNameChange(sal_Int32 nIndex)
286 : {
287 : OSL_ENSURE(static_cast<size_t>(nIndex) < maChildren.size(), "did not recognize a child count change");
288 :
289 0 : uno::Reference < XAccessible > xTempAcc = maChildren[nIndex].xWeakAcc;
290 0 : if (xTempAcc.is() && maChildren[nIndex].pAcc)
291 0 : maChildren[nIndex].pAcc->ChangeName();
292 0 : }
293 :
294 0 : void ScAccessibleDataPilotControl::GotFocus()
295 : {
296 0 : if (mpFieldWindow)
297 : {
298 : OSL_ENSURE(mpFieldWindow->GetFieldCount() == maChildren.size(), "did not recognize a child count change");
299 :
300 0 : sal_Int32 nIndex(mpFieldWindow->GetSelectedField());
301 0 : uno::Reference < XAccessible > xTempAcc = maChildren[nIndex].xWeakAcc;
302 0 : if (xTempAcc.is() && maChildren[nIndex].pAcc)
303 0 : maChildren[nIndex].pAcc->SetFocused();
304 : }
305 0 : }
306 :
307 0 : void ScAccessibleDataPilotControl::LostFocus()
308 : {
309 0 : if (mpFieldWindow)
310 : {
311 : OSL_ENSURE(mpFieldWindow->GetFieldCount() == maChildren.size(), "did not recognize a child count change");
312 :
313 0 : sal_Int32 nIndex(mpFieldWindow->GetSelectedField());
314 0 : uno::Reference < XAccessible > xTempAcc = maChildren[nIndex].xWeakAcc;
315 0 : if (xTempAcc.is() && maChildren[nIndex].pAcc)
316 0 : maChildren[nIndex].pAcc->ResetFocused();
317 : }
318 0 : }
319 :
320 : ///===== XAccessibleComponent ============================================
321 :
322 0 : uno::Reference< XAccessible > SAL_CALL ScAccessibleDataPilotControl::getAccessibleAtPoint(
323 : const awt::Point& rPoint )
324 : throw (uno::RuntimeException)
325 : {
326 0 : uno::Reference<XAccessible> xAcc;
327 0 : if (containsPoint(rPoint))
328 : {
329 0 : SolarMutexGuard aGuard;
330 0 : IsObjectValid();
331 0 : if (mpFieldWindow)
332 : {
333 0 : Point aAbsPoint(VCLPoint(rPoint));
334 0 : Point aControlEdge(GetBoundingBoxOnScreen().TopLeft());
335 0 : Point aRelPoint(aAbsPoint - aControlEdge);
336 0 : size_t nChildIndex = mpFieldWindow->GetFieldIndex(aRelPoint );
337 0 : if( nChildIndex != PIVOTFIELD_INVALID )
338 0 : xAcc = getAccessibleChild(static_cast< long >( nChildIndex ));
339 0 : }
340 : }
341 0 : return xAcc;
342 : }
343 :
344 0 : sal_Bool SAL_CALL ScAccessibleDataPilotControl::isVisible( )
345 : throw (uno::RuntimeException)
346 : {
347 0 : return sal_True;
348 : }
349 :
350 0 : void SAL_CALL ScAccessibleDataPilotControl::grabFocus( )
351 : throw (uno::RuntimeException)
352 : {
353 0 : SolarMutexGuard aGuard;
354 0 : IsObjectValid();
355 0 : if (mpFieldWindow)
356 0 : mpFieldWindow->GrabFocus();
357 0 : }
358 :
359 0 : sal_Int32 SAL_CALL ScAccessibleDataPilotControl::getForeground( )
360 : throw (uno::RuntimeException)
361 : {
362 0 : SolarMutexGuard aGuard;
363 0 : IsObjectValid();
364 0 : sal_Int32 nColor(0);
365 0 : if (mpFieldWindow)
366 : {
367 0 : nColor = mpFieldWindow->GetSettings().GetStyleSettings().GetWindowTextColor().GetColor();
368 : }
369 0 : return nColor;
370 : }
371 :
372 0 : sal_Int32 SAL_CALL ScAccessibleDataPilotControl::getBackground( )
373 : throw (uno::RuntimeException)
374 : {
375 0 : SolarMutexGuard aGuard;
376 0 : IsObjectValid();
377 0 : sal_Int32 nColor(0);
378 0 : if (mpFieldWindow)
379 : {
380 0 : const StyleSettings& rStyleSett = mpFieldWindow->GetSettings().GetStyleSettings();
381 0 : nColor = (mpFieldWindow->GetFieldType() == PIVOTFIELDTYPE_SELECT) ? rStyleSett.GetFaceColor().GetColor() : rStyleSett.GetWindowColor().GetColor();
382 : }
383 0 : return nColor;
384 : }
385 :
386 : ///===== XAccessibleContext ==============================================
387 :
388 0 : sal_Int32 SAL_CALL ScAccessibleDataPilotControl::getAccessibleChildCount(void)
389 : throw (uno::RuntimeException)
390 : {
391 0 : SolarMutexGuard aGuard;
392 0 : IsObjectValid();
393 0 : if (mpFieldWindow)
394 0 : return mpFieldWindow->GetFieldCount();
395 : else
396 0 : return 0;
397 : }
398 :
399 0 : uno::Reference< XAccessible> SAL_CALL ScAccessibleDataPilotControl::getAccessibleChild(sal_Int32 nIndex)
400 : throw (uno::RuntimeException, lang::IndexOutOfBoundsException)
401 : {
402 0 : SolarMutexGuard aGuard;
403 0 : IsObjectValid();
404 0 : uno::Reference<XAccessible> xAcc;
405 0 : if (mpFieldWindow)
406 : {
407 0 : if (nIndex < 0 || static_cast< size_t >( nIndex ) >= mpFieldWindow->GetFieldCount())
408 0 : throw lang::IndexOutOfBoundsException();
409 :
410 : OSL_ENSURE(mpFieldWindow->GetFieldCount() == maChildren.size(), "did not recognize a child count change");
411 :
412 0 : uno::Reference < XAccessible > xTempAcc = maChildren[nIndex].xWeakAcc;
413 0 : if (!xTempAcc.is())
414 : {
415 0 : maChildren[nIndex].pAcc = new ScAccessibleDataPilotButton(this, mpFieldWindow, nIndex);
416 0 : xTempAcc = maChildren[nIndex].pAcc;
417 0 : maChildren[nIndex].xWeakAcc = xTempAcc;
418 : }
419 :
420 0 : xAcc = xTempAcc;
421 : }
422 0 : return xAcc;
423 : }
424 :
425 0 : uno::Reference<XAccessibleStateSet> SAL_CALL ScAccessibleDataPilotControl::getAccessibleStateSet(void)
426 : throw (uno::RuntimeException)
427 : {
428 0 : SolarMutexGuard aGuard;
429 0 : IsObjectValid();
430 :
431 0 : utl::AccessibleStateSetHelper* pStateSet = new utl::AccessibleStateSetHelper();
432 :
433 0 : if (IsDefunc())
434 0 : pStateSet->AddState(AccessibleStateType::DEFUNC);
435 : else
436 : {
437 0 : pStateSet->AddState(AccessibleStateType::ENABLED);
438 0 : pStateSet->AddState(AccessibleStateType::OPAQUE);
439 0 : if (isShowing())
440 0 : pStateSet->AddState(AccessibleStateType::SHOWING);
441 0 : if (isVisible())
442 0 : pStateSet->AddState(AccessibleStateType::VISIBLE);
443 : }
444 :
445 0 : return pStateSet;
446 : }
447 :
448 : ///===== XServiceInfo ====================================================
449 :
450 0 : ::rtl::OUString SAL_CALL ScAccessibleDataPilotControl::getImplementationName(void)
451 : throw (uno::RuntimeException)
452 : {
453 0 : return rtl::OUString(RTL_CONSTASCII_USTRINGPARAM ("ScAccessibleDataPilotControl"));
454 : }
455 :
456 : ///===== XTypeProvider ===================================================
457 :
458 : namespace
459 : {
460 : class theScAccessibleDataPilotControlImplementationId : public rtl::Static< UnoTunnelIdInit, theScAccessibleDataPilotControlImplementationId > {};
461 : }
462 :
463 0 : uno::Sequence<sal_Int8> SAL_CALL ScAccessibleDataPilotControl::getImplementationId(void)
464 : throw (uno::RuntimeException)
465 : {
466 0 : return theScAccessibleDataPilotControlImplementationId::get().getSeq();
467 : }
468 :
469 : //===== internal ========================================================
470 :
471 0 : ::rtl::OUString SAL_CALL ScAccessibleDataPilotControl::createAccessibleDescription(void)
472 : throw (uno::RuntimeException)
473 : {
474 0 : SolarMutexGuard aGuard;
475 0 : IsObjectValid();
476 0 : if (mpFieldWindow)
477 0 : return mpFieldWindow->GetDescription();
478 :
479 0 : return rtl::OUString();
480 : }
481 :
482 0 : ::rtl::OUString SAL_CALL ScAccessibleDataPilotControl::createAccessibleName(void)
483 : throw (uno::RuntimeException)
484 : {
485 0 : SolarMutexGuard aGuard;
486 0 : IsObjectValid();
487 0 : if (mpFieldWindow)
488 0 : return mpFieldWindow->GetName();
489 :
490 0 : return rtl::OUString();
491 : }
492 :
493 0 : Rectangle ScAccessibleDataPilotControl::GetBoundingBoxOnScreen(void) const
494 : throw (uno::RuntimeException)
495 : {
496 0 : if (mpFieldWindow)
497 0 : return mpFieldWindow->GetWindowExtentsRelative(NULL);
498 : else
499 0 : return Rectangle();
500 : }
501 :
502 0 : Rectangle ScAccessibleDataPilotControl::GetBoundingBox(void) const
503 : throw (uno::RuntimeException)
504 : {
505 0 : if (mpFieldWindow)
506 0 : return mpFieldWindow->GetWindowExtentsRelative(mpFieldWindow->GetAccessibleParentWindow());
507 : else
508 0 : return Rectangle();
509 : }
510 :
511 :
512 : //===============================================================================
513 :
514 0 : ScAccessibleDataPilotButton::ScAccessibleDataPilotButton(
515 : const ::com::sun::star::uno::Reference<
516 : ::com::sun::star::accessibility::XAccessible>& rxParent,
517 : ScDPFieldControlBase* pFieldWindow,
518 : sal_Int32 nIndex)
519 : : ScAccessibleContextBase(rxParent, AccessibleRole::PUSH_BUTTON),
520 : mpFieldWindow(pFieldWindow),
521 0 : mnIndex(nIndex)
522 : {
523 0 : }
524 :
525 0 : ScAccessibleDataPilotButton::~ScAccessibleDataPilotButton(void)
526 : {
527 0 : if (!IsDefunc() && !rBHelper.bInDispose)
528 : {
529 : // increment refcount to prevent double call off dtor
530 0 : osl_atomic_increment( &m_refCount );
531 : // call dispose to inform object wich have a weak reference to this object
532 0 : dispose();
533 : }
534 0 : }
535 :
536 0 : void ScAccessibleDataPilotButton::Init()
537 : {
538 0 : }
539 :
540 0 : void SAL_CALL ScAccessibleDataPilotButton::disposing()
541 : {
542 0 : SolarMutexGuard aGuard;
543 0 : mpFieldWindow = NULL;
544 :
545 0 : ScAccessibleContextBase::disposing();
546 0 : }
547 :
548 0 : void ScAccessibleDataPilotButton::SetFocused()
549 : {
550 0 : CommitFocusGained();
551 0 : }
552 :
553 0 : void ScAccessibleDataPilotButton::ResetFocused()
554 : {
555 0 : CommitFocusLost();
556 0 : }
557 :
558 : ///===== XAccessibleComponent ============================================
559 :
560 0 : uno::Reference< XAccessible > SAL_CALL ScAccessibleDataPilotButton::getAccessibleAtPoint(
561 : const ::com::sun::star::awt::Point& /* rPoint */ )
562 : throw (::com::sun::star::uno::RuntimeException)
563 : {
564 0 : return NULL;
565 : }
566 :
567 0 : sal_Bool SAL_CALL ScAccessibleDataPilotButton::isVisible( )
568 : throw (::com::sun::star::uno::RuntimeException)
569 : {
570 0 : return sal_True;
571 : }
572 :
573 0 : void SAL_CALL ScAccessibleDataPilotButton::grabFocus( )
574 : throw (::com::sun::star::uno::RuntimeException)
575 : {
576 0 : SolarMutexGuard aGuard;
577 0 : IsObjectValid();
578 0 : if (mpFieldWindow)
579 : {
580 0 : mpFieldWindow->GrabFocusAndSelect(getAccessibleIndexInParent());
581 0 : }
582 0 : }
583 :
584 0 : sal_Int32 SAL_CALL ScAccessibleDataPilotButton::getForeground( )
585 : throw (uno::RuntimeException)
586 : {
587 0 : SolarMutexGuard aGuard;
588 0 : IsObjectValid();
589 0 : sal_Int32 nColor(0);
590 0 : if (mpFieldWindow)
591 : {
592 0 : nColor = mpFieldWindow->GetSettings().GetStyleSettings().GetButtonTextColor().GetColor();
593 : }
594 0 : return nColor;
595 : }
596 :
597 0 : sal_Int32 SAL_CALL ScAccessibleDataPilotButton::getBackground( )
598 : throw (uno::RuntimeException)
599 : {
600 0 : SolarMutexGuard aGuard;
601 0 : IsObjectValid();
602 0 : sal_Int32 nColor(0);
603 0 : if (mpFieldWindow)
604 : {
605 0 : nColor = mpFieldWindow->GetSettings().GetStyleSettings().GetFaceColor().GetColor();
606 : }
607 0 : return nColor;
608 : }
609 :
610 : ///===== XAccessibleContext ==============================================
611 :
612 0 : sal_Int32 SAL_CALL ScAccessibleDataPilotButton::getAccessibleChildCount(void)
613 : throw (::com::sun::star::uno::RuntimeException)
614 : {
615 0 : return 0;
616 : }
617 :
618 0 : uno::Reference< XAccessible> SAL_CALL ScAccessibleDataPilotButton::getAccessibleChild(sal_Int32 /* nIndex */)
619 : throw (::com::sun::star::uno::RuntimeException,
620 : ::com::sun::star::lang::IndexOutOfBoundsException)
621 : {
622 0 : throw lang::IndexOutOfBoundsException();
623 : }
624 :
625 0 : sal_Int32 SAL_CALL ScAccessibleDataPilotButton::getAccessibleIndexInParent(void)
626 : throw (::com::sun::star::uno::RuntimeException)
627 : {
628 0 : SolarMutexGuard aGuard;
629 0 : IsObjectValid();
630 0 : return mnIndex;
631 : }
632 :
633 0 : uno::Reference<XAccessibleStateSet> SAL_CALL ScAccessibleDataPilotButton::getAccessibleStateSet(void)
634 : throw (::com::sun::star::uno::RuntimeException)
635 : {
636 0 : SolarMutexGuard aGuard;
637 0 : IsObjectValid();
638 :
639 0 : utl::AccessibleStateSetHelper* pStateSet = new utl::AccessibleStateSetHelper();
640 :
641 0 : if (IsDefunc())
642 0 : pStateSet->AddState(AccessibleStateType::DEFUNC);
643 : else
644 : {
645 0 : pStateSet->AddState(AccessibleStateType::ENABLED);
646 0 : pStateSet->AddState(AccessibleStateType::OPAQUE);
647 0 : pStateSet->AddState(AccessibleStateType::FOCUSABLE);
648 0 : if (mpFieldWindow && (sal::static_int_cast<sal_Int32>(mpFieldWindow->GetSelectedField()) == mnIndex))
649 0 : pStateSet->AddState(AccessibleStateType::FOCUSED);
650 0 : if (isShowing())
651 0 : pStateSet->AddState(AccessibleStateType::SHOWING);
652 0 : if (isVisible())
653 0 : pStateSet->AddState(AccessibleStateType::VISIBLE);
654 : }
655 :
656 0 : return pStateSet;
657 : }
658 :
659 : ///===== XServiceInfo ====================================================
660 :
661 0 : ::rtl::OUString SAL_CALL ScAccessibleDataPilotButton::getImplementationName(void)
662 : throw (::com::sun::star::uno::RuntimeException)
663 : {
664 0 : return rtl::OUString(RTL_CONSTASCII_USTRINGPARAM ("ScAccessibleDataPilotButton"));
665 : }
666 :
667 : ///===== XTypeProvider ===================================================
668 :
669 : namespace
670 : {
671 : class theScAccessibleDataPilotButtonImplementationId : public rtl::Static< UnoTunnelIdInit, theScAccessibleDataPilotButtonImplementationId > {};
672 : }
673 :
674 0 : uno::Sequence<sal_Int8> SAL_CALL ScAccessibleDataPilotButton::getImplementationId(void)
675 : throw (::com::sun::star::uno::RuntimeException)
676 : {
677 0 : return theScAccessibleDataPilotButtonImplementationId::get().getSeq();
678 : }
679 :
680 0 : ::rtl::OUString SAL_CALL ScAccessibleDataPilotButton::createAccessibleDescription(void)
681 : throw (::com::sun::star::uno::RuntimeException)
682 : {
683 0 : return rtl::OUString();
684 : }
685 :
686 0 : ::rtl::OUString SAL_CALL ScAccessibleDataPilotButton::createAccessibleName(void)
687 : throw (::com::sun::star::uno::RuntimeException)
688 : {
689 0 : SolarMutexGuard aGuard;
690 0 : IsObjectValid();
691 0 : if (mpFieldWindow)
692 0 : return mpFieldWindow->GetFieldText(getAccessibleIndexInParent());
693 :
694 0 : return rtl::OUString();
695 : }
696 :
697 0 : Rectangle ScAccessibleDataPilotButton::GetBoundingBoxOnScreen(void) const
698 : throw (::com::sun::star::uno::RuntimeException)
699 : {
700 0 : Rectangle aRect(GetBoundingBox());
701 :
702 0 : if (mpFieldWindow)
703 : {
704 0 : Point aParentPos(mpFieldWindow->GetWindowExtentsRelative(NULL).TopLeft());
705 0 : aRect.Move(aParentPos.getX(), aParentPos.getY());
706 : }
707 :
708 0 : return aRect;
709 : }
710 :
711 0 : Rectangle ScAccessibleDataPilotButton::GetBoundingBox(void) const
712 : throw (::com::sun::star::uno::RuntimeException)
713 : {
714 0 : if (mpFieldWindow)
715 0 : return Rectangle (mpFieldWindow->GetFieldPosition(const_cast<ScAccessibleDataPilotButton*> (this)->getAccessibleIndexInParent()), mpFieldWindow->GetFieldSize());
716 : else
717 0 : return Rectangle();
718 : }
719 :
720 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|