/**************************************************************
 * 
 * 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_frame_XDispatchProvider_idl__
#define __com_sun_star_frame_XDispatchProvider_idl__

#ifndef __com_sun_star_uno_XInterface_idl__
#include <com/sun/star/uno/XInterface.idl>
#endif

#ifndef __com_sun_star_frame_XDispatch_idl__
#include <com/sun/star/frame/XDispatch.idl>
#endif

#ifndef __com_sun_star_util_URL_idl__
#include <com/sun/star/util/URL.idl>
#endif

#ifndef __com_sun_star_frame_DispatchDescriptor_idl__
#include <com/sun/star/frame/DispatchDescriptor.idl>
#endif


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

 module com {  module sun {  module star {  module frame {

//=============================================================================
/** provides <type>XDispatch</type> interfaces for certain functions which
	are useful at the UI.

    @see XDispatch
 */
published interface XDispatchProvider: com::sun::star::uno::XInterface
{
	//-------------------------------------------------------------------------
	/** searches for an <type>XDispatch</type> for the specified URL within
        the specified target frame.

        @param URL
            describe the feature which should be supported by returned dispatch object

        @param TargetFrameName
            specify the frame which should be the target for this request

        @param SearchFlags
            optional search parameter for finding the frame if no special
            <var>TargetFrameName</var> was used

        @return
            the dispatch object which provides queried functionality
            <br>
            or <NULL/> if no dispatch object is available

        @see XFrame::findFrame()
        @see XDispatchProvider::queryDispatches()
	 */
    XDispatch queryDispatch(
        [in] com::sun::star::util::URL URL,
        [in] string TargetFrameName,
        [in] long SearchFlags );

	//-------------------------------------------------------------------------
    /** actually this method is redundant to <member>XDispatchProvider::queryDispatch()</member>
        to avoid multiple remote calls.

        @param Requests
            list of dispatch requests

        @returns
            multiple dispatch interfaces for the specified descriptors at once

            <p>
            It's not allowed to pack it - because every request must match
            to his real result. Means: don't delete <NULL/> entries inside this list.
            </p>
	 */
    sequence< XDispatch > queryDispatches(
        [in] sequence<DispatchDescriptor> Requests);
};

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

}; }; }; };

#endif
