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/accessibletabbarpage.hxx>
27 #include <svtools/tabbar.hxx>
28 #include <com/sun/star/accessibility/AccessibleEventId.hpp>
29 #include <com/sun/star/accessibility/AccessibleRole.hpp>
30 #include <com/sun/star/accessibility/AccessibleStateType.hpp>
31 #include <unotools/accessiblestatesethelper.hxx>
32 #include <unotools/accessiblerelationsethelper.hxx>
33 #include <vcl/svapp.hxx>
34 #include <toolkit/helper/convert.hxx>
35 
36 
37 //.........................................................................
38 namespace accessibility
39 {
40 //.........................................................................
41 
42 	using namespace ::com::sun::star::accessibility;
43 	using namespace ::com::sun::star::uno;
44 	using namespace ::com::sun::star::lang;
45 	using namespace ::com::sun::star;
46 	using namespace ::comphelper;
47 
48 	// -----------------------------------------------------------------------------
49 	// class AccessibleTabBarPage
50 	// -----------------------------------------------------------------------------
51 
AccessibleTabBarPage(TabBar * pTabBar,sal_uInt16 nPageId,const Reference<XAccessible> & rxParent)52 	AccessibleTabBarPage::AccessibleTabBarPage( TabBar* pTabBar, sal_uInt16 nPageId, const Reference< XAccessible >& rxParent )
53         :AccessibleTabBarBase( pTabBar )
54 		,m_nPageId( nPageId )
55 		,m_xParent( rxParent )
56 	{
57 		m_bEnabled	= IsEnabled();
58 		m_bShowing	= IsShowing();
59 		m_bSelected = IsSelected();
60 
61 		if ( m_pTabBar )
62 			m_sPageText = m_pTabBar->GetPageText( m_nPageId );
63 	}
64 
65 	// -----------------------------------------------------------------------------
66 
~AccessibleTabBarPage()67 	AccessibleTabBarPage::~AccessibleTabBarPage()
68 	{
69 	}
70 
71 	// -----------------------------------------------------------------------------
72 
IsEnabled()73 	sal_Bool AccessibleTabBarPage::IsEnabled()
74 	{
75 		OExternalLockGuard aGuard( this );
76 
77 		sal_Bool bEnabled = sal_False;
78 		if ( m_pTabBar )
79 			bEnabled = m_pTabBar->IsPageEnabled( m_nPageId );
80 
81 		return bEnabled;
82 	}
83 
84 	// -----------------------------------------------------------------------------
85 
IsShowing()86 	sal_Bool AccessibleTabBarPage::IsShowing()
87 	{
88 		sal_Bool bShowing = sal_False;
89 
90 		if ( m_pTabBar && m_pTabBar->IsVisible() )
91 			bShowing = sal_True;
92 
93 		return bShowing;
94 	}
95 
96 	// -----------------------------------------------------------------------------
97 
IsSelected()98 	sal_Bool AccessibleTabBarPage::IsSelected()
99 	{
100 		sal_Bool bSelected = sal_False;
101 
102 		if ( m_pTabBar && m_pTabBar->GetCurPageId() == m_nPageId )
103 			bSelected = sal_True;
104 
105 		return bSelected;
106 	}
107 
108 	// -----------------------------------------------------------------------------
109 
SetEnabled(sal_Bool bEnabled)110 	void AccessibleTabBarPage::SetEnabled( sal_Bool bEnabled )
111 	{
112 		if ( m_bEnabled != bEnabled )
113 		{
114             Any aOldValue[2], aNewValue[2];
115             if ( m_bEnabled )
116             {
117                 aOldValue[0] <<= AccessibleStateType::SENSITIVE;
118                 aOldValue[1] <<= AccessibleStateType::ENABLED;
119             }
120             else
121             {
122 
123                 aNewValue[0] <<= AccessibleStateType::ENABLED;
124                 aNewValue[1] <<= AccessibleStateType::SENSITIVE;
125             }
126             m_bEnabled = bEnabled;
127             NotifyAccessibleEvent( AccessibleEventId::STATE_CHANGED, aOldValue[0], aNewValue[0] );
128             NotifyAccessibleEvent( AccessibleEventId::STATE_CHANGED, aOldValue[1], aNewValue[1] );
129 		}
130 	}
131 
132 	// -----------------------------------------------------------------------------
133 
SetShowing(sal_Bool bShowing)134 	void AccessibleTabBarPage::SetShowing( sal_Bool bShowing )
135 	{
136 		if ( m_bShowing != bShowing )
137 		{
138 			Any aOldValue, aNewValue;
139 			if ( m_bShowing )
140 				aOldValue <<= AccessibleStateType::SHOWING;
141 			else
142 				aNewValue <<= AccessibleStateType::SHOWING;
143 			m_bShowing = bShowing;
144 			NotifyAccessibleEvent( AccessibleEventId::STATE_CHANGED, aOldValue, aNewValue );
145 		}
146 	}
147 
148 	// -----------------------------------------------------------------------------
149 
SetSelected(sal_Bool bSelected)150 	void AccessibleTabBarPage::SetSelected( sal_Bool bSelected )
151 	{
152 		if ( m_bSelected != bSelected )
153 		{
154 			Any aOldValue, aNewValue;
155 			if ( m_bSelected )
156 				aOldValue <<= AccessibleStateType::SELECTED;
157 			else
158 				aNewValue <<= AccessibleStateType::SELECTED;
159 			m_bSelected = bSelected;
160 			NotifyAccessibleEvent( AccessibleEventId::STATE_CHANGED, aOldValue, aNewValue );
161 		}
162 	}
163 
164 	// -----------------------------------------------------------------------------
165 
SetPageText(const::rtl::OUString & sPageText)166 	void AccessibleTabBarPage::SetPageText( const ::rtl::OUString& sPageText )
167 	{
168 		if ( !m_sPageText.equals( sPageText ) )
169 		{
170 			Any aOldValue, aNewValue;
171 			aOldValue <<= m_sPageText;
172 			aNewValue <<= sPageText;
173 			m_sPageText = sPageText;
174 			NotifyAccessibleEvent( AccessibleEventId::NAME_CHANGED, aOldValue, aNewValue );
175 		}
176 	}
177 
178 	// -----------------------------------------------------------------------------
179 
FillAccessibleStateSet(utl::AccessibleStateSetHelper & rStateSet)180 	void AccessibleTabBarPage::FillAccessibleStateSet( utl::AccessibleStateSetHelper& rStateSet )
181 	{
182 		if ( IsEnabled() )
183         {
184             rStateSet.AddState( AccessibleStateType::ENABLED );
185             rStateSet.AddState( AccessibleStateType::SENSITIVE );
186         }
187 
188 		rStateSet.AddState( AccessibleStateType::VISIBLE );
189 
190 		if ( IsShowing() )
191 			rStateSet.AddState( AccessibleStateType::SHOWING );
192 
193 		rStateSet.AddState( AccessibleStateType::SELECTABLE );
194 
195 		if ( IsSelected() )
196 			rStateSet.AddState( AccessibleStateType::SELECTED );
197 	}
198 
199 	// -----------------------------------------------------------------------------
200 	// OCommonAccessibleComponent
201 	// -----------------------------------------------------------------------------
202 
implGetBounds()203 	awt::Rectangle AccessibleTabBarPage::implGetBounds() throw (RuntimeException)
204 	{
205 		awt::Rectangle aBounds;
206 		if ( m_pTabBar )
207 		{
208 			// get bounding rectangle relative to the AccessibleTabBar
209 			aBounds = AWTRectangle( m_pTabBar->GetPageRect( m_nPageId ) );
210 
211 			// get position of the AccessibleTabBarPageList relative to the AccessibleTabBar
212 			Reference< XAccessible > xParent = getAccessibleParent();
213 			if ( xParent.is() )
214 			{
215 				Reference< XAccessibleComponent > xParentComponent( xParent->getAccessibleContext(), UNO_QUERY );
216 				if ( xParentComponent.is() )
217 				{
218 					awt::Point aParentLoc = xParentComponent->getLocation();
219 
220 					// calculate bounding rectangle relative to the AccessibleTabBarPageList
221 					aBounds.X -= aParentLoc.X;
222 					aBounds.Y -= aParentLoc.Y;
223 				}
224 			}
225 		}
226 
227 		return aBounds;
228 	}
229 
230 	// -----------------------------------------------------------------------------
231 	// XInterface
232 	// -----------------------------------------------------------------------------
233 
IMPLEMENT_FORWARD_XINTERFACE2(AccessibleTabBarPage,AccessibleExtendedComponentHelper_BASE,AccessibleTabBarPage_BASE)234 	IMPLEMENT_FORWARD_XINTERFACE2( AccessibleTabBarPage, AccessibleExtendedComponentHelper_BASE, AccessibleTabBarPage_BASE )
235 
236 	// -----------------------------------------------------------------------------
237 	// XTypeProvider
238 	// -----------------------------------------------------------------------------
239 
240 	IMPLEMENT_FORWARD_XTYPEPROVIDER2( AccessibleTabBarPage, AccessibleExtendedComponentHelper_BASE, AccessibleTabBarPage_BASE )
241 
242 	// -----------------------------------------------------------------------------
243 	// XComponent
244 	// -----------------------------------------------------------------------------
245 
246 	void AccessibleTabBarPage::disposing()
247 	{
248         AccessibleTabBarBase::disposing();
249 		m_sPageText = ::rtl::OUString();
250 	}
251 
252 	// -----------------------------------------------------------------------------
253 	// XServiceInfo
254 	// -----------------------------------------------------------------------------
255 
getImplementationName()256 	::rtl::OUString AccessibleTabBarPage::getImplementationName() throw (RuntimeException)
257 	{
258 		return ::rtl::OUString::createFromAscii( "com.sun.star.comp.svtools.AccessibleTabBarPage" );
259 	}
260 
261 	// -----------------------------------------------------------------------------
262 
supportsService(const::rtl::OUString & rServiceName)263 	sal_Bool AccessibleTabBarPage::supportsService( const ::rtl::OUString& rServiceName ) throw (RuntimeException)
264 	{
265 		Sequence< ::rtl::OUString > aNames( getSupportedServiceNames() );
266 		const ::rtl::OUString* pNames = aNames.getConstArray();
267 		const ::rtl::OUString* pEnd = pNames + aNames.getLength();
268 		for ( ; pNames != pEnd && !pNames->equals( rServiceName ); ++pNames )
269 			;
270 
271 		return pNames != pEnd;
272 	}
273 
274 	// -----------------------------------------------------------------------------
275 
getSupportedServiceNames()276 	Sequence< ::rtl::OUString > AccessibleTabBarPage::getSupportedServiceNames() throw (RuntimeException)
277 	{
278 		Sequence< ::rtl::OUString > aNames(1);
279 		aNames[0] = ::rtl::OUString::createFromAscii( "com.sun.star.awt.AccessibleTabBarPage" );
280 		return aNames;
281 	}
282 
283 	// -----------------------------------------------------------------------------
284 	// XAccessible
285 	// -----------------------------------------------------------------------------
286 
getAccessibleContext()287 	Reference< XAccessibleContext > AccessibleTabBarPage::getAccessibleContext(  ) throw (RuntimeException)
288 	{
289 		OExternalLockGuard aGuard( this );
290 
291 		return this;
292 	}
293 
294 	// -----------------------------------------------------------------------------
295 	// XAccessibleContext
296 	// -----------------------------------------------------------------------------
297 
getAccessibleChildCount()298 	sal_Int32 AccessibleTabBarPage::getAccessibleChildCount() throw (RuntimeException)
299 	{
300 		OExternalLockGuard aGuard( this );
301 
302 		return 0;
303 	}
304 
305 	// -----------------------------------------------------------------------------
306 
getAccessibleChild(sal_Int32 i)307 	Reference< XAccessible > AccessibleTabBarPage::getAccessibleChild( sal_Int32 i ) throw (IndexOutOfBoundsException, RuntimeException)
308 	{
309 		OExternalLockGuard aGuard( this );
310 
311 		if ( i < 0 || i >= getAccessibleChildCount() )
312 			throw IndexOutOfBoundsException();
313 
314 		return Reference< XAccessible >();
315 	}
316 
317 	// -----------------------------------------------------------------------------
318 
getAccessibleParent()319 	Reference< XAccessible > AccessibleTabBarPage::getAccessibleParent(  ) throw (RuntimeException)
320 	{
321 		OExternalLockGuard aGuard( this );
322 
323 		return m_xParent;
324 	}
325 
326 	// -----------------------------------------------------------------------------
327 
getAccessibleIndexInParent()328 	sal_Int32 AccessibleTabBarPage::getAccessibleIndexInParent(  ) throw (RuntimeException)
329 	{
330 		OExternalLockGuard aGuard( this );
331 
332 		sal_Int32 nIndexInParent = -1;
333 		if ( m_pTabBar )
334 			nIndexInParent = m_pTabBar->GetPagePos( m_nPageId );
335 
336 		return nIndexInParent;
337 	}
338 
339 	// -----------------------------------------------------------------------------
340 
getAccessibleRole()341 	sal_Int16 AccessibleTabBarPage::getAccessibleRole(  ) throw (RuntimeException)
342 	{
343 		OExternalLockGuard aGuard( this );
344 
345 		return AccessibleRole::PAGE_TAB;
346 	}
347 
348 	// -----------------------------------------------------------------------------
349 
getAccessibleDescription()350 	::rtl::OUString AccessibleTabBarPage::getAccessibleDescription(	) throw (RuntimeException)
351 	{
352 		OExternalLockGuard aGuard( this );
353 
354 		::rtl::OUString sDescription;
355 		if ( m_pTabBar )
356 			sDescription = m_pTabBar->GetHelpText( m_nPageId );
357 
358 		return sDescription;
359 	}
360 
361 	// -----------------------------------------------------------------------------
362 
getAccessibleName()363 	::rtl::OUString AccessibleTabBarPage::getAccessibleName(  ) throw (RuntimeException)
364 	{
365 		OExternalLockGuard aGuard( this );
366 
367 		return m_sPageText;
368 	}
369 
370 	// -----------------------------------------------------------------------------
371 
getAccessibleRelationSet()372 	Reference< XAccessibleRelationSet > AccessibleTabBarPage::getAccessibleRelationSet(  ) throw (RuntimeException)
373 	{
374 		OExternalLockGuard aGuard( this );
375 
376 		utl::AccessibleRelationSetHelper* pRelationSetHelper = new utl::AccessibleRelationSetHelper;
377 		Reference< XAccessibleRelationSet > xSet = pRelationSetHelper;
378 		return xSet;
379 	}
380 
381 	// -----------------------------------------------------------------------------
382 
getAccessibleStateSet()383 	Reference< XAccessibleStateSet > AccessibleTabBarPage::getAccessibleStateSet(  ) throw (RuntimeException)
384 	{
385 		OExternalLockGuard aGuard( this );
386 
387 		utl::AccessibleStateSetHelper* pStateSetHelper = new utl::AccessibleStateSetHelper;
388 		Reference< XAccessibleStateSet > xSet = pStateSetHelper;
389 
390 		if ( !rBHelper.bDisposed && !rBHelper.bInDispose )
391 		{
392 			FillAccessibleStateSet( *pStateSetHelper );
393 		}
394 		else
395 		{
396 			pStateSetHelper->AddState( AccessibleStateType::DEFUNC );
397 		}
398 
399 		return xSet;
400 	}
401 
402 	// -----------------------------------------------------------------------------
403 
getLocale()404 	Locale AccessibleTabBarPage::getLocale(  ) throw (IllegalAccessibleComponentStateException, RuntimeException)
405 	{
406 		OExternalLockGuard aGuard( this );
407 
408 		return Application::GetSettings().GetLocale();
409 	}
410 
411 	// -----------------------------------------------------------------------------
412 	// XAccessibleComponent
413 	// -----------------------------------------------------------------------------
414 
getAccessibleAtPoint(const awt::Point &)415 	Reference< XAccessible > AccessibleTabBarPage::getAccessibleAtPoint( const awt::Point& ) throw (RuntimeException)
416 	{
417 		OExternalLockGuard aGuard( this );
418 
419 		return Reference< XAccessible >();
420 	}
421 
422 	// -----------------------------------------------------------------------------
423 
grabFocus()424 	void AccessibleTabBarPage::grabFocus(  ) throw (RuntimeException)
425 	{
426 		// no focus
427 	}
428 
429 	// -----------------------------------------------------------------------------
430 
getForeground()431 	sal_Int32 AccessibleTabBarPage::getForeground(	) throw (RuntimeException)
432 	{
433 		OExternalLockGuard aGuard( this );
434 
435 		sal_Int32 nColor = 0;
436 		Reference< XAccessible > xParent = getAccessibleParent();
437 		if ( xParent.is() )
438 		{
439 			Reference< XAccessibleComponent > xParentComp( xParent->getAccessibleContext(), UNO_QUERY );
440 			if ( xParentComp.is() )
441 				nColor = xParentComp->getForeground();
442 		}
443 
444 		return nColor;
445 	}
446 
447 	// -----------------------------------------------------------------------------
448 
getBackground()449 	sal_Int32 AccessibleTabBarPage::getBackground(  ) throw (RuntimeException)
450 	{
451 		OExternalLockGuard aGuard( this );
452 
453 		sal_Int32 nColor = 0;
454 		Reference< XAccessible > xParent = getAccessibleParent();
455 		if ( xParent.is() )
456 		{
457 			Reference< XAccessibleComponent > xParentComp( xParent->getAccessibleContext(), UNO_QUERY );
458 			if ( xParentComp.is() )
459 				nColor = xParentComp->getBackground();
460 		}
461 
462 		return nColor;
463 	}
464 
465 	// -----------------------------------------------------------------------------
466 	// XAccessibleExtendedComponent
467 	// -----------------------------------------------------------------------------
468 
getFont()469 	Reference< awt::XFont > AccessibleTabBarPage::getFont(  ) throw (RuntimeException)
470 	{
471 		OExternalLockGuard aGuard( this );
472 
473 		Reference< awt::XFont > xFont;
474 		Reference< XAccessible > xParent = getAccessibleParent();
475 		if ( xParent.is() )
476 		{
477 			Reference< XAccessibleExtendedComponent > xParentComp( xParent->getAccessibleContext(), UNO_QUERY );
478 			if ( xParentComp.is() )
479 				xFont = xParentComp->getFont();
480 		}
481 
482 		return xFont;
483 	}
484 
485 	// -----------------------------------------------------------------------------
486 
getTitledBorderText()487 	::rtl::OUString AccessibleTabBarPage::getTitledBorderText(  ) throw (RuntimeException)
488 	{
489 		OExternalLockGuard aGuard( this );
490 
491 		return m_sPageText;
492 	}
493 
494 	// -----------------------------------------------------------------------------
495 
getToolTipText()496 	::rtl::OUString AccessibleTabBarPage::getToolTipText(  ) throw (RuntimeException)
497 	{
498 		OExternalLockGuard aGuard( this );
499 
500 		return ::rtl::OUString();
501 	}
502 
503 	// -----------------------------------------------------------------------------
504 
505 //.........................................................................
506 }	// namespace accessibility
507 //.........................................................................
508