/*
* Here comes the text of your license
* Each line should be prefixed with *
*/
package nars.gui.output.graph;
/**
*
* @author me
*/
import automenta.vivisect.dimensionalize.FastOrganicLayout;
import automenta.vivisect.dimensionalize.HyperassociativeLayout;
import automenta.vivisect.graph.AnimatingGraphVis;
import automenta.vivisect.graph.GraphDisplay;
import automenta.vivisect.graph.GraphDisplays;
import automenta.vivisect.swing.NSlider;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.concurrent.atomic.AtomicReference;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JPanel;
import javax.swing.JTextField;
import nars.util.EventEmitter.EventObserver;
import nars.util.Events.FrameEnd;
import nars.util.Events.ResetEnd;
import nars.NAR;
import nars.gui.output.graph.layout.HashPriorityPolarLayout;
import nars.gui.util.DefaultGraphizer;
import nars.gui.util.NARGraph;
import nars.gui.graph.InheritanceGraph;
import org.jgrapht.Graph;
/**
*
*/
public class NARGraphVis extends AnimatingGraphVis<Object,Object> implements EventObserver {
final AtomicReference<Graph> displayedGraph = new AtomicReference();
private final NAR nar;
private final GraphDisplays displays;
private NARGraphDisplay style;
private GraphDisplay layout;
private JPanel modePanelHolder;
public static interface GraphMode {
public Graph nextGraph();
default public void stop() {
}
public JPanel newControlPanel();
}
public abstract class MinPriorityGraphMode implements GraphMode {
float minPriority = 0;
@Override
public JPanel newControlPanel() {
JPanel j = new JPanel(new FlowLayout(FlowLayout.LEFT));
NSlider maxLevels = new NSlider(1, 0, 1) {
@Override
public void onChange(float v) {
minPriority = (float) (1.0 - v);
setUpdateNext();
}
};
maxLevels.setPrefix("Min Level: ");
maxLevels.setPreferredSize(new Dimension(80, 25));
j.add(maxLevels);
return j;
}
}
JTextField filterBox = new JTextField();
public class ConceptGraphMode extends MinPriorityGraphMode implements GraphMode {
private boolean showBeliefs = false;
private boolean showQuestions = false;
private boolean showTermContent = false;
boolean showTaskLinks = false;
boolean showTermLinks = true;
@Override
public Graph nextGraph() {
return new NARGraph().add(nar, new NARGraph.ExcludeBelowPriority(minPriority), new DefaultGraphizer(showBeliefs, showBeliefs, showQuestions, showTermContent, 0, showTermLinks, showTaskLinks, filterBox));
}
@Override
public JPanel newControlPanel() {
JPanel j = super.newControlPanel();
final JCheckBox termlinkEnable = new JCheckBox("TermLinks");
termlinkEnable.setSelected(showTermLinks);
termlinkEnable.addActionListener(new ActionListener() {
@Override public void actionPerformed(ActionEvent e) {
showTermLinks = (termlinkEnable.isSelected());
setUpdateNext();
}
});
j.add(termlinkEnable);
final JCheckBox taskLinkEnable = new JCheckBox("TaskLinks");
taskLinkEnable.setSelected(showTaskLinks);
taskLinkEnable.addActionListener(new ActionListener() {
@Override public void actionPerformed(ActionEvent e) {
showTaskLinks = (taskLinkEnable.isSelected());
setUpdateNext();
}
});
j.add(taskLinkEnable);
/* final JCheckBox beliefsEnable = new JCheckBox("Beliefs");
beliefsEnable.setSelected(showBeliefs);
beliefsEnable.addActionListener(new ActionListener() {
@Override public void actionPerformed(ActionEvent e) {
showBeliefs = (beliefsEnable.isSelected());
setUpdateNext();
}
});
j.add(beliefsEnable);*/
filterBox.setPreferredSize(new Dimension(255,20));
j.add(filterBox);
return j;
}
}
public class InheritanceGraphMode extends MinPriorityGraphMode implements GraphMode {
private InheritanceGraph ig;
@Override
public Graph nextGraph() {
if (this.ig==null) {
this.ig = new InheritanceGraph(nar, true, true);
ig.start();
}
return ig;
}
@Override
public void stop() {
if (ig!=null) {
ig.stop();
ig = null;
}
}
}
public GraphMode mode = new ConceptGraphMode();
boolean updateNextGraph = false;
public NARGraphVis(NAR n) {
super(null, new GraphDisplays());
this.nar = n;
this.displays = (GraphDisplays)getDisplay();
NARGraphDisplay grap = new NARGraphDisplay();
update(grap, new FastOrganicLayout());
}
public void update(NARGraphDisplay style, GraphDisplay layout) {
this.style = style;
this.layout = layout;
displays.sequence.clear();
displays.sequence.add(style);
displays.sequence.add(layout);
setUpdateNext();
}
@Override
public void onVisible(boolean showing) {
nar.memory.event.set(this, showing, FrameEnd.class, ResetEnd.class);
if (!showing) {
mode.stop();
}
}
@Override
public void event(Class event, Object[] args) {
if (event == FrameEnd.class) {
displayedGraph.set(nextGraph());
}
else if (event == ResetEnd.class) {
displayedGraph.set(null);
}
}
protected Graph nextGraph() {
if (nar == null) return null;
return mode.nextGraph();
}
@Override
public void setUpdateNext() {
super.setUpdateNext();
updateNextGraph = true;
}
@Override
public Graph<Object, Object> getGraph() {
if (displayedGraph == null)
return null;
if (updateNextGraph) {
updateNextGraph = false;
if (!nar.isRunning()) {
//only update from here if NAR isnt running; otherwise a concurrency exception can occurr
Graph ng = nextGraph();
if (ng!=null)
displayedGraph.set(ng);
}
}
return displayedGraph.get();
}
public JPanel newLayoutPanel() {
JPanel j = new JPanel(new FlowLayout(FlowLayout.LEFT));
final JComboBox layoutSelect = new JComboBox();
layoutSelect.addItem("Organic");
layoutSelect.addItem("Circle Fixed");
layoutSelect.addItem("Circle Fixed (Half)");
layoutSelect.addItem("Hyperassociative");
layoutSelect.addItem("GridSort");
layoutSelect.addItem("Circle Anim");
layoutSelect.addItem("Grid");
//modeSelect.setSelectedIndex(cg.mode);
layoutSelect.addActionListener(new ActionListener() {
@Override public void actionPerformed(ActionEvent e) {
switch (layoutSelect.getSelectedIndex()) {
case 0:
update(style, new FastOrganicLayout());
break;
case 1:
update(style, new HashPriorityPolarLayout(0f, 1f, 50));
break;
case 2:
update(style, new HashPriorityPolarLayout(0.25f, 0.75f, 75));
break;
case 3:
update(style, new HyperassociativeLayout());
break;
}
//cg.mode = modeSelect.getSelectedIndex();
setUpdateNext();
}
});
j.add(layoutSelect);
return j;
}
public void setMode(GraphMode g) {
if (this.mode!=null) {
this.mode.stop(); //stop existing
}
this.mode = g;
modePanelHolder.removeAll();
modePanelHolder.add(mode.newControlPanel());
modePanelHolder.doLayout();
}
public JPanel newGraphPanel() {
JPanel j = new JPanel(new FlowLayout(FlowLayout.LEFT));
final JComboBox modeSel = new JComboBox();
modeSel.addItem("Concepts");
modeSel.addItem("Inheritance");
//modeSelect.setSelectedIndex(cg.mode);
modeSel.addActionListener(new ActionListener() {
@Override public void actionPerformed(ActionEvent e) {
switch (modeSel.getSelectedIndex()) {
case 0:
setMode(new ConceptGraphMode());
break;
case 1:
setMode(new InheritanceGraphMode());
break;
}
setUpdateNext();
}
});
j.add(modeSel);
modePanelHolder = new JPanel(new FlowLayout());
modePanelHolder.add(mode.newControlPanel());
j.add(modePanelHolder);
return j;
}
public JPanel newStylePanel() {
JPanel j = new JPanel(new FlowLayout(FlowLayout.LEFT));
j.add(style.getControls());
return j;
}
}