| /******************************************************************************* |
| * 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.List; |
| |
| import org.eclipse.draw2d.IFigure; |
| import org.eclipse.draw2d.LayoutManager; |
| import org.eclipse.draw2d.geometry.Rectangle; |
| import org.eclipse.jst.pagedesigner.css2.ICSSStyle; |
| import org.eclipse.jst.pagedesigner.css2.layout.CSSFigure; |
| import org.eclipse.jst.pagedesigner.css2.layout.FlowBox; |
| import org.eclipse.jst.pagedesigner.css2.layout.LineBox; |
| import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID; |
| import org.eclipse.jst.pagedesigner.css2.property.VerticalAlignMeta; |
| |
| /** |
| * This layout is for those thigns that it's parent will decide its size. Such |
| * as table cell. |
| * |
| * @author mengbo |
| * @version 1.5 |
| */ |
| public class CSSTableCellLayout extends CachedTableCellLayout { |
| private CSSTableLayout2 _tableLayout; |
| |
| private TableRowInfo _rowinfo; |
| |
| private TableCellInfo _cellinfo; |
| |
| /** |
| * @param cssfigure |
| */ |
| public CSSTableCellLayout(CSSFigure cssfigure) { |
| super(cssfigure); |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.jst.pagedesigner.css2.layout.FlowFigureLayout#invalidate() |
| */ |
| public void invalidate() { |
| super.invalidate(); |
| |
| _tableLayout = null; |
| _rowinfo = null; |
| _cellinfo = null; |
| } |
| |
| protected void endBlock() { |
| if (isTable()) { |
| verticalLayoutLines(); |
| layoutLines(); |
| } else { |
| super.endBlock(); |
| } |
| } |
| |
| /** |
| * process the vertical layout lines |
| */ |
| protected void verticalLayoutLines() { |
| List lines = _blockBox.getFragments(); |
| |
| String verticalStyle = getVerticalAlign(); |
| int linesHeight = 0; |
| |
| if (lines != null && !lines.isEmpty()) { |
| FlowBox bottomBox = ((FlowBox) lines.get(lines.size() - 1)); |
| FlowBox topBox = ((FlowBox) lines.get(0)); |
| linesHeight = bottomBox.getY() + bottomBox.getHeight() - topBox.getY(); |
| } |
| int movement = 0; |
| if (VerticalAlignMeta.BOTTOM.equals(verticalStyle)) { |
| movement = _blockBox.getHeight() - linesHeight |
| - _blockBox.getBorderPaddingHeight() / 2; |
| } else if (VerticalAlignMeta.TOP.equals(verticalStyle)) { |
| movement = 0; |
| } |
| // else if (VerticalAlignMeta.BASELINE.equals(verticalStyle)) |
| // { |
| // movement = _blockBox.getHeight() - linesHeight; |
| // } |
| else // if (VerticalAlignMeta.MIDDLE.equals(verticalStyle)) |
| { |
| movement = (_blockBox.getHeight() - linesHeight - _blockBox |
| .getBorderPaddingHeight()) / 2; |
| } |
| // VerticalAlignMeta.TOP, ICSSPropertyID.VAL_AUTO and others |
| // else |
| // { |
| // movement = 0; |
| // } |
| if (lines != null) { |
| for (int i = 0, n = lines.size(); i < n; i++) { |
| if (lines.get(i) instanceof LineBox) { |
| LineBox lineBox = (LineBox) lines.get(i); |
| int LineMovement = Math.max(lineBox.getMarginInsets() |
| .getHeight(), movement); |
| lineBox.setY(lineBox.getY() + LineMovement |
| - lineBox.getMarginInsets().getHeight()); |
| } |
| } |
| } |
| } |
| |
| private String getVerticalAlign() { |
| ICSSStyle style = getCSSStyle(); |
| if (style != null) { |
| return style.getStyleProperty(ICSSPropertyID.ATTR_VERTICAL_ALIGN) |
| .toString(); |
| } |
| return VerticalAlignMeta.MIDDLE; |
| } |
| |
| public Rectangle getCellRect() { |
| int columnIndex = _cellinfo.getColumnIndex(); |
| int rowIndex = _cellinfo.getRowIndex(); |
| int[] columnWidths = _tableLayout.getColumnWidths(); |
| int hspacing = _tableLayout.getHSpacing(); |
| int x = hspacing; |
| for (int col = 0; col < columnIndex; col++) { |
| x += columnWidths[col]; |
| x += hspacing; |
| } |
| |
| int[] rowHeights = _tableLayout.getRowHeights(); |
| int vspacing = _tableLayout.getVSpacing(); |
| int y = vspacing; |
| for (int row = 0; row < rowIndex; row++) { |
| y += rowHeights[row]; |
| y += vspacing; |
| } |
| if (_tableLayout.getCaptionInfo() != null |
| && "top".equalsIgnoreCase(_tableLayout.getCaptionInfo().getAlign())) //$NON-NLS-1$ |
| { |
| y += _tableLayout.getCaptionSize().height; |
| } |
| |
| int width = _tableLayout.getCellWidth(_cellinfo, columnWidths); |
| int height = _tableLayout.getCellHeight(_cellinfo, rowHeights); |
| |
| Rectangle rect = new Rectangle(x, y, width, height); |
| return rect; |
| } |
| |
| /** |
| * the parent figure of TRGroup should be table figure. If so, return the |
| * corresponding table layout. |
| * |
| * @return the table layout context |
| */ |
| public CSSTableLayout2 getTableLayoutContext() { |
| IFigure parent = getCSSFigure().getParent(); |
| if (parent != null) { |
| LayoutManager parentLayout = parent.getLayoutManager(); |
| if (parentLayout instanceof CSSTRLayout) { |
| return ((CSSTRLayout) parentLayout).getTableLayoutContext(); |
| } |
| } |
| |
| return null; |
| } |
| |
| /** |
| * @return true if the table layout has cell info |
| */ |
| public boolean initializeTableInfo() { |
| _rowinfo = null; |
| _cellinfo = null; |
| _tableLayout = getTableLayoutContext(); |
| if (_tableLayout != null) { |
| _rowinfo = _tableLayout.getRowInfo((CSSFigure) this.getCSSFigure() |
| .getParent()); |
| if (_rowinfo != null) { |
| _cellinfo = _rowinfo.getCellInfo(this.getCSSFigure()); |
| if (_cellinfo != null) { |
| return true; |
| } |
| } |
| } |
| return false; |
| } |
| |
| /** |
| * @return the table layout or nul if none |
| */ |
| public CSSTableLayout2 getTableLayout() { |
| return _tableLayout; |
| } |
| |
| /** |
| * @return the table cell info or null |
| */ |
| public TableCellInfo getTableCellInfo() { |
| return _cellinfo; |
| } |
| } |