/*******************************************************************************
 * 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 org.eclipse.draw2d.LayoutManager;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
import org.eclipse.jst.pagedesigner.css2.layout.ICSSFigure;
import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
import org.eclipse.jst.pagedesigner.css2.value.Length;
import org.eclipse.jst.pagedesigner.utils.IntFlexArray;

/**
 * @author mengbo
 * @version 1.5
 */
public class TableCellInfo extends TableItemInfo {
	int _rowSpan = 1;

	int _colSpan = 1;

	int _colIndex;

	int _rowIndex;

	int _cellWidth = 0;

	int _cellHeight = 0;

	/**
	 * @param childfigure
	 */
	public TableCellInfo(ICSSFigure childfigure) {
		super(childfigure);
	}

	/**
	 * @return
	 */
	public int getColSpan() {
		return _colSpan;
	}

	/**
	 * @return
	 */
	public int getRowSpan() {
		return _rowSpan;
	}

	/**
	 * @return
	 */
	public int getRowIndex() {
		return _rowIndex;
	}

	/**
	 * @return
	 */
	public int getColumnIndex() {
		return _colIndex;
	}

	/**
	 * @return
	 */
	public Dimension getMinCWDimension() {
		return getFigure().getPreferredSize(_cellWidth, _cellHeight);
	}

	/**
	 * @return
	 */
	public Dimension getMaxCWDimension() {
		ICSSFigure figure = getFigure();
		LayoutManager layout = figure.getLayoutManager();
		if (layout instanceof CSSTableCellLayout) {
			Dimension d = ((CSSTableCellLayout) layout).getMaxContentWidthSize(
					figure, _cellWidth, _cellHeight);
			return d;
		}

        // should not happen
        return getMinCWDimension();
	}

	/**
	 * @param context
	 */
	public void calculateCellInfo(TableInfoContext context) {
		ICSSStyle style = this.getStyle();
		_rowSpan = style.getRowSpan();
		_colSpan = style.getColSpan();

		// FIXME: we don't support rowspan and colspan to be 0.
		// by spec, 0 means span from current col/row to end.
		if (_rowSpan <= 0) {
			_rowSpan = 1;
		}
		if (_colSpan <= 0) {
			_colSpan = 1;
		}

		_rowIndex = context.getCurrentRow();

		IntFlexArray array = context.getIntFlexArray();
		int currentCol = context.getCurrentCol();

		// find a cell that is not occupied by cells in previous rows.
		while (array.getAt(currentCol) > 0) {
			currentCol++;
		}

		// ok, now array.getAt(currentCol) == 0
		_colIndex = currentCol;

		for (int i = 0; i < _colSpan; i++, currentCol++) {
			array.setAt(currentCol, _rowSpan);
		}
		context.setCurrentCol(currentCol);
	}

	/**
	 * @param tablewidth
	 *            table width
	 */
	public void calculateWidth(TableInfo tableInfo, int tablewidth) {
		ICSSStyle style = this.getFigure().getCSSStyle();
		if (style == null) {
			_cellWidth = -1;
		} else {
			Object width = style.getStyleProperty(ICSSPropertyID.ATTR_WIDTH);
			Length recommendedWidth = (width instanceof Length) ? (Length) width
					: null;

			int rw = 0;
			if (recommendedWidth == null || recommendedWidth.getValue() <= 0) {
				rw = 0;
			} else {
				if (recommendedWidth.isPercentage()) {
					// percentage width is used for remaining width
					// distribution, so not used here.
					int colspan = this.getColSpan();
					for (int i = 0; i < colspan; i++) {
						tableInfo.setWidthPercentage(this.getColumnIndex() + i,
								recommendedWidth.getValue() / colspan);
					}
				} else {
					rw = recommendedWidth.getValue();
					if (!style.isSizeIncludeBorderPadding()) {
						rw += style.getBorderInsets().getWidth()
								+ style.getPaddingInsets().getWidth();
					}
					if (this.getColSpan() == 1) {
						tableInfo._widthSpecified[this.getColumnIndex()] = true;
					}
				}

			}
			_cellWidth = rw;
		}

	}

	/**
	 * @param height
	 */
	public void calculateHeight(TableInfo tableInfo, int tableheight) {
		ICSSStyle style = this.getFigure().getCSSStyle();
		if (style == null) {
			_cellHeight = -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()) {
					int rowspan = this.getRowSpan();
					for (int i = 0; i < rowspan; i++) {
						tableInfo.setHeightPercentage(this.getRowIndex() + i,
								recommendedHeight.getValue() / rowspan);
					}
				} else {
					rh = recommendedHeight.getValue();
				}
				if (!style.isSizeIncludeBorderPadding()) {
					rh += style.getBorderInsets().getHeight()
							+ style.getPaddingInsets().getHeight();
				}
			}
			_cellHeight = rh;
		}

	}

	/**
	 * @return
	 */
	public int getHeight() {
		return _cellHeight;
	}
}
