/*******************************************************************************
 * Copyright (c) 2006 Sybase, Inc. and others.
 *
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http:// www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 * Sybase, Inc. - initial API and implementation
 *******************************************************************************/
package org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.jface.viewers.ISelection;
import org.w3c.dom.Element;
import org.w3c.dom.Node;

import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
import org.eclipse.jst.pagedesigner.jsf.core.dom.JSFDOMUtil;
import org.eclipse.jst.pagedesigner.utils.DOMUtil;
import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;

/**
 * Remove a row from panel grid
 * 
 * @author mengbo
 * @version 1.5
 */
public class PanelGridDeleteRowCommand extends DesignerCommand
{
    Element _panelGridEle;
    int     _rowIndex;

    /**
     * @param label
     * @param viewer
     */
    public PanelGridDeleteRowCommand(IHTMLGraphicalViewer viewer, Element panelGrid, int index)
    {
        super(CommandResources.getString("PanelGridDeleteRowCommand.Label.DeleteRow"), viewer); //$NON-NLS-1$
        this._panelGridEle = panelGrid;
        this._rowIndex = index;
    }

    /* (non-Javadoc)
     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
     */
    protected void doExecute()
    {
        // Remove the row from panelGrid is a little complex. Since this row could
        // be header or footer.
        boolean hasHeaderRow = (JSFDOMUtil.findFacet(_panelGridEle, "header") != null); //$NON-NLS-1$

        int columns = DOMUtil.getIntAttributeIgnoreCase(_panelGridEle, "columns", 1); //$NON-NLS-1$
        if (columns < 1)
        {
            columns = 1;
        }

        List children = JSFDOMUtil.getUIComponentChildren(_panelGridEle);
        int numRows = (children.size() + columns - 1) / columns;

        int removeRow = _rowIndex;

        if (hasHeaderRow)
        {
            if (removeRow == 0)
            {
                // remove the header row.
                removeHeader();
                formatNode(_panelGridEle);
                return;
            }
            removeRow--;
        }
        if (removeRow < numRows)
        {
            List toRemove = new ArrayList();
            int max = columns * (removeRow + 1);
            max = Math.min(max, children.size());
            for (int i = (columns * removeRow); i < max; i++)
            {
                toRemove.add(children.get(i));
            }
            for (int i = 0, size = toRemove.size(); i < size; i++)
            {
                _panelGridEle.removeChild((Node) toRemove.get(i));
            }
            formatNode(_panelGridEle);
        }
        else
        {
            // must be footer.
            removeFooter();
            formatNode(_panelGridEle);
        }
    }

    /* (non-Javadoc)
     * @see org.eclipse.gef.commands.Command#canExecute()
     */
    public boolean canExecute()
    {
        if (this._rowIndex < 0)
        {
            return false;
        }
        return super.canExecute();
    }

    /**
     * 
     */
    private void removeFooter()
    {
        Element ele = JSFDOMUtil.findFacet(_panelGridEle, "footer"); //$NON-NLS-1$
        if (ele != null)
        {
            _panelGridEle.removeChild(ele);
        }
    }

    /**
     * 
     */
    private void removeHeader()
    {
        Element ele = JSFDOMUtil.findFacet(_panelGridEle, "header"); //$NON-NLS-1$
        if (ele != null)
        {
            _panelGridEle.removeChild(ele);
        }
    }
    
    /* (non-Javadoc)
     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
     */
    protected ISelection getAfterCommandDesignerSelection()
    {
        return this.toDesignSelection(this._panelGridEle);
    }
}
