1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_accessibility.hxx"
26 #include <accessibility/extended/accessibletabbar.hxx>
27 #include <svtools/tabbar.hxx>
28 #include <accessibility/extended/accessibletabbarpagelist.hxx>
29 #include <com/sun/star/accessibility/AccessibleEventId.hpp>
30 #include <com/sun/star/accessibility/AccessibleRole.hpp>
31 #include <com/sun/star/accessibility/AccessibleStateType.hpp>
32 #include <unotools/accessiblestatesethelper.hxx>
33 #include <unotools/accessiblerelationsethelper.hxx>
34 #include <vcl/svapp.hxx>
35 #include <toolkit/awt/vclxfont.hxx>
36 #include <toolkit/helper/convert.hxx>
37 
38 #include <vector>
39 
40 
41 //.........................................................................
42 namespace accessibility
43 {
44 //.........................................................................
45 
46 	using namespace ::com::sun::star;
47 	using namespace ::com::sun::star::uno;
48 	using namespace ::com::sun::star::lang;
49 	using namespace ::com::sun::star::accessibility;
50 	using namespace ::comphelper;
51 
DBG_NAME(AccessibleTabBar)52 	DBG_NAME( AccessibleTabBar )
53 
54 	//	----------------------------------------------------
55 	//	class AccessibleTabBar
56 	//	----------------------------------------------------
57 
58 	AccessibleTabBar::AccessibleTabBar( TabBar* pTabBar )
59         :AccessibleTabBarBase( pTabBar )
60 	{
61 	    DBG_CTOR( AccessibleTabBar, NULL );
62 
63 		if ( m_pTabBar )
64 			m_aAccessibleChildren.assign( m_pTabBar->GetAccessibleChildWindowCount() + 1, Reference< XAccessible >() );
65 	}
66 
67 	// -----------------------------------------------------------------------------
68 
~AccessibleTabBar()69 	AccessibleTabBar::~AccessibleTabBar()
70 	{
71 	    DBG_DTOR( AccessibleTabBar, NULL );
72 	}
73 
74 	// -----------------------------------------------------------------------------
75 
ProcessWindowEvent(const VclWindowEvent & rVclWindowEvent)76 	void AccessibleTabBar::ProcessWindowEvent( const VclWindowEvent& rVclWindowEvent )
77 	{
78 		Any aOldValue, aNewValue;
79 
80 		switch ( rVclWindowEvent.GetId() )
81 		{
82 			case VCLEVENT_WINDOW_ENABLED:
83 			{
84                 aNewValue <<= AccessibleStateType::SENSITIVE;
85                 NotifyAccessibleEvent( AccessibleEventId::STATE_CHANGED, aOldValue, aNewValue );
86 				aNewValue <<= AccessibleStateType::ENABLED;
87 				NotifyAccessibleEvent( AccessibleEventId::STATE_CHANGED, aOldValue, aNewValue );
88 			}
89 			break;
90 			case VCLEVENT_WINDOW_DISABLED:
91 			{
92 				aOldValue <<= AccessibleStateType::ENABLED;
93 				NotifyAccessibleEvent( AccessibleEventId::STATE_CHANGED, aOldValue, aNewValue );
94                 aOldValue <<= AccessibleStateType::SENSITIVE;
95                 NotifyAccessibleEvent( AccessibleEventId::STATE_CHANGED, aOldValue, aNewValue );
96 			}
97 			break;
98 			case VCLEVENT_WINDOW_GETFOCUS:
99 			{
100 				aNewValue <<= AccessibleStateType::FOCUSED;
101 				NotifyAccessibleEvent( AccessibleEventId::STATE_CHANGED, aOldValue, aNewValue );
102 			}
103 			break;
104 			case VCLEVENT_WINDOW_LOSEFOCUS:
105 			{
106 				aOldValue <<= AccessibleStateType::FOCUSED;
107 				NotifyAccessibleEvent( AccessibleEventId::STATE_CHANGED, aOldValue, aNewValue );
108 			}
109 			break;
110 			case VCLEVENT_WINDOW_SHOW:
111 			{
112 				aNewValue <<= AccessibleStateType::SHOWING;
113 				NotifyAccessibleEvent( AccessibleEventId::STATE_CHANGED, aOldValue, aNewValue );
114 			}
115 			break;
116 			case VCLEVENT_WINDOW_HIDE:
117 			{
118 				aOldValue <<= AccessibleStateType::SHOWING;
119 				NotifyAccessibleEvent( AccessibleEventId::STATE_CHANGED, aOldValue, aNewValue );
120 			}
121 			break;
122 			default:
123 			{
124                 AccessibleTabBarBase::ProcessWindowEvent( rVclWindowEvent );
125 			}
126 			break;
127 		}
128 	}
129 
130 	// -----------------------------------------------------------------------------
131 
FillAccessibleStateSet(utl::AccessibleStateSetHelper & rStateSet)132 	void AccessibleTabBar::FillAccessibleStateSet( utl::AccessibleStateSetHelper& rStateSet )
133 	{
134 		if ( m_pTabBar )
135 		{
136 			if ( m_pTabBar->IsEnabled() )
137             {
138                 rStateSet.AddState( AccessibleStateType::ENABLED );
139                 rStateSet.AddState( AccessibleStateType::SENSITIVE );
140             }
141 
142 			rStateSet.AddState( AccessibleStateType::FOCUSABLE );
143 
144 			if ( m_pTabBar->HasFocus() )
145 				rStateSet.AddState( AccessibleStateType::FOCUSED );
146 
147 			rStateSet.AddState( AccessibleStateType::VISIBLE );
148 
149 			if ( m_pTabBar->IsVisible() )
150 				rStateSet.AddState( AccessibleStateType::SHOWING );
151 
152 			if ( m_pTabBar->GetStyle() & WB_SIZEABLE )
153 				rStateSet.AddState( AccessibleStateType::RESIZABLE );
154 		}
155 	}
156 
157 	// -----------------------------------------------------------------------------
158 	// OCommonAccessibleComponent
159 	// -----------------------------------------------------------------------------
160 
implGetBounds()161 	awt::Rectangle AccessibleTabBar::implGetBounds() throw (RuntimeException)
162 	{
163 		awt::Rectangle aBounds;
164 		if ( m_pTabBar )
165 			aBounds = AWTRectangle( Rectangle( m_pTabBar->GetPosPixel(), m_pTabBar->GetSizePixel() ) );
166 
167 		return aBounds;
168 	}
169 
170 	// -----------------------------------------------------------------------------
171 	// XInterface
172 	// -----------------------------------------------------------------------------
173 
IMPLEMENT_FORWARD_XINTERFACE2(AccessibleTabBar,AccessibleExtendedComponentHelper_BASE,AccessibleTabBar_BASE)174 	IMPLEMENT_FORWARD_XINTERFACE2( AccessibleTabBar, AccessibleExtendedComponentHelper_BASE, AccessibleTabBar_BASE )
175 
176 	// -----------------------------------------------------------------------------
177 	// XTypeProvider
178 	// -----------------------------------------------------------------------------
179 
180 	IMPLEMENT_FORWARD_XTYPEPROVIDER2( AccessibleTabBar, AccessibleExtendedComponentHelper_BASE, AccessibleTabBar_BASE )
181 
182 	// -----------------------------------------------------------------------------
183 	// XComponent
184 	// -----------------------------------------------------------------------------
185 
186 	void AccessibleTabBar::disposing()
187 	{
188         AccessibleTabBarBase::disposing();
189 
190         // dispose all children
191         for ( sal_uInt32 i = 0; i < m_aAccessibleChildren.size(); ++i )
192         {
193             Reference< XComponent > xComponent( m_aAccessibleChildren[i], UNO_QUERY );
194             if ( xComponent.is() )
195                 xComponent->dispose();
196         }
197         m_aAccessibleChildren.clear();
198 	}
199 
200 	// -----------------------------------------------------------------------------
201 	// XServiceInfo
202 	// -----------------------------------------------------------------------------
203 
getImplementationName()204 	::rtl::OUString AccessibleTabBar::getImplementationName() throw (RuntimeException)
205 	{
206 		return ::rtl::OUString::createFromAscii( "com.sun.star.comp.svtools.AccessibleTabBar" );
207 	}
208 
209 	// -----------------------------------------------------------------------------
210 
supportsService(const::rtl::OUString & rServiceName)211 	sal_Bool AccessibleTabBar::supportsService( const ::rtl::OUString& rServiceName ) throw (RuntimeException)
212 	{
213 		Sequence< ::rtl::OUString > aNames( getSupportedServiceNames() );
214 		const ::rtl::OUString* pNames = aNames.getConstArray();
215 		const ::rtl::OUString* pEnd = pNames + aNames.getLength();
216 		for ( ; pNames != pEnd && !pNames->equals( rServiceName ); ++pNames )
217 			;
218 
219 		return pNames != pEnd;
220 	}
221 
222 	// -----------------------------------------------------------------------------
223 
getSupportedServiceNames()224 	Sequence< ::rtl::OUString > AccessibleTabBar::getSupportedServiceNames() throw (RuntimeException)
225 	{
226 		Sequence< ::rtl::OUString > aNames(1);
227 		aNames[0] = ::rtl::OUString::createFromAscii( "com.sun.star.awt.AccessibleTabBar" );
228 		return aNames;
229 	}
230 
231 	// -----------------------------------------------------------------------------
232 	// XAccessible
233 	// -----------------------------------------------------------------------------
234 
getAccessibleContext()235 	Reference< XAccessibleContext > AccessibleTabBar::getAccessibleContext(  ) throw (RuntimeException)
236 	{
237 		OExternalLockGuard aGuard( this );
238 
239 		return this;
240 	}
241 
242 	// -----------------------------------------------------------------------------
243 	// XAccessibleContext
244 	// -----------------------------------------------------------------------------
245 
getAccessibleChildCount()246 	sal_Int32 AccessibleTabBar::getAccessibleChildCount() throw (RuntimeException)
247 	{
248 		OExternalLockGuard aGuard( this );
249 
250 		return m_aAccessibleChildren.size();
251 	}
252 
253 	// -----------------------------------------------------------------------------
254 
getAccessibleChild(sal_Int32 i)255 	Reference< XAccessible > AccessibleTabBar::getAccessibleChild( sal_Int32 i ) throw (IndexOutOfBoundsException, RuntimeException)
256 	{
257 		OExternalLockGuard aGuard( this );
258 
259 		if ( i < 0 || i >= getAccessibleChildCount() )
260 			throw IndexOutOfBoundsException();
261 
262 		Reference< XAccessible > xChild = m_aAccessibleChildren[i];
263 		if ( !xChild.is() )
264 		{
265 			if ( m_pTabBar )
266 			{
267 				sal_Int32 nCount = m_pTabBar->GetAccessibleChildWindowCount();
268 
269 				if ( i < nCount )
270 				{
271 					Window* pChild = m_pTabBar->GetAccessibleChildWindow( (sal_uInt16)i );
272 					if ( pChild )
273 						xChild = pChild->GetAccessible();
274 				}
275 				else if ( i == nCount )
276 				{
277 					xChild = new AccessibleTabBarPageList( m_pTabBar, i );
278 				}
279 
280 				// insert into child list
281 				m_aAccessibleChildren[i] = xChild;
282 			}
283 		}
284 
285 		return xChild;
286 	}
287 
288 	// -----------------------------------------------------------------------------
289 
getAccessibleParent()290 	Reference< XAccessible > AccessibleTabBar::getAccessibleParent(  ) throw (RuntimeException)
291 	{
292 		OExternalLockGuard aGuard( this );
293 
294 		Reference< XAccessible > xParent;
295 		if ( m_pTabBar )
296 		{
297 			Window* pParent = m_pTabBar->GetAccessibleParentWindow();
298 			if ( pParent )
299 				xParent = pParent->GetAccessible();
300 		}
301 
302 		return xParent;
303 	}
304 
305 	// -----------------------------------------------------------------------------
306 
getAccessibleIndexInParent()307 	sal_Int32 AccessibleTabBar::getAccessibleIndexInParent(  ) throw (RuntimeException)
308 	{
309 		OExternalLockGuard aGuard( this );
310 
311 		sal_Int32 nIndexInParent = -1;
312 		if ( m_pTabBar )
313 		{
314 			Window* pParent = m_pTabBar->GetAccessibleParentWindow();
315 			if ( pParent )
316 			{
317 				for ( sal_uInt16 i = 0, nCount = pParent->GetAccessibleChildWindowCount(); i < nCount; ++i )
318 				{
319 					Window* pChild = pParent->GetAccessibleChildWindow( i );
320 					if ( pChild == static_cast< Window* >( m_pTabBar ) )
321 					{
322 						nIndexInParent = i;
323 						break;
324 					}
325 				}
326 			}
327 		}
328 
329 		return nIndexInParent;
330 	}
331 
332 	// -----------------------------------------------------------------------------
333 
getAccessibleRole()334 	sal_Int16 AccessibleTabBar::getAccessibleRole(  ) throw (RuntimeException)
335 	{
336 		OExternalLockGuard aGuard( this );
337 
338 		return AccessibleRole::PANEL;
339 	}
340 
341 	// -----------------------------------------------------------------------------
342 
getAccessibleDescription()343 	::rtl::OUString AccessibleTabBar::getAccessibleDescription(	) throw (RuntimeException)
344 	{
345 		OExternalLockGuard aGuard( this );
346 
347 		::rtl::OUString sDescription;
348 		if ( m_pTabBar )
349 			sDescription = m_pTabBar->GetAccessibleDescription();
350 
351 		return sDescription;
352 	}
353 
354 	// -----------------------------------------------------------------------------
355 
getAccessibleName()356 	::rtl::OUString AccessibleTabBar::getAccessibleName(  ) throw (RuntimeException)
357 	{
358 		OExternalLockGuard aGuard( this );
359 
360 		::rtl::OUString sName;
361 		if ( m_pTabBar )
362 			sName = m_pTabBar->GetAccessibleName();
363 
364 		return sName;
365 	}
366 
367 	// -----------------------------------------------------------------------------
368 
getAccessibleRelationSet()369 	Reference< XAccessibleRelationSet > AccessibleTabBar::getAccessibleRelationSet(  ) throw (RuntimeException)
370 	{
371 		OExternalLockGuard aGuard( this );
372 
373 		utl::AccessibleRelationSetHelper* pRelationSetHelper = new utl::AccessibleRelationSetHelper;
374 		Reference< XAccessibleRelationSet > xSet = pRelationSetHelper;
375 		return xSet;
376 	}
377 
378 	// -----------------------------------------------------------------------------
379 
getAccessibleStateSet()380 	Reference< XAccessibleStateSet > AccessibleTabBar::getAccessibleStateSet(  ) throw (RuntimeException)
381 	{
382 		OExternalLockGuard aGuard( this );
383 
384 		utl::AccessibleStateSetHelper* pStateSetHelper = new utl::AccessibleStateSetHelper;
385 		Reference< XAccessibleStateSet > xSet = pStateSetHelper;
386 
387 		if ( !rBHelper.bDisposed && !rBHelper.bInDispose )
388 		{
389 			FillAccessibleStateSet( *pStateSetHelper );
390 		}
391 		else
392 		{
393 			pStateSetHelper->AddState( AccessibleStateType::DEFUNC );
394 		}
395 
396 		return xSet;
397 	}
398 
399 	// -----------------------------------------------------------------------------
400 
getLocale()401 	Locale AccessibleTabBar::getLocale(  ) throw (IllegalAccessibleComponentStateException, RuntimeException)
402 	{
403 		OExternalLockGuard aGuard( this );
404 
405 		return Application::GetSettings().GetLocale();
406 	}
407 
408 	// -----------------------------------------------------------------------------
409 	// XAccessibleComponent
410 	// -----------------------------------------------------------------------------
411 
getAccessibleAtPoint(const awt::Point & rPoint)412 	Reference< XAccessible > AccessibleTabBar::getAccessibleAtPoint( const awt::Point& rPoint ) throw (RuntimeException)
413 	{
414 		OExternalLockGuard aGuard( this );
415 
416 		Reference< XAccessible > xChild;
417 		for ( sal_uInt32 i = 0; i < m_aAccessibleChildren.size(); ++i )
418 		{
419 			Reference< XAccessible > xAcc = getAccessibleChild( i );
420 			if ( xAcc.is() )
421 			{
422 				Reference< XAccessibleComponent > xComp( xAcc->getAccessibleContext(), UNO_QUERY );
423 				if ( xComp.is() )
424 				{
425 					Rectangle aRect = VCLRectangle( xComp->getBounds() );
426 					Point aPos = VCLPoint( rPoint );
427 					if ( aRect.IsInside( aPos ) )
428 					{
429 						xChild = xAcc;
430 						break;
431 					}
432 				}
433 			}
434 		}
435 
436 		return xChild;
437 	}
438 
439 	// -----------------------------------------------------------------------------
440 
grabFocus()441 	void AccessibleTabBar::grabFocus(  ) throw (RuntimeException)
442 	{
443 		OExternalLockGuard aGuard( this );
444 
445 		if ( m_pTabBar )
446 			m_pTabBar->GrabFocus();
447 	}
448 
449 	// -----------------------------------------------------------------------------
450 
getForeground()451 	sal_Int32 AccessibleTabBar::getForeground(	) throw (RuntimeException)
452 	{
453 		OExternalLockGuard aGuard( this );
454 
455 		sal_Int32 nColor = 0;
456 		if ( m_pTabBar )
457 		{
458 			if ( m_pTabBar->IsControlForeground() )
459 				nColor = m_pTabBar->GetControlForeground().GetColor();
460 			else
461 			{
462 				Font aFont;
463 				if ( m_pTabBar->IsControlFont() )
464 					aFont = m_pTabBar->GetControlFont();
465 				else
466 					aFont = m_pTabBar->GetFont();
467 				nColor = aFont.GetColor().GetColor();
468 			}
469 		}
470 
471 		return nColor;
472 	}
473 
474 	// -----------------------------------------------------------------------------
475 
getBackground()476 	sal_Int32 AccessibleTabBar::getBackground(  ) throw (RuntimeException)
477 	{
478 		OExternalLockGuard aGuard( this );
479 
480 		sal_Int32 nColor = 0;
481 		if ( m_pTabBar )
482 		{
483 			if ( m_pTabBar->IsControlBackground() )
484 				nColor = m_pTabBar->GetControlBackground().GetColor();
485 			else
486 				nColor = m_pTabBar->GetBackground().GetColor().GetColor();
487 		}
488 
489 		return nColor;
490 	}
491 
492 	// -----------------------------------------------------------------------------
493 	// XAccessibleExtendedComponent
494 	// -----------------------------------------------------------------------------
495 
getFont()496 	Reference< awt::XFont > AccessibleTabBar::getFont(  ) throw (RuntimeException)
497 	{
498 		OExternalLockGuard aGuard( this );
499 
500 		Reference< awt::XFont > xFont;
501 		if ( m_pTabBar )
502 		{
503 			Reference< awt::XDevice > xDev( m_pTabBar->GetComponentInterface(), UNO_QUERY );
504 			if ( xDev.is() )
505 			{
506 				Font aFont;
507 				if ( m_pTabBar->IsControlFont() )
508 					aFont = m_pTabBar->GetControlFont();
509 				else
510 					aFont = m_pTabBar->GetFont();
511 				VCLXFont* pVCLXFont = new VCLXFont;
512 				pVCLXFont->Init( *xDev.get(), aFont );
513 				xFont = pVCLXFont;
514 			}
515 		}
516 
517 		return xFont;
518 	}
519 
520 	// -----------------------------------------------------------------------------
521 
getTitledBorderText()522 	::rtl::OUString AccessibleTabBar::getTitledBorderText(  ) throw (RuntimeException)
523 	{
524 		OExternalLockGuard aGuard( this );
525 
526 		::rtl::OUString sText;
527 		if ( m_pTabBar )
528 			sText = m_pTabBar->GetText();
529 
530 		return sText;
531 	}
532 
533 	// -----------------------------------------------------------------------------
534 
getToolTipText()535 	::rtl::OUString AccessibleTabBar::getToolTipText(  ) throw (RuntimeException)
536 	{
537 		OExternalLockGuard aGuard( this );
538 
539 		::rtl::OUString sText;
540 		if ( m_pTabBar )
541 			sText = m_pTabBar->GetQuickHelpText();
542 
543 		return sText;
544 	}
545 
546 	// -----------------------------------------------------------------------------
547 
548 //.........................................................................
549 }	// namespace accessibility
550 //.........................................................................
551