diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..ea2c229
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,6 @@
+*.class
+.DS_Store
+target/
+
+
+
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 0000000..e0f15db
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,3 @@
+{
+ "java.configuration.updateBuildConfiguration": "automatic"
+}
\ No newline at end of file
diff --git a/jar/piccolo2d-core-3.1-SNAPSHOT.jar b/jar/piccolo2d-core-3.1-SNAPSHOT.jar
new file mode 100644
index 0000000..2d4f3e4
--- /dev/null
+++ b/jar/piccolo2d-core-3.1-SNAPSHOT.jar
Binary files differ
diff --git a/jar/piccolo2d-examples-3.1-SNAPSHOT.jar b/jar/piccolo2d-examples-3.1-SNAPSHOT.jar
new file mode 100644
index 0000000..66480c7
--- /dev/null
+++ b/jar/piccolo2d-examples-3.1-SNAPSHOT.jar
Binary files differ
diff --git a/jar/piccolo2d-extras-3.1-SNAPSHOT.jar b/jar/piccolo2d-extras-3.1-SNAPSHOT.jar
new file mode 100644
index 0000000..f2f1166
--- /dev/null
+++ b/jar/piccolo2d-extras-3.1-SNAPSHOT.jar
Binary files differ
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..9a2ec2e
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,99 @@
+
+ 4.0.0
+ cit.PureATN
+ PureATN_M
+ jar
+ 1.0-SNAPSHOT
+ PureATN_M
+ http://maven.apache.org
+
+
+ 11
+ UTF-8
+ UTF-8
+ 11
+ 11
+
+
+
+
+
+ org.codehaus.mojo
+ exec-maven-plugin
+ 3.0.0
+
+ cit.PureATN.App
+
+ ${pom.basedir}/jar/piccolo2d-core-3.1-SNAPSHOT.jar
+ ${pom.basedir}/jar/piccolo2d-examples-3.1-SNAPSHOT.jar
+ ${pom.basedir}/jar/piccolo2d-extras-3.1-SNAPSHOT.jar
+
+
+
+
+
+ maven-assembly-plugin
+
+
+
+ false
+
+
+ jar-with-dependencies
+
+
+
+
+ cit.PureATN.App
+
+
+ all-permissions
+ .
+
+
+
+
+
+
+
+
+
+
+
+
+
+ piccolo2d_core
+ piccolo2d.core
+ 3.1
+ system
+ ${pom.basedir}/jar/piccolo2d-core-3.1-SNAPSHOT.jar
+
+
+ piccolo2d_examples
+ piccolo2d.examples
+ 3.1
+ system
+ ${pom.basedir}/jar/piccolo2d-examples-3.1-SNAPSHOT.jar
+
+
+ piccolo2d_extras
+ piccolo2d.extras
+ 3.1
+ system
+ ${pom.basedir}/jar/piccolo2d-extras-3.1-SNAPSHOT.jar
+
+
+
+ junit
+ junit
+ 3.8.1
+ test
+
+
+
\ No newline at end of file
diff --git a/src/main/java/cit/PureATN/App.java b/src/main/java/cit/PureATN/App.java
new file mode 100644
index 0000000..84caa12
--- /dev/null
+++ b/src/main/java/cit/PureATN/App.java
@@ -0,0 +1,9 @@
+package cit.PureATN;
+
+public class App
+{
+ public static void main( String[] args )
+ {
+ new Note();
+ }
+}
diff --git a/src/main/java/cit/PureATN/DPenReceiver.java b/src/main/java/cit/PureATN/DPenReceiver.java
new file mode 100644
index 0000000..2b6f46d
--- /dev/null
+++ b/src/main/java/cit/PureATN/DPenReceiver.java
@@ -0,0 +1,92 @@
+package cit.PureATN;
+
+import java.io.IOException;
+import java.net.DatagramPacket;
+import java.net.DatagramSocket;
+import java.net.SocketException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Hashtable;
+
+public class DPenReceiver implements Runnable {
+
+ SimpleDateFormat sdf = new SimpleDateFormat("-- MM/dd hh:mm --");
+ public static SimpleDateFormat sdfdate = new SimpleDateFormat("yyyy-MM-dd");
+ public static SimpleDateFormat sdftime = new SimpleDateFormat("HH:mm:ss");
+ Thread serverThread;
+
+ Note note; //筆記を表示する画面
+
+ public DPenReceiver(Note _note){
+ note = _note;
+
+ serverThread = new Thread(this);
+ serverThread.start();
+
+ }
+
+ @SuppressWarnings("resource")
+ public void run() {
+
+ DatagramSocket datagramSocket = null;
+ try {
+ datagramSocket = new DatagramSocket(19876);
+ } catch (SocketException e) {
+ e.printStackTrace();
+ }
+ byte[] data = new byte[200];
+
+ while(true){
+
+ DatagramPacket datagramPacket = new DatagramPacket(data, 200);
+ try {
+ datagramSocket.receive(datagramPacket);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ data = datagramPacket.getData();
+ int length = datagramPacket.getLength();
+ String message = new String(data,0,length);
+ System.out.println(message);
+ receive(message); // この下に定義があります
+ }
+
+ }
+ public void receive(String mes){
+ String dtime = sdf.format(new Date());
+ System.out.println(dtime+" "+mes);
+ String[] ints = mes.split(" ");
+ if (ints[0].equals("press")){
+ String pen = ints[2];
+ String penid = convertPenSerial2PenID.get(pen);
+ if (penid != null) pen = penid;
+ PenUser.press(pen, Integer.parseInt(ints[1])); // 1 press, 0 up
+ } else {
+ int x1 = Integer.parseInt(ints[2]);
+ int y1 = Integer.parseInt(ints[3]);
+ // TODO: check x1y1 or x2y2 for latest point in .NET!
+ // int x2 = Integer.parseInt(ints[2]);
+ // int y2 = Integer.parseInt(ints[3]);
+ String pen = ints[4];
+ String penid = convertPenSerial2PenID.get(pen);
+ if (penid != null) pen = penid;
+ // send(x1,y1,x2,y2,pen,1);
+ PenUser.add(pen, x1, y1);
+ }
+ }
+ Hashtable convertPenSerial2PenID;
+ public void initPenHash(){
+ convertPenSerial2PenID = new Hashtable();
+ convertPenSerial2PenID.put("AR6-AAP-ETK-C4", "pen01");
+ convertPenSerial2PenID.put("AR6-AAP-DYT-GJ", "pen02");
+ convertPenSerial2PenID.put("AR6-AAP-EH3-3S", "pen03");
+ convertPenSerial2PenID.put("AR6-AAP-D2D-H5", "pen04");
+ convertPenSerial2PenID.put("AR6-AAP-BPY-6D", "pen05");
+ convertPenSerial2PenID.put("AR6-AAP-EG8-2Y", "pen06");
+ convertPenSerial2PenID.put("AR6-AAP-EQ4-AK", "pen07");
+ convertPenSerial2PenID.put("AR6-AAP-ED3-XS", "pen08");
+ convertPenSerial2PenID.put("AR6-AAP-BPZ-6E", "pen09");
+ convertPenSerial2PenID.put("AR6-AAP-DYP-GE", "pen10");
+ }
+}
diff --git a/src/main/java/cit/PureATN/IPoint.java b/src/main/java/cit/PureATN/IPoint.java
new file mode 100644
index 0000000..064c024
--- /dev/null
+++ b/src/main/java/cit/PureATN/IPoint.java
@@ -0,0 +1,21 @@
+package cit.PureATN;
+
+public class IPoint {
+ int x1, y1;
+ long epoch;
+
+ IPoint(int x, int y){
+ x1 = x;
+ y1 = y;
+// this.x2 = x2;
+// this.y2 = y2;
+ epoch = System.currentTimeMillis();
+ }
+ public int[] toIntAry(long base_epoch){
+ int[] ret = new int[3];
+ ret[0] = x1;
+ ret[1] = y1;
+ ret[2] = (int)(epoch - base_epoch);
+ return ret;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/cit/PureATN/MyPPanEventHandler.java b/src/main/java/cit/PureATN/MyPPanEventHandler.java
new file mode 100644
index 0000000..c676253
--- /dev/null
+++ b/src/main/java/cit/PureATN/MyPPanEventHandler.java
@@ -0,0 +1,23 @@
+package cit.PureATN;
+
+import org.piccolo2d.PCanvas;
+import org.piccolo2d.event.PDragSequenceEventHandler;
+import org.piccolo2d.event.PInputEvent;
+import org.piccolo2d.util.PDimension;
+
+/**
+ * ATNWindow右上メニューの[pan]
+ * @author miuramo
+ *
+ */
+public class MyPPanEventHandler extends PDragSequenceEventHandler {
+ PCanvas canvas;
+
+ public MyPPanEventHandler(PCanvas _canvas){
+ canvas = _canvas;
+ }
+ public void drag(PInputEvent e) {
+ PDimension d = e.getDelta();
+ canvas.getCamera().translateView(d.getWidth(), d.getHeight());
+ }
+}
diff --git a/src/main/java/cit/PureATN/Note.java b/src/main/java/cit/PureATN/Note.java
new file mode 100644
index 0000000..6ffc5c8
--- /dev/null
+++ b/src/main/java/cit/PureATN/Note.java
@@ -0,0 +1,105 @@
+package cit.PureATN;
+
+import java.awt.BasicStroke;
+import java.awt.event.InputEvent;
+import java.awt.geom.Point2D;
+
+import javax.swing.WindowConstants;
+
+import org.piccolo2d.PCanvas;
+import org.piccolo2d.PLayer;
+import org.piccolo2d.event.PBasicInputEventHandler;
+import org.piccolo2d.event.PDragSequenceEventHandler;
+import org.piccolo2d.event.PInputEvent;
+import org.piccolo2d.event.PInputEventFilter;
+import org.piccolo2d.event.PMouseWheelZoomEventHandler;
+import org.piccolo2d.extras.PFrame;
+import org.piccolo2d.nodes.PPath;
+import org.piccolo2d.util.PPaintContext;
+
+public class Note extends PFrame {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private PLayer layer;
+ public static PInputEventFilter disablemask = new PInputEventFilter(0);
+ public static Note theapp; // The Application
+
+
+ public Note() {
+ this(null);
+ setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
+ theapp = this; // どこからでもNote.theapp で参照できるように
+ }
+
+ public Note(final PCanvas aCanvas) {
+ super("Note", false, aCanvas);
+ setSize(650, 800);
+ }
+
+ public void initialize() {
+ super.initialize();
+
+ // らくがき用マウスイベント
+ final PBasicInputEventHandler squiggleEventHandler = createSquiggleEventHandler();
+ squiggleEventHandler.setEventFilter(new PInputEventFilter(InputEvent.BUTTON1_MASK));
+ getCanvas().removeInputEventListener(getCanvas().getPanEventHandler());
+ getCanvas().addInputEventListener(squiggleEventHandler);
+
+ // install mouse wheel zoom event handler
+ final PMouseWheelZoomEventHandler mouseWheelZoomEventHandler = new PMouseWheelZoomEventHandler();
+ getCanvas().addInputEventListener(mouseWheelZoomEventHandler);
+
+ // pan
+ // final MyPPanEventHandler panEventHandler = new MyPPanEventHandler(getCanvas());
+ // panEventHandler.setEventFilter(disablemask);
+ // getCanvas().addInputEventListener(panEventHandler);
+
+
+ layer = getCanvas().getLayer();
+
+ getCanvas().setDefaultRenderQuality(PPaintContext.HIGH_QUALITY_RENDERING);
+ getCanvas().setAnimatingRenderQuality(PPaintContext.HIGH_QUALITY_RENDERING);
+ getCanvas().setInteractingRenderQuality(PPaintContext.HIGH_QUALITY_RENDERING);
+ }
+
+ public PBasicInputEventHandler createSquiggleEventHandler() {
+ return new PDragSequenceEventHandler() {
+
+ protected PPath squiggle;
+
+ public void startDrag(final PInputEvent e) {
+ super.startDrag(e);
+
+ final Point2D p = e.getPosition();
+
+ squiggle = new PPath.Float();
+ squiggle.moveTo((float) p.getX(), (float) p.getY());
+ squiggle.setStroke(new BasicStroke((float) (1 / e.getCamera().getViewScale())));
+ layer.addChild(squiggle);
+ }
+
+ public void drag(final PInputEvent e) {
+ super.drag(e);
+ updateSquiggle(e);
+ }
+
+ public void endDrag(final PInputEvent e) {
+ super.endDrag(e);
+ updateSquiggle(e);
+ squiggle = null;
+ }
+
+ public void updateSquiggle(final PInputEvent aEvent) {
+ final Point2D p = aEvent.getPosition();
+ squiggle.lineTo((float) p.getX(), (float) p.getY());
+ }
+ };
+ }
+
+ public static void main(final String[] args) {
+ new Note();
+ }
+
+}
diff --git a/src/main/java/cit/PureATN/PenUser.java b/src/main/java/cit/PureATN/PenUser.java
new file mode 100644
index 0000000..9d53030
--- /dev/null
+++ b/src/main/java/cit/PureATN/PenUser.java
@@ -0,0 +1,114 @@
+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;
+
+public class PenUser {
+ public static Hashtable penusers = new Hashtable();
+
+ 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;
+ }
+ 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;
+ ArrayList strokes;
+ Stroke lastStroke = null;
+ transient Note parent;
+ int num = 0;
+ public PenUser(String pid, Note _parent){
+ parent = _parent;
+ penid = pid;
+ strokes = new ArrayList();
+ // 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(penid+" "+x+" "+y);
+ if (lastStroke == null){
+ lastStroke = new Stroke(this);
+ strokes.add(lastStroke);
+ }
+ lastStroke.add(x,y);
+ Note.theapp.repaint();
+ }
+ public void press(int ph){
+ if (ph == 0){
+ if (lastStroke != null){
+ lastStroke.finish();
+ bundlesend(lastStroke);
+ lastStroke = null;
+ }
+ } else {
+
+ }
+ }
+ public void draw(Graphics g){
+ g.setColor(Color.getHSBColor((float)(num/10.0f), 0.8f, 0.8f));
+ int count = strokes.size();
+ for(int i=0;i arg2;
+ arg2 = new HashMap();
+ 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 arg2;
+ // arg2 = new HashMap();
+ // arg2.put("penid", penid);
+ // arg2.put("stroke", st);
+ // arg2.put("rgb", getColorStringRGB());
+ // parent.ddp.call("/strokes/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+")";
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/cit/PureATN/Stroke.java b/src/main/java/cit/PureATN/Stroke.java
new file mode 100644
index 0000000..cf262bf
--- /dev/null
+++ b/src/main/java/cit/PureATN/Stroke.java
@@ -0,0 +1,54 @@
+package cit.PureATN;
+
+import java.awt.Graphics;
+import java.util.ArrayList;
+import java.util.Date;
+
+public class Stroke {
+ transient ArrayList points;
+ String date;
+ String time;
+ long start_epoch;
+ transient int prex = -1, prey = -1;
+ int[][] stroke;
+ int count;
+ int duration;
+ transient PenUser penuser;
+ public Stroke(PenUser _pu){
+ penuser = _pu;
+ date = DPenReceiver.sdfdate.format(new Date());
+ time = DPenReceiver.sdftime.format(new Date());
+
+ start_epoch = System.currentTimeMillis();
+ }
+ public void add(int x, int y){
+ if (x != prex || y!= prey){
+ if (points == null) {
+ points = new ArrayList();
+ points.add(new IPoint(x,y));
+ } else {
+ points.add(new IPoint(x,y));
+ penuser.send(prex,prey,x,y);
+ Note.theapp.repaint();
+ }
+ }
+ prex = x; prey = y;
+ }
+ public void draw(Graphics g){
+ IPoint p0 = points.get(0);
+ for(int i=1;i