/******************************************************************************* * 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; import org.eclipse.draw2d.Graphics; import org.eclipse.draw2d.geometry.Dimension; import org.eclipse.draw2d.geometry.Rectangle; import org.eclipse.jst.pagedesigner.css2.provider.DimensionInfo; import org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider; /** * @author mengbo */ public class CSSWidgetLayout extends CSSBlockFlowLayout implements ICSSPainter { private WidgetBox _widgetBox; private ICSSWidgetProvider _provider; /** * @param flowfigure * @param provider */ public CSSWidgetLayout(CSSFigure flowfigure, ICSSWidgetProvider provider) { super(flowfigure); _provider = provider; } /** * normally this method is called directly after constructor * * @param provider */ public void setProvider(ICSSWidgetProvider provider) { _provider = provider; } /** * @return the provider */ public ICSSWidgetProvider getProvider() { // return ((CSSWidgetFigure)this.getFlowFigure()).getProvider(); return _provider; } /* * (non-Javadoc) * * @see org.eclipse.jst.pagedesigner.css2.layout.CSSBlockFlowLayout#isInlineBlock() */ public boolean isInlineBlock() { ICSSWidgetProvider provider = getProvider(); return provider.isInline(); } /* * (non-Javadoc) * * @see org.eclipse.jst.pagedesigner.css2.layout.FlowFigureLayout#layout() */ protected void layoutChildren() { ICSSWidgetProvider provider = getProvider(); // if we did endLine, then will result in context create a new line, so // we may in the new line now. // passing in the top margin, and context will consider that when // creating the new line. int suggestedWith = _blockBox.getContentWidth(); int suggestedHeight = _blockBox.getContentHeight(); // int suggestedWith = getSuggestedWidth(line, style, provider); // int suggestedHeight = getSuggestedHeight(line, style, provider); DimensionInfo resultInfo = provider.getPreferredDimension( suggestedWith, suggestedHeight); Dimension resultSize = resultInfo.getDimension(); _widgetBox = new WidgetBox(); // ((CSSWidgetFigure)getFlowFigure()).getWidgetBox(); // if (provider.isHandlingBorder() || style == null) // { _widgetBox.setWidth(resultSize.width); _widgetBox.setHeight(resultSize.height); _widgetBox.setAscent(resultInfo.getAscent()); // } // else // { // widgetBox.setWidth(resultSize.width + // style.getBorderInsets().getWidth()); // widgetBox.setHeight(resultSize.height + // style.getBorderInsets().getHeight()); // widgetBox.setAscent(resultInfo.getAscent()+style.getBorderInsets().top); // } this.addToCurrentLine(_widgetBox); // if (!provider.isInline()) // { // context.endLine(); // } } /* * (non-Javadoc) * * @see org.eclipse.jst.pagedesigner.css2.layout.FlowFigureLayout#dispose() */ public void dispose() { // TODO: anything to dispose? } // public int getSuggestedWidth(LineBox line, ICSSStyle style, // ICSSWidgetProvider provider) // { // if (style == null) return -1; // // Object width = style.getStyleProperty(ICSSPropertyID.ATTR_WIDTH); // Length recommendedWidth = (width instanceof Length) ? (Length) width : // null; // // int rw = 0; // if (recommendedWidth == null || recommendedWidth.getValue() <= 0) // { // return -1; // } // else // { // if (recommendedWidth.isPercentage()) // { // rw = line.getAvailableWidth() * recommendedWidth.getValue() / 100; // } // else // { // rw = recommendedWidth.getValue(); // } // // if (!style.isSizeIncludeBorderPadding() && provider.isHandlingBorder()) // { // rw += style.getBorderInsets().getWidth() + // style.getPaddingInsets().getWidth(); // } // else if (style.isSizeIncludeBorderPadding() && // !provider.isHandlingBorder()) // { // rw -= style.getBorderInsets().getWidth() + // style.getPaddingInsets().getWidth(); // } // } // // return rw; // } // // public int getSuggestedHeight(LineBox line, ICSSStyle style, // ICSSWidgetProvider provider) // { // if (style == null) return -1; // // Object height = style.getStyleProperty(ICSSPropertyID.ATTR_HEIGHT); // Length recommendedHeight = (height instanceof Length) ? (Length) height : // null; // // int rh = 0; // if (recommendedHeight == null || recommendedHeight.getValue() <= 0) // { // return -1; // } // else // { // if (recommendedHeight.isPercentage()) // { // // we don't support percentage height for this version, ignore // return -1; // } // else // { // rh = recommendedHeight.getValue(); // } // // if (!style.isSizeIncludeBorderPadding() && provider.isHandlingBorder()) // { // rh += style.getBorderInsets().getHeight() + // style.getPaddingInsets().getHeight(); // } // else if (style.isSizeIncludeBorderPadding() && // !provider.isHandlingBorder()) // { // rh -= style.getBorderInsets().getHeight() + // style.getPaddingInsets().getHeight(); // } // } // // return rh; // } /* * (non-Javadoc) * * @see org.eclipse.jst.pagedesigner.css2.layout.ICSSPainter#paintFigure(org.eclipse.draw2d.Graphics) */ public void paintFigure(Graphics g) { ICSSWidgetProvider provider = this.getProvider(); if (provider != null && _widgetBox != null) { provider.paintFigure(g, new Rectangle(_widgetBox._x, _widgetBox._y, _widgetBox.getWidth(), _widgetBox.getHeight())); } } /* * (non-Javadoc) * * @see org.eclipse.jst.pagedesigner.css2.layout.CSSLayout#handlingBorderForBlock() */ public boolean handlingBorderForBlock() { ICSSWidgetProvider provider = this.getProvider(); if (provider != null) { return provider.isHandlingBorder(); } return super.handlingBorderForBlock(); } }