blob: 8e7e2d587c2ad76c94acf683dc210ac7a0983578 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2010 IBM Corporation 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.draw2d.text;
import java.util.Iterator;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.Rectangle;
/**
* Adapts non-flow figures for use within a parent hierarchy requiring flow
* figures. Normal draw2d figures can be added as children. If a normal
* LayoutManager is set, the children will be positioned by that layout manager.
* The size of this figure within the flow will be determined by its preferred
* size.
* <p>
* WARNING: This class is not intended to be subclassed by clients.
*
* @author Pratik Shah
* @since 3.1
*/
public class FlowAdapter extends FlowFigure {
private FlowContext context;
private FigureBox box = new FigureBox();
/**
* This FlowFigure contributes an Object Replacement Character.
*
* @see FlowFigure#contributeBidi(BidiProcessor)
*/
protected void contributeBidi(BidiProcessor proc) {
box.setBidiLevel(-1);
// contributes a single object replacement char
proc.add(this, BidiChars.OBJ);
}
/**
* @return <code>null</code>
* @see org.eclipse.draw2d.text.FlowFigure#createDefaultFlowLayout()
*/
protected FlowFigureLayout createDefaultFlowLayout() {
return null;
}
/**
* Sizes the content box to be big enough to display all figures. Wraps to
* the next line if there is not enough room on the current one.
*
* @see org.eclipse.draw2d.Figure#layout()
*/
protected void layout() {
int wHint = context.getRemainingLineWidth();
if (wHint == Integer.MAX_VALUE)
wHint = -1;
Dimension prefSize = getPreferredSize(wHint, -1);
if (context.isCurrentLineOccupied()
&& prefSize.width > context.getRemainingLineWidth()) {
context.endLine();
prefSize = getPreferredSize(context.getRemainingLineWidth(), -1);
}
box.setSize(prefSize);
context.addToCurrentLine(box);
}
/**
* Updates the bounds of this figure to match that of its content box, and
* lays out this figure's children.
*
* @see FlowFigure#postValidate()
*/
public void postValidate() {
setBounds(new Rectangle(box.getX(), box.getBaseline() - box.ascent,
box.width, box.ascent));
super.layout();
for (Iterator itr = getChildren().iterator(); itr.hasNext();)
((IFigure) itr.next()).validate();
}
/**
* Sets the bidi level of the content box associated with this Figure
*
* @see FlowFigure#setBidiInfo(BidiInfo)
*/
public void setBidiInfo(BidiInfo info) {
box.setBidiLevel(info.levelInfo[0]);
}
/**
* @see org.eclipse.draw2d.IFigure#setBounds(org.eclipse.draw2d.geometry.Rectangle)
*/
public void setBounds(Rectangle rect) {
int x = bounds.x, y = bounds.y;
boolean resize = (rect.width != bounds.width)
|| (rect.height != bounds.height), translate = (rect.x != x)
|| (rect.y != y);
if ((resize || translate) && isVisible())
erase();
if (translate) {
int dx = rect.x - x;
int dy = rect.y - y;
primTranslate(dx, dy);
}
bounds.width = rect.width;
bounds.height = rect.height;
if (translate || resize) {
fireFigureMoved();
repaint();
}
}
/**
* @see FlowFigure#setFlowContext(FlowContext)
*/
public void setFlowContext(FlowContext flowContext) {
context = flowContext;
}
/**
* Do not validate children.
*
* @see org.eclipse.draw2d.IFigure#validate()
*/
public void validate() {
if (isValid())
return;
setValid(true);
layout();
}
private class FigureBox extends ContentBox {
private int ascent;
public boolean containsPoint(int x, int y) {
return FlowAdapter.this.containsPoint(x, y);
}
public int getAscent() {
return ascent;
}
public int getDescent() {
return 0;
}
public void setSize(Dimension size) {
ascent = size.height;
width = size.width;
}
}
}