www.pudn.com > Caliph_v0.9.13+Emirv0.8.5-src.zip > BeePanel.java
/*
* This file is part of Caliph & Emir.
*
* Caliph & Emir is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* Caliph & Emir is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Caliph & Emir; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Copyright statement:
* --------------------
* (c) 2002-2004 by Mathias Lux (mathias@juggle.at) and the Know-Center Graz
* Inffeldgasse 21a, 8010 Graz, Austria
* http://www.know-center.at
*/
package at.know.center.wv_wr.imb.objectcatalog.semanticscreator;
import static java.lang.Thread.sleep;
import at.know.center.wv_wr.imb.objectcatalog.OCToolkit;
import at.know.center.wv_wr.imb.objectcatalog.mpeg7tools.Mpeg7FileFilter;
import at.know.center.wv_wr.imb.objectcatalog.mpeg7tools.XMLFileFilter;
import at.lux.fotoannotation.utils.TextChangesListener;
import at.lux.grapviz.*;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.Namespace;
import org.jdom.input.SAXBuilder;
import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.filechooser.FileFilter;
import java.awt.*;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.dnd.DropTarget;
import java.awt.dnd.DropTargetAdapter;
import java.awt.dnd.DropTargetDropEvent;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.*;
import java.util.List;
public class BeePanel extends JPanel implements ActionListener {
private LinkedList running = new LinkedList();
private Vector objects, relations;
private SemanticObjectRepresentation draggingObject, highlightedObject;
private SemanticRelationRepresentation highlightedRelation;
private Point pressedAt;
private Point offset, clickedAt, startRel, endRel;
// Logger logger = Logger.getLogger(BeePanel.class);
private int state;
private JPopupMenu menu;
private JMenuItem addObject, remObject, remRelation, distributeElements, cascadeElements, importFile, about, embedElements;
private BeeDataExchange parent;
private BufferedImage logo, background;
private DropTarget dt;
public BeePanel(BeeDataExchange parent) {
super();
this.parent = parent;
dt = new DropTarget(this, new DropTargetAdapter() {
public void drop(DropTargetDropEvent dtde) {
Point p = dtde.getLocation();
Transferable t = dtde.getTransferable();
try {
String s = (String) t.getTransferData(DataFlavor.stringFlavor);
addObjectFromDND(p, s.trim());
} catch (UnsupportedFlavorException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
});
// this.addKeyListener(new KeyAdapter() {
// /**
// * Invoked when a key has been typed.
// * This event occurs when a key press is followed by a key release.
// */
// public void keyTyped(KeyEvent e) {
// // Wird ENTFERNEN gedrückt, so werden alle markierten
// // Elemente gelöscht :)
// System.out.println("pressed: " + e.getKeyCode());
// if (e.getKeyCode() == KeyEvent.VK_DELETE) {
// }
// }
// });
this.setDropTarget(dt);
try {
logo = ImageIO.read(BeePanel.class.getResource("logo.png"));
} catch (Exception ioex) {
ioex.printStackTrace();
}
this.setDoubleBuffered(true);
objects = new Vector();
relations = new Vector();
draggingObject = null;
highlightedObject = null;
highlightedRelation = null;
pressedAt = null;
menu = new JPopupMenu();
addObject = new JMenuItem("add object");
addObject.setActionCommand("addObject");
addObject.addActionListener(this);
remObject = new JMenuItem("remove object");
remObject.addActionListener(this);
remObject.setActionCommand("remObject");
JMenuItem remMarkedObject = new JMenuItem("remove marked objects");
remMarkedObject.addActionListener(this);
remMarkedObject.setActionCommand("remMarked");
remRelation = new JMenuItem("remove relation");
remRelation.addActionListener(this);
remRelation.setActionCommand("remRelation");
cascadeElements = new JMenuItem("cascade elements");
cascadeElements.addActionListener(this);
cascadeElements.setActionCommand("cascade");
distributeElements = new JMenuItem("distribute elements");
distributeElements.addActionListener(this);
distributeElements.setActionCommand("distribute");
embedElements = new JMenuItem("embed elements");
embedElements.addActionListener(this);
embedElements.setActionCommand("embed");
importFile = new JMenuItem("import description ...");
importFile.addActionListener(this);
importFile.setActionCommand("import");
about = new JMenuItem("About ...");
about.addActionListener(this);
about.setActionCommand("about");
// menu.add(addObject);
menu.add(remObject);
menu.add(remMarkedObject);
// menu.addSeparator();
menu.add(remRelation);
menu.addSeparator();
menu.add(cascadeElements);
menu.add(distributeElements);
menu.add(embedElements);
menu.add(importFile);
menu.addSeparator();
menu.add(about);
this.addComponentListener(new ComponentAdapter() {
public void componentResized(ComponentEvent e) {
background = null;
super.componentResized(e);
}
});
this.addMouseMotionListener(new MouseMotionAdapter() {
public void mouseMoved(MouseEvent e) {
checkIfIsInObject(e.getPoint());
repaint();
}
public void mouseDragged(MouseEvent e) {
if (pressedAt != null && draggingObject != null) {
Point p = draggingObject.getP();
p.setLocation(e.getPoint().x + offset.x, e.getPoint().y + offset.y);
if (e.getPoint().x > 0 && e.getPoint().y > 0 && e.getPoint().x < getWidth() && e.getPoint().y < getHeight())
draggingObject.setP(p);
} else if (startRel != null) {
endRel = e.getPoint();
}
checkIfIsInObject(e.getPoint());
repaint();
}
});
this.addMouseListener(new BeePanelMouseAdapter());
background = null;
}
protected void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
if (!(background != null))
background = generateBackground();
g2.clearRect(0, 0, this.getWidth(), this.getHeight());
g2.drawImage(background, 0, 0, this);
g2.setFont(Font.decode("Verdana-10"));
for (Iterator it = objects.iterator(); it.hasNext();) {
SemanticObjectRepresentation sem = (SemanticObjectRepresentation) it.next();
sem.drawObject(g2);
}
for (Iterator iterator = relations.iterator(); iterator.hasNext();) {
SemanticRelationRepresentation relation = (SemanticRelationRepresentation) iterator.next();
relation.drawRelation(g2);
}
if (startRel != null && endRel != null) {
g2.drawLine(startRel.x, startRel.y, endRel.x, endRel.y);
}
}
public void addObject(Point p) {
String label = JOptionPane.showInputDialog("Please give a name for the new object:");
objects.add(new SemanticObjectRepresentation(p, label));
TextChangesListener.getInstance().fireDataChanged();
repaint();
embedElements();
}
public void addObject(Point p, String label) {
objects.add(new SemanticObjectRepresentation(p, label));
TextChangesListener.getInstance().fireDataChanged();
repaint();
embedElements();
}
public void addObject(Point p, Element node) {
objects.add(new SemanticObjectRepresentation(p, node));
TextChangesListener.getInstance().fireDataChanged();
repaint();
embedElements();
}
private void checkIfIsInObject(Point p) {
highlightedObject = null;
highlightedRelation = null;
for (Iterator iterator = objects.iterator(); iterator.hasNext();) {
SemanticObjectRepresentation sem = (SemanticObjectRepresentation) iterator.next();
if (sem.checkIfInside(p)) {
highlightedObject = sem;
}
}
for (Iterator iterator = relations.iterator(); iterator.hasNext();) {
SemanticRelationRepresentation rel = (SemanticRelationRepresentation) iterator.next();
if (rel.contains(p)) {
highlightedRelation = rel;
}
}
}
private void checkIfPressedInObject(Point p) {
for (Iterator iterator = objects.iterator(); iterator.hasNext();) {
SemanticObjectRepresentation sem = (SemanticObjectRepresentation) iterator.next();
if (sem.checkIfInside(p)) {
draggingObject = sem;
offset = new Point(sem.getP().x - pressedAt.x, sem.getP().y - pressedAt.y);
}
}
}
private void showMenu(int x, int y) {
if (highlightedObject != null)
remObject.setEnabled(true);
else
remObject.setEnabled(false);
if (highlightedRelation != null)
remRelation.setEnabled(true);
else
remRelation.setEnabled(false);
menu.show(this, x, y);
}
private void remObject(Point p) {
Object toremove = null;
for (Iterator iterator = objects.iterator(); iterator.hasNext();) {
SemanticObjectRepresentation sem = (SemanticObjectRepresentation) iterator.next();
if (sem.checkIfInside(p)) {
toremove = sem;
}
}
if (toremove != null) {
Vector rem = new Vector();
for (Iterator iterator = relations.iterator(); iterator.hasNext();) {
SemanticRelationRepresentation rel = (SemanticRelationRepresentation) iterator.next();
if (rel.getSource().equals(toremove) || rel.getTarget().equals(toremove)) {
rem.add(rel);
}
}
objects.remove(toremove);
for (Iterator iterator = rem.iterator(); iterator.hasNext();) {
relations.remove(iterator.next());
}
TextChangesListener.getInstance().fireDataChanged();
}
}
private void remRelation(Point p) {
if (highlightedRelation != null) {
relations.remove(highlightedRelation);
TextChangesListener.getInstance().fireDataChanged();
}
}
private void addRelation(SemanticObjectRepresentation src, SemanticObjectRepresentation target) {
Object label = JOptionPane.showInputDialog(this, "Please specify relation:", "Add semantic relation",
JOptionPane.PLAIN_MESSAGE, null, parent.getRelations(), parent.getRelations()[0]);
if (label != null) {
relations.add(new SemanticRelationRepresentation(src, target, label.toString()));
TextChangesListener.getInstance().fireDataChanged();
embedElements();
}
}
private void addRelation(SemanticObjectRepresentation src, SemanticObjectRepresentation target, String label) {
relations.add(new SemanticRelationRepresentation(src, target, label));
TextChangesListener.getInstance().fireDataChanged();
embedElements();
}
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equals("addObject")) {
addObject(clickedAt);
} else if (e.getActionCommand().equals("remObject")) {
remObject(clickedAt);
} else if (e.getActionCommand().equals("remMarked")) {
removeMarkedElements();
} else if (e.getActionCommand().equals("remRelation")) {
remRelation(clickedAt);
} else if (e.getActionCommand().equals("cascade")) {
cascadeElements();
} else if (e.getActionCommand().equals("about")) {
showAbout();
} else if (e.getActionCommand().equals("distribute")) {
distributeElements();
} else if (e.getActionCommand().equals("embed")) {
embedElements();
} else if (e.getActionCommand().equals("import")) {
importFile();
} else if (e.getActionCommand().startsWith("addVenue-")) {
// System.out.println(e.getActionCommand());
String label = e.getActionCommand().substring(9);
Vector a = parent.getPossibleObjects();
for (Iterator i = a.iterator(); i.hasNext();) {
Element elem = (Element) i.next();
if (elem.getChild("Label", elem.getNamespace()).getChildText("Name", elem.getNamespace()).equals(label))
addObject(new Point(10, 10), elem);
}
}
}
private void checkIfNewRelation() {
SemanticObjectRepresentation src = null;
SemanticObjectRepresentation tgt = null;
for (Iterator iterator = objects.iterator(); iterator.hasNext();) {
SemanticObjectRepresentation sem = (SemanticObjectRepresentation) iterator.next();
if (sem.checkIfInside(startRel))
src = sem;
if (sem.checkIfInside(endRel))
tgt = sem;
}
if (src != null && tgt != null) addRelation(src, tgt);
}
private void cascadeElements() {
int x = 30, y = 30;
for (Iterator iterator = objects.iterator(); iterator.hasNext();) {
SemanticObjectRepresentation sem = (SemanticObjectRepresentation) iterator.next();
Point p = sem.getP();
p.setLocation(x, y);
sem.setP(p);
x += 40;
y += 40;
}
}
private BufferedImage generateBackground() {
BufferedImage tmp = new BufferedImage(this.getWidth(), this.getHeight(), BufferedImage.TYPE_INT_RGB);
Graphics2D g2 = (Graphics2D) tmp.getGraphics();
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2.setColor(Color.black);
g2.fillRect(0, 0, this.getWidth(), this.getHeight());
g2.setColor(new Color(152, 181, 255));
g2.fillRect(2, 2, this.getWidth() - 4, this.getHeight() - 4);
// draw Help:
g2.setColor(Color.black);
g2.setFont(g2.getFont().deriveFont(Font.ITALIC, 10f));
g2.drawString("Help:", 10, this.getHeight() - 38);
g2.drawString("Drag and drop objects from the tables on the right hand side.", 10, this.getHeight() - 24);
g2.drawString("+ or to draw relations.", 10, this.getHeight() - 10);
g2.drawImage(logo, this.getWidth() - logo.getWidth() - 11, this.getHeight() - logo.getHeight() - 11, this);
return tmp;
}
/**
* creates a MPEG-7 representation of the created or edited semantic description and returns it
*
* @return the MPEG-7 Document of the created semantic description
*/
public Document createDocument() {
Namespace mpeg7 = Namespace.getNamespace("", "urn:mpeg:mpeg7:schema:2001");
Namespace xsi = Namespace.getNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance");
Namespace fsw = OCToolkit.getFSWNamespace();
Element root = new Element("Mpeg7", mpeg7);
root.setAttribute("schemaLocation", "urn:mpeg:mpeg7:schema:2001 Mpeg7-2001.xsd http://www.at.know-center.at/fsw Know-soccer.xsd", xsi);
root.addNamespaceDeclaration(mpeg7);
root.addNamespaceDeclaration(xsi);
root.addNamespaceDeclaration(fsw);
Document d = new Document(root);
// Description
Element description = new Element("Description", mpeg7);
description.setAttribute("type", "SemanticDescriptionType", xsi);
root.addContent(description);
// Semantics
Element semantics = new Element("Semantics", mpeg7);
semantics.addContent(new Element("Label", mpeg7).addContent(new Element("Name", mpeg7).addContent("")));
description.addContent(semantics);
Hashtable h = new Hashtable();
int count = 0;
for (Iterator iterator = objects.iterator(); iterator.hasNext();) {
SemanticObjectRepresentation r = (SemanticObjectRepresentation) iterator.next();
count++;
String id = "id_" + count;
h.put(r, id);
Element node = (Element) r.getNode().clone();
node.setAttribute("id", id);
semantics.addContent(node);
}
Element graph = new Element("Graph", mpeg7);
for (Iterator it = relations.iterator(); it.hasNext();) {
SemanticRelationRepresentation r = (SemanticRelationRepresentation) it.next();
Element tmpElement = new Element("Relation", mpeg7);
tmpElement.setAttribute("type", "urn:mpeg:mpeg7:cs:SemanticRelationCS:2001:" + r.getLabel());
tmpElement.setAttribute("source", "#" + (String) h.get(r.getSource()));
tmpElement.setAttribute("target", "#" + (String) h.get(r.getTarget()));
graph.addContent(tmpElement);
}
semantics.addContent(graph);
return d;
}
/**
* Creates list of all names of semantic agents currently attached to the
* semantic description.
*
* @return list of names
*/
public String[] getSemanticAgentsNames() {
return getObjectNamesOfType("AgentObjectType");
}
/**
* Creates list of all names of semantic events currently attached to the
* semantic description.
*
* @return list of names
*/
public String[] getSemanticEventsNames() {
return getObjectNamesOfType("EventType");
}
/**
* Creates list of all names of semantic times currently attached to the
* semantic description.
*
* @return list of names
*/
public String[] getSemanticTimesNames() {
return getObjectNamesOfType("SemanticTimeType");
}
/**
* Creates list of all names of semantic places currently attached to the
* semantic description.
*
* @return list of names
*/
public String[] getSemanticPlacesNames() {
return getObjectNamesOfType("SemanticPlaceType");
}
private String[] getObjectNamesOfType(String type) {
Namespace xsi;
xsi = Namespace.getNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance");
String[] result;
LinkedList l = new LinkedList();
for (Iterator iterator = objects.iterator(); iterator.hasNext();) {
SemanticObjectRepresentation r = (SemanticObjectRepresentation) iterator.next();
Element elem = r.getNode();
if (elem.getAttribute("type", xsi).getValue().startsWith(type)) {
l.add(r.getLabel());
}
}
result = new String[l.size()];
int i = 0;
for (Iterator iterator = l.iterator(); iterator.hasNext();) {
String s = iterator.next();
result[i] = s;
i++;
}
return result;
}
public void importNode(Element node) {
Namespace mpeg7 = Namespace.getNamespace("", "urn:mpeg:mpeg7:schema:2001");
if (node.getChild("SemanticBase", mpeg7) != null) { // are there any useable elements?
// simply add all Elements ...
objects.removeAllElements();
relations.removeAllElements();
java.util.List oList = node.getChildren("SemanticBase", mpeg7);
for (Iterator i = oList.iterator(); i.hasNext();) {
Element e = (Element) i.next();
SemanticObjectRepresentation sor = new SemanticObjectRepresentation(new Point(10, 10), e);
objects.add(sor);
}
// now create the graph ...
if (node.getChild("Graph", node.getNamespace()) != null) {
if (node.getChild("Graph", node.getNamespace()).getChild("Relation", node.getNamespace()) != null) {
oList = node.getChild("Graph", node.getNamespace()).getChildren("Relation", node.getNamespace());
for (Iterator i = oList.iterator(); i.hasNext();) {
Element e = (Element) i.next();
String src = e.getAttributeValue("source");
String tgt = e.getAttributeValue("target");
String rel = e.getAttributeValue("type");
// logger.debug("Searching for relation source=" + src + ", target=" + tgt + ", relation=" + rel);
SemanticObjectRepresentation sort = null, sors = null;
if (rel != null && rel.lastIndexOf(":") > -1) {
rel = rel.substring(rel.lastIndexOf(":") + 1);
} else {
// logger.error("Import: no relation found");
}
if (src != null && tgt != null) {
src = src.substring(1);
tgt = tgt.substring(1);
for (Iterator it = objects.iterator(); it.hasNext();) {
SemanticObjectRepresentation rep = (SemanticObjectRepresentation) it.next();
String oID = rep.getNode().getAttributeValue("id");
if (oID.equals(tgt)) {
sort = rep;
}
if (oID.equals(src)) {
sors = rep;
}
}
} else {
// logger.error("Import: no source or target found");
}
if (sort != null && sors != null && rel != null) {
SemanticRelationRepresentation srr = new SemanticRelationRepresentation(sors, sort, rel);
relations.add(srr);
} else {
// logger.error("Import: Could not import: " + e.toString());
}
}
}
}
distributeElements();
repaint();
embedElements();
} else { // no description found
// logger.error("Import: No MPEG-7 description available in given node ...");
}
}
private void addObjectFromDND(Point p, String label) {
if (label.indexOf('\n') == -1) {
Vector a = parent.getPossibleObjects();
for (Iterator i = a.iterator(); i.hasNext();) {
Element e = (Element) i.next();
if (e.getChild("Label", e.getNamespace()).getChildText("Name", e.getNamespace()).equals(label))
addObject(p, e);
}
}
TextChangesListener.getInstance().fireDataChanged();
}
private void showAbout() {
JOptionPane.showMessageDialog(this,
"IMBee
creating semantic descriptions
© 2002 by Know Center
author: Mathias Lux, mathias@juggle.at
Inffeldgasse 16c
8010 Graz
Telefon: +43 (316) 873-5669",
"About", JOptionPane.PLAIN_MESSAGE, new ImageIcon(BeePanel.class.getResource("bee.png")));
}
public void distributeElements() {
int number = objects.size();
int width = this.getWidth();
int height = this.getHeight();
double max = 0.0;
if (width > height)
max = (double) ((height >> 1) - SemanticObjectRepresentation.HEIGHT) - 10.0;
else
max = (double) ((width >> 1) - SemanticObjectRepresentation.WIDTH) - 10.0;
int step = 0;
double split = 2.0 * Math.PI / (double) number;
for (Iterator i = objects.iterator(); i.hasNext();) {
SemanticObjectRepresentation r = (SemanticObjectRepresentation) i.next();
Point p = new Point((width >> 1) + ((int) (max * Math.cos(((double) step) * split))) - (SemanticObjectRepresentation.WIDTH >> 1),
(height >> 1) + ((int) (max * Math.sin(((double) step) * split))) - (SemanticObjectRepresentation.HEIGHT >> 1));
r.setP(p);
step++;
}
}
public void embedElements() {
// getting maximum for scaling to [0,1]^2:
double maxX = 1.0, minX = 0.0, maxY = 1.0, minY = 0.0;
for (Iterator itObj = objects.iterator(); itObj.hasNext();) {
SemanticObjectRepresentation sor = (SemanticObjectRepresentation) itObj.next();
double x = sor.getP().getX();
double y = sor.getP().getY();
if (x < minX) minX = x;
if (y < minY) minY = y;
if (x > maxX) maxX = x;
if (y > maxY) maxY = y;
}
// creating nodelist
List nodeList = new LinkedList();
HashMap lookupNodes = new HashMap(objects.size());
for (Iterator itObj = objects.iterator(); itObj.hasNext();) {
SemanticObjectRepresentation sor = (SemanticObjectRepresentation) itObj.next();
sor.getP().getX();
double x = sor.getP().getX();
double y = sor.getP().getY();
x = (x - minX) / (maxX - minX);
y = (y - minY) / (maxY - minY);
DefaultNode d = new DefaultNode(x, y, sor);
nodeList.add(d);
lookupNodes.put(sor, d);
}
List edges = new LinkedList();
for (Iterator itRel = relations.iterator(); itRel.hasNext();) {
SemanticRelationRepresentation rel = (SemanticRelationRepresentation) itRel.next();
DefaultEdge e = new DefaultEdge(lookupNodes.get(rel.getSource()), lookupNodes.get(rel.getTarget()));
edges.add(e);
}
SpringEmbedder se = new SpringEmbedder(nodeList, edges);
// todo: start thread
EmbedderThread embedderThread = new EmbedderThread(this, se, running);
Thread t = new Thread(embedderThread);
t.start();
}
public void importFile() {
JFileChooser jfc = new JFileChooser(".");
FileFilter std = jfc.getFileFilter();
jfc.setFileFilter(new Mpeg7FileFilter());
jfc.addChoosableFileFilter(new XMLFileFilter());
jfc.addChoosableFileFilter(std);
if (jfc.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
SAXBuilder builder = new SAXBuilder();
try {
Document d = builder.build(jfc.getSelectedFile());
java.util.List l = OCToolkit.xpathQuery(d, "//SemanticBase", Namespace.getNamespace("", "urn:mpeg:mpeg7:schema:2001"));
if (l != null) {
Element node = (Element) ((Element) ((Element) l.get(0)).getParent()).detach();
importNode(node);
} else {
// logger.error("Import: No matching node found in file");
}
} catch (JDOMException e) {
// logger.error(e);
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public void removeMarkedElements() {
Vector remO = new Vector();
for (Iterator iterator = objects.iterator(); iterator.hasNext();) {
SemanticObjectRepresentation sem = (SemanticObjectRepresentation) iterator.next();
if (sem.isMarked()) {
remO.add(sem);
Vector rem = new Vector();
for (Iterator i2 = relations.iterator(); i2.hasNext();) {
SemanticRelationRepresentation rel = (SemanticRelationRepresentation) i2.next();
if (rel.getSource().equals(sem) || rel.getTarget().equals(sem)) {
rem.add(rel);
}
}
// objects.remove(sem);
for (Iterator i3 = rem.iterator(); i3.hasNext();) {
relations.remove(i3.next());
}
}
}
for (Iterator iterator = remO.iterator(); iterator.hasNext();) {
SemanticObjectRepresentation sem = (SemanticObjectRepresentation) iterator.next();
objects.remove(sem);
}
TextChangesListener.getInstance().fireDataChanged();
}
private class BeePanelMouseAdapter extends MouseAdapter {
public void mousePressed(MouseEvent e) {
// int relation_mask = MouseEvent.SHIFT_DOWN_MASK | MouseEvent.BUTTON1_DOWN_MASK;
// int move_mask = MouseEvent.BUTTON1_DOWN_MASK;
if (e.getButton() == MouseEvent.BUTTON1 && !e.isAltDown()) {
pressedAt = e.getPoint();
checkIfPressedInObject(e.getPoint());
}
if (e.getButton() == MouseEvent.BUTTON2 || e.getButton() == MouseEvent.BUTTON1 && e.isAltDown()) {
startRel = e.getPoint();
}
repaint();
}
public void mouseReleased(MouseEvent e) {
checkIfIsInObject(e.getPoint());
draggingObject = null;
pressedAt = null;
offset = null;
repaint();
if (e.getButton() == MouseEvent.BUTTON2 || e.getButton() == MouseEvent.BUTTON1 && e.isAltDown()) {
endRel = e.getPoint();
checkIfNewRelation();
startRel = null;
endRel = null;
}
}
public void mouseClicked(MouseEvent e) {
clickedAt = e.getPoint();
if (e.getButton() == MouseEvent.BUTTON3) {
showMenu(e.getPoint().x, e.getPoint().y);
}
if (e.getButton() == MouseEvent.BUTTON1 && e.isControlDown()) {
for (Iterator iterator = objects.iterator(); iterator.hasNext();) {
SemanticObjectRepresentation sem = (SemanticObjectRepresentation) iterator.next();
if (sem.checkIfInside(e.getPoint())) {
// Toggle Markierung ... :)
sem.setMarked(!sem.isMarked());
}
}
}
repaint();
}
}
}
class EmbedderThread implements Runnable {
BeePanel panel;
SpringEmbedder se;
double x, y;
boolean running = true;
LinkedList currentlyRunning = null;
public EmbedderThread(BeePanel panel, SpringEmbedder se, LinkedList running) {
for (Iterator iterator = running.iterator(); iterator.hasNext();) {
iterator.next().endEmbedding();
}
currentlyRunning = running;
running.add(this);
this.panel = panel;
this.se = se;
x = panel.getSize().getWidth() - (SemanticObjectRepresentation.WIDTH << 1);
y = panel.getSize().getHeight() - SemanticObjectRepresentation.HEIGHT * 3;
}
public void run() {
while (se.step() > 0 && running) {
List list = se.getNodeList();
double xMin = 1.0, xMax = 0.0, yMin = 1.0, yMax = 0.0;
for (Iterator iterator = list.iterator(); iterator.hasNext();) {
Node node = iterator.next();
if (node.getX() < xMin) xMin = node.getX();
if (node.getX() > xMax) xMax = node.getX();
if (node.getY() < yMin) yMin = node.getY();
if (node.getY() > yMax) yMax = node.getY();
}
for (Iterator it = list.iterator(); it.hasNext();) {
Node node = it.next();
double nx = (node.getX() - xMin) / (xMax - xMin);
double ny = (node.getY() - yMin) / (yMax - yMin);
SemanticObjectRepresentation sor = (SemanticObjectRepresentation) ((DefaultNode) node).getNodeObject();
// sor.getP().setLocation(x * nx , y * ny );
sor.getP().setLocation(x * nx + (SemanticObjectRepresentation.WIDTH >> 1), y * ny + (SemanticObjectRepresentation.HEIGHT >> 1));
}
panel.repaint();
try {
sleep(15);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if (currentlyRunning.contains(this)) {
currentlyRunning.remove(this);
}
}
public void endEmbedding() {
running = false;
}
}