package cit.PureATN;
import java.awt.Color;
import java.awt.Graphics;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map;
import org.piccolo2d.PNode;
public class PenUser {
public static Hashtable<String, PenUser> penusers = new Hashtable<String, PenUser>();
public enum GraphicsMode {
Piccolo2D,
AWT;
}
// Piccoloをつかうか、AWTをつかうか選択する
public static GraphicsMode graphicsMode = GraphicsMode.Piccolo2D;
/**
* DPenReceiverから呼ばれる。penIDに対応した、PenUserのインスタンスを返す(なければ用意する)
*
* @param penid
*/
public static PenUser find(String penid) {
penid = penid.trim();
PenUser pu = penusers.get(penid);
if (pu == null) {
pu = new PenUser(penid, Note.theapp);
penusers.put(penid, pu);
}
return pu;
}
/**
* DPenReceiverから呼ばれる。penIDごとに、PenUserのインスタンスを用意している
*
* @param penid
* @param x
* @param y
*/
public static void add(String penid, int x, int y) {
PenUser pu = PenUser.find(penid);
pu.add(x, y);
}
public static void press(String penid, int phase) {
PenUser pu = PenUser.find(penid);
pu.press(phase);
}
public static void drawAll(Graphics g) {
for (PenUser pu : penusers.values()) {
pu.draw(g);
}
}
// オブジェクトごとのフィールド
String penid;
transient ArrayList<Stroke> stockstrks; // Java AWT/Swing Graphics用
public ArrayList<ShortStroke> strokes; // Piccolo2D用
Stroke lastStroke = null;
ShortStroke squiggle = null; // for Note View
transient Note parent;
int num = 0;
public PenUser(String pid, Note _parent) {
parent = _parent;
penid = pid;
if (graphicsMode == GraphicsMode.AWT) {
stockstrks = new ArrayList<Stroke>();
} else {
strokes = new ArrayList<ShortStroke>();
}
// num = penusers.size();
num = Integer.parseInt(pid.replace("pen", ""));
// System.out.println("num = "+num+" "+pid);
}
public void add(int x, int y) {
System.out.println("add (" + penid + ") " + x + " " + y);
if (graphicsMode == GraphicsMode.AWT) {
if (lastStroke == null) {
lastStroke = new Stroke(this);
stockstrks.add(lastStroke);
}
lastStroke.add(x, y);
} else {
if (squiggle == null) {
squiggle = new ShortStroke();
strokes.add(squiggle);
PNode layer = Note.theapp.getCanvas().getLayer();
layer.addChild(squiggle);
squiggle.startDrag_on_draw(x, y);
} else {
squiggle.drag_on_draw(x, y);
PNode layer = Note.theapp.getCanvas().getLayer();
layer.repaint();
}
}
Note.theapp.repaint();
}
public void press(int ph) {
System.out.println("press " + ph);
if (ph == 0) {
if (graphicsMode == GraphicsMode.AWT) {
if (lastStroke != null) {
lastStroke.finish();
// bundlesend(lastStroke);
lastStroke = null;
}
} else {
squiggle = null;
}
}
}
public void draw(Graphics g) {
g.setColor(Color.getHSBColor((float) (num / 10.0f), 0.8f, 0.8f));
int count = stockstrks.size();
for (int i = 0; i < count; i++) {
Stroke st = stockstrks.get(i);
st.draw(g);
}
}
public void send(int x, int y, int x2, int y2) {
Map<String, Object> arg2;
arg2 = new HashMap<String, Object>();
arg2.put("penid", penid);
// arg2.put("phase", drawphase012);
arg2.put("rgb", getColorStringRGB());
arg2.put("date", DPenReceiver.sdfdate.format(new Date()));
arg2.put("time", DPenReceiver.sdftime.format(new Date()));
arg2.put("epoch", System.currentTimeMillis());
arg2.put("x1", x);
arg2.put("y1", y);
arg2.put("x2", x2);
arg2.put("y2", y2);
// parent.ddp.call("/points/insert", new Object[]{arg2});
}
public void bundlesend(Stroke st) {
// Map<String,Object> arg2;
// arg2 = new HashMap<String, Object>();
// arg2.put("penid", penid);
// arg2.put("stroke", st);
// arg2.put("rgb", getColorStringRGB());
// parent.ddp.call("/stockstrks
// insert", new Object[]{arg2});
// arg2.remove("stroke");
// parent.ddp.call("pointsclear", new Object[]{arg2});
}
public String getColorStringRGB() {
Color c = Color.getHSBColor((float) (num / 11.0f), 0.8f, 0.8f);
int r = c.getRed();
int g = c.getGreen();
int b = c.getBlue();
return "rgb(" + r + "," + g + "," + b + ")";
}
}