/**************************************************************
 * 
 * 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_report_XReportEngine_idl__
#define __com_sun_star_report_XReportEngine_idl__

#ifndef __com_sun_star_report_XReportDefinition_idl__
#include <com/sun/star/report/XReportDefinition.idl>
#endif
#ifndef __com_sun_star_beans_XPropertySet_idl__
#include <com/sun/star/beans/XPropertySet.idl>
#endif
#ifndef __com_sun_star_lang_XComponent_idl__
#include <com/sun/star/lang/XComponent.idl>
#endif
#ifndef __com_sun_star_util_URL_idl__
#include <com/sun/star/util/URL.idl>
#endif
#ifndef __com_sun_star_frame_XModel_idl__
#include <com/sun/star/frame/XModel.idl>
#endif
#ifndef __com_sun_star_task_XStatusIndicator_idl__
#include <com/sun/star/task/XStatusIndicator.idl>
#endif
#ifndef __com_sun_star_frame_XFrame_idl__
#include <com/sun/star/frame/XFrame.idl>
#endif
#ifndef __com_sun_star_sdbc_XConnection_idl__
#include <com/sun/star/sdbc/XConnection.idl>
#endif
#ifndef __com_sun_star_lang_IllegalArgumentException_idl__
#include <com/sun/star/lang/IllegalArgumentException.idl>
#endif
#ifndef __com_sun_star_lang_DisposedException_idl__
#include <com/sun/star/lang/DisposedException.idl>
#endif
#ifndef __com_sun_star_uno_Exception_idl__
#include <com/sun/star/uno/Exception.idl>
#endif

//=============================================================================
module com {  module sun {  module star {  module report {
/** identifies a <type>XReportEngine</type> which allows the creation of OpenDocument files.

    <p>The following events are supported by the report engine.
        OnPageStarted		Is fired when a new page started.
        OnReportStarted		Is fired when a new report started.
        OnGroupStarted		Is fired when a new group started.
        OnGroupEnded		Is fired when the group ended.
        OnReportEnded		Is fired when the report ended.
        OnPageEnded			Is fired when the page ended.

    @see com.sun.star.document.OfficeDocument
*/

published interface XReportEngine
{
    /** allows life-time control of report engine.
     */
    interface com::sun::star::lang::XComponent;

    /** gives access to the properties.
    */
    interface com::sun::star::beans::XPropertySet;

    /** creates a report document.
        @throws <type scope="com::sun::star::lang">DisposedException</type>
            If the report engine is already disposed.
        @throws <type scope="com::sun::star::lang">IllegalArgumentException</type>
            If the report definition was not set or is <NULL/>.
    */
    com::sun::star::frame::XModel createDocumentModel()
        raises( ::com::sun::star::lang::DisposedException,
                com::sun::star::lang::IllegalArgumentException,
                ::com::sun::star::uno::Exception );

    /** creates a report document.
        @param	_frame
            The frame must have a controller set. This controller will be set at the model.
        @throws <type scope="com::sun::star::lang">DisposedException</type>
            If the report engine is already disposed.
        @throws <type scope="com::sun::star::lang">IllegalArgumentException</type>
            If the report definition was not set or is <NULL/>.

        OJ: Has to be discussed if this method is useful.
    */
    com::sun::star::frame::XModel createDocumentAlive([in] com::sun::star::frame::XFrame frame)
        raises( ::com::sun::star::lang::DisposedException,
                com::sun::star::lang::IllegalArgumentException,
                ::com::sun::star::uno::Exception );

    /** creates a report document.
        @return
            The URL where the new document is located.
        @throws <type scope="com::sun::star::lang">DisposedException</type>
            If the report engine is already disposed.
        @throws <type scope="com::sun::star::lang">IllegalArgumentException</type>
            If the report definition was not set or is <NULL/>.
    */
    com::sun::star::util::URL createDocument()
        raises( ::com::sun::star::lang::DisposedException,
                com::sun::star::lang::IllegalArgumentException,
                ::com::sun::star::uno::Exception );

    /** allows to interrupt the creation process of the report document.
        @throws <type scope="com::sun::star::lang">DisposedException</type>
            If the report engine is already disposed.
    */
    void interrupt()
        raises( ::com::sun::star::lang::DisposedException,
                ::com::sun::star::uno::Exception );

    /** specifies the report definition object which is used to create the resulting report.
    */
    [attribute,bound] XReportDefinition ReportDefinition
    {
        set raises (com::sun::star::lang::IllegalArgumentException);
    };

    /** specifies the active connection which is used to create the resulting report.
    */
    [attribute,bound] com::sun::star::sdbc::XConnection ActiveConnection
    {
        set raises (com::sun::star::lang::IllegalArgumentException);
    };

    /** specifies the status indicator which shows the progress of the report generation process.
    */
    [attribute] com::sun::star::task::XStatusIndicator StatusIndicator;

    /** defines the maximum number of rows which should be fetched for the report.
        If the limit is exceeded, the excess rows are silently dropped.
        <br/>
        There is no limitation, if set to zero.
     */
    [attribute,bound] long MaxRows;
};

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

}; }; }; };

/*=============================================================================

=============================================================================*/
#endif
