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

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

import org.eclipse.draw2d.IFigure;
import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
import org.eclipse.jst.pagedesigner.css2.layout.CSSFigure;
import org.eclipse.jst.pagedesigner.css2.layout.ICSSFigure;
import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
import org.eclipse.jst.pagedesigner.css2.value.Length;

/**
 * @author mengbo
 * @version 1.5
 */
public class TableRowInfo extends TableItemInfo {
	List _cells = new ArrayList();

	int _rowIndex;

	private int _rowHeight;

	/**
	 * @param figure
	 */
	public TableRowInfo(ICSSFigure figure) {
		super(figure);
	}

	public List getCells() {
		return _cells;
	}

	public int getRowIndex() {
		return _rowIndex;
	}

	public int getSpecifiedRowHeight() {
		return _rowHeight;
	}

	/**
	 * @param context
	 */
	public void calculateRow(TableInfoContext context) {
		this._rowIndex = context.getCurrentRow();

		List children = getFigure().getChildren();
		for (int i = 0, size = children.size(); i < size; i++) {
			IFigure childfigure = (IFigure) children.get(i);
			if (childfigure instanceof ICSSFigure) {
				ICSSStyle childstyle = ((ICSSFigure) childfigure).getCSSStyle();
				if (childstyle != null) {
					String display = childstyle.getDisplay();
					if ("table-cell".equalsIgnoreCase(display)) {
						TableCellInfo cellInfo = new TableCellInfo(
								(ICSSFigure) childfigure);
						cellInfo.calculateCellInfo(context);
						_cells.add(cellInfo);
					} else {
						// skip
					}
				}
			} else {
				// skip
			}
		}
		// ok, we have finished a row
		context.finishRow();
	}

	/**
	 * @param _cells2
	 */
	public void getCells(List cells) {
		cells.addAll(this._cells);
	}

	/**
	 * @param figure
	 * @return
	 */
	public TableCellInfo getCellInfo(CSSFigure figure) {
		for (int i = 0, size = _cells.size(); i < size; i++) {
			TableCellInfo cellinfo = (TableCellInfo) _cells.get(i);
			if (cellinfo.getFigure() == figure) {
				return cellinfo;
			}
		}
		return null;
	}

	/**
	 * @param info
	 * @param height
	 */
	public void calculateHeight(TableInfo info, int tableHeight) {
		ICSSStyle style = this.getFigure().getCSSStyle();
		if (style == null) {
			this._rowHeight = -1;
		} else {
			Object height = style.getStyleProperty(ICSSPropertyID.ATTR_HEIGHT);
			Length recommendedHeight = (height instanceof Length) ? (Length) height
					: null;

			int rh = 0;
			if (recommendedHeight == null || recommendedHeight.getValue() <= 0) {
				rh = 0;
			} else {
				if (recommendedHeight.isPercentage()) {
					// not supported.
				} else {
					rh = recommendedHeight.getValue();
				}
				if (rh > 0 && !style.isSizeIncludeBorderPadding()) {
					rh += style.getBorderInsets().getHeight()
							+ style.getPaddingInsets().getHeight();
				}
			}
			this._rowHeight = rh;
		}

	}
}
