/**************************************************************
 * 
 * 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_sdb_OfficeDatabaseDocument_idl__ 
#define __com_sun_star_sdb_OfficeDatabaseDocument_idl__ 
 
#ifndef __com_sun_star_document_OfficeDocument_idl__
#include <com/sun/star/document/OfficeDocument.idl>
#endif
#ifndef __com_sun_star_sdb_XOfficeDatabaseDocument_idl__
#include <com/sun/star/sdb/XOfficeDatabaseDocument.idl> 
#endif
#ifndef __com_sun_star_document_XDocumentEventBroadcaster_idl__
#include <com/sun/star/document/XDocumentEventBroadcaster.idl> 
#endif
#ifndef __com_sun_star_script_provider_XScriptProviderSupplier_idl__
#include <com/sun/star/script/provider/XScriptProviderSupplier.idl> 
#endif
#ifndef __com_sun_star_frame_XLoadable_idl__
#include <com/sun/star/frame/XLoadable.idl> 
#endif
#ifndef __com_sun_star_util_XCloseable_idl__
#include <com/sun/star/util/XCloseable.idl> 
#endif

module com {  module sun {  module star {  module sdb { 
 
/** specifies a office database document which is a storable document.
	
	<p>These documents contain information about forms, and reports, and the properties of a data source.</p>

	<p>The database document contains no data per default. The following is stored inside the document:
    <ul>
        <li>forms</li>
        <li>reports</li>
        <li>The table settings defined in <type>DataSettings</type></li>
        <li>The query settings defined in <type>DataSettings</type></li>
        <li>All properties of the service <type>DataSource</type></li>
    </ul></p>

	@see com::sun::star::sdb::XOfficeDatabaseDocument
	@see com::sun::star::document::OfficeDocument
	@since OpenOffice 2.0
 */
