/**************************************************************
 * 
 * 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_XTreeNode_idl__
#define __com_sun_star_awt_tree_XTreeNode_idl__

#ifndef __com_sun_star_container_XEnumerationAccess_idl__
#include <com/sun/star/container/XEnumerationAccess.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 {

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

/** An instance implementing this interface represents the model data for an entry in a
    <type>XTreeDataModel</type>.
    <p>The <type>TreeControl</type> uses this interface to retrieve the model
    information needed to display a hierarchical outline</p>
    <p>Each XTreeNode in a <type>XTreeDataModel</type> must be unique.
 */
published interface XTreeNode
{
    /** Returns the child tree node at <var>Index</var>.

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

    /** Returns the number of child nodes. */
    long getChildCount();

    /** Returns the parent node of this node. */
    XTreeNode getParent();

    /** Returns the index of <var>Node</Node> in this instances children.
        @returns
            The child index of <var>Node</Node> , or -1 if <var>Node</Node>  is no child of this instance.
    */
    long getIndex( [in] XTreeNode Node);

    /** Returns <TRUE/> if the children of this node are created on demand.
        <p>A <type>TreeControl</type> will handle a node that returns <TRUE/> always
        like a node that has child nodes, even if <member>getChildCount</member>
        returns 0.</p>

        @see TreeExpansionListener;
    */
    boolean hasChildrenOnDemand();

    /** If not empty, the textual representation of this any is used as the text part of this node.
    */
    any getDisplayValue();

    /** 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.
    */
    string getNodeGraphicURL();

    /** 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.
    */
    string getExpandedGraphicURL();

    /** 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.
    */
    string getCollapsedGraphicURL();
};

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

}; }; }; }; };

#endif
