tv.dyndns.kishibe.qmaclone.client.game.input.InputWidgetTegaki.java Source code

Java tutorial

Introduction

Here is the source code for tv.dyndns.kishibe.qmaclone.client.game.input.InputWidgetTegaki.java

Source

//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 java.util.Arrays;
import java.util.logging.Level;
import java.util.logging.Logger;

import tv.dyndns.kishibe.qmaclone.client.Service;
import tv.dyndns.kishibe.qmaclone.client.game.AnswerView;
import tv.dyndns.kishibe.qmaclone.client.game.SessionData;
import tv.dyndns.kishibe.qmaclone.client.game.handwriting.StrokeCanvas;
import tv.dyndns.kishibe.qmaclone.client.game.handwriting.StrokeCanvasListener;
import tv.dyndns.kishibe.qmaclone.client.game.panel.QuestionPanel;
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.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;

public class InputWidgetTegaki extends InputWidget implements ClickHandler, StrokeCanvasListener {
    private static final Logger logger = Logger.getLogger(InputWidgetTegaki.class.getName());
    private static final int GRID_COLUMS = 3;
    private static final int GRID_ROWS = 4;
    public static final int NUMBER_OF_CANDIDATE = GRID_COLUMS * GRID_ROWS;
    private final StrokeCanvas strokeCanvas = new StrokeCanvas(this);
    private final Button[] buttons = new Button[NUMBER_OF_CANDIDATE];
    private final Button buttonOk = new Button("OK", this);
    private final Button buttonDelete = new Button("", this);
    private final Button buttonClear = new Button("", this);

    public InputWidgetTegaki(PacketProblem problem, AnswerView answerView, QuestionPanel questionPanel,
            SessionData sessionData) {
        super(problem, answerView, questionPanel, sessionData);

        for (int i = 0; i < NUMBER_OF_CANDIDATE; ++i) {
            buttons[i] = new Button("", this);
            buttons[i].setStyleName("gwt-Button-tegaki");
        }

        final HorizontalPanel horizontalPanel = new HorizontalPanel();
        horizontalPanel.setVerticalAlignment(ALIGN_BOTTOM);

        {
            // 
            final VerticalPanel panel = new VerticalPanel();
            panel.add(new Label(""));

            {
                final Grid grid = new Grid(GRID_ROWS, GRID_COLUMS);
                int index = 0;
                for (int row = 0; row < GRID_ROWS; ++row) {
                    for (int column = 0; column < GRID_COLUMS; ++column) {
                        grid.setWidget(row, column, buttons[index++]);
                    }
                }
                panel.add(grid);
            }
            horizontalPanel.add(panel);
        }

        horizontalPanel.add(strokeCanvas);

        {
            final VerticalPanel verticalPanel = new VerticalPanel();
            buttonClear.setStyleName("gwt-Button-tegakiControl");
            buttonDelete.setStyleName("gwt-Button-tegakiControl");
            buttonOk.setStyleName("gwt-Button-tegakiControl");
            verticalPanel.add(buttonClear);
            verticalPanel.add(buttonDelete);
            verticalPanel.add(buttonOk);
            horizontalPanel.add(verticalPanel);
        }

        add(horizontalPanel);
    }

    public void enable(boolean b) {
        for (Button button : buttons) {
            button.setEnabled(b);
        }
        buttonOk.setEnabled(b);
        buttonDelete.setEnabled(b);
        buttonClear.setEnabled(b);
    }

    private void clearButtons() {
        for (Button button : buttons) {
            button.setText("");
        }
    }

    public void onStrokeFinished() {
        Service.Util.getInstance().recognizeHandwriting(strokeCanvas.getStrokes(), callbackRecognizeHandwriting);
    }

    private final AsyncCallback<String[]> callbackRecognizeHandwriting = new AsyncCallback<String[]>() {
        public void onSuccess(String[] result) {
            clearButtons();

            for (int i = 0; i < NUMBER_OF_CANDIDATE; ++i) {
                if (result.length == i) {
                    break;
                }
                buttons[i].setText(result[i]);
            }
        }

        public void onFailure(Throwable caught) {
            logger.log(Level.WARNING, "?????????", caught);
        }
    };

    @Override
    public void onClick(ClickEvent event) {
        final Widget sender = (Widget) event.getSource();
        String lastAnswer = answerView.get();
        if (Arrays.asList(buttons).contains(sender)) {
            // 1?
            final Button clickedButton = (Button) sender;
            final String letter = clickedButton.getText();
            if (letter.equals("")) {
                return;
            }
            answerView.set(lastAnswer + letter, false);
            strokeCanvas.clear();

            clearButtons();

        } else if (sender == buttonOk) {
            enable(false);
            sendAnswer(lastAnswer);

        } else if (sender == buttonDelete) {
            answerView.set(lastAnswer.isEmpty() ? "" : lastAnswer.substring(0, lastAnswer.length()), false);

        } else if (sender == buttonClear) {
            strokeCanvas.clear();
            clearButtons();
        }
    }
}