📄 graphconstructionpanel.java
字号:
embedderThread.stopEmbedding();
embedderThread.join();
embedderThread = null;
}
removeEdge(edge);
embedder = new SpringEmbedder(semanticObjects, semanticRelations);
embedGraph();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
/**
* Use when embedder is stoppeg, eg. from inside removeNode()
*
* @param edge
*/
private void removeEdge(LabeledEdge edge) {
semanticRelations.remove(edge);
// embedder = new SpringEmbedder(semanticObjects, semanticRelations);
// embedGraph();
}
public void addRelation(String label, LabeledNode src, LabeledNode tgt) {
semanticRelations.add(new LabeledEdge(src, tgt, label));
embedder = new SpringEmbedder(semanticObjects, semanticRelations);
embedGraph();
}
public void addRelation(String label, String src, String tgt) {
semanticRelations.add(new LabeledEdge(label2Node.get(src), label2Node.get(tgt), label));
embedder = new SpringEmbedder(semanticObjects, semanticRelations);
embedGraph();
}
public void embedGraph() {
if (embedderThread != null) {
embedderThread.stopEmbedding();
try {
embedderThread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if (semanticObjects.size() > 3) {
embedderThread = new EmbedderThread(embedder, this);
embedderThread.start();
} else
repaint();
}
/**
* Invoked when the mouse button has been clicked (pressed
* and released) on a component.
*/
public void mouseClicked(MouseEvent e) {
if ((e.getButton() == MouseEvent.BUTTON2) || (e.getButton() == MouseEvent.BUTTON3 && e.isAltDown())) {
double x = e.getPoint().x;
double y = e.getPoint().y;
// check for nodes ...
for (Iterator<Point2D.Double> iterator = point2node.keySet().iterator(); iterator.hasNext();) {
Point2D.Double p = iterator.next();
if (Math.abs(p.x - x) <= 10 && Math.abs(p.y - y) <= 10) {
removeNode(point2node.get(p).getLabel());
}
}
// check for relations:
LabeledEdge toRemove = null;
for (Iterator<Arrow> iterator = shape2edge.keySet().iterator(); iterator.hasNext();) {
Arrow arrow = iterator.next();
if (arrow.contains(e.getPoint())) {
toRemove = shape2edge.get(arrow);
}
}
if (toRemove != null) removeRelation(toRemove);
} else if (e.getButton() == MouseEvent.BUTTON3) {
double x = e.getPoint().x;
double y = e.getPoint().y;
// check for nodes ...
for (Iterator<Point2D.Double> iterator = point2node.keySet().iterator(); iterator.hasNext();) {
Point2D.Double p = iterator.next();
if (Math.abs(p.x - x) <= 10 && Math.abs(p.y - y) <= 10) {
currentNode = point2node.get(p);
JPopupMenu menu = new JPopupMenu();
java.util.List<String> nodes = getNodes(currentNode.getLabel());
for (Iterator<String> it = nodes.iterator(); it.hasNext();) {
String label = it.next();
JMenuItem menuItem = new JMenuItem(label);
menuItem.addActionListener(this);
menuItem.setActionCommand("setLabel|" + label);
menu.add(menuItem);
}
if (nodes.size() > 0) menu.show(e.getComponent(), e.getX(), e.getY());
}
}
}
}
/**
* Invoked when a mouse button has been pressed on a component.
*/
public void mousePressed(MouseEvent e) {
if (e.getButton() == MouseEvent.BUTTON1) {
lastClickedLabel = null;
lastClickedPoint = null;
double x = e.getPoint().x;
double y = e.getPoint().y;
for (Iterator<Point2D.Double> iterator = point2node.keySet().iterator(); iterator.hasNext();) {
Point2D.Double p = iterator.next();
if (Math.abs(p.x - x) <= 10 && Math.abs(p.y - y) <= 10) {
lastClickedLabel = point2node.get(p).getLabel();
lastClickedPoint = p;
}
}
}
}
/**
* Invoked when a mouse button has been released on a component.
*/
public void mouseReleased(MouseEvent e) {
if (e.getButton() == MouseEvent.BUTTON1) {
double x = e.getPoint().x;
double y = e.getPoint().y;
String tgtLabel = null;
for (Iterator<Point2D.Double> iterator = point2node.keySet().iterator(); iterator.hasNext();) {
Point2D.Double p = iterator.next();
if (Math.abs(p.x - x) <= 10 && Math.abs(p.y - y) <= 10) {
tgtLabel = point2node.get(p).getLabel();
if (!tgtLabel.equals(lastClickedLabel)) {
// add new Relation:
Object label = JOptionPane.showInputDialog(this, "Please specify relation:", "Add semantic relation",
JOptionPane.PLAIN_MESSAGE, null, relationArray, relationArray[0]);
addRelation(label.toString(), lastClickedLabel, tgtLabel);
}
}
}
lastClickedLabel = null;
lastClickedPoint = null;
lastDraggedLine = null;
repaint();
}
}
/**
* Invoked when the mouse enters a component.
*/
public void mouseEntered(MouseEvent e) {
}
/**
* Invoked when the mouse exits a component.
*/
public void mouseExited(MouseEvent e) {
}
/**
* Invoked when a mouse button is pressed on a component and then
* dragged. <code>MOUSE_DRAGGED</code> events will continue to be
* delivered to the component where the drag originated until the
* mouse button is released (regardless of whether the mouse position
* is within the bounds of the component).
* <p/>
* Due to platform-dependent Drag&Drop implementations,
* <code>MOUSE_DRAGGED</code> events may not be delivered during a native
* Drag&Drop operation.
*/
public void mouseDragged(MouseEvent e) {
lastDraggedLine = null;
if (lastClickedLabel != null && lastClickedPoint != null) {
lastDraggedLine = new Line2D.Double(e.getPoint(), lastClickedPoint);
repaint();
}
}
/**
* Invoked when the mouse cursor has been moved onto a component
* but no buttons have been pushed.
*/
public void mouseMoved(MouseEvent e) {
}
/**
* Creates the search string for searching in the graph list.
* @return
*/
public String getSearchString() {
StringBuilder sb = new StringBuilder(64);
int count = 1;
HashMap<String, Integer> label2position = new HashMap<String, Integer>(semanticObjects.size());
for (Iterator<LabeledNode> iterator = semanticObjects.iterator(); iterator.hasNext();) {
LabeledNode node = iterator.next();
String label = node.getLabel();
// for emir: replace all numbers, which are in brackets :)
label = label.replaceAll(" \\x28\\d\\x29", "");
sb.append('[');
sb.append(label);
sb.append(']');
sb.append(' ');
label2position.put(node.getLabel(), count);
count++;
}
for (Iterator<LabeledEdge> iterator = semanticRelations.iterator(); iterator.hasNext();) {
LabeledEdge edge = iterator.next();
// sb.append('[');
String label = edge.getLabel();
if (label.indexOf('*') > -1) label = "\\w*";
sb.append(label);
sb.append(' ');
LabeledNode src = (LabeledNode) edge.getStartNode();
sb.append(label2position.get(src.getLabel()));
sb.append(' ');
LabeledNode tgt = (LabeledNode) edge.getEndNode();
sb.append(label2position.get(tgt.getLabel()));
// sb.append(']');
sb.append(' ');
}
return sb.toString().trim();
}
/**
* simple method to create a search string for searching within the 2-path index.
* @return
*/
public String getPathSearchString() {
StringBuilder sb = new StringBuilder(256);
int count = 1;
HashMap<String, Integer> label2position = new HashMap<String, Integer>(semanticObjects.size());
for (Iterator<LabeledNode> iterator = semanticObjects.iterator(); iterator.hasNext();) {
LabeledNode node = iterator.next();
String label = node.getLabel();
if (label.startsWith(GraphSearchPanel.ANONYMOUS_NODE_NAME)) {
label = "*";
}
// for emir: replace all numbers, which are in brackets :)
label = label.replaceAll(" \\x28\\d\\x29", "");
sb.append('[');
sb.append(label);
sb.append(']');
sb.append(' ');
label2position.put(node.getLabel(), count);
count++;
}
for (Iterator<LabeledEdge> iterator = semanticRelations.iterator(); iterator.hasNext();) {
LabeledEdge edge = iterator.next();
String label = edge.getLabel();
if (label.indexOf("*") > -1) label = "*";
sb.append(label);
sb.append(' ');
LabeledNode src = (LabeledNode) edge.getStartNode();
sb.append(label2position.get(src.getLabel()));
sb.append(' ');
LabeledNode tgt = (LabeledNode) edge.getEndNode();
sb.append(label2position.get(tgt.getLabel()));
sb.append(' ');
}
return sb.toString().trim();
}
public java.util.List<String> getNodes(String label) {
if (retrievalEngine == null) {
retrievalEngine = (LuceneRetrievalEngine) RetrievalEngineFacotry.getLuceneRetrievalEngine();
}
java.util.List<String> result = new LinkedList<String>();
java.util.List<Node> nodeList = retrievalEngine.getNodes(label, RetrievalFrame.BASE_DIRECTORY);
for (Iterator<Node> iterator = nodeList.iterator(); iterator.hasNext();) {
Node node = iterator.next();
result.add(node.getLabel());
}
return result;
}
/**
* Invoked when an action occurs.
*/
public void actionPerformed(ActionEvent e) {
String cmd = e.getActionCommand();
if (cmd.startsWith("setLabel|")) {
String newLabel = cmd.substring("setLabel|".length());
// remove old node in label table
label2Node.remove(currentNode.getLabel());
// add it with new label:
newLabel = "\""+ newLabel + "\"";
label2Node.put(newLabel, currentNode);
currentNode.setLabel(newLabel);
repaint();
}
}
}
class EmbedderThread extends Thread {
private SpringEmbedder embedder;
private boolean embedderRunning = true;
private JPanel parent;
public EmbedderThread(SpringEmbedder embedder, JPanel parent) {
this.embedder = embedder;
this.parent = parent;
}
public void run() {
while (embedderRunning && embedder.step() > 0) {
parent.repaint();
try {
sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
// Thread.currentThread().wait(40);
}
}
public void stopEmbedding() {
embedderRunning = false;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -