如何构建自定义draw2d layoutmanager?

时间:2010-07-12 15:43:33

标签: layout-manager draw2d

我想有一个布局管理器,可以按如下方式排列两个元素:

  • 一个主要元素ABCDEF居中

  • 一个“postscript”元素XYZ,位于封装图的右上角

例如:

***********XYZ*
*   ABCDEF    *
***************

我可以使用现有的布局管理器吗?如何构建支持它的自定义布局管理器?

非常感谢你的建议。

1 个答案:

答案 0 :(得分:0)

你可以使用XYLayout。

您可以构建一个示例:

import org.eclipse.draw2d.AbstractLayout;
import org.eclipse.draw2d.Figure;
import org.eclipse.draw2d.FigureCanvas;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.Label;
import org.eclipse.draw2d.LayoutManager;
import org.eclipse.draw2d.LineBorder;
import org.eclipse.draw2d.Panel;
import org.eclipse.draw2d.XYLayout;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.Insets;
import org.eclipse.draw2d.geometry.PrecisionRectangle;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;


public class HHH {

    public static void main(String[] args) {
        Display d = new Display();
        Shell s = new Shell();
        s.setLayout(new FillLayout());

        FigureCanvas canvas = new FigureCanvas(s);

        Figure content = new Figure();
        content.setLayoutManager(new XYLayout());

        PostScriptedFigure figure = new PostScriptedFigure();
        content.add(figure, new Rectangle(100, 100, -1, -1));

        figure.setMainFigure(new Label("The Main figure"));
        figure.setPostScriptFigure(new Label("ps"));
        figure.setBorder(new LineBorder());

        canvas.setContents(content);

        s.setSize(600, 500);
        s.open();

        while (!s.isDisposed()) {
            if (!d.readAndDispatch()) {
                d.sleep();
            }
        }
    }

}

class PostScriptedFigure extends Panel {

    private IFigure mainFigure, postScriptFigure;

    private class PostScriptedLayoutManager extends AbstractLayout {

    @Override
    public void layout(IFigure container) {
        final Rectangle clientArea = container.getClientArea();

        final IFigure mainFigure = getMainFigure();
        final IFigure postScriptFigure = getPostScriptFigure();

        if (mainFigure != null) {
            final Rectangle bounds = new PrecisionRectangle();
            bounds.setSize(mainFigure.getPreferredSize(SWT.DEFAULT, SWT.DEFAULT));

            final Rectangle mainClientArea = clientArea.getCopy();
            if (postScriptFigure != null) {
                mainClientArea.shrink(new Insets(postScriptFigure.getPreferredSize().height(), 0, 0, 0));
            }
            bounds.translate(mainClientArea.getCenter().getTranslated(bounds.getSize().getScaled(0.5f).getNegated()));
            mainFigure.setBounds(bounds);
        }
        if (postScriptFigure != null) {
            final Rectangle bounds = new PrecisionRectangle();
            bounds.setSize(postScriptFigure.getPreferredSize(SWT.DEFAULT, SWT.DEFAULT));
            bounds.translate(clientArea.getTopRight().getTranslated(bounds.getSize().getNegated().width(), 0));
            postScriptFigure.setBounds(bounds);
        }
        // note that other potentionally added figures are ignored
    }

    @Override
    protected Dimension calculatePreferredSize(IFigure container, int wHint, int hHint) {
        final Rectangle rect = new PrecisionRectangle();

        final IFigure mainFigure = getMainFigure();
        if (mainFigure != null) {
            rect.setSize(mainFigure.getPreferredSize());
        }
        final IFigure postScriptFigure = getPostScriptFigure();
        if (postScriptFigure != null) {
            rect.resize(mainFigure != null ? 0 : postScriptFigure.getPreferredSize().width() , postScriptFigure.getPreferredSize().height());
        }

        // note that other potentionally added figures are ignored

        final Dimension d = rect.getSize();
        final Insets insets = container.getInsets();
        return new Dimension(d.width + insets.getWidth(), d.height + insets.getHeight()).union(getBorderPreferredSize(container));
    }

}

public PostScriptedFigure() {
    super.setLayoutManager(new PostScriptedLayoutManager());
}

@Override
public void setLayoutManager(LayoutManager manager) {
    // prevent from setting wrong layout manager
}

public IFigure getMainFigure() {
    return mainFigure;
}

public void setMainFigure(IFigure mainFigure) {
    if (getMainFigure() != null) {
        remove(getMainFigure());
    }
    this.mainFigure = mainFigure;
    add(mainFigure);
}

public IFigure getPostScriptFigure() {
    return postScriptFigure;
}

public void setPostScriptFigure(IFigure postScriptFigure) {
    if (getPostScriptFigure() != null) {
        remove(getPostScriptFigure());
    }
    this.postScriptFigure = postScriptFigure;
    add(postScriptFigure);
}

}