1 /*******************************************************************************
\r
2 * Copyright (c) 2007, 2010 Association for Decentralized Information Management
\r
3 * in Industry THTH ry.
\r
4 * All rights reserved. This program and the accompanying materials
\r
5 * are made available under the terms of the Eclipse Public License v1.0
\r
6 * which accompanies this distribution, and is available at
\r
7 * http://www.eclipse.org/legal/epl-v10.html
\r
10 * VTT Technical Research Centre of Finland - initial API and implementation
\r
11 *******************************************************************************/
\r
12 package org.simantics.g2d.element.handler.impl;
\r
14 import java.awt.Shape;
\r
15 import java.awt.geom.AffineTransform;
\r
16 import java.awt.geom.NoninvertibleTransformException;
\r
17 import java.awt.geom.Rectangle2D;
\r
18 import java.util.List;
\r
20 import org.simantics.g2d.diagram.handler.PickRequest.PickPolicy;
\r
21 import org.simantics.g2d.element.IElement;
\r
22 import org.simantics.g2d.element.handler.ElementHandler;
\r
23 import org.simantics.g2d.element.handler.Outline;
\r
24 import org.simantics.g2d.element.handler.Pick;
\r
25 import org.simantics.g2d.element.handler.Transform;
\r
26 import org.simantics.g2d.utils.GeometryUtils;
\r
29 * @author Tuukka Lehtonen
\r
31 public class OutlinePick implements Pick {
\r
33 public static final ElementHandler INSTANCE = new OutlinePick();
\r
35 private static final long serialVersionUID = 1L;
\r
38 public boolean pickTest(IElement e, Shape s, PickPolicy policy) {
\r
39 Rectangle2D pickArea = null;
\r
40 if (s instanceof Rectangle2D)
\r
41 pickArea = (Rectangle2D) s;
\r
43 // FIXME: suboptimal, but works.
\r
44 pickArea = s.getBounds2D();
\r
46 // Pick with shape handler(s)
\r
47 List<Outline> shapeHandlers = e.getElementClass().getItemsByClass(Outline.class);
\r
48 if (!shapeHandlers.isEmpty()) {
\r
49 // Convert pick shape to element coordinates
\r
50 Transform t = e.getElementClass().getSingleItem(Transform.class);
\r
51 AffineTransform canvasToElement = t.getTransform(e);
\r
52 AffineTransform elementToCanvas;
\r
54 elementToCanvas = canvasToElement.createInverse();
\r
55 } catch (NoninvertibleTransformException e1) {
\r
56 throw new RuntimeException(e1);
\r
58 Shape pickShapeInElementCoords = GeometryUtils.transformShape(pickArea, elementToCanvas);
\r
60 // Intersection with one shape is enough
\r
62 case PICK_INTERSECTING_OBJECTS: {
\r
63 for (Outline es : shapeHandlers) {
\r
64 Shape elementShape = es.getElementShape(e);
\r
65 if (elementShape == null)
\r
67 if (GeometryUtils.intersects(pickShapeInElementCoords, elementShape))
\r
72 case PICK_CONTAINED_OBJECTS: {
\r
73 for (Outline es : shapeHandlers) {
\r
74 Shape elementShape = es.getElementShape(e);
\r
75 if (GeometryUtils.contains(pickShapeInElementCoords, elementShape))
\r