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_toolkit.hxx"
26 #include "toolkit/controls/tkspinbutton.hxx"
27 #include "toolkit/helper/property.hxx"
28 #include "toolkit/helper/unopropertyarrayhelper.hxx"
29 #include <com/sun/star/awt/ScrollBarOrientation.hpp>
30 
31 
32 #include <cppuhelper/typeprovider.hxx>
33 #include <tools/debug.hxx>
34 
35 //........................................................................
36 namespace toolkit
37 {
38 //........................................................................
39 
40     using namespace ::com::sun::star::uno;
41     using namespace ::com::sun::star::awt;
42     using namespace ::com::sun::star::lang;
43     using namespace ::com::sun::star::beans;
44 
45     //====================================================================
46 	//= UnoSpinButtonModel
47 	//====================================================================
48 	//--------------------------------------------------------------------
UnoSpinButtonModel(const::com::sun::star::uno::Reference<::com::sun::star::lang::XMultiServiceFactory> & i_factory)49     UnoSpinButtonModel::UnoSpinButtonModel( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& i_factory )
50         :UnoControlModel( i_factory )
51     {
52 	    ImplRegisterProperty( BASEPROPERTY_BACKGROUNDCOLOR );
53         ImplRegisterProperty( BASEPROPERTY_BORDER );
54 		ImplRegisterProperty( BASEPROPERTY_BORDERCOLOR );
55         ImplRegisterProperty( BASEPROPERTY_DEFAULTCONTROL );
56 	    ImplRegisterProperty( BASEPROPERTY_ENABLED );
57 	    ImplRegisterProperty( BASEPROPERTY_ENABLEVISIBLE );
58         ImplRegisterProperty( BASEPROPERTY_HELPTEXT );
59 	    ImplRegisterProperty( BASEPROPERTY_HELPURL );
60         ImplRegisterProperty( BASEPROPERTY_ORIENTATION );
61         ImplRegisterProperty( BASEPROPERTY_PRINTABLE );
62         ImplRegisterProperty( BASEPROPERTY_REPEAT );
63         ImplRegisterProperty( BASEPROPERTY_REPEAT_DELAY );
64         ImplRegisterProperty( BASEPROPERTY_SYMBOL_COLOR );
65         ImplRegisterProperty( BASEPROPERTY_SPINVALUE );
66         ImplRegisterProperty( BASEPROPERTY_SPINVALUE_MIN );
67         ImplRegisterProperty( BASEPROPERTY_SPINVALUE_MAX );
68         ImplRegisterProperty( BASEPROPERTY_SPININCREMENT );
69         ImplRegisterProperty( BASEPROPERTY_TABSTOP );
70         ImplRegisterProperty( BASEPROPERTY_WRITING_MODE );
71         ImplRegisterProperty( BASEPROPERTY_CONTEXT_WRITING_MODE );
72     }
73 
74 	//--------------------------------------------------------------------
getServiceName()75     ::rtl::OUString UnoSpinButtonModel::getServiceName( ) throw (RuntimeException)
76     {
77 	    return ::rtl::OUString::createFromAscii( szServiceName_UnoSpinButtonModel );
78     }
79 
80 	//--------------------------------------------------------------------
ImplGetDefaultValue(sal_uInt16 nPropId) const81     Any UnoSpinButtonModel::ImplGetDefaultValue( sal_uInt16 nPropId ) const
82     {
83         switch ( nPropId )
84         {
85         case BASEPROPERTY_DEFAULTCONTROL:
86             return makeAny( ::rtl::OUString::createFromAscii( szServiceName_UnoSpinButtonControl ) );
87 
88         case BASEPROPERTY_BORDER:
89             return makeAny( (sal_Int16) 0 );
90 
91         case BASEPROPERTY_REPEAT:
92             return makeAny( (sal_Bool)sal_True );
93 
94         default:
95     	    return UnoControlModel::ImplGetDefaultValue( nPropId );
96         }
97     }
98 
99 	//--------------------------------------------------------------------
getInfoHelper()100     ::cppu::IPropertyArrayHelper& UnoSpinButtonModel::getInfoHelper()
101     {
102 	    static UnoPropertyArrayHelper* pHelper = NULL;
103 	    if ( !pHelper )
104 	    {
105 		    Sequence<sal_Int32>	aIDs = ImplGetPropertyIds();
106 		    pHelper = new UnoPropertyArrayHelper( aIDs );
107 	    }
108 	    return *pHelper;
109     }
110 
111 	//--------------------------------------------------------------------
getPropertySetInfo()112     Reference< XPropertySetInfo > UnoSpinButtonModel::getPropertySetInfo(  ) throw(RuntimeException)
113     {
114 	    static Reference< XPropertySetInfo > xInfo( createPropertySetInfo( getInfoHelper() ) );
115 	    return xInfo;
116     }
117 
118 	//--------------------------------------------------------------------
getImplementationName()119     ::rtl::OUString SAL_CALL UnoSpinButtonModel::getImplementationName(  ) throw(RuntimeException)
120     {
121         return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.toolkit.UnoSpinButtonModel" ) );
122     }
123 
124 	//--------------------------------------------------------------------
getSupportedServiceNames()125     Sequence< ::rtl::OUString > SAL_CALL UnoSpinButtonModel::getSupportedServiceNames() throw(RuntimeException)
126     {
127         Sequence< ::rtl::OUString > aServices( UnoControlModel::getSupportedServiceNames() );
128         aServices.realloc( aServices.getLength() + 1 );
129         aServices[ aServices.getLength() - 1 ] = ::rtl::OUString::createFromAscii( szServiceName_UnoSpinButtonModel );
130         return aServices;
131     }
132 
133     //====================================================================
134 	//= UnoSpinButtonControl
135 	//====================================================================
136 	//--------------------------------------------------------------------
UnoSpinButtonControl(const Reference<XMultiServiceFactory> & i_factory)137     UnoSpinButtonControl::UnoSpinButtonControl( const Reference< XMultiServiceFactory >& i_factory )
138         :UnoControlBase( i_factory )
139 	    ,maAdjustmentListeners( *this )
140     {
141     }
142 
143 	//--------------------------------------------------------------------
GetComponentServiceName()144     ::rtl::OUString UnoSpinButtonControl::GetComponentServiceName()
145     {
146 	    return ::rtl::OUString::createFromAscii( "SpinButton" );
147     }
148 
149 	//--------------------------------------------------------------------
queryAggregation(const Type & rType)150     Any UnoSpinButtonControl::queryAggregation( const Type & rType ) throw(RuntimeException)
151     {
152         Any aRet = UnoControlBase::queryAggregation( rType );
153         if ( !aRet.hasValue() )
154             aRet = UnoSpinButtonControl_Base::queryInterface( rType );
155         return aRet;
156     }
157 
158 	//--------------------------------------------------------------------
IMPLEMENT_FORWARD_XTYPEPROVIDER2(UnoSpinButtonControl,UnoControlBase,UnoSpinButtonControl_Base)159     IMPLEMENT_FORWARD_XTYPEPROVIDER2( UnoSpinButtonControl, UnoControlBase, UnoSpinButtonControl_Base )
160 
161 	//--------------------------------------------------------------------
162     void UnoSpinButtonControl::dispose() throw(RuntimeException)
163     {
164         ::osl::ClearableMutexGuard aGuard( GetMutex() );
165         if ( maAdjustmentListeners.getLength() )
166         {
167             Reference< XSpinValue > xSpinnable( getPeer(), UNO_QUERY );
168             if ( xSpinnable.is() )
169                 xSpinnable->removeAdjustmentListener( this );
170 
171             EventObject aDisposeEvent;
172 	        aDisposeEvent.Source = *this;
173 
174             aGuard.clear();
175 	        maAdjustmentListeners.disposeAndClear( aDisposeEvent );
176         }
177 
178         UnoControl::dispose();
179     }
180 
181 	//--------------------------------------------------------------------
getImplementationName()182     ::rtl::OUString SAL_CALL UnoSpinButtonControl::getImplementationName(  ) throw(RuntimeException)
183     {
184         return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.toolkit.UnoSpinButtonControl" ) );
185     }
186 
187 	//--------------------------------------------------------------------
getSupportedServiceNames()188     Sequence< ::rtl::OUString > SAL_CALL UnoSpinButtonControl::getSupportedServiceNames() throw(RuntimeException)
189     {
190         Sequence< ::rtl::OUString > aServices( UnoControlBase::getSupportedServiceNames() );
191         aServices.realloc( aServices.getLength() + 1 );
192         aServices[ aServices.getLength() - 1 ] = ::rtl::OUString::createFromAscii( szServiceName_UnoSpinButtonControl );
193         return aServices;
194     }
195 
196     //--------------------------------------------------------------------
createPeer(const Reference<XToolkit> & rxToolkit,const Reference<XWindowPeer> & rParentPeer)197     void UnoSpinButtonControl::createPeer( const Reference< XToolkit > & rxToolkit, const Reference< XWindowPeer >  & rParentPeer ) throw(RuntimeException)
198     {
199 	    UnoControl::createPeer( rxToolkit, rParentPeer );
200 
201         Reference < XSpinValue > xSpinnable( getPeer(), UNO_QUERY );
202         if ( xSpinnable.is() )
203 	        xSpinnable->addAdjustmentListener( this );
204     }
205 
206 	//--------------------------------------------------------------------
adjustmentValueChanged(const AdjustmentEvent & rEvent)207     void UnoSpinButtonControl::adjustmentValueChanged( const AdjustmentEvent& rEvent ) throw(RuntimeException)
208     {
209 	    switch ( rEvent.Type )
210 	    {
211 		    case AdjustmentType_ADJUST_LINE:
212 		    case AdjustmentType_ADJUST_PAGE:
213 		    case AdjustmentType_ADJUST_ABS:
214 				ImplSetPropertyValue( GetPropertyName( BASEPROPERTY_SPINVALUE ), makeAny( rEvent.Value ), sal_False );
215     		    break;
216 		    default:
217                 DBG_ERROR( "UnoSpinButtonControl::adjustmentValueChanged - unknown Type" );
218 	    }
219 
220 	    if ( maAdjustmentListeners.getLength() )
221         {
222             AdjustmentEvent aEvent( rEvent );
223             aEvent.Source = *this;
224 		    maAdjustmentListeners.adjustmentValueChanged( aEvent );
225         }
226     }
227 
228 	//--------------------------------------------------------------------
addAdjustmentListener(const Reference<XAdjustmentListener> & listener)229     void UnoSpinButtonControl::addAdjustmentListener( const Reference< XAdjustmentListener > & listener ) throw(RuntimeException)
230     {
231         ::osl::MutexGuard aGuard( GetMutex() );
232 	    maAdjustmentListeners.addInterface( listener );
233     }
234 
235 	//--------------------------------------------------------------------
removeAdjustmentListener(const Reference<XAdjustmentListener> & listener)236     void UnoSpinButtonControl::removeAdjustmentListener( const Reference< XAdjustmentListener > & listener ) throw(RuntimeException)
237     {
238         ::osl::MutexGuard aGuard( GetMutex() );
239 	    maAdjustmentListeners.removeInterface( listener );
240     }
241 
242     //--------------------------------------------------------------------
setValue(sal_Int32 value)243     void SAL_CALL UnoSpinButtonControl::setValue( sal_Int32 value ) throw (RuntimeException)
244     {
245 	    ImplSetPropertyValue( GetPropertyName( BASEPROPERTY_SPINVALUE ), makeAny( value ), sal_True );
246     }
247 
248     //--------------------------------------------------------------------
setValues(sal_Int32 minValue,sal_Int32 maxValue,sal_Int32 currentValue)249     void SAL_CALL UnoSpinButtonControl::setValues( sal_Int32 minValue, sal_Int32 maxValue, sal_Int32 currentValue ) throw (RuntimeException)
250     {
251 	    ImplSetPropertyValue( GetPropertyName( BASEPROPERTY_SPINVALUE_MIN ), makeAny( minValue ), sal_True );
252 	    ImplSetPropertyValue( GetPropertyName( BASEPROPERTY_SPINVALUE_MAX ), makeAny( maxValue ), sal_True );
253 	    ImplSetPropertyValue( GetPropertyName( BASEPROPERTY_SPINVALUE ), makeAny( currentValue ), sal_True );
254     }
255 
256     //--------------------------------------------------------------------
getValue()257     sal_Int32 SAL_CALL UnoSpinButtonControl::getValue(  ) throw (RuntimeException)
258     {
259         ::osl::MutexGuard aGuard( GetMutex() );
260         sal_Int32 nValue = 0;
261 
262         Reference< XSpinValue > xSpinnable( getPeer(), UNO_QUERY );
263 	    if ( xSpinnable.is() )
264 		    nValue = xSpinnable->getValue();
265 
266         return nValue;
267     }
268 
269     //--------------------------------------------------------------------
setMinimum(sal_Int32 minValue)270     void SAL_CALL UnoSpinButtonControl::setMinimum( sal_Int32 minValue ) throw (RuntimeException)
271     {
272 	    ImplSetPropertyValue( GetPropertyName( BASEPROPERTY_SPINVALUE_MIN ), makeAny( minValue ), sal_True );
273     }
274 
275     //--------------------------------------------------------------------
setMaximum(sal_Int32 maxValue)276     void SAL_CALL UnoSpinButtonControl::setMaximum( sal_Int32 maxValue ) throw (RuntimeException)
277     {
278 	    ImplSetPropertyValue( GetPropertyName( BASEPROPERTY_SPINVALUE_MAX ), makeAny( maxValue ), sal_True );
279     }
280 
281     //--------------------------------------------------------------------
getMinimum()282     sal_Int32 SAL_CALL UnoSpinButtonControl::getMinimum(  ) throw (RuntimeException)
283     {
284         ::osl::MutexGuard aGuard( GetMutex() );
285         sal_Int32 nMin = 0;
286 
287         Reference< XSpinValue > xSpinnable( getPeer(), UNO_QUERY );
288 	    if ( xSpinnable.is() )
289 		    nMin = xSpinnable->getMinimum();
290 
291         return nMin;
292     }
293 
294     //--------------------------------------------------------------------
getMaximum()295     sal_Int32 SAL_CALL UnoSpinButtonControl::getMaximum(  ) throw (RuntimeException)
296     {
297         ::osl::MutexGuard aGuard( GetMutex() );
298         sal_Int32 nMax = 0;
299 
300         Reference< XSpinValue > xSpinnable( getPeer(), UNO_QUERY );
301 	    if ( xSpinnable.is() )
302 		    nMax = xSpinnable->getMaximum();
303 
304         return nMax;
305     }
306 
307     //--------------------------------------------------------------------
setSpinIncrement(sal_Int32 spinIncrement)308     void SAL_CALL UnoSpinButtonControl::setSpinIncrement( sal_Int32 spinIncrement ) throw (RuntimeException)
309     {
310 	    ImplSetPropertyValue( GetPropertyName( BASEPROPERTY_SPININCREMENT ), makeAny( spinIncrement ), sal_True );
311     }
312 
313     //--------------------------------------------------------------------
getSpinIncrement()314     sal_Int32 SAL_CALL UnoSpinButtonControl::getSpinIncrement(  ) throw (RuntimeException)
315     {
316         ::osl::MutexGuard aGuard( GetMutex() );
317         sal_Int32 nIncrement = 0;
318 
319         Reference< XSpinValue > xSpinnable( getPeer(), UNO_QUERY );
320 	    if ( xSpinnable.is() )
321 		    nIncrement = xSpinnable->getSpinIncrement();
322 
323         return nIncrement;
324     }
325 
326     //--------------------------------------------------------------------
setOrientation(sal_Int32 orientation)327     void SAL_CALL UnoSpinButtonControl::setOrientation( sal_Int32 orientation ) throw (NoSupportException, RuntimeException)
328     {
329 	    ImplSetPropertyValue( GetPropertyName( BASEPROPERTY_ORIENTATION ), makeAny( orientation ), sal_True );
330     }
331 
332     //--------------------------------------------------------------------
getOrientation()333     sal_Int32 SAL_CALL UnoSpinButtonControl::getOrientation(  ) throw (RuntimeException)
334     {
335         ::osl::MutexGuard aGuard( GetMutex() );
336         sal_Int32 nOrientation = ScrollBarOrientation::HORIZONTAL;
337 
338         Reference< XSpinValue > xSpinnable( getPeer(), UNO_QUERY );
339 	    if ( xSpinnable.is() )
340 		    nOrientation = xSpinnable->getOrientation();
341 
342         return nOrientation;
343     }
344 
345 //........................................................................
346 }  // namespace toolkit
347 //........................................................................
348 
349