001 // GraphLab Project: http://graphlab.sharif.edu 002 // Copyright (C) 2008 Mathematical Science Department of Sharif University of Technology 003 // Distributed under the terms of the GNU General Public License (GPL): http://www.gnu.org/licenses/ 004 package graphlab.plugins.main.select; 005 006 import graphlab.graph.atributeset.GraphAttrSet; 007 import graphlab.graph.graph.*; 008 import graphlab.library.exceptions.InvalidVertexException; 009 import graphlab.platform.core.AbstractAction; 010 import graphlab.platform.core.BlackBoard; 011 import graphlab.plugins.commonplugin.undo.Undoable; 012 import graphlab.plugins.commonplugin.undo.UndoableActionOccuredData; 013 import graphlab.plugins.main.core.actions.vertex.DeleteVertex; 014 import graphlab.ui.UIUtils; 015 016 import java.awt.*; 017 import java.awt.event.KeyEvent; 018 import java.util.HashSet; 019 import java.util.Iterator; 020 import java.util.Vector; 021 022 /** 023 * User: root 024 */ 025 public class DeleteSelected extends AbstractAction implements Undoable { 026 public static final String event = UIUtils.getUIEventKey("delete selected"); 027 public static final String SELECTION_DELETED = "selection deleted"; 028 029 /** 030 * constructor 031 * 032 * @param bb the blackboard of the action 033 */ 034 public DeleteSelected(BlackBoard bb) { 035 super(bb); 036 listen4Event(event); 037 KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventPostProcessor(new KeyEventPostProcessor() { 038 public boolean postProcessKeyEvent(KeyEvent e) { 039 AbstractGraphRenderer gv = blackboard.getData(AbstractGraphRenderer.EVENT_KEY); 040 Component focusOwner = KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner(); 041 if (gv == focusOwner) { 042 if (e.getKeyCode() == KeyEvent.VK_DELETE) { 043 performAction(":d", null); 044 return true; 045 } 046 } 047 return false; 048 } 049 }); 050 051 } 052 053 public void performAction(String eventName, Object value) { 054 SubGraph selection = Select.getSelection(blackboard); 055 GraphModel g = blackboard.getData(GraphAttrSet.name); 056 if (selection.edges.isEmpty() && selection.vertices.isEmpty()) 057 return; 058 UndoableActionOccuredData uaod = new UndoableActionOccuredData(this); 059 060 HashSet<EdgeModel> edges = new HashSet<EdgeModel>(); 061 for (EdgeModel e : selection.edges) { 062 edges.add(e); 063 } 064 HashSet<VertexModel> vertices = new HashSet<VertexModel>(); 065 for (VertexModel v : selection.vertices) { 066 vertices.add(v); 067 } 068 uaod.properties.put("DeletedEdges", edges); 069 uaod.properties.put("DeletedVertices", vertices); 070 uaod.properties.put("Graph", g); 071 072 for (EdgeModel e : selection.edges) 073 g.removeEdge(e); 074 Vector<EdgeModel> ed = new Vector<EdgeModel>(); 075 for (VertexModel v : selection.vertices) { 076 Iterator<EdgeModel> ie = g.edgeIterator(v); 077 while (ie.hasNext()) { 078 ed.add(ie.next()); 079 } 080 // for (Edge e : v.control) 081 // ed.add(e); 082 DeleteVertex.doJob(g, v); 083 } 084 uaod.properties.put("RelatedEdges", ed); 085 blackboard.setData(Select.EVENT_KEY, new SubGraph()); 086 blackboard.setData(UndoableActionOccuredData.EVENT_KEY, uaod); 087 088 ClearSelection.clearSelected(blackboard); 089 090 } 091 092 093 public void undo(UndoableActionOccuredData uaod) { 094 GraphModel g = (GraphModel) uaod.properties.get("Graph"); 095 096 for (VertexModel v : (HashSet<VertexModel>) uaod.properties.get("DeletedVertices")) { 097 g.insertVertex(v); 098 Vector<EdgeModel> ed = (Vector<EdgeModel>) uaod.properties.get("RelatedEdges"); 099 for (EdgeModel e : ed) { 100 g.insertEdge(e); 101 } 102 } 103 for (EdgeModel e : (HashSet<EdgeModel>) uaod.properties.get("DeletedEdges")) { 104 g.insertEdge(e); 105 } 106 107 } 108 109 public void redo(UndoableActionOccuredData uaod) { 110 GraphModel g = (GraphModel) uaod.properties.get("Graph"); 111 112 for (VertexModel v : (HashSet<VertexModel>) uaod.properties.get("DeletedVertices")) { 113 g.removeVertex(v); 114 } 115 for (EdgeModel e : (HashSet<EdgeModel>) uaod.properties.get("DeletedEdges")) { 116 try { 117 g.removeEdge(e); 118 } catch (InvalidVertexException ee) { 119 120 } 121 } 122 123 } 124 }