package org.eclipse.iee.editor.core.pad;
import java.awt.Rectangle;
import java.util.HashSet;
import java.util.Set;
import org.eclipse.core.runtime.Assert;
import org.eclipse.draw2d.FigureListener;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.LayoutListener;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.iee.core.document.PadDocumentPart;
import org.eclipse.iee.editor.core.container.Container;
import org.eclipse.swt.widgets.Display;
public abstract class FigurePad<T extends PadDocumentPart, F extends IFigure> extends Pad<T, F> {
private IFigure fContent;
private Set<IFigure> fPosponedFigures = new HashSet<>();
private Runnable fPostponedTask;
@Override
public void attachContainer(Container container) {
Assert.isNotNull(container);
Assert.isLegal(!isContainerAttached(), "Another container is already attached");
fContainer = container;
fContent = getFigure();
container.getContainerManager().getEditorManager().addEditor(this);
container.getMainFigure().add(fContent, new org.eclipse.draw2d.geometry.Rectangle(0, 0, -1, -1));
fContent.addFigureListener(new FigureListener() {
@Override
public void figureMoved(IFigure source) {
if (source != fContent) {
return;
}
Rectangle bounds = getBounds();
updateSelectionBounds(bounds);
// fContainer.updatePresentation();
}
});
fContent.addLayoutListener(new LayoutListener.Stub() {
@Override
public void invalidate(IFigure container) {
//postpone processing because FlowFigure initialized to get preferred size only after "add" method finished
fPosponedFigures.add(container);
if (fPostponedTask == null) {
fPostponedTask = new Runnable() {
@Override
public void run() {
fPostponedTask = null;
Set<IFigure> figures = new HashSet<>(fPosponedFigures);
fPosponedFigures = new HashSet<>();
for (IFigure iFigure : figures) {
Dimension preferredSize = iFigure.getPreferredSize(-1, -1);
Rectangle bounds = getBounds();
bounds.height = preferredSize.height;
bounds.width = preferredSize.width;
setBounds(bounds);
}
}
};
Display.getDefault().asyncExec(fPostponedTask);
}
}
});
}
@Override
public Rectangle getBounds() {
org.eclipse.draw2d.geometry.Rectangle bounds = fContent.getBounds();
return new Rectangle(bounds.x, bounds.y, bounds.width, bounds.height);
}
@Override
public void setBounds(Rectangle newBounds) {
org.eclipse.draw2d.geometry.Rectangle bounds = new org.eclipse.draw2d.geometry.Rectangle(newBounds.x, newBounds.y, newBounds.width, newBounds.height);
fContent.getParent().setConstraint(fContent, bounds);
updateSelectionBounds(newBounds);
}
@Override
public void setVisible(boolean isVisible) {
fContent.setVisible(isVisible);
}
@Override
public void dispose() {
fContainer.getContainerManager().getEditorManager().removeEditor(this);
fContainer.getMainFigure().remove(fContent);
}
}