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 Lesser General Public License (LGPL): http://www.gnu.org/licenses/
004    
005    package graphlab.plugins.main.core.actions;
006    
007    import graphlab.graph.event.EdgeEvent;
008    import graphlab.graph.event.GraphEvent;
009    import graphlab.graph.event.VertexEvent;
010    import graphlab.graph.graph.GraphModel;
011    import graphlab.graph.graph.VertexModel;
012    import graphlab.platform.core.BlackBoard;
013    import graphlab.platform.core.Listener;
014    import graphlab.platform.extension.BasicExtension;
015    import graphlab.plugins.main.GraphData;
016    
017    import java.awt.event.MouseEvent;
018    
019    /**
020     * @author Azin Azadi
021     */
022    public class MiddleClickAction implements BasicExtension, Listener {
023        BlackBoard b;
024        GraphData gd;
025    
026        public MiddleClickAction(BlackBoard b) {
027            this.b = b;
028            gd = new GraphData(b);
029            //listening to G/V/E events
030            b.addListener(VertexEvent.EVENT_KEY, this);
031            b.addListener(EdgeEvent.EVENT_KEY, this);
032            b.addListener(GraphEvent.EVENT_KEY, this);
033        }
034    
035        public void keyChanged(String key, Object value) {
036            if (key == VertexEvent.EVENT_KEY) {
037                VertexEvent ve = (VertexEvent) value;
038                if (ve.eventType == VertexEvent.CLICKED && ve.mouseBtn == MouseEvent.BUTTON2) {
039                    ve.v.setMark(!ve.v.getMark());
040                    GraphModel g = gd.getGraph();
041                    int di = ve.v.getMark() ? 1 : -1;
042                    for (VertexModel v : g.getNeighbors(ve.v)) {
043                        v.setColor(v.getColor() + di);
044                    }
045                }
046            }
047            if (key == EdgeEvent.EVENT_KEY) {
048                EdgeEvent ee = (EdgeEvent) value;
049                if (ee.eventType == EdgeEvent.CLICKED && ee.mouseBtn == MouseEvent.BUTTON2) {
050                    ee.e.setMark(!ee.e.getMark());
051                }
052            }
053            if (key == GraphEvent.EVENT_KEY) {
054                GraphEvent ge = (GraphEvent) value;
055                GraphModel g = ge.graph;
056                if (ge.eventType == GraphEvent.MOUSE_WHEEL_MOVED) {
057                    if (gd.select.isSelectionEmpty()) {
058                        if (ge.mouseWheelMoveAmount > 0)
059                            g.zoomIn();
060                        else
061                            g.zoomOut();
062                    } else {
063                        if (ge.mouseWheelMoveAmount > 0)
064                            gd.select.expandSelection();
065                        else
066                            for (VertexModel v : gd.select.getSelectedVertices()) {
067                                v.setColor((v.getColor() + 1) % 20);
068                            }
069                    }
070                }
071            }
072        }
073    
074    }