import java.util.Comparator;
import java.util.List;
+import org.simantics.g2d.canvas.ICanvasContext;
import org.simantics.g2d.diagram.DiagramUtils;
import org.simantics.g2d.diagram.IDiagram;
import org.simantics.g2d.diagram.handler.PickRequest;
private static final ThreadLocal<ArrayList<Terminal>> TERMINALS = new ThreadLocal<ArrayList<Terminal>>() {
@Override
protected ArrayList<Terminal> initialValue() {
- return new ArrayList<Terminal>();
+ return new ArrayList<>();
}
};
private static final ThreadLocal<ArrayList<IElement>> ELEMENTS = new ThreadLocal<ArrayList<IElement>>() {
@Override
protected ArrayList<IElement> initialValue() {
- return new ArrayList<IElement>();
+ return new ArrayList<>();
}
};
* @param pickAreaTerminals pick terminals that have a shape
* @return terminals in z-order (bottom to top)
*/
- public static List<TerminalInfo> pickTerminals(IDiagram d, Shape pickShape, boolean pickPointTerminals, boolean pickAreaTerminals)
+ public static List<TerminalInfo> pickTerminals(ICanvasContext ctx, IDiagram d, Shape pickShape, boolean pickPointTerminals, boolean pickAreaTerminals)
{
boolean clearElements = false;
List<IElement> elements = null;
elements = ELEMENTS.get();
elements.clear();
clearElements = true;
- PickRequest req = new PickRequest(pickShape);
+ PickRequest req = new PickRequest(pickShape).context(ctx);
DiagramUtils.pick(d, req, elements);
} else {
// Select all terminals
pickCenterY = bounds.getCenterY();
}
- List<TerminalInfo> result = new ArrayList<TerminalInfo>();
+ List<TerminalInfo> result = new ArrayList<>();
ArrayList<Terminal> terminals = TERMINALS.get();
for (IElement e : elements)
{
{
Shape terminalShape = getTerminalShape(tls, e, t);
if ( terminalShape==null /* point terminal */ && !pickPointTerminals ) continue;
- if ( terminalShape!=null /* are terminal */ && !pickAreaTerminals ) continue;
- AffineTransform terminalToDiagram = getTerminalPosOnDiagram(e, t);
+ if ( terminalShape!=null /* area terminal */ && !pickAreaTerminals ) continue;
+
+ AffineTransform terminalToElement = getTerminalPosOnElement0(e, t);
+ AffineTransform terminalToDiagram = concatenate(ElementUtils.getTransform(e), terminalToElement);
// Pick distance will is set to 0 if there was no pick shape,
// i.e. everything is picked.
pickDist = Point2D.distance(pickCenterX, pickCenterY, terminalToDiagram.getTranslateX(), terminalToDiagram.getTranslateY());
}
- AffineTransform terminalToElement = getTerminalPosOnElement(e, t);
TerminalInfo ti = new TerminalInfo();
ti.e = e;
ti.posDia = terminalToDiagram;
- ti.posElem = terminalToElement;
+ ti.posElem = terminalToElement != null ? new AffineTransform(terminalToElement) : new AffineTransform();
ti.t = t;
ti.shape = terminalShape;
ti.distance = pickDist;
* @param pickShape pick area (in diagram coordinate system)
* @return terminals in z-order (bottom to top)
*/
- public static TerminalInfo pickTerminal(IDiagram diagram, Shape pickShape)
+ public static TerminalInfo pickTerminal(ICanvasContext ctx, IDiagram diagram, Shape pickShape)
{
ArrayList<IElement> elements = ELEMENTS.get();
elements.clear();
- PickRequest req = new PickRequest(pickShape);
+ PickRequest req = new PickRequest(pickShape).context(ctx);
DiagramUtils.pick(diagram, req, elements);
if (elements.isEmpty())
return null;
tt.getTerminals(e, terminals);
for (Terminal t : terminals)
{
+ AffineTransform terminalToElement = getTerminalPosOnElement0(e, t);
+ AffineTransform terminalToDiagram = concatenate(ElementUtils.getTransform(e), terminalToElement);
+
Shape terminalShape = getTerminalShape(e, t);
- AffineTransform terminalToDiagram = getTerminalPosOnDiagram(e, t);
Shape pickTargetShape = terminalShape != null ? terminalShape : POINT_PICK_SHAPE;
pickTargetShape = GeometryUtils.transformShape(pickTargetShape, terminalToDiagram);
if (!GeometryUtils.intersects(pickShape, pickTargetShape)) continue;
result.e = e;
result.posDia = terminalToDiagram;
- result.posElem = getTerminalPosOnElement(e, t);
+ result.posElem = terminalToElement != null ? new AffineTransform(terminalToElement) : new AffineTransform();
result.t = t;
result.shape = terminalShape;
result.distance = Math.sqrt(pickDist);
*/
public static AffineTransform getTerminalPosOnDiagram(IElement e, Terminal t)
{
- AffineTransform pos = getTerminalPosOnElement(e, t);
- AffineTransform at = ElementUtils.getTransform(e);
- AffineTransform result = new AffineTransform(at);
- result.concatenate(pos);
- return result;
+ AffineTransform pos = getTerminalPosOnElement0(e, t);
+ return concatenate(ElementUtils.getTransform(e), pos);
}
/**
* @return Transform of a terminal
*/
public static AffineTransform getTerminalPosOnElement(IElement e, Terminal t)
+ {
+ AffineTransform tr = getTerminalPosOnElement0(e, t);
+ return tr != null ? new AffineTransform(tr) : null;
+ }
+
+ /**
+ * Get position of a terminal in element
+ * @param e element
+ * @param t terminal
+ * @return Transform of a terminal
+ */
+ private static AffineTransform getTerminalPosOnElement0(IElement e, Terminal t)
{
List<TerminalLayout> tls = e.getElementClass().getItemsByClass(TerminalLayout.class);
AffineTransform result = null;
* @param pickShape
* @return bends or null
*/
- public BendsInfo pickBends(IDiagram diagram, Shape pickShape)
+ public BendsInfo pickBends(ICanvasContext ctx, IDiagram diagram, Shape pickShape)
{
BendsInfo result = null;
double bestShortestDist = Double.MAX_VALUE;
ArrayList<IElement> elements = ELEMENTS.get();
elements.clear();
- PickRequest req = new PickRequest(pickShape);
+ PickRequest req = new PickRequest(pickShape).context(ctx);
DiagramUtils.pick(diagram, req, elements);
- ArrayList<Bend> bends = new ArrayList<Bend>();
+ ArrayList<Bend> bends = new ArrayList<>();
Point2D bendPos = new Point2D.Double();
for (IElement e : diagram.getElements())
{
public static boolean isSameTerminal(TerminalInfo t1, TerminalInfo t2) {
if (t1 == null || t2 == null)
return false;
- return t1.e.equals(t2.e) && t1.t.equals(t2.e);
+ return t1.e.equals(t2.e) && t1.t.equals(t2.t);
}
/**
}
}
- ArrayList<TerminalInfo> result = new ArrayList<TerminalInfo>(len);
+ ArrayList<TerminalInfo> result = new ArrayList<>(len);
for (int i = 0; i < len; ++i) {
TerminalInfo ti = tis.get(i);
if (ti.distance == nearest.distance
return result;
}
+ private static AffineTransform concatenate(AffineTransform a, AffineTransform b) {
+ AffineTransform result = new AffineTransform(a);
+ if (b != null)
+ result.concatenate(b);
+ return result;
+ }
+
}