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    }