/**************************************************************
 * 
 * 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_WindowDescriptor_idl__ 
#define __com_sun_star_awt_WindowDescriptor_idl__ 
 
#ifndef __com_sun_star_awt_WindowClass_idl__ 
#include <com/sun/star/awt/WindowClass.idl> 
#endif 
 
#ifndef __com_sun_star_awt_XWindowPeer_idl__ 
#include <com/sun/star/awt/XWindowPeer.idl> 
#endif 
 
#ifndef __com_sun_star_awt_Rectangle_idl__ 
#include <com/sun/star/awt/Rectangle.idl> 
#endif 
 
 
//============================================================================= 
 
 module com {  module sun {  module star {  module awt {  
 
//============================================================================= 
 
/** describes a window.
 */
published struct WindowDescriptor
{
	//------------------------------------------------------------------------- 
    
	/** specifies the type of window.
	 */
	com::sun::star::awt::WindowClass Type; 
 
	//------------------------------------------------------------------------- 
	 
	/** specifies the name of the component service.
						
		<p>A zero length name means that the vcl creates a blank top, 
		a container, or a simple window.
        The following service names are defined:<br/>
        <ul>
            <li>buttondialog</li>
            <li>cancelbutton</li>
            <li>checkbox</li>
            <li>combobox</li>
            <li>control</li>
            <li>currencybox</li>
            <li>currencyfield</li>
            <li>datebox</li>
            <li>datefield</li>
            <li>dialog</li>
            <li>dockingarea</li>
            <li>dockingwindow</li>
            <li>edit</li>
            <li>errorbox</li>
            <li>fixedbitmap</li>
            <li>fixedimage</li>
            <li>fixedline</li>
            <li>fixedtext</li>
            <li>floatingwindow</li>
            <li>framewindow</li>
            <li>groupbox</li>
            <li>helpbutton</li>
            <li>imagebutton</li>
            <li>imageradiobutton</li>
            <li>infobox</li>
            <li>listbox</li>
            <li>longcurrencybox</li>
            <li>longcurrencyfield</li>
            <li>menubutton</li>
            <li>messbox</li>
            <li>metricbox</li>
            <li>metricfield</li>
            <li>modaldialog</li>
            <li>modelessdialog</li>
            <li>morebutton</li>
            <li>multilistbox</li>
            <li>numericbox</li>
            <li>numericfield</li>
            <li>okbutton</li>
            <li>patternbox</li>
            <li>patternfield</li>
            <li>pushbutton</li>
            <li>querybox</li>
            <li>radiobutton</li>
            <li>scrollbar</li>
            <li>scrollbarbox</li>
            <li>simpleanimation</li>
            <li>spinbutton</li>
            <li>spinfield</li>
            <li>throbber</li>
            <li>splitter</li>
            <li>splitwindow</li>
            <li>statusbar</li>
            <li>systemchildwindow</li>
            <li>tabcontrol</li>
            <li>tabdialog</li>
            <li>tabpage</li>
            <li>timebox</li>
            <li>timefield</li>
            <li>toolbox</li>
            <li>tristatebox</li>
            <li>warningbox</li>
            <li>window</li>
            <li>workwindow</li>
        </ul>
        </p>
	 */
	string WindowServiceName; 
 
	//------------------------------------------------------------------------- 
	 
	/** specifies the parent of the component. 
						
		<p>If <code>Parent == 0 && ParentIndex == -1</code>, 
		then the window is on the desktop.</p>
	 */
	com::sun::star::awt::XWindowPeer Parent; 
 
	//------------------------------------------------------------------------- 
	 
	/** specifies the index of the parent window, if available.
						
		<p>If <code>Parent == 0</code> and this struct is a member of an array,
        then this is the offset from the beginning of the array to the parent.
        A value of -1 means desktop.</p>
	 */
	short ParentIndex; 
 
	//------------------------------------------------------------------------- 
	 
	/** specifies the position and size of the window. 
						
		<p>This member is ignored if the window attribute is
		<const scope="com::sun::star::awt">WindowAttribute::FULLSIZE</const>.</p>
	 */
	com::sun::star::awt::Rectangle Bounds; 
 
	//------------------------------------------------------------------------- 
	 
	/** specifies the window attributes.

		<p>Use one value out of the constant group
        <type scope="com::sun::star::awt">WindowAttribute</type>.</p>    
	 */
	long WindowAttributes; 
 
}; 
 
//============================================================================= 
 
}; }; }; };  
 
#endif 
