Mercurial > hg > ccmieditor
view 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 |
line wrap: on
line source
/* CCmI Editor - A Collaborative Cross-Modal Diagram Editing Tool Copyright (C) 2011 Queen Mary University of London (http://ccmi.eecs.qmul.ac.uk/) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ package uk.ac.qmul.eecs.ccmi.gui; import java.awt.geom.Point2D; import java.util.Set; import uk.ac.qmul.eecs.ccmi.diagrammodel.CollectionModel; import uk.ac.qmul.eecs.ccmi.diagrammodel.DiagramElement; import uk.ac.qmul.eecs.ccmi.diagrammodel.DiagramModel; import uk.ac.qmul.eecs.ccmi.diagrammodel.DiagramModelTreeNode; import uk.ac.qmul.eecs.ccmi.diagrammodel.NodeProperties; import uk.ac.qmul.eecs.ccmi.diagrammodel.TreeModel; import uk.ac.qmul.eecs.ccmi.gui.persistence.PrototypePersistenceDelegate; /** * This Diagram class holds all the data needed for a representation of the diagram. It is used by component classes * such as {@link GraphPanel} and {@link DiagramTree} to draw the diagram by accessing the diagram model or by * {@link EditorTabbedPane} to assign a title to the tabs out of the diagram name. * * */ public abstract class Diagram implements Cloneable { public static Diagram newInstance(String name, Node[] nodes, Edge[] edges, PrototypePersistenceDelegate prototypePersistenceDelegate){ return new LocalDiagram(name,nodes,edges,prototypePersistenceDelegate); } public abstract String getName(); public abstract void setName(String name); public abstract Node[] getNodePrototypes(); public abstract Edge[] getEdgePrototypes(); public abstract TreeModel<Node,Edge> getTreeModel(); public abstract CollectionModel<Node,Edge> getCollectionModel(); public abstract DiagramModelUpdater getModelUpdater(); public abstract String getLabel(); public abstract PrototypePersistenceDelegate getPrototypePersistenceDelegate(); @Override public Object clone(){ try { return super.clone(); } catch (CloneNotSupportedException e) { throw new RuntimeException(e); } } private static class LocalDiagram extends Diagram { private LocalDiagram(String name, Node[] nodes, Edge[] edges,PrototypePersistenceDelegate prototypePersistenceDelegate){ this.name = name; this.nodes = nodes; this.edges = edges; this.prototypePersistenceDelegate = prototypePersistenceDelegate; diagramModel = new DiagramModel<Node,Edge>(nodes,edges); innerModelUpdater = new InnerModelUpdater(); } @Override public String getName(){ return name; } @Override public void setName(String name){ this.name = name; } @Override public Node[] getNodePrototypes(){ return nodes; } @Override public Edge[] getEdgePrototypes(){ return edges; } @Override public TreeModel<Node,Edge> getTreeModel(){ return diagramModel.getTreeModel(); } @Override public CollectionModel<Node,Edge> getCollectionModel(){ return diagramModel.getDiagramCollection(); } @Override public String getLabel(){ return name; } @Override public DiagramModelUpdater getModelUpdater(){ return innerModelUpdater; } @Override public String toString(){ return name; } @Override public PrototypePersistenceDelegate getPrototypePersistenceDelegate(){ return prototypePersistenceDelegate; } @Override public Object clone(){ LocalDiagram clone = (LocalDiagram)super.clone(); clone.name = getName(); clone.nodes = getNodePrototypes(); clone.edges = getEdgePrototypes(); /* constructor with no args makes just a dummy wrapper */ clone.diagramModel = new DiagramModel<Node,Edge>(nodes,edges); clone.innerModelUpdater = clone.new InnerModelUpdater(); return clone; } private DiagramModel<Node,Edge> diagramModel; private InnerModelUpdater innerModelUpdater; private PrototypePersistenceDelegate prototypePersistenceDelegate; private String name; private Node[] nodes; private Edge[] edges; private class InnerModelUpdater implements DiagramModelUpdater { @Override public boolean getLock(DiagramModelTreeNode treeNode, Lock lock) { /* using a non shared diagram requires no actual lock, therefore the answer is always yes */ return true; } @Override public void yieldLock(DiagramModelTreeNode treeNode, Lock lock) {} @Override public void insertInCollection(DiagramElement element) { if(element instanceof Node) diagramModel.getDiagramCollection().insert((Node)element); else diagramModel.getDiagramCollection().insert((Edge)element); } @Override public void insertInTree(DiagramElement element) { if(element instanceof Node) diagramModel.getTreeModel().insertTreeNode((Node)element); else diagramModel.getTreeModel().insertTreeNode((Edge)element); } @Override public void takeOutFromCollection(DiagramElement element) { diagramModel.getDiagramCollection().takeOut(element); } @Override public void takeOutFromTree(DiagramElement element) { diagramModel.getDiagramCollection().takeOut(element); } @Override public void setName(DiagramElement element, String name) { element.setName(name); } @Override public void setNotes(DiagramModelTreeNode treeNode, String notes) { diagramModel.getTreeModel().setNotes(treeNode, notes); } @Override public void setProperty(Node node, String type, int index, String value) { node.setProperty(type, index, value); } @Override public void setProperties(Node node, NodeProperties properties) { node.setProperties(properties); } @Override public void clearProperties(Node node) { node.clearProperties(); } @Override public void addProperty(Node node, String type, String value) { node.addProperty(type, value); } @Override public void removeProperty(Node node, String type, int index) { node.removeProperty(type, index); } @Override public void setModifiers(Node node, String type, int index, Set<Integer> modifiers) { node.setModifierIndexes(type, index, modifiers); } @Override public void setEndLabel(Edge edge, Node node, String label) { edge.setEndLabel(node, label); } @Override public void setEndDescription(Edge edge, Node node, int index) { edge.setEndDescription(node, index); } @Override public void translate(GraphElement ge, Point2D p, double x, double y) { ge.translate(p, x, y); } @Override public void startMove(GraphElement ge, Point2D p) { ge.startMove(p); } @Override public void bend(Edge edge, Point2D p) { edge.bend(p); } @Override public void stopMove(GraphElement ge) { ge.stopMove(); } } } }