diff java/src/uk/ac/qmul/eecs/ccmi/gui/GraphPanel.java @ 3:9e67171477bc

PHANTOM Omni Heptic device release
author Fiore Martin <fiore@eecs.qmul.ac.uk>
date Wed, 25 Apr 2012 17:09:09 +0100
parents 9418ab7b7f3f
children d66dd5880081
line wrap: on
line diff
--- a/java/src/uk/ac/qmul/eecs/ccmi/gui/GraphPanel.java	Mon Feb 06 12:54:06 2012 +0000
+++ b/java/src/uk/ac/qmul/eecs/ccmi/gui/GraphPanel.java	Wed Apr 25 17:09:09 2012 +0100
@@ -24,9 +24,7 @@
 import java.awt.Dimension;
 import java.awt.Graphics;
 import java.awt.Graphics2D;
-import java.awt.event.ActionEvent;
 import java.awt.event.InputEvent;
-import java.awt.event.KeyEvent;
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
 import java.awt.event.MouseMotionAdapter;
@@ -40,19 +38,19 @@
 import java.util.ResourceBundle;
 import java.util.Set;
 
-import javax.swing.AbstractAction;
 import javax.swing.JOptionPane;
 import javax.swing.JPanel;
-import javax.swing.KeyStroke;
 
 import uk.ac.qmul.eecs.ccmi.diagrammodel.CollectionEvent;
 import uk.ac.qmul.eecs.ccmi.diagrammodel.CollectionListener;
 import uk.ac.qmul.eecs.ccmi.diagrammodel.CollectionModel;
 import uk.ac.qmul.eecs.ccmi.diagrammodel.ConnectNodesException;
 import uk.ac.qmul.eecs.ccmi.diagrammodel.DiagramElement;
-import uk.ac.qmul.eecs.ccmi.diagrammodel.DiagramModelTreeNode;
 import uk.ac.qmul.eecs.ccmi.diagrammodel.DiagramNode;
+import uk.ac.qmul.eecs.ccmi.diagrammodel.DiagramTreeNode;
 import uk.ac.qmul.eecs.ccmi.diagrammodel.ElementChangedEvent;
