]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.g2d/src/org/simantics/g2d/diagram/handler/PickRequest.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.g2d / src / org / simantics / g2d / diagram / handler / PickRequest.java
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
8  *\r
9  * Contributors:\r
10  *     VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.g2d.diagram.handler;\r
13 \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
22 \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
32 \r
33 /**\r
34  *\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
39  */\r
40 public class PickRequest {\r
41 \r
42     public static enum PickPolicy {\r
43         PICK_INTERSECTING_OBJECTS,\r
44         PICK_CONTAINED_OBJECTS\r
45     }\r
46 \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
52 \r
53     public PickRequest(double x, double y)\r
54     {\r
55         pickArea = new Rectangle2D.Double(x, y, 1, 1);\r
56     }\r
57     public PickRequest(Point2D p)\r
58     {\r
59         pickArea = new Rectangle2D.Double(p.getX(), p.getY(), 0.0001, 0.0001);\r
60     }\r
61     public PickRequest(Shape shape)\r
62     {\r
63         pickArea = shape;\r
64     }\r
65     public PickRequest(Shape shape, AffineTransform transform)\r
66     {\r
67         pickArea = GeometryUtils.transformShape(shape, transform);\r
68     }\r
69 \r
70     public static interface PickFilter {\r
71         boolean accept(IElement e);\r
72 \r
73         public static final PickFilter FILTER_ALL = new PickFilter() {\r
74             @Override\r
75             public boolean accept(IElement e) {\r
76                 return true;\r
77             }\r
78         };\r
79         // Connections\r
80         public static final PickFilter FILTER_CONNECTIONS = new PickFilter() {\r
81             @Override\r
82             public boolean accept(IElement e) {\r
83                 return e.getElementClass().containsClass(ConnectionHandler.class);\r
84             }\r
85             @Override\r
86             public String toString() { return "FILTER_CONNECTIONS"; }\r
87         };\r
88         // Connection edges\r
89         public static final PickFilter FILTER_CONNECTION_EDGES = new PickFilter() {\r
90             @Override\r
91             public boolean accept(IElement e) {\r
92                 return e.getElementClass().containsClass(BendsHandler.class) || e.getElementClass().containsClass(ConnectionSelectionOutline.class);\r
93             }\r
94             @Override\r
95             public String toString() { return "FILTER_CONNECTION_EDGES"; }\r
96         };\r
97         // Connections\r
98         public static final PickFilter FILTER_BRANCH_POINT = new PickFilter() {\r
99             @Override\r
100             public boolean accept(IElement e) {\r
101                 return e.getElementClass().containsClass(BranchPoint.class);\r
102             }\r
103             @Override\r
104             public String toString() { return "FILTER_BRANCH_POINTS"; }\r
105         };\r
106         // Anything that has terminals\r
107         public static final PickFilter FILTER_NODES = new PickFilter() {\r
108             @Override\r
109             public boolean accept(IElement e) {\r
110                 return e.getElementClass().containsClass(TerminalTopology.class);\r
111             }\r
112             @Override\r
113             public String toString() { return "FILTER_NODES"; }\r
114         };\r
115         public static final PickFilter FILTER_MONITORS = new PickFilter() {\r
116             @Override\r
117             public boolean accept(IElement e) {\r
118                 return e.getElementClass().containsClass(MonitorHandler.class);\r
119             }\r
120             @Override\r
121             public String toString() { return "FILTER_MONITORS"; }\r
122         };\r
123     }\r
124 \r
125     public static interface PickSorter {\r
126         void sort(List<IElement> elements);\r
127 \r
128         //\r
129         public static final PickSorter CONNECTIONS_LAST = new PickSorter() {\r
130             @Override\r
131             public void sort(List<IElement> elements) {\r
132                 Collections.sort(elements, new Comparator<IElement>() {\r
133                     @Override\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
138                             return -1;\r
139                         if (isConn1 && !isConn2)\r
140                             return 1;\r
141                         return 0;\r
142                     }\r
143                 });\r
144             }\r
145         };\r
146         public static final PickSorter CONNECTIONS_FIRST = new PickSorter() {\r
147             @Override\r
148             public void sort(List<IElement> elements) {\r
149                 Collections.sort(elements, new Comparator<IElement>() {\r
150                     @Override\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
155                             return 1;\r
156                         if (isConn1 && !isConn2)\r
157                             return -1;\r
158                         return 0;\r
159                     }\r
160                 });\r
161             }\r
162         };\r
163     }\r
164 \r
165 }\r