1 /************************************************************************* 2 * 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * Copyright 2000, 2010 Oracle and/or its affiliates. 6 * 7 * OpenOffice.org - a multi-platform office productivity suite 8 * 9 * This file is part of OpenOffice.org. 10 * 11 * OpenOffice.org is free software: you can redistribute it and/or modify 12 * it under the terms of the GNU Lesser General Public License version 3 13 * only, as published by the Free Software Foundation. 14 * 15 * OpenOffice.org is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU Lesser General Public License version 3 for more details 19 * (a copy is included in the LICENSE file that accompanied this code). 20 * 21 * You should have received a copy of the GNU Lesser General Public License 22 * version 3 along with OpenOffice.org. If not, see 23 * <http://www.openoffice.org/license.html> 24 * for a copy of the LGPLv3 License. 25 * 26 ************************************************************************/ 27 28 // MARKER(update_precomp.py): autogen include statement, do not remove 29 #include "precompiled_accessibility.hxx" 30 31 // includes -------------------------------------------------------------- 32 #include <accessibility/standard/vclxaccessiblescrollbar.hxx> 33 34 #include <toolkit/awt/vclxwindows.hxx> 35 #include <accessibility/helper/accresmgr.hxx> 36 #include <accessibility/helper/accessiblestrings.hrc> 37 38 #include <unotools/accessiblestatesethelper.hxx> 39 #include <com/sun/star/accessibility/AccessibleStateType.hpp> 40 #include <com/sun/star/accessibility/AccessibleEventId.hpp> 41 #include <com/sun/star/awt/ScrollBarOrientation.hpp> 42 #include <cppuhelper/typeprovider.hxx> 43 #include <comphelper/sequence.hxx> 44 #include <vcl/scrbar.hxx> 45 46 using namespace ::com::sun::star; 47 using namespace ::com::sun::star::uno; 48 using namespace ::com::sun::star::awt; 49 using namespace ::com::sun::star::lang; 50 using namespace ::com::sun::star::beans; 51 using namespace ::com::sun::star::accessibility; 52 using namespace ::comphelper; 53 54 55 // ----------------------------------------------------------------------------- 56 // VCLXAccessibleScrollBar 57 // ----------------------------------------------------------------------------- 58 59 VCLXAccessibleScrollBar::VCLXAccessibleScrollBar( VCLXWindow* pVCLWindow ) 60 :VCLXAccessibleComponent( pVCLWindow ) 61 { 62 } 63 64 // ----------------------------------------------------------------------------- 65 66 VCLXAccessibleScrollBar::~VCLXAccessibleScrollBar() 67 { 68 } 69 70 // ----------------------------------------------------------------------------- 71 72 void VCLXAccessibleScrollBar::ProcessWindowEvent( const VclWindowEvent& rVclWindowEvent ) 73 { 74 switch ( rVclWindowEvent.GetId() ) 75 { 76 case VCLEVENT_SCROLLBAR_SCROLL: 77 { 78 NotifyAccessibleEvent( AccessibleEventId::VALUE_CHANGED, Any(), Any() ); 79 } 80 break; 81 default: 82 VCLXAccessibleComponent::ProcessWindowEvent( rVclWindowEvent ); 83 } 84 } 85 86 // ----------------------------------------------------------------------------- 87 88 void VCLXAccessibleScrollBar::FillAccessibleStateSet( utl::AccessibleStateSetHelper& rStateSet ) 89 { 90 VCLXAccessibleComponent::FillAccessibleStateSet( rStateSet ); 91 92 VCLXScrollBar* pVCLXScrollBar = static_cast< VCLXScrollBar* >( GetVCLXWindow() ); 93 if ( pVCLXScrollBar ) 94 { 95 rStateSet.AddState( AccessibleStateType::FOCUSABLE ); 96 if ( pVCLXScrollBar->getOrientation() == ScrollBarOrientation::HORIZONTAL ) 97 rStateSet.AddState( AccessibleStateType::HORIZONTAL ); 98 else if ( pVCLXScrollBar->getOrientation() == ScrollBarOrientation::VERTICAL ) 99 rStateSet.AddState( AccessibleStateType::VERTICAL ); 100 } 101 } 102 103 // ----------------------------------------------------------------------------- 104 // XInterface 105 // ----------------------------------------------------------------------------- 106 107 IMPLEMENT_FORWARD_XINTERFACE2( VCLXAccessibleScrollBar, VCLXAccessibleComponent, VCLXAccessibleScrollBar_BASE ) 108 109 // ----------------------------------------------------------------------------- 110 // XTypeProvider 111 // ----------------------------------------------------------------------------- 112 113 IMPLEMENT_FORWARD_XTYPEPROVIDER2( VCLXAccessibleScrollBar, VCLXAccessibleComponent, VCLXAccessibleScrollBar_BASE ) 114 115 // ----------------------------------------------------------------------------- 116 // XServiceInfo 117 // ----------------------------------------------------------------------------- 118 119 ::rtl::OUString VCLXAccessibleScrollBar::getImplementationName() throw (RuntimeException) 120 { 121 return ::rtl::OUString::createFromAscii( "com.sun.star.comp.toolkit.AccessibleScrollBar" ); 122 } 123 124 // ----------------------------------------------------------------------------- 125 126 Sequence< ::rtl::OUString > VCLXAccessibleScrollBar::getSupportedServiceNames() throw (RuntimeException) 127 { 128 Sequence< ::rtl::OUString > aNames(1); 129 aNames[0] = ::rtl::OUString::createFromAscii( "com.sun.star.awt.AccessibleScrollBar" ); 130 return aNames; 131 } 132 133 // ----------------------------------------------------------------------------- 134 // XAccessibleAction 135 // ----------------------------------------------------------------------------- 136 137 sal_Int32 VCLXAccessibleScrollBar::getAccessibleActionCount( ) throw (RuntimeException) 138 { 139 OExternalLockGuard aGuard( this ); 140 141 return 4; 142 } 143 144 // ----------------------------------------------------------------------------- 145 146 sal_Bool VCLXAccessibleScrollBar::doAccessibleAction ( sal_Int32 nIndex ) throw (IndexOutOfBoundsException, RuntimeException) 147 { 148 OExternalLockGuard aGuard( this ); 149 150 if ( nIndex < 0 || nIndex >= getAccessibleActionCount() ) 151 throw IndexOutOfBoundsException(); 152 153 sal_Bool bReturn = sal_False; 154 ScrollBar* pScrollBar = static_cast< ScrollBar* >( GetWindow() ); 155 if ( pScrollBar ) 156 { 157 ScrollType eScrollType; 158 switch ( nIndex ) 159 { 160 case 0: eScrollType = SCROLL_LINEUP; break; 161 case 1: eScrollType = SCROLL_LINEDOWN; break; 162 case 2: eScrollType = SCROLL_PAGEUP; break; 163 case 3: eScrollType = SCROLL_PAGEDOWN; break; 164 default: eScrollType = SCROLL_DONTKNOW; break; 165 } 166 if ( pScrollBar->DoScrollAction( eScrollType ) ) 167 bReturn = sal_True; 168 } 169 170 return bReturn; 171 } 172 173 // ----------------------------------------------------------------------------- 174 175 ::rtl::OUString VCLXAccessibleScrollBar::getAccessibleActionDescription ( sal_Int32 nIndex ) throw (IndexOutOfBoundsException, RuntimeException) 176 { 177 OExternalLockGuard aGuard( this ); 178 179 if ( nIndex < 0 || nIndex >= getAccessibleActionCount() ) 180 throw IndexOutOfBoundsException(); 181 182 ::rtl::OUString sDescription; 183 184 switch ( nIndex ) 185 { 186 case 0: sDescription = ::rtl::OUString( TK_RES_STRING( RID_STR_ACC_ACTION_DECLINE ) ); break; 187 case 1: sDescription = ::rtl::OUString( TK_RES_STRING( RID_STR_ACC_ACTION_INCLINE ) ); break; 188 case 2: sDescription = ::rtl::OUString( TK_RES_STRING( RID_STR_ACC_ACTION_DECBLOCK ) ); break; 189 case 3: sDescription = ::rtl::OUString( TK_RES_STRING( RID_STR_ACC_ACTION_INCBLOCK ) ); break; 190 default: break; 191 } 192 193 return sDescription; 194 } 195 196 // ----------------------------------------------------------------------------- 197 198 Reference< XAccessibleKeyBinding > VCLXAccessibleScrollBar::getAccessibleActionKeyBinding( sal_Int32 nIndex ) throw (IndexOutOfBoundsException, RuntimeException) 199 { 200 OExternalLockGuard aGuard( this ); 201 202 if ( nIndex < 0 || nIndex >= getAccessibleActionCount() ) 203 throw IndexOutOfBoundsException(); 204 205 return Reference< XAccessibleKeyBinding >(); 206 } 207 208 // ----------------------------------------------------------------------------- 209 // XAccessibleValue 210 // ----------------------------------------------------------------------------- 211 212 Any VCLXAccessibleScrollBar::getCurrentValue( ) throw (RuntimeException) 213 { 214 OExternalLockGuard aGuard( this ); 215 216 Any aValue; 217 218 VCLXScrollBar* pVCLXScrollBar = static_cast< VCLXScrollBar* >( GetVCLXWindow() ); 219 if ( pVCLXScrollBar ) 220 aValue <<= (sal_Int32) pVCLXScrollBar->getValue(); 221 222 return aValue; 223 } 224 225 // ----------------------------------------------------------------------------- 226 227 sal_Bool VCLXAccessibleScrollBar::setCurrentValue( const Any& aNumber ) throw (RuntimeException) 228 { 229 OExternalLockGuard aGuard( this ); 230 231 sal_Bool bReturn = sal_False; 232 233 VCLXScrollBar* pVCLXScrollBar = static_cast< VCLXScrollBar* >( GetVCLXWindow() ); 234 if ( pVCLXScrollBar ) 235 { 236 sal_Int32 nValue = 0, nValueMin = 0, nValueMax = 0; 237 OSL_VERIFY( aNumber >>= nValue ); 238 OSL_VERIFY( getMinimumValue() >>= nValueMin ); 239 OSL_VERIFY( getMaximumValue() >>= nValueMax ); 240 241 if ( nValue < nValueMin ) 242 nValue = nValueMin; 243 else if ( nValue > nValueMax ) 244 nValue = nValueMax; 245 246 pVCLXScrollBar->setValue( nValue ); 247 bReturn = sal_True; 248 } 249 250 return bReturn; 251 } 252 253 // ----------------------------------------------------------------------------- 254 255 Any VCLXAccessibleScrollBar::getMaximumValue( ) throw (RuntimeException) 256 { 257 OExternalLockGuard aGuard( this ); 258 259 Any aValue; 260 261 VCLXScrollBar* pVCLXScrollBar = static_cast< VCLXScrollBar* >( GetVCLXWindow() ); 262 if ( pVCLXScrollBar ) 263 aValue <<= (sal_Int32) pVCLXScrollBar->getMaximum(); 264 265 return aValue; 266 } 267 268 // ----------------------------------------------------------------------------- 269 270 Any VCLXAccessibleScrollBar::getMinimumValue( ) throw (RuntimeException) 271 { 272 OExternalLockGuard aGuard( this ); 273 274 Any aValue; 275 aValue <<= (sal_Int32) 0; 276 277 return aValue; 278 } 279 280 // ----------------------------------------------------------------------------- 281