/**************************************************************
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 * 
 *************************************************************/


#ifndef __com_sun_star_awt_XSpinValue_idl__
#define __com_sun_star_awt_XSpinValue_idl__

#ifndef __com_sun_star_uno_XInterface_idl__
#include <com/sun/star/uno/XInterface.idl>
#endif

#ifndef __com_sun_star_awt_XAdjustmentListener_idl__
#include <com/sun/star/awt/XAdjustmentListener.idl>
#endif

#ifndef __com_sun_star_lang_NoSupportException_idl__
#include <com/sun/star/lang/NoSupportException.idl>
#endif

//=============================================================================

 module com {  module sun {  module star {  module awt {

//=============================================================================

/** gives access to the value and settings of a control which is associated with
    a spinnable value.
 */
interface XSpinValue : com::sun::star::uno::XInterface
{
	//-------------------------------------------------------------------------

	/** registers an adjustment event listener.
	 */
	[oneway] void addAdjustmentListener( [in] com::sun::star::awt::XAdjustmentListener listener );

	//-------------------------------------------------------------------------

	/** unregisters an adjustment event listener.
	 */
	[oneway] void removeAdjustmentListener( [in] com::sun::star::awt::XAdjustmentListener listener );

	//-------------------------------------------------------------------------

	/** sets the current value of the control
	 */
	[oneway] void setValue( [in] long value );

	//-------------------------------------------------------------------------

	/** sets the value and value range of the control

        @see setValue
        @see setMinimum
        @see setMaximum
	 */
	[oneway] void setValues( [in] long minValue, [in] long maxValue, [in] long currentValue );

	//-------------------------------------------------------------------------

	/** returns the current value of the control.
	 */
	long getValue();

	//-------------------------------------------------------------------------

	/** sets the  minimum value which can be set on the control
	 */
	[oneway] void setMinimum( [in] long minValue );

	//-------------------------------------------------------------------------

	/** sets the  maximum value which can be set on the control
	 */
	[oneway] void setMaximum( [in] long maxValue );

	//-------------------------------------------------------------------------

	/** returns the currently set minimum value of the control
	 */
	long getMinimum();

	//-------------------------------------------------------------------------

	/** returns the currently set maximum value of the control
	 */
	long getMaximum();

	//-------------------------------------------------------------------------

	/** sets the value by which the current value of the control
        should be incremented or decremented upon spinning.
	 */
	[oneway] void setSpinIncrement( [in] long spinIncrement );

	//-------------------------------------------------------------------------

	/** returns the value by which the current value of the control
        should be incremented or decremented upon spinning.
	 */
	long getSpinIncrement();

	//-------------------------------------------------------------------------

	/** controls the orientation of the control
        @param orientation
            one of the <type>ScrollBarOrientation</type> values specifying the orientation
        @throws com::sun::star::lang::NoSupportException
            in case the given orientation is not supported
	 */
	void setOrientation( [in] long orientation )
			raises( com::sun::star::lang::NoSupportException );

	//-------------------------------------------------------------------------

	/** returns the current orientation of the control
	 */
	long getOrientation();

};

//=============================================================================

}; }; }; };

#endif
