/**
* Copyright (c) 2009 Borland Software Corp.
*
* 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:
* Alexander Shatalin (Borland) - initial API and implementation
*/
package org.eclipse.gmf.graphdef.editor.edit.policies.assistant;
import org.eclipse.draw2d.Figure;
import org.eclipse.draw2d.Graphics;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.ScaledGraphics;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.draw2d.geometry.Translatable;
import org.eclipse.gmf.runtime.notation.View;
public class PreviewFigure extends Figure {
private boolean myValid;
private IFigure myActualFigure;
private double myScale;
private int myHorizontalShift;
private int myVerticalShift;
public PreviewFigure(View view, HeadlessDiagramGraphicalViewer viewer) {
myActualFigure = viewer.addChild(view);
myValid = myActualFigure != null;
}
/**
* Figure is unusable in invalid state.
*
* TODO: looks like it is not necessary now.
*/
public boolean isPreviewValid() {
return myValid;
}
@Override
protected boolean useLocalCoordinates() {
return true;
}
@Override
public void invalidateTree() {
super.invalidateTree();
myActualFigure.invalidateTree();
}
@Override
public void validate() {
super.validate();
myActualFigure.validate();
}
@Override
public void setPreferredSize(Dimension size) {
Dimension figurePreferredSize = myActualFigure.getPreferredSize();
// Calculating preferred size using layout
if (figurePreferredSize.width == 0 || figurePreferredSize.height == 0) {
figurePreferredSize = myActualFigure.getLayoutManager().getPreferredSize(myActualFigure, -1, -1);
}
// Correcting preferred size to make figure visible
if (figurePreferredSize.width == 0 && figurePreferredSize.height == 0) {
figurePreferredSize.width = figurePreferredSize.height = 15;
} else if (figurePreferredSize.width == 0) {
figurePreferredSize.width = figurePreferredSize.height;
} else if (figurePreferredSize.height == 0) {
figurePreferredSize.height = figurePreferredSize.width;
}
myActualFigure.setSize(figurePreferredSize);
myActualFigure.setLocation(new Point(0, 0));
myScale = Math.min(size.width / (double) figurePreferredSize.width, size.height / (double) figurePreferredSize.height);
myHorizontalShift = (int) ((size.width - figurePreferredSize.width * myScale) / 2);
myVerticalShift = (int) ((size.height - figurePreferredSize.height * myScale) / 2);
super.setPreferredSize(size);
}
public void translateFromParent(Translatable t) {
super.translateFromParent(t);
t.performScale(1 / myScale);
}
public void translateToParent(Translatable t) {
t.performScale(myScale);
super.translateFromParent(t);
}
@Override
protected void paintClientArea(Graphics graphics) {
graphics.pushState();
boolean optimizeClip = getBorder() == null || getBorder().isOpaque();
graphics.translate(getBounds().x + getInsets().left + myHorizontalShift, getBounds().y + getInsets().top + myVerticalShift);
if (!optimizeClip) {
graphics.clipRect(getClientArea(Rectangle.SINGLETON));
}
if (myScale == 1.0) {
myActualFigure.paint(graphics);
} else {
ScaledGraphics g = new ScaledGraphics(graphics);
g.scale(myScale);
g.pushState();
myActualFigure.paint(g);
g.dispose();
graphics.restoreState();
}
graphics.popState();
}
}