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; } }