/*******************************************************************************
 * Copyright (c) 2001, 2004 IBM Corporation 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:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.wst.xsd.ui.internal.graph.editpolicies;

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

import org.eclipse.draw2d.geometry.Point;
import org.eclipse.draw2d.geometry.PointList;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.EditPartViewer;
import org.eclipse.gef.GraphicalEditPart;
import org.eclipse.gef.commands.Command;
import org.eclipse.gef.requests.ChangeBoundsRequest;
import org.eclipse.wst.xsd.ui.internal.actions.MoveAction;
import org.eclipse.wst.xsd.ui.internal.gef.util.figures.IConnectionRenderingViewer;
import org.eclipse.wst.xsd.ui.internal.graph.editparts.ComplexTypeDefinitionEditPart;
import org.eclipse.wst.xsd.ui.internal.graph.editparts.GraphNodeEditPart;
import org.eclipse.wst.xsd.ui.internal.graph.editparts.ModelGroupDefinitionEditPart;
import org.eclipse.wst.xsd.ui.internal.graph.editparts.ModelGroupEditPart;
import org.eclipse.xsd.XSDConcreteComponent;


public class DragAndDropCommand extends Command //AbstractCommand
{ 
  protected EditPartViewer viewer;    
  protected ChangeBoundsRequest request;
  protected GraphNodeEditPart childRefEditPart;    
  public GraphNodeEditPart parentEditPart; 
  public Point location;
  protected MoveAction action;    
  protected boolean canExecute;

  public DragAndDropCommand(EditPartViewer viewer, ChangeBoundsRequest request)
  {
    this.viewer = viewer;                    
    this.request = request;

    location = request.getLocation();   
    EditPart target = viewer.findObjectAt(location); 
  	((GraphicalEditPart)viewer.getRootEditPart()).getFigure().translateToRelative(location);
     
    List list = request.getEditParts();
    if (list.size() > 0)
    {           
      parentEditPart = getParentEditPart(target);
      if (parentEditPart != null)
      {                                          
        for (Iterator i = parentEditPart.getChildren().iterator(); i.hasNext(); )
        {
          EditPart child = (EditPart)i.next();
          if (child instanceof GraphNodeEditPart)
          {
            GraphNodeEditPart childGraphNodeEditPart = (GraphNodeEditPart)child;
            Rectangle rectangle = childGraphNodeEditPart.getSelectionFigure().getBounds();
     
            if (location.y < rectangle.getCenter().y)
            {                                    
              childRefEditPart = childGraphNodeEditPart;   
              break;
            }
          }
        } 
            
        List editPartsList = request.getEditParts();
        List concreteComponentList = new ArrayList(editPartsList.size());
        for (Iterator i = editPartsList.iterator(); i.hasNext(); )
        {                                                       
          EditPart editPart = (EditPart)i.next();
          concreteComponentList.add((XSDConcreteComponent)editPart.getModel());
        } 
        XSDConcreteComponent refComponent = childRefEditPart != null ? (XSDConcreteComponent)childRefEditPart.getModel() : null;

        action = new MoveAction((XSDConcreteComponent)parentEditPart.getModel(), concreteComponentList, refComponent);
        canExecute = action.canMove();                                            
      }            
    }     
  }
             
  protected GraphNodeEditPart getParentEditPart(EditPart target)
  {
    GraphNodeEditPart result = null;    
    while (target != null)
    {                     
      if (target instanceof ModelGroupEditPart)
      {
        result = (GraphNodeEditPart)target;
        break;
      }
      else if (target instanceof ComplexTypeDefinitionEditPart ||
               target instanceof ModelGroupDefinitionEditPart)
      {
        List list = target.getChildren();
        for (Iterator i = list.iterator(); i.hasNext(); )
        {
          Object child = i.next();
          if (child instanceof ModelGroupEditPart)
          {
            result = (GraphNodeEditPart)child;
            break;
          }
        }   
        if (result != null)
        {
          break;
        }
      }
      target = target.getParent();
    }
    return result;
  }

  public void execute()
  {           
    if (canExecute)
    { 
      action.run(); 
    }
  }     
  
  public void redo()
  {

  }  
  
  public void undo()
  {
  }     
  
  public boolean canExecute()
  { 
    return canExecute;
  } 

  public PointList getConnectionPoints(Rectangle draggedFigureBounds)
  {             
    PointList pointList = null;      
    if (parentEditPart != null && childRefEditPart != null && viewer instanceof IConnectionRenderingViewer)
    {                                
      pointList = ((IConnectionRenderingViewer)viewer).getConnectionRenderingFigure().getConnectionPoints(parentEditPart, childRefEditPart, draggedFigureBounds);      
    }               
    return pointList != null ? pointList : new PointList();
  }                                                                  
}
