/**************************************************************
 * 
 * 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_UnoControlSpinButtonModel_idl__
#define __com_sun_star_awt_UnoControlSpinButtonModel_idl__

#ifndef __com_sun_star_awt_UnoControlModel_idl__
#include <com/sun/star/awt/UnoControlModel.idl>
#endif

#ifndef __com_sun_star_util_Color_idl__
#include <com/sun/star/util/Color.idl>
#endif


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

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

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

/** specifies the standard model of an <type>UnoControlSpinButton</type>.

    <p>A spin button is a control which has a numeric value associated with it,
    and allows to change this value using two spin buttons.</p>

    <p>A spin button is similar to a scroll bar, but it usually has no
    (own) visual representation of the associated value, but is used to propagate
    it's value to other controls.</p>

    @see UnoControlScrollBarModel
 */
service UnoControlSpinButtonModel
{
	service com::sun::star::awt::UnoControlModel;

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

	/** specifies the border style of the control.

		<pre>
		0: No border
		1: 3D border
		2: simple border
		</pre>
	 */
	[property] short Border;

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

	/** specifies the color of the border, if present

        <p>Not every border style (see <member>Border</member>) may support coloring.
        For instance, usually a border with 3D effect will ignore the BorderColor setting.</p>

        @since OOo 2.0
	 */
	[optional, property] long BorderColor;
 
	//-------------------------------------------------------------------------

	/** determines whether the control is enabled or disabled.
	 */
	[property] boolean Enabled;

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

	/** specifies the help text of the control.
	 */
	[property] string HelpText;

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

	/** specifies the help URL of the control.
	 */
	[property] string HelpURL;

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

	/** specifies the increment by which the value is changed when using operating
        the spin button.
	 */
	[property] long SpinIncrement;

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

	/** specifies the <type>ScrollBarOrientation</type> of the control.
	 */
	[property] long Orientation;

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

	/** specifies whether the control will be printed with the document.
	 */
	[property] boolean Printable;

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

	/** specifies the current value of the control.
	 */
	[property] long SpinValue;

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

    /** specifies the minimum value of the control.
    */
	[property] long SpinValueMin;

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

	/** specifies the maximum value of the control.
	 */
	[property] long SpinValueMax;

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

	/** specifies the RGB color to be used for the control
    */
	[property] com::sun::star::util::Color BackgroundColor;

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

	/** specifies the RGB color to be used when painting symbols which are
        part of the control's appearance, such as the arrow buttons.
    */
	[property] com::sun::star::util::Color SymbolColor;

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

	/** specifies whether the mouse should show repeating behaviour, i.e.
        repeatedly trigger an action when keeping pressed.
    */
    [property] boolean Repeat;

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

	/** specifies the mouse repeat delay, in milliseconds.

        <p>When the user presses a mouse in a control area where this triggers
        an action (such as spinning the value), then usual control implementations
        allow to repeatedly trigger this action, without the need to release the
        mouse button and to press it again. The delay between two such triggers
        is specified with this property.</p>
    */
	[property] long RepeatDelay;

    /** defines how the mouse wheel can be used to scroll through the control's content.

        <p>Usually, the mouse wheel spins the numeric value displayed in the control. Using this property,
        and one of the <type>MouseWheelBehavior</type> constants, you can control under which circumstances
        this is possible.</p>
    */
    [optional, property] short MouseWheelBehavior;
};

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

}; }; }; };

#endif
