]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.diagram/src/org/simantics/diagram/handler/DiagramSelection.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.diagram / src / org / simantics / diagram / handler / DiagramSelection.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.diagram.handler;\r
13 \r
14 import java.awt.geom.Point2D;\r
15 import java.lang.ref.WeakReference;\r
16 import java.util.Collections;\r
17 import java.util.Set;\r
18 \r
19 import org.simantics.db.Resource;\r
20 import org.simantics.g2d.canvas.ICanvasContext;\r
21 import org.simantics.g2d.element.IElement;\r
22 import org.simantics.utils.strings.EString;\r
23 \r
24 /**\r
25  * @author Tuukka Lehtonen\r
26  */\r
27 public class DiagramSelection {\r
28 \r
29     public static final DiagramSelection EMPTY = new DiagramSelection((Resource) null);\r
30 \r
31     // Reference may be null\r
32     private final WeakReference<ICanvasContext> sourceCanvas;\r
33     private final Resource source;\r
34 \r
35     /**\r
36      * May be empty or at least invalid after the source canvas no longer\r
37      * exists. Should not be used for anything besides visualisation.\r
38      */\r
39     private transient final Set<IElement> elements;\r
40 \r
41     private final ElementObjectAssortment assortment;\r
42     private final boolean cut;\r
43     private final Point2D copyPos;\r
44 \r
45     private DiagramSelection(Resource source) {\r
46         this.sourceCanvas = null;\r
47         this.source = source;\r
48         this.elements = Collections.emptySet();\r
49         this.assortment = ElementObjectAssortment.fromElements(elements);\r
50         this.cut = false;\r
51         this.copyPos = new Point2D.Double();\r
52     }\r
53 \r
54     public DiagramSelection(ICanvasContext sourceCanvas, Resource source, Set<IElement> elements, boolean cut, Point2D copyPos) {\r
55         assert source != null;\r
56         assert elements != null;\r
57 \r
58         this.sourceCanvas = new WeakReference<ICanvasContext>(sourceCanvas);\r
59         this.source = source;\r
60         this.elements = Collections.unmodifiableSet(elements);\r
61         this.assortment = ElementObjectAssortment.fromElements(elements);\r
62         this.cut = cut;\r
63         this.copyPos = copyPos;\r
64     }\r
65 \r
66     /**\r
67      * @return <code>null</code> if the source canvas has already been disposed.\r
68      */\r
69     public ICanvasContext getSourceCanvas() {\r
70         ICanvasContext ctx = sourceCanvas == null ? null : sourceCanvas.get();\r
71         return ctx == null ? null : ctx.isDisposed() ? null : ctx;\r
72     }\r
73 \r
74     public boolean isFromCanvasContext(ICanvasContext ctx) {\r
75         ICanvasContext srcCtx = getSourceCanvas();\r
76         return ctx != null && ctx == srcCtx;\r
77     }\r
78 \r
79     public Resource getSourceDiagram() {\r
80         return source;\r
81     }\r
82 \r
83     public boolean isCut() {\r
84         return cut;\r
85     }\r
86 \r
87     public Point2D getCopyPos() {\r
88         return copyPos;\r
89     }\r
90 \r
91     public Set<IElement> getOriginalElements() {\r
92         return elements;\r
93     }\r
94 \r
95     public ElementObjectAssortment getAssortment() {\r
96         return assortment;\r
97     }\r
98 \r
99     public boolean isEmpty() {\r
100         return getAssortment().isEmpty();\r
101     }\r
102 \r
103     @Override\r
104     public String toString() {\r
105         StringBuilder sb = new StringBuilder();\r
106         sb.append("Diagram selection of ");\r
107         sb.append(elements.size());\r
108         sb.append(" element(s) ");\r
109         if (cut)\r
110             sb.append("cut");\r
111         else\r
112             sb.append("copied");\r
113         sb.append(" from ");\r
114         sb.append(source);\r
115         sb.append(" with reference position ");\r
116         sb.append(copyPos);\r
117         if (elements != null && !elements.isEmpty()) {\r
118             sb.append(":\n");\r
119             String elems = EString.implode(elements, "\n");\r
120             if (elems != null)\r
121                 sb.append(EString.addPrefix(elems, "\t"));\r
122         }\r
123         if (assortment != null && !assortment.isEmpty()) {\r
124             sb.append(assortment.toString());\r
125         }\r
126         return sb.toString();\r
127     }\r
128 }\r
129 \r