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/vclxaccessiblestatusbaritem.hxx>
21 : #include <toolkit/helper/externallock.hxx>
22 : #include <toolkit/helper/convert.hxx>
23 : #include <accessibility/helper/characterattributeshelper.hxx>
24 :
25 : #include <com/sun/star/accessibility/AccessibleEventId.hpp>
26 : #include <com/sun/star/accessibility/AccessibleRole.hpp>
27 : #include <com/sun/star/accessibility/AccessibleStateType.hpp>
28 : #include <com/sun/star/datatransfer/clipboard/XClipboard.hpp>
29 : #include <com/sun/star/datatransfer/clipboard/XFlushableClipboard.hpp>
30 : #include <cppuhelper/supportsservice.hxx>
31 : #include <unotools/accessiblestatesethelper.hxx>
32 : #include <unotools/accessiblerelationsethelper.hxx>
33 : #include <vcl/svapp.hxx>
34 : #include <vcl/unohelp2.hxx>
35 : #include <vcl/status.hxx>
36 : #include <vcl/controllayout.hxx>
37 : #include <vcl/settings.hxx>
38 :
39 : using namespace ::com::sun::star::accessibility;
40 : using namespace ::com::sun::star::uno;
41 : using namespace ::com::sun::star::lang;
42 : using namespace ::com::sun::star::beans;
43 : using namespace ::com::sun::star;
44 : using namespace ::comphelper;
45 :
46 :
47 :
48 : // class VCLXAccessibleStatusBarItem
49 :
50 :
51 2 : VCLXAccessibleStatusBarItem::VCLXAccessibleStatusBarItem( StatusBar* pStatusBar, sal_uInt16 nItemId )
52 : :AccessibleTextHelper_BASE( new VCLExternalSolarLock() )
53 : ,m_pStatusBar( pStatusBar )
54 2 : ,m_nItemId( nItemId )
55 : {
56 2 : m_pExternalLock = static_cast< VCLExternalSolarLock* >( getExternalLock() );
57 :
58 2 : m_sItemName = GetItemName();
59 2 : m_sItemText = GetItemText();
60 2 : m_bShowing = IsShowing();
61 2 : }
62 :
63 :
64 :
65 6 : VCLXAccessibleStatusBarItem::~VCLXAccessibleStatusBarItem()
66 : {
67 2 : delete m_pExternalLock;
68 2 : m_pExternalLock = NULL;
69 4 : }
70 :
71 :
72 :
73 2 : bool VCLXAccessibleStatusBarItem::IsShowing()
74 : {
75 2 : bool bShowing = false;
76 :
77 2 : if ( m_pStatusBar )
78 2 : bShowing = m_pStatusBar->IsItemVisible( m_nItemId );
79 :
80 2 : return bShowing;
81 : }
82 :
83 :
84 :
85 0 : void VCLXAccessibleStatusBarItem::SetShowing( bool bShowing )
86 : {
87 0 : if ( m_bShowing != bShowing )
88 : {
89 0 : Any aOldValue, aNewValue;
90 0 : if ( m_bShowing )
91 0 : aOldValue <<= AccessibleStateType::SHOWING;
92 : else
93 0 : aNewValue <<= AccessibleStateType::SHOWING;
94 0 : m_bShowing = bShowing;
95 0 : NotifyAccessibleEvent( AccessibleEventId::STATE_CHANGED, aOldValue, aNewValue );
96 : }
97 0 : }
98 :
99 :
100 :
101 0 : void VCLXAccessibleStatusBarItem::SetItemName( const OUString& sItemName )
102 : {
103 0 : if ( !m_sItemName.equals( sItemName ) )
104 : {
105 0 : Any aOldValue, aNewValue;
106 0 : aOldValue <<= m_sItemName;
107 0 : aNewValue <<= sItemName;
108 0 : m_sItemName = sItemName;
109 0 : NotifyAccessibleEvent( AccessibleEventId::NAME_CHANGED, aOldValue, aNewValue );
110 : }
111 0 : }
112 :
113 :
114 :
115 2 : OUString VCLXAccessibleStatusBarItem::GetItemName()
116 : {
117 2 : OUString sName;
118 2 : if ( m_pStatusBar )
119 2 : sName = m_pStatusBar->GetAccessibleName( m_nItemId );
120 :
121 2 : return sName;
122 : }
123 :
124 :
125 :
126 0 : void VCLXAccessibleStatusBarItem::SetItemText( const OUString& sItemText )
127 : {
128 0 : Any aOldValue, aNewValue;
129 0 : if ( implInitTextChangedEvent( m_sItemText, sItemText, aOldValue, aNewValue ) )
130 : {
131 0 : m_sItemText = sItemText;
132 0 : NotifyAccessibleEvent( AccessibleEventId::TEXT_CHANGED, aOldValue, aNewValue );
133 0 : }
134 0 : }
135 :
136 :
137 :
138 124 : OUString VCLXAccessibleStatusBarItem::GetItemText()
139 : {
140 124 : OUString sText;
141 248 : vcl::ControlLayoutData aLayoutData;
142 124 : if ( m_pStatusBar )
143 : {
144 124 : Rectangle aItemRect = m_pStatusBar->GetItemRect( m_nItemId );
145 124 : m_pStatusBar->RecordLayoutData( &aLayoutData, aItemRect );
146 124 : sText = aLayoutData.m_aDisplayText;
147 : }
148 :
149 248 : return sText;
150 : }
151 :
152 :
153 :
154 0 : void VCLXAccessibleStatusBarItem::FillAccessibleStateSet( utl::AccessibleStateSetHelper& rStateSet )
155 : {
156 0 : rStateSet.AddState( AccessibleStateType::ENABLED );
157 0 : rStateSet.AddState( AccessibleStateType::SENSITIVE );
158 :
159 0 : rStateSet.AddState( AccessibleStateType::VISIBLE );
160 :
161 0 : if ( IsShowing() )
162 0 : rStateSet.AddState( AccessibleStateType::SHOWING );
163 0 : }
164 :
165 :
166 : // OCommonAccessibleComponent
167 :
168 :
169 1 : awt::Rectangle VCLXAccessibleStatusBarItem::implGetBounds() throw (RuntimeException)
170 : {
171 1 : awt::Rectangle aBounds( 0, 0, 0, 0 );
172 :
173 1 : if ( m_pStatusBar )
174 1 : aBounds = AWTRectangle( m_pStatusBar->GetItemRect( m_nItemId ) );
175 :
176 1 : return aBounds;
177 : }
178 :
179 :
180 : // OCommonAccessibleText
181 :
182 :
183 121 : OUString VCLXAccessibleStatusBarItem::implGetText()
184 : {
185 121 : return GetItemText();
186 : }
187 :
188 :
189 :
190 0 : lang::Locale VCLXAccessibleStatusBarItem::implGetLocale()
191 : {
192 0 : return Application::GetSettings().GetLanguageTag().getLocale();
193 : }
194 :
195 :
196 :
197 0 : void VCLXAccessibleStatusBarItem::implGetSelection( sal_Int32& nStartIndex, sal_Int32& nEndIndex )
198 : {
199 0 : nStartIndex = 0;
200 0 : nEndIndex = 0;
201 0 : }
202 :
203 :
204 : // XInterface
205 :
206 :
207 96 : IMPLEMENT_FORWARD_XINTERFACE2( VCLXAccessibleStatusBarItem, AccessibleTextHelper_BASE, VCLXAccessibleStatusBarItem_BASE )
208 :
209 :
210 : // XTypeProvider
211 :
212 :
213 0 : IMPLEMENT_FORWARD_XTYPEPROVIDER2( VCLXAccessibleStatusBarItem, AccessibleTextHelper_BASE, VCLXAccessibleStatusBarItem_BASE )
214 :
215 :
216 : // XComponent
217 :
218 :
219 2 : void VCLXAccessibleStatusBarItem::disposing()
220 : {
221 2 : AccessibleTextHelper_BASE::disposing();
222 :
223 2 : m_pStatusBar = NULL;
224 2 : m_sItemName.clear();
225 2 : m_sItemText.clear();
226 2 : }
227 :
228 :
229 : // XServiceInfo
230 :
231 :
232 1 : OUString VCLXAccessibleStatusBarItem::getImplementationName() throw (RuntimeException, std::exception)
233 : {
234 1 : return OUString( "com.sun.star.comp.toolkit.AccessibleStatusBarItem" );
235 : }
236 :
237 :
238 :
239 0 : sal_Bool VCLXAccessibleStatusBarItem::supportsService( const OUString& rServiceName ) throw (RuntimeException, std::exception)
240 : {
241 0 : return cppu::supportsService(this, rServiceName);
242 : }
243 :
244 :
245 :
246 0 : Sequence< OUString > VCLXAccessibleStatusBarItem::getSupportedServiceNames() throw (RuntimeException, std::exception)
247 : {
248 0 : Sequence< OUString > aNames(1);
249 0 : aNames[0] = "com.sun.star.awt.AccessibleStatusBarItem";
250 0 : return aNames;
251 : }
252 :
253 :
254 : // XAccessible
255 :
256 :
257 0 : Reference< XAccessibleContext > VCLXAccessibleStatusBarItem::getAccessibleContext( ) throw (RuntimeException, std::exception)
258 : {
259 0 : OExternalLockGuard aGuard( this );
260 :
261 0 : return this;
262 : }
263 :
264 :
265 : // XAccessibleContext
266 :
267 :
268 0 : sal_Int32 VCLXAccessibleStatusBarItem::getAccessibleChildCount() throw (RuntimeException, std::exception)
269 : {
270 0 : OExternalLockGuard aGuard( this );
271 :
272 0 : return 0;
273 : }
274 :
275 :
276 :
277 0 : Reference< XAccessible > VCLXAccessibleStatusBarItem::getAccessibleChild( sal_Int32 i ) throw (IndexOutOfBoundsException, RuntimeException, std::exception)
278 : {
279 0 : OExternalLockGuard aGuard( this );
280 :
281 0 : if ( i < 0 || i >= getAccessibleChildCount() )
282 0 : throw IndexOutOfBoundsException();
283 :
284 0 : return Reference< XAccessible >();
285 : }
286 :
287 :
288 :
289 3 : Reference< XAccessible > VCLXAccessibleStatusBarItem::getAccessibleParent( ) throw (RuntimeException, std::exception)
290 : {
291 3 : OExternalLockGuard aGuard( this );
292 :
293 3 : Reference< XAccessible > xParent;
294 3 : if ( m_pStatusBar )
295 3 : xParent = m_pStatusBar->GetAccessible();
296 :
297 3 : return xParent;
298 : }
299 :
300 :
301 :
302 0 : sal_Int32 VCLXAccessibleStatusBarItem::getAccessibleIndexInParent( ) throw (RuntimeException, std::exception)
303 : {
304 0 : OExternalLockGuard aGuard( this );
305 :
306 0 : sal_Int32 nIndexInParent = -1;
307 0 : if ( m_pStatusBar )
308 0 : nIndexInParent = m_pStatusBar->GetItemPos( m_nItemId );
309 :
310 0 : return nIndexInParent;
311 : }
312 :
313 :
314 :
315 0 : sal_Int16 VCLXAccessibleStatusBarItem::getAccessibleRole( ) throw (RuntimeException, std::exception)
316 : {
317 0 : OExternalLockGuard aGuard( this );
318 :
319 0 : return AccessibleRole::LABEL;
320 : }
321 :
322 :
323 :
324 0 : OUString VCLXAccessibleStatusBarItem::getAccessibleDescription( ) throw (RuntimeException, std::exception)
325 : {
326 0 : OExternalLockGuard aGuard( this );
327 :
328 0 : OUString sDescription;
329 0 : if ( m_pStatusBar )
330 0 : sDescription = m_pStatusBar->GetHelpText( m_nItemId );
331 :
332 0 : return sDescription;
333 : }
334 :
335 :
336 :
337 0 : OUString VCLXAccessibleStatusBarItem::getAccessibleName( ) throw (RuntimeException, std::exception)
338 : {
339 0 : OExternalLockGuard aGuard( this );
340 :
341 0 : return GetItemName();
342 : }
343 :
344 :
345 :
346 0 : Reference< XAccessibleRelationSet > VCLXAccessibleStatusBarItem::getAccessibleRelationSet( ) throw (RuntimeException, std::exception)
347 : {
348 0 : OExternalLockGuard aGuard( this );
349 :
350 0 : utl::AccessibleRelationSetHelper* pRelationSetHelper = new utl::AccessibleRelationSetHelper;
351 0 : Reference< XAccessibleRelationSet > xSet = pRelationSetHelper;
352 0 : return xSet;
353 : }
354 :
355 :
356 :
357 0 : Reference< XAccessibleStateSet > VCLXAccessibleStatusBarItem::getAccessibleStateSet( ) throw (RuntimeException, std::exception)
358 : {
359 0 : OExternalLockGuard aGuard( this );
360 :
361 0 : utl::AccessibleStateSetHelper* pStateSetHelper = new utl::AccessibleStateSetHelper;
362 0 : Reference< XAccessibleStateSet > xSet = pStateSetHelper;
363 :
364 0 : if ( !rBHelper.bDisposed && !rBHelper.bInDispose )
365 : {
366 0 : FillAccessibleStateSet( *pStateSetHelper );
367 : }
368 : else
369 : {
370 0 : pStateSetHelper->AddState( AccessibleStateType::DEFUNC );
371 : }
372 :
373 0 : return xSet;
374 : }
375 :
376 :
377 :
378 0 : Locale VCLXAccessibleStatusBarItem::getLocale( ) throw (IllegalAccessibleComponentStateException, RuntimeException, std::exception)
379 : {
380 0 : OExternalLockGuard aGuard( this );
381 :
382 0 : return Application::GetSettings().GetLanguageTag().getLocale();
383 : }
384 :
385 :
386 : // XAccessibleComponent
387 :
388 :
389 0 : Reference< XAccessible > VCLXAccessibleStatusBarItem::getAccessibleAtPoint( const awt::Point& ) throw (RuntimeException, std::exception)
390 : {
391 0 : OExternalLockGuard aGuard( this );
392 :
393 0 : return Reference< XAccessible >();
394 : }
395 :
396 :
397 :
398 0 : void VCLXAccessibleStatusBarItem::grabFocus( ) throw (RuntimeException, std::exception)
399 : {
400 : // no focus for status bar items
401 0 : }
402 :
403 :
404 :
405 1 : sal_Int32 VCLXAccessibleStatusBarItem::getForeground( ) throw (RuntimeException, std::exception)
406 : {
407 1 : OExternalLockGuard aGuard( this );
408 :
409 1 : sal_Int32 nColor = 0;
410 2 : Reference< XAccessible > xParent = getAccessibleParent();
411 1 : if ( xParent.is() )
412 : {
413 1 : Reference< XAccessibleComponent > xParentComp( xParent->getAccessibleContext(), UNO_QUERY );
414 1 : if ( xParentComp.is() )
415 1 : nColor = xParentComp->getForeground();
416 : }
417 :
418 2 : return nColor;
419 : }
420 :
421 :
422 :
423 1 : sal_Int32 VCLXAccessibleStatusBarItem::getBackground( ) throw (RuntimeException, std::exception)
424 : {
425 1 : OExternalLockGuard aGuard( this );
426 :
427 1 : sal_Int32 nColor = 0;
428 2 : Reference< XAccessible > xParent = getAccessibleParent();
429 1 : if ( xParent.is() )
430 : {
431 1 : Reference< XAccessibleComponent > xParentComp( xParent->getAccessibleContext(), UNO_QUERY );
432 1 : if ( xParentComp.is() )
433 1 : nColor = xParentComp->getBackground();
434 : }
435 :
436 2 : return nColor;
437 : }
438 :
439 :
440 : // XAccessibleExtendedComponent
441 :
442 :
443 1 : Reference< awt::XFont > VCLXAccessibleStatusBarItem::getFont( ) throw (RuntimeException, std::exception)
444 : {
445 1 : OExternalLockGuard aGuard( this );
446 :
447 1 : Reference< awt::XFont > xFont;
448 2 : Reference< XAccessible > xParent = getAccessibleParent();
449 1 : if ( xParent.is() )
450 : {
451 1 : Reference< XAccessibleExtendedComponent > xParentComp( xParent->getAccessibleContext(), UNO_QUERY );
452 1 : if ( xParentComp.is() )
453 1 : xFont = xParentComp->getFont();
454 : }
455 :
456 2 : return xFont;
457 : }
458 :
459 :
460 :
461 1 : OUString VCLXAccessibleStatusBarItem::getTitledBorderText( ) throw (RuntimeException, std::exception)
462 : {
463 1 : OExternalLockGuard aGuard( this );
464 :
465 1 : return GetItemText();
466 : }
467 :
468 :
469 :
470 1 : OUString VCLXAccessibleStatusBarItem::getToolTipText( ) throw (RuntimeException, std::exception)
471 : {
472 1 : OExternalLockGuard aGuard( this );
473 :
474 1 : return OUString();
475 : }
476 :
477 :
478 : // XAccessibleText
479 :
480 :
481 0 : sal_Int32 VCLXAccessibleStatusBarItem::getCaretPosition() throw (RuntimeException, std::exception)
482 : {
483 0 : OExternalLockGuard aGuard( this );
484 :
485 0 : return -1;
486 : }
487 :
488 :
489 :
490 3 : sal_Bool VCLXAccessibleStatusBarItem::setCaretPosition( sal_Int32 nIndex ) throw (IndexOutOfBoundsException, RuntimeException, std::exception)
491 : {
492 3 : OExternalLockGuard aGuard( this );
493 :
494 3 : if ( !implIsValidRange( nIndex, nIndex, implGetText().getLength() ) )
495 2 : throw IndexOutOfBoundsException();
496 :
497 3 : return false;
498 : }
499 :
500 :
501 :
502 3 : Sequence< PropertyValue > VCLXAccessibleStatusBarItem::getCharacterAttributes( sal_Int32 nIndex, const Sequence< OUString >& aRequestedAttributes ) throw (IndexOutOfBoundsException, RuntimeException, std::exception)
503 : {
504 3 : OExternalLockGuard aGuard( this );
505 :
506 3 : Sequence< PropertyValue > aValues;
507 6 : OUString sText( implGetText() );
508 :
509 3 : if ( !implIsValidIndex( nIndex, sText.getLength() ) )
510 2 : throw IndexOutOfBoundsException();
511 :
512 1 : if ( m_pStatusBar )
513 : {
514 1 : vcl::Font aFont = m_pStatusBar->GetFont();
515 1 : sal_Int32 nBackColor = getBackground();
516 1 : sal_Int32 nColor = getForeground();
517 2 : aValues = CharacterAttributesHelper( aFont, nBackColor, nColor )
518 2 : .GetCharacterAttributes( aRequestedAttributes );
519 : }
520 :
521 4 : return aValues;
522 : }
523 :
524 :
525 :
526 42 : awt::Rectangle VCLXAccessibleStatusBarItem::getCharacterBounds( sal_Int32 nIndex ) throw (IndexOutOfBoundsException, RuntimeException, std::exception)
527 : {
528 42 : OExternalLockGuard aGuard( this );
529 :
530 42 : if ( !implIsValidIndex( nIndex, implGetText().getLength() ) )
531 2 : throw IndexOutOfBoundsException();
532 :
533 40 : awt::Rectangle aBounds( 0, 0, 0, 0 );
534 40 : if ( m_pStatusBar )
535 : {
536 40 : vcl::ControlLayoutData aLayoutData;
537 40 : Rectangle aItemRect = m_pStatusBar->GetItemRect( m_nItemId );
538 40 : m_pStatusBar->RecordLayoutData( &aLayoutData, aItemRect );
539 40 : Rectangle aCharRect = aLayoutData.GetCharacterBounds( nIndex );
540 40 : aCharRect.Move( -aItemRect.Left(), -aItemRect.Top() );
541 40 : aBounds = AWTRectangle( aCharRect );
542 : }
543 :
544 42 : return aBounds;
545 : }
546 :
547 :
548 :
549 41 : sal_Int32 VCLXAccessibleStatusBarItem::getIndexAtPoint( const awt::Point& aPoint ) throw (RuntimeException, std::exception)
550 : {
551 41 : OExternalLockGuard aGuard( this );
552 :
553 41 : sal_Int32 nIndex = -1;
554 41 : if ( m_pStatusBar )
555 : {
556 41 : vcl::ControlLayoutData aLayoutData;
557 41 : Rectangle aItemRect = m_pStatusBar->GetItemRect( m_nItemId );
558 41 : m_pStatusBar->RecordLayoutData( &aLayoutData, aItemRect );
559 41 : Point aPnt( VCLPoint( aPoint ) );
560 41 : aPnt += aItemRect.TopLeft();
561 41 : nIndex = aLayoutData.GetIndexForPoint( aPnt );
562 : }
563 :
564 41 : return nIndex;
565 : }
566 :
567 :
568 :
569 0 : sal_Bool VCLXAccessibleStatusBarItem::setSelection( sal_Int32 nStartIndex, sal_Int32 nEndIndex ) throw (IndexOutOfBoundsException, RuntimeException, std::exception)
570 : {
571 0 : OExternalLockGuard aGuard( this );
572 :
573 0 : if ( !implIsValidRange( nStartIndex, nEndIndex, implGetText().getLength() ) )
574 0 : throw IndexOutOfBoundsException();
575 :
576 0 : return false;
577 : }
578 :
579 :
580 :
581 0 : sal_Bool VCLXAccessibleStatusBarItem::copyText( sal_Int32 nStartIndex, sal_Int32 nEndIndex ) throw (IndexOutOfBoundsException, RuntimeException, std::exception)
582 : {
583 0 : OExternalLockGuard aGuard( this );
584 :
585 0 : bool bReturn = false;
586 :
587 0 : if ( m_pStatusBar )
588 : {
589 0 : Reference< datatransfer::clipboard::XClipboard > xClipboard = m_pStatusBar->GetClipboard();
590 0 : if ( xClipboard.is() )
591 : {
592 0 : OUString sText( getTextRange( nStartIndex, nEndIndex ) );
593 :
594 0 : vcl::unohelper::TextDataObject* pDataObj = new vcl::unohelper::TextDataObject( sText );
595 :
596 0 : SolarMutexReleaser aReleaser;
597 0 : xClipboard->setContents( pDataObj, NULL );
598 :
599 0 : Reference< datatransfer::clipboard::XFlushableClipboard > xFlushableClipboard( xClipboard, uno::UNO_QUERY );
600 0 : if( xFlushableClipboard.is() )
601 0 : xFlushableClipboard->flushClipboard();
602 :
603 0 : bReturn = true;
604 0 : }
605 : }
606 :
607 0 : return bReturn;
608 : }
609 :
610 :
611 :
612 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|