/**************************************************************
 *
 * 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 com.sun.star.uno.UnoRuntime;
import com.sun.star.accessibility.XAccessible;
import com.sun.star.accessibility.XAccessibleContext;
import com.sun.star.accessibility.AccessibleRelation;
import com.sun.star.accessibility.XAccessibleRelationSet;
import com.sun.star.accessibility.AccessibleRelationType;
import com.sun.star.lang.XServiceInfo;
import com.sun.star.lang.XTypeProvider;
import com.sun.star.uno.Type;


/** This handler displays lower level UNO information.  These are the
    supported services, interfaces, and the implementation name.
*/
class AccessibleUNOHandler
    extends NodeHandler
{
    public NodeHandler createHandler (XAccessibleContext xContext)
    {
        if (xContext == null)
            return null;
        else
            return new AccessibleUNOHandler (xContext);
    }

    public AccessibleUNOHandler()
    {
    }

    public AccessibleUNOHandler (XAccessibleContext xContext)
    {
        maChildList.setSize (3);
    }

    private XServiceInfo GetServiceInfo (AccessibleTreeNode aNode)
    {
        XServiceInfo xServiceInfo = null;
        if (aNode instanceof AccTreeNode)
            xServiceInfo = (XServiceInfo)UnoRuntime.queryInterface(
                XServiceInfo.class, ((AccTreeNode)aNode).getContext());
        return xServiceInfo;
    }
    private XTypeProvider GetTypeProvider (AccessibleTreeNode aNode)
    {
        XTypeProvider xTypeProvider = null;
        if (aNode instanceof AccTreeNode)
            xTypeProvider = (XTypeProvider)UnoRuntime.queryInterface(
                XTypeProvider.class, ((AccTreeNode)aNode).getContext());
        return xTypeProvider;
    }

    public AccessibleTreeNode createChild (AccessibleTreeNode aParent,
                                           int nIndex)
    {
        AccessibleTreeNode aChild = null;
        XServiceInfo xServiceInfo;
        switch (nIndex)
        {
            case 0 : // Implementation name.
                xServiceInfo = GetServiceInfo (aParent);
                aChild = new StringNode ("Implementation name: " +
                    (xServiceInfo!=null ? xServiceInfo.getImplementationName()
                        : "<XServiceInfo not supported>"),
                    aParent);
                break;
            case 1 :
                xServiceInfo = GetServiceInfo (aParent);
                if (xServiceInfo == null)
                    aChild = new StringNode (
                        "Supported services: <XServiceInfo not supported>",
                        aParent);
                else
                    aChild = CreateServiceTree (aParent, xServiceInfo);
                break;
            case 2 :
                XTypeProvider xTypeProvider = GetTypeProvider (aParent);
                if (xTypeProvider == null)
                    aChild = new StringNode (
                        "Supported interfaces: <XTypeProvider not supported>",
                        aParent);
                else
                    aChild = CreateInterfaceTree (aParent, xTypeProvider);
                break;
        }

        return aChild;
    }


    private AccessibleTreeNode CreateServiceTree (AccessibleTreeNode aParent,
        XServiceInfo xServiceInfo)
    {
        String[] aServiceNames = xServiceInfo.getSupportedServiceNames();
        VectorNode aNode = new VectorNode ("Supported Services", aParent);

        int nCount = aServiceNames.length;
        for (int i=0; i<nCount; i++)
            aNode.addChild (new StringNode (aServiceNames[i], aParent));

        return aNode;
    }

    private AccessibleTreeNode CreateInterfaceTree (AccessibleTreeNode aParent,
        XTypeProvider xTypeProvider)
    {
        Type[] aTypes = xTypeProvider.getTypes();
        VectorNode aNode = new VectorNode ("Supported Interfaces", aParent);

        int nCount = aTypes.length;
        for (int i=0; i<nCount; i++)
            aNode.addChild (new StringNode (aTypes[i].getTypeName(), aParent));

        return aNode;
    }
}
