// GraphTea Project: http://github.com/graphtheorysoftware/GraphTea
// Copyright (C) 2012 Graph Theory Software Foundation: http://GraphTheorySoftware.com
// Copyright (C) 2008 Mathematical Science Department of Sharif University of Technology
// Distributed under the terms of the GNU General Public License (GPL): http://www.gnu.org/licenses/
package graphtea.plugins.main.select;
import graphtea.graph.graph.Edge;
import graphtea.graph.graph.SubGraph;
import graphtea.graph.graph.Vertex;
import graphtea.platform.core.AbstractAction;
import graphtea.platform.core.BlackBoard;
import graphtea.plugins.main.core.actions.edge.EdgeSelectData;
import graphtea.plugins.main.core.actions.vertex.VertexSelectData;
import java.awt.*;
/**
* Author: Azin Azadi
*/
public class Select extends AbstractAction {
private boolean deSelectOlderSelections = true;
private boolean invertOlderSelections;
public static final String EVENT_KEY = "graph selected V and E";
/**
* constructor
*
* @param bb the blackboard of the action
*/
public Select(BlackBoard bb) {
super(bb);
listen4Event(VertexSelectData.EVENT_KEY);
listen4Event(EdgeSelectData.EVENT_KEY);
blackboard.setData(EVENT_KEY, new SubGraph());
KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventPostProcessor(e -> {
deSelectOlderSelections = true;
invertOlderSelections = false;
if (e.isControlDown())
deSelectOlderSelections = false;
if (e.isShiftDown())
invertOlderSelections = true; //not yet implemented //todo: implement
return false;
});
}
public void track(){}
public void performAction(String eventName, Object value) {
if (eventName == VertexSelectData.EVENT_KEY) {
selectVertex();
}
if (eventName == EdgeSelectData.EVENT_KEY)
selectEdge();
}
public static SubGraph getSelection(BlackBoard blackboard) {
return blackboard.getData(EVENT_KEY);
}
public static void setSelection(BlackBoard blackboard, SubGraph sg) {
blackboard.setData(EVENT_KEY, sg);
}
private void selectEdge() {
EdgeSelectData esd = blackboard.getData(EdgeSelectData.EVENT_KEY);
SubGraph sd = getSelection(blackboard);
Edge e = esd.edge;
if (deSelectOlderSelections) {
sd.edges.clear();
sd.vertices.clear();
sd.edges.add(e);
} else {
if (sd.edges.contains(e)) {
sd.edges.remove(e);
} else
sd.edges.add(e);
}
blackboard.setData(EVENT_KEY, sd);
}
private void selectVertex() {
VertexSelectData vsd = blackboard.getData(VertexSelectData.EVENT_KEY);
SubGraph sd = getSelection(blackboard);
Vertex v = vsd.v;
if (deSelectOlderSelections) {
sd.edges.clear();
sd.vertices.clear();
sd.vertices.add(v);
} else {
if (sd.vertices.contains(v)) {
sd.vertices.remove(v);
} else
sd.vertices.add(v);
}
blackboard.setData(EVENT_KEY, sd);
}
}