/******************************************************************************* * Copyright (c) 2007, 2010 Association for Decentralized Information Management * in Industry THTH ry. * 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: * VTT Technical Research Centre of Finland - initial API and implementation *******************************************************************************/ package org.simantics.g2d.elementclass.connection; import java.awt.Shape; import java.awt.geom.AffineTransform; import java.awt.geom.Path2D; import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; import java.util.ArrayList; import java.util.List; import org.simantics.g2d.diagram.IDiagram; import org.simantics.g2d.element.ElementClass; import org.simantics.g2d.element.ElementHints; import org.simantics.g2d.element.IElement; import org.simantics.g2d.element.handler.BendsHandler; import org.simantics.g2d.element.handler.InternalSize; import org.simantics.g2d.element.handler.LifeCycle; import org.simantics.g2d.element.handler.Move; import org.simantics.g2d.element.handler.Outline; import org.simantics.g2d.element.handler.Parent; import org.simantics.g2d.element.handler.Transform; import org.simantics.g2d.element.handler.impl.ConfigurableEdgeVisuals; import org.simantics.g2d.element.handler.impl.ConnectionSelectionOutline; import org.simantics.g2d.element.handler.impl.FillColorImpl; import org.simantics.g2d.element.handler.impl.ParentImpl; import org.simantics.g2d.element.handler.impl.ShapePick; import org.simantics.g2d.element.handler.impl.SimpleElementLayers; import org.simantics.g2d.elementclass.PlainElementPropertySetter; import org.simantics.utils.datastructures.hints.IHintContext.Key; import org.simantics.utils.datastructures.hints.IHintContext.KeyOf; /** * @author Toni Kalajainen */ public class EdgeClass { /** * A {@link Transform} and {@link Move} implementation suitable for edges * which are connected to nodes and cannot be moved by themselves. * *
* The {@link Transform} implementation is a simple one with support for a * parent element through {@link ElementHints#KEY_PARENT_ELEMENT}. The * {@link Move} implementation in turn is a stub which does nothing to make * edges immovable. * *
* FIXME: The more correct solution would be not to have a {@link Move}
* handler at all but much the current participant code is very highly
* dependent on having a single {@link Move} handler available that this
* workaround seems better at this point.
*
* @author Tuukka Lehtonen
*/
public static class FixedTransform implements Transform, Move {
private static final long serialVersionUID = 2287402413442694915L;
public static final FixedTransform INSTANCE = new FixedTransform();
public static final AffineTransform IDENTITY = new AffineTransform();
@Override
public AffineTransform getTransform(IElement e) {
AffineTransform local = e.getHint(ElementHints.KEY_TRANSFORM);
if (local == null)
local = IDENTITY;
Parent p = e.getElementClass().getAtMostOneItemOfClass(Parent.class);
if (p == null)
return local;
IElement parentElement = p.getParent(e);
if (parentElement == null)
return local;
AffineTransform parentTransform = parentElement.getElementClass().getSingleItem(Transform.class).getTransform(parentElement);
if (parentTransform.isIdentity())
return local;
AffineTransform result = new AffineTransform(local);
result.preConcatenate(parentTransform);
return result;
}
@Override
public void setTransform(IElement e, AffineTransform at) {
assert at != null;
e.setHint(ElementHints.KEY_TRANSFORM, at);
}
@Override
public Point2D getPosition(IElement e) {
AffineTransform at = e.getHint(ElementHints.KEY_TRANSFORM);
if (at == null)
return new Point2D.Double();
return new Point2D.Double(at.getTranslateX(), at.getTranslateY());
}
@Override
public void moveTo(IElement e, double x, double y) {
// Don't allow moving.
}
}
// TODO scale, rotate, move, transform
public static final ElementClass STRAIGHT =
ElementClass.compile(
EdgeSceneGraph.INSTANCE,
EdgeHandler.INSTANCE,
ConfigurableEdgeVisuals.DEFAULT,
FillColorImpl.RED,
FixedTransform.INSTANCE,
ShapePick.INSTANCE,
ConnectionSelectionOutline.INSTANCE,
SimpleElementLayers.INSTANCE,
ParentImpl.INSTANCE,
new PlainElementPropertySetter(EdgeSceneGraph.KEY_SG_NODE)
).setId("EdgeClass.STRAIGHT");
public static class EdgeHandler implements BendsHandler, Outline, LifeCycle, InternalSize {
private static final long serialVersionUID = -5949432471958957382L;
public static final EdgeHandler INSTANCE = new EdgeHandler();
public static final Key KEY_PATH = new KeyOf(Path2D.class, "PATH");
public static final Key KEY_BOUNDS = new KeyOf(Rectangle2D.class, "BOUNDS");
public static final Key KEY_ANGLETYPE = new KeyOf(AngleType.class);
public static final Key KEY_BENDS = new KeyOf(ArrayList.class, "BENDS");
public static class BendImpl implements Bend {
Point2D pos;
}
/**
* Reads bends, builds path, and writes it to KEY_PATH
* @param e
*/
/*
private void buildPath(IElement e)
{
ArrayList