package nars.gui.output.graph.deprecated; import automenta.vivisect.swing.NPanel; import automenta.vivisect.swing.NSlider; import com.mxgraph.layout.mxCompactTreeLayout; import com.mxgraph.layout.mxFastOrganicLayout; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JPanel; import javax.swing.SwingUtilities; import javax.swing.event.AncestorEvent; import javax.swing.event.AncestorListener; import nars.entity.Concept; import nars.entity.Sentence; import nars.language.CompoundTerm; import nars.language.Term; import nars.gui.util.NARGraph; import org.jgrapht.ext.JGraphXAdapter; import org.jgrapht.graph.DirectedMultigraph; abstract public class ProcessingGraphPanel2<V,E> extends NPanel { public PGraphPanel<V,E> app = null; float edgeDistance = 10; protected boolean showSyntax; private final List<Object> items; private int sentenceIndex = -1; String layoutMode; int maxItems = -1; public ProcessingGraphPanel2() { this(new ArrayList()); } @Deprecated public ProcessingGraphPanel2(List<Object> sentences) { super(); this.items = sentences; app = new PGraphPanel<V,E>() { @Override public int edgeColor(E edge) { return ProcessingGraphPanel2.this.edgeColor(edge); } @Override public float edgeWeight(E edge) { return ProcessingGraphPanel2.this.edgeWeight(edge); } @Override public int vertexColor(V vertex) { return ProcessingGraphPanel2.this.vertexColor(vertex); } }; try { app.init(); } catch (Throwable t) { /* ignore this */ } //this.setSize(1000, 860);//initial size of the window this.setVisible(true); setLayout(new BorderLayout()); JPanel menu = new JPanel(new FlowLayout(FlowLayout.LEFT)); final JComboBox layoutSelect = new JComboBox(); layoutSelect.addItem("Graph"); layoutSelect.addItem("Tree"); layoutSelect.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { layoutMode = layoutSelect.getSelectedItem().toString(); needLayout = true; update(); redraw(); } }); layoutMode = layoutSelect.getSelectedItem().toString(); menu.add(layoutSelect); final JCheckBox beliefsEnable = new JCheckBox("Syntax"); beliefsEnable.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { showSyntax = beliefsEnable.isSelected(); update(); redraw(); } }); menu.add(beliefsEnable); NSlider nodeSize = new NSlider(app.nodeSize, 1, app.maxNodeSize) { @Override public void onChange(float v) { app.nodeSize = v; redraw(); } }; nodeSize.setPrefix("Node Size: "); nodeSize.setPreferredSize(new Dimension(125, 25)); menu.add(nodeSize); NSlider edgeDist = new NSlider(edgeDistance, 1, 100) { @Override public void onChange(float v) { edgeDistance = (float)v; ProcessingGraphPanel2.this.update(); } }; edgeDist.setPrefix("Separation: "); edgeDist.setPreferredSize(new Dimension(125, 25)); menu.add(edgeDist); /* if (sentences.size() > 1) { final JTextField ssl = new JTextField(); final JSlider indexSlider = new JSlider(-1, sentences.size()-1, -1); indexSlider.setSnapToTicks(true); indexSlider.setMajorTickSpacing(1); indexSlider.setMinorTickSpacing(1); indexSlider.addChangeListener(new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { int i = indexSlider.getValue(); sentenceIndex = i; if (i == -1) { update(); ssl.setText("All Sentences"); } else { update(); ssl.setText(ProcessingGraphPanel.this.items.get(i).toString()); } } }); menu.add(indexSlider); menu.add(ssl); } */ if ((getWidth() > 0) && (getHeight() > 0)) app.setSize(getWidth(), getHeight()); add(menu, BorderLayout.NORTH); add(app, BorderLayout.CENTER); validate(); addAncestorListener(new AncestorListener() { @Override public void ancestorAdded(AncestorEvent event) { redraw(); } @Override public void ancestorRemoved(AncestorEvent event) { } @Override public void ancestorMoved(AncestorEvent event) { } }); addComponentListener(new ComponentAdapter() { @Override public void componentShown(ComponentEvent e) { redraw(); } @Override public void componentResized(ComponentEvent e) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { app.setSize(getWidth(), getHeight()); redraw(); } }); } }); update(); redraw(); } abstract public int edgeColor(E edge); abstract public float edgeWeight(E edge); abstract public int vertexColor(V vertex); @Override protected void onShowing(boolean showing) { if (!showing) { //app.stop(); //app = null; } else { //app = new papplet(); } } public void addItem(Object o) { if ((maxItems > 0) && (items.size()+1 == maxItems)) { items.remove(0); } items.add(o); update(); redraw(); } public NARGraph.Filter newSelectedGraphFilter() { final List<Object> selected = getItems(); final Set<Term> include = new HashSet(); for (final Object s : selected) { if (s instanceof Sentence) { Term t = ((Sentence)s).term; include.add(t); if (t instanceof CompoundTerm) { CompoundTerm ct = (CompoundTerm)t; include.addAll(ct.getContainedTerms()); } } } return new NARGraph.Filter() { @Override public boolean includePriority(float l) { return true; } @Override public boolean includeConcept(final Concept c) { final Term t = c.term; return include.contains(t); } }; } public List<Object> getItems() { List<Object> displayed; if (sentenceIndex == -1) { displayed = items; } else { displayed = new ArrayList(1); displayed.add(items.get(sentenceIndex)); } return displayed; } public void setMaxItems(int maxItems) { this.maxItems = maxItems; } abstract public DirectedMultigraph getGraph(); public void update() { app.graph = getGraph(); needLayout = true; } boolean needLayout = true; public boolean redraw() { if (app == null) return false; if (app.graph == null) { update(); } app.drawn = false; if (needLayout) { needLayout = false; // create a visualization using JGraph, via an adapter JGraphXAdapter graphAdapter = new JGraphXAdapter(app.graph); app.graphAdapter = graphAdapter; /* */ switch (layoutMode) { case "Graph": mxFastOrganicLayout l = new mxFastOrganicLayout(graphAdapter); //new mxCompactTreeLayout(jgxAdapter); //new mxCircleLayout(jgxAdapter); l.setForceConstant(edgeDistance*10f); l.execute(graphAdapter.getDefaultParent()); break; case "Tree": mxCompactTreeLayout layout2 = new mxCompactTreeLayout(graphAdapter); layout2.setUseBoundingBox(true); layout2.setResizeParent(true); layout2.setLevelDistance((int)(edgeDistance*1.5f)); layout2.setNodeDistance((int)(0.2f * edgeDistance*edgeDistance*2f)); layout2.setInvert(true); layout2.execute(graphAdapter.getDefaultParent()); break; } } /* mxOrganicLayout layout = //new mxCompactTreeLayout(jgxAdapter); new mxOrganicLayout(jgxAdapter); //new mxCircleLayout(jgxAdapter); layout.setEdgeLengthCostFactor(0.001);*/ app.updating = false; app.redraw(); return true; } }