package jp.ac.kyutech.mns.ist;
import java.awt.Color;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.awt.geom.Rectangle2D;
import java.util.ArrayList;
import java.util.Collection;
import javax.swing.JPopupMenu;
import jp.ac.kyutech.mns.ist.plugin.DefaultPlugin;
import jp.ac.kyutech.mns.ist.plugin.SheetPlugin_Play;
import jp.ac.kyutech.mns.ist.sheetmap.SeatmapController;
import jp.ac.kyutech.mns.ist.util.FadeTimer;
import jp.ac.kyutech.mns.ist.util.MyPImage;
import jp.ac.kyutech.mns.ist.util.MyQueue;
import edu.umd.cs.piccolo.PCanvas;
import edu.umd.cs.piccolo.PNode;
import edu.umd.cs.piccolo.event.PInputEvent;
import edu.umd.cs.piccolo.event.PInputEventFilter;
import edu.umd.cs.piccolo.nodes.PPath;
import edu.umd.cs.piccolo.nodes.PText;
import edu.umd.cs.piccolo.util.PAffineTransform;
public class Sheet extends PPath {
private static final long serialVersionUID = 5503641085788469535L;
/**
* 背景画像を表示しているシート
*/
static MyQueue<Sheet> pimgShowingSheets;
/**
* 背景画像を表示しているシートの初期化
*/
static {
pimgShowingSheets = new MyQueue<Sheet>();
}
/**
* 背景画像を表示しているシートの追加と,容量をあふれたときの非表示化
* @param s
*/
public static void putPImgQueue(Sheet s){
if (!pimgShowingSheets.hasData(s)) {
pimgShowingSheets.put(s);
}
if (pimgShowingSheets.size()>20){
Sheet lasts = pimgShowingSheets.get();
lasts.doshowImage(false);
}
}
private Note note;
PCanvas canvas; //親のキャンバス.ポップアップメニューを出すときに必要
// JFrame frame; //親のウィンドウフレーム.ポップアップメニューを出すときに必要
public int num;
MyPImage pimg;
Event_onSheet event_onsheet;
Event_onSheet_Draw event_onsheet_draw;
PText printNum;
PText numPT;
ArrayList<DefaultPlugin> plugins;
//追加機能分のメニュー
public void addPluginMenuTo(JPopupMenu menu) {
for(DefaultPlugin dp: plugins){
dp.addMenu(menu);
}
}
static Color numPTColor = new Color(255,153,102);
static Color numPTColorAry[] = new Color[7];
static {
int i = 1;
for(float f=0.02f; f<0.9f; f+=0.15f){
numPTColorAry[i] = new Color(Color.HSBtoRGB(f, 0.9f, 0.8f));
i++;
if (i>6) break;
}
}
public Note getNote(){
return note;
}
/**
* シートの背景画像を表示する/非表示にする
* @param f
*/
public void isshowImage(boolean f){
if (f) {
doshowImage(f);
Sheet.putPImgQueue(this);
} else {
}
}
/**
* 実際にシート背景画像の表示・非表示の切り替えを実行する
* @param f
*/
public void doshowImage(boolean f){
if (f && pimg == null){
MyPImage orig = (MyPImage)SimpleATN.theapp.pimages.get(num);
if (orig == null) return;
pimg = orig.refClone();
addChild(pimg);
pimg.scale(0.89);
pimg.offset(30,30);
pimg.setPickable(false);
pimg.moveToBack();
} else if (!f && pimg != null){
pimg.removeFromParent();
pimg = null;
}
}
/**
* このシートに書かれた筆記をかえす
* @return
*/
public ArrayList<ShortStroke> getAllShortStroke(){
ArrayList<ShortStroke> temp = new ArrayList<ShortStroke>();
for(ShortStroke ss: note.getAll()){
if (ss.paperid == num) temp.add(ss);
}
return temp;
}
public Sheet(Note parent, int n){
note = parent;
num = n;
canvas = SimpleATN.theapp.getCanvas();
//シート上でのマウス操作
event_onsheet = new Event_onSheet(this);
addInputEventListener(event_onsheet);
setVisible(false);
event_onsheet_draw = new Event_onSheet_Draw(this);
// GradientPaint gp = new GradientPaint(0,0,Color.RED,500,300,Color.YELLOW);
// setPaint(gp);
// setStrokePaint(null);
// setTransparency(0.2f);
setPaint(Color.white);
numPT = new PText(String.valueOf(num));
numPT.setScale(70f);
numPT.setTransparency(0.7f);
numPT.setTextPaint(numPTColorAry[num]);
numPT.setOffset(120,0);
addChild(numPT);
numPT.moveToFront();
numPT.setPickable(false);
numPT.setVisible(false);
plugins = new ArrayList<DefaultPlugin>();
plugins.add(new SheetPlugin_Play(canvas, this));
}
public void setDrawMode(boolean f){
if (f){
removeInputEventListener(event_onsheet);
addInputEventListener(event_onsheet_draw);
event_onsheet_draw.setEventFilter(new PInputEventFilter(InputEvent.BUTTON1_MASK));
} else {
removeInputEventListener(event_onsheet_draw);
addInputEventListener(event_onsheet);
event_onsheet_draw.setEventFilter(new PInputEventFilter(InputEvent.BUTTON1_MASK));
}
}
public void focus(PInputEvent aEvent){
//フォーカス
Rectangle2D globalb = getGlobalBounds();
SimpleATN.theapp.zoomToBounds(globalb, 1000,"Sheet.focus");
// canvas.getCamera().animateViewToCenterBounds(globalb, true, 1000);
}
public Rectangle2D convert(PPath selection){
PAffineTransform at = SimpleATN.theapp.getCanvas().getCamera().getViewTransform();
Rectangle2D globalb = new Rectangle2D.Double();
at.inverseTransform(selection.getGlobalBounds(), globalb);//cambからglobalbに計算
Rectangle2D sheetb = this.globalToLocal(globalb);
return sheetb;
}
//集約表示 TODO:
public void collect(PPath selection, int keycode){
//(1)
// System.out.println("sel localtoglobal (b) "+selection.localToGlobal(selection.getBounds()).toString());
//=(1) System.out.println("sel bound globalbound "+selection.getGlobalBounds().toString());
//=(1) System.out.println("sel bound "+selection.getBounds().toString());
//=(1) System.out.println("sel bound cam2layer "+BUtil.convertRtoR(selection.getBounds(), SimpleATN.theapp.canvas.getCamera(), SimpleATN.theapp.canvas.getLayer()).toString());
//=(1) System.out.println("sel bound cam2global "+BUtil.convertRtoR(selection.getBounds(), SimpleATN.theapp.canvas.getCamera(), null).toString());
//=(1) System.out.println("sel bound cam2cam "+BUtil.convertRtoR(selection.getBounds(), SimpleATN.theapp.canvas.getCamera(), SimpleATN.theapp.canvas.getCamera()).toString());
//(2) System.out.println(this.getBounds().toString());
//=(2)-translate System.out.println("sheet2cam "+BUtil.convertRtoR(this.getBounds(), this, SimpleATN.theapp.canvas.getCamera()).toString());
//=(2)-translate System.out.println("sheet2layer "+BUtil.convertRtoR(this.getBounds(), this, SimpleATN.theapp.canvas.getLayer()).toString());
PAffineTransform at = SimpleATN.theapp.getCanvas().getCamera().getViewTransform();
Rectangle2D globalb = new Rectangle2D.Double();
at.inverseTransform(selection.getGlobalBounds(), globalb);//cambからglobalbに計算
Rectangle2D sheetb = this.globalToLocal(globalb);
if (keycode == KeyEvent.VK_ENTER){
/*FocusFrame ff =*/ new FocusFrame("Focus ["+num+"] ", SimpleATN.theapp, sheetb, this, false, true);
// ff.windowMaximize();
// ff.validate();
// ff.setVisible(true);
} else if (keycode == KeyEvent.VK_F){
/*FocusFrame ff =*/ new FocusFrame("Focus ["+num+"] ", SimpleATN.theapp, sheetb, this, false, false);
// ff.windowNormalize();
// ff.validate();
// ff.setVisible(true);
} else if (keycode == KeyEvent.VK_R){
/*FocusFrame ff =*/ new FocusFrame("Focus ["+num+"] ", SimpleATN.theapp, sheetb, this, true, false);
// ff.validate();
// ff.toggleFocusReference();
// ff.setVisible(true);
FocusFrame.updateFocusReference(this.note.penid);
} else if (keycode == KeyEvent.VK_M){
//seatmap
new SeatmapController(sheetb, SimpleATN.theapp, this.num);
Note.addSSHandler(ConfigWindow.configWin.draw);
}
}
/**
* 印刷前の準備(画像を表示,枠線を消す,ペン番号とシート番号を表示,標準の大きいペン番号を消す)
* @param isBefore
*/
public void prepare_for_print(boolean isBefore){
if (isBefore){
isshowImage(true);
setStrokePaint(null);
printNum = new PText(note.penid+"-"+num);
addChild(printNum);
printNum.setScale(3f);
printNum.setOffset(0,-17);
if (note.isLandscapeMode) {
printNum.offset(10, 980);//やっぱり左上に出す
printNum.rotate(-Math.PI/2);
}
printNum.setTransparency(0.2f);
numPT.removeFromParent();
} else {
isshowImage(false);
setStrokePaint(Color.black);
addChild(numPT);
}
}
public int getSSSize() {
@SuppressWarnings("unchecked")
Collection<PNode> c = getAllNodes();
int num = 0;
for(PNode pn: c){
if (pn instanceof ShortStroke){
num++;
}
}
return num;
}
public void showFadingSheetNum(int keepmsec){
showFadingMessage(String.valueOf(num), null, numPTColorAry[num], 70f, 0.7f, keepmsec);
}
public void showStaticSheetNum(boolean f){
numPT.setVisible(f);
}
public void showFadingMessage(String s, Color bc, Color fc, float scale, float trans, int msec){
PText pt = new PText(s);
pt.setScale(scale);
pt.setTransparency(trans);
pt.setPaint(bc);
pt.setTextPaint(fc);
pt.setOffset(120,0);
pt.setPickable(false);
addChild(pt);
new FadeTimer(pt, msec, 1000, false);
}
long lastinput = System.currentTimeMillis();
public void notifySheet() {
// System.out.println("snum "+num);
long now = System.currentTimeMillis();
if (now - lastinput > 5000){
animateToColor(Color.yellow, 0);
animateToColor(Color.white, 4000);
note.queueNotifyMessage(num);
// showFadingMessage(String.valueOf(num), Color.yellow, numPTColorAry[num], 70f, 0.7f, 5000);
// showFadingSheetNum(5000);
}
lastinput = now;
}
public int getNum() {
return num;
}
}