/**************************************************************
 * 
 * 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_UnoControlButtonModel_idl__
#define __com_sun_star_awt_UnoControlButtonModel_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_style_VerticalAlignment_idl__
#include <com/sun/star/style/VerticalAlignment.idl>
#endif
#ifndef com_sun_star_graphic_XGraphic_idl
#include <com/sun/star/graphic/XGraphic.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>UnoControlButton</type>.
 */
published service UnoControlButtonModel
{
	service com::sun::star::awt::UnoControlModel;

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

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

		<pre>
		0: left
		1: center
		2: right
		</pre>
	 */
	[optional, property] short Align;

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

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

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

	/** specifies that the button is the default button on the document.
	 */
	[property] boolean DefaultButton;

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

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

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

    /** specifies whether the button control should grab the focus when clicked.

        <p>If set to <TRUE/> (which is the default), the button control automatically grabs the
        focus when the user clicks onto it with the mouse.<br/>
        If set to <FALSE/>, the focus is preserved when the user operates the button control with
        the mouse.</p>

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

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

	/** 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 help text of the control.
	 */
	[property] string HelpText;

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

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

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

	/** specifies the alignment of the image inside the button as
        <type>ImageAlign</type> value.
     */
	[property] short ImageAlign;

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

    /** specifies the position of the image, if any, relative to the text, if any

        <p>Valid values of this property are specified with <type>ImagePosition</type>.</p>

        <p>If this property is present, it supersedes the <member>ImageAlign</member> property - setting
        one of both properties sets the other one to the best possible match.</p>
     */
    [optional, property] short ImagePosition;

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

	/** specifies an URL to an image to use for the button.
        @see Graphic
	 */
	[property] string ImageURL;

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

	/** specifies a graphic to be displayed at the button

        <p>If this property is present, it interacts with the <member>ImageURL</member>in the
        following way:
        <ul><li>If <member>ImageURL</member> is set, <member>Graphic</member> will be reset
            to an object as loaded from the given image URL, or <NULL/> if <member>ImageURL</member>
            does not point to a valid image file.</li>
            <li>If <member>Graphic</member> is set, <member>ImageURL</member> will be reset
            to an empty string.</li>
        </ul></p>

        @since OOo 2.1
	 */
    [optional, property, transient] com::sun::star::graphic::XGraphic Graphic;

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

	/** specifies the label of the control.
	 */
	[property] string Label;

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

	/** specifies that the text may be displayed on more than one line.

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

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

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

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

	/** specifies the default action of the button as <type>PushButtonType</type> value.
	 */
	[property] short PushButtonType;

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

    /** specifies whether the control should show repeating behaviour.

        <p>Normally, when you click a button with the mouse, you need to
        release the mouse button, and press it again. With this property
        set to <TRUE/>, the button is repeatedly pressed while you hold
        down the mouse button.</p>

        @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 pressing the button), 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 the state of the control.
	 */
	[property] short State;

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

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

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

	/** 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 whether the button should toggle on a single operation.

        <p>If this property is set to <TRUE/>, a single operation of the button control (pressing space
        while it is focused, or clicking onto it) toggles it between a <em>pressed</em> and a <em>not
        pressed</em> state.</p>

        <p>The default for this property is <FALSE/>, which means the button behaves like a usual
        push button.</p>

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

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

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

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

};

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

}; }; }; };

#endif
