/*******************************************************************************
 * 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.figures;

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

import org.eclipse.draw2d.AbstractLayout;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.Rectangle;


/**
 * Figures using the StackLayout as their layout manager have
 * their children placed on top of one another. Order of 
 * placement is determined by the order in which the children
 * were added, first child added placed on the bottom.
 */
public class CenterLayout
	extends AbstractLayout
{
                             
protected int spacing;

public CenterLayout(){}
public CenterLayout(int spacing){ this.spacing = spacing; }

/**
 * Calculates and returns the preferred size of the input container.
 * This is the size of the largest child of the container, as all
 * other children fit into this size.
 *
 * @param figure  Container figure for which preferred size is required.
 * @return  The preferred size of the input figure.
 */
protected Dimension calculatePreferredSize(IFigure figure, int w, int h){
	Dimension d = calculatePreferredClientAreaSize(figure);
	/*d.expand(figure.getInsets().getWidth(),
	         figure.getInsets().getHeight()); */
        d.expand(w,
	         h);
	d.union(getBorderPreferredSize(figure));
	return d;
}

protected Dimension calculatePreferredClientAreaSize(IFigure figure){
	Dimension d = new Dimension();
	List children = figure.getChildren();
	for (Iterator i = children.iterator(); i.hasNext(); )
  {
		IFigure child = (IFigure)i.next();
    Dimension childSize = child.getPreferredSize();
    d.height += childSize.height;
    d.width = Math.max(childSize.width, d.width);
	}	                    
  int childrenSize = children.size();       
  if (childrenSize > 0)
  {
    d.height += spacing * children.size() - 1;
  }
	return d;
}

/*
 * Returns the minimum size required by the input container.
 * This is the size of the largest child of the container, as all
 * other children fit into this size.
 */
public Dimension getMinimumSize(IFigure figure, int wHint, int hHint){
	Dimension d = new Dimension();
	List children = figure.getChildren();
	IFigure child;
	for (int i=0; i < children.size(); i++){
		child = (IFigure)children.get(i);
		d.union(child.getMinimumSize());
	}
	d.expand(figure.getInsets().getWidth(),
	         figure.getInsets().getHeight());
	return d;
}

public Dimension getPreferredSize(IFigure figure, int wHint, int hHint){
	return calculatePreferredSize(figure, wHint, hHint);
}


/*
 * Lays out the children on top of each other with
 * their sizes equal to that of the available
 * paintable area of the input container figure.
 */
public void layout(IFigure figure){
	Rectangle r = figure.getClientArea();
	List children = figure.getChildren();
  
  Dimension preferredClientAreaSize = calculatePreferredClientAreaSize(figure);
  int x = r.x + (r.width - preferredClientAreaSize.width) / 2;
  int y = r.y + (r.height - preferredClientAreaSize.height) / 2;

	for (Iterator i = children.iterator(); i.hasNext(); )
  {
		IFigure child = (IFigure)i.next();
    Dimension childSize = child.getPreferredSize();
		child.setBounds(new Rectangle(x, y, childSize.width, childSize.height));
    y += childSize.height + spacing;
	}
}
}