1 /*******************************************************************************
2 * Copyright (c) 2007, 2010 Association for Decentralized Information Management
4 * All rights reserved. This program and the accompanying materials
5 * are made available under the terms of the Eclipse Public License v1.0
6 * which accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
10 * VTT Technical Research Centre of Finland - initial API and implementation
11 *******************************************************************************/
12 package org.simantics.g2d.diagram.handler;
14 import java.awt.Shape;
15 import java.awt.geom.AffineTransform;
16 import java.awt.geom.Area;
17 import java.awt.geom.Point2D;
18 import java.awt.geom.Rectangle2D;
19 import java.util.Collections;
20 import java.util.Comparator;
21 import java.util.List;
23 import org.simantics.g2d.connection.handler.ConnectionHandler;
24 import org.simantics.g2d.element.IElement;
25 import org.simantics.g2d.element.handler.BendsHandler;
26 import org.simantics.g2d.element.handler.TerminalTopology;
27 import org.simantics.g2d.element.handler.impl.ConnectionSelectionOutline;
28 import org.simantics.g2d.elementclass.BranchPoint;
29 import org.simantics.g2d.elementclass.MonitorHandler;
30 import org.simantics.g2d.utils.GeometryUtils;
31 import org.simantics.scenegraph.utils.TransformedRectangle;
35 * @See {@link GeometryUtils} for intersect and contains tests
36 * @See {@link TransformedRectangle}
37 * @See {@link Area} intersects operations for complex shapes
38 * @author Toni Kalajainen
40 public class PickRequest {
42 public static enum PickPolicy {
43 PICK_INTERSECTING_OBJECTS,
44 PICK_CONTAINED_OBJECTS
47 public Shape pickArea;
48 public PickPolicy pickPolicy = PickPolicy.PICK_INTERSECTING_OBJECTS;
49 /** Pick filter (null == everything is accepted) */
50 public PickFilter pickFilter = null;
51 public PickSorter pickSorter = null;
53 public PickRequest(double x, double y)
55 pickArea = new Rectangle2D.Double(x, y, 1, 1);
57 public PickRequest(Point2D p)
59 pickArea = new Rectangle2D.Double(p.getX(), p.getY(), 0.0001, 0.0001);
61 public PickRequest(Shape shape)
65 public PickRequest(Shape shape, AffineTransform transform)
67 pickArea = GeometryUtils.transformShape(shape, transform);
70 public static interface PickFilter {
71 boolean accept(IElement e);
73 public static final PickFilter FILTER_ALL = new PickFilter() {
75 public boolean accept(IElement e) {
80 public static final PickFilter FILTER_CONNECTIONS = new PickFilter() {
82 public boolean accept(IElement e) {
83 return e.getElementClass().containsClass(ConnectionHandler.class);
86 public String toString() { return "FILTER_CONNECTIONS"; }
89 public static final PickFilter FILTER_CONNECTION_EDGES = new PickFilter() {
91 public boolean accept(IElement e) {
92 return e.getElementClass().containsClass(BendsHandler.class) || e.getElementClass().containsClass(ConnectionSelectionOutline.class);
95 public String toString() { return "FILTER_CONNECTION_EDGES"; }
98 public static final PickFilter FILTER_BRANCH_POINT = new PickFilter() {
100 public boolean accept(IElement e) {
101 return e.getElementClass().containsClass(BranchPoint.class);
104 public String toString() { return "FILTER_BRANCH_POINTS"; }
106 // Anything that has terminals
107 public static final PickFilter FILTER_NODES = new PickFilter() {
109 public boolean accept(IElement e) {
110 return e.getElementClass().containsClass(TerminalTopology.class);
113 public String toString() { return "FILTER_NODES"; }
115 public static final PickFilter FILTER_MONITORS = new PickFilter() {
117 public boolean accept(IElement e) {
118 return e.getElementClass().containsClass(MonitorHandler.class);
121 public String toString() { return "FILTER_MONITORS"; }
125 public static interface PickSorter {
126 void sort(List<IElement> elements);
129 public static final PickSorter CONNECTIONS_LAST = new PickSorter() {
131 public void sort(List<IElement> elements) {
132 Collections.sort(elements, new Comparator<IElement>() {
134 public int compare(IElement e1, IElement e2) {
135 boolean isConn1 = PickFilter.FILTER_CONNECTION_EDGES.accept(e1);
136 boolean isConn2 = PickFilter.FILTER_CONNECTION_EDGES.accept(e2);
137 if (!isConn1 && isConn2)
139 if (isConn1 && !isConn2)
146 public static final PickSorter CONNECTIONS_FIRST = new PickSorter() {
148 public void sort(List<IElement> elements) {
149 Collections.sort(elements, new Comparator<IElement>() {
151 public int compare(IElement e1, IElement e2) {
152 boolean isConn1 = PickFilter.FILTER_CONNECTION_EDGES.accept(e1);
153 boolean isConn2 = PickFilter.FILTER_CONNECTION_EDGES.accept(e2);
154 if (!isConn1 && isConn2)
156 if (isConn1 && !isConn2)