/**************************************************************
 * 
 * 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_XDocumentTemplates_idl__
#define __com_sun_star_frame_XDocumentTemplates_idl__

#ifndef __com_sun_star_frame_XStorable_idl__
#include <com/sun/star/frame/XStorable.idl>
#endif

#ifndef __com_sun_star_ucb_XContent_idl__
#include <com/sun/star/ucb/XContent.idl>
#endif

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

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

//=============================================================================
/** provides a high level api to organize document templates

    <p>
    Template informations are saved as links to the original content
    and organized in groups. This data should be persistent and can be
    updated by calling special method <member>XDocumentTemplates::update()</member>.
    A real implementation of this interface can do that on top of
    an ucb content provider. Method <member>XDocumentTemplates::getContent()</member>
    force that.
    </p>
 */
published interface XDocumentTemplates:  com::sun::star::uno::XInterface
{
	//-------------------------------------------------------------------------
    /** privides access to the root of internal used hierarchy

        <p>
        This content can be used for accessing the groups directly.
        </p>

        @return
            the ucb content for template configuration
	 */
    com::sun::star::ucb::XContent getContent();

	//-------------------------------------------------------------------------
	/** creates the template with the given name in the given group using the
        data from the storable

        @param GroupName
            specifies the group

        @param TemplateName
            specifies the template

        @param Storable
            specifies the target

        @return
            <TRUE/> if operation was sucessfully
            <br>
            <FALSE/> otherwise

        @see XDocumentTemplates::addTemplate()
	 */
    boolean storeTemplate(
        [in] string GroupName,
        [in] string TemplateName,
        [in] XStorable Storable);

	//-------------------------------------------------------------------------
	/** creates the template with the given name in the given group using the
        given URL

        @param GroupName
            specifies the group

        @param TemplateName
            specifies the template

        @param SourceURL
            specifies the position of template

        @return
            <TRUE/> if operation was sucessfully
            <br>
            <FALSE/> otherwise

        @see XDocumentTemplates::storeTemplate()
	 */
    boolean addTemplate(
        [in] string GroupName,
        [in] string TemplateName,
        [in] string SourceURL);

	//-------------------------------------------------------------------------
    /** remove a template from specified group

        @param GroupName
            specifies the group which include the template

        @param TemplateName
            specifies the template for delete

        @return
            <TRUE/> if operation was sucessfully
            <br>
            <FALSE/> otherwise
	 */
    boolean removeTemplate(
        [in] string GroupName,
        [in] string TemplateName);

	//-------------------------------------------------------------------------
    /** rename a template inside specified group

        @param GroupName
            specifies the group which include the template

        @param TemplateName
            specifies the template for renaming

        @return
            <TRUE/> if operation was sucessfully
            <br>
            <FALSE/> otherwise
	 */
    boolean renameTemplate(
        [in] string GroupName,
        [in] string OldTemplateName,
        [in] string NewTemplateName);

	//-------------------------------------------------------------------------
    /** creates a new group

		@param GroupName
            the name of the group to be created

		@return
            <TRUE/> if operation was sucessfully
            <br>
            <FALSE/> otherwise
	*/
    boolean addGroup( [in] string GroupName );

	//-------------------------------------------------------------------------
    /** remove an existing group

		@param GroupName
            the name of the group to be removed

		@return
            <TRUE/> if operation was sucessfully
            <br>
            <FALSE/> otherwise
	 */
    boolean removeGroup( [in] string GroupName );

	//-------------------------------------------------------------------------
    /** rename an existing group

        @param OldGroupName
            the old name of the group

        @param NewGroupName
            the new name of the group

		@return
            <TRUE/> if operation was sucessfully
            <br>
            <FALSE/> otherwise
	 */
    boolean renameGroup(
        [in] string OldGroupName,
        [in] string NewGroupName);

	//-------------------------------------------------------------------------
    /** force an update for internal structures

        <p>
        Because the templates are well known by links and not as direct content
        they can be outdated. An update force actualization of that to find
        wrong links.
        </p>
	 */
    [oneway] void update();
};

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

}; }; }; };

#endif