+import uk.ac.qmul.eecs.ccmi.network.Command;
+import uk.ac.qmul.eecs.ccmi.network.DiagramEventActionSource;
 import uk.ac.qmul.eecs.ccmi.utils.InteractionLog;
 
 /**
@@ -89,73 +87,6 @@
 
 		toolbar.addEdgeCreatedListener(new innerEdgeListener());
 
-		getInputMap(WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE,0),"delete");
-		getActionMap().put("delete", new AbstractAction(){
-			@Override
-			public void actionPerformed(ActionEvent evt) {
-				/* nothing selected DELETE key has no effect */
-				if(selectedElements.isEmpty())
-					return;
-				/* create a new Set to maintain iterator consistency as elementTakenOut will change selectedItems  */
-				HashSet<DiagramElement> iterationSet = new HashSet<DiagramElement>(selectedElements); 
-				HashSet<DiagramElement>alreadyLockedElements = new HashSet<DiagramElement>();
-				/* check which, of the selected elements, can be deleted and which ones are currently held by     *
-				 * other clients. If an element is locked it's removed from the list and put into a separated set */
-				for(Iterator<DiagramElement> itr=iterationSet.iterator(); itr.hasNext();){
-					DiagramElement  selected = itr.next();
-					if(!modelUpdater.getLock(selected, Lock.DELETE)){
-						itr.remove();
-						alreadyLockedElements.add(selected);
-					}
-				}
-				ResourceBundle resources = ResourceBundle.getBundle(EditorFrame.class.getName());
-				/* all the elements are locked by other clients */
-				if(iterationSet.isEmpty()){
-					iLog("Could not get lock on any selected element for deletion","");
-					JOptionPane.showMessageDialog(
-							JOptionPane.getFrameForComponent(GraphPanel.this), 
-							alreadyLockedElements.size() == 1 ? // singular vs plural 
-									resources.getString("dialog.lock_failure.delete") :
-										resources.getString("dialog.lock_failure.deletes"));
-					return;
-				}
-
-				String warning = "";
-				if(!alreadyLockedElements.isEmpty()){
-					StringBuilder builder = new StringBuilder(resources.getString("dialog.lock_failure.deletes_warning"));
-					for(DiagramElement alreadyLocked : alreadyLockedElements)
-						builder.append(alreadyLocked.getName()).append(' ');
-					warning = builder.append('\n').toString();
-					iLog("Could not get lock on some selected element for deletion",warning);
-				}
-
-				iLog("open delete dialog",warning);
-				int answer = JOptionPane.showConfirmDialog(
-						JOptionPane.getFrameForComponent(GraphPanel.this),
-						warning+resources.getString("dialog.confirm.deletions"), 
-						resources.getString("dialog.confirm.title"),
-						SpeechOptionPane.YES_NO_OPTION);
-				if(answer == JOptionPane.YES_OPTION){
-					/* the user chose to delete the elements, proceed (locks       *
-					 * will be automatically removed upon deletion by the server ) */
-					for(DiagramElement selected : iterationSet)
-						modelUpdater.takeOutFromCollection(selected);
-				}else{
-					/* the user chose not to delete the elements, release the acquired locks */
-					for(DiagramElement selected : iterationSet){
-						/* if it's a node all its attached edges were locked as well */
-						/*if(selected instanceof Node){ DONE IN THE SERVER
-						Node n = (Node)selected;
-						for(int i=0; i<n.getEdgesNum();i++){
-							modelUpdater.yieldLock(n.getEdgeAt(i), Lock.DELETE);
-						}
-					}*/
-						modelUpdater.yieldLock(selected, Lock.DELETE);
-					}
-					iLog("cancel delete node dialog","");
-				}
-			}});
-
 		/* 	---- COLLECTION LISTENER ----
 		 * Adding a collection listener. This listener reacts at changes in the model 
 		 * by any source, and thus the graph itself. Basically it refreshes the graph 
@@ -170,7 +101,7 @@
 				else
 					edges.add((Edge)element);
 				checkBounds(element,false);
-				if(e.getDiagramElement() instanceof Node && e.getSource().equals(model) ){ //FIXME change model into this model source changes 
+				if(e.getDiagramElement() instanceof Node && e.getSource().equals(DiagramEventSource.GRPH)){
 					setElementSelected(e.getDiagramElement());
 					dragMode = DRAG_NODE;
 				}
@@ -181,12 +112,12 @@
 			public void elementTakenOut(final CollectionEvent e) {
 				DiagramElement element = e.getDiagramElement(); 
 				if(element instanceof Node){
-					if(nodePopup != null && nodePopup.nodeRef.equals(element))
+					if(nodePopup != null && nodePopup.getElement().equals(element))
 						nodePopup.setVisible(false);
 					nodes.remove(element);
 				}
 				else{
-					if(edgePopup != null && edgePopup.edgeRef.equals(element))
+					if(edgePopup != null && edgePopup.getElement().equals(element))
 						edgePopup.setVisible(false);
 					edges.remove(element);
 				}
@@ -229,17 +160,17 @@
 						if( e.contains(mousePoint)){
 							Node extremityNode = e.getClosestNode(mousePoint,EDGE_END_MIN_CLICK_DIST);
 							if(extremityNode == null){ // click far from the attached nodes, only prompt with set name item
-								EdgePopupMenu pop = new EdgePopupMenu(e,GraphPanel.this,modelUpdater);
+								CCmIPopupMenu.EdgePopupMenu pop = new CCmIPopupMenu.EdgePopupMenu(e,GraphPanel.this,modelUpdater,selectedElements);
 								edgePopup = pop;
 								pop.show(GraphPanel.this, event.getX(), event.getY());
 							}else{ // click near an attached nodes, prompt for name change, set end label and select arrow head
-								EdgePopupMenu pop = new EdgePopupMenu(e,extremityNode,GraphPanel.this,modelUpdater);
+								CCmIPopupMenu.EdgePopupMenu pop = new CCmIPopupMenu.EdgePopupMenu(e,extremityNode,GraphPanel.this,modelUpdater,selectedElements);
 								edgePopup = pop;
 								pop.show(GraphPanel.this, event.getX(), event.getY());
 							}
 						}
 					}else if(n != null){
-						NodePopupMenu pop = new NodePopupMenu(n,GraphPanel.this,modelUpdater);
+						CCmIPopupMenu.NodePopupMenu pop = new CCmIPopupMenu.NodePopupMenu(n,GraphPanel.this,modelUpdater,selectedElements);
 						nodePopup = pop;
 						pop.show(GraphPanel.this, event.getX(), event.getY());
 					}else
@@ -249,10 +180,11 @@
 				/* - one click && palette == select - */
 				else if (tool == null){
 					if(n != null){ // node selected
-						if (isCtrl)
+						if (isCtrl){
 							addElementToSelection(n,false);
-						else
+						}else{
 							setElementSelected(n);
+						}
 						dragMode = DRAG_NODE;
 					}else if (e != null){ // edge selected
 						if (isCtrl){
@@ -260,7 +192,7 @@
 							dragMode = DRAG_NODE;
 						}else{
 							setElementSelected(e);
-							modelUpdater.startMove(e, mousePoint);
+							modelUpdater.startMove(e, mousePoint,DiagramEventSource.GRPH);
 							dragMode = DRAG_EDGE;
 						}
 					}else{  // nothing selected : make selection lasso
@@ -284,11 +216,11 @@
 						Rectangle2D bounds = newNode.getBounds();
 						/* perform the translation from the origin */
 						newNode.translate(new Point2D.Double(), mousePoint.getX() - bounds.getX(), 
-								mousePoint.getY() - bounds.getY());
+								mousePoint.getY() - bounds.getY(),DiagramEventSource.NONE);
 						/* log stuff */
 						iLog("insert node",""+((newNode.getId() == DiagramElement.NO_ID) ? "(no id)" : newNode.getId()));
 						/* insert the node into the model (no lock needed) */
-						modelUpdater.insertInCollection(newNode);
+						modelUpdater.insertInCollection(newNode,DiagramEventSource.GRPH);
 					}	
 				}
 
