/**************************************************************
 * 
 * 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_awt_tree_XMutableTreeNode_idl__
#define __com_sun_star_awt_tree_XMutableTreeNode_idl__

#ifndef __com_sun_star_awt_tree_XTreeNode_idl__
#include <com/sun/star/awt/tree/XTreeNode.idl>
#endif

#ifndef __com_sun_star_lang_IllegalArgumentException_idl__
#include <com/sun/star/lang/IllegalArgumentException.idl>
#endif

#ifndef __com_sun_star_lang_IndexOutOfBoundsException_idl__
#include <com/sun/star/lang/IndexOutOfBoundsException.idl>
#endif

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

module com {  module sun {  module star {  module awt { module tree {

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

/** Represents a mutable tree node as used by the <type>MutableTreeDataModel</type>
 */
published interface XMutableTreeNode : XTreeNode
{
    /** appends <var>ChildNode</var> to this instance.

        @throws ::com::sun::star::lang::IllegalArgumentException
            if <var>ChildNode</var> is not a valid node of the corresponding <type>XTreeDataModel</type>.
    */
    void appendChild( [in] XMutableTreeNode ChildNode )
        raises( com::sun::star::lang::IllegalArgumentException );

    /** inserts <var>ChildNode</var> to this instance at the given index.

        @param Index
            the index where the node will be inserted to this instance.

        @throws ::com::sun::star::lang::IllegalArgumentException
            if <var>ChildNode</var> is not a valid node of the corresponding <type>XTreeDataModel</type>.

        @throws ::com::sun::star::lang::IndexOutOfBoundsException
            if <var>Index</var> is less than 0 or greater then <member>XTreeNode::getChildCount()</member>.
    */
    void insertChildByIndex( [in] long Index, [in] XMutableTreeNode ChildNode )
        raises( com::sun::star::lang::IllegalArgumentException,
                    com::sun::star::lang::IndexOutOfBoundsException );

    /** removes the node from this instance at the specified index.

        @param Index
            the index of the node to be removed from this instance.

        @throws ::com::sun::star::lang::IndexOutOfBoundsException
            if <var>Index</var> is less than 0 or greater then <member>XTreeNode::getChildCount()</member>.
     */
    void removeChildByIndex( [in] long Index )
            raises( com::sun::star::lang::IndexOutOfBoundsException );

    /** Changes if the children of this node are created on demand.

        @see XTreeNode::hasChildrenOnDemand()
    */
    void setHasChildrenOnDemand( [in] boolean ChildrenOnDemand );

    /** sets the display value of this node */
    void setDisplayValue( [in] any Value );

    /** Stores an implementation dependend value.

        <p>You can use this attribute to store data for this node that
        is independend of the display value</p>
    */
    [attribute] any DataValue;

    /** The URL for a graphic that is rendered before the text part of this node.
        <p>If this URL is empty, no graphic is rendered.
    */
    void setNodeGraphicURL( [in] string URL );

    /** The URL for a graphic that is rendered to visualize expanded non leaf nodes.
        <p>If <var>URL</var> is empty, <member>XTreeControl::DefaultExpandedGraphicURL</member> is used.
    */
    void setExpandedGraphicURL( [in] string URL );

    /** The URL for a graphic that is rendered to visualize collapsed non leaf nodes.
        <p>If <var>URL</var> is empty, <member>XTreeControl::DefaultCollapsedGraphicURL</member> is used.
    */
    void setCollapsedGraphicURL( [in] string URL );
};

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

}; }; }; }; };

#endif
