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