//The MIT License // //Copyright (c) 2009 nodchip // //Permission is hereby granted, free of charge, to any person obtaining a copy //of this software and associated documentation files (the "Software"), to deal //in the Software without restriction, including without limitation the rights //to use, copy, modify, merge, publish, distribute, sublicense, and/or sell //copies of the Software, and to permit persons to whom the Software is //furnished to do so, subject to the following conditions: // //The above copyright notice and this permission notice shall be included in //all copies or substantial portions of the Software. // //THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR //IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, //FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE //AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER //LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, //OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN //THE SOFTWARE. package tv.dyndns.kishibe.qmaclone.client.game.input; import tv.dyndns.kishibe.qmaclone.client.constant.Constant; import tv.dyndns.kishibe.qmaclone.client.game.AnswerView; import tv.dyndns.kishibe.qmaclone.client.game.SessionData; import tv.dyndns.kishibe.qmaclone.client.game.click.MarkedCanvas; import tv.dyndns.kishibe.qmaclone.client.game.panel.QuestionPanel; import tv.dyndns.kishibe.qmaclone.client.geom.Point; import tv.dyndns.kishibe.qmaclone.client.packet.PacketProblem; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.dom.client.MouseDownEvent; import com.google.gwt.event.dom.client.MouseDownHandler; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.Image; public class InputWidgetClick extends InputWidget implements MouseDownHandler, ClickHandler { private static InputWidgetClick INSTANCE = null; private boolean throughClick = false; private MarkedCanvas canvas; private final Button buttonOk = new Button("OK", this); private Point clickPosition; private int circleMarkId = MarkedCanvas.REGISTER; private final Image image; /** * 画像の左上の座標を返す。 * * @return 画像。画像が表示されていない場合はnull。 */ public static Point getCanvasOffset() { if (INSTANCE == null || INSTANCE.image == null) { return null; } return new Point(INSTANCE.image.getAbsoluteLeft(), INSTANCE.image.getAbsoluteTop()); } public InputWidgetClick(PacketProblem problem, AnswerView answerView, QuestionPanel questionPanel, SessionData sessionData) { super(problem, answerView, questionPanel, sessionData); HorizontalPanel panel = new HorizontalPanel(); panel.setVerticalAlignment(ALIGN_MIDDLE); image = new Image(problem.getClickImageUrl()); image.setPixelSize(Constant.CLICK_IMAGE_WIDTH, Constant.CLICK_IMAGE_HEIGHT); panel.add(image); buttonOk.setStyleName("gwt-Button-clickControl"); panel.add(buttonOk); canvas = new MarkedCanvas(image, Constant.CLICK_IMAGE_WIDTH, Constant.CLICK_IMAGE_HEIGHT); canvas.addMouseDownHandler(this); add(panel); } public void enable(boolean b) { throughClick = !b; buttonOk.setEnabled(b); } public Point getImageOffset() { int x = image.getAbsoluteLeft(); int y = image.getAbsoluteTop(); return new Point(x, y); } @Override public void onMouseDown(MouseDownEvent event) { if (throughClick) { return; } int x = event.getX(); int y = event.getY(); clickPosition = new Point(x, y); if (canvas != null) { circleMarkId = canvas.addPointerMark(x, y, circleMarkId); canvas.update(); } } @Override public void onClick(ClickEvent event) { Object sender = event.getSource(); if (sender == buttonOk) { sendAnswer(clickPosition != null ? (clickPosition.x + " " + clickPosition.y) : ""); } } @Override protected void hideAnswer() { super.hideAnswer(); // 回答送信後はWidgetPlayerList側が表示を行うためMarkedCanvasのインストアンスを消す if (canvas != null) { canvas.hide(); canvas = null; } } @Override protected void onLoad() { super.onLoad(); // キャンバス表示位置を確定させるためにshow()を呼ぶ。 if (canvas != null) { canvas.show(); } INSTANCE = this; } @Override protected void onUnload() { INSTANCE = null; // BugTrack-QMAClone/575 - QMAClone wiki // http://kishibe.dyndns.tv/qmaclone/wiki/wiki.cgi?page=BugTrack%2DQMAClone%2F575 if (canvas != null) { canvas.hide(); canvas = null; } super.onUnload(); } }