/**************************************************************
 *
 * 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.
 *
 *************************************************************/

import java.util.Vector;


/**
 * Map an arbitrary object into parts of a tree node.
 */
abstract class NodeHandler
{
    /** This vector is used as cache for the child objects.
    */
    protected Vector maChildList;


    public abstract NodeHandler createHandler (
        com.sun.star.accessibility.XAccessibleContext xContext);

    public NodeHandler ()
    {
        maChildList = new Vector ();
    }

    /** Clear the cache of child objects.
    */
    public void clear ()
    {
        synchronized (maChildList)
        {
            maChildList = new Vector ();
        }
    }

    /** This factory method creates an individual handler for the specified
        object that may hold information to accelerate the access to its children.
    */
    //    public abstract NodeHandler createHandler (Object aObject);

    /** return the number of children this object has */
    public int getChildCount(Object aObject)
    {
        synchronized (maChildList)
        {
            return maChildList.size();
        }
    }

    /**
     * return a child object. Complex
     * children have to be AccTreeNode instances.
     * @see AccTreeNode
     */
    public AccessibleTreeNode getChild (AccessibleTreeNode aParent, int nIndex)
    {
        synchronized (maChildList)
        {
            AccessibleTreeNode aChild = (AccessibleTreeNode)maChildList.get(nIndex);
            if (aChild == null)
            {
                aChild = createChild (aParent, nIndex);
                if (aChild == null)
                    aChild = new StringNode ("could not create child", aParent);
                maChildList.setElementAt (aChild, nIndex);
            }
            return aChild;
        }
    }

    public AccessibleTreeNode getChildNoCreate (AccessibleTreeNode aParent, int nIndex)
    {
        synchronized (maChildList)
        {
            return (AccessibleTreeNode)maChildList.get(nIndex);
        }
    }

    /** Remove the specified child from the list of children.
    */
    public boolean removeChild (AccessibleTreeNode aNode, int nIndex)
    {
        try
        {
            synchronized (maChildList)
            {
                System.out.println ("    removing child at position " + nIndex + ": "
                    + maChildList.elementAt (nIndex));
                maChildList.remove (nIndex);
            }
        }
        catch (Exception e)
        {
            return false;
        }
        return true;
    }

    public int indexOf (AccessibleTreeNode aNode)
    {
        synchronized (maChildList)
        {
            return maChildList.indexOf (aNode);
        }
    }

    /** Create a child object for the specified data.  This method is called
        usually from getChild and put there into the cache.
    */
    public abstract AccessibleTreeNode createChild (
        AccessibleTreeNode aParent, int nIndex);

    //
    // The following methods support editing of children and actions.
    // They have default implementations for no actions and read-only.
    //

    /** May this child be changed? */
    public boolean isChildEditable (AccessibleTreeNode aNode, int nIndex)
    {
        return false;
    }

    /** change this child's value */
    //    public void setChild(Object aObject, int nIndex) { }


    /** get names of supported actions */
    public String[] getActions (AccessibleTreeNode aNode)
    {
        return new String[] {};
    }

    /** perform action */
    public void performAction (AccessibleTreeNode aNode, int nIndex)
    {
    }

    /** Update all children.
    */
    public void update (AccessibleTreeNode aNode)
    {
    }
}
