开发者

How to build a custom draw2d layoutmanager?

I would like to have a layout manager that can arrange two elements as follows:

  • one main element ABCDEF centered

  • one "postscript" element XYZ, positioned on the top rig开发者_JS百科ht corner of the encapsulating figure

For example:

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

Can I use an existing layoutmanager for this? How do I build a custom layout manager that supports it?

Many thanks for your advice.


You can do that by using XYLayout.

There is a sample you can build on:

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);
}

}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