ch.unifr.pai.ice.client.tracking.LineTracking1user.java Source code

Java tutorial

Introduction

Here is the source code for ch.unifr.pai.ice.client.tracking.LineTracking1user.java

Source

package ch.unifr.pai.ice.client.tracking;

/*
 * Copyright 2013 Pascal Bruegger
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
/***************************************************************************************************
 *  Project ICE 
 *  -----------
 *  PAI research Group - Dept. of Informatics 
 *  University of Fribourg - Switzerland
 *  Author: Pascal Bruegger 
 * 
 *************************************************************************************************/

import java.util.Vector;

import ch.unifr.pai.ice.client.ICEMain;
import ch.unifr.pai.ice.client.RequireInitialisation;
import ch.unifr.pai.ice.client.rpc.EventingService;
import ch.unifr.pai.ice.client.rpc.EventingServiceAsync;
import ch.unifr.pai.ice.shared.ExperimentIdentifier;

import com.google.gwt.canvas.client.Canvas;
import com.google.gwt.canvas.dom.client.Context2d;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.MouseDownEvent;
import com.google.gwt.event.dom.client.MouseDownHandler;
import com.google.gwt.event.dom.client.MouseMoveEvent;
import com.google.gwt.event.dom.client.MouseMoveHandler;
import com.google.gwt.event.dom.client.TouchMoveEvent;
import com.google.gwt.event.dom.client.TouchMoveHandler;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.AbsolutePanel;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Label;
import com.google.web.bindery.event.shared.HandlerRegistration;

public class LineTracking1user extends AbsolutePanel implements RequireInitialisation {

    int timerDelay = 100;

    private final int lineOffset = 50;

    Image lineImage;
    Label posLabel = new Label("0,0");
    Vector<CursorXY> cursorPosVector;
    Button startBt = new Button("Start Tracking");
    Button stopBt = new Button("Stop Tracking");
    Canvas canvas = Canvas.createIfSupported();
    boolean tracking;

    /*************************************************************************************
     * Timer
     **************************************************************************************/
    int x = -1;
    int y = -1;

    // Timer allowing to set a delay between 2 position savings
    Timer timer = new Timer() {
        int prevX;
        int prevY;

        @Override
        public void run() {
            if (tracking && (x != prevX || y != prevY)) {
                cursorPosVector.add(new CursorXY("user1", x, y, System.currentTimeMillis(), 0)); //Inci: 0 is added for ClickBlob experiment
                prevX = x;
                prevY = y;
            }
        }
    };

    // ***********************************************************************************
    private final boolean doLog;
    private final Context2d context;
    private HandlerRegistration eventPreview;

    public LineTracking1user(boolean doLog, String image) {
        super();

        this.doLog = doLog;
        this.lineImage = new Image(GWT.getModuleBaseURL() + image);
        context = canvas.getContext2d();

        canvas.addMouseDownHandler(new MouseDownHandler() {

            @Override
            public void onMouseDown(MouseDownEvent event) {
                event.preventDefault();
            }
        });
        this.add(lineImage);
        this.add(canvas);
        this.setWidgetPosition(canvas, 0, 0);
        this.setWidgetPosition(lineImage, lineOffset, lineOffset);
        // this.add(posLabel);
        this.add(startBt);
        this.add(stopBt);
        cursorPosVector = new Vector<CursorXY>();

        canvas.addMouseMoveHandler(new MouseMoveHandler() {

            @Override
            public void onMouseMove(MouseMoveEvent event) {

                if (tracking) {
                    if (x != -1 && y != -1) {
                        context.beginPath();
                        context.moveTo(x, y);
                        context.lineTo(event.getRelativeX(canvas.getCanvasElement()),
                                event.getRelativeY(canvas.getCanvasElement()));
                        context.stroke();
                    }
                    x = event.getRelativeX(canvas.getCanvasElement());
                    y = event.getRelativeY(canvas.getCanvasElement());
                    posLabel.setText(x + "," + y);

                }

            }
        });
        canvas.addTouchMoveHandler(new TouchMoveHandler() {

            @Override
            public void onTouchMove(TouchMoveEvent event) {

                if (tracking && event.getTouches().length() > 0) {
                    event.preventDefault();
                    if (x != -1 && y != -1) {
                        context.beginPath();
                        context.moveTo(x, y);
                        context.lineTo(event.getTouches().get(0).getRelativeX(canvas.getCanvasElement()),
                                event.getTouches().get(0).getRelativeY(canvas.getCanvasElement()));
                        context.stroke();
                    }
                    x = event.getTouches().get(0).getRelativeX(canvas.getCanvasElement());
                    y = event.getTouches().get(0).getRelativeY(canvas.getCanvasElement());
                    posLabel.setText(x + "," + y);

                }

            }
        });

        startBt.addMouseDownHandler(new MouseDownHandler() {

            @Override
            public void onMouseDown(MouseDownEvent event) {
                tracking = true;
                timer.scheduleRepeating(timerDelay);
                cursorPosVector.clear();
                startBt.removeFromParent();
            }
        });

        stopBt.addMouseDownHandler(new MouseDownHandler() {

            @Override
            public void onMouseDown(MouseDownEvent event) {
                log();
                tracking = false;
                stopBt.removeFromParent();
                timer.cancel();
            }
        });

    }

