/**************************************************************
 * 
 * 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_XContainerWindowProvider_idl__
#define __com_sun_star_awt_XContainerWindowProvider_idl__

#ifndef __com_sun_star_awt_XWindow_idl__
#include <com/sun/star/awt/XWindow.idl>
#endif
#ifndef __com_sun_star_awt_XWindowPeer_idl__
#include <com/sun/star/awt/XWindowPeer.idl>
#endif
#ifndef __com_sun_star_lang_IllegalArgumentException_idl__
#include <com/sun/star/lang/IllegalArgumentException.idl>
#endif

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

module com { module sun { module star { module awt {

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

/** provides container windows implementing the
    <type scope="com::sun::star::awt">XWindow</type> interface.
 */
published interface XContainerWindowProvider : ::com::sun::star::uno::XInterface {

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

    /** creates a window for the given URL

        @param URL
            is the URL.

        @param WindowType
            Type of Window to be created,
            for future use, not supported yet

        @param xParent
            a valid XWindowPeer reference which is used as a parent.
            This parameter must not be null.

        @param xHandler
            is the interface that will be called to handle the Events that
            are generated by the window (and all controls placed on it) and
            bound to the handler using a vnd.sun.star.UNO URL specifying a
            handler method to be called. Usually this will be done directly
            by the user.

            xHandler can handle events in two different ways:

            1. By supporting the <type scope="com::sun::star::awt">XContainerWindowEventHandler</type>
            interface. This is a generic interface to accept event notifications.

            2. By providing interfaces that directly implement the handler
            methods to be called. The XContainerWindowProvider implementation then
            will try to access these events using the
            <type scope="com::sun::star::beans">Introspection</type>Introspection
            service. To make this possible the handler implementation also has to
            support <type scope="com::sun::star::lang">XTypeProvider</type>.

            If XContainerWindowEventHandler is supported XContainerWindowEventHandler.callHandlerMethod()
            is always called first to handle the event. Only if the event cannot be
            handled by XContainerWindowEventHandler (callHandlerMethod() then has to return
            false) or if XContainerWindowEventHandler is not supported at all the Introspection
            based access will be used.

            The Introspection based access tries to call a method named according to the
            HandlerMethodName specified by a vnd.sun.star.UNO:<HandlerMethodName> URL.
            First a method

            void HandlerMethodName( [in] com::sun::star::awt::XWindow xWindow, [in] any aEvent )

            will be searched. The signature is similar to XContainerWindowEventHandler.
            callHandlerMethod except for MethodName itself that isn't needed
            here. For more information about these parameters, see
            <type scope="com::sun::star::awt">XContainerWindowEventHandler</type>.

            If this method is found, it will be called, otherwise a method

            void HandlerMethodName( void )

            will be searched and called.

        @returns
            a window implementing the <type scope="com::sun::star::awt">XWindow</type> interface.

        @throws com::sun::star::lang::IllegalArgumentException
            if no window for the given URL is found or if the URL is invalid
            or xParent is null.

        @see <type scope="com::sun::star::awt">XContainerWindowEventHandler</type>

     */
    com::sun::star::awt::XWindow createContainerWindow
        ( [in] string URL, [in] string WindowType,
          [in] com::sun::star::awt::XWindowPeer xParent,
          [in] com::sun::star::uno::XInterface xHandler )
            raises ( com::sun::star::lang::IllegalArgumentException );
};

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

}; }; }; };

#endif
