/*******************************************************************************
 * 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 org.eclipse.draw2d.geometry.Rectangle;

/**
 * A CompositeBox suitable for containing multiple LineBox fragments. Based on
 * BlockBox of draw2d.
 * 
 * @author mengbo
 */
public class BlockBox extends CompositeBox {
	// internalContent dimension is for the closure of the FlowBox(es) added
	// into the BlockBox.
	private int _internalContentWidth = -1;

	private int _internalContentHeight = -1;

	Rectangle toRectangle() {
		return new Rectangle(_x, _y, Math.max(_width, _recommendedWidth),
				_height);
	}

	/**
	 * Sets the height.
	 * 
	 * @param h
	 *            The height
	 */
	public void setHeight(int h) {
		_height = h;
	}

	/**
	 * Unions the dimensions of this with the dimensions of the passed FlowBox.
	 * For BlockBox, each time unionInfo is called, the passed in object
	 * represents a line.
	 * 
	 * @param box
	 *            The FlowBox to union this with
	 */
	protected void unionInfo(FlowBox box) {
		_width = Math.max(_width, box._width + this.getBorderPaddingWidth());
		_height = Math.max(_height, box._y + box._height
				+ this.getBorderPaddingHeight());

		_internalContentWidth = Math.max(_internalContentWidth, box._width);
		_internalContentHeight = Math.max(_internalContentHeight, box._y
				+ box._height);
	}

	public int getInternalContentWidth() {
		return _internalContentWidth;
	}

	public int getInternalContentHeight() {
		return _internalContentHeight;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowBox#getAscent()
	 */
	public int getAscent() {
		// XXX: some hard coded things here. If the blockbox is only for a
		// single widget, and if that widget support ascent, then we'll
		// delegate to that widget for ascent support.
		// if (_fragments.size()==1)
		// {
		// FlowBox box = (FlowBox) _fragments.get(0);
		// if (box instanceof LineBox)
		// {
		// List linecomponents = ((LineBox) box).getFragments();
		// if (linecomponents != null && linecomponents.size() == 1)
		// {
		// FlowBox box2 = (FlowBox) linecomponents.get(0);
		// if (box2 instanceof WidgetBox)
		// {
		// WidgetBox widgetBox = (WidgetBox) box2;
		// if (widgetBox.supportAscent())
		// {
		// return widgetBox.getAscent() + this.getBorderPaddingInsets().top;
		// }
		// }
		// }
		// }
		// }
		return super.getAscent();
	}
}
