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 
27 // includes --------------------------------------------------------------
28 #include <accessibility/standard/vclxaccessiblescrollbar.hxx>
29 
30 #include <toolkit/awt/vclxwindows.hxx>
31 #include <accessibility/helper/accresmgr.hxx>
32 #include <accessibility/helper/accessiblestrings.hrc>
33 
34 #include <unotools/accessiblestatesethelper.hxx>
35 #include <com/sun/star/accessibility/AccessibleStateType.hpp>
36 #include <com/sun/star/accessibility/AccessibleEventId.hpp>
37 #include <com/sun/star/awt/ScrollBarOrientation.hpp>
38 #include <cppuhelper/typeprovider.hxx>
39 #include <comphelper/sequence.hxx>
40 #include <vcl/scrbar.hxx>
41 
42 using namespace ::com::sun::star;
43 using namespace ::com::sun::star::uno;
44 using namespace ::com::sun::star::awt;
45 using namespace ::com::sun::star::lang;
46 using namespace ::com::sun::star::beans;
47 using namespace ::com::sun::star::accessibility;
48 using namespace ::comphelper;
49 
50 
51 // -----------------------------------------------------------------------------
52 // VCLXAccessibleScrollBar
53 // -----------------------------------------------------------------------------
54 
55 VCLXAccessibleScrollBar::VCLXAccessibleScrollBar( VCLXWindow* pVCLWindow )
56 	:VCLXAccessibleComponent( pVCLWindow )
57 {
58 }
59 
60 // -----------------------------------------------------------------------------
61 
62 VCLXAccessibleScrollBar::~VCLXAccessibleScrollBar()
63 {
64 }
65 
66 // -----------------------------------------------------------------------------
67 
68 void VCLXAccessibleScrollBar::ProcessWindowEvent( const VclWindowEvent& rVclWindowEvent )
69 {
70     switch ( rVclWindowEvent.GetId() )
71     {
72 		case VCLEVENT_SCROLLBAR_SCROLL:
73         {
74             NotifyAccessibleEvent( AccessibleEventId::VALUE_CHANGED, Any(), Any() );
75         }
76         break;
77 		default:
78 			VCLXAccessibleComponent::ProcessWindowEvent( rVclWindowEvent );
79    }
80 }
81 
82 // -----------------------------------------------------------------------------
83 
84 void VCLXAccessibleScrollBar::FillAccessibleStateSet( utl::AccessibleStateSetHelper& rStateSet )
85 {
86 	VCLXAccessibleComponent::FillAccessibleStateSet( rStateSet );
87 
88 	VCLXScrollBar* pVCLXScrollBar = static_cast< VCLXScrollBar* >( GetVCLXWindow() );
89 	if ( pVCLXScrollBar )
90 	{
91 		// IA2 CWS: scroll bar should not have FOCUSABLE state.
92         // rStateSet.AddState( AccessibleStateType::FOCUSABLE );
93 		if ( pVCLXScrollBar->getOrientation() == ScrollBarOrientation::HORIZONTAL )
94             rStateSet.AddState( AccessibleStateType::HORIZONTAL );
95 		else if ( pVCLXScrollBar->getOrientation() == ScrollBarOrientation::VERTICAL )
96             rStateSet.AddState( AccessibleStateType::VERTICAL );
97 	}
98 }
99 
100 // -----------------------------------------------------------------------------
101 // XInterface
102 // -----------------------------------------------------------------------------
103 
104 IMPLEMENT_FORWARD_XINTERFACE2( VCLXAccessibleScrollBar, VCLXAccessibleComponent, VCLXAccessibleScrollBar_BASE )
105 
106 // -----------------------------------------------------------------------------
107 // XTypeProvider
108 // -----------------------------------------------------------------------------
109 
110 IMPLEMENT_FORWARD_XTYPEPROVIDER2( VCLXAccessibleScrollBar, VCLXAccessibleComponent, VCLXAccessibleScrollBar_BASE )
111 
112 // -----------------------------------------------------------------------------
113 // XServiceInfo
114 // -----------------------------------------------------------------------------
115 
116 ::rtl::OUString VCLXAccessibleScrollBar::getImplementationName() throw (RuntimeException)
117 {
118 	return ::rtl::OUString::createFromAscii( "com.sun.star.comp.toolkit.AccessibleScrollBar" );
119 }
120 
121 // -----------------------------------------------------------------------------
122 
123 Sequence< ::rtl::OUString > VCLXAccessibleScrollBar::getSupportedServiceNames() throw (RuntimeException)
124 {
125 	Sequence< ::rtl::OUString > aNames(1);
126 	aNames[0] = ::rtl::OUString::createFromAscii( "com.sun.star.awt.AccessibleScrollBar" );
127 	return aNames;
128 }
129 
130 // -----------------------------------------------------------------------------
131 // XAccessibleAction
132 // -----------------------------------------------------------------------------
133 
134 sal_Int32 VCLXAccessibleScrollBar::getAccessibleActionCount( ) throw (RuntimeException)
135 {
136 	OExternalLockGuard aGuard( this );
137 
138 	return 4;
139 }
140 
141 // -----------------------------------------------------------------------------
142 
143 sal_Bool VCLXAccessibleScrollBar::doAccessibleAction ( sal_Int32 nIndex ) throw (IndexOutOfBoundsException, RuntimeException)
144 {
145 	OExternalLockGuard aGuard( this );
146 
147 	if ( nIndex < 0 || nIndex >= getAccessibleActionCount() )
148         throw IndexOutOfBoundsException();
149 
150 	sal_Bool bReturn = sal_False;
151 	ScrollBar* pScrollBar = static_cast< ScrollBar* >( GetWindow() );
152 	if ( pScrollBar )
153 	{
154 		ScrollType eScrollType;
155 		switch ( nIndex )
156 		{
157 			case 0:		eScrollType = SCROLL_LINEUP;	break;
158 			case 1:		eScrollType = SCROLL_LINEDOWN;	break;
159 			case 2:		eScrollType = SCROLL_PAGEUP;	break;
160 			case 3:		eScrollType = SCROLL_PAGEDOWN;	break;
161 			default:	eScrollType = SCROLL_DONTKNOW;	break;
162 		}
163 		if ( pScrollBar->DoScrollAction( eScrollType ) )
164 			bReturn = sal_True;
165 	}
166 
167 	return bReturn;
168 }
169 
170 // -----------------------------------------------------------------------------
171 
172 ::rtl::OUString VCLXAccessibleScrollBar::getAccessibleActionDescription ( sal_Int32 nIndex ) throw (IndexOutOfBoundsException, RuntimeException)
173 {
174 	OExternalLockGuard aGuard( this );
175 
176 	if ( nIndex < 0 || nIndex >= getAccessibleActionCount() )
177         throw IndexOutOfBoundsException();
178 
179 	::rtl::OUString sDescription;
180 
181 	switch ( nIndex )
182 	{
183 		case 0:		sDescription = ::rtl::OUString( TK_RES_STRING( RID_STR_ACC_ACTION_DECLINE ) );		break;
184 		case 1:		sDescription = ::rtl::OUString( TK_RES_STRING( RID_STR_ACC_ACTION_INCLINE ) );		break;
185 		case 2:		sDescription = ::rtl::OUString( TK_RES_STRING( RID_STR_ACC_ACTION_DECBLOCK ) );		break;
186 		case 3:		sDescription = ::rtl::OUString( TK_RES_STRING( RID_STR_ACC_ACTION_INCBLOCK ) );		break;
187 		default:																						break;
188 	}
189 
190 	return sDescription;
191 }
192 
193 // -----------------------------------------------------------------------------
194 
195 Reference< XAccessibleKeyBinding > VCLXAccessibleScrollBar::getAccessibleActionKeyBinding( sal_Int32 nIndex ) throw (IndexOutOfBoundsException, RuntimeException)
196 {
197 	OExternalLockGuard aGuard( this );
198 
199 	if ( nIndex < 0 || nIndex >= getAccessibleActionCount() )
200         throw IndexOutOfBoundsException();
201 
202 	return Reference< XAccessibleKeyBinding >();
203 }
204 
205 // -----------------------------------------------------------------------------
206 // XAccessibleValue
207 // -----------------------------------------------------------------------------
208 
209 Any VCLXAccessibleScrollBar::getCurrentValue(  ) throw (RuntimeException)
210 {
211 	OExternalLockGuard aGuard( this );
212 
213 	Any aValue;
214 
215 	VCLXScrollBar* pVCLXScrollBar = static_cast< VCLXScrollBar* >( GetVCLXWindow() );
216 	if ( pVCLXScrollBar )
217 		aValue <<= (sal_Int32) pVCLXScrollBar->getValue();
218 
219 	return aValue;
220 }
221 
222 // -----------------------------------------------------------------------------
223 
224 sal_Bool VCLXAccessibleScrollBar::setCurrentValue( const Any& aNumber ) throw (RuntimeException)
225 {
226 	OExternalLockGuard aGuard( this );
227 
228 	sal_Bool bReturn = sal_False;
229 
230 	VCLXScrollBar* pVCLXScrollBar = static_cast< VCLXScrollBar* >( GetVCLXWindow() );
231 	if ( pVCLXScrollBar )
232 	{
233 		sal_Int32 nValue = 0, nValueMin = 0, nValueMax = 0;
234 		OSL_VERIFY( aNumber >>= nValue );
235 		OSL_VERIFY( getMinimumValue() >>= nValueMin );
236 		OSL_VERIFY( getMaximumValue() >>= nValueMax );
237 
238 		if ( nValue < nValueMin )
239 			nValue = nValueMin;
240 		else if ( nValue > nValueMax )
241 			nValue = nValueMax;
242 
243 		pVCLXScrollBar->setValue( nValue );
244 		bReturn = sal_True;
245 	}
246 
247 	return bReturn;
248 }
249 
250 // -----------------------------------------------------------------------------
251 
252 Any VCLXAccessibleScrollBar::getMaximumValue(  ) throw (RuntimeException)
253 {
254 	OExternalLockGuard aGuard( this );
255 
256 	Any aValue;
257 
258 	VCLXScrollBar* pVCLXScrollBar = static_cast< VCLXScrollBar* >( GetVCLXWindow() );
259 	if ( pVCLXScrollBar )
260 		aValue <<= (sal_Int32) pVCLXScrollBar->getMaximum();
261 
262 	return aValue;
263 }
264 
265 // -----------------------------------------------------------------------------
266 
267 Any VCLXAccessibleScrollBar::getMinimumValue(  ) throw (RuntimeException)
268 {
269 	OExternalLockGuard aGuard( this );
270 
271 	Any aValue;
272 	aValue <<= (sal_Int32) 0;
273 
274 	return aValue;
275 }
276 
277 // -----------------------------------------------------------------------------
278 
279 ::rtl::OUString VCLXAccessibleScrollBar::getAccessibleName(  ) throw (uno::RuntimeException)
280 {
281 	OExternalLockGuard aGuard( this );
282 
283 	::rtl::OUString aName;
284 	VCLXScrollBar* pVCLXScrollBar = static_cast< VCLXScrollBar* >( GetVCLXWindow() );
285 	if ( pVCLXScrollBar )
286 	{
287 		if ( pVCLXScrollBar->getOrientation() == ScrollBarOrientation::HORIZONTAL )
288             aName = TK_RES_STRING( RID_STR_ACC_SCROLLBAR_NAME_HORIZONTAL );
289 		else if ( pVCLXScrollBar->getOrientation() == ScrollBarOrientation::VERTICAL )
290             aName = TK_RES_STRING( RID_STR_ACC_SCROLLBAR_NAME_VERTICAL );
291 	}
292 	return aName;
293 }
294 
295