    @Override
    public void initialise() {

        //to be deleted//
        System.out.println("Experiment Identifier:  " + ICEMain.identifier);
        System.out.println("Name of Experiment Task: " + ExperimentIdentifier.TRACKING);
        System.out.println("User Number:  " + 1);
        System.out.println(); //empty line
        //to be deleted//

        this.setWidgetPosition(startBt, 0, lineImage.getOffsetHeight() + lineOffset);
        this.setWidgetPosition(stopBt, lineImage.getOffsetWidth(), lineImage.getOffsetHeight() + lineOffset);
        canvas.setCoordinateSpaceWidth(getOffsetWidth());
        canvas.setCoordinateSpaceHeight(getOffsetHeight());
        context.setStrokeStyle("black");
        context.setLineWidth(4);
    }

    public void setLabelText(String text) {
        posLabel.setText(text);
        System.out.println(text);
    }

    /**
     * log the data and indicate if logged is OK or not
     */
    private void log() {
        if (doLog) {
            EventingServiceAsync svc = GWT.create(EventingService.class);
            svc.log(ICEMain.identifier, getLoggedResult(cursorPosVector), ExperimentIdentifier.TRACKING, 1,
                    new AsyncCallback<Void>() {

                        @Override
                        public void onSuccess(Void result) {
                            LineTracking1user.this.clear();
                            Window.alert("Task finished!");
                        }

                        @Override
                        public void onFailure(Throwable caught) {

                            LineTracking1user.this.clear();
                            GWT.log("Error:", caught);
                            Window.alert("Task finished but was not able to log!");
                        }
                    });
        } else {
            clear();
            Window.alert("Task finished");
        }
    }

    /**
     * Format the logged data: comma separated value!
     * 
     * @param data
     * @return Array of string containing the user, x, y time stamps of the click
     */

    private String[] getLoggedResult(Vector<CursorXY> data) {
        String[] result = new String[data.size()];

        for (int i = 0; i < result.length; i++) {
            result[i] = lineImage.getUrl() + "; " + data.get(i).getUser() + "; " + data.get(i).getX() + "; "
                    + data.get(i).getY() + "; " + data.get(i).getTimeStamp();

            //PRINTING LOGS//to be deleted
            System.out.println("Path Image: " + lineImage.getUrl() + " -" + "   Username: " + data.get(i).getUser()
                    + " -" + "   X Coordinate of Cursor: " + data.get(i).getX() + " -"
                    + "   Y Coordinate of Cursor: " + data.get(i).getY() + " -" + "   Current Time:  "
                    + data.get(i).getTimeStamp());
            //to be deleted

        }
        return result;
    }

}