/**************************************************************
 * 
 * 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_UnoControlFormattedFieldModel_idl__
#define __com_sun_star_awt_UnoControlFormattedFieldModel_idl__

#ifndef __com_sun_star_awt_FontDescriptor_idl__
#include <com/sun/star/awt/FontDescriptor.idl>
#endif

#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

#ifndef __com_sun_star_util_XNumberFormatsSupplier_idl__
#include <com/sun/star/util/XNumberFormatsSupplier.idl>
#endif

#ifndef __com_sun_star_style_VerticalAlignment_idl__
#include <com/sun/star/style/VerticalAlignment.idl>
#endif

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

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

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

/** specifies the standard model of an <type>UnoControlFormattedField </type>.
 */
published service UnoControlFormattedFieldModel
{
	service com::sun::star::awt::UnoControlModel;

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

	/** specifies the horiztonal alignment of the text in the control. 
				
		<pre>
		0: left
		1: center
		2: right
		</pre>
	 */
	[property] short Align; 
 
	//------------------------------------------------------------------------- 

	/** specifies the background color (RGB) of the control.
	 */
	[property] com::sun::star::util::Color BackgroundColor; 
 
	//------------------------------------------------------------------------- 

	/** 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;
 
	//-------------------------------------------------------------------------
    
	/** specifies the default value of the formatted field.
        
		<p>This may be a numeric value (double) or a string, depending on
        the formatting of the field.</p>
	 */
	[property] any EffectiveDefault;
    
	//-------------------------------------------------------------------------

	/** specifies the maximum value that can be entered.
        
		<p>This property is ignored if the format of the field is no numeric
        format.</p>
	 */
	[property] double EffectiveMax;
    
	//-------------------------------------------------------------------------

	/** specifies the minimum value that can be entered.
        
		<p>This property is ignored if the format of the field is no numeric
        format.</p>
	 */
	[property] double EffectiveMin;
    
	//-------------------------------------------------------------------------

	/** specifies the current value of the formatted field.
        
		<p>This may be a numeric value (double) or a string, depending on
        the formatting of the field.</p>
	 */
	[property] double EffectiveValue;
    
	//-------------------------------------------------------------------------

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

	/** specifies the font attributes of the text in the control.
	 */
	[property] com::sun::star::awt::FontDescriptor FontDescriptor; 
 
	//-------------------------------------------------------------------------

	/** specifies the <type scope="com::sun::star::text">FontEmphasis</type>
        value of the text in the control.
	 */
	[property] short FontEmphasisMark;
 
	//-------------------------------------------------------------------------
    
	/** specifies the <type scope="com::sun::star::text">FontRelief</type>
        value of the text in the control.
	 */
	[property] short FontRelief;
 
	//-------------------------------------------------------------------------
    
	/** specifies the format to be used when formatting the field input
        and output.
        
		<p>This value is meaningful relative to the FormatsSupplier property
        only.</p>
	 */
	[property] long FormatKey;

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

	/** supplies the formats the field should work with.
	 */
	[property] com::sun::star::util::XNumberFormatsSupplier FormatsSupplier;

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

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


	//-------------------------------------------------------------------------
    
    /** specifies whether the selection in the control should be hidden when
        the control is not active (focused).

        @since OOo 2.0
     */
    [optional, property] boolean HideInactiveSelection;

	//-------------------------------------------------------------------------
    
	/** specifies the maximum character count.

        <p>There's no limitation, if set to 0.</p>    
     */
	[property] short MaxTextLen; 
 
	//-------------------------------------------------------------------------
    
	/** specifies that the control will be printed with the document.
	 */
	[property] boolean Printable; 
 
	//------------------------------------------------------------------------- 
	 
	/** specifies that the content of the control cannot be modified by the
        user.
	 */
	[property] boolean ReadOnly; 
 
	//-------------------------------------------------------------------------
 
	/** specifies whether the mouse should show repeating behaviour, i.e.
        repeatedly trigger an action when keeping pressed.

        @since OOo 2.0
     */
    [optional, 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>

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

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

	/** specifies that the control has a spin button.
	 */
	[property] boolean Spin; 
 
	//-------------------------------------------------------------------------
    
	/** specifies that the text is checked during the user input.
        
		<p>This property is optional - not every component implementing this
        service is required to provide it, as real-time input checking on a
        formatted field may be pretty expensive.</p>    
	 */
	[optional, property] boolean StrictFormat; 
 
	//------------------------------------------------------------------------- 

	/** specifies that the control can be reached with the TAB key.
	 */
	[property] boolean Tabstop; 
 
	//------------------------------------------------------------------------- 

	/** specifies the text displayed in the control.
	 */
	[property] string Text; 
 
	//------------------------------------------------------------------------- 
    
	/** specifies the text color (RGB) of the control.
	 */
	[property] com::sun::star::util::Color TextColor; 
 
	//-------------------------------------------------------------------------
    
	/** specifies the text line color (RGB) of the control.
	 */
	[property] com::sun::star::util::Color TextLineColor;
    
	//-------------------------------------------------------------------------
    
	/** specifies that the text is treated as a number.
	 */
	[property] boolean TreatAsNumber;

    /** denotes the writing mode used in the control, as specified in the
        <type scope="com::sun::star::text">WritingMode2</type> constants group.

        <p>Only <member scope="com::sun::star::text">WritingMode2::LR_TB</member> and
        <member scope="com::sun::star::text">WritingMode2::RL_TB</member> are supported at the moment.</p>

        @since OOo 3.1
    */
    [optional, property] short WritingMode;

    /** 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;

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

    /** specifies the vertical alignment of the text in the control.

        @since OOo 3.3
	 */
    [optional, property] com::sun::star::style::VerticalAlignment VerticalAlign;
};

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

}; }; }; };

#endif
