/**************************************************************
 * 
 * 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_DocumentDefinition2_idl__
#define __com_sun_star_sdb_DocumentDefinition2_idl__

#ifndef __com_sun_star_beans_XPropertySet_idl__
#include <com/sun/star/beans/XPropertySet.idl>
#endif
#ifndef __com_sun_star_sdb_DefinitionContent_idl__
#include <com/sun/star/sdb/DefinitionContent.idl>
#endif

module com { module sun { module star { module sdb {

    interface XSubDocument;

/** specifies a sub document of a <type>OfficeDatabaseDocument</type>.

	<p>Usual instances of a <code>DocumentDefinition</code> are forms and reports.</p>

    <p>Note that the <code>DocumentDefinition</code> does not denote the actual document
    (i.e. an object supporting the <type scope="com::sun::star::frame">XModel</type> interface),
    but only a shortcut to access and load those actual documents.</p>
*/
service DocumentDefinition
{
    /** provides functionality for treating the object as part of a hierarchy
        of a database document's sub documents.

        <p>The <member scope="com::sun::star::ucb">XCommandProcessor::execute</member> method
        of a <code>DocumentDefinition</code> supports at least the following commands, additionally to
        the ones already supported by the DefinitionContent:
        <ul>
            <li><strong>open</strong>: loads the sub document in an own frame. The return value of
                the <code>execute</code> method is the model of the loaded document.</li>
            <li><strong>store</strong>: stores the document.</li>
            <li><strong>openDesign</strong>: opens the sub document in an own frame, in design mode.
                The user can make changes to the document, and save those changes. The return value of
                the <code>execute</code> method is the model of the loaded document.</li>
            <li><strong>preview</strong>: retrieves an image showing a preview of the sub document.</li>
            <li><strong>getDocumentInfo</strong>: retrieves the document information, as
                <type scope="com::sun::star::document">XDocumentInfo</type> instance, of the sub document.</li>
            <li><strong>delete</strong>: deletes the sub document from the database document.</li>
            <li><strong>close</strong>: closes the sub document, if it had previously been opened
                using either the <code>open</code> or <code>openDesign</code> command. The return value
                of the <code>execute</code> command is a <code>boolean</code> value indicating whether
                the sub document could be closed. Reasons for not closing the document include vetos by
                third parties, for instance, because the user opened a dialog modal to the sub document,
                or a long-running task such as printing is currently running.</li>
            <li><strong>show</strong>: shows the sub document. This is useful if you previously opened the
                document hidden, or if you previously hide it using the <em>hide</em> command.<br/>
                The <em>open</em> command is not available if the sub document has not been loaded, yet.</li>
            <li><strong>hide</strong>: hides the sub document. In opposite to the <em>close</em> command,
                only the document window is hidden, but the document is kept loaded. A subsequent execution
                of the <em>show</em> command will show the window, again.</li>
        </ul>
    */
    service DefinitionContent;

    interface ::com::sun::star::beans::XPropertySet;

    interface ::com::sun::star::sdb::XSubDocument;

	/** is the name of the document. If the document is part of the container,
		it is not possible to alter the name.*/
	[readonly, property] string Name;

	/** Indicates if the document is to be used as template, for example, if a report is to be filled with data. */
	[readonly, property] boolean AsTemplate;
};

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

}; }; }; };

#endif
