/**************************************************************
 * 
 * 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_UnoControlGroupBoxModel_idl__ 
#define __com_sun_star_awt_UnoControlGroupBoxModel_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
 
 
//============================================================================= 
 
 module com {  module sun {  module star {  module awt {  
 
//============================================================================= 
 
/** specifies the standard model of an <type>UnoControlGroupBox</type>.
 */
published service UnoControlGroupBoxModel
{ 
	service com::sun::star::awt::UnoControlModel; 
 
	//------------------------------------------------------------------------- 
	 
	/** 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 the label of the control.
	 */
	[property] string Label; 
 
	//------------------------------------------------------------------------- 
	 
	/** specifies that the control will be printed with the document.
	 */
	[property] boolean Printable; 
 
	//------------------------------------------------------------------------- 
	 
	/** 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;
}; 
 
//============================================================================= 
 
}; }; }; };  
 
#endif 
