/**************************************************************
 * 
 * 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_XDockableWindow_idl__ 
#define __com_sun_star_awt_XDockableWindow_idl__ 
 
#ifndef __com_sun_star_uno_XInterface_idl__
#include <com/sun/star/uno/XInterface.idl>
#endif

#ifndef __com_sun_star_awt_XDockableWindowListener_idl__ 
#include <com/sun/star/awt/XDockableWindowListener.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 {  
 
//============================================================================= 
 
/** specifies the docking interface for a window component.
		
	<p>A window can either be docked where it resides as a child window in
        an application frame window or it can be floating where it will
        reside in its own decorated top level window.
    </p>
 */
interface XDockableWindow : com::sun::star::uno::XInterface
{ 
	 
	/** adds a docking listener to the object.
        only a single listener may be registered at any time.
	 */
    void addDockableWindowListener( [in] com::sun::star::awt::XDockableWindowListener xListener ); 
 
	//------------------------------------------------------------------------- 
	 
	/** removes the specified docking listener from the object.
	 */
    void removeDockableWindowListener( [in] com::sun::star::awt::XDockableWindowListener xListener ); 

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

    /** enable or disable docking, docking is disabled by default

        @param bEnable
            <TRUE/> specifies that docking is enabled 
            <FALSE/> specifies that docking is disabled and no
                <type scope="com::sun::star::awt">XDockableWindowListener</type> will be called
	 */
    void enableDocking( [in] boolean bEnable ); 

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

    /** queries the current window state
        @returns
            <TRUE/> if the window is floating
            <FALSE/> if the window is docked
	 */
    boolean isFloating(); 

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

    /** toggle between floating and docked state
        @param bFloating
            specifies the new floating mode:
            <TRUE/> means floating, <FALSE/> means docked
	 */
    void setFloatingMode( [in] boolean bFloating ); 

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

    /** prevents the window from being undocked 
        this has no effect if the window is floating
	 */
    void lock(); 

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

    /** enables undocking
        this has no effect if the window is floating
	 */
    void unlock();

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

    /** queries the current locking state
        @returns
            <TRUE/> if the window is locked
            <FALSE/> if the window is not locked
	 */
    boolean isLocked(); 

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

    /** shows the window in a menu like style, i.e. without decoration
        a special indicator will allow for tearing off the window
        see <type scope="com::sun::star::awt">XDockableWindowListener</type> for
        the corresponding events
        @param WindowRect
            specifies the position and size of the popup window in frame coordinates
	 */
    void startPopupMode( [in] com::sun::star::awt::Rectangle WindowRect ); 

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

    /** queries the current popup mode
        @returns
            <TRUE/> if the window is in popup mode
            <FALSE/> if the window is not in popup mode
	 */
    boolean isInPopupMode(); 
}; 
 
//============================================================================= 
 
}; }; }; };  
 
#endif 
