/*******************************************************************************
 * Copyright (c) 2001, 2006 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.wsdl.ui.internal.asd.design.editparts;

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

import org.eclipse.draw2d.AbstractLayout;
import org.eclipse.draw2d.Figure;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.Panel;
import org.eclipse.draw2d.ToolbarLayout;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.wst.wsdl.ui.internal.asd.design.editparts.model.BindingColumn;
import org.eclipse.wst.wsdl.ui.internal.asd.design.editparts.model.InterfaceColumn;
import org.eclipse.wst.wsdl.ui.internal.asd.design.editparts.model.ServiceColumn;
import org.eclipse.wst.wsdl.ui.internal.asd.facade.IDescription;
import org.eclipse.wst.xsd.ui.internal.design.figures.SpacingFigure;

public class DefinitionsEditPart extends BaseEditPart {
	  List collections = null;
	  Figure contentPane;
	  
	  protected IFigure createFigure()
	  {    
	    Panel panel = new Panel();    
	    // why do we need to use a container layout?  can we just set a
	    // margin border and get the same effect?
	    ContainerLayout clayout = new ContainerLayout();
	    clayout.setBorder(60);
	    panel.setLayoutManager(clayout);
	    
	    // issue (cs) : why did we need a free form layer?
	    contentPane = new Figure();
	    panel.add(contentPane);
	        
	    ToolbarLayout layout = new ToolbarLayout(true);
	    layout.setStretchMinorAxis(true);
	    layout.setSpacing(0);
	    contentPane.setLayoutManager(layout);
	    return panel;
	  }
	  
	  public IFigure getContentPane()
	  {
	    return contentPane;
	  }
	  

	  protected void createEditPolicies()
	  {
	    // TODO Auto-generated method stub
	  }
	  
	  protected List getModelChildren()
	  { 
	    if (collections == null)
	    {
	      collections = new ArrayList();
	      
	      IDescription description = (IDescription) getModel();
	      if (description != null)
	      {  
	        collections.add(new ServiceColumn(description));
	        collections.add(new BindingColumn(description));
	        collections.add(new InterfaceColumn(description));
	      }  
	    }  
	    return collections;
	  }
	  
	  public void setInput(Object object)
	  {    
	  }
	  
	  // TODO: See if we really need this class.  See above.  If so, where should we
	  // put this class?
	  public class ContainerLayout extends AbstractLayout
	  {                                         
	    protected boolean isHorizontal;
	    protected int spacing = 0;
	    protected int border = 0; 

	    public ContainerLayout()
	    { 
	      this(true, 0); 
	    }             

	    public ContainerLayout(boolean isHorizontal, int spacing)
	    {
	      this.isHorizontal = isHorizontal;   
	      this.spacing = spacing;
	    }  

	    public void setHorizontal(boolean isHorizontal)
	    {
	      this.isHorizontal = isHorizontal;
	    }  

	    public void setSpacing(int spacing)
	    {
	      this.spacing = spacing;
	    }  

	    public void setBorder(int border)
	    {
	      this.border = border;
	    }  

	    protected int alignFigure(IFigure parent, IFigure child)
	    { 
	      return -1;
	    }

	    /**
	     * Calculates and returns the preferred size of the container 
	     * given as input.
	     * 
	     * @param figure  Figure whose preferred size is required.
	     * @return  The preferred size of the passed Figure.
	     * @since 2.0
	     */
	    protected Dimension calculatePreferredSizeHelper(IFigure parent)
	    { 
	      Dimension	preferred = new Dimension();
	    	List children = parent.getChildren();
	  		                                        
	  	  for (int i=0; i < children.size(); i++)
	      {
	  		  IFigure child = (IFigure)children.get(i);      
	      
	        Dimension	childSize = child.getPreferredSize();
	  	  
	        if (isHorizontal)
	        {
	  		    preferred.width += childSize.width;
	  		    preferred.height = Math.max(preferred.height, childSize.height);
	        }
	        else
	        {  
	          preferred.height += childSize.height;
	          preferred.width = Math.max(preferred.width, childSize.width);
	        }
	  	  }   

	      int childrenSize = children.size();
	      if (childrenSize > 1)
	      {                      
	        if (isHorizontal)    
	        {
	          preferred.width += spacing * (childrenSize - 1);
	        }
	        else
	        {
	  		    preferred.height += spacing * (childrenSize - 1);
	        } 
	      }
	                            
	      preferred.width += border * 2;
	      preferred.height += border * 2;
	  	  preferred.width += parent.getInsets().getWidth();
	  	  preferred.height += parent.getInsets().getHeight();       
	    
	    	return preferred;
	    }

	    protected Dimension calculatePreferredSize(IFigure parent, int width, int height)
	    {    
	      Dimension	preferred = null;                                              
	                                    
	      // Here we ensure that an unexpanded container is given a size of (0,0)
	      //
//	      if (parent instanceof IExpandable)
//	      {
//	        IExpandable expandableFigure = (IExpandable)parent;
//	        if (!expandableFigure.isExpanded())
//	        {
//	          preferred = new Dimension(); 
//	        }
//	      }   
//	      
	      if (preferred == null)
	      {
	  	    preferred = calculatePreferredSizeHelper(parent);    
	      }
	      
	      return preferred;
	    }
	       

	    protected void adjustLayoutLocation(IFigure parent, Dimension dimension)
	    {     
	    }   

	    public void layout(IFigure parent)
	    {       
	    	List children = parent.getChildren();
	   
	      int rx = 0;
	      Dimension	dimension = new Dimension();                                          


	  	  for (int i=0; i < children.size(); i++)
	      {
	  		  IFigure child = (IFigure)children.get(i);
	  		  Dimension	childSize = child.getPreferredSize();
	        if (isHorizontal)
	        {   
	          dimension.height = Math.max(dimension.height, childSize.height);
	          rx += childSize.width;
	        }
	        else
	        {
	          dimension.width = Math.max(dimension.width, childSize.width);
	        }
	      }

	  	  //dimension.width += parent.getInsets().left;
	      //dimension.height += parent.getInsets().top;

	      if (isHorizontal)
	      {
	        dimension.height += border*2;
	      	dimension.width += border;
	      }
	      else
	      {
	        dimension.width += border*2;
	      	dimension.height += border;
	      }
	      adjustLayoutLocation(parent, dimension);    

	      for (int i=0; i < children.size(); i++)
	      {
	        IFigure child = (IFigure)children.get(i);
	  	    Dimension	childSize = child.getPreferredSize();
	          
	        if (isHorizontal)
	        {   
	          int y = -1; 
	      
	          y = alignFigure(parent, child);
	      
	          if (y == -1)
	          {
	             y = (dimension.height - childSize.height) / 2;                                      
	          }                      
	                                                     
	          Rectangle rectangle = new Rectangle(dimension.width, y, childSize.width, childSize.height);
	          rectangle.translate(parent.getClientArea().getLocation());                           


	          child.setBounds(rectangle);                           
	  	      dimension.width += childSize.width; 
	          dimension.width += spacing;       

	          if (child instanceof SpacingFigure)
	          {          
	            int availableHorizontalSpace = parent.getClientArea().width - rx;
	            dimension.width += availableHorizontalSpace;
	          }           
	        }
	        else
	        {
	          Rectangle rectangle = new Rectangle(0, dimension.height, childSize.width, childSize.height);
	  	      rectangle.translate(parent.getClientArea().getLocation());                          
	          

	          child.setBounds(rectangle);  
	          dimension.height += childSize.height;
	          dimension.height += spacing;
	        }
	  	  }	      
	    }                                      
	  }
}
