/**************************************************************
 * 
 * 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.XAccessibleContext;
import com.sun.star.accessibility.XAccessibleTable;
import com.sun.star.accessibility.XAccessible;


class AccessibleCellHandler extends NodeHandler
{
    public NodeHandler createHandler (XAccessibleContext xContext)
    {
        AccessibleCellHandler aCellHandler = null;
        if (xContext != null)
        {
            XAccessible xParent = xContext.getAccessibleParent();
            if (xParent != null)
            {
                XAccessibleTable xTable = 
                    (XAccessibleTable) UnoRuntime.queryInterface (
                        XAccessibleTable.class, xParent.getAccessibleContext());
                if (xTable != null)
                    aCellHandler = new AccessibleCellHandler (xTable);
            }
        }
        return aCellHandler;

    }

    public AccessibleCellHandler ()
    {
    }

    public AccessibleCellHandler (XAccessibleTable xTable)
    {
        if (xTable != null)
            maChildList.setSize (8);
    }

    protected static XAccessibleTable getTable(Object aObject)
    {
        return (XAccessibleTable) UnoRuntime.queryInterface (
            XAccessibleTable.class, aObject);
    }

    public AccessibleTreeNode createChild (AccessibleTreeNode aParent, int nIndex)
    {
        AccessibleTreeNode aChild = null;
        XAccessibleTable xTable = null;
        XAccessibleContext xContext = null;
		AccessibleTreeNode aGrandParent = aParent.getParent();
        if (aGrandParent instanceof AccTreeNode)
		{
            xTable = ((AccTreeNode)aGrandParent).getTable();
			xContext = ((AccTreeNode)aGrandParent).getContext();
		}
        if (aParent instanceof AccTreeNode)
		{
			xContext = ((AccTreeNode)aParent).getContext();
		}
        try
        {
            if( xTable != null && xContext != null )
            {
                switch( nIndex )
                {
                    case 0:
						{
							int nChild = xContext.getAccessibleIndexInParent();
							int nRow = xTable.getAccessibleRow( nChild );

							aChild = new StringNode ("# table row: " + nRow, aParent);
						}
                        break;
                    case 1:
						{
							int nChild = xContext.getAccessibleIndexInParent();
							int nCol = xTable.getAccessibleColumn( nChild );

							aChild = new StringNode ("# table column: " + nCol, aParent);
						}
                        break;
                    case 2:
						{
							int nChild = xContext.getAccessibleIndexInParent();
							int nRow = xTable.getAccessibleRow( nChild );
							int nCol = xTable.getAccessibleColumn( nChild );
							int nExt = xTable.getAccessibleRowExtentAt( nRow, nCol );

							aChild = new StringNode ("# table row extend: " + nExt, aParent);
						}
						break;
                     case 3:
						{
							int nChild = xContext.getAccessibleIndexInParent();
							int nRow = xTable.getAccessibleRow( nChild );
							int nCol = xTable.getAccessibleColumn( nChild );
							int nExt = xTable.getAccessibleColumnExtentAt( nRow, nCol );

							aChild = new StringNode ("# table column extend: " + nExt, aParent);
						}
                        break;
                     case 4:
						{
							int nChild = xContext.getAccessibleIndexInParent();
							int nRow = xTable.getAccessibleRow( nChild );
							int nCol = xTable.getAccessibleColumn( nChild );
							XAccessible xChild =
								xTable.getAccessibleCellAt( nRow, nCol );

							aChild = new StringNode ("# cell name retrieved from table: " + xChild.getAccessibleContext().getAccessibleName(), aParent);
						}
                        break;
                     case 5:
						{
							int nChild = xContext.getAccessibleIndexInParent();
							int nRow = xTable.getAccessibleRow( nChild );
							int nCol = xTable.getAccessibleColumn( nChild );
							boolean bSelected =
								xTable.isAccessibleSelected( nRow, nCol );

							aChild = new StringNode ("cell is selected: " + bSelected, aParent);
						}
                        break;
                     case 6:
						{
							int nChild = xContext.getAccessibleIndexInParent();
							int nRow = xTable.getAccessibleRow( nChild );
							boolean bSelected =
								xTable.isAccessibleRowSelected( nRow );

							aChild = new StringNode ("table row is selected: " + bSelected, aParent);
						}
                        break;
                     case 7:
						{
							int nChild = xContext.getAccessibleIndexInParent();
							int nCol = xTable.getAccessibleColumn( nChild );
							boolean bSelected =
								xTable.isAccessibleColumnSelected( nCol );

							aChild = new StringNode ("table column is selected: " + bSelected, aParent);
						}
                        break;
                    default:
                        aChild = new StringNode ("unknown child index " + nIndex, aParent);
                }
            }
        }
        catch (Exception e)
        {
            // Return empty child.
        }

        return aChild;
    }
}
