Mercurial > hg > ccmieditor
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;