blob: 72172c846876ebeb20f328b8421900c73fe45d51 [file] [log] [blame]
/*******************************************************************************
* 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;
}
}