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