package cit.PureATN.MultiNote; import java.awt.BasicStroke; import java.awt.Color; import java.awt.geom.Point2D; import java.util.ArrayList; import java.util.Enumeration; import javax.swing.WindowConstants; // import org.josql.Query; // import org.josql.QueryExecutionException; // import org.josql.QueryParseException; // import org.josql.QueryResults; import org.piccolo2d.PCanvas; import org.piccolo2d.PLayer; import org.piccolo2d.activities.PTransformActivity; import org.piccolo2d.nodes.PPath; import org.piccolo2d.util.PBounds; import cit.PureATN.Note; import cit.PureATN.PenUser; import cit.PureATN.ShortStroke; import cit.PureATN.SquiggleEventHandler; public class MultiNote extends Note { static int width = 920; static int height = (int) (width * 1.42); static double rotation = 0; static int muki = 0; static boolean isTate = true; public MultiNote() { this(null); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); theapp = this; // どこからでもNote.theapp で参照できるように } public MultiNote(final PCanvas aCanvas) { super(aCanvas); int width = 1000; int height = (int) (width / 1.414); setSize(width, height); setLocation(100, 200); // dPenReceiver = new DPenReceiver(this); } public static float penID2HSBH(int i) { return ((i + 3) % 10) / 10.0f; } public PPath[] shitajikiNodes = new PPath[12]; public void initialize() { super.initialize(); // 追加機能:キーイベント getCanvas().addKeyListener(new KeyEvent_on_MultiNote(getCanvas())); // 追加機能:右クリックでメニューをだす getCanvas().getCamera().addInputEventListener(new MouseEvent_onMN(this)); currentTitle = "MultiNote ([c]色付け [DEL]全削除 [Esc]ズーム)"; // setTitle(currentTitle); setMousePenID(1); // 基準となる紙の輪郭線 for (int i = 1; i < 11; i++) { PPath stjk = shitajikiNodes[i] = PPath.createRectangle(0, 0, width, height); // stjk.setPaint(Color.getHSBColor((float) (i / 11.0f), 0.1f, 1.0f)); stjk.setPaint(null); stjk.setStrokePaint(Color.getHSBColor(penID2HSBH(i), 0.5f, 1.0f)); stjk.setStroke(new BasicStroke(10)); // if (target.getAttribute("moveTarget")!=null){ // moveTarget = (PNode) target.getAttribute("moveTarget"); // } stjk.addAttribute("moveTarget", stjk); // stjk.setRotation(rotation); getCanvas().getLayer().addChild(stjk); } // getCanvas().getLayer().addChild(PPath.createRectangle(100, 100, 700, 990)); requestFocus(); } public SquiggleEventHandler createSquiggleEvent() { // may be overridden return new SquiggleEventHandler_MultiNote(this); } public static void main(final String[] args) { new MultiNote(); } // 色付け public void iroduke() { Enumeration<String> ite = PenUser.penusers.keys(); while (ite.hasMoreElements()) { String penidStr = ite.nextElement(); String penid0x = penidStr.substring(3); int penid = Integer.parseInt(penid0x); // System.out.println(penid+" "+penid*penid); //pen06 Color c = Color.getHSBColor(penID2HSBH(penid), 0.7f, 0.7f); ArrayList<ShortStroke> sss = PenUser.find(penidStr).strokes; for (ShortStroke s : sss) { s.setStrokePaint(c); // System.out.println("ss.time " + s.time); if (s.getParent() instanceof PLayer) { shitajikiNodes[penid].addChild(s); // 親レイヤーから、下敷きに移動 } } } repaint(); } // 色を戻す d public void irodukeOrig() { Enumeration<String> ite = PenUser.penusers.keys(); while (ite.hasMoreElements()) { String penidStr = ite.nextElement(); String penid0x = penidStr.substring(3); int penid = Integer.parseInt(penid0x); // System.out.println(penid+" "+penid*penid); //pen06 Color c = new Color(0, 0, 90);// Color.getHSBColor(penID2HSBH(penid), 0.7f, 0.7f); ArrayList<ShortStroke> sss = PenUser.find(penidStr).strokes; for (ShortStroke s : sss) { s.setStrokePaint(c); // System.out.println("ss.time " + s.time); if (s.getParent() instanceof PLayer) { shitajikiNodes[penid].addChild(s); // 親レイヤーから、下敷きに移動 } } } repaint(); } // stroke.addAttribute("moveTarget", stroke); public void setMoveTargetToShortStroke(boolean isenable) { Enumeration<String> ite = PenUser.penusers.keys(); while (ite.hasMoreElements()) { String penidStr = ite.nextElement(); String penid0x = penidStr.substring(3); int penid = Integer.parseInt(penid0x); // System.out.println(penid+" "+penid*penid); //pen06 // Color c = Color.getHSBColor((float) (penid / 10.0f), 0.6f, 1.0f); ArrayList<ShortStroke> sss = PenUser.find(penidStr).strokes; for (ShortStroke s : sss) { if (isenable) { s.addAttribute("moveTarget", s); } else { s.addAttribute("moveTarget", null); } } } } /** * 筆記数の確認サンプル:PenIDごとに、筆記数を表示する */ public void showStat() { // 検索対象をあつめる ArrayList<ShortStroke> ass = new ArrayList<ShortStroke>(); var ite = getCanvas().getLayer().getAllNodes().iterator(); while (ite.hasNext()) { var n = ite.next(); if (n instanceof ShortStroke) { ShortStroke ss = (ShortStroke) n; ass.add(ss); } } // (n -> // Query q5 = new Query(); // try { // q5.parse("select * from cit.PureATN.ShortStroke group by penid"); // } catch (QueryParseException e) { // e.printStackTrace(); // } // QueryResults qr5 = null; // try { // qr5 = q5.execute(ass); // Map grpBys = qr5.getGroupByResults(); // Iterator iter = grpBys.keySet().iterator(); // while (iter.hasNext()) { // List key = (List) iter.next(); // List res = (List) grpBys.get(key); // System.out.println(key.toString() + " " + res.size()); // } // // for (ShortStroke ss : (List<ShortStroke>) qr5.getResults()) { // // System.out.println(ss.penid); // // } // } catch (QueryExecutionException e) { // e.printStackTrace(); // } } boolean expandMode = false; // 初期状態は「たたんでいる」 public void vlayout() { vlayout(expandMode); } public void toggleExpandMode() { expandMode = !expandMode; } public void setExpandMode(boolean b) { expandMode = b; } public PBounds getWholeBounds() { double hidariue_x = 0, hidariue_y = 0; if (muki == 1) { hidariue_x = -height; } else if (muki == 2) { hidariue_x = -width; } if (muki == 2) { hidariue_y = -height; } else if (muki == 3) { hidariue_y = -width; } double ww, hh; ww = width; hh = height; if (!isTate) { ww = height; hh = width; } if (expandMode) { return new PBounds(hidariue_x, hidariue_y, ww * 5, hh * 2); } else { return new PBounds(hidariue_x, hidariue_y, ww, hh); } } public void vlayout(boolean doexpand) { PTransformActivity ta = null; double ww, hh; ww = width; hh = height; if (!isTate) { ww = height; hh = width; } if (doexpand) { for (int i = 1; i < 6; i++) { shitajikiNodes[i].animateToPositionScaleRotation((i - 1) * ww, 0, 1, rotation, 1000); } for (int i = 6; i < 11; i++) { ta = shitajikiNodes[i].animateToPositionScaleRotation((i - 6) * ww, hh, 1, rotation, 1000); } PTransformActivity ta2 = getCanvas().getCamera().animateViewToCenterBounds( // getCanvas().getLayer().getFullBounds(), getWholeBounds(), true, 1000); ta2.startAfter(ta); } else { // たたむ for (int i = 1; i < 11; i++) { ta = shitajikiNodes[i].animateToPositionScaleRotation(0, 0, 1, rotation, 1000); } PTransformActivity ta2 = getCanvas().getCamera().animateViewToCenterBounds( // getCanvas().getLayer().getFullBounds(), getWholeBounds(), true, 1000); ta2.startAfter(ta); } } // マウスドラッグのとき、どれか1つの枠内で開始された筆記であれば、その下敷きのUserIDに切り替える public void switchPenIDbyPoint(Point2D p) { int matchCount = 0; int lastMatchID = 0; double originx = (double) p.getX(); double originy = (double) p.getY(); for (int i = 1; i < 11; i++) { double localx = originx - shitajikiNodes[i].getOffset().getX(); double localy = originy - shitajikiNodes[i].getOffset().getY(); if (shitajikiNodes[i].getBounds().contains(localx, localy)) { matchCount++; lastMatchID = i; } } // if (matchCount==1 && lastMatchID > 0){ if (lastMatchID > 0) { setMousePenID(lastMatchID); System.out.println("switch to " + lastMatchID + "(count = " + matchCount + ")"); } } // すべての筆記を消す public void deleteAllStrokes() { for (int i = 1; i < 11; i++) { PPath stjk = shitajikiNodes[i]; stjk.removeAllChildren(); // var children = stjk.getChildrenReference(); // for (var child : children) { // if (child instanceof PPath) { // PPath pchild = (PPath) child; // pchild.removeFromParent(); // } // } // } } } public void rotate() { muki = (muki + 1) % 4; rotation = (Math.PI / 2) * muki; isTate = !isTate; } public void zoomToUpper() { // PTransformActivity ta = null; // for (int i = 1; i < 11; i++) { // ta = shitajikiNodes[i].animateToPositionScaleRotation(0, 0, 1, rotation, 1000); // } PTransformActivity ta2 = getCanvas().getCamera().animateViewToCenterBounds( // getCanvas().getLayer().getFullBounds(), new PBounds(0, 0, width, height *4/ 7), true, 1000); // ta2.startAfter(ta); } public void zoomToLower() { // PTransformActivity ta = null; // for (int i = 1; i < 11; i++) { // ta = shitajikiNodes[i].animateToPositionScaleRotation(0, height/2, 1, rotation, 1000); // } PTransformActivity ta2 = getCanvas().getCamera().animateViewToCenterBounds( // getCanvas().getLayer().getFullBounds(), new PBounds(0, height*3 / 7, width, height*4/7), true, 1000); // ta2.startAfter(ta); } }