/**************************************************************
 *
 * 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_text_XAutoTextContainer_idl__
#define __com_sun_star_text_XAutoTextContainer_idl__

#include <com/sun/star/container/ElementExistException.idl>
#include <com/sun/star/container/NoSuchElementException.idl>
#include <com/sun/star/container/XNameAccess.idl>
#include <com/sun/star/lang/IllegalArgumentException.idl>
#include <com/sun/star/text/XAutoTextGroup.idl>

module com {  module sun {  module star {  module text {

/** handles blocks of <type>AutoTextEntry</type>.
    @see AutoTextContainer
*/
published interface XAutoTextContainer: com::sun::star::container::XNameAccess
{
    /** creates a new AutoText group.

    @param aGroupName the name of the <type>AutoTextContainer</type>

    <p>The name must follow the pattern <code>groupname*pathid</code>, where:</p>

    <ul>
        <li><code>groupname</code> should contain only alphanumeric characters
            (A-Za-z0-9), underscore (_) or space (0x20)</li>
        <li>an asterisk (*) delimiter separates the group name from the path
            identifier</li>
        <li><code>pathid</code> is a number (0 or 1) identifying the directory
        where the AutoText file is stored. Paths are stored in the Office
        configuration and accessed through
        <member scope="com::sun::star::util">PathSettings::AutoText</member>.
            <ul>
                <li>0 indicates the path of the <b>Office Basis</b> layer</li>
                <li>1 indicates the path of the <b>user</b> directory</li>
            </ul>
        </li>
    </ul>
    If only <code>groupname</code> is specified, the path defaults to 0, the
    <b>Office Basis</b> layer.</br>Note that in some systems the user may lack of
    write access to the Office Basis directory.

    @example

    <ul>
        <li><code>standard*0</code></br>the "standard" AutoTextGroup in the Office Basis layer</li>
        <li><code>template</code></br>the "template" AutoTextGroup in the Office Basis layer</li>
        <li><code>mytexts*1</code></br>the "mytexts" AutoTextGroup in the user directory</li>
    </ul>

    */
    com::sun::star::text::XAutoTextGroup insertNewByName( [in] string aGroupName )
            raises( com::sun::star::lang::IllegalArgumentException,
                    com::sun::star::container::ElementExistException );

    /** deletes the specified AutoText group.
        @param aGroupName see the documentation for <member>XAutoTextContainer::insertNewByName()</member>
    */
    void removeByName( [in] string aGroupName )
            raises( com::sun::star::container::NoSuchElementException );

};

}; }; }; };

#endif
