/**
* Copyright (C) 2001-2017 by RapidMiner and the contributors
*
* Complete list of developers available at our web site:
*
* http://rapidminer.com
*
* This program is free software: you can redistribute it and/or modify it under the terms of the
* GNU Affero General Public License as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* This program 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
* Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License along with this program.
* If not, see http://www.gnu.org/licenses/.
*/
package com.rapidminer.gui.graphs;
import java.awt.event.ActionEvent;
import java.lang.reflect.Constructor;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.logging.Level;
import javax.swing.JComboBox;
import org.apache.commons.collections15.Transformer;
import com.rapidminer.tools.LogService;
import edu.uci.ics.jung.algorithms.layout.BalloonLayout;
import edu.uci.ics.jung.algorithms.layout.CircleLayout;
import edu.uci.ics.jung.algorithms.layout.FRLayout2;
import edu.uci.ics.jung.algorithms.layout.ISOMLayout;
import edu.uci.ics.jung.algorithms.layout.KKLayout;
import edu.uci.ics.jung.algorithms.layout.Layout;
import edu.uci.ics.jung.algorithms.layout.RadialTreeLayout;
import edu.uci.ics.jung.algorithms.layout.SpringLayout2;
import edu.uci.ics.jung.algorithms.layout.TreeLayout;
import edu.uci.ics.jung.graph.Forest;
import edu.uci.ics.jung.graph.Graph;
/**
* The layout selection for the {@link GraphViewer}.
*
* @author Ingo Mierswa
*/
public class LayoutSelection<V, E> extends JComboBox<String> {
private static final long serialVersionUID = 8924517975475876102L;
private GraphViewer<V, E> graphViewer;
private transient Graph<V, E> graph;
@SuppressWarnings("rawtypes")
private Map<String, Class<? extends Layout>> layoutMap = null;
private boolean animate = true;
private Layout<V, E> layout;
public LayoutSelection(GraphViewer<V, E> graphViewer, Graph<V, E> graph) {
super();
this.graphViewer = graphViewer;
this.graph = graph;
this.layout = new ISOMLayout<V, E>(graph);
layoutMap = new LinkedHashMap<>();
if (graph instanceof Forest) {
layoutMap.put("Tree", ShapeBasedTreeLayout.class);
layoutMap.put("Tree (Tight)", TreeLayout.class);
layoutMap.put("Radial", RadialTreeLayout.class);
layoutMap.put("Balloon", BalloonLayout.class);
}
layoutMap.put("ISOM", ISOMLayout.class);
layoutMap.put("KKLayout", KKLayout.class);
layoutMap.put("FRLayout", FRLayout2.class);
layoutMap.put("Circle", CircleLayout.class);
layoutMap.put("Spring", SpringLayout2.class);
Iterator<String> it = layoutMap.keySet().iterator();
while (it.hasNext()) {
addItem(it.next());
}
addActionListener(this);
}
public Layout<V, E> getSelectedLayout() {
return this.layout;
}
@Override
public void actionPerformed(ActionEvent arg0) {
setLayout();
}
public void setAnimate(boolean animate) {
this.animate = animate;
}
public boolean getAnimate() {
return this.animate;
}
@SuppressWarnings({ "unchecked", "rawtypes" })
public void setLayout() {
String layoutName = (String) getSelectedItem();
Class<? extends Layout> layoutClass = null;
try {
layoutClass = layoutMap.get(layoutName);
} catch (Exception e) {
LogService.getRoot().log(Level.SEVERE,
"com.rapidminer.gui.graphs.LayoutSelection.layout_could_not_be_initialized", e.getMessage());
}
if (layoutClass != null) {
try {
Constructor<? extends Layout> constructor = null;
Layout<V, E> layout = null;
if (layoutClass == ShapeBasedTreeLayout.class) {
constructor = layoutClass.getConstructor(new Class[] { Forest.class, Transformer.class });
layout = constructor.newInstance(graph,
new ExtendedVertexShapeTransformer<V>(graphViewer.getGraphCreator()));
} else if (layoutClass == TreeLayout.class || layoutClass == BalloonLayout.class
|| layoutClass == RadialTreeLayout.class) {
constructor = layoutClass.getConstructor(new Class[] { Forest.class });
layout = constructor.newInstance(graph);
} else {
constructor = layoutClass.getConstructor(new Class[] { Graph.class });
layout = constructor.newInstance(graph);
}
if (layout != null) {
this.layout = layout;
this.graphViewer.changeLayout(layout, animate, 0, 0);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}