/**************************************************************
 * 
 * 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_configuration_backend_InteractionHandler_idl__
#define __com_sun_star_configuration_backend_InteractionHandler_idl__

module com { module sun { module star {
    module lang { published interface XInitialization; };
    module task { published interface XInteractionHandler; };
}; }; };

module com { module sun { module star { module configuration { module backend {

//============================================================================
/** An interaction request handler that lets the user handle a number of well
    known requests via GUI dialogs.

    <P>The well known requests handled by this service include
    <UL>
        <LI><type>MergeRecoveryRequest</type>*</LI>
    </UL>
    The requests marked with an asterisk are only handled if (a) their
    continuations match certain restrictions (see below), and (b) the
    necessary resource strings are available (this can be exploited by
    applications that carry only a subset of all resource files with
    them).</P>

    <P>The continuation restrictions are as follows:  Let <VAR>C</VAR> be the
    subset of the provided continuations that are of type
    <type scope="com::sun::star::task">XInteractionApprove</type>,
    <type scope="com::sun::star::task">XInteractionDisapprove</type>,
    <type scope="com::sun::star::task">XInteractionRetry</type>, or
    <type scope="com::sun::star::task">XInteractionAbort</type> (or of a
    derived type).  All other continuations are ignored for these requests.
    The request is only handled if the set <VAR>C</VAR> is any of the
    following:
    <UL>
        <LI>Abort</LI>
        <LI>Retry, Abort</LI>
        <LI>Approve</LI>
        <LI>Approve, Abort</LI>
        <LI>Approve, Disapprove</LI>
        <LI>Approve, Disapprove, Abort</LI>
    </UL></P>

    @since OpenOffice 2.0

    @see com::sun::star::task::InteractionHandler
 */
published service InteractionHandler
{
    //------------------------------------------------------------------------
    /** Handle an interaction request.
     */
    interface com::sun::star::task::XInteractionHandler;

    //------------------------------------------------------------------------
    /** Initialize the interaction handler.

        <P>The arguments must be a sequence of
        <type scope="com::sun::star::beans">PropertyValue</type>s.  The
        currently supported properties are:
        <UL>
            <LI><code>"Parent"</code> of type
            <type scope="com::sun::star::awt">XWindow</type> denotes the
            parent window for any GUI dialogs the interaction handler pops up;
            it is strongly recommended that this property is supplied;</LI>
            <LI><code>"Context"</code> of type <atom>string</atom> is a
            textual description of the current context (used, e.g., as a first
            line of text in error boxes); this property is optional.</LI>
        </UL></P>
     */
    interface com::sun::star::lang::XInitialization;
};

}; }; }; }; };

#endif
