swooppicksupport.java

来自「Semantic Web Ontology Editor」· Java 代码 · 共 150 行

JAVA
150
字号
package org.mindswap.swoop.utils.graph.hierarchy;
import java.awt.Shape;
import java.awt.geom.AffineTransform;
import java.util.Set;

import edu.uci.ics.jung.graph.Edge;
import edu.uci.ics.jung.graph.Vertex;
import edu.uci.ics.jung.visualization.Layout;
import edu.uci.ics.jung.visualization.PluggableRenderer;
import edu.uci.ics.jung.visualization.Renderer;
import edu.uci.ics.jung.visualization.ShapePickSupport;
import edu.uci.ics.jung.visualization.VisualizationViewer;

/*
 * Created on Jul 27, 2005
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - Java - Code Style - Code Templates
 */

/**
 * @author Dave Wang
 *
 * TODO To change the template for this generated type comment go to
 * Window - Preferences - Java - Code Style - Code Templates
 */


/*
 * This class serves no more purpose than edu.uci.ics.jung.visualization.ClassicPickSupport 
 *   except the other one is not visible from outside of the package.  In order to extend the
 *   VisualizationViewer, this step is necessary :/
 * 
 * 
 */

public class SwoopPickSupport extends ShapePickSupport {
	
    
    protected Layout layout;
    
    /*
    public SwoopClassicPickSupport(Layout l)
    {
        this.layout = l;
    }
    */
    
    public SwoopPickSupport(VisualizationViewer vv) 
    {	    	
        super(vv, 2);
    }

    /** 
     * Iterates over Vertices, checking to see if x,y is contained in the
     * Vertex's Shape. If (x,y) is contained in more than one vertex, use
     * the vertex whose center is closest to the pick point.
     * @see edu.uci.ics.jung.visualization.PickSupport#getVertex(double, double)
     */
    public Vertex getVertex(double x, double y) {
        Layout layout = vv.getGraphLayout();
        PluggableRenderer renderer = null;
        Renderer r = vv.getRenderer();
        if(r instanceof PluggableRenderer) {
            renderer = (PluggableRenderer)r;
        }
		Vertex closest = null;
		double minDistance = Double.MAX_VALUE;
		Set vertexSet = layout.getVisibleVertices();		
		Object [] vertexArray = vertexSet.toArray();

		// reverse the order of checking because we want the one that is drawn last to
		// be checked first.
		// this guarantees that the topmost vertex is always picked
		for ( int i = vertexArray.length-1; i >=0 ; i-- ) 
		{
		    if(renderer != null) {
		        Vertex v = (Vertex)vertexArray[i];
		        if ( !((SwoopOntologyVertex)v).isVisible() )
		        	continue; // if not visible, then don't try to grab support
		        
		        Shape shape = renderer.getVertexShapeFunction().getShape(v);
		        AffineTransform xform = 
		            AffineTransform.getTranslateInstance(layout.getX(v), layout.getY(v));
		        shape = xform.createTransformedShape(shape);

		        if(shape.contains(x, y)) 
		        {
		        	closest = v;
		        	break;
		        }
		    } 
		}
		return closest;
    }

    
    /**
     * Gets the vertex nearest to the location of the (x,y) location selected,
     * within a distance of <tt>maxDistance</tt>. Iterates through all
     * visible vertices and checks their distance from the click. Override this
     * method to provde a more efficient implementation.
     * @param x
     * @param y
     * @param maxDistance temporarily overrides member maxDistance
     */
    /*
    protected Vertex getVertex(double x, double y, double maxDistance) {
        double minDistance = maxDistance * maxDistance;
        Vertex closest = null;
        System.out.println("picking...");
        for (Iterator iter = layout.getVisibleVertices().iterator(); iter.hasNext();) 
        {
            SwoopOntologyVertex v = (SwoopOntologyVertex) iter.next();
            if ( !v.isVisible() )
            {
            	try
				{
            		System.out.println( v.getOntology().getURI() );
				}
            	catch ( Exception e )
				{ e.printStackTrace(); }
            	
            	continue;
            }
            double dx = layout.getX(v) - x;
            double dy = layout.getY(v) - y;
            double dist = dx * dx + dy * dy;
            if (dist < minDistance) {
                minDistance = dist;
                closest = v;
            }
        }
        return closest;
    }
    */
    
    public void setLayout(Layout l)
    {
        this.layout = l;
    }
    
    /** 
     * @return null ClassicPickSupport does not do edges
     */
    public Edge getEdge(double x, double y) {
        return null;
    }
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?