src/hp/static/hp/tmgraph/tmgraph.pde
changeset 43 4baa7530912c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/hp/static/hp/tmgraph/tmgraph.pde	Wed Nov 14 17:26:06 2012 +0100
@@ -0,0 +1,370 @@
+String title = "17 June, 2012 ver.02";
+PFont font;
+
+String ln = "en";// "ja" "fr"
+boolean personal        = true;
+boolean editmode        = true;
+boolean debug           = false;
+boolean nodetrace       = false;
+boolean edgetrace       = false;
+boolean eventtrace      = false;
+boolean attractiontrace = false;
+boolean load            = false;
+boolean showusername    = false;
+
+ParticleSystem physics;
+Node selection, 
+     selected, 
+     previous_selection,
+     from_node, to_node,
+     dragnode; 
+Edge sel_edge, 
+     selected_edge;
+int edgeCount = 0;
+int topicCount = 0;
+
+boolean touch          = false;
+boolean free           = true;
+boolean dragging       = false;
+boolean draggingnode   = false;
+boolean menu_active    = false;
+boolean apmenu_active  = false;
+boolean edgmenu_active = false;
+boolean mouseMode      = false;
+boolean dowbleclick    = false;
+boolean touched        = false;
+boolean holding        = false;
+boolean dragmode       = false;
+
+int menu    = 0;
+int edgmenu = 0;
+int apmenu  = 0;
+int centerX,     
+    centerY;
+int touchX,      
+    touchY;
+int menuX,       
+    menuY;
+int scrnX,       
+    scrnY;
+int pressStartX, 
+    pressStartY;
+int pointX,      
+    pointY;
+int topicX,      
+    topicY;
+
+float start             = 0;
+float elapsedTimeMillis = 0;
+float elapsedTimeSec    = 0.0;
+float factor            = 1.0;
+float damper            = 1.0;
+float maxMotion         = 0;
+float motionRatio;
+float start_dist, 
+      currt_dist;
+float scl;
+float theta1, 
+      phai, 
+      theta2;
+float fromX, 
+      fromY, 
+      toX, 
+      toY, 
+      cX, 
+      cY;
+
+String both = "both";
+String msg  = "";
+String str  = "";
+String event= "";
+String func = "";
+
+String unescapeSTR(String text) {
+  String str=text;
+  if (str == null || str.equals("")) return "";
+  str = str.replaceAll("&","&");
+  str = str.replaceAll(""","\"");	    
+  str = str.replaceAll("'","'");
+  str = str.replaceAll(""","\"");
+  str = str.replaceAll("&lt;","<");
+  str = str.replaceAll("&gt;",">");
+  str = str.replaceAll("<br>","\n");
+  return str;
+}
+
+String trimSTR(String text) {
+  String str=text;
+  if (str == null || str.equals("")) return "";
+  str = str.replaceAll("\n","");
+  str = str.replaceAll("\f","");	    
+  str = str.replaceAll(" ","");
+  str = str.replaceAll(" ","");
+  str = str.replaceAll("\r","");
+  return str;
+}
+
+void setDebugmode(){
+  debug = true;
+}
+
+////////  PROCESSING  //////////////////////////////////////////////////////////
+int WORLD_SIZE_W, WORLD_SIZE_H;
+
+void setSize(int w, int h) { 
+  if (javascript != null) {
+    WORLD_SIZE_W = w;
+    WORLD_SIZE_H = h;  
+    size(w, h);  
+  }
+}
+
+void setup() {
+  WORLD_SIZE_W = 600;
+  WORLD_SIZE_H = 600;
+  size(WORLD_SIZE_W, WORLD_SIZE_H);
+  //size(600, 600);
+
+  physics = new ParticleSystem( 0, DRAGFACTOR/* 0.1*/ ); 
+  // Runge-Kutta, the default integrator is stable and snappy,
+  // but slows down quickly as you add particles.
+  // Try this to see how Euler is faster, but borderline unstable.
+  // physics.setIntegrator( ParticleSystem.EULER ); 
+  // Now try this to see make it more damped, but stable.
+  physics.setDrag( DRAGFACTOR );
+  physics.clear(); 
+  
+  setNodeShapes();
+  if (load) loadData();
+  
+  frameRate(FRAME);
+  smooth();
+  
+  selected      = null;
+  selection    = null;
+  menu_active  = false;
+  apmenu_active = false;
+  mouseMode    = false;
+  damper        = 1.0f;
+  
+  if( debug || load || nodetrace || edgetrace || eventtrace || attractiontrace || editmode ) setMode();
+  stopDoubleClickTimer();
+}
+
+void draw() {
+  physics.tick(TICK); 
+  if (dragmode)
+    bgColor = MintCream;
+  else
+    bgColor = White;
+  background(bgColor);
+  smooth();  
+  
+  translate( WORLD_SIZE_W/2, WORLD_SIZE_H/2); 
+  if (dragging == true) {
+    pushMatrix();
+    translate((pointX - pressStartX) * factor, 
+              (pointY - pressStartY) * factor);
+  }  
+  
+  drawNetwork();  
+  
+  if (dragging == true) popMatrix();
+  if (menu_active)         showMenu();
+  else if (apmenu_active)  showApMenu();  
+  else if (edgmenu_active) showEdgMenu();
+  translate( -WORLD_SIZE_W/2, -WORLD_SIZE_H/2); 
+  debugTrace();
+  checkHoldTimer();
+}
+
+void zoom(float value) {
+  factor = round(value*10)/10;
+}
+
+void drawNetwork() {
+  noStroke();
+  // draw attractions
+  if (attractiontrace) {
+    Iterator ita = physics.attractions.iterator();
+    while (ita.hasNext ()) {
+      Attraction attraction = (Attraction) ita.next();
+      if ( attraction.isOn() ) {
+        strokeWeight(1);
+        stroke(LightPink);
+        line(factor*attraction.getOneEnd().position.x,      factor*attraction.getOneEnd().position.y,
+            factor*attraction.getTheOtherEnd().position.x, factor*attraction.getTheOtherEnd().position.y);
+      }
+    }
+  }  
+  // draw edges
+  Iterator ite = edges.entrySet().iterator();
+  while (ite.hasNext ()) {
+    Map.Entry ee = (Map.Entry)ite.next();
+    String k  = (String) ee.getKey();
+    Edge edge = (Edge) ee.getValue();
+    edge.show();
+  }
+  if (sel_edge != null)    sel_edge.highlight();
+  // draw vertices
+  Iterator itv = nodes.entrySet().iterator();
+  while (itv.hasNext ()) {
+    Map.Entry ev = (Map.Entry)itv.next();
+    String k  = (String) ev.getKey();
+    Node node = (Node) ev.getValue();
+    node.update();
+    if(node != selection && node != selected) node.show();
+  }  
+  if ( selection != null)  {
+    selection.highlight();
+    highlite_vizgroup();
+  }
+  if ( selected  != null )  selected.highlight();  
+  if ( from_node  != null ) from_node.highlight();  
+  if ( sel_edge  != null )  sel_edge.highlight();
+  markNode();
+  markEdge();
+}
+
+void highlite_vizgroup() {//Displays selected group topics
+  if (vizgroup!=null){
+    for (int i = 0; i < vizgroup.size(); i++) {
+      Node n = (Node) vizgroup.get(i);
+      n.highlight();
+    }  
+  }
+}
+
+////////  DEBUG TRACE  /////////////////////////////////////////////////////////
+void funcTrace(String f) {
+  func = f;
+  fill(Gray);
+  textSize(12);
+  textAlign(RIGHT, TOP);
+  text(f, WORLD_SIZE_W - 20, 10);
+}
+
+void debugTrace() {
+  funcTrace(func);
+  fill(Gray);
+  textSize(12);
+  textAlign(LEFT, TOP);
+  str = "scale:" + factor; text(str, 10, 10);
+  str = (personal)?"personal":"team"; 
+  str += " work";
+  text(str, 70, 10);
+  
+  Iterator it = usercolors.keySet().iterator();
+  int i=0,loc=10,h=10;
+  while (it.hasNext ()) {
+    String key = (String) it.next();
+    UserColor usercolor = (UserColor) usercolors.get(key);
+    stroke(usercolor.c); 
+    strokeWeight(3);   
+    line (loc,WORLD_SIZE_H-h,loc+20,WORLD_SIZE_H-h);
+    text(usercolor.name,loc+25,WORLD_SIZE_H-h-10);
+    loc += textWidth(usercolor.name)+35;
+    if (loc > WORLD_SIZE_W - 100) {
+      loc=10; h -= 10; 
+    }
+  }
+ 
+  //str = "motion:" + toStr(mouse_motion); text(str, 10, 10);
+  if (debug) {
+    if (!isMouse) {
+      str = "touch menu active:" + menu_active;            text(str, 10, 20);
+      str = "apmenu active:" + apmenu_active;              text(str, 150, 20);
+      str = "menu:" + toStr(menu);                         text(str, 10, 30);
+      str = "apmenu:" + toStr(apmenu);                     text(str, 150, 30);
+      str = "tuoch x=" + touchX + " y=" + touchY;          text(str, 10, 40);
+      str = "screen x=" + scrnX + " y=" + scrnY;           text(str, 140, 40);
+      str = "point x=" + pointX + " y=" + pointY;          text(str, 270, 40);
+      str = "screen x=" + scrnX + " y=" + scrnY;           text(str, 400, 40);
+      str = "start x=" + pressStartX + " y=" + pressStartY; text(str, 530, 40);
+      str = (selection != null)? selection.name : "";  
+      str = "selection:\t" + str;                          text(str, 10, 50);
+      str = (selected != null)?  selected.name  : "";
+      str = "selected:\t"  + str;                          text(str, 10, 60);
+      str = event;                                         text(str, 10, 70);
+      str = "dragging=" + dragging;                        text(str, 140, 70);
+      str = "dragging node=" + draggingnode;               text(str, 270, 70);
+      str = "func=" + func;                                text(str, 400, 70);
+      str = "touch count=" + touch_count;                  text(str, 10, 80);
+      //str = "start time(ms)=" + start;                      text(str, 140, 80);
+      //str = "elapsed time=" + elapsedTimeSec;              text(str, 270, 80);
+      //str = "holding=" + holding;                          text(str, 400, 80);
+      //str = "touched=" + touched;                          text(str, 530, 80);
+    }
+    else {
+      str = "menu active:" + menu_active;                  text(str,  10, 20);
+      str = "apmenu active:" + apmenu_active;              text(str, 150, 20);
+      str = "menu:" + toStr(menu);                         text(str,  10, 30);
+      str = "apmenu:" + toStr(apmenu);                     text(str, 150, 30);
+      str = "mouse x=" + mouseX + " y=" + mouseY;          text(str,  10, 40);
+      str = "point x=" + pointX + " y=" + pointY;          text(str, 150, 40);
+      str = "screen x=" + scrnX + " y=" + scrnY;           text(str, 290, 40);
+      str = "start x=" + pressStartX + " y=" + pressStartY;text(str, 430, 40);
+      str = (selection != null)? selection.name : "";      
+      str = "selection:\t" + str;                          text(str,  10, 50);
+      str = (from_node != null)? from_node.name : "";      
+      str = "from:\t" + str;                               text(str, 150, 50);
+      str = (selection != null)? selection.shape : "";      
+      str = "shape:\t" + str;                              text(str, 290, 50);
+      str = (selected != null)? selected.name : "";      
+      str = "selected:\t"  + str;                          text(str,  10, 60);
+      str = (to_node != null)? to_node.name : "";      
+      str = "to:\t"  + str;                          text(str, 150, 60);
+      str = event;                                         text(str,  10, 70);        
+      str = "mouse=" + mouseMode;                          text(str, 150, 70);    
+      str = "dragging=" + dragging;                        text(str, 290, 70);
+      str = "func=" + func;                                text(str, 430, 70);
+      str = "start=" + start;                              text(str, 570, 70);
+      str = (sel_edge != null)? sel_edge.from.name : "";      
+      str = "edge from:\t"  + str;                         text(str,  10, 80);
+      str = (sel_edge != null)? sel_edge.to.name : "";      
+      str = "to:\t"  + str;                                text(str, 150, 80);
+      str = (sel_edge != null)? sel_edge.asc_id : "";      
+      str = "asc_id:\t"  + str;                            text(str, 290, 80);
+      str = (sel_edge != null)? "" + sel_edge.dup : "";      
+      str = "dup:\t"  + str;                               text(str, 430, 80);
+      str = (previous_selection != null)? "" + previous_selection.name : "";            
+      str = "previous_selection=" + str;                   text(str,  10, 90);
+      //str = "theta1=" + degrees(theta1);                   text(str,  10, 90);
+      //str = "phai=" + degrees(phai);                       text(str, 150, 90);
+      //str = "theta2=" + degrees(theta2);                   text(str, 290, 90);
+  }
+}
+
+if (eventtrace) {  
+    str = "mouse :"  + toStr(mouse_event); text(str, 10, 110);
+    str = "touch :"  + toStr(touch_event); text(str, 10, 120);
+    str = "motion:" + toStr(mouse_motion); text(str, 10, 130);
+    str = "action:" + toStr(mouse_action); text(str, 10, 140);
+    str = "time:" + millis()/1000F;        text(str, 10, 150);
+    str = "Ct:" + touchedC;                text(str, 10, 160);
+    str = "startC:" + startC;              text(str, 10, 170);
+    str = "CTimer:" + elapsedTimeClick;    text(str, 10, 180);
+    str = "Dt:" + touchedD;                text(str,100, 160);
+    str = "startD:" + startD;              text(str,100, 170);
+    str = "DTimer:" + elapsedTimeDoubleClick;          text(str,100, 180);
+    str = "Ht:" + touchedH;                text(str,180, 160);
+    str = "startH:" + startH;              text(str,180, 170);
+    str = "HTimer:" + elapsedTimeHold;    text(str,180, 180);
+    str = "pressed:" + mousePressed;      text(str,120, 110);
+    str = "is down:" + is_down;            text(str,120, 120);
+    str = "start__:" + start_dist;        text(str, 10, 190);
+    str = "current:" + currt_dist;        text(str, 10, 200);
+    str = "scale__:" + scl/100;           text(str, 10, 210);
+  }
+}
+/*
+void setParams(float frame, float spring_length, float spring_strength, float spring_damping, float spacer_strength, float drag, int mass) {
+  FRAME          = frame;
+  SPRING_LENGTH  = spring_length;
+  SPRING_STRENGTH = spring_strength; // 0.2;
+  SPRING_DAMPING  = spring_damping; // 0.2;
+  SPACER_STRENGTH = spacer_strength;// 1000;
+  DRAGFACTOR      = drag; //0.2
+  //MASS            = mass;
+}
+*/