blob: 06e135c6e7b5aa02cbf100439692e12b15cb70b0 [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 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;
/**
* @author mengbo
* @version 1.5
*/
/*package*/ class TableInfo extends TableItemInfo {
private List _tableHeaderGroups = new ArrayList();
private List _tableTRandTRGs = new ArrayList();
private List _tableFooterGroups = new ArrayList();
private TableCaptionInfo _caption;
private int _columnCount;
private int _rowCount;
private List _cells = null;
private List _rows = null;
private int _tableWidth; // calculated table width, valid after calling to
// calculateTableWidth
private int _tableHeight;
private int[] _widthPercentage;
private int[] _heightPercentage;
private boolean[] _widthSpecified;
/**
* @param figure
*/
public TableInfo(ICSSFigure figure) {
super(figure);
}
/**
* @return the column count
*/
public int getColumnCount() {
return _columnCount;
}
/**
* @return the row count
*/
public int getRowCount() {
return _rowCount;
}
final TableCaptionInfo getCaption() {
return _caption;
}
/**
* @return width specified
*/
final boolean[] getWidthSpecified() {
return _widthSpecified;
}
void constructTable() {
List child = getFigure().getChildren();
for (int i = 0, size = child.size(); i < size; i++) {
IFigure childfigure = (IFigure) child.get(i);
if (childfigure instanceof ICSSFigure) {
ICSSStyle style = ((ICSSFigure) childfigure).getCSSStyle();
if (style != null) {
String display = style.getDisplay();
if ("table-caption".equalsIgnoreCase(display)) //$NON-NLS-1$
{
_caption = new TableCaptionInfo(
(ICSSFigure) childfigure);
} else if ("table-row".equalsIgnoreCase(display)) //$NON-NLS-1$
{
TableRowInfo rowInfo = new TableRowInfo(
(ICSSFigure) childfigure);
_tableTRandTRGs.add(rowInfo);
} else if ("table-row-group".equalsIgnoreCase(display)) //$NON-NLS-1$
{
TableRowGroupInfo groupInfo = new TableRowGroupInfo(
(ICSSFigure) childfigure);
_tableTRandTRGs.add(groupInfo);
} else if ("table-header-group".equalsIgnoreCase(display)) //$NON-NLS-1$
{
TableRowGroupInfo groupInfo = new TableRowGroupInfo(
(ICSSFigure) childfigure);
_tableHeaderGroups.add(groupInfo);
} else if ("table-footer-group".equalsIgnoreCase(display)) //$NON-NLS-1$
{
TableRowGroupInfo groupInfo = new TableRowGroupInfo(
(ICSSFigure) childfigure);
_tableFooterGroups.add(groupInfo);
} else {
// something unexpected inside table
}
} else {
// something unexpected inside table
}
} else {
// something unexpected inside table
}
}
TableInfoContext context = new TableInfoContext();
// now we have the rows ordered, need to calculate row details now.
for (int i = 0, size = _tableHeaderGroups.size(); i < size; i++) {
TableRowGroupInfo groupInfo = (TableRowGroupInfo) _tableHeaderGroups
.get(i);
groupInfo.calculateRowGroup(context);
}
for (int i = 0, size = _tableTRandTRGs.size(); i < size; i++) {
Object obj = _tableTRandTRGs.get(i);
if (obj instanceof TableRowGroupInfo) {
TableRowGroupInfo groupInfo = (TableRowGroupInfo) obj;
groupInfo.calculateRowGroup(context);
} else {
TableRowInfo rowInfo = (TableRowInfo) obj;
rowInfo.calculateRow(context);
}
}
for (int i = 0, size = _tableFooterGroups.size(); i < size; i++) {
TableRowGroupInfo groupInfo = (TableRowGroupInfo) _tableFooterGroups
.get(i);
groupInfo.calculateRowGroup(context);
}
context.finishTable();
_columnCount = context.getColumnCount();
_rowCount = context.getRowCount();
this._widthPercentage = new int[_columnCount];
this._heightPercentage = new int[_rowCount];
this._widthSpecified = new boolean[_columnCount];
for (int i = 0; i < _columnCount; i++) {
this._widthSpecified[i] = false;
}
}
/**
* @param columnIndex
* @param percentageValue
*/
void setWidthPercentage(int columnIndex, int percentageValue) {
if (percentageValue > this._widthPercentage[columnIndex]) {
this._widthPercentage[columnIndex] = percentageValue;
}
}
void setHeightPercentage(int rowIndex, int percentageValue) {
if (percentageValue > this._heightPercentage[rowIndex]) {
this._heightPercentage[rowIndex] = percentageValue;
}
}
/**
* width percentage will be used to calculate remaining width distribution.
*
* @return the width percentages
*/
public int[] getWidthPercentages() {
return this._widthPercentage;
}
int[] getHeightPercentages() {
return this._heightPercentage;
}
List getRows() {
if (_rows == null) {
this._rows = new ArrayList();
for (int i = 0, size = _tableHeaderGroups.size(); i < size; i++) {
TableRowGroupInfo groupInfo = (TableRowGroupInfo) _tableHeaderGroups
.get(i);
_rows.addAll(groupInfo.getRowList());
}
for (int i = 0, size = _tableTRandTRGs.size(); i < size; i++) {
Object obj = _tableTRandTRGs.get(i);
if (obj instanceof TableRowGroupInfo) {
TableRowGroupInfo groupInfo = (TableRowGroupInfo) obj;
_rows.addAll(groupInfo.getRowList());
} else {
TableRowInfo rowInfo = (TableRowInfo) obj;
_rows.add(rowInfo);
}
}
for (int i = 0, size = _tableFooterGroups.size(); i < size; i++) {
TableRowGroupInfo groupInfo = (TableRowGroupInfo) _tableFooterGroups
.get(i);
_rows.addAll(groupInfo.getRowList());
}
}
return _rows;
}
List getCells() {
if (_cells == null) {
_cells = new ArrayList();
for (int i = 0, size = _tableHeaderGroups.size(); i < size; i++) {
TableRowGroupInfo groupInfo = (TableRowGroupInfo) _tableHeaderGroups
.get(i);
groupInfo.getCells(_cells);
}
for (int i = 0, size = _tableTRandTRGs.size(); i < size; i++) {
Object obj = _tableTRandTRGs.get(i);
if (obj instanceof TableRowGroupInfo) {
TableRowGroupInfo groupInfo = (TableRowGroupInfo) obj;
groupInfo.getCells(_cells);
} else {
TableRowInfo rowInfo = (TableRowInfo) obj;
rowInfo.getCells(_cells);
}
}
for (int i = 0, size = _tableFooterGroups.size(); i < size; i++) {
TableRowGroupInfo groupInfo = (TableRowGroupInfo) _tableFooterGroups
.get(i);
groupInfo.getCells(_cells);
}
}
return _cells;
}
/**
* @param contentWidth
* if the width specification is percentage, then will use
* container width.
* @param availableWidth
*/
public void calculateWidth(int contentWidth, int availableWidth) {
_tableWidth = contentWidth;
//_availableWidth = availableWidth;
// next calculate cell width
List cells = getCells();
for (int i = 0, size = cells.size(); i < size; i++) {
TableCellInfo cellinfo = (TableCellInfo) cells.get(i);
cellinfo.calculateWidth(this, _tableWidth);
}
}
void calculateHeight(int contentHeight) {
_tableHeight = contentHeight;
List rows = getRows();
for (int i = 0, size = rows.size(); i < size; i++) {
TableRowInfo rowinfo = (TableRowInfo) rows.get(i);
rowinfo.calculateHeight(this, _tableHeight);
}
// next calculate cell width
List cells = getCells();
for (int i = 0, size = cells.size(); i < size; i++) {
TableCellInfo cellinfo = (TableCellInfo) cells.get(i);
cellinfo.calculateHeight(this, _tableHeight);
}
}
/**
* @return table width
*/
public int getTableWidth() {
return _tableWidth;
}
/**
* @param figure
* @return find the group info
*/
public TableRowGroupInfo findGroupInfo(CSSFigure figure) {
for (int i = 0, size = _tableHeaderGroups.size(); i < size; i++) {
TableRowGroupInfo groupInfo = (TableRowGroupInfo) _tableHeaderGroups
.get(i);
if (figure == groupInfo.getFigure()) {
return groupInfo;
}
}
for (int i = 0, size = _tableTRandTRGs.size(); i < size; i++) {
Object obj = _tableTRandTRGs.get(i);
if (obj instanceof TableRowGroupInfo) {
TableRowGroupInfo groupInfo = (TableRowGroupInfo) obj;
if (figure == groupInfo.getFigure()) {
return groupInfo;
}
}
}
for (int i = 0, size = _tableFooterGroups.size(); i < size; i++) {
TableRowGroupInfo groupInfo = (TableRowGroupInfo) _tableFooterGroups
.get(i);
if (figure == groupInfo.getFigure()) {
return groupInfo;
}
}
return null; // should not happen.
}
/**
* @param figure
* @return the row info
*/
public TableRowInfo findRowInfo(CSSFigure figure) {
for (int i = 0, size = _tableHeaderGroups.size(); i < size; i++) {
TableRowGroupInfo groupInfo = (TableRowGroupInfo) _tableHeaderGroups
.get(i);
TableRowInfo rowinfo = groupInfo.findRowInfo(figure);
if (rowinfo != null) {
return rowinfo;
}
}
for (int i = 0, size = _tableTRandTRGs.size(); i < size; i++) {
Object obj = _tableTRandTRGs.get(i);
if (obj instanceof TableRowGroupInfo) {
TableRowGroupInfo groupInfo = (TableRowGroupInfo) obj;
TableRowInfo rowinfo = groupInfo.findRowInfo(figure);
if (rowinfo != null) {
return rowinfo;
}
} else if (obj instanceof TableRowInfo) {
TableRowInfo info = (TableRowInfo) obj;
if (figure == info.getFigure()) {
return info;
}
}
}
for (int i = 0, size = _tableFooterGroups.size(); i < size; i++) {
TableRowGroupInfo groupInfo = (TableRowGroupInfo) _tableFooterGroups
.get(i);
TableRowInfo rowinfo = groupInfo.findRowInfo(figure);
if (rowinfo != null) {
return rowinfo;
}
}
return null; // should not happen.
}
/**
*
* @return the width percentage
*/
public boolean hasWidthPercentage() {
for (int i = 0; i < this._widthPercentage.length; i++) {
if (this._widthPercentage[i] > 0) {
return true;
}
}
return false;
}
}