@@ -304,21 +236,31 @@
 						(event.getY()+minY)/zoom 
 				);
 				if(lastSelected != null){
-					if(lastSelected instanceof Node){
+					if(lastSelected instanceof Node || selectedElements.size() > 1){ // differentiate between translate and edge bending
 						if(wasMoving){
 							iLog("move selected stop",mousePoint.getX()+" "+ mousePoint.getY());
 							for(Object element : moveLockedElements){
-								modelUpdater.stopMove((GraphElement)element);
-								modelUpdater.yieldLock((DiagramModelTreeNode)element, Lock.MOVE);
+								modelUpdater.stopMove((GraphElement)element,DiagramEventSource.GRPH);
+								boolean isNode = element instanceof Node;
+								modelUpdater.yieldLock((DiagramTreeNode)element, 
+										Lock.MOVE,
+										new DiagramEventActionSource(
+												DiagramEventSource.GRPH, 
+												isNode ? Command.Name.STOP_NODE_MOVE : Command.Name.STOP_EDGE_MOVE,
+												((DiagramElement)element).getId(),((DiagramElement)element).getName()));
 							}
 							moveLockedElements.clear();
 						}
-					}else{ // instanceof Edge 
+					}else{ // instanceof Edge  && selectedelements.size() = 1. Bending
 						if(wasMoving){
 							iLog("bend edge stop",mousePoint.getX()+" "+ mousePoint.getY());
 							if(moveLockedEdge != null){
-								modelUpdater.stopMove(moveLockedEdge);
-								modelUpdater.yieldLock(moveLockedEdge, Lock.MOVE);
+								modelUpdater.stopMove(moveLockedEdge,DiagramEventSource.GRPH);
+								modelUpdater.yieldLock(moveLockedEdge, Lock.MOVE, new DiagramEventActionSource(
+										DiagramEventSource.GRPH,
+										Command.Name.BEND,
+										moveLockedEdge.getId(),
+										moveLockedEdge.getName()));
 								moveLockedEdge = null;
 							}
 						}
@@ -348,7 +290,14 @@
 						Iterator<DiagramElement> iterator = selectedElements.iterator();
 						while(iterator.hasNext()){
 							DiagramElement element = iterator.next(); 
-							if(modelUpdater.getLock(element, Lock.MOVE)){
+							boolean isNode = element instanceof Node;
+							if(modelUpdater.getLock(element, 
+									Lock.MOVE,
+									new DiagramEventActionSource(
+											DiagramEventSource.GRPH, 
+											isNode ? Command.Name.TRANSLATE_NODE : Command.Name.TRANSLATE_EDGE,
+											element.getId(),
+											element.getName()))){
 								moveLockedElements.add(element);
 							}else{
 								iLog("Could not get move lock for element",DiagramElement.toLogString(element));
@@ -360,21 +309,29 @@
 
 					for (DiagramElement selected : selectedElements){
 						if(selected instanceof Node)
-							modelUpdater.translate((Node)selected, lastMousePoint, dx, dy);
+							modelUpdater.translate((Node)selected, lastMousePoint, dx, dy,DiagramEventSource.GRPH);
 						else
-							modelUpdater.translate((Edge)selected, lastMousePoint, dx, dy);
+							modelUpdater.translate((Edge)selected, lastMousePoint, dx, dy,DiagramEventSource.GRPH);
 					}
 				} else if(dragMode == DRAG_EDGE){
 					if(!wasMoving){
 						wasMoving = true;
-						if(modelUpdater.getLock(lastSelected, Lock.MOVE))
+						if(modelUpdater.getLock(lastSelected, 
+								Lock.MOVE, 
+								new DiagramEventActionSource(
+										DiagramEventSource.GRPH, 
+										Command.Name.BEND,
+										lastSelected.getId(),
+										lastSelected.getName()))
+						){
 							moveLockedEdge = (Edge)lastSelected;
-						else
+						}else{
 							iLog("Could not get move lock for element",DiagramElement.toLogString(lastSelected));
+						}
 						iLog("bend edge start",mousePoint.getX()+" "+ mousePoint.getY());
 					}
 					if(moveLockedEdge != null)
-						modelUpdater.bend(moveLockedEdge, new Point2D.Double(mousePoint.getX(), mousePoint.getY()));
+						modelUpdater.bend(moveLockedEdge, new Point2D.Double(mousePoint.getX(), mousePoint.getY()),DiagramEventSource.GRPH);
 				} else if (dragMode == DRAG_LASSO){
 					double x1 = mouseDownPoint.getX();
 					double y1 = mouseDownPoint.getY();
@@ -698,7 +655,8 @@
 			}
 			try {
 				e.connect(nodesToConnect);
-				modelUpdater.insertInCollection(e);
+				/* perform the command, no lock is needed for inserting */
+				modelUpdater.insertInCollection(e,DiagramEventSource.GRPH);
 			} catch (ConnectNodesException cnEx) {
 				JOptionPane.showMessageDialog(GraphPanel.this,
 						cnEx.getLocalizedMessage(),
@@ -716,8 +674,8 @@
 
 	private Grid grid;
 	private GraphToolbar toolbar;
-	private NodePopupMenu nodePopup;
-	private EdgePopupMenu edgePopup;
+	private CCmIPopupMenu.NodePopupMenu nodePopup;
+	private CCmIPopupMenu.EdgePopupMenu edgePopup;
 
 	private double zoom;
 	private double gridSize;