package org.xmind.ui.internal.layouts; import java.util.List; import org.eclipse.draw2d.IFigure; import org.eclipse.draw2d.geometry.Dimension; import org.eclipse.draw2d.geometry.Point; import org.eclipse.draw2d.geometry.Rectangle; import org.xmind.gef.draw2d.IRotatableFigure; import org.xmind.gef.draw2d.ReferencedLayoutData; import org.xmind.ui.internal.mindmap.InfoItemContentPart; import org.xmind.ui.mindmap.IInfoItemPart; import org.xmind.ui.mindmap.IInfoPart; public class InformationLayout extends MindMapLayoutBase { private int spacing = 5; public InformationLayout(IInfoPart part) { super(part); } protected void fillLayoutData(IFigure container, ReferencedLayoutData data) { IInfoPart information = (IInfoPart) getPart(); List<IInfoItemPart> icons = information.getInfoItemIcons(); List<InfoItemContentPart> contents = information.getInfoItemContents(); if (!icons.isEmpty() && !contents.isEmpty()) { for (int i = 0; i < icons.size(); i++) { Point ref = data.getReference(); IInfoItemPart item = icons.get(i); IFigure itemFig = item.getFigure(); Dimension itemSize = getChildPreferredSize(itemFig); InfoItemContentPart content = contents.get(i); IFigure contentFig = content.getFigure(); Dimension contentSize = getChildPreferredSize(contentFig); Rectangle area = data.getClientArea(); Rectangle r; if (area == null) { r = createBounds(ref, itemSize); } else { int x = area.width < itemSize.width ? (area.x - (itemSize.width + area.width) / 2) : area.x; r = new Rectangle(x, area.bottom() + spacing + (contentSize.height - itemSize.height) / 4, itemSize.width, itemSize.height); } data.put(itemFig, r); area = data.getClientArea(); if (area == null) { r = createBounds(ref, contentSize); } else { r = new Rectangle(area.x + itemSize.width + spacing, area.bottom() - (contentSize.height + itemSize.height) / 2, contentSize.width, contentSize.height); } data.put(contentFig, r); } } } private Rectangle createBounds(Point ref, Dimension size) { return new Rectangle(ref.x - size.width / 2, ref.y, size.width, size.height); } private Dimension getChildPreferredSize(IFigure child) { if (child instanceof IRotatableFigure) { return ((IRotatableFigure) child).getNormalPreferredSize(-1, -1) .toDraw2DDimension(); } return child.getPreferredSize(); } }