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.diagram.handler;
\r
14 import java.awt.Shape;
\r
15 import java.awt.geom.AffineTransform;
\r
16 import java.awt.geom.Area;
\r
17 import java.awt.geom.Point2D;
\r
18 import java.awt.geom.Rectangle2D;
\r
19 import java.util.Collections;
\r
20 import java.util.Comparator;
\r
21 import java.util.List;
\r
23 import org.simantics.g2d.connection.handler.ConnectionHandler;
\r
24 import org.simantics.g2d.element.IElement;
\r
25 import org.simantics.g2d.element.handler.BendsHandler;
\r
26 import org.simantics.g2d.element.handler.TerminalTopology;
\r
27 import org.simantics.g2d.element.handler.impl.ConnectionSelectionOutline;
\r
28 import org.simantics.g2d.elementclass.BranchPoint;
\r
29 import org.simantics.g2d.elementclass.MonitorHandler;
\r
30 import org.simantics.g2d.utils.GeometryUtils;
\r
31 import org.simantics.scenegraph.utils.TransformedRectangle;
\r
35 * @See {@link GeometryUtils} for intersect and contains tests
\r
36 * @See {@link TransformedRectangle}
\r
37 * @See {@link Area} intersects operations for complex shapes
\r
38 * @author Toni Kalajainen
\r
40 public class PickRequest {
\r
42 public static enum PickPolicy {
\r
43 PICK_INTERSECTING_OBJECTS,
\r
44 PICK_CONTAINED_OBJECTS
\r
47 public Shape pickArea;
\r
48 public PickPolicy pickPolicy = PickPolicy.PICK_INTERSECTING_OBJECTS;
\r
49 /** Pick filter (null == everything is accepted) */
\r
50 public PickFilter pickFilter = null;
\r
51 public PickSorter pickSorter = null;
\r
53 public PickRequest(double x, double y)
\r
55 pickArea = new Rectangle2D.Double(x, y, 1, 1);
\r
57 public PickRequest(Point2D p)
\r
59 pickArea = new Rectangle2D.Double(p.getX(), p.getY(), 0.0001, 0.0001);
\r
61 public PickRequest(Shape shape)
\r
65 public PickRequest(Shape shape, AffineTransform transform)
\r
67 pickArea = GeometryUtils.transformShape(shape, transform);
\r
70 public static interface PickFilter {
\r
71 boolean accept(IElement e);
\r
73 public static final PickFilter FILTER_ALL = new PickFilter() {
\r
75 public boolean accept(IElement e) {
\r
80 public static final PickFilter FILTER_CONNECTIONS = new PickFilter() {
\r
82 public boolean accept(IElement e) {
\r
83 return e.getElementClass().containsClass(ConnectionHandler.class);
\r
86 public String toString() { return "FILTER_CONNECTIONS"; }
\r
89 public static final PickFilter FILTER_CONNECTION_EDGES = new PickFilter() {
\r
91 public boolean accept(IElement e) {
\r
92 return e.getElementClass().containsClass(BendsHandler.class) || e.getElementClass().containsClass(ConnectionSelectionOutline.class);
\r
95 public String toString() { return "FILTER_CONNECTION_EDGES"; }
\r
98 public static final PickFilter FILTER_BRANCH_POINT = new PickFilter() {
\r
100 public boolean accept(IElement e) {
\r
101 return e.getElementClass().containsClass(BranchPoint.class);
\r
104 public String toString() { return "FILTER_BRANCH_POINTS"; }
\r
106 // Anything that has terminals
\r
107 public static final PickFilter FILTER_NODES = new PickFilter() {
\r
109 public boolean accept(IElement e) {
\r
110 return e.getElementClass().containsClass(TerminalTopology.class);
\r
113 public String toString() { return "FILTER_NODES"; }
\r
115 public static final PickFilter FILTER_MONITORS = new PickFilter() {
\r
117 public boolean accept(IElement e) {
\r
118 return e.getElementClass().containsClass(MonitorHandler.class);
\r
121 public String toString() { return "FILTER_MONITORS"; }
\r
125 public static interface PickSorter {
\r
126 void sort(List<IElement> elements);
\r
129 public static final PickSorter CONNECTIONS_LAST = new PickSorter() {
\r
131 public void sort(List<IElement> elements) {
\r
132 Collections.sort(elements, new Comparator<IElement>() {
\r
134 public int compare(IElement e1, IElement e2) {
\r
135 boolean isConn1 = PickFilter.FILTER_CONNECTION_EDGES.accept(e1);
\r
136 boolean isConn2 = PickFilter.FILTER_CONNECTION_EDGES.accept(e2);
\r
137 if (!isConn1 && isConn2)
\r
139 if (isConn1 && !isConn2)
\r
146 public static final PickSorter CONNECTIONS_FIRST = new PickSorter() {
\r
148 public void sort(List<IElement> elements) {
\r
149 Collections.sort(elements, new Comparator<IElement>() {
\r
151 public int compare(IElement e1, IElement e2) {
\r
152 boolean isConn1 = PickFilter.FILTER_CONNECTION_EDGES.accept(e1);
\r
153 boolean isConn2 = PickFilter.FILTER_CONNECTION_EDGES.accept(e2);
\r
154 if (!isConn1 && isConn2)
\r
156 if (isConn1 && !isConn2)
\r