comparison java/src/uk/ac/qmul/eecs/ccmi/gui/Diagram.java @ 0:9418ab7b7f3f

Initial import
author Fiore Martin <fiore@eecs.qmul.ac.uk>
date Fri, 16 Dec 2011 17:35:51 +0000
parents
children 9e67171477bc
comparison
equal deleted inserted replaced
-1:000000000000 0:9418ab7b7f3f
1 /*
2 CCmI Editor - A Collaborative Cross-Modal Diagram Editing Tool
3
4 Copyright (C) 2011 Queen Mary University of London (http://ccmi.eecs.qmul.ac.uk/)
5
6 This program is free software: you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation, either version 3 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program. If not, see <http://www.gnu.org/licenses/>.
18 */
19 package uk.ac.qmul.eecs.ccmi.gui;
20
21 import java.awt.geom.Point2D;
22 import java.util.Set;
23
24 import uk.ac.qmul.eecs.ccmi.diagrammodel.CollectionModel;
25 import uk.ac.qmul.eecs.ccmi.diagrammodel.DiagramElement;
26 import uk.ac.qmul.eecs.ccmi.diagrammodel.DiagramModel;
27 import uk.ac.qmul.eecs.ccmi.diagrammodel.DiagramModelTreeNode;
28 import uk.ac.qmul.eecs.ccmi.diagrammodel.NodeProperties;
29 import uk.ac.qmul.eecs.ccmi.diagrammodel.TreeModel;
30 import uk.ac.qmul.eecs.ccmi.gui.persistence.PrototypePersistenceDelegate;
31
32 /**
33 * This Diagram class holds all the data needed for a representation of the diagram. It is used by component classes
34 * such as {@link GraphPanel} and {@link DiagramTree} to draw the diagram by accessing the diagram model or by
35 * {@link EditorTabbedPane} to assign a title to the tabs out of the diagram name.
36 *
37 *
38 */
39 public abstract class Diagram implements Cloneable {
40
41 public static Diagram newInstance(String name, Node[] nodes, Edge[] edges, PrototypePersistenceDelegate prototypePersistenceDelegate){
42 return new LocalDiagram(name,nodes,edges,prototypePersistenceDelegate);
43 }
44
45 public abstract String getName();
46
47 public abstract void setName(String name);
48
49 public abstract Node[] getNodePrototypes();
50
51 public abstract Edge[] getEdgePrototypes();
52
53 public abstract TreeModel<Node,Edge> getTreeModel();
54
55 public abstract CollectionModel<Node,Edge> getCollectionModel();
56
57 public abstract DiagramModelUpdater getModelUpdater();
58
59 public abstract String getLabel();
60
61 public abstract PrototypePersistenceDelegate getPrototypePersistenceDelegate();
62
63 @Override
64 public Object clone(){
65 try {
66 return super.clone();
67 } catch (CloneNotSupportedException e) {
68 throw new RuntimeException(e);
69 }
70 }
71
72 private static class LocalDiagram extends Diagram {
73
74 private LocalDiagram(String name, Node[] nodes, Edge[] edges,PrototypePersistenceDelegate prototypePersistenceDelegate){
75 this.name = name;
76 this.nodes = nodes;
77 this.edges = edges;
78 this.prototypePersistenceDelegate = prototypePersistenceDelegate;
79 diagramModel = new DiagramModel<Node,Edge>(nodes,edges);
80 innerModelUpdater = new InnerModelUpdater();
81 }
82
83 @Override
84 public String getName(){
85 return name;
86 }
87
88 @Override
89 public void setName(String name){
90 this.name = name;
91 }
92
93 @Override
94 public Node[] getNodePrototypes(){
95 return nodes;
96 }
97
98 @Override
99 public Edge[] getEdgePrototypes(){
100 return edges;
101 }
102
103 @Override
104 public TreeModel<Node,Edge> getTreeModel(){
105 return diagramModel.getTreeModel();
106 }
107
108 @Override
109 public CollectionModel<Node,Edge> getCollectionModel(){
110 return diagramModel.getDiagramCollection();
111 }
112
113 @Override
114 public String getLabel(){
115 return name;
116 }
117
118 @Override
119 public DiagramModelUpdater getModelUpdater(){
120 return innerModelUpdater;
121 }
122
123 @Override
124 public String toString(){
125 return name;
126 }
127
128 @Override
129 public PrototypePersistenceDelegate getPrototypePersistenceDelegate(){
130 return prototypePersistenceDelegate;
131 }
132
133 @Override
134 public Object clone(){
135 LocalDiagram clone = (LocalDiagram)super.clone();
136 clone.name = getName();
137 clone.nodes = getNodePrototypes();
138 clone.edges = getEdgePrototypes();
139 /* constructor with no args makes just a dummy wrapper */
140 clone.diagramModel = new DiagramModel<Node,Edge>(nodes,edges);
141 clone.innerModelUpdater = clone.new InnerModelUpdater();
142 return clone;
143 }
144
145 private DiagramModel<Node,Edge> diagramModel;
146 private InnerModelUpdater innerModelUpdater;
147 private PrototypePersistenceDelegate prototypePersistenceDelegate;
148 private String name;
149 private Node[] nodes;
150 private Edge[] edges;
151
152 private class InnerModelUpdater implements DiagramModelUpdater {
153
154 @Override
155 public boolean getLock(DiagramModelTreeNode treeNode, Lock lock) {
156 /* using a non shared diagram requires no actual lock, therefore the answer is always yes */
157 return true;
158 }
159
160 @Override
161 public void yieldLock(DiagramModelTreeNode treeNode, Lock lock) {}
162
163 @Override
164 public void insertInCollection(DiagramElement element) {
165 if(element instanceof Node)
166 diagramModel.getDiagramCollection().insert((Node)element);
167 else
168 diagramModel.getDiagramCollection().insert((Edge)element);
169 }
170
171 @Override
172 public void insertInTree(DiagramElement element) {
173 if(element instanceof Node)
174 diagramModel.getTreeModel().insertTreeNode((Node)element);
175 else
176 diagramModel.getTreeModel().insertTreeNode((Edge)element);
177 }
178
179 @Override
180 public void takeOutFromCollection(DiagramElement element) {
181 diagramModel.getDiagramCollection().takeOut(element);
182 }
183
184 @Override
185 public void takeOutFromTree(DiagramElement element) {
186 diagramModel.getDiagramCollection().takeOut(element);
187 }
188
189 @Override
190 public void setName(DiagramElement element, String name) {
191 element.setName(name);
192 }
193
194 @Override
195 public void setNotes(DiagramModelTreeNode treeNode, String notes) {
196 diagramModel.getTreeModel().setNotes(treeNode, notes);
197 }
198
199 @Override
200 public void setProperty(Node node, String type, int index,
201 String value) {
202 node.setProperty(type, index, value);
203 }
204
205 @Override
206 public void setProperties(Node node, NodeProperties properties) {
207 node.setProperties(properties);
208 }
209
210 @Override
211 public void clearProperties(Node node) {
212 node.clearProperties();
213 }
214
215 @Override
216 public void addProperty(Node node, String type, String value) {
217 node.addProperty(type, value);
218 }
219
220 @Override
221 public void removeProperty(Node node, String type, int index) {
222 node.removeProperty(type, index);
223 }
224
225 @Override
226 public void setModifiers(Node node, String type, int index,
227 Set<Integer> modifiers) {
228 node.setModifierIndexes(type, index, modifiers);
229 }
230
231 @Override
232 public void setEndLabel(Edge edge, Node node, String label) {
233 edge.setEndLabel(node, label);
234 }
235
236 @Override
237 public void setEndDescription(Edge edge, Node node,
238 int index) {
239 edge.setEndDescription(node, index);
240 }
241
242 @Override
243 public void translate(GraphElement ge, Point2D p, double x, double y) {
244 ge.translate(p, x, y);
245 }
246
247 @Override
248 public void startMove(GraphElement ge, Point2D p) {
249 ge.startMove(p);
250 }
251
252 @Override
253 public void bend(Edge edge, Point2D p) {
254 edge.bend(p);
255 }
256
257 @Override
258 public void stopMove(GraphElement ge) {
259 ge.stopMove();
260 }
261 }
262 }
263
264 }