/**************************************************************
 * 
 * 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_UnoControlComboBoxModel_idl__ 
#define __com_sun_star_awt_UnoControlComboBoxModel_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
 
#include <com/sun/star/awt/XItemList.idl>
 
//============================================================================= 
 
 module com {  module sun {  module star {  module awt {  
 
//============================================================================= 
 
/** specifies the standard model of an <type>UnoControlComboBox</type>.
 */
published service UnoControlComboBoxModel
{ 
	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 whether automatic completion of text is enabled.
	 */
	[property] boolean Autocomplete; 
 
	//------------------------------------------------------------------------- 
	 
	/** 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 if the control has a drop down button.
	 */
	[property] boolean Dropdown; 
 
	//------------------------------------------------------------------------- 
	 
	/** 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 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 line count displayed in the drop down box.
	 */
	[property] short LineCount; 
 
	//-------------------------------------------------------------------------
    
	/** 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 the list of items.
	 */
	[property] sequence<string> StringItemList; 
 
	//------------------------------------------------------------------------- 
	 
	/** 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;

    /** 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 scrool through the control's entry list. 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;

    /** allows mmanipulating the list of items in the combo box more fine-grained than the
        <member>StringItemList</member> property.
    */
    [optional] interface XItemList;
}; 
 
//============================================================================= 
 
}; }; }; };  
 
#endif 
