]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.g2d/src/org/simantics/g2d/diagram/handler/PickRequest.java
Merge "Debug logging through SLF4J Logger for Expressions"
[simantics/platform.git] / bundles / org.simantics.g2d / src / org / simantics / g2d / diagram / handler / PickRequest.java
1 /*******************************************************************************
2  * Copyright (c) 2007, 2010 Association for Decentralized Information Management
3  * in Industry THTH ry.
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
8  *
9  * Contributors:
10  *     VTT Technical Research Centre of Finland - initial API and implementation
11  *******************************************************************************/
12 package org.simantics.g2d.diagram.handler;
13
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;
22
23 import org.simantics.g2d.canvas.ICanvasContext;
24 import org.simantics.g2d.connection.handler.ConnectionHandler;
25 import org.simantics.g2d.element.IElement;
26 import org.simantics.g2d.element.handler.BendsHandler;
27 import org.simantics.g2d.element.handler.TerminalTopology;
28 import org.simantics.g2d.element.handler.impl.ConnectionSelectionOutline;
29 import org.simantics.g2d.elementclass.BranchPoint;
30 import org.simantics.g2d.elementclass.MonitorHandler;
31 import org.simantics.g2d.utils.GeometryUtils;
32 import org.simantics.scenegraph.utils.TransformedRectangle;
33
34 /**
35  *
36  * @See {@link GeometryUtils} for intersect and contains tests
37  * @See {@link TransformedRectangle}
38  * @See {@link Area} intersects operations for complex shapes
39  * @author Toni Kalajainen
40  */
41 public class PickRequest {
42
43     public static enum PickPolicy {
44         PICK_INTERSECTING_OBJECTS,
45         PICK_CONTAINED_OBJECTS
46     }
47
48     public Shape      pickArea;
49     public PickPolicy pickPolicy = PickPolicy.PICK_INTERSECTING_OBJECTS;
50     /** Pick filter (null == everything is accepted) */
51     public PickFilter pickFilter = null;
52     public PickSorter pickSorter = null;
53
54     /**
55      * Used to optimize picking if provided via R-tree traversal to find
56      * intersecting elements, not everything.
57      */
58     public ICanvasContext pickContext;
59
60     public PickRequest(double x, double y)
61     {
62         pickArea = new Rectangle2D.Double(x, y, 1, 1);
63     }
64     public PickRequest(Point2D p)
65     {
66         pickArea = new Rectangle2D.Double(p.getX(), p.getY(), 0.0001, 0.0001);
67     }
68     public PickRequest(Shape shape)
69     {
70         pickArea = shape;
71     }
72     public PickRequest(Shape shape, AffineTransform transform)
73     {
74         pickArea = GeometryUtils.transformShape(shape, transform);
75     }
76
77     public PickRequest context(ICanvasContext ctx) {
78         this.pickContext = ctx;
79         return this;
80     }
81
82     public static interface PickFilter {
83         boolean accept(IElement e);
84
85         public static final PickFilter FILTER_ALL = new PickFilter() {
86             @Override
87             public boolean accept(IElement e) {
88                 return true;
89             }
90         };
91         // Connections
92         public static final PickFilter FILTER_CONNECTIONS = new PickFilter() {
93             @Override
94             public boolean accept(IElement e) {
95                 return e.getElementClass().containsClass(ConnectionHandler.class);
96             }
97             @Override
98             public String toString() { return "FILTER_CONNECTIONS"; }
99         };
100         // Connection edges
101         public static final PickFilter FILTER_CONNECTION_EDGES = new PickFilter() {
102             @Override
103             public boolean accept(IElement e) {
104                 return e.getElementClass().containsClass(BendsHandler.class) || e.getElementClass().containsClass(ConnectionSelectionOutline.class);
105             }
106             @Override
107             public String toString() { return "FILTER_CONNECTION_EDGES"; }
108         };
109         // Connections
110         public static final PickFilter FILTER_BRANCH_POINT = new PickFilter() {
111             @Override
112             public boolean accept(IElement e) {
113                 return e.getElementClass().containsClass(BranchPoint.class);
114             }
115             @Override
116             public String toString() { return "FILTER_BRANCH_POINTS"; }
117         };
118         // Anything that has terminals
119         public static final PickFilter FILTER_NODES = new PickFilter() {
120             @Override
121             public boolean accept(IElement e) {
122                 return e.getElementClass().containsClass(TerminalTopology.class);
123             }
124             @Override
125             public String toString() { return "FILTER_NODES"; }
126         };
127         public static final PickFilter FILTER_MONITORS = new PickFilter() {
128             @Override
129             public boolean accept(IElement e) {
130                 return e.getElementClass().containsClass(MonitorHandler.class);
131             }
132             @Override
133             public String toString() { return "FILTER_MONITORS"; }
134         };
135     }
136
137     public static interface PickSorter {
138         void sort(List<IElement> elements);
139
140         //
141         public static final PickSorter CONNECTIONS_LAST = new PickSorter() {
142             @Override
143             public void sort(List<IElement> elements) {
144                 Collections.sort(elements, new Comparator<IElement>() {
145                     @Override
146                     public int compare(IElement e1, IElement e2) {
147                         boolean isConn1 = PickFilter.FILTER_CONNECTION_EDGES.accept(e1);
148                         boolean isConn2 = PickFilter.FILTER_CONNECTION_EDGES.accept(e2);
149                         if (!isConn1 && isConn2)
150                             return -1;
151                         if (isConn1 && !isConn2)
152                             return 1;
153                         return 0;
154                     }
155                 });
156             }
157         };
158         public static final PickSorter CONNECTIONS_FIRST = new PickSorter() {
159             @Override
160             public void sort(List<IElement> elements) {
161                 Collections.sort(elements, new Comparator<IElement>() {
162                     @Override
163                     public int compare(IElement e1, IElement e2) {
164                         boolean isConn1 = PickFilter.FILTER_CONNECTION_EDGES.accept(e1);
165                         boolean isConn2 = PickFilter.FILTER_CONNECTION_EDGES.accept(e2);
166                         if (!isConn1 && isConn2)
167                             return 1;
168                         if (isConn1 && !isConn2)
169                             return -1;
170                         return 0;
171                     }
172                 });
173             }
174         };
175     }
176
177 }