/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package automenta.spacenet.run.old.os;
import automenta.spacenet.plugin.comm.Agent;
import automenta.spacenet.plugin.comm.Channel;
import automenta.spacenet.plugin.comm.Message;
import automenta.spacenet.plugin.comm.twitter.TwitterGrapher;
import automenta.spacenet.run.ArdorSpacetime;
import automenta.spacenet.run.DefaultActions;
import automenta.spacenet.run.old.DefaultGraphBuilder;
import automenta.spacenet.run.DemoDefaults;
import automenta.spacenet.space.geom.graph.arrange.forcedirect.ScalarMapForceDirecting;
import automenta.spacenet.space.geom.Box;
import automenta.spacenet.space.geom.graph.arrange.forcedirect.ForceDirectedParametersEditWindow;
import automenta.spacenet.space.geom.ProcessBox;
import automenta.spacenet.space.geom.graph.GraphBoxModel;
import automenta.spacenet.space.geom.graph.GraphBox;
import automenta.spacenet.space.geom.graph.GraphBoxBuilder;
import automenta.spacenet.space.geom.graph.arrange.forcedirect.ForceDirecting.ForceDirectedParameters;
import automenta.spacenet.space.geom.graph.ScalarGraphMapControlWindow;
import automenta.spacenet.space.geom.text3d.Font3D;
import automenta.spacenet.space.surface.BitmapSurface;
import automenta.spacenet.space.widget.MetaBox;
import automenta.spacenet.space.widget.PanningDragRect;
import automenta.spacenet.space.widget.slider.ScalarMapEqualizerPanel;
import automenta.spacenet.space.widget.window.Window;
import automenta.spacenet.var.action.Actions;
import automenta.spacenet.var.action.InstantAction;
import automenta.spacenet.var.vector.V3;
import automenta.spacenet.var.graph.MemGraph;
import automenta.spacenet.var.graph.map.AttentionThresholdGraph;
import automenta.spacenet.var.graph.map.ScalarGraphMap;
import automenta.spacenet.var.scalar.DoubleVar;
import automenta.spacenet.var.string.StringVar;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
/**
* empty space Operating System environment
*/
public class DemoOS extends ProcessBox {
Font3D font3d = DemoDefaults.font;
double s = 1.0;
private Actions actions = new Actions();
private ForceDirectedParameters params;
private MemGraph graph;
private GraphBox graphBox;
private ScalarGraphMap attention;
private AttentionThresholdGraph visGraph;
double attentionUpdatePeriod = 0.03;
private ScalarGraphMapControlWindow attentionControlWin;
private Map<Class, DoubleVar> typeValues = new HashMap();
private ScalarMapEqualizerPanel<Class> typeEqualizer;
private Window typeEqualizerWin;
public class DemoGraphBox extends Box {
public DemoGraphBox() {
super(BoxShape.Empty);
attention = new ScalarGraphMap(graph, 0);
{
visGraph = new AttentionThresholdGraph(graph, attention);
add(visGraph.newUpdating(attentionUpdatePeriod));
}
{
graphBox = new GraphBox(visGraph, getGraphBuilder(), newForceDirect3DArranger(3, 1.0));
add(new MetaBox(graphBox)).scale(s, s, s);
}
{
attentionControlWin = add(new ScalarGraphMapControlWindow(attention, visGraph, font3d));
attentionControlWin.move(0, 1, 0).scale(0.2, 0.15);
}
{
typeValues.put(Channel.class, new DoubleVar(1.0));
typeValues.put(Message.class, new DoubleVar(1.0));
typeValues.put(Agent.class, new DoubleVar(1.0));
typeValues.put(StringVar.class, new DoubleVar(1.0));
typeEqualizer = new ScalarMapEqualizerPanel<Class>(typeValues, font3d, 0, 1.0) {
@Override protected String getLabel(Class x) {
return x.getSimpleName();
}
};
typeEqualizerWin = add(new Window(typeEqualizer, 0.1));
typeEqualizerWin.move(0, -1, 0).scale(0.15, 0.2);
}
final PanningDragRect backRect = add(new PanningDragRect(1.5));
{
backRect.scale(s * 1.1, s * 1.1).move(0, 0, -1);
//URL to Background Image
actions.add(new InstantAction<URL, URL>() {
@Override public String toString(URL i) {
return "As Background Image";
}
@Override protected URL run(URL i) throws Exception {
backRect.add(new BitmapSurface(i));
return i;
}
@Override public double applies(URL i) {
return 1.0;
}
});
}
final TwitterGrapher tg = new TwitterGrapher(graph);
tg.addPublicTimeline();
add(new OSRootMenu(tg)).move(2, 0, 0);
// getSpacetime().addCondition(new InputTrigger(new KeyPressedCondition(Key.INSERT), new TriggerAction() {
//
// public void perform(final Canvas source, final TwoInputStates inputState, final double tpf) {
// graph.addNode(new StringVar("?"));
// }
// }));
// getSpacetime().addCondition(new InputTrigger(new KeyPressedCondition(Key.ONE), new TriggerAction() {
//
// public void perform(final Canvas source, final TwoInputStates inputState, final double tpf) {
// graphBox.setModel(newForceDirect3DArranger(0.1));
// }
// }));
// getSpacetime().addCondition(new InputTrigger(new KeyPressedCondition(Key.TWO), new TriggerAction() {
//
// public void perform(final Canvas source, final TwoInputStates inputState, final double tpf) {
// graphBox.setModel(newForceDirect3DArranger(1.0));
// }
// }));
// getSpacetime().addCondition(new InputTrigger(new KeyPressedCondition(Key.THREE), new TriggerAction() {
//
// public void perform(final Canvas source, final TwoInputStates inputState, final double tpf) {
// graphBox.setModel(new Scattering());
// }
// }));
// getSpacetime().addCondition(new InputTrigger(new KeyPressedCondition(Key.FOUR), new TriggerAction() {
//
// public void perform(final Canvas source, final TwoInputStates inputState, final double tpf) {
// graphBox.setModel(new LineListing(0, -0.5, 0, 0.5, null));
// }
// }));
// getSpacetime().addCondition(new InputTrigger(new KeyPressedCondition(Key.FIVE), new TriggerAction() {
//
// public void perform(final Canvas source, final TwoInputStates inputState, final double tpf) {
// graphBox.setModel(new GridListing(-0.5, -0.5, 0.5, 0.5, null));
// }
// }));
// getSpacetime().addCondition(new InputTrigger(new KeyPressedCondition(Key.SIX), new TriggerAction() {
//
// public void perform(final Canvas source, final TwoInputStates inputState, final double tpf) {
// graphBox.setModel(new JungModel(new FRLayout(graph, new Dimension(600, 600))));
// }
// }));
// getSpacetime().addCondition(new InputTrigger(new KeyPressedCondition(Key.SEVEN), new TriggerAction() {
//
// public void perform(final Canvas source, final TwoInputStates inputState, final double tpf) {
// graphBox.setModel(new JungModel(new SpringLayout(graph)));
// }
// }));
// getSpacetime().addCondition(new InputTrigger(new KeyPressedCondition(Key.EIGHT), new TriggerAction() {
//
// public void perform(final Canvas source, final TwoInputStates inputState, final double tpf) {
// graphBox.setModel(new JungModel(new CircleLayout(graph)));
// }
// }));
// getSpacetime().addCondition(new InputTrigger(new KeyPressedCondition(Key.NINE), new TriggerAction() {
//
// public void perform(final Canvas source, final TwoInputStates inputState, final double tpf) {
// try {
// String input = JOptionPane.showInputDialog("Enter Background Image URL");
// backRect.add(new BitmapSurface(input));
// } catch (MalformedURLException ex) {
// Logger.getLogger(DemoOS.class.getName()).log(Level.SEVERE, null, ex);
// }
// }
// }));
// getSpacetime().addCondition(new InputTrigger(new KeyPressedCondition(Key.ZERO), new TriggerAction() {
//
// public void perform(final Canvas source, final TwoInputStates inputState, final double tpf) {
// //insert tweet
// String input = JOptionPane.showInputDialog("Enter Twitter @user, #hashtag, keyword, or blank (for public timeline)");
// if (input.length() == 0) {
// tg.addPublicTimeline();
// } else if (input.startsWith("@")) {
// tg.addProfile(input);
// } else if (input.startsWith("#")) {
// //TODO search
// }
// }
// }));
}
}
//1. graph inside MetaBox
//2. metabox with controls to:
// adjust all aspects graph filtering
// adjust all aspects graph presentation (incl. arrangement)
// manipulate graph content and processes
// toggle 2D/3D mode
// find object: keyword search or index browser
@Override protected void start() {
DefaultActions.addActions(actions);
graph = new MemGraph();
add(new DemoGraphBox()).move(1, 0, 0).scale(2, 2, 2);
//add(new DemoDesktop()).move(-1, 0, 0).scale(2,2,2);
}
public GraphBoxBuilder getGraphBuilder() {
return new DefaultGraphBuilder();
}
public GraphBoxModel newForceDirect3DArranger(double w, double depthFactor) {
double m = 0.1;
V3 boundsMax = new V3(w - m, w - m, (w - m) * depthFactor);
params = new ForceDirectedParameters(boundsMax, 0.3, 0.002, 1.0);
double updatePeriod = 0.05;
double interpSpeed = 0.25;
int substeps = 8;
return new ScalarMapForceDirecting(attention, params, updatePeriod, substeps, interpSpeed) {
private ForceDirectedParametersEditWindow fdcp;
@Override
public void start(GraphBox graphBox) {
super.start(graphBox);
fdcp = getGraphBox().add(new ForceDirectedParametersEditWindow(params, font3d));
fdcp.move(-1, 0, 0).scale(0.5);
}
double getValue(Object node) {
return 0.1;
}
@Override
public void stop() {
getGraphBox().remove(fdcp);
fdcp = null;
super.stop();
}
public double getNodeSize(Object node, double n) {
for (Class c : typeValues.keySet()) {
if (c.isAssignableFrom(node.getClass())) {
return n * typeValues.get(c).d();
}
}
return n;
}
};
}
public static void main(String[] argV) {
ArdorSpacetime.newWindow(new DemoOS().scale(4));
}
}