/**************************************************************
 * 
 * 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_XSubDocument_idl__
#define __com_sun_star_sdb_XSubDocument_idl__

#include <com/sun/star/lang/WrappedTargetException.idl>
#include <com/sun/star/lang/XComponent.idl>

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

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

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

/** allows operating on a sub document of an <type>OfficeDatabaseDocument</type>

    @since OOo 3.1
 */
published interface XSubDocument
{
    /** opens the sub document

        <p>Note that opening the document means it is displayed in an own top-level frame
        on the desktop.</p>

        @return
            the sub document, usually an <type scope="com::sun::star::frame">XModel</type>,
            or an <type scope="com::sun::star::frame">XController</type> if the sub document
            does not have an own model.

        @throws ::com::sun::star::lang::WrappedTargetException
            if an error occurs during opening the document
    */
    ::com::sun::star::lang::XComponent
            open()
                raises( ::com::sun::star::lang::WrappedTargetException );

    /** opens the sub document in design mode

        @return
            the sub document, usually an <type scope="com::sun::star::frame">XModel</type>,
            or an <type scope="com::sun::star::frame">XController</type> if the sub document
            does not have an own model.

        @throws ::com::sun::star::lang::WrappedTargetException
            if an error occurs during opening the document
    */
    ::com::sun::star::lang::XComponent
            openDesign()
                raises( ::com::sun::star::lang::WrappedTargetException );

    /** stores the sub document, if it had previously been opened in either mode

        @throws ::com::sun::star::lang::WrappedTargetException
            if an error occurs during storing the document
    */
    void    store()
                raises( ::com::sun::star::lang::WrappedTargetException );

    /** closes the sub document, if it had previously been opened in either mode

        @return <TRUE/> if and only if the document could be closed, <FALSE/> otherwise,
            e.g. if the closing has been vetoed by the user.

        @throws ::com::sun::star::lang::WrappedTargetException
            if an error occurs during closing the document
    */
    boolean close()
                raises( ::com::sun::star::lang::WrappedTargetException );
};

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

}; }; }; };

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

#endif