service OfficeDatabaseDocument 
{ 
    /** specifies basic functionality of a document in OpenOffice.org

        <p>Note that a database document actually does not support the <type scope="com::sun::star::view">XPrintable</type> interface.
        The non-optional requirement of this interface in the <type scope="com::sun::star::document">OfficeDocument</type>
        service is considered a documentation error.</p>
    */
	service com::sun::star::document::OfficeDocument;

	interface XOfficeDatabaseDocument;

    /** allows access to the Basic macros and dialogs possibly embedded in the document
	    @since OpenOffice 3.1
    */
    interface ::com::sun::star::document::XEmbeddedScripts;

    /** supplies a script provider which can be used to execute macros and scripts
        embedded in the document
	    @since OpenOffice 3.1
    */
    interface ::com::sun::star::script::provider::XScriptProviderSupplier;

    /** allows to initialize the the document, either from scratch, or from a stored
        database document.

        <p>A newly instantiated database document cannot be operated until it is fully
        initialized. There are three possible means to do this initialization:
        <ul><li>calling <code>XLoadable::initNew</code></li>
            <li>calling <code>XLoadable::load</code></li>
            <li>calling <code>XStorable::storeAsURL</code></li>
        </ul>
        The third option was added for compatibility reasons, since a <type>DatabaseDocument</type>
        in earlier versions of OpenOffice.org did not support the <code>XLoadable</code> interface,
        so the usual way of creating a document from scratch was to create it, set properties as
        needed, and store it.</p>

        @since OpenOffice 3.1
    */
    interface ::com::sun::star::frame::XLoadable;

    /** allows to register for notifications happening in the document

        <p>The following events are broadcasted by a database document
	    <table border="1" frame="all">
            <thead>
                <tr><td><strong>Event Name</strong></td>
                    <td><strong>broadcasted when</strong></td>
                    <td align="center"><strong>broadcasted synchronously</strong></td>
                </tr>
            </thead>
            <tbody>
		        <tr><td valign="top"><em>OnCreate</em></td>
                    <td>the document has been newly created. This does not imply that the document has
                        been loaded into a frame, it just means the initialization has been finished.</td>
                    <td align="center">yes</td>
                </tr>
		        <tr><td valign="top"><em>OnLoadFinished</em></td>
                    <td>the document has been completely loaded. This does not  imply that the document
                    has been loaded into a frame, it just means the load process has been finished.</td>
                    <td align="center">yes</td>
                </tr>
		        <tr><td valign="top"><em>OnNew</em></td>
                    <td>the document has been initialized from scratch, including plugging it into a frame.</td>
                    <td align="center">no</td>
                </tr>
		        <tr><td valign="top"><em>OnLoad</em></td>
                    <td>the document has been completely loaded, including plugging it into a frame.</td>
                    <td align="center">no</td>
                </tr>
		        <tr><td valign="top"><em>OnSave</em></td>
                    <td>the document is about to be saved.</td>
                    <td align="center">yes</td>
                </tr>
		        <tr><td valign="top"><em>OnSaveDone</em></td>
                    <td>saving the document succeeeded.</td>
                    <td align="center">no</td>
                </tr>
		        <tr><td valign="top"><em>OnSaveFailed</em></td>
                    <td>saving the document failed.</td>
                    <td align="center">no</td>
                </tr>
		        <tr><td valign="top"><em>OnSaveAs</em></td>
                    <td>the document is about to be saved under a new name.</td>
                    <td align="center">yes</td>
                </tr>
		        <tr><td valign="top"><em>OnSaveAsDone</em></td>
                    <td>saving the document under a new name succeeeded.</td>
                    <td align="center">no</td>
                </tr>
		        <tr><td valign="top"><em>OnSaveAsFailed</em></td>
                    <td>saving the document under a new name failed.</td>
                    <td align="center">no</td>
                </tr>
		        <tr><td valign="top"><em>OnSaveTo</em></td>
                    <td>the document is about to be saved to a location different from its
                        current location, but without adjusting the current location.</td>
                    <td align="center">yes</td>
                </tr>
		        <tr><td valign="top"><em>OnSaveToDone</em></td>
                    <td>saving the document to a different location succeeeded.</td>
                    <td align="center">no</td>
                </tr>
		        <tr><td valign="top"><em>OnSaveToFailed</em></td>
                    <td>saving the document to a different location failed.</td>
                    <td align="center">no</td>
                </tr>
		        <tr><td valign="top"><em>OnPrepareUnload</em></td>
                    <td>the document is about to be closed.</td>
                    <td align="center">yes</td>
                </tr>
		        <tr><td valign="top"><em>OnUnload</em></td>
                    <td>the document is being closed.</td>
                    <td align="center">yes</td>
                </tr>
		        <tr><td valign="top"><em>OnFocus</em></td>
                    <td>a view to the document obtained the focus.</td>
                    <td align="center">no</td>
                </tr>
		        <tr><td valign="top"><em>OnUnfocus</em></td>
                    <td>a view to the document lost the focus.</td>
                    <td align="center">no</td>
                </tr>
		        <tr><td valign="top"><em>OnModifyChanged</em></td>
                    <td>the <quot>modified</quot> state of the document changed.</td>
                    <td align="center">no</td>
                </tr>
		        <tr><td valign="top"><em>OnViewCreated</em></td>
                    <td>a view to the document has been created, and attached to the document.</td>
                    <td align="center">no</td>
                </tr>
		        <tr><td valign="top"><em>OnPrepareViewClosing</em></td>
                    <td>a view to the document is about to be closed.</td>
                    <td align="center">yes</td>
                </tr>
		        <tr><td valign="top"><em>OnViewClosed</em></td>
                    <td>a view to the document has been closed.</td>
                    <td align="center">no</td>
                </tr>
		        <tr><td valign="top"><em>OnTitleChanged</em></td>
                    <td>the title of the document changed.</td>
                    <td align="center">no</td>
                </tr>
		        <tr><td valign="top"><em>OnSubComponentOpened</em></td>
                    <td>From with a view to the document, a view to a sub component (e.g. a table or a report) has been opened.</td>
                    <td align="center">no</td>
                </tr>
		        <tr><td valign="top"><em>OnSubComponentClosed</em></td>
                    <td>From with a view to the document, a view to a sub component (e.g. a table or a report) has been closed.</td>
                    <td align="center">no</td>
                </tr>
            </tbody>
        </table>
        </p>

        @since OpenOffice 3.1
    */
    interface ::com::sun::star::document::XDocumentEventBroadcaster;

    /** implements life time control

        <p>Whoever retrieves a <type>OfficeDatabaseDocument</type> should be aware of
        life time issues, since a document needs to be closed when nobody needs it anymore.</p>

        <p>This implies that clients of a document need to ensure that as soon as they don't
        need, they invoke <member scope="com::sun::star::util">XCloseable::close</member>.</p>

        <p>Since this can be done by multiple clients, every client is additionally required
        to register itself as <type scope="com::sun::star::util">XCloseListener</type> at
        the document, to prevent some other client closing the model while it's still needed
        by the first client.</p>
    */
    interface com::sun::star::util::XCloseable;
}; 
 
//============================================================================= 
 
}; }; }; }; 
 
/*=========================================================================== 
===========================================================================*/ 
#endif 

