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
VCLXAccessibleScrollBar(VCLXWindow * pVCLWindow)55 VCLXAccessibleScrollBar::VCLXAccessibleScrollBar( VCLXWindow* pVCLWindow )
56 :VCLXAccessibleComponent( pVCLWindow )
57 {
58 }
59
60 // -----------------------------------------------------------------------------
61
~VCLXAccessibleScrollBar()62 VCLXAccessibleScrollBar::~VCLXAccessibleScrollBar()
63 {
64 }
65
66 // -----------------------------------------------------------------------------
67
ProcessWindowEvent(const VclWindowEvent & rVclWindowEvent)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
FillAccessibleStateSet(utl::AccessibleStateSetHelper & rStateSet)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
IMPLEMENT_FORWARD_XINTERFACE2(VCLXAccessibleScrollBar,VCLXAccessibleComponent,VCLXAccessibleScrollBar_BASE)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
getSupportedServiceNames()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
getAccessibleActionCount()134 sal_Int32 VCLXAccessibleScrollBar::getAccessibleActionCount( ) throw (RuntimeException)
135 {
136 OExternalLockGuard aGuard( this );
137
138 return 4;
139 }
140
141 // -----------------------------------------------------------------------------
142
doAccessibleAction(sal_Int32 nIndex)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
getAccessibleActionDescription(sal_Int32 nIndex)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
getAccessibleActionKeyBinding(sal_Int32 nIndex)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
getCurrentValue()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
setCurrentValue(const Any & aNumber)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
getMaximumValue()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
getMinimumValue()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
getAccessibleName()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