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

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

/**
 * A FlowBox that can contain other BlockInfos. The contained BlockInfos are
 * called <i>fragments </i>.
 * 
 * @author mengbo
 * @since 2.1
 */
public abstract class CompositeBox extends FlowBox {

	/**
	 * The contained fragments.
	 */
	protected List _fragments = new ArrayList();

	int _recommendedWidth;

	int _recommendedHeight;

	/**
	 * Adds the specified FlowBox. Updates the width, height, and ascent
	 * properties.
	 * 
	 * @param block
	 *            the FlowBox being added
	 */
	public void add(FlowBox block) {
		// The order is critical.see the first "if" block in the unionInfo()
		// method.
		unionInfo(block);
		_fragments.add(block);
	}

	/**
	 * Removes all owned fragments and invalidates this CompositeBox.
	 */
	public void clear() {
		_fragments.clear();
		resetInfo();
	}

	/**
	 * Overridden to ensure that the CompositeBox is valid.
	 * 
	 * @see FlowBox#getBounds()
	 */
	// public Rectangle getBounds() {
	// validate();
	// return this;
	// }
	/**
	 * @return the List of fragments
	 */
	public List getFragments() {
		return _fragments;
	}

	/**
	 * Returns the recommended width for this CompositeBox.
	 * 
	 * @return the recommended width
	 */
	public int getRecommendedWidth() {
		return _recommendedWidth;
	}

	/**
	 * Returns the recommended height for this compositebox.
	 * 
	 * @return
	 */
	public int getRecommendedHeight() {
		return _recommendedHeight;
	}

	// public int getInnerTop() {
	// validate();
	// return y;
	// }

	/**
	 * resets fields before unioning the data from the fragments.
	 */
	protected void resetInfo() {
		_width = _height = 0;
	}

	/**
	 * Sets the recommended width for this CompositeBox.
	 * 
	 * @param w
	 *            the width
	 */
	public void setRecommendedWidth(int w) {
		_recommendedWidth = w;
	}

	public void setRecommendedHeight(int h) {
		_recommendedHeight = h;
	}

	/**
	 * unions the fragment's width, height, and ascent into this composite.
	 * 
	 * @param box
	 *            the fragment
	 */
	protected void unionInfo(FlowBox box) {
		int right = Math.max(_x + _width, box._x + box._width);
		int bottom = Math.max(_y + _height, box._y + box._height);
		_x = Math.min(_x, box._x);
		_y = Math.min(_y, box._y);
		_width = right - _x;
		_height = bottom - _y;
	}

	public int getContentWidth() {
		return getWidth() - getBorderPaddingWidth();
	}

	public int getContentHeight() {
		return getHeight() - getBorderPaddingHeight();
	}

	public int getRecommendedContentWidth() {
		return Math.max(0, getRecommendedWidth() - getBorderPaddingWidth());
	}
	//
	// public int getRecommendedContentHeight()
	// {
	// return Math.max(0, getRecommendedHeight() - getBorderPaddingHeight());
	// }
}
