/**************************************************************
 * 
 * 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_XDispatchRecorder_idl__
#define __com_sun_star_frame_XDispatchRecorder_idl__

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

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

#ifndef __com_sun_star_beans_PropertyValue_idl__
#include <com/sun/star/beans/PropertyValue.idl>
#endif

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

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

 published interface XFrame;

//=============================================================================
/** provides recording functionality of dispatches

    <p>
    With such recorder it will be possible to record requests of type
    <type>XDispatch</type> by using additional interface
    <type>XRecordableDispatch</type>. The result of that will be a
    a script which can be used to start the dispatch at later time again.
    Such recorder objects are available on a <type>XDispatchRecorderSupplier</type>
    which is provided by the <type>Frame</type> service.
    </p>

    @see Frame
    @see XDispatchRecorderSupplier

    @since OpenOffice 1.1.2
 */
published interface XDispatchRecorder: com::sun::star::uno::XInterface
{
	//-------------------------------------------------------------------------
    /** initializes the recorder by passing the frame for which all
        macro statements shall be recorded

        @param Frame
            it includes the document on which such requests shall be recorded
    */
    void startRecording( [in] com::sun::star::frame::XFrame Frame );

        //-------------------------------------------------------------------------
    /** stops the recording process

        <p>
        Must be called in pairs with <member>XDispatchRecorder::startRecording()</member>.
        </p>
        
        @attention  The recorder uses this method to control the lifetime of its internal
                    used macro buffer. It will be cleared here. So the macro must be fetched
                    before endRecording() is called.
                    
        @see        getRecordedMacro()             
    */
    void endRecording();

	//-------------------------------------------------------------------------
    /** records a single dispatch call identified by its command URL

        @param URL
            the full parsed command URL

        @param Arguments
            optional arguments for the command URL
            <br>
            (see <type scope="com::sun::star::document">MediaDescriptor</type>
             for further informations)
    */
    void recordDispatch(
        [in] com::sun::star::util::URL URL,
        [in] sequence<com::sun::star::beans::PropertyValue> Arguments);

	//-------------------------------------------------------------------------
    /** records a single dispatch call identified by its command URL, but
        comments it out

        <p>
        This way calls that failed on execution can be documented.
        </p>

        @param URL
            the full parsed command URL

        @param Arguments
            optional arguments for the command URL
            <br>
            (see <type scope="com::sun::star::document">MediaDescriptor</type>
             for further informations)
    */
    void recordDispatchAsComment(
        [in] com::sun::star::util::URL URL,
        [in] sequence<com::sun::star::beans::PropertyValue> Arguments);

	//-------------------------------------------------------------------------
    /** returns the recorded source code

        <p>
        This method must be used before <member>endRecording()</member> is called!
        Otherwhise the macro will be relased.
        </p>

        @returns
            the recorded data as a string which can be interpreted as a script
    */
    string getRecordedMacro();
};

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

}; }; }; };

#endif
