edu.uci.ics.jung.visualization.layout.PersistentLayoutImpl Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jung-visualization Show documentation
Show all versions of jung-visualization Show documentation
Core visualization support for the JUNG project
The newest version!
/*
* Copyright (c) 2005, The JUNG Authors
* All rights reserved.
*
* This software is open-source under the BSD license; see either "license.txt"
* or https://github.com/jrtom/jung/blob/master/LICENSE for a description.
*
* Created on Oct 8, 2004
*
*/
package edu.uci.ics.jung.visualization.layout;
import java.awt.Dimension;
import java.awt.geom.Point2D;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import com.google.common.base.Function;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Maps;
import edu.uci.ics.jung.algorithms.layout.Layout;
import edu.uci.ics.jung.visualization.util.Caching;
import edu.uci.ics.jung.visualization.util.ChangeEventSupport;
/**
* Implementation of PersistentLayout.
* Defers to another layout until 'restore' is called,
* then it uses the saved vertex locations
*
* @author Tom Nelson
*
*
*/
public class PersistentLayoutImpl extends ObservableCachingLayout
implements PersistentLayout, ChangeEventSupport, Caching {
/**
* a container for Vertices
*/
protected Map locations;
/**
* a collection of Vertices that should not move
*/
protected Set dontmove;
/**
* whether the graph is locked (stops the VisualizationViewer rendering thread)
*/
protected boolean locked;
/**
* create an instance with a passed layout
* create containers for graph components
* @param layout the layout whose positions are to be persisted
*/
public PersistentLayoutImpl(Layout layout) {
super(layout);
this.locations = Maps.asMap(
ImmutableSet.copyOf(layout.getGraph().getVertices()),
new RandomPointFactory(getSize()));
this.dontmove = new HashSet();
}
/**
* This method calls initialize_local_vertex for each vertex, and
* also adds initial coordinate information for each vertex. (The vertex's
* initial location is set by calling initializeLocation.
*/
protected void initializeLocations() {
for(V v : getGraph().getVertices()) {
Point2D coord = delegate.apply(v);
if (!dontmove.contains(v))
initializeLocation(v, coord);
}
}
/**
* Sets persisted location for a vertex within the dimensions of the space.
* If the vertex has not been persisted, sets a random location. If you want
* to initialize in some different way, override this method.
*
* @param v the vertex whose location is to be initialized
* @param coord the location
*/
protected void initializeLocation(V v, Point2D coord) {
Point point = locations.get(v);
coord.setLocation(point.x, point.y);
}
/**
* save the Vertex locations to a file
* @param fileName the file to save to
* @throws IOException if the file cannot be used
*/
public void persist(String fileName) throws IOException {
for(V v : getGraph().getVertices()) {
Point p = new Point(transform(v));
locations.put(v, p);
}
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(
fileName));
oos.writeObject(locations);
oos.close();
}
/**
* Restore the graph Vertex locations from a file
* @param fileName the file to use
* @throws IOException for file problems
* @throws ClassNotFoundException for classpath problems
*/
@SuppressWarnings("unchecked")
public void restore(String fileName) throws IOException,
ClassNotFoundException {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(
fileName));
locations = (Map) ois.readObject();
ois.close();
initializeLocations();
locked = true;
fireStateChanged();
}
public void lock(boolean locked) {
this.locked = locked;
}
/*
* (non-Javadoc)
*
* @see edu.uci.ics.jung.visualization.Layout#incrementsAreDone()
*/
public boolean done() {
return super.done() || locked;
}
/*
* (non-Javadoc)
*
* @see edu.uci.ics.jung.visualization.Layout#lockVertex(edu.uci.ics.jung.graph.Vertex)
*/
public void lock(V v, boolean state) {
dontmove.add(v);
delegate.lock(v, state);
}
@SuppressWarnings("serial")
public static class RandomPointFactory implements Function, Serializable {
Dimension d;
public RandomPointFactory(Dimension d) {
this.d = d;
}
public edu.uci.ics.jung.visualization.layout.PersistentLayout.Point apply(V v) {
double x = Math.random() * d.width;
double y = Math.random() * d.height;
return new Point(x,y);
}
}
}
© 2015 - 2024 Weber Informatics LLC | Privacy Policy