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         rStateSet.AddState( AccessibleStateType::FOCUSABLE );
92 		if ( pVCLXScrollBar->getOrientation() == ScrollBarOrientation::HORIZONTAL )
93             rStateSet.AddState( AccessibleStateType::HORIZONTAL );
94 		else if ( pVCLXScrollBar->getOrientation() == ScrollBarOrientation::VERTICAL )
95             rStateSet.AddState( AccessibleStateType::VERTICAL );
96 	}
97 }
98 
99 // -----------------------------------------------------------------------------
100 // XInterface
101 // -----------------------------------------------------------------------------
102 
103 IMPLEMENT_FORWARD_XINTERFACE2( VCLXAccessibleScrollBar, VCLXAccessibleComponent, VCLXAccessibleScrollBar_BASE )
104 
105 // -----------------------------------------------------------------------------
106 // XTypeProvider
107 // -----------------------------------------------------------------------------
108 
109 IMPLEMENT_FORWARD_XTYPEPROVIDER2( VCLXAccessibleScrollBar, VCLXAccessibleComponent, VCLXAccessibleScrollBar_BASE )
110 
111 // -----------------------------------------------------------------------------
112 // XServiceInfo
113 // -----------------------------------------------------------------------------
114 
115 ::rtl::OUString VCLXAccessibleScrollBar::getImplementationName() throw (RuntimeException)
116 {
117 	return ::rtl::OUString::createFromAscii( "com.sun.star.comp.toolkit.AccessibleScrollBar" );
118 }
119 
120 // -----------------------------------------------------------------------------
121 
122 Sequence< ::rtl::OUString > VCLXAccessibleScrollBar::getSupportedServiceNames() throw (RuntimeException)
123 {
124 	Sequence< ::rtl::OUString > aNames(1);
125 	aNames[0] = ::rtl::OUString::createFromAscii( "com.sun.star.awt.AccessibleScrollBar" );
126 	return aNames;
127 }
128 
129 // -----------------------------------------------------------------------------
130 // XAccessibleAction
131 // -----------------------------------------------------------------------------
132 
133 sal_Int32 VCLXAccessibleScrollBar::getAccessibleActionCount( ) throw (RuntimeException)
134 {
135 	OExternalLockGuard aGuard( this );
136 
137 	return 4;
138 }
139 
140 // -----------------------------------------------------------------------------
141 
142 sal_Bool VCLXAccessibleScrollBar::doAccessibleAction ( sal_Int32 nIndex ) throw (IndexOutOfBoundsException, RuntimeException)
143 {
144 	OExternalLockGuard aGuard( this );
145 
146 	if ( nIndex < 0 || nIndex >= getAccessibleActionCount() )
147         throw IndexOutOfBoundsException();
148 
149 	sal_Bool bReturn = sal_False;
150 	ScrollBar* pScrollBar = static_cast< ScrollBar* >( GetWindow() );
151 	if ( pScrollBar )
152 	{
153 		ScrollType eScrollType;
154 		switch ( nIndex )
155 		{
156 			case 0:		eScrollType = SCROLL_LINEUP;	break;
157 			case 1:		eScrollType = SCROLL_LINEDOWN;	break;
158 			case 2:		eScrollType = SCROLL_PAGEUP;	break;
159 			case 3:		eScrollType = SCROLL_PAGEDOWN;	break;
160 			default:	eScrollType = SCROLL_DONTKNOW;	break;
161 		}
162 		if ( pScrollBar->DoScrollAction( eScrollType ) )
163 			bReturn = sal_True;
164 	}
165 
166 	return bReturn;
167 }
168 
169 // -----------------------------------------------------------------------------
170 
171 ::rtl::OUString VCLXAccessibleScrollBar::getAccessibleActionDescription ( sal_Int32 nIndex ) throw (IndexOutOfBoundsException, RuntimeException)
172 {
173 	OExternalLockGuard aGuard( this );
174 
175 	if ( nIndex < 0 || nIndex >= getAccessibleActionCount() )
176         throw IndexOutOfBoundsException();
177 
178 	::rtl::OUString sDescription;
179 
180 	switch ( nIndex )
181 	{
182 		case 0:		sDescription = ::rtl::OUString( TK_RES_STRING( RID_STR_ACC_ACTION_DECLINE ) );		break;
183 		case 1:		sDescription = ::rtl::OUString( TK_RES_STRING( RID_STR_ACC_ACTION_INCLINE ) );		break;
184 		case 2:		sDescription = ::rtl::OUString( TK_RES_STRING( RID_STR_ACC_ACTION_DECBLOCK ) );		break;
185 		case 3:		sDescription = ::rtl::OUString( TK_RES_STRING( RID_STR_ACC_ACTION_INCBLOCK ) );		break;
186 		default:																						break;
187 	}
188 
189 	return sDescription;
190 }
191 
192 // -----------------------------------------------------------------------------
193 
194 Reference< XAccessibleKeyBinding > VCLXAccessibleScrollBar::getAccessibleActionKeyBinding( sal_Int32 nIndex ) throw (IndexOutOfBoundsException, RuntimeException)
195 {
196 	OExternalLockGuard aGuard( this );
197 
198 	if ( nIndex < 0 || nIndex >= getAccessibleActionCount() )
199         throw IndexOutOfBoundsException();
200 
201 	return Reference< XAccessibleKeyBinding >();
202 }
203 
204 // -----------------------------------------------------------------------------
205 // XAccessibleValue
206 // -----------------------------------------------------------------------------
207 
208 Any VCLXAccessibleScrollBar::getCurrentValue(  ) throw (RuntimeException)
209 {
210 	OExternalLockGuard aGuard( this );
211 
212 	Any aValue;
213 
214 	VCLXScrollBar* pVCLXScrollBar = static_cast< VCLXScrollBar* >( GetVCLXWindow() );
215 	if ( pVCLXScrollBar )
216 		aValue <<= (sal_Int32) pVCLXScrollBar->getValue();
217 
218 	return aValue;
219 }
220 
221 // -----------------------------------------------------------------------------
222 
223 sal_Bool VCLXAccessibleScrollBar::setCurrentValue( const Any& aNumber ) throw (RuntimeException)
224 {
225 	OExternalLockGuard aGuard( this );
226 
227 	sal_Bool bReturn = sal_False;
228 
229 	VCLXScrollBar* pVCLXScrollBar = static_cast< VCLXScrollBar* >( GetVCLXWindow() );
230 	if ( pVCLXScrollBar )
231 	{
232 		sal_Int32 nValue = 0, nValueMin = 0, nValueMax = 0;
233 		OSL_VERIFY( aNumber >>= nValue );
234 		OSL_VERIFY( getMinimumValue() >>= nValueMin );
235 		OSL_VERIFY( getMaximumValue() >>= nValueMax );
236 
237 		if ( nValue < nValueMin )
238 			nValue = nValueMin;
239 		else if ( nValue > nValueMax )
240 			nValue = nValueMax;
241 
242 		pVCLXScrollBar->setValue( nValue );
243 		bReturn = sal_True;
244 	}
245 
246 	return bReturn;
247 }
248 
249 // -----------------------------------------------------------------------------
250 
251 Any VCLXAccessibleScrollBar::getMaximumValue(  ) throw (RuntimeException)
252 {
253 	OExternalLockGuard aGuard( this );
254 
255 	Any aValue;
256 
257 	VCLXScrollBar* pVCLXScrollBar = static_cast< VCLXScrollBar* >( GetVCLXWindow() );
258 	if ( pVCLXScrollBar )
259 		aValue <<= (sal_Int32) pVCLXScrollBar->getMaximum();
260 
261 	return aValue;
262 }
263 
264 // -----------------------------------------------------------------------------
265 
266 Any VCLXAccessibleScrollBar::getMinimumValue(  ) throw (RuntimeException)
267 {
268 	OExternalLockGuard aGuard( this );
269 
270 	Any aValue;
271 	aValue <<= (sal_Int32) 0;
272 
273 	return aValue;
274 }
275 
276 // -----------------------------------------------------------------------------
277