/**************************************************************
 * 
 * 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_XDialogProvider2_idl__
#define __com_sun_star_awt_XDialogProvider2_idl__

#ifndef __com_sun_star_awt_XDialogProvider_idl__
#include <com/sun/star/awt/XDialogProvider.idl>
#endif
#ifndef __com_sun_star_beans_NamedValue_idl__
#include <com/sun/star/beans/NamedValue.idl>
#endif


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

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

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

/** provides dialogs implementing the
    <type scope="com::sun::star::awt">XDialog</type> interface.
 */
published interface XDialogProvider2 : ::com::sun::star::awt::XDialogProvider {

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

    /** creates a dialog for the given URL accepting an Interface used
        to handle dialog events.

        @param URL
            is the URL.

        @param xHandler
            is the interface that will be called to handle the Events that
            are generated by the dialog (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">XDialogEventHandler</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 XDialogProvider2 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 XDialogEventHandler is supported XDialogEventHandler.callHandlerMethod()
            is always called first to handle the event. Only if the event cannot be
            handled by XDialogEventHandler (callHandlerMethod() then has to return
            false) or if XDialogEventHandler 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::XDialog xDialog, [in] any aEvent )

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

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

            void HandlerMethodName( void )

            will be searched and called.

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

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

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

     */
    XDialog createDialogWithHandler
        ( [in] string URL, [in] com::sun::star::uno::XInterface xHandler )
            raises ( com::sun::star::lang::IllegalArgumentException );

    /** creates a dialog for the given URL, accepting additional creation parameters

        <p>The arguments accepted so far are
        <ul><li><em>ParentWindow</em> - must be a component supporting the <type>XWindowPeer</type> interface,
                or a component supporting the <type>XControl</type> interfac, so an <code>XWindowPeer</code> can be
                obtained from it. The given window will be used as parent window for the to-be-created dialog.</li>
            <li><em>EventHandler</em> - specifies a component handling events in the dialog. See
                <member>createDialogWithHandler</member> for a detailed specification of dialog event handling.</li>
        </ul>
        </p>
    */

    XDialog createDialogWithArguments
        ( [in] string URL,
          [in] sequence< ::com::sun::star::beans::NamedValue > Arguments )
        raises  ( com::sun::star::lang::IllegalArgumentException );
};

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

}; }; }; };

#endif
