From f6bb379f2532b4e753a97733200ac8b31768e81c Mon Sep 17 00:00:00 2001 From: incidincer Date: Tue, 4 Aug 2015 19:44:22 +0200 Subject: [PATCH 1/3] first commit. --- .../java/ch/unifr/pai/ice/client/ICEMain.java | 198 +++++++++++------- 1 file changed, 119 insertions(+), 79 deletions(-) diff --git a/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/ICEMain.java b/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/ICEMain.java index 12df8dc..78b3603 100644 --- a/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/ICEMain.java +++ b/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/ICEMain.java @@ -23,23 +23,33 @@ * *************************************************************************************************/ + import java.util.Date; +import ch.unifr.pai.twice.multipointer.controller.client.TouchPadWidget; import ch.unifr.pai.ice.client.clickblobs.ClickBlobs1user; +import ch.unifr.pai.ice.client.clickblobs.ClickBlobs2users; +import ch.unifr.pai.ice.client.clickblobs.ClickBlobs4users; +import ch.unifr.pai.ice.client.textedit.TextEntrySepSpace; +import ch.unifr.pai.ice.client.dragNdrop.DnD2users; +import ch.unifr.pai.ice.client.dragNdrop.DnD4users; +import ch.unifr.pai.ice.client.dragNdrop.DND4users4spaces; + import ch.unifr.pai.ice.client.dragNdrop.DnD1user; import ch.unifr.pai.ice.client.textedit.TextEntry1Space; import ch.unifr.pai.ice.client.tracking.LineTracking1user; -import ch.unifr.pai.twice.multipointer.controller.client.TouchPadWidget; + import ch.unifr.pai.twice.multipointer.provider.client.MultiCursorController; import ch.unifr.pai.twice.multipointer.provider.client.NoMultiCursorController; import ch.unifr.pai.twice.utils.device.client.DeviceType; -import ch.unifr.pai.twice.utils.device.client.UUID; import com.google.gwt.core.client.EntryPoint; import com.google.gwt.core.client.GWT; import com.google.gwt.core.client.Scheduler; import com.google.gwt.core.client.Scheduler.ScheduledCommand; + import com.google.gwt.dom.client.Style.Unit; + import com.google.gwt.event.logical.shared.ResizeEvent; import com.google.gwt.event.logical.shared.ResizeHandler; import com.google.gwt.event.logical.shared.SelectionEvent; @@ -52,106 +62,136 @@ public class ICEMain implements EntryPoint { public static String identifier; int nbSentences = 4; - TextEntry1Space trainingTextEntry1Space1User = new TextEntry1Space(1, 2, -1); - TextEntry1Space textEntry1Space1User = new TextEntry1Space(1, nbSentences, 1); - // TextEntry1Space textEntry1Space2Users = new TextEntry1Space(2, nbSentences,2); - // TextEntry1Space textEntry1Space4Users = new TextEntry1Space(4, nbSentences,3); - // TextEntrySepSpace textEntrySepSpace2Users = new TextEntrySepSpace(2,nbSentences, 20); - // TextEntrySepSpace textEntrySepSpace4Users = new TextEntrySepSpace(4,nbSentences, 21); - ClickBlobs1user trainingCheckBoxes = new ClickBlobs1user(4, false, false); - ClickBlobs1user checkBoxes = new ClickBlobs1user(20, false, true); - // ClickBlobs2users checkB2u = new ClickBlobs2users(20, false); - // ClickBlobs4users checkB4u = new ClickBlobs4users(20, false); + int trainingnbSentences = 1; + + //TextEntry1Space trainingTextEntry1Space1User = new TextEntry1Space(1, 2, -1); + //TextEntry1Space textEntry1Space1User = new TextEntry1Space(1, nbSentences, 1); + //TextEntry1Space textEntry1Space2Users = new TextEntry1Space(2, nbSentences,2); + //TextEntry1Space textEntry1Space4Users = new TextEntry1Space(4, nbSentences,3); + + TextEntrySepSpace trainingtextEntrySepSpace1Users = new TextEntrySepSpace(1,trainingnbSentences, -1); //-1 is for not logging + TextEntrySepSpace textEntrySepSpace1Users = new TextEntrySepSpace(1,nbSentences, 19); + TextEntrySepSpace textEntrySepSpace2Users = new TextEntrySepSpace(2,nbSentences, 18); + TextEntrySepSpace textEntrySepSpace4Users = new TextEntrySepSpace(4,nbSentences, 21); + + ClickBlobs1user trainingCheckBoxes = new ClickBlobs1user(4, false, true); + ClickBlobs1user checkBoxes = new ClickBlobs1user(4, false, true); + ClickBlobs2users checkB2u = new ClickBlobs2users(4, false); + ClickBlobs4users checkB4u = new ClickBlobs4users(4, false); + DnD1user trainingDNdBoxes = new DnD1user(4, false); - DnD1user dNdBoxes = new DnD1user(20, true); - // DnD2users dNdBoxes2S = new DnD2users(); - // DnD4users dNdBoxes4S = new DnD4users(); - // DND4users4spaces dN4dropBoxes = new DND4users4spaces(10); + DnD1user dNdBoxes = new DnD1user(10, true); + DnD2users dNdBoxes2S = new DnD2users(); + DnD4users dNdBoxes4S = new DnD4users(); + //DND4users4spaces dN4dropBoxes = new DND4users4spaces(10); - LineTracking1user trainingLineTracking = new LineTracking1user(false, "trace-training.png"); - LineTracking1user lineTracking = new LineTracking1user(true, "trace-experiment.png"); + //LineTracking1user trainingLineTracking = new LineTracking1user(false, "trace-training.png"); + //LineTracking1user lineTracking = new LineTracking1user(true, "trace-experiment.png"); // LineTracking2users lineTracking2users = new LineTracking2users(); // LineTracking4users lineTracking4users = new LineTracking4users(); TabLayoutPanel tabPanel = new TabLayoutPanel(40, Unit.PX); - - NoMultiCursorController c = MultiCursorController.getInstance(); - + @Override public void onModuleLoad() { - if (DeviceType.getDeviceType() != DeviceType.MULTICURSOR) { - TouchPadWidget widget = GWT.create(TouchPadWidget.class); - RootLayoutPanel.get().add(widget); - widget.initialize(UUID.get(), null, null); - widget.start(); - } - else { - + + if (DeviceType.getDeviceType() == DeviceType.MULTICURSOR) { + /*************************************** * Get the size of the browser window. - ***************************************/ - c.start(); + ***************************************/ + MultiCursorController multiCursor = GWT.create(NoMultiCursorController.class); + multiCursor.start(); + + identifier = String.valueOf(new Date().getTime() / 1000); Window.alert("Start experiment: " + identifier); RootLayoutPanel.get().add(tabPanel); - /* - * tabPanel setup - */ - - tabPanel.add(trainingCheckBoxes, "TA"); - tabPanel.add(trainingTextEntry1Space1User, "TB"); - tabPanel.add(trainingDNdBoxes, "TC"); - tabPanel.add(trainingLineTracking, "TD"); - // tabPanel.add(textEntry1Space2Users, "TE 1 Space - 2 users"); - // tabPanel.add(textEntry1Space4Users, "TE 1 Space - 4 users"); - // tabPanel.add(textEntrySepSpace2Users, "TE multi Space - 2 users"); - // tabPanel.add(textEntrySepSpace4Users, "TE multi Space - 4 users"); - tabPanel.add(checkBoxes, "A"); - tabPanel.add(textEntry1Space1User, "B"); - // tabPanel.add(checkB2u, "Click blobs 2 users"); - // tabPanel.add(checkB4u, "Click blobs 4 users"); - tabPanel.add(dNdBoxes, "C"); - // tabPanel.add(dNdBoxes2S, "D & D 2 spaces"); - // tabPanel.add(dNdBoxes4S, "D & D 4 spaces"); - // tabPanel.add(dN4dropBoxes, "D & 4 D boxes"); - tabPanel.add(lineTracking, "D"); - // tabPanel.add(lineTracking2users, "L tracking 2"); - // tabPanel.add(lineTracking4users, "L tracking 4"); - tabPanel.selectTab(0); - if (tabPanel.getWidget(0) instanceof RequireInitialisation) { + + + /* + * tabPanel setup + */ + + //*****************Trainings***************************// + //tabPanel.add(trainingCheckBoxes, "TA"); + //tabPanel.add(trainingtextEntrySepSpace1Users, "TB"); //tabPanel.add(trainingTextEntry1Space1User, "TB"); + //tabPanel.add(trainingDNdBoxes, "TC"); + //tabPanel.add(trainingLineTracking, "TD"); + + //*****************Click Blobs***************************// + //tabPanel.add(checkBoxes, "A"); + //tabPanel.add(checkB2u, "Click blobs 2 users"); + tabPanel.add(checkB4u, "Click blobs 4 users"); + + //*****************Text Edit****************************// + //tabPanel.add(textEntrySepSpace1Users, "B"); + //tabPanel.add(textEntrySepSpace2Users, "TE multi Space - 2 users"); + tabPanel.add(textEntrySepSpace4Users, "TE multi Space - 4 users"); + + ////******************D&D*********************************// + //tabPanel.add(dNdBoxes, "C"); + //tabPanel.add(dNdBoxes2S, "D & D 2 spaces"); + tabPanel.add(dNdBoxes4S, "D & D 4 spaces"); + //tabPanel.add(dN4dropBoxes, "D & 4 D boxes"); + + + //tabPanel.add(textEntry1Space1User, "B"); + //tabPanel.add(textEntry1Space2Users, "TE 1 Space - 2 users"); + //tabPanel.add(textEntry1Space4Users, "TE 1 Space - 4 users"); + //tabPanel.add(lineTracking, "D"); + // tabPanel.add(lineTracking2users, "L tracking 2"); + // tabPanel.add(lineTracking4users, "L tracking 4"); + + tabPanel.selectTab(0); + + if (tabPanel.getWidget(0) instanceof RequireInitialisation) { + Scheduler.get().scheduleDeferred(new ScheduledCommand() { + + @Override + public void execute() { + ((RequireInitialisation) tabPanel.getWidget(0)).initialise(); + } + }); + } + + tabPanel.addSelectionHandler(new SelectionHandler() { + + @Override + public void onSelection(SelectionEvent event) { + Scheduler.get().scheduleDeferred(new ScheduledCommand() { @Override public void execute() { - ((RequireInitialisation) tabPanel.getWidget(0)).initialise(); + ((RequireInitialisation) tabPanel.getWidget(tabPanel.getSelectedIndex())).initialise(); } }); } + }); - tabPanel.addSelectionHandler(new SelectionHandler() { - - @Override - public void onSelection(SelectionEvent event) { - - Scheduler.get().scheduleDeferred(new ScheduledCommand() { - - @Override - public void execute() { - ((RequireInitialisation) tabPanel.getWidget(tabPanel.getSelectedIndex())).initialise(); - } - }); - } - }); + /* + * re-position of the widgets on the resized window + */ + Window.addResizeHandler(new ResizeHandler() { + @Override + public void onResize(ResizeEvent event) { - /* - * re-position of the widgets on the resized window - */ - Window.addResizeHandler(new ResizeHandler() { - @Override - public void onResize(ResizeEvent event) { + } + }); + - } - }); } + + else { + + TouchPadWidget widget = GWT.create(TouchPadWidget.class); + RootLayoutPanel.get().add(widget); + //widget.initialize(UUID.get(), null, null); + widget.start(); + } + } + + } From fe0488f9fa3c96c9420348ba7412ab12e81cbfbf Mon Sep 17 00:00:00 2001 From: incidincer Date: Tue, 4 Aug 2015 19:49:18 +0200 Subject: [PATCH 2/3] second commit. --- .../unifr/pai/ice/client/clickblobs/Blob.java | 205 +++++++++++++++--- 1 file changed, 177 insertions(+), 28 deletions(-) diff --git a/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/clickblobs/Blob.java b/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/clickblobs/Blob.java index 6d97d48..1fc9f7f 100644 --- a/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/clickblobs/Blob.java +++ b/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/clickblobs/Blob.java @@ -30,6 +30,7 @@ import com.google.gwt.event.dom.client.MouseDownEvent; import com.google.gwt.event.dom.client.MouseDownHandler; +import com.google.gwt.user.client.Event; import com.google.gwt.user.client.Random; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.AbsolutePanel; @@ -40,12 +41,13 @@ public class Blob extends Image { Vector blobClickVector; + int iteration = 0; int nbIter = 0; int[] offset = { 0, 0 }; Blob blob; - Button resetBT = new Button("Reset"); - Label completed = new Label("Experiment completed!"); + //Button resetBT = new Button("Reset"); + //Label completed = new Label("Experiment completed!"); String uNb = ""; AbsolutePanel absPanel; boolean randomized = true; @@ -53,7 +55,20 @@ public class Blob extends Image { int arrayOffset = 0; boolean isLogged = false; ICEDataLogger logger; - + + boolean isClicked = false; + int num = 0 ; + boolean check ; + + int blobNumber ; + int count = 0; + int trialcount = 0; + + boolean isStarted = false; + boolean isSetFinished = false; + long startTime; + long setFinishTime; + /****************************************** * Create a new blob with RANDOM position * @@ -84,7 +99,9 @@ public Blob(String image, String userNb, int nbIteration, AbsolutePanel absolute public void onMouseDown(MouseDownEvent event) { if (iteration < nbIter) { - blobClickVector.add(new CursorXY(uNb, blob.getAbsoluteLeft(), blob.getAbsoluteTop(), System.currentTimeMillis())); + + blobClickVector.add(new CursorXY(uNb, blob.getAbsoluteLeft(), blob.getAbsoluteTop(), System.currentTimeMillis() , blob.getBlobNumber())); + absPanel.setWidgetPosition(blob, randomNum(absPanel.getOffsetWidth() - 70), randomNum(absPanel.getOffsetHeight() - 70)); iteration++; @@ -106,6 +123,7 @@ public Blob(String image, String userNb, int nbIteration, AbsolutePanel absolute int offsetY, int startOffset, boolean doLog) { super(image); + this.nbIter = nbIteration; blob = this; this.absPanel = absolutePanel; @@ -116,91 +134,217 @@ public Blob(String image, String userNb, int nbIteration, AbsolutePanel absolute this.offset[1] = offsetY; this.arrayOffset = startOffset; this.logger = logger; - this.isLogged = !doLog; + this.isLogged = !doLog; //doLog = true + //isLogged = false blobClickVector = new Vector(); - + setBlobPositionHandler(blobPosition); - } protected void onFinishedInitialIteration() { + } private void setBlobPositionHandler(int[][] blobPosition) { - + + if (blobPosition == null) { Window.alert("No set of position defined!"); } else { + + this.absPanel.sinkEvents(Event.ONMOUSEDOWN); //this.absPanel.sinkEvents(Event.ONCLICK); + + this.absPanel.addDomHandler( new MouseDownHandler() { //this.absPanel.addHandler( new ClickHandler(){ + @Override + public void onMouseDown(MouseDownEvent event) { //public void onClick(ClickEvent event) { + + if(!isStarted){ //start time of experiment + startTime = System.currentTimeMillis(); + isStarted = true; + + } + + if(blobClickVector.size() == 0){ + + blobClickVector.add(new CursorXY(uNb, event.getClientX(), event.getClientY(), System.currentTimeMillis() , -5)); + count++; + System.out.println(uNb + ": " + "Out of blob clicked!" + "; x: " + event.getClientX() + "; y: " + event.getClientY() + "; Time: "+ System.currentTimeMillis()); + } + + else + { + if(!isLogged){ + num++; + + if(num>iteration) { + blobClickVector.add(new CursorXY(uNb, event.getClientX(), event.getClientY(), System.currentTimeMillis() , -5)); + System.out.println(uNb + ": " + "Out of blob clicked!" + "; x: " + event.getClientX() + "; y: " + event.getClientY() + "; Time: "+ System.currentTimeMillis()); + num = iteration; + count++; + } + } + + if(isLogged){ + num++; + if(num > iteration ){ + blobClickVector.add(new CursorXY(uNb, event.getClientX(), event.getClientY(), System.currentTimeMillis() , -5)); + System.out.println(uNb + ": " + "Out of blob clicked!" + "; x: " + event.getClientX() + "; y: " + event.getClientY() + "; Time: "+ System.currentTimeMillis()); + logger.setLoggedData(blobClickVector, false); + num = iteration; + trialcount++; + } + } + } + + } },MouseDownEvent.getType()); + this.addMouseDownHandler(new MouseDownHandler() { @Override public void onMouseDown(MouseDownEvent event) { + + if(!isStarted){ + startTime = System.currentTimeMillis(); + isStarted = true; + } iteration++; - if (iteration < blobPos.length) { - - if (!isLogged) { - blobClickVector.add(new CursorXY(uNb, blob.getAbsoluteLeft(), blob.getAbsoluteTop(), System.currentTimeMillis())); + + if (iteration < blobPos.length) { //experiment hasn't finished yet + + if (!isLogged) { + + blobClickVector.add(new CursorXY(uNb, blob.getAbsoluteLeft(), blob.getAbsoluteTop(), System.currentTimeMillis() , blob.getBlobNumber())); + + //First blob is done, adds the first blob information to the Vector + + //PRINTING LOGS// + //System.out.println("(Log INFO) Blob clicked! --- " + uNb + " ; BlobNo:" + blob.getBlobNumber() + " ; Coordinates of Blob Clicked:(" + + //blob.getAbsoluteLeft() + "," + blob.getAbsoluteTop() + ")" + " ; Time clicked:" + System.currentTimeMillis()); } - + + if (isLogged) { //second set + + blobClickVector.add(new CursorXY(uNb, blob.getAbsoluteLeft(), blob.getAbsoluteTop(), System.currentTimeMillis() , blob.getBlobNumber())); + //First blob is done, adds the first blob information to the Vector + + + //PRINTING LOGS + //System.out.println("Trial Set: Blob clicked! --- " + uNb + " ; BlobNo:" + blob.getBlobNumber() + " ; Coordinates of Blob Clicked: ( " + + //blob.getAbsoluteLeft() + "," + blob.getAbsoluteTop() + " )" + " ; Time clicked: " + System.currentTimeMillis() ); + + check=false; + logger.setLoggedData(blobClickVector, false); + + } + // Check the pos. in the array and get back to 0 if over array length -> loop if ((iteration + arrayOffset) < blobPos.length) { - + absPanel.setWidgetPosition(blob, blobPos[iteration + arrayOffset][0] + offset[0], blobPos[iteration + arrayOffset][1] + offset[1]); - + blob.setBlobNumber(iteration + arrayOffset); + } - else { + else { //for User 2,3,4 absPanel.setWidgetPosition(blob, blobPos[(iteration + arrayOffset) - blobPos.length][0] + offset[0], blobPos[(iteration + arrayOffset) - blobPos.length][1] + offset[1]); + + blob.setBlobNumber((iteration + arrayOffset) - blobPos.length); + +// System.out.println("else set widget: " + " X: blobPos[" + ( (iteration + arrayOffset) - blobPos.length ) + "][0] + offset[0]:" + offset[0] +// + " = " + ( blobPos[(iteration + arrayOffset) - blobPos.length][0] + offset[0] ) +// + " --- Y: blobPos[" + ((iteration + arrayOffset) - blobPos.length) + "][1] + offset[1]:" + offset[1] +// + " = " + (blobPos[(iteration + arrayOffset) - blobPos.length][1] + offset[1])); +// } + } - else { - - if (!isLogged) { - blobClickVector.add(new CursorXY(uNb, blob.getAbsoluteLeft(), blob.getAbsoluteTop(), System.currentTimeMillis())); - logger.setLoggedData(blobClickVector); + else { //For the last blob + + if(!isSetFinished){ + long setfinishtime = System.currentTimeMillis(); + isSetFinished = true; + setFinishTime = setfinishtime; + } + + if (!isLogged) { //isLogged=false + + blobClickVector.add(new CursorXY(uNb, blob.getAbsoluteLeft(), blob.getAbsoluteTop(), setFinishTime , blob.getBlobNumber())); + logger.setLoggedData(blobClickVector, true); isLogged = true; + check =true; + + } + if(isLogged && !check ){ + blobClickVector.add(new CursorXY(uNb, blob.getAbsoluteLeft(), blob.getAbsoluteTop(), System.currentTimeMillis() , blob.getBlobNumber())); + //PRINTING LOG INFO OF LAST BLOB + //System.out.println("(Trial Set LAST BLOB INFO) Blob clicked! --- : " + uNb + " ; BlobNo:" + blob.getBlobNumber() + " ; Coordinates of Blob Clicked: ( " + + //blob.getAbsoluteLeft() + "," + blob.getAbsoluteTop() + " )" + " ; Time clicked: " + System.currentTimeMillis() ); + logger.setLoggedData(blobClickVector, false); } - iteration = 1; + + iteration = 0; + num = -1; //for the second set // continue to move the blob without recording the position // this is to let the user continue until the others finished // Check the pos. in the array and get back to 0 if over array length -> loop + + System.out.println("Trial set started"); //to be deleted if ((iteration + arrayOffset) < blobPos.length) { - + absPanel.setWidgetPosition(blob, blobPos[iteration + arrayOffset][0] + offset[0], blobPos[iteration + arrayOffset][1] + offset[1]); + + blob.setBlobNumber(iteration + arrayOffset); } - else { - + else { absPanel.setWidgetPosition(blob, blobPos[(iteration + arrayOffset) - blobPos.length][0] + offset[0], blobPos[(iteration + arrayOffset) - blobPos.length][1] + offset[1]); + + blob.setBlobNumber((iteration + arrayOffset) - blobPos.length); } onFinishedInitialIteration(); - iteration++; + //iteration++; } } + }); - } + + } + } + + public int getBlobNumber() { + + return this.blobNumber; + } + + public void setBlobNumber(int num) { + + this.blobNumber = num; } + + public Vector getBlobClickVector() { + return blobClickVector; } public void resetCounter() { + iteration = 0; - absPanel.remove(completed); + //absPanel.remove(completed); absPanel.setWidgetPosition(this, absPanel.getElement().getOffsetWidth() / 2 + offset[0], absPanel.getElement().getOffsetHeight() / 2 + offset[1]); absPanel.setWidgetPosition(blob, blobPos[iteration + arrayOffset][0] + offset[0], blobPos[iteration + arrayOffset][1] + offset[1]); blobClickVector.clear(); @@ -211,4 +355,9 @@ public void resetCounter() { private int randomNum(int upperBond) { return Random.nextInt(upperBond); } + + + } + + From 47323d5722f6554e5fa2c219e80516ab848e5c58 Mon Sep 17 00:00:00 2001 From: incidincer Date: Wed, 5 Aug 2015 02:22:32 +0200 Subject: [PATCH 3/3] MetaData functionality in MPProxy and some changes in ICEExperiments --- ICEExperiments/pom.xml | 6 + .../client/clickblobs/ClickBlobs1user.java | 564 +++++++++++------- .../client/clickblobs/ClickBlobs2users.java | 236 +++++++- .../client/clickblobs/ClickBlobs4users.java | 298 ++++++++- .../pai/ice/client/dragNdrop/DnD1user.java | 106 +++- .../ice/client/dragNdrop/DnD1userGeneric.java | 118 +++- .../pai/ice/client/dragNdrop/DnD2users.java | 123 +++- .../pai/ice/client/dragNdrop/DnD4users.java | 136 ++++- .../dragNdrop/DraggableLabelledBlob.java | 19 + .../pai/ice/client/rpc/EventingService.java | 8 +- .../pai/ice/client/textedit/TextEditor.java | 276 ++++++--- .../ice/client/textedit/TextEntry1Space.java | 59 +- .../client/textedit/TextEntrySepSpace.java | 175 +++++- .../pai/ice/client/tracking/CursorXY.java | 15 +- .../client/tracking/LineTracking1user.java | 16 +- .../client/tracking/LineTracking2users.java | 4 +- .../client/tracking/LineTracking4users.java | 8 +- .../pai/ice/client/utils/ICEDataLogger.java | 6 +- .../ice/client/utils/PositioningUtils.java | 17 +- .../pai/ice/server/EventingServiceImpl.java | 45 +- .../pai/ice/shared/ExperimentIdentifier.java | 6 +- .../mpProxyScreenShot/ScreenShot.gwt.xml | 3 + .../mpProxyScreenShot/client/Viewer.java | 212 ++++++- .../server/ReadOnlyPresentation.java | 11 +- .../mpbrowser/client/BrowserWindow.java | 120 ++-- .../widgets/mpbrowser/client/MPBrowser.java | 147 ++++- .../widgets/mpproxy/client/MPProxyBody.java | 35 +- .../widgets/mpproxy/client/ProxyBody.java | 8 +- .../mpproxy/client/ScreenShotDistributor.java | 376 +++++++++++- .../src/main/webapp/miceScreenShotViewer.html | 7 +- MouseControl/pom.xml | 4 + .../controller/MultipointerController.gwt.xml | 2 +- .../controller/client/TouchPadWidget.java | 7 +- .../provider/MultipointerProvider.gwt.xml | 4 + .../client/MultiCursorController.java | 25 +- .../client/widgets/MultiFocusTextBox.java | 54 +- 36 files changed, 2639 insertions(+), 617 deletions(-) diff --git a/ICEExperiments/pom.xml b/ICEExperiments/pom.xml index d95d7ea..02bfb72 100644 --- a/ICEExperiments/pom.xml +++ b/ICEExperiments/pom.xml @@ -93,5 +93,11 @@ DragNDrop 0.9.0 + + ch.unifr.pai.twice.widgets + RemoteWidgets + 0.9.0 + + \ No newline at end of file diff --git a/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/clickblobs/ClickBlobs1user.java b/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/clickblobs/ClickBlobs1user.java index e195673..d7dd84b 100644 --- a/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/clickblobs/ClickBlobs1user.java +++ b/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/clickblobs/ClickBlobs1user.java @@ -1,27 +1,27 @@ package ch.unifr.pai.ice.client.clickblobs; /* - * 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. - */ +* 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 - * - *************************************************************************************************/ +* Project ICE +* ----------- +* PAI research Group - Dept. of Informatics +* University of Fribourg - Switzerland +* Author: Pascal Bruegger +* +*************************************************************************************************/ import java.util.Collection; import java.util.Vector; @@ -43,217 +43,349 @@ import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.AbsolutePanel; import com.google.gwt.user.client.ui.Button; - -public class ClickBlobs1user extends AbsolutePanel implements ICEDataLogger, RequireInitialisation { - - int nbIteration = 10; - int nbUser = 0; - int iteration = 0; - int nbExpFinished = 0; - - String blob1 = GWT.getModuleBaseURL() + "circle_black.png"; - String blob2 = GWT.getModuleBaseURL() + "circle_red.png"; - String blob3 = GWT.getModuleBaseURL() + "circle_blue.png"; - String blob4 = GWT.getModuleBaseURL() + "circle_green.png"; - String blob5 = GWT.getModuleBaseURL() + "circle_magenta.png"; - String blob6 = GWT.getModuleBaseURL() + "circle_violet.png"; - String blob7 = GWT.getModuleBaseURL() + "circle_grey.png"; - String blob8 = GWT.getModuleBaseURL() + "circle.png"; - - AbsolutePanel absPanel; - - boolean init = false; - - Vector userLogVector = new Vector(); - String[][] loggedData; - - Button resetBT = new Button("Reset"); - // Button addUser = new Button("Add user"); - - Blob user1; - Blob user2; - Blob user3; - Blob user4; - Blob user5; - Blob user6; - Blob user7; - - int panelWidth; - int panelHeight; - int nbBlobs = 0; - boolean randomPos; - - // statically set the position of the 10 blobs - int[][] blobCoord; - boolean doLog; - - /*************************************************************************** - * Constructor - * - * @param nbBoxes - * : define the number of blobs - * @param randomPosition - * : define if users must be placed randomly or not - ***************************************************************************/ - - public ClickBlobs1user(int nbBlobs, boolean randomPosition, boolean doLog) { - super(); - this.doLog = doLog; - this.randomPos = randomPosition; - absPanel = this; - this.nbBlobs = nbBlobs; - // this.add(resetBT); - // this.add(addUser); - nbUser++; - - // ----- Reset Button -------------------------------------------- - resetBT.addMouseDownHandler(new MouseDownHandler() { - +import com.google.gwt.user.client.ui.HorizontalPanel; +import com.google.gwt.user.client.ui.VerticalPanel; + + +public class ClickBlobs1user extends VerticalPanel implements ICEDataLogger, RequireInitialisation { + + int nbIteration = 10; + int nbUser = 0; + int iteration = 0; + int nbExpFinished = 0; + long finishTime ; + + String blob1 = GWT.getModuleBaseURL() + "circle_black.png"; + String blob2 = GWT.getModuleBaseURL() + "circle_red.png"; + String blob3 = GWT.getModuleBaseURL() + "circle_blue.png"; + String blob4 = GWT.getModuleBaseURL() + "circle_green.png"; + String blob5 = GWT.getModuleBaseURL() + "circle_magenta.png"; + String blob6 = GWT.getModuleBaseURL() + "circle_violet.png"; + String blob7 = GWT.getModuleBaseURL() + "circle_grey.png"; + String blob8 = GWT.getModuleBaseURL() + "circle.png"; + + //AbsolutePanel absPanel; + AbsolutePanel user1Panel = new AbsolutePanel(); + AbsolutePanel user2Panel = new AbsolutePanel(); + AbsolutePanel user3Panel = new AbsolutePanel(); + AbsolutePanel user4Panel = new AbsolutePanel(); + + HorizontalPanel hPanel1 = new HorizontalPanel(); + HorizontalPanel hPanel2 = new HorizontalPanel(); + + boolean init = false; + + Vector userLogVector = new Vector(); + Vector user1LogVec = new Vector(); + String [] user1result; + + String[][] loggedData; + + Button resetBT = new Button("Reset"); + // Button addUser = new Button("Add user"); + + Blob user1; + Blob user2; + Blob user3; + Blob user4; + Blob user5; + Blob user6; + Blob user7; + + int panelWidth; + int panelHeight; + int nbBlobs = 0; + boolean randomPos; + + // statically set the position of the 10 blobs + int[][] blobCoord; + boolean doLog; + + /*************************************************************************** + * Constructor + * + * @param nbBoxes + * : define the number of blobs + * @param randomPosition + * : define if users must be placed randomly or not + ***************************************************************************/ + + public ClickBlobs1user(int nbBlobs, boolean randomPosition, boolean doLog) { + super(); + this.setSize("100%", "100%"); + this.doLog = doLog; + this.randomPos = randomPosition; + //absPanel = this; + this.nbBlobs = nbBlobs; + // this.add(resetBT); + // this.add(addUser); + nbUser++; + + hPanel1.setSize("100%", "100%"); + hPanel2.setSize("100%", "100%"); + + user1Panel.setSize("100%", "100%"); + user2Panel.setSize("100%", "100%"); + user3Panel.setSize("100%", "100%"); + user4Panel.setSize("100%", "100%"); + + hPanel1.add(user1Panel); + hPanel1.setCellWidth(user1Panel, "50%"); + hPanel1.setCellHeight(user1Panel, "50%"); + hPanel1.add(user3Panel); + + hPanel2.add(user4Panel); + hPanel2.setCellWidth(user4Panel, "50%"); + hPanel2.setCellHeight(user4Panel, "50%"); + hPanel2.add(user2Panel); + + this.add(hPanel1); + this.add(hPanel2); + + this.setBorderWidth(1); + + hPanel1.setBorderWidth(1); + hPanel2.setBorderWidth(1); + + // ----- Reset Button -------------------------------------------- + resetBT.addMouseDownHandler(new MouseDownHandler() { + + @Override + public void onMouseDown(MouseDownEvent event) { + user1.resetCounter(); + nbExpFinished = 0; + userLogVector.clear(); + } + }); +} + + @Override + public void initialise() { + + if (!init) { + panelWidth = user1Panel.getElement().getOffsetWidth(); + panelHeight = user1Panel.getElement().getOffsetHeight(); + + // // statically set the position of the 10 blobs + // blobCoord = new int[][] { + // { panelWidth - 100, panelHeight - 100 }, + // { (panelWidth / 2)-40, 70 }, + // { 50, panelHeight - 100 }, + // { 100, 70 }, + // { panelWidth - 130, 90 }, + // { panelWidth - 110, panelHeight - 180 }, + // { 140, panelHeight / 2 }, + // { panelWidth / 2, panelHeight - 100 }, + // { (panelWidth / 2) - 50, (panelHeight / 2) - 30 }, + // { 200, 110 }, + // { (panelWidth / 2) + 80, panelHeight - 100 }, + // { (panelWidth / 4) * 3, panelHeight - 100 }, + // { (panelWidth / 4), panelHeight - 120 }, + // { (panelWidth / 4) * 3, panelHeight / 2 }, + // { (panelWidth / 4), panelHeight - 130 }, + // { panelWidth - 110, panelHeight - 180 }, + // { 140, panelHeight / 3 }, + // { panelWidth / 2, panelHeight /3 }, + // { panelWidth - 70, (panelHeight / 3) }, + // { panelWidth - 80, (panelHeight / 3) * 2 }, + // }; + + // set the blob position array around a circle + blobCoord = PositioningUtils.getPositionsInCircle(nbBlobs, panelWidth / 2, panelHeight / 2, (panelHeight / 2) - 50); + + user1 = new Blob(blob1, "User 1", nbIteration, user1Panel, this, blobCoord, 0, 0, 0, doLog) { + @Override - public void onMouseDown(MouseDownEvent event) { - user1.resetCounter(); - nbExpFinished = 0; - userLogVector.clear(); + protected void onFinishedInitialIteration() { + + if (!doLog) { // for training + ClickBlobs1user.this.clear(); + Window.alert("Task finished!"); } - }); - - } - - @Override - public void initialise() { - - if (!init) { - - panelWidth = absPanel.getElement().getOffsetWidth(); - panelHeight = absPanel.getElement().getOffsetHeight(); - - // // statically set the position of the 10 blobs - // blobCoord = new int[][] { - // { panelWidth - 100, panelHeight - 100 }, - // { (panelWidth / 2)-40, 70 }, - // { 50, panelHeight - 100 }, - // { 100, 70 }, - // { panelWidth - 130, 90 }, - // { panelWidth - 110, panelHeight - 180 }, - // { 140, panelHeight / 2 }, - // { panelWidth / 2, panelHeight - 100 }, - // { (panelWidth / 2) - 50, (panelHeight / 2) - 30 }, - // { 200, 110 }, - // { (panelWidth / 2) + 80, panelHeight - 100 }, - // { (panelWidth / 4) * 3, panelHeight - 100 }, - // { (panelWidth / 4), panelHeight - 120 }, - // { (panelWidth / 4) * 3, panelHeight / 2 }, - // { (panelWidth / 4), panelHeight - 130 }, - // { panelWidth - 110, panelHeight - 180 }, - // { 140, panelHeight / 3 }, - // { panelWidth / 2, panelHeight /3 }, - // { panelWidth - 70, (panelHeight / 3) }, - // { panelWidth - 80, (panelHeight / 3) * 2 }, - // }; - - // set the blob position array around a circle - blobCoord = PositioningUtils.getPositionsInCircle(nbBlobs, panelWidth / 2, panelHeight / 2, (panelHeight / 2) - 50); - - user1 = new Blob(blob1, "User1", nbIteration, absPanel, this, blobCoord, 0, 0, 0, doLog) { - - @Override - protected void onFinishedInitialIteration() { - if (!doLog) { - ClickBlobs1user.this.clear(); - Window.alert("Task finished!"); - - } - } - - }; - absPanel.add(user1); - absPanel.setWidgetPosition(user1, panelWidth / 2, panelHeight / 2); - user1.resetCounter(); - init = true; + } + + }; + + user1Panel.add(user1); + user1Panel.setWidgetPosition(user1, blobCoord[0][0], blobCoord[0][1] ); + user1.setBlobNumber(0); + + + //PRINTING LOGS + System.out.println("Experiment Identifier: " + ICEMain.identifier); + System.out.println("Name of Experiment Task: " + ExperimentIdentifier.CLICKBLOB); + System.out.println("User Number: " + nbUser ); + System.out.println(); + + user1.resetCounter(); + init = true; } - } - - /** - * Callback method used by the Blob class to send the vector of data to be logged. - * - * @param blobData - */ - @Override - public void setLoggedData(Vector blobData) { - - if (nbExpFinished <= nbUser) { - userLogVector.addAll(blobData); - nbExpFinished++; + + } + + /** + * Callback method used by the Blob class to send the vector of data to be logged. + * + * @param blobData + */ + @Override + public void setLoggedData(Vector blobData , boolean finished) { + + if (nbExpFinished <= nbUser) { + + userLogVector.addAll(blobData); + nbExpFinished++; //when one user finished + } - + if (nbExpFinished == nbUser) { + + + finishTime = user1.setFinishTime; //experiment finish time is also set finish time + loggedData = new String[userLogVector.size()][5]; + + for (int i = 0; i < loggedData.length; i++) { + loggedData[i][0] = userLogVector.get(i).getUser(); + loggedData[i][1] = String.valueOf(userLogVector.get(i).getX()); + loggedData[i][2] = String.valueOf(userLogVector.get(i).getY()); + loggedData[i][3] = String.valueOf(userLogVector.get(i).getTimeStamp()); + loggedData[i][4] = String.valueOf(userLogVector.get(i).getblobNumber()); + + } - loggedData = new String[userLogVector.size()][4]; - - for (int i = 0; i < loggedData.length; i++) { - loggedData[i][0] = userLogVector.get(i).getUser(); - loggedData[i][1] = String.valueOf(userLogVector.get(i).getX()); - loggedData[i][2] = String.valueOf(userLogVector.get(i).getY()); - loggedData[i][3] = String.valueOf(userLogVector.get(i).getTimeStamp()); + System.out.println("-------------------------------------------------------------------"); + System.out.println("******TASK FINISHED******"); + + for (int i = 0; i < loggedData.length; i++) { //PRINTING LOGS + System.out.println( i + ". user:" + loggedData[i][0] + "; " + + "x:"+ loggedData[i][1] + "; " + + "y:"+loggedData[i][2] + "; " + + "time:" +loggedData[i][3] + "; " + + "blobNo:" +loggedData[i][4]); } + + System.out.println(""); + System.out.println("-------------------------------------------------------------------"); + System.out.println("User1; " + user1.count + " times out of blob"); + System.out.println("-------------------------------------------------------------------"); + System.out.println("User1; Start Time:"+ user1.startTime + " ; Finish Time:"+ finishTime); + System.out.println("User1; Experiment Completion Time: " + ((finishTime)-user1.startTime) ); + System.out.println("-------------------------------------------------------------------"); + + //******************************************************** + //FORMING USER1 LOG VECTOR + for(int i=0; i< userLogVector.size() ; i++) { + + if(userLogVector.get(i).getUser().equals("User 1") && userLogVector.get(i).getblobNumber() != -5){ + user1LogVec.add(userLogVector.get(i)); + } + } + + user1result = new String[user1LogVec.size() / 2]; + + //******************************************************** + //DIAMETER BLOBS FOR USER1 + int j=0; + for(int i=0 ; i< user1LogVec.size() ; i++){ + + if( (user1LogVec.get(i).getblobNumber() %2 == 0) && ((i+1) < user1LogVec.size()) ){ //if blobNo is even && next element exists + + if(user1LogVec.get(i+1).getblobNumber() == (user1LogVec.get(i).getblobNumber() + 1) ) + { + + user1result[j]= user1LogVec.get(i).getUser()+"; Time passed between blob" +user1LogVec.get(i).getblobNumber() + " and blob" + user1LogVec.get(i+1).getblobNumber() + ": " + + (user1LogVec.get(i+1).getTimeStamp() - user1LogVec.get(i).getTimeStamp()) + '\n' ; + + + System.out.println( user1LogVec.get(i).getUser()+ ";Time passed between blob" +user1LogVec.get(i).getblobNumber() + " and blob" + user1LogVec.get(i+1).getblobNumber() + ": " + + (user1LogVec.get(i+1).getTimeStamp() - user1LogVec.get(i).getTimeStamp()) ); + j++; + + } + } + } + System.out.println("-------------------------------------------------------------------"); - log(); + log(); } - } + } + + /** + * log the data and indicate if logged is OK or not + */ + private void log() { - /** - * log the data and indicate if logged is OK or not - */ - private void log() { EventingServiceAsync svc = GWT.create(EventingService.class); svc.log(ICEMain.identifier, getLoggedResult(loggedData), ExperimentIdentifier.CLICKBLOB, 1, new AsyncCallback() { + + @Override + public void onSuccess(Void result) { + ClickBlobs1user.this.clear(); + Window.alert("Successfully logged! Experiment finished"); + } + + @Override + public void onFailure(Throwable caught) { + GWT.log("Error:", caught); + ClickBlobs1user.this.clear(); + Window.alert("Task finished but was not able to log!"); - @Override - public void onSuccess(Void result) { - ClickBlobs1user.this.clear(); - Window.alert("Task finished!"); - } - - @Override - public void onFailure(Throwable caught) { - GWT.log("Error:", caught); - Window.alert("Task finished but was not able to log!"); - } + } }); - } - /** - * Format the logged data: comma separated value! - * - * @param data - * @return Array of string containing the user, x, y coord, time stamps of the click - */ - - private String[] getLoggedResult(String[][] data) { - String[] result = new String[data.length]; - - for (int i = 0; i < result.length; i++) { - result[i] = data[i][0] + ";" + data[i][1] + ";" + data[i][2] + ";" + data[i][3] + ";"; + } - return result; - } - - // Random number generator - private int randomNum(int upperBond) { + + /** + * Format the logged data: comma separated value! + * + * @param data + * @return Array of string containing the user, x, y coord, time stamps of the click + */ + + private String[] getLoggedResult(String[][] data) { + + String[] result = new String[data.length + 1 ]; + String messageU1 = ""; + + for (int i = 0; i < data.length; i++) { + result[i] = data[i][0] + "; " + data[i][1] + "; " + data[i][2] + "; " + data[i][3] + "; " + data[i][4] + "; " ; + } + + for(int j = 0; j< user1result.length ; j++){ + messageU1 = messageU1+ user1result[j]; + } + + result[data.length] = '\n' + "---------------------------------------------------------------"+ '\n' + + "User1; Start Time:"+ user1.startTime + " ; Finish Time:"+ finishTime + + "; Experiment Completion Time: " + (finishTime-user1.startTime) + '\n' + + "---------------------------------------------------------------"+ '\n'+ + "User1 ; "+ user1.count + " times out of blob" + '\n'+ + "---------------------------------------------------------------"+ '\n'+ + messageU1 ; + + return result; + + } + + // Random number generator + private int randomNum(int upperBond) { + return Random.nextInt(upperBond); - } - - @Override - public void setLoggedData(String[] blobData) { - // TODO Auto-generated method stub - - } - - @Override - public void setLoggedData(Collection blobData) { - // TODO Auto-generated method stub - - } - -} + } + + @Override + public void setLoggedData(String[] blobData) { + // TODO Auto-generated method stub + + } + + @Override + public void setLoggedData(Vector blobData , boolean finished , boolean check) { + // TODO Auto-generated method stub + + } + + + } \ No newline at end of file diff --git a/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/clickblobs/ClickBlobs2users.java b/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/clickblobs/ClickBlobs2users.java index 03b911e..8397562 100644 --- a/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/clickblobs/ClickBlobs2users.java +++ b/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/clickblobs/ClickBlobs2users.java @@ -39,8 +39,9 @@ import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.AbsolutePanel; import com.google.gwt.user.client.ui.HorizontalPanel; +import com.google.gwt.user.client.ui.VerticalPanel; -public class ClickBlobs2users extends HorizontalPanel implements ICEDataLogger, RequireInitialisation { +public class ClickBlobs2users extends VerticalPanel implements ICEDataLogger, RequireInitialisation { int nbIteration = 20; int nbUser = 0; @@ -48,6 +49,8 @@ public class ClickBlobs2users extends HorizontalPanel implements ICEDataLogger, int nbExpFinished = 0; boolean init = false; + long finishTime; + String blob1 = GWT.getModuleBaseURL() + "circle_black.png"; String blob2 = GWT.getModuleBaseURL() + "circle_red.png"; String blob3 = GWT.getModuleBaseURL() + "circle_blue.png"; @@ -57,11 +60,17 @@ public class ClickBlobs2users extends HorizontalPanel implements ICEDataLogger, String blob7 = GWT.getModuleBaseURL() + "circle_grey.png"; String blob8 = GWT.getModuleBaseURL() + "circle.png"; - AbsolutePanel absPanel; + //AbsolutePanel absPanel; Vector userLogVector = new Vector(); - String[][] loggedData; + Vector user1LogVec = new Vector(); + Vector user2LogVec = new Vector(); + String [] user1result; + String [] user2result; + + String[][] loggedData; + Blob user1; Blob user2; @@ -75,6 +84,13 @@ public class ClickBlobs2users extends HorizontalPanel implements ICEDataLogger, AbsolutePanel user1Panel = new AbsolutePanel(); AbsolutePanel user2Panel = new AbsolutePanel(); + AbsolutePanel user3Panel = new AbsolutePanel(); + AbsolutePanel user4Panel = new AbsolutePanel(); + + HorizontalPanel hPanel1 = new HorizontalPanel(); + HorizontalPanel hPanel2 = new HorizontalPanel(); + + /*************************************************************************** * Constructor @@ -85,14 +101,38 @@ public ClickBlobs2users(int nbBlobs, boolean randomPosition) { super(); this.setSize("100%", "100%"); this.nbBlobs = nbBlobs; + + hPanel1.setSize("100%", "100%"); + hPanel2.setSize("100%", "100%"); + user1Panel.setSize("100%", "100%"); user2Panel.setSize("100%", "100%"); + user3Panel.setSize("100%", "100%"); + user4Panel.setSize("100%", "100%"); + + + hPanel1.add(user1Panel); + hPanel1.setCellWidth(user1Panel, "50%"); + hPanel1.setCellHeight(user1Panel, "50%"); + hPanel1.add(user3Panel); + + hPanel2.add(user4Panel); + hPanel2.setCellWidth(user4Panel, "50%"); + hPanel2.setCellHeight(user4Panel, "50%"); + hPanel2.add(user2Panel); + + this.add(hPanel1); + this.add(hPanel2); + + //this.add(user1Panel); + //this.add(user2Panel); - this.add(user1Panel); - this.add(user2Panel); // forces to maintain the size of the cell - this.setCellHeight(user1Panel, "50%"); + //this.setCellHeight(user1Panel, "50%"); this.setBorderWidth(1); + + hPanel1.setBorderWidth(1); + hPanel2.setBorderWidth(1); } @@ -130,6 +170,7 @@ public void initialise() { // set the blob position array around a circle blobCoord = initBlobPosInCircle(nbBlobs, panelWidth / 2, panelHeight / 2, (panelHeight/ 2)-50); + setUsers(); init = true; } @@ -143,7 +184,7 @@ private void setUsersRandom() { randomNum(0, panelHeight - 70)); user2 = new Blob(blob2, "User 2", iteration, user2Panel, this, true); - user2Panel.add(user2); + user2Panel.add(user2); user2Panel.setWidgetPosition(user2, randomNum(0, panelWidth - 70), randomNum(0, panelHeight - 70)); @@ -151,17 +192,26 @@ private void setUsersRandom() { } private void setUsers() { - + user1 = new Blob(blob1, "User 1", iteration, user1Panel, this, blobCoord, 0,0, 0, true); user1Panel.add(user1); - user1Panel.setWidgetPosition(user1, panelWidth / 2, panelHeight / 2); - + //user1Panel.setWidgetPosition(user1, panelWidth / 2, panelHeight / 2); + user1Panel.setWidgetPosition(user1, blobCoord[0][0], blobCoord[0][1]); + user1.setBlobNumber(0); - user2 = new Blob(blob2, "User 2", iteration, user2Panel, this, blobCoord, 0,0, 1, true); - user2Panel.add(user2); - user2Panel.setWidgetPosition(user2, panelWidth / 2, panelHeight / 2); + user2 = new Blob(blob2, "User 2", iteration, user2Panel, this, blobCoord, 0,0, 0, true); //arrayOffset= 1 + user2Panel.add(user2); + //user2Panel.setWidgetPosition(user2, panelWidth / 2, panelHeight / 2); + user2Panel.setWidgetPosition(user2, blobCoord[0][0], blobCoord[0][1]); + user2.setBlobNumber(0); nbUser = 2; + + //PRINTING LOGS// + System.out.println("Experiment Identifier: " + ICEMain.identifier); + System.out.println("Name of Experiment Task: " + ExperimentIdentifier.CLICKBLOB); + System.out.println("User Number: " + nbUser); + System.out.println(); } @@ -169,24 +219,133 @@ private void setUsers() { * Callback method used by the Blob class to send the vector of data to be logged. * @param blobData */ - public void setLoggedData(Vector blobData){ + public void setLoggedData(Vector blobData , boolean finished){ if (nbExpFinished <= nbUser){ - userLogVector.addAll(blobData); - nbExpFinished++; + + if(finished) { + + userLogVector.addAll(blobData); + nbExpFinished++; + } + + else { + userLogVector.add(blobData.lastElement()); + } } if (nbExpFinished == nbUser){ - loggedData = new String[userLogVector.size()][4]; + if(user1.setFinishTime >= user2.setFinishTime){ // if User2 finishes the actual set first or if they finish at the same time + + finishTime = user1.setFinishTime; + } + + else{ //if user1 finishes the actual set first + + finishTime = user2.setFinishTime; + } + + loggedData = new String[userLogVector.size()][5]; for (int i = 0; i < loggedData.length; i++){ loggedData[i][0] = userLogVector.get(i).getUser(); loggedData[i][1] = String.valueOf(userLogVector.get(i).getX()); loggedData[i][2] = String.valueOf(userLogVector.get(i).getY()); loggedData[i][3] = String.valueOf(userLogVector.get(i).getTimeStamp()); + loggedData[i][4] = String.valueOf(userLogVector.get(i).getblobNumber()); + } + System.out.println("-------------------------------------------------------------------"); + System.out.println("******TASK FINISHED******"); + for (int i = 0; i < loggedData.length; i++) { + System.out.println( i + ". user:" + loggedData[i][0] + "; " + + "x:"+ loggedData[i][1] + "; " + + "y:"+loggedData[i][2] + "; " + + "time:" +loggedData[i][3] + "; " + + "blobNo:" +loggedData[i][4]); + + } + + System.out.println(""); + System.out.println("-------------------------------------------------------------------"); + System.out.println("User1; " + user1.count + " + " + user1.trialcount + " times out of blob"); + System.out.println(""); + System.out.println("User2; " + user2.count + " + " + user2.trialcount + " times out of blob"); + System.out.println("-------------------------------------------------------------------"); + + System.out.println("User1; Start time:"+ user1.startTime + " ; Finish time:"+ finishTime); + System.out.println("User1; Experiment Completion Time: " + (finishTime-(user1.startTime)) ); + System.out.println("User1; Set Finish time:"+ user1.setFinishTime); + System.out.println("User1; Set Completion Time: " + (user1.setFinishTime-user1.startTime)); + System.out.println(""); + System.out.println("User2 Start time:"+ user2.startTime + " ; Finish time:"+ finishTime); + System.out.println("User2 Experiment Completion Time: " + (finishTime-(user2.startTime)) ); + System.out.println("User2 Set Finish time:"+ user2.setFinishTime); + System.out.println("User2 Set Completion Time: " + (user2.setFinishTime-user2.startTime) ); + System.out.println("-------------------------------------------------------------------"); + + //******************************************************** + //FORMING USER1 LOG VECTOR + for(int i=0; i< userLogVector.size() ; i++) { + + if(userLogVector.get(i).getUser().equals("User 1") && userLogVector.get(i).getblobNumber() != -5){ + user1LogVec.add(userLogVector.get(i)); + } + } + //******************************************************** + //FORMING USER2 LOG VECTOR + for(int i=0; i< userLogVector.size() ; i++) { + + if(userLogVector.get(i).getUser().equals("User 2") && userLogVector.get(i).getblobNumber() != -5){ + user2LogVec.add(userLogVector.get(i)); + } + } + + //******************************************************** + //DIAMETER BLOBS FOR USER1 + user1result = new String[user1LogVec.size() / 2]; + int j=0; + for(int i=0 ; i< user1LogVec.size() ; i++){ + + if( (user1LogVec.get(i).getblobNumber() %2 == 0) && ((i+1) < user1LogVec.size()) ){ //if blobNo is even && next element exists + + if(user1LogVec.get(i+1).getblobNumber() == (user1LogVec.get(i).getblobNumber() + 1) ) + { + user1result[j] = user1LogVec.get(i).getUser() + "; Time passed between blob" +user1LogVec.get(i).getblobNumber() + " and blob" + user1LogVec.get(i+1).getblobNumber() + ": " + + (user1LogVec.get(i+1).getTimeStamp() - user1LogVec.get(i).getTimeStamp()) + '\n' ; + + System.out.println( user1LogVec.get(i).getUser()+ "; Time passed between blob" +user1LogVec.get(i).getblobNumber() + " and blob" + user1LogVec.get(i+1).getblobNumber() + ": " + + (user1LogVec.get(i+1).getTimeStamp() - user1LogVec.get(i).getTimeStamp()) ); + j++; + } + } + } + System.out.println(""); + + //******************************************************** + //DIAMETER BLOBS FOR USER2 + user2result = new String[user2LogVec.size() / 2]; + int k=0; + for(int i=0 ; i< user2LogVec.size() ; i++){ + + if( (user2LogVec.get(i).getblobNumber() %2 == 0) && ((i+1) < user2LogVec.size()) ){ //if blobNo is even && next element exists + + if(user2LogVec.get(i+1).getblobNumber() == (user2LogVec.get(i).getblobNumber() + 1) ) + { + user2result[k] =user2LogVec.get(i).getUser()+ "; Time passed between blob" +user2LogVec.get(i).getblobNumber() + " and blob" + user2LogVec.get(i+1).getblobNumber() + ": " + + (user2LogVec.get(i+1).getTimeStamp() - user2LogVec.get(i).getTimeStamp()) + '\n'; + + System.out.println( user2LogVec.get(i).getUser()+ "; Time passed between blob" +user2LogVec.get(i).getblobNumber() + " and blob" + user2LogVec.get(i+1).getblobNumber() + ": " + + (user2LogVec.get(i+1).getTimeStamp() - user2LogVec.get(i).getTimeStamp()) ); + k++; + + } + } + } + System.out.println("-------------------------------------------------------------------"); + log(); } } @@ -200,12 +359,17 @@ private void log() { @Override public void onSuccess(Void result) { + ClickBlobs2users.this.clear(); Window.alert("Successfully logged! Experiment finished"); } @Override public void onFailure(Throwable caught) { GWT.log("Error:", caught); + ClickBlobs2users.this.clear(); + + caught.printStackTrace(); + Window.alert("Not logged"); } }); @@ -219,12 +383,38 @@ public void onFailure(Throwable caught) { */ private String[] getLoggedResult(String[][] data) { - String[] result = new String[data.length]; + String[] result = new String[data.length + 1]; + String messageU1 = ""; + String messageU2 = ""; + + for (int i=0; i < data.length; i++){ + result[i] = data[i][0] + ";" + data[i][1] + ";" + data[i][2] + ";" + data[i][3] + ";" + data[i][4] + " \n"; + } + + for(int j = 0; j< user1result.length ; j++){ + + messageU1 = messageU1+ user1result[j]; + } + for(int m = 0; m< user2result.length ; m++){ - for (int i=1; i < result.length; i++){ - result[i] = data[i][0] + ";" + data[i][1] + ";" + data[i][2] + ";" + data[i][3] + " \n"; + messageU2 = messageU2+ user2result[m]; } + + result[data.length] = '\n'+ "---------------------------------------------------------------"+ '\n' + +"User1; Start Time:" + user1.startTime + " ; Finish Time:" + finishTime +" ; Experiment Completion Time: " + ((finishTime)-user1.startTime) + '\n' + +"User1; Set Finish time: " + user1.setFinishTime + " ; Set Completion Time:" + (user1.setFinishTime-user1.startTime) + +'\n' + +"User2; Start Time:" + user2.startTime + " ; Finish Time:" + finishTime +" ; Experiment Completion Time: " + ((finishTime)-user2.startTime) + '\n' + +"User2; Set Finish time: " + user2.setFinishTime + " ; Set Completion Time:" + (user2.setFinishTime-user2.startTime)+ '\n' + +"---------------------------------------------------------------"+ '\n' + +"User 1; " + user1.count + " + " + user1.trialcount + " times out of blob" + '\n' + +"User 2; " + user2.count + " + " + user2.trialcount + " times out of blob" + '\n' + + "---------------------------------------------------------------"+ '\n' + + messageU1 + '\n' + + messageU2 ; + return result; + } @@ -253,7 +443,7 @@ public void setLoggedData(String[] blobData) { @Override - public void setLoggedData(Collection blobData) { + public void setLoggedData(Vector blobData , boolean finished , boolean check) { // TODO Auto-generated method stub } @@ -278,7 +468,7 @@ private int[][] initBlobPosInCircle(int nbBlob, int xCenter, int yCenter, int ra blobPos[1][0] = xCenter; blobPos[1][1] = yCenter + radius; - System.out.println("Y pos 0: " + blobPos[0][1] + "; Y pos 1: " + blobPos[1][1] + " radius: "+ radius + "dAngle: " + dAngle); + //System.out.println("Y pos 0: " + blobPos[0][1] + "; Y pos 1: " + blobPos[1][1] + " radius: "+ radius + "dAngle: " + dAngle); for (int i = 2; i < nbPos ; i = i + 2){ angle = angle + dAngle; @@ -309,7 +499,7 @@ private int[][] initBlobPosInCircle(int nbBlob, int xCenter, int yCenter, int ra blobPos[i+1][0] = (int) (xCenter - x); blobPos[i+1][1] = (int) (yCenter - y); } - System.out.println("Y pos " + i + ": " + blobPos[i][1] + "; Y pos "+ (i+1) + ": " + blobPos[i+1][1] + "; Angle: " + angle); + //System.out.println("Y pos " + i + ": " + blobPos[i][1] + "; Y pos "+ (i+1) + ": " + blobPos[i+1][1] + "; Angle: " + angle); } return blobPos; diff --git a/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/clickblobs/ClickBlobs4users.java b/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/clickblobs/ClickBlobs4users.java index c0677dc..b5cecbe 100644 --- a/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/clickblobs/ClickBlobs4users.java +++ b/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/clickblobs/ClickBlobs4users.java @@ -25,6 +25,7 @@ import java.util.Collection; import java.util.Vector; +import java.lang.Math; import ch.unifr.pai.ice.client.ICEMain; import ch.unifr.pai.ice.client.RequireInitialisation; @@ -48,19 +49,31 @@ public class ClickBlobs4users extends VerticalPanel implements ICEDataLogger, Re int nbUser = 0; int iteration = 0; int nbExpFinished = 0; + + long startTime ; + long finishTime ; String blob1 = GWT.getModuleBaseURL() + "circle_black.png"; String blob2 = GWT.getModuleBaseURL() + "circle_red.png"; - String blob3 = GWT.getModuleBaseURL() + "circle_blue.png"; + String blob3 = GWT.getModuleBaseURL() + "circle_blue.png"; String blob4 = GWT.getModuleBaseURL() + "circle_green.png"; String blob5 = GWT.getModuleBaseURL() + "circle_magenta.png"; String blob6 = GWT.getModuleBaseURL() + "circle_violet.png"; String blob7 = GWT.getModuleBaseURL() + "circle_grey.png"; String blob8 = GWT.getModuleBaseURL() + "circle.png"; - AbsolutePanel absPanel; + AbsolutePanel absPanel; Vector userLogVector = new Vector(); + Vector user1LogVec = new Vector(); + Vector user2LogVec = new Vector(); + Vector user3LogVec = new Vector(); + Vector user4LogVec = new Vector(); + String [] user1result; + String [] user2result; + String [] user3result; + String [] user4result; + String[][] loggedData; boolean init; @@ -112,12 +125,12 @@ public ClickBlobs4users(int nbBlobs, boolean randomPosition) { // forces to maintain the size of the cell hPanel1.setCellWidth(user1Panel, "50%"); hPanel1.setCellHeight(user1Panel, "50%"); - hPanel1.add(user2Panel); + hPanel1.add(user3Panel); - hPanel2.add(user3Panel); - hPanel2.setCellWidth(user3Panel, "50%"); - hPanel2.setCellHeight(user3Panel, "50%"); - hPanel2.add(user4Panel); + hPanel2.add(user4Panel); //user3Panel + hPanel2.setCellWidth(user4Panel, "50%"); //user3Panel + hPanel2.setCellHeight(user4Panel, "50%"); //user3Panel + hPanel2.add(user2Panel); //user4Panel this.add(hPanel1); this.add(hPanel2); @@ -161,6 +174,7 @@ public void initialise() { // set the blob position array around a circle blobCoord = initBlobPosInCircle(nbBlobs, panelWidth / 2, panelHeight / 2, (panelHeight / 2) - 50); + setUsers(); init = true; } @@ -191,21 +205,33 @@ private void setUsers() { user1 = new Blob(blob1, "User 1", iteration, user1Panel, this, blobCoord, 0, 0, 0, true); user1Panel.add(user1); - user1Panel.setWidgetPosition(user1, panelWidth / 2, panelHeight / 2); + //user1Panel.setWidgetPosition(user1, panelWidth / 2, panelHeight / 2); + user1Panel.setWidgetPosition(user1, blobCoord[0][0], blobCoord[0][1]); - user2 = new Blob(blob2, "User 2", iteration, user2Panel, this, blobCoord, 0, 0, 1, true); + user2 = new Blob(blob2, "User 2", iteration, user2Panel, this, blobCoord, 0, 0, 0, true); user2Panel.add(user2); - user2Panel.setWidgetPosition(user2, panelWidth / 2, panelHeight / 2); - - user3 = new Blob(blob8, "User 3", iteration, user3Panel, this, blobCoord, 0, 0, 2, true); + //user2Panel.setWidgetPosition(user2, panelWidth / 2, panelHeight / 2); + user2Panel.setWidgetPosition(user2, blobCoord[0][0], blobCoord[0][1]); + + user3 = new Blob(blob3, "User 3", iteration, user3Panel, this, blobCoord, 0, 0, 0, true); user3Panel.add(user3); - user3Panel.setWidgetPosition(user3, panelWidth / 2, panelHeight / 2); + //user3Panel.setWidgetPosition(user3, panelWidth / 2, panelHeight / 2); + user3Panel.setWidgetPosition(user3, blobCoord[0][0], blobCoord[0][1]); - user4 = new Blob(blob4, "User 4", iteration, user4Panel, this, blobCoord, 0, 0, 3, true); + user4 = new Blob(blob4, "User 4", iteration, user4Panel, this, blobCoord, 0, 0, 0, true); user4Panel.add(user4); - user4Panel.setWidgetPosition(user4, panelWidth / 2, panelHeight / 2); + //user4Panel.setWidgetPosition(user4, panelWidth / 2, panelHeight / 2); + user4Panel.setWidgetPosition(user4, blobCoord[0][0], blobCoord[0][1]); nbUser = 4; + + //PRINTING LOGS + System.out.println("Experiment Identifier: " + ICEMain.identifier); + System.out.println("Name of Experiment Task: " + ExperimentIdentifier.CLICKBLOB); + System.out.println("User Number: " + nbUser); + System.out.println(); + + } /** @@ -214,23 +240,194 @@ private void setUsers() { * @param blobData */ @Override - public void setLoggedData(Vector blobData) { + public void setLoggedData(Vector blobData , boolean finished) { - if (nbExpFinished <= nbUser) { - userLogVector.addAll(blobData); - nbExpFinished++; + if (nbExpFinished <= nbUser) { //other users did not finished yet + + if(finished) { + userLogVector.addAll(blobData); + nbExpFinished++; + } + + else { + userLogVector.add(blobData.lastElement()); + } + } - if (nbExpFinished == nbUser) { + if (nbExpFinished == nbUser) { //for the last user + + long maxtime = Math.max(Math.max(user1.setFinishTime,user2.setFinishTime),Math.max(user3.setFinishTime,user4.setFinishTime)); + finishTime = maxtime; - loggedData = new String[userLogVector.size()][4]; + loggedData = new String[userLogVector.size()][5]; for (int i = 0; i < loggedData.length; i++) { loggedData[i][0] = userLogVector.get(i).getUser(); loggedData[i][1] = String.valueOf(userLogVector.get(i).getX()); loggedData[i][2] = String.valueOf(userLogVector.get(i).getY()); loggedData[i][3] = String.valueOf(userLogVector.get(i).getTimeStamp()); + loggedData[i][4] = String.valueOf(userLogVector.get(i).getblobNumber()); + + } + + System.out.println("-------------------------------------------------------------------"); + System.out.println("******TASK FINISHED******"); + for (int i = 0; i < loggedData.length; i++) { + System.out.println( i + ". user:" + loggedData[i][0] + "; " + + "x:"+ loggedData[i][1] + "; " + + "y:"+loggedData[i][2] + "; " + + "time:" +loggedData[i][3] + "; " + + "blobNo:" +loggedData[i][4]); + + } + System.out.println(""); + System.out.println("-------------------------------------------------------------------"); + System.out.println("User1; " + user1.count + " + " + user1.trialcount + " times out of blob"); + System.out.println(""); + System.out.println("User2; " + user2.count + " + " + user2.trialcount + " times out of blob"); + System.out.println(""); + System.out.println("User3; " + user3.count + " + " + user3.trialcount + " times out of blob"); + System.out.println(""); + System.out.println("User4; " + user4.count + " + " + user4.trialcount + " times out of blob"); + System.out.println("-------------------------------------------------------------------"); + System.out.println("User1; Start time:"+ user1.startTime + " ; Finish time:"+ finishTime); + System.out.println("User1; Experiment Completion Time: " + ((finishTime)-user1.startTime) ); + System.out.println("User1; Set Finish time:"+ user1.setFinishTime); + System.out.println("User1; Set Completion Time: " + (user1.setFinishTime-user1.startTime) ); + System.out.println(""); + System.out.println("User2; Start time:"+ user2.startTime + " ; Finish time:"+ finishTime); + System.out.println("User2; Experiment Completion Time: " + ((finishTime)-user2.startTime) ); + System.out.println("User2; Set Finish time:"+ user2.setFinishTime); + System.out.println("User2; Set Completion Time: " + (user2.setFinishTime-user2.startTime) ); + System.out.println(""); + System.out.println("User3; Start time:"+ user3.startTime + " ; Finish time:"+ finishTime); + System.out.println("User3; Experiment Completion Time: " + ((finishTime)-user3.startTime) ); + System.out.println("User3; Set Finish time:"+ user3.setFinishTime); + System.out.println("User3; Set Completion Time: " + (user3.setFinishTime-user3.startTime) ); + System.out.println(""); + System.out.println("User4; Start time:"+ user4.startTime + " ; Finish time:"+ finishTime); + System.out.println("User4; Experiment Completion Time: " + ((finishTime)-user4.startTime) ); + System.out.println("User4; Set Finish time:"+ user4.setFinishTime); + System.out.println("User4; Set Completion Time: " + (user4.setFinishTime-user4.startTime) ); + System.out.println("-------------------------------------------------------------------"); + + //******************************************************** + //FORMING USER1 LOG VECTOR + for(int i=0; i< userLogVector.size() ; i++) { + + if(userLogVector.get(i).getUser().equals("User 1") && userLogVector.get(i).getblobNumber() != -5){ + user1LogVec.add(userLogVector.get(i)); + } + } + + //******************************************************** + //FORMING USER2 LOG VECTOR + for(int i=0; i< userLogVector.size() ; i++) { + + if(userLogVector.get(i).getUser().equals("User 2") && userLogVector.get(i).getblobNumber() != -5){ + user2LogVec.add(userLogVector.get(i)); + } + } + //******************************************************** + //FORMING USER3 LOG VECTOR + for(int i=0; i< userLogVector.size() ; i++) { + + if(userLogVector.get(i).getUser().equals("User 3") && userLogVector.get(i).getblobNumber() != -5){ + user3LogVec.add(userLogVector.get(i)); + } + } + //******************************************************** + //FORMING USER4 LOG VECTOR + for(int i=0; i< userLogVector.size() ; i++) { + + if(userLogVector.get(i).getUser().equals("User 4") && userLogVector.get(i).getblobNumber() != -5){ + user4LogVec.add(userLogVector.get(i)); + } + } + //******************************************************** + //DIAMETER BLOBS FOR USER1 + user1result = new String[user1LogVec.size() / 2]; + int j=0; + for(int i=0 ; i< user1LogVec.size() ; i++){ + + if((user1LogVec.get(i).getblobNumber() %2 == 0) && ((i+1) < user1LogVec.size()) ){ //if blobNo is even && next element exists + + if(user1LogVec.get(i+1).getblobNumber() == (user1LogVec.get(i).getblobNumber() + 1) ) + { + user1result[j] = user1LogVec.get(i).getUser() + "; Time passed between blob" +user1LogVec.get(i).getblobNumber() + " and blob" + user1LogVec.get(i+1).getblobNumber() + ": " + + (user1LogVec.get(i+1).getTimeStamp() - user1LogVec.get(i).getTimeStamp()) + '\n' ; + System.out.println( user1LogVec.get(i).getUser()+ "; Time passed between blob" +user1LogVec.get(i).getblobNumber() + " and blob" + user1LogVec.get(i+1).getblobNumber() + ": " + + (user1LogVec.get(i+1).getTimeStamp() - user1LogVec.get(i).getTimeStamp()) ); + j++; + } + + } + } + System.out.println(""); + + //******************************************************** + //DIAMETER BLOBS FOR USER2 + user2result = new String[user2LogVec.size() / 2]; + int k=0; + for(int i=0 ; i< user2LogVec.size() ; i++){ + + if( (user2LogVec.get(i).getblobNumber() %2 == 0) && ((i+1) < user2LogVec.size()) ){ //if blobNo is even && next element exists + + if(user2LogVec.get(i+1).getblobNumber() == (user2LogVec.get(i).getblobNumber() + 1) ) + { + user2result[k] =user2LogVec.get(i).getUser()+ "; Time passed between blob" +user2LogVec.get(i).getblobNumber() + " and blob" + user2LogVec.get(i+1).getblobNumber() + ": " + + (user2LogVec.get(i+1).getTimeStamp() - user2LogVec.get(i).getTimeStamp()) + '\n'; + System.out.println( user2LogVec.get(i).getUser()+ "; Time passed between blob" +user2LogVec.get(i).getblobNumber() + " and blob" + user2LogVec.get(i+1).getblobNumber() + ": " + + (user2LogVec.get(i+1).getTimeStamp() - user2LogVec.get(i).getTimeStamp()) ); + + k++; + } + } + } + System.out.println(""); + + //******************************************************** + //DIAMETER BLOBS FOR USER3 + user3result = new String[user3LogVec.size() / 2]; + int l=0; + for(int i=0 ; i< user3LogVec.size() ; i++){ + + if( (user3LogVec.get(i).getblobNumber() %2 == 0) && ((i+1) < user3LogVec.size()) ){ //if blobNo is even && next element exists + + if(user3LogVec.get(i+1).getblobNumber() == (user3LogVec.get(i).getblobNumber() + 1) ) + { + user3result[l] =user3LogVec.get(i).getUser()+ "; Time passed between blob" +user3LogVec.get(i).getblobNumber() + " and blob" + user3LogVec.get(i+1).getblobNumber() + ": " + + (user3LogVec.get(i+1).getTimeStamp() - user3LogVec.get(i).getTimeStamp()) + '\n'; + + + System.out.println( user3LogVec.get(i).getUser()+ "; Time passed between blob" +user3LogVec.get(i).getblobNumber() + " and blob" + user3LogVec.get(i+1).getblobNumber() + ": " + + (user3LogVec.get(i+1).getTimeStamp() - user3LogVec.get(i).getTimeStamp()) ); + l++; + } + } } + System.out.println(""); + + //******************************************************** + //DIAMETER BLOBS FOR USER4 + user4result = new String[user4LogVec.size() / 2]; + int m=0; + for(int i=0 ; i< user4LogVec.size() ; i++){ + + if( (user4LogVec.get(i).getblobNumber() %2 == 0) && ((i+1) < user4LogVec.size()) ){ //if blobNo is even && next element exists + + if(user4LogVec.get(i+1).getblobNumber() == (user4LogVec.get(i).getblobNumber() + 1) ) + { + user4result[m] =user4LogVec.get(i).getUser()+ "; Time passed between blob" +user4LogVec.get(i).getblobNumber() + " and blob" + user4LogVec.get(i+1).getblobNumber() + ": " + + (user4LogVec.get(i+1).getTimeStamp() - user4LogVec.get(i).getTimeStamp()) + '\n'; + System.out.println( user4LogVec.get(i).getUser()+ "; Time passed between blob" +user4LogVec.get(i).getblobNumber() + " and blob" + user4LogVec.get(i+1).getblobNumber() + ": " + + (user4LogVec.get(i+1).getTimeStamp() - user4LogVec.get(i).getTimeStamp()) ); + m++; + } + } + } + System.out.println("-------------------------------------------------------------------"); log(); } @@ -245,12 +442,14 @@ private void log() { @Override public void onSuccess(Void result) { - Window.alert("Successfully logged! Experiment finished"); + ClickBlobs4users.this.clear(); +; Window.alert("Successfully logged! Experiment finished"); } @Override public void onFailure(Throwable caught) { GWT.log("Error:", caught); + ClickBlobs4users.this.clear(); Window.alert("Not logged"); } }); @@ -264,11 +463,58 @@ public void onFailure(Throwable caught) { */ private String[] getLoggedResult(String[][] data) { - String[] result = new String[data.length]; + String[] result = new String[data.length + 1]; + String messageU1 = ""; + String messageU2 = ""; + String messageU3 = ""; + String messageU4 = ""; + + for (int i = 0; i < data.length; i++) { + result[i] = data[i][0] + ";" + data[i][1] + ";" + data[i][2] + ";" + data[i][3] + ";" + data[i][4] + " \n"; + } + + for(int j = 0; j< user1result.length ; j++){ + + messageU1 = messageU1+ user1result[j]; + } + for(int k = 0; k< user2result.length ; k++){ + + messageU2 = messageU2+ user2result[k]; + } + for(int l = 0; l< user3result.length ; l++){ + + messageU3 = messageU3+ user3result[l]; + } + for(int m = 0; m< user4result.length ; m++){ - for (int i = 1; i < result.length; i++) { - result[i] = data[i][0] + ";" + data[i][1] + ";" + data[i][2] + ";" + data[i][3] + " \n"; + messageU4 = messageU4+ user4result[m]; } + + + result[data.length] = '\n'+ "---------------------------------------------------------------"+ '\n' + +"User1; Start Time:" + user1.startTime + " ; Finish Time:" + finishTime +" ; Experiment Completion Time: " + ((finishTime)-user1.startTime) + '\n' + +"Set Finish time: " + user1.setFinishTime + " ; Set Completion Time:" + (user1.setFinishTime-user1.startTime) + +'\n' + +"User2; Start Time:" + user2.startTime + " ; Finish Time:"+ finishTime +" ; Experiment Completion Time: "+ ((finishTime)-user2.startTime) + '\n' + +"Set Finish time: " + user2.setFinishTime + " ; Set Completion Time:" + (user2.setFinishTime-user2.startTime) + + '\n' + +"User3; Start Time:" + user3.startTime + " ; Finish Time:" + finishTime +" ; Experiment Completion Time: " + ((finishTime)-user3.startTime) + '\n' + +"Set Finish time: " + user3.setFinishTime + " ; Set Completion Time:" + (user3.setFinishTime-user3.startTime) + +'\n' + +"User4; Start Time:" + user4.startTime + " ; Finish Time:" + finishTime +" ; Experiment Completion Time: " + ((finishTime)-user4.startTime) + '\n' + +"Set Finish time: " + user4.setFinishTime + " ; Set Completion Time:" + (user4.setFinishTime-user4.startTime) + '\n' + +"---------------------------------------------------------------"+ '\n' + +"User 1; " + user1.count + " + " + user1.trialcount + " times out of blob" + '\n' + +"User 2; " + user2.count + " + " + user2.trialcount + " times out of blob" + '\n' + +"User 3; " + user3.count + " + " + user3.trialcount + " times out of blob" + '\n' + +"User 4; " + user4.count + " + " + user4.trialcount + " times out of blob" + '\n' + + "---------------------------------------------------------------"+ '\n' + + messageU1 + '\n' + + messageU2 + '\n' + + messageU3 + '\n' + + messageU4 ; + + return result; } @@ -295,7 +541,7 @@ public void setLoggedData(String[] blobData) { } @Override - public void setLoggedData(Collection blobData) { + public void setLoggedData(Vector blobData , boolean finished , boolean check) { // TODO Auto-generated method stub } diff --git a/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/dragNdrop/DnD1user.java b/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/dragNdrop/DnD1user.java index 33e1f86..5492302 100644 --- a/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/dragNdrop/DnD1user.java +++ b/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/dragNdrop/DnD1user.java @@ -26,6 +26,7 @@ import java.util.Collection; import java.util.Vector; +import ch.unifr.pai.ice.client.dragNdrop.DnD1userGeneric; import ch.unifr.pai.ice.client.ICEMain; import ch.unifr.pai.ice.client.RequireInitialisation; import ch.unifr.pai.ice.client.rpc.EventingService; @@ -37,6 +38,7 @@ import com.google.gwt.core.client.GWT; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.rpc.AsyncCallback; +import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.VerticalPanel; public class DnD1user extends VerticalPanel implements ICEDataLogger, RequireInitialisation { @@ -51,40 +53,83 @@ public class DnD1user extends VerticalPanel implements ICEDataLogger, RequireIni String blob8 = GWT.getModuleBaseURL() + "circle.png"; DnD1userGeneric user1Panel; + DnD1userGeneric user2Panel = new DnD1userGeneric("user2", 4, blob2, this); + DnD1userGeneric user3Panel = new DnD1userGeneric("user3", 4, blob3, this) ; + DnD1userGeneric user4Panel = new DnD1userGeneric("user4", 4, blob4, this) ; + + HorizontalPanel hPanel1 = new HorizontalPanel(); + HorizontalPanel hPanel2 = new HorizontalPanel(); int nbExpFinished = 0; int nbUser = 1; Vector userLogVector = new Vector(); String[] loggedData; private final boolean doLog; + + double finishTime ; // public DnD1user(int numberOfBlobs, boolean doLog) { super(); this.user1Panel = new DnD1userGeneric("user1", numberOfBlobs, blob1, this); this.doLog = doLog; + user1Panel.setSize("100%", "100%"); - this.add(user1Panel); + user2Panel.setSize("100%", "100%"); + user3Panel.setSize("100%", "100%"); + user4Panel.setSize("100%", "100%"); + //this.add(user1Panel); + // this.setBorderWidth(1); this.setSize("100%", "100%"); + + hPanel1.setSize("100%", "100%"); + hPanel2.setSize("100%", "100%"); + + hPanel1.add(user1Panel); + hPanel1.setCellWidth(user1Panel, "50%"); + hPanel1.setCellHeight(user1Panel, "50%"); + hPanel1.add(user3Panel); + + hPanel2.add(user4Panel); + hPanel2.setCellWidth(user3Panel, "50%"); + hPanel2.setCellHeight(user3Panel, "50%"); + hPanel2.add(user2Panel); + + this.add(hPanel1); + this.add(hPanel2); + + this.setBorderWidth(1); + hPanel1.setBorderWidth(1); + hPanel2.setBorderWidth(1); + } @Override public void initialise() { user1Panel.initialise(); + + //PRINTING LOGS //to be deleted// + System.out.println("Experiment Identifier: " + ICEMain.identifier); + System.out.println("Name of Experiment Task: " + ExperimentIdentifier.DRAGNDROP); + System.out.println("User Number: " + nbUser); + System.out.println(); + //to be deleted// + } /** * 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, loggedData, ExperimentIdentifier.DRAGNDROP, 1, new AsyncCallback() { + svc.log(ICEMain.identifier, getLoggedResult(loggedData), ExperimentIdentifier.DRAGNDROP, 1, new AsyncCallback() { @Override public void onSuccess(Void result) { DnD1user.this.clear(); - Window.alert("Task finished!"); + Window.alert("Successfully logged! Experiment finished"); } @Override @@ -108,44 +153,79 @@ public void onFailure(Throwable caught) { * @return Array of string containing the user, x, y coord, time stamps of the click */ - private String[] getLoggedResult(String[][] data) { - String[] result = new String[data.length]; + private String[] getLoggedResult(String[] data) { + String[] result = new String[data.length + 1]; - for (int i = 1; i < result.length; i++) { - result[i] = data[i][0] + ";" + data[i][1] + ";" + data[i][2] + ";" + data[i][3] + " \n"; + for (int i = 0; i < data.length; i++) { + result[i] = data[i] + " \n" ; } + + result[data.length] = '\n' + "---------------------------------------------------------------"+ '\n' + + "User 1; Start Time:"+ user1Panel.startTime + " ; Finish Time:"+ finishTime +"; Experiment Completion Time: " + (finishTime-user1Panel.startTime) + '\n' + + "---------------------------------------------------------------"+ '\n'+ + "User 1 ; "+ user1Panel.setcount + " times unsuccessful D&D" + '\n'+ + "---------------------------------------------------------------"+ '\n'; + return result; } @Override - public void setLoggedData(Collection blobData) { + public void setLoggedData(Vector blobData , boolean finished , boolean check) { + if (nbExpFinished < nbUser) { - userLogVector.addAll(blobData); - nbExpFinished++; + + if(finished){ + userLogVector.addAll(blobData); + nbExpFinished++; + } + + else + { + userLogVector.add(blobData.lastElement()); + } } if (nbExpFinished == nbUser) { + + finishTime = System.currentTimeMillis(); + loggedData = new String[userLogVector.size()]; userLogVector.copyInto(loggedData); + + System.out.println("-------------------------------------------------------------------"); + System.out.println("***TASK FINISHED***"); + for(int i=0 ; i blobData) { + public void setLoggedData(Vector blobData , boolean finished) { } + @Override public void setLoggedData(String[] blobData) { // TODO Auto-generated method stub } - + } diff --git a/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/dragNdrop/DnD1userGeneric.java b/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/dragNdrop/DnD1userGeneric.java index d4c1047..1fd38b8 100644 --- a/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/dragNdrop/DnD1userGeneric.java +++ b/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/dragNdrop/DnD1userGeneric.java @@ -62,7 +62,7 @@ public class DnD1userGeneric extends LayoutPanel implements RequireInitialisatio // int dropPanelWidth; // int dropPanelHeight; - Vector resultVector; + Vector resultVector; int blobsToDrop = 0; String blobColor = "black"; @@ -78,6 +78,17 @@ public class DnD1userGeneric extends LayoutPanel implements RequireInitialisatio // Current image : 50x50 px String imageName = GWT.getModuleBaseURL() + "trash-bin50x50.jpg"; + + boolean logcheck = false ; + int count = 0; + int trialcount = 0; + int setcount = 0; + boolean isStarted = false; + boolean isSetFinished = false; + long startTime; + long setFinishTime; + + /****************************************************************** * Constructor @@ -103,6 +114,7 @@ public DnD1userGeneric(String userNo, int nbBlobs, String blobImageURL, ICEDataL // binPanel.setSize("100px", "100px"); binPanel.getElement().getStyle().setBackgroundImage("url('" + imageName + "')"); } + @Override public void initialise() { @@ -156,7 +168,7 @@ public void initialise() { // } // } - addBlobs(); + addBlobs(true); final FocusPanel panel = new FocusPanel(); panel.addMouseMoveHandler(new MouseMoveHandler() { @@ -191,7 +203,8 @@ public void execute() { * Blobs generator with the draggable capabilities **************************************************/ - private void addBlobs() { + private void addBlobs( boolean check) { + logcheck= check; final int blobwidth = 30; final int blobheight = 30; for (int i = 0; i < blobCoord.length; i++) { @@ -210,12 +223,21 @@ private void addBlobs() { @Override public void onStartDrag(String deviceId, Widget draggedWidget) { - + + if(!isStarted){ + long time = System.currentTimeMillis(); + System.out.println(userNo + " Start Time:" + time ); //to be deleted + isStarted = true; + startTime = time; + } + if (!((DraggableLabelledBlob) draggedWidget).isDragStarted()) { // set the starting time ((DraggableLabelledBlob) draggedWidget).setDragStarted(true); ((DraggableLabelledBlob) draggedWidget).setDragStartTime(System.currentTimeMillis()); + + } } @@ -239,7 +261,7 @@ public boolean onDrop(String deviceId, Widget draggedWidget, int dragProxyLeft, // } else if (isInsideBin(dragProxyLeft, dragProxyTop, binPanel)) { - System.out.println(binPanel.getAbsoluteLeft()); + //System.out.println(binPanel.getAbsoluteLeft()); // dragProxyLeft > (panelWidth / 2)) { remove(draggedWidget); @@ -247,23 +269,82 @@ public boolean onDrop(String deviceId, Widget draggedWidget, int dragProxyLeft, // Set the drop time ((DraggableLabelledBlob) draggedWidget).setDropTime(System.currentTimeMillis()); ((DraggableLabelledBlob) draggedWidget).setDragStarted(false); + + ((DraggableLabelledBlob) draggedWidget).setFalseDropTime(0); + + //System.out.println("DROP TIME: " + (( (DraggableLabelledBlob) draggedWidget).getDropTime() )) ; + //System.out.println("DROP check amacli: "+ System.currentTimeMillis() ); //to be deleted + //System.out.println("ASIL TEST: " + ((System.currentTimeMillis()) -((( (DraggableLabelledBlob) draggedWidget).getDropTime() )) ) ); //to be deleted + //System.out.println("belli olan fonksiyon: "+ (((DraggableLabelledBlob) draggedWidget).getDragNdropTime()) ); //to be deleted // add the result in the log vector resultVector.add( +// new String(userNo + "; blob" + ((DraggableLabelledBlob) draggedWidget).getBlobNumber() + ";" +// + ((DraggableLabelledBlob) draggedWidget).getDragNdropTime() +// + ";" + count)); + new String(userNo + "; blob" + ((DraggableLabelledBlob) draggedWidget).getBlobNumber() + ";" - + ((DraggableLabelledBlob) draggedWidget).getDragNdropTime())); - - if (--blobsToDrop == 0) { + + ((DraggableLabelledBlob) draggedWidget).getDragNdropTime() + )); + + //to be deleted// + System.out.println("(LOG INFO) " + userNo + " ;" + + " BlobNo: " + "blob" + ((DraggableLabelledBlob) draggedWidget).getBlobNumber() + " ;" + + " Drop time: " + ((DraggableLabelledBlob) draggedWidget).getDragNdropTime() + + /*+ " Unsucess blob count:" + count*/); + + + if (! logcheck ) { + blobsToDrop= blobsToDrop-1; + log(false); + + } + + + if(logcheck){ + if (--blobsToDrop == 0 ) { // log the results if all blobs are // dropped!!! - log(); + + log(true);} } } else { + + + ((DraggableLabelledBlob) draggedWidget).setFalseDropTime(System.currentTimeMillis()); + ((DraggableLabelledBlob) draggedWidget).setDragStarted(false); + + ((DraggableLabelledBlob) draggedWidget).setDropTime(0); + count= count+1; + + resultVector.add( + +// new String(userNo + "; blob" + ((DraggableLabelledBlob) draggedWidget).getBlobNumber() + ";" +// + ((DraggableLabelledBlob) draggedWidget).getFalseDragNdropTime() +// + ";" + count) + " ; unsuccessful dNd"); + + new String(userNo + "; blob" + ((DraggableLabelledBlob) draggedWidget).getBlobNumber() + ";" + + ((DraggableLabelledBlob) draggedWidget).getFalseDragNdropTime() + + ";" + count) + ". unsuccessful dNd"); + + if (! logcheck ){ + log(false); + trialcount++; + } + + if (logcheck ){ + setcount++; + } + + System.out.println(userNo+ ": " + "Unsuccess Drag&Drop!" + " ; BlobNo:" + ((DraggableLabelledBlob) draggedWidget).getBlobNumber() + " ; Unsuccess Drop Time:" + ((DraggableLabelledBlob) draggedWidget).getFalseDragNdropTime() ); //to be deleted + return false; } return true; + } } @@ -273,14 +354,27 @@ public boolean onDrop(String deviceId, Widget draggedWidget, int dragProxyLeft, setWidgetTopHeight(blob, blobCoord[i][0] - blobheight / 2, Unit.PX, blobheight, Unit.PX); setWidgetLeftWidth(blob, blobCoord[i][1] - blobwidth / 2, Unit.PX, blobwidth, Unit.PX); } - + } // ------------------------------------------------------------------------ - private void log() { - logger.setLoggedData(resultVector); + private void log(boolean doLog) { + + if(!isSetFinished){ + long setfinishtime = System.currentTimeMillis(); + isSetFinished = true; + setFinishTime = setfinishtime; + } + + logger.setLoggedData(resultVector , doLog , true); + + if (blobsToDrop == 0){ + + addBlobs(false);} // for user to keep doing task until others finish + } + // ------------------------------------------------------------------------ /** diff --git a/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/dragNdrop/DnD2users.java b/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/dragNdrop/DnD2users.java index dc34579..3e9c002 100644 --- a/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/dragNdrop/DnD2users.java +++ b/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/dragNdrop/DnD2users.java @@ -37,6 +37,7 @@ import com.google.gwt.core.client.GWT; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.rpc.AsyncCallback; +import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.VerticalPanel; public class DnD2users extends VerticalPanel implements ICEDataLogger, RequireInitialisation { @@ -50,28 +51,68 @@ public class DnD2users extends VerticalPanel implements ICEDataLogger, RequireIn String blob7 = GWT.getModuleBaseURL() + "circle_grey.png"; String blob8 = GWT.getModuleBaseURL() + "circle.png"; - DnD1userGeneric user1Panel = new DnD1userGeneric("user1", 20, blob1, this); - DnD1userGeneric user2Panel = new DnD1userGeneric("user2", 20, blob2, this); + DnD1userGeneric user1Panel = new DnD1userGeneric("user1", 4, blob1, this); + DnD1userGeneric user2Panel = new DnD1userGeneric("user2", 4, blob2, this); + DnD1userGeneric user3Panel = new DnD1userGeneric("user3", 20, blob3, this) ; + DnD1userGeneric user4Panel = new DnD1userGeneric("user4", 20, blob4, this) ; + + HorizontalPanel hPanel1 = new HorizontalPanel(); + HorizontalPanel hPanel2 = new HorizontalPanel(); + int nbExpFinished = 0; int nbUser = 2; Vector userLogVector = new Vector(); String[] loggedData; + + long finishTime ; public DnD2users() { super(); + user1Panel.setSize("100%", "100%"); user2Panel.setSize("100%", "100%"); - this.add(user1Panel); - this.add(user2Panel); - this.setBorderWidth(1); - this.setSize("100%", "100%"); + user3Panel.setSize("100%", "100%"); + user4Panel.setSize("100%", "100%"); + + this.setSize("100%", "100%"); + hPanel1.setSize("100%", "100%"); + hPanel2.setSize("100%", "100%"); + + hPanel1.add(user1Panel); + hPanel1.setCellWidth(user1Panel, "50%"); + hPanel1.setCellHeight(user1Panel, "50%"); + hPanel1.add(user3Panel); + + hPanel2.add(user4Panel); + hPanel2.setCellWidth(user3Panel, "50%"); + hPanel2.setCellHeight(user3Panel, "50%"); + hPanel2.add(user2Panel); + + this.add(hPanel1); + this.add(hPanel2); + + //this.add(user1Panel); + //this.add(user2Panel); + this.setBorderWidth(1); + + hPanel1.setBorderWidth(1); + hPanel2.setBorderWidth(1); + + //this.setSize("100%", "100%"); } @Override public void initialise() { user1Panel.initialise(); user2Panel.initialise(); + + //PRINTING LOGS + System.out.println("Experiment Identifier: " + ICEMain.identifier); + System.out.println("Name of Experiment Task: " + ExperimentIdentifier.DRAGNDROP); + System.out.println("User Number: " + nbUser); + System.out.println(); + } /** @@ -79,16 +120,18 @@ public void initialise() { */ private void log() { EventingServiceAsync svc = GWT.create(EventingService.class); - svc.log(ICEMain.identifier, loggedData, ExperimentIdentifier.DRAGNDROP, 2, new AsyncCallback() { + svc.log(ICEMain.identifier, getLoggedResult(loggedData), ExperimentIdentifier.DRAGNDROP, 2, new AsyncCallback() { @Override public void onSuccess(Void result) { + DnD2users.this.clear(); Window.alert("Successfully logged! Experiment finished"); } @Override public void onFailure(Throwable caught) { GWT.log("Error:", caught); + DnD2users.this.clear(); Window.alert("Not logged"); } }); @@ -101,28 +144,76 @@ public void onFailure(Throwable caught) { * @return Array of string containing the user, x, y coord, time stamps of the click */ - private String[] getLoggedResult(String[][] data) { - String[] result = new String[data.length]; + private String[] getLoggedResult(String[] data) { + String[] result = new String[data.length + 1]; - for (int i = 1; i < result.length; i++) { - result[i] = data[i][0] + ";" + data[i][1] + ";" + data[i][2] + ";" + data[i][3] + " \n"; + for (int i = 0; i < data.length; i++) { + result[i] = data[i] + " \n" ; } + result[data.length] = '\n' + "---------------------------------------------------------------"+ '\n' + +"User1; Start Time:"+ user1Panel.startTime + " ; Finish Time:"+ finishTime +" ; Experiment Completion Time: " + (finishTime-user1Panel.startTime) + '\n' + +"User1; Set Finish time: " + user1Panel.setFinishTime + " ; Set Completion Time:" + (user1Panel.setFinishTime-user1Panel.startTime) + +'\n' + +"User2; Start Time:"+ user2Panel.startTime + " ; Finish Time:"+ finishTime +" ; Experiment Completion Time: "+ (finishTime-user2Panel.startTime) + '\n' + +"User2; Set Finish time: " + user2Panel.setFinishTime + " ; Set Completion Time:" + (user2Panel.setFinishTime-user2Panel.startTime)+ '\n' + +"---------------------------------------------------------------"+ '\n' + +"User1 ; "+ user1Panel.setcount + " + " + user1Panel.trialcount + " times unsuccessful D&D" + '\n' + +"User2 ; "+ user2Panel.setcount + " + " + user2Panel.trialcount + " times unsuccessful D&D" + '\n' + + "---------------------------------------------------------------"+ '\n'; + return result; } @Override - public void setLoggedData(Collection blobData) { + public void setLoggedData(Vector blobData , boolean finished , boolean check) { + if (nbExpFinished < nbUser) { - userLogVector.addAll(blobData); - nbExpFinished++; + + if(finished){ + userLogVector.addAll(blobData); + nbExpFinished++; + } + + else + { + userLogVector.add(blobData.lastElement()); + } } if (nbExpFinished == nbUser) { + + finishTime = System.currentTimeMillis(); + loggedData = new String[userLogVector.size()]; userLogVector.copyInto(loggedData); + + + System.out.println("-------------------------------------------------------------------"); + System.out.println("***TASK FINISHED***"); + for(int i=0 ; i blobData) { * @param blobData */ @Override - public void setLoggedData(Vector blobData) { + public void setLoggedData(Vector blobData , boolean finished) { } diff --git a/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/dragNdrop/DnD4users.java b/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/dragNdrop/DnD4users.java index 45c1151..3622526 100644 --- a/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/dragNdrop/DnD4users.java +++ b/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/dragNdrop/DnD4users.java @@ -51,10 +51,10 @@ public class DnD4users extends VerticalPanel implements ICEDataLogger, RequireIn String blob7 = GWT.getModuleBaseURL() + "circle_grey.png"; String blob8 = GWT.getModuleBaseURL() + "circle.png"; - DnD1userGeneric user1Panel = new DnD1userGeneric("user1", 20, blob1, this); - DnD1userGeneric user2Panel = new DnD1userGeneric("user2", 20, blob2, this); - DnD1userGeneric user3Panel = new DnD1userGeneric("user3", 20, blob3, this); - DnD1userGeneric user4Panel = new DnD1userGeneric("user4", 20, blob4, this); + DnD1userGeneric user1Panel = new DnD1userGeneric("user1", 10, blob1, this); + DnD1userGeneric user2Panel = new DnD1userGeneric("user2", 10, blob2, this); + DnD1userGeneric user3Panel = new DnD1userGeneric("user3", 10, blob3, this); + DnD1userGeneric user4Panel = new DnD1userGeneric("user4", 10, blob4, this); HorizontalPanel hPanel1 = new HorizontalPanel(); HorizontalPanel hPanel2 = new HorizontalPanel(); @@ -63,32 +63,38 @@ public class DnD4users extends VerticalPanel implements ICEDataLogger, RequireIn int nbUser = 4; Vector userLogVector = new Vector(); String[] loggedData; + + long finishTime; public DnD4users() { super(); - this.setSize("100%", "100%"); - hPanel1.setSize("100%", "100%"); - hPanel2.setSize("100%", "100%"); - + user1Panel.setSize("100%", "100%"); user2Panel.setSize("100%", "100%"); user3Panel.setSize("100%", "100%"); user4Panel.setSize("100%", "100%"); + + this.setSize("100%", "100%"); + hPanel1.setSize("100%", "100%"); + hPanel2.setSize("100%", "100%"); hPanel1.add(user1Panel); // forces to maintain the size of the cell hPanel1.setCellWidth(user1Panel, "50%"); hPanel1.setCellHeight(user1Panel, "50%"); - hPanel1.add(user2Panel); + hPanel1.add(user3Panel); - hPanel2.add(user3Panel); - hPanel2.setCellWidth(user3Panel, "50%"); - hPanel2.setCellHeight(user3Panel, "50%"); hPanel2.add(user4Panel); + hPanel2.setCellWidth(user4Panel, "50%"); + hPanel2.setCellHeight(user4Panel, "50%"); + hPanel2.add(user2Panel); this.add(hPanel1); this.add(hPanel2); this.setBorderWidth(1); + + hPanel1.setBorderWidth(1); + hPanel2.setBorderWidth(1); } @Override @@ -97,23 +103,33 @@ public void initialise() { user2Panel.initialise(); user3Panel.initialise(); user4Panel.initialise(); + + + //PRINTING LOGS + System.out.println("Experiment Identifier: " + ICEMain.identifier); + System.out.println("Name of Experiment Task: " + ExperimentIdentifier.DRAGNDROP); + System.out.println("User Number: " + nbUser); + System.out.println(); } /** * log the data and indicate if logged is OK or not */ private void log() { + EventingServiceAsync svc = GWT.create(EventingService.class); - svc.log(ICEMain.identifier, loggedData, ExperimentIdentifier.DRAGNDROP, 4, new AsyncCallback() { + svc.log(ICEMain.identifier, getLoggedResult(loggedData), ExperimentIdentifier.DRAGNDROP, 4, new AsyncCallback() { @Override public void onSuccess(Void result) { + DnD4users.this.clear(); Window.alert("Successfully logged! Experiment finished"); } @Override public void onFailure(Throwable caught) { GWT.log("Error:", caught); + DnD4users.this.clear(); Window.alert("Not logged"); } }); @@ -126,25 +142,103 @@ public void onFailure(Throwable caught) { * @return Array of string containing the user, x, y coord, time stamps of the click */ - private String[] getLoggedResult(String[][] data) { - String[] result = new String[data.length]; + private String[] getLoggedResult(String[] data) { + String[] result = new String[data.length + 1]; - for (int i = 1; i < result.length; i++) { - result[i] = data[i][0] + ";" + data[i][1] + ";" + data[i][2] + ";" + data[i][3] + " \n"; + for (int i = 0; i < data.length; i++) { + result[i] = data[i] + " \n"; } + result[data.length] = '\n' + "---------------------------------------------------------------"+ '\n' + +"User1; Start Time:"+ user1Panel.startTime + " ; Finish Time:"+ finishTime +" ; Experiment Completion Time: " + (finishTime-user1Panel.startTime) + '\n' + +"User1; Set Finish time: " + user1Panel.setFinishTime + " ; Set Completion Time:" + (user1Panel.setFinishTime-user1Panel.startTime) +'\n' + +'\n' + +"User2; Start Time:"+ user2Panel.startTime + " ; Finish Time:"+ finishTime +" ; Experiment Completion Time: "+ (finishTime-user2Panel.startTime) + '\n' + +"User2; Set Finish time: " + user2Panel.setFinishTime + " ; Set Completion Time:" + (user2Panel.setFinishTime-user2Panel.startTime)+ '\n' + +'\n' + +"User3; Start Time:"+ user3Panel.startTime + " ; Finish Time:"+ finishTime +" ; Experiment Completion Time: " + (finishTime-user3Panel.startTime) + '\n' + +"User3; Set Finish time: " + user3Panel.setFinishTime + " ; Set Completion Time:" + (user3Panel.setFinishTime-user3Panel.startTime) +'\n' + +'\n' + +"User4; Start Time:"+ user4Panel.startTime + " ; Finish Time:"+ finishTime +" ; Experiment Completion Time: " + (finishTime-user4Panel.startTime) + '\n' + +"User4; Set Finish time: " + user4Panel.setFinishTime + " ; Set Completion Time:" + (user4Panel.setFinishTime-user4Panel.startTime) + '\n' + +"---------------------------------------------------------------"+ '\n' + +"User1 ; "+ user1Panel.setcount + " + " + user1Panel.trialcount + " times unsuccessful D&D" + '\n' + +"User2 ; "+ user2Panel.setcount + " + " + user2Panel.trialcount + " times unsuccessful D&D" + '\n' + +"User3 ; "+ user3Panel.setcount + " + " + user3Panel.trialcount + " times unsuccessful D&D" + '\n' + +"User4 ; "+ user4Panel.setcount + " + " + user4Panel.trialcount + " times unsuccessful D&D" + '\n' + + "---------------------------------------------------------------"+ '\n'; + return result; } @Override - public void setLoggedData(Collection blobData) { + public void setLoggedData(Vector blobData , boolean finished , boolean check) { + + if (nbExpFinished < nbUser) { - userLogVector.addAll(blobData); - nbExpFinished++; + + if(finished){ + userLogVector.addAll(blobData); + nbExpFinished++; + } + else{ + userLogVector.add(blobData.lastElement()); + } } if (nbExpFinished == nbUser) { + + finishTime = System.currentTimeMillis(); + loggedData = new String[userLogVector.size()]; userLogVector.copyInto(loggedData); + + System.out.println("-------------------------------------------------------------------"); + System.out.println("***TASK FINISHED***"); + for(int i=0 ; i= 0 ; i--){ +// +// if(userLogVector.get(i).startsWith("user1")){ +// +// System.out.println( userLogVector.get(i).charAt((userLogVector.get(i).length() - 1)) ); +// } +// } + + + log(); } @@ -156,7 +250,7 @@ public void setLoggedData(Collection blobData) { * @param blobData */ @Override - public void setLoggedData(Vector blobData) { + public void setLoggedData(Vector blobData , boolean finished) { } diff --git a/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/dragNdrop/DraggableLabelledBlob.java b/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/dragNdrop/DraggableLabelledBlob.java index 6bb0bfe..335c7de 100644 --- a/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/dragNdrop/DraggableLabelledBlob.java +++ b/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/dragNdrop/DraggableLabelledBlob.java @@ -43,6 +43,11 @@ public class DraggableLabelledBlob extends HTML implements Draggable { double dropTime; double dragNdropTime; Boolean isStarted = false; + + double false_dropTime; + double false_dragNdropTime; + + // -- Constructors ------------------------------------------ @@ -101,6 +106,12 @@ public void setDropTime(double dropTime) { this.dropTime = dropTime; this.dragNdropTime = dropTime - dragStartTime; } + + public void setFalseDropTime(double false_dropTime) { //for unsuccessful DnDs + this.false_dropTime = false_dropTime; + this.false_dragNdropTime = false_dropTime - dragStartTime; + } + /** * Get the time needed to drag and drop the blob (in ms) @@ -110,6 +121,10 @@ public void setDropTime(double dropTime) { public double getDragNdropTime() { return dragNdropTime; } + + public double getFalseDragNdropTime() { + return false_dragNdropTime ; + } /** * Set the time to drag and drop the blob (in ms) @@ -119,6 +134,10 @@ public double getDragNdropTime() { public void setDragNdropTime(double dragNdropTime) { this.dragNdropTime = dragNdropTime; } + + public void setFalseDragNdropTime(double false_dragNdropTime) { + this.false_dragNdropTime = false_dragNdropTime; + } public void setBlobNumber(int blobNumber) { this.blobNumber = blobNumber; diff --git a/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/rpc/EventingService.java b/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/rpc/EventingService.java index 0c8186a..c942c06 100644 --- a/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/rpc/EventingService.java +++ b/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/rpc/EventingService.java @@ -23,14 +23,20 @@ * *************************************************************************************************/ + +//import MouseControllerService; import ch.unifr.pai.ice.shared.ExperimentIdentifier; +import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.rpc.RemoteService; import com.google.gwt.user.client.rpc.RemoteServiceRelativePath; -@RemoteServiceRelativePath("logger") +@RemoteServiceRelativePath("logger") + public interface EventingService extends RemoteService { public void log(String experimentId, String[] message, ExperimentIdentifier experimentName, int numberOfUsers); // public void log(Vector message, int experimentNumber); + + } diff --git a/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/textedit/TextEditor.java b/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/textedit/TextEditor.java index 3f22d43..d981e13 100644 --- a/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/textedit/TextEditor.java +++ b/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/textedit/TextEditor.java @@ -23,39 +23,56 @@ * *************************************************************************************************/ + import java.util.Vector; import ch.unifr.pai.ice.client.DraggableLabel; import ch.unifr.pai.ice.client.DraggableVerticalPanel; import ch.unifr.pai.ice.client.RequireInitialisation; + import ch.unifr.pai.twice.dragndrop.client.DragNDrop; import ch.unifr.pai.twice.dragndrop.client.configuration.DragConfiguration; import ch.unifr.pai.twice.dragndrop.client.intf.DragNDropHandler; import ch.unifr.pai.twice.dragndrop.client.intf.DropTargetHandler; + +import ch.unifr.pai.twice.multipointer.provider.client.widgets.MultiFocusTextBox; import ch.unifr.pai.twice.multipointer.provider.client.widgets.RemoteTextArea; + import com.google.gwt.dom.client.Style.Display; -import com.google.gwt.dom.client.Style.Float; import com.google.gwt.dom.client.Style.Unit; -import com.google.gwt.event.dom.client.ClickEvent; -import com.google.gwt.event.dom.client.ClickHandler; -import com.google.gwt.event.dom.client.KeyPressEvent; + +import com.google.gwt.event.dom.client.KeyCodes; import com.google.gwt.event.dom.client.KeyPressHandler; +import com.google.gwt.event.dom.client.KeyPressEvent; +import com.google.gwt.event.dom.client.KeyUpHandler; +import com.google.gwt.event.dom.client.KeyUpEvent; + import com.google.gwt.user.client.Event; import com.google.gwt.user.client.Random; +import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.AbsolutePanel; import com.google.gwt.user.client.ui.Button; +import com.google.gwt.user.client.ui.DockLayoutPanel; import com.google.gwt.user.client.ui.FlowPanel; +import com.google.gwt.user.client.ui.HasHorizontalAlignment; +import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.Panel; +import com.google.gwt.user.client.ui.RootPanel; import com.google.gwt.user.client.ui.TextArea; import com.google.gwt.user.client.ui.Widget; -public class TextEditor extends DraggableVerticalPanel implements RequireInitialisation { +public class TextEditor extends DraggableVerticalPanel implements + RequireInitialisation { + + HorizontalPanel hPanel = new HorizontalPanel(); + DockLayoutPanel panel = new DockLayoutPanel(Unit.PX); + TextArea ta = new RemoteTextArea(); //ta is replaced with MultiFocusTextBox + MultiFocusTextBox MultiFocus = new MultiFocusTextBox(); - TextArea ta = new RemoteTextArea(); - Button addButton = new Button("Add text"); - Button doneButton = new Button("Done"); + // Button addButton = new Button("Add text"); + // Button doneButton = new Button("Done"); TextEntry1Space parent; String bckGColor = "white"; @@ -70,6 +87,21 @@ public class TextEditor extends DraggableVerticalPanel implements RequireInitial String typedText = ""; boolean isStarted = false; + int count = 0; + int secondcount = 0; + boolean isSetFinished = false; + boolean isLast = false; + boolean isSetStarted; + long setStartTime; + + private Label text; + String[] traininglist = { "book", "blue", "nose", "key" }; + String[] wordlist = { "car", "baby", "grass", "train", "mouse", "park","boy", "green", "paper", "pencil" }; + String[] secondwordlist = { "bird", "flower", "girl", "bus", "yellow","dog", "red", "blue", "car", "boat" }; + + int iteration = 0; + + public TextEditor(TextEntry1Space parentWidget, int userNo, int nbTextEntry) { super(); parent = parentWidget; @@ -79,82 +111,143 @@ public TextEditor(TextEntry1Space parentWidget, int userNo, int nbTextEntry) { if (parentWidget instanceof AbsolutePanel) isAPanel = true; - ta.setCharacterWidth(80); - ta.setVisibleLines(50); - ta.setHeight(String.valueOf(height) + "px"); - ta.setWidth(String.valueOf(width) + "px"); - ta.getElement().getStyle().setFontSize(18, Unit.PX); - this.add(ta); - FlowPanel fp = new FlowPanel(); - fp.add(addButton); - fp.add(doneButton); - doneButton.getElement().getStyle().setFloat(Float.RIGHT); + if (nbTextEntry == 1) // if it's training + { + wordlist = traininglist; + } - this.add(fp); - // this.add(doneButton); - this.setBorderWidth(1); + text = new Label(wordlist[0]); + text.getElement().getStyle().setColor("#fff"); + text.getElement().getStyle().setFontSize(20, Unit.PT); + text.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER); + hPanel.setWidth("100%"); + hPanel.add(text); + this.add(hPanel); - // Listen for mouse events on the Add button. - addButton.addClickHandler(new ClickHandler() { - @Override - public void onClick(ClickEvent event) { - log(typedText, ta.getText()); - typedText = ""; - isStarted = false; - addText(); - ta.setText(""); - ta.setFocus(true); - } - }); + MultiFocus.setVisible(true); + MultiFocus.setWidth("100%"); + MultiFocus.setHeight("100px"); + MultiFocus.setWidth("250px"); - doneButton.addClickHandler(new ClickHandler() { + MultiFocus.getElement().getStyle().setBackgroundColor("#fff"); - @Override - public void onClick(ClickEvent event) { - parent.setLoggedData(logVector); - } - }); - - ta.addKeyPressHandler(new KeyPressHandler() { + // this.add(ta); + this.add(MultiFocus); + this.setBorderWidth(1); + MultiFocus.addDomHandler(new KeyPressHandler() { //Listen for KeyPress events on MultiFocusTextBox @Override public void onKeyPress(KeyPressEvent event) { + if (!isStarted) { startTime = System.currentTimeMillis(); + + if (!isSetStarted) { + setStartTime = startTime; // set experiment start time + isSetStarted = true; + } + isStarted = true; } typedText = typedText + event.getCharCode(); + } - }); + }, KeyPressEvent.getType()); - } + MultiFocus.addDomHandler(new KeyUpHandler() { - private void addText() { - if (isAPanel) { - // contains the draggable text - DraggableLabel label = new DraggableLabel(ta.getText()); - label.getElement().getStyle().setDisplay(Display.INLINE_BLOCK); - label.getElement().getStyle().setFontSize(18, Unit.PX); - DragNDrop.makeDraggable(label, DragConfiguration.withProxy(new DragNDropHandler() { + @Override + public void onKeyUp(KeyUpEvent event) { - @Override - public void onStartDrag(String deviceId, Widget draggedWidget) { - } + if (event.getNativeEvent().getKeyCode() == 13) { + + if (isSetFinished && !isLast) { // for the second set + + log(typedText, ta.getText()); + parent.setLoggedData(logVector, false, true); // done with experiment + + iteration++; + text.setText(secondwordlist[iteration]); + + typedText = ""; + isStarted = false; + } + + if (isLast) { + log(typedText, ta.getText()); + parent.setLoggedData(logVector, true, true); // done with experiment + + text.setText(secondwordlist[0]); + typedText = ""; + isStarted = false; + + iteration = 0; + isLast = false; + } + + if (!isSetFinished) { + + if (!isLast) { + iteration++; + text.setText(wordlist[iteration]); + + log(typedText, ta.getText()); // log for wordlist[iteration-1] + typedText = ""; + isStarted = false; + + if ((iteration == (wordlist.length - 1))) { //last element + isSetFinished = true; + isLast = true; + } + } + + } - @Override - public void onEndOfDrop(String deviceId, Widget draggedWidget, int dragProxyLeft, int dragProxyTop, Event event) { } - @Override - public boolean onDrop(String deviceId, Widget draggedWidget, int dragProxyLeft, int dragProxyTop, Event event, DropTargetHandler dropTarget, - boolean outOfBox) { - parent.setWidgetPosition(draggedWidget, dragProxyLeft - parent.getAbsoluteLeft(), dragProxyTop - parent.getAbsoluteTop()); - return true; + if (event.getNativeEvent().getKeyCode() == KeyCodes.KEY_BACKSPACE) { + + typedText = typedText + "~"; } + } + }, KeyUpEvent.getType()); + } - )); + private void addText() { + if (isAPanel) { + // contains the draggable text + DraggableLabel label = new DraggableLabel(ta.getText()); + label.getElement().getStyle().setDisplay(Display.INLINE_BLOCK); + label.getElement().getStyle().setFontSize(18, Unit.PX); + DragNDrop.makeDraggable(label, + DragConfiguration.withProxy(new DragNDropHandler() { + + @Override + public void onStartDrag(String deviceId, + Widget draggedWidget) { + } + + @Override + public void onEndOfDrop(String deviceId, + Widget draggedWidget, int dragProxyLeft, + int dragProxyTop, Event event) { + } + + @Override + public boolean onDrop(String deviceId, + Widget draggedWidget, int dragProxyLeft, + int dragProxyTop, Event event, + DropTargetHandler dropTarget, boolean outOfBox) { + parent.setWidgetPosition(draggedWidget, + dragProxyLeft - parent.getAbsoluteLeft(), + dragProxyTop - parent.getAbsoluteTop()); + return true; + } + } + + )); /* * add the new text in the abs panel @@ -190,23 +283,72 @@ public void setColor(String bckGColor) { } private void log(String typeText, String finalText) { - logVector.add("user" + userNo + ";" + startTime + ";" + System.currentTimeMillis() + ";" + typeText + ";" + finalText); + + long a = System.currentTimeMillis(); + + String actualWord; + + if (count < wordlist.length) { + actualWord = wordlist[count]; + } + + else { + actualWord = secondwordlist[secondcount]; + secondcount++; + } + + if (isLast) { // if it is last element + logVector + .add("User" + + userNo+ " ; Text typing started:"+ startTime+ " ; Text typing finished:"+ a + + " ; Text Typed: "+ typeText+ " ; Text Submitted: "+ finalText + + " ; Actual text: "+ actualWord+ " ; Lenght: "+ (typeText.length() - 1) + + "; Time period: "+ (a - startTime)+ '\n' + + "---------------------------------------------------------------" + + '\n'+ "User"+ userNo+ " ; Start time:" + + setStartTime+ " ; Set finish time:" + + a+ " ; Set complition time:"+ (a - setStartTime)+ '\n' + + "---------------------------------------------------------------"); + } + + else { + + logVector.add("User" + userNo + " ; Text typing started:" + + startTime + " ; Text typing finished:" + a + + " ; Text Typed: " + typeText + " ; Text Submitted: " + + finalText + " ; Actual text: " + actualWord + + " ; Lenght: " + (typeText.length() - 1) + + "; Time period: " + (a - startTime) + '\n'); + } + + // PRINTING LOGS in system + // System.out.println("(LOG INFO) " + "user"+ userNo + "; " + // + " Text typing started: " + startTime + "; " + // + " Text typing finished: " + a + "; " + // + " Text Typed: " + typeText + "; " + // + " Text Submited: " + finalText + "; " + // + " Actual text: " + actualWord + "; " + // + " Lenght: " + (typeText.length() -1) + "; " + // + " Time period: " + (a-startTime) + // ) ; + count++; + } private int[] setRandomPos(int tEdWidth, int tEdHeight, DraggableLabel l) { int[] pos = { 0, 0 }; - System.out.println("Parent:" + parent.getElement().getClientWidth() + ", label: " + l.getElement().getClientWidth()); - - pos[0] = randomNum(20, parent.getElement().getClientWidth() - l.getElement().getClientWidth()); + // System.out.println("Parent:" + parent.getElement().getClientWidth() + ", label: " + l.getElement().getClientWidth()); + pos[0] = randomNum(20, parent.getElement().getClientWidth() + - l.getElement().getClientWidth()); pos[1] = randomNum(20, parent.getElement().getClientHeight() - 50); while (pos[0] <= tEdWidth || pos[1] <= tEdHeight) { - pos[0] = randomNum(20, parent.getElement().getClientWidth() - l.getElement().getClientWidth()); + pos[0] = randomNum(20, parent.getElement().getClientWidth() + - l.getElement().getClientWidth()); pos[1] = randomNum(20, parent.getElement().getClientHeight() - 50); } - // parent. return pos; } diff --git a/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/textedit/TextEntry1Space.java b/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/textedit/TextEntry1Space.java index 684f714..c7ee3cc 100644 --- a/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/textedit/TextEntry1Space.java +++ b/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/textedit/TextEntry1Space.java @@ -26,6 +26,7 @@ import java.util.Collection; 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; @@ -35,14 +36,17 @@ import ch.unifr.pai.ice.shared.ExperimentIdentifier; import com.google.gwt.core.client.GWT; +import com.google.gwt.dom.client.Style.Unit; 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.HorizontalPanel; import com.google.gwt.user.client.ui.VerticalPanel; public class TextEntry1Space extends AbsolutePanel implements ICEDataLogger, RequireInitialisation { - VerticalPanel vPanel = new VerticalPanel(); + VerticalPanel vPanel = new VerticalPanel(); + TextEditor textEd; Vector resultVector; int nbExpFinished = 0; @@ -54,22 +58,26 @@ public class TextEntry1Space extends AbsolutePanel implements ICEDataLogger, Req int experimentNo; int startingUserNo = 1; + /**************** * Constructors ****************/ public TextEntry1Space(int nbUser, int nbSentences, int experimentNo) { super(); + this.nbUser = nbUser; this.experimentNo = experimentNo; - vPanel.setHeight("100%"); + vPanel.setHeight("100%"); + this.add(vPanel); for (int i = 0; i < nbUser; i++) { textEd = new TextEditor(this, i + 1, nbSentences); vPanel.add(textEd); } + } /** @@ -111,7 +119,7 @@ public TextEntry1Space(int nbUser, int nbSentences, int experimentNo, boolean ha this.nbUser = nbUser; this.hasToLogToParent = hasToLogToParent; this.parent = parent; - this.experimentNo = experimentNo; + this.experimentNo = experimentNo; vPanel.setHeight("100%"); @@ -142,6 +150,7 @@ public TextEntry1Space(int nbOfUser, int startingUserNo, int nbSentences, int ex this.parent = parent; this.experimentNo = experimentNo; this.startingUserNo = startingUserNo; + vPanel.setHeight("100%"); this.add(vPanel); @@ -170,6 +179,7 @@ public TextEntry1Space(int nbOfUser, int startingUserNo, int nbSentences, int ex this.parent = parent; this.experimentNo = experimentNo; this.startingUserNo = startingUserNo; + vPanel.setHeight("100%"); this.add(vPanel); @@ -183,14 +193,14 @@ public TextEntry1Space(int nbOfUser, int startingUserNo, int nbSentences, int ex // ------------------------------------------------------------------------ private void log() { - if (experimentNo != -1) { +// if (experimentNo != -1) { EventingServiceAsync svc = GWT.create(EventingService.class); svc.log(ICEMain.identifier, loggedData, ExperimentIdentifier.TEXTEDIT, 1, new AsyncCallback() { @Override public void onSuccess(Void result) { TextEntry1Space.this.clear(); - Window.alert("Task finished"); + Window.alert("Successfully logged! Experiment finished"); } @Override @@ -199,12 +209,6 @@ public void onFailure(Throwable caught) { Window.alert("Task finished but was not able to log!"); } }); - } - else { - - TextEntry1Space.this.clear(); - Window.alert("Task finished!"); - } } @@ -223,21 +227,37 @@ private String[] getLoggedResult(Vector resultVector) { // ------------------------------------------------------------------------------ @Override - public void setLoggedData(Collection textData) { + public void setLoggedData(Vector textData , boolean finished , boolean check) { if (nbExpFinished < nbUser) { - userLogVector.addAll(textData); - nbExpFinished++; + + //if(finished) { + userLogVector.addAll(textData); + + nbExpFinished++; + //} + //else + //{ + // userLogVector.add(textData.lastElement()); + // System.out.println("test amacli 1 a: " + textData.lastElement() ); + //} + } if (nbExpFinished == nbUser) { - if (hasToLogToParent && (parent != null)) { - parent.setLoggedData(userLogVector); + + if(!finished){ + userLogVector.add(textData.lastElement()); + + } + parent.setLoggedData(userLogVector, finished , check); + } + else { - loggedData = new String[userLogVector.size()]; userLogVector.copyInto(loggedData); + log(); } } @@ -249,7 +269,7 @@ public void setLoggedData(Collection textData) { * @param blobData */ @Override - public void setLoggedData(Vector blobData) { + public void setLoggedData(Vector blobData, boolean finished) { } @@ -263,5 +283,8 @@ public void initialise() { // TODO Auto-generated method stub } + + } + diff --git a/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/textedit/TextEntrySepSpace.java b/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/textedit/TextEntrySepSpace.java index 180eccd..86dda37 100644 --- a/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/textedit/TextEntrySepSpace.java +++ b/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/textedit/TextEntrySepSpace.java @@ -40,7 +40,9 @@ import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.VerticalPanel; -public class TextEntrySepSpace extends HorizontalPanel implements ICEDataLogger, RequireInitialisation { +import com.google.gwt.user.client.ui.AbsolutePanel; + +public class TextEntrySepSpace extends HorizontalPanel implements ICEDataLogger, RequireInitialisation { Vector resultVector; int nbExpFinished = 0; @@ -52,36 +54,120 @@ public class TextEntrySepSpace extends HorizontalPanel implements ICEDataLogger, int nbTEntry; int experimentNo; String[] colorSet = { "black", "red", "blue", "green" }; + + Vector user1LogVec = new Vector(); + Vector user2LogVec = new Vector(); + int size = 10; + + String key; + + AbsolutePanel user1Panel = new AbsolutePanel(); + AbsolutePanel user2Panel = new AbsolutePanel(); + AbsolutePanel user3Panel = new AbsolutePanel(); + //AbsolutePanel user4Panel = new AbsolutePanel(); + + long finishTime ; /**************** * Constructor ****************/ public TextEntrySepSpace(int nbUser, int nbSentences, int experimentNo) { - + super(); this.nbUser = nbUser; this.experimentNo = experimentNo; - this.setSize("100%", "100%"); - this.setBorderWidth(1); - - if (nbUser <= 3) { + this.setSize("100%", "100%"); + this.setBorderWidth(1); + + /*if (nbUser <= 3) { for (int i = 0; i < nbUser; i++) { this.add(new TextEntry1Space(1, nbSentences, 0, true, this, colorSet[i])); this.getWidget(i).setSize("100%", "100%"); - } - } - else { + } + } */ + + if (nbUser == 1) { + //user1Panel = new AbsolutePanel(); + //user2Panel = new AbsolutePanel(); + //user3Panel = new AbsolutePanel(); + user1Panel.setSize("100%", "100%"); + + user3Panel.setSize("100%", "100%"); + + //RemoteTextArea ta =new RemoteTextArea(); + + vPanel1 = new VerticalPanel(); + vPanel1.setSize("100%", "100%"); + vPanel2 = new VerticalPanel(); + vPanel2.setSize("100%", "100%"); + + + this.add(vPanel1); + + vPanel1.add(new TextEntry1Space(1,1, nbSentences, 0, true, this, colorSet[0])); //for user1 + vPanel1.getWidget(0).setSize("100%", "100%"); + vPanel1.add(user1Panel); + vPanel1.setCellHeight(user1Panel, "50%"); + vPanel1.setCellWidth(user1Panel, "50%"); + vPanel1.setBorderWidth(1); + + this.add(vPanel2); + user2Panel.setSize("100%", "100%"); + vPanel2.add(user2Panel); + user2Panel.setWidth("314px"); + user2Panel.setHeight("85px"); + + vPanel2.setCellHeight(user2Panel, "50%"); + vPanel2.setCellWidth(user2Panel, "50%"); + //vPanel2.add(new TextEntry1Space(0,-18,1)); + //vPanel2.getWidget(0).setSize("100%", "100%"); + vPanel2.add(user3Panel); + //vPanel2.getWidget(1).setSize("100%", "100%"); + vPanel2.setBorderWidth(1); + } + + if (nbUser == 2) { + + //user1Panel = new AbsolutePanel(); + //user2Panel = new AbsolutePanel(); + user1Panel.setSize("100%", "100%"); + user2Panel.setSize("100%", "100%"); + vPanel1 = new VerticalPanel(); vPanel1.setSize("100%", "100%"); vPanel1.setBorderWidth(1); this.add(vPanel1); + + vPanel1.add(new TextEntry1Space(1,1, nbSentences, 0, true, this, colorSet[0])); //for user1 + vPanel1.getWidget(0).setSize("100%", "100%"); + vPanel1.add(user1Panel); + vPanel1.setCellWidth(user1Panel, "50%"); + vPanel1.setCellHeight(user1Panel, "50%"); + + vPanel2 = new VerticalPanel(); + vPanel2.setSize("100%", "100%"); + vPanel2.setBorderWidth(1); + this.add(vPanel2); + + vPanel2.add(user2Panel); + vPanel2.setCellWidth(user2Panel, "50%"); + vPanel2.setCellHeight(user2Panel, "50%"); + vPanel2.add(new TextEntry1Space(1,2, nbSentences, 0, true, this, colorSet[1])); //for user2 + vPanel2.getWidget(1).setSize("100%", "100%"); + } + + if(nbUser == 4) { + + /* else{ vPanel1 = new VerticalPanel(); + vPanel1.setSize("100%", "100%"); + vPanel1.setBorderWidth(1); + this.add(vPanel1); for (int i = 0; i < Math.round(nbUser / 2); i++) { vPanel1.add(new TextEntry1Space(1, i + 1, nbSentences, 0, true, this, colorSet[i])); - vPanel1.getWidget(i).setSize("100%", "100%"); - } + vPanel1.getWidget(i).setSize("100%", "100%");} vPanel2 = new VerticalPanel(); vPanel2.setSize("100%", "100%"); @@ -90,30 +176,55 @@ public TextEntrySepSpace(int nbUser, int nbSentences, int experimentNo) { nbTEntry = nbUser - Math.round(nbUser / 2); int widgetNo = 0; + for (int i = nbTEntry; i < nbUser; i++) { - vPanel2.add(new TextEntry1Space(1, i + 1, nbSentences, 0, true, this, colorSet[i])); - vPanel2.getWidget(widgetNo++).setSize("100%", "100%"); - } + vPanel2.add(new TextEntry1Space(1, i + 1 , nbSentences, 0, true, this, colorSet[i])); + vPanel2.getWidget(widgetNo++).setSize("100%", "100%");} */ + + vPanel1 = new VerticalPanel(); + vPanel1.setSize("100%", "100%"); + vPanel1.setBorderWidth(1); + this.add(vPanel1); + + vPanel1.add(new TextEntry1Space(1,1, nbSentences, 0, true, this, colorSet[0])); //for user1 + vPanel1.getWidget(0).setSize("100%", "100%"); + vPanel1.add(new TextEntry1Space(1,4, nbSentences, 0, true, this, colorSet[3])); //for user3 + vPanel1.getWidget(1).setSize("100%", "100%"); + + vPanel2 = new VerticalPanel(); + vPanel2.setSize("100%", "100%"); + vPanel2.setBorderWidth(1); + this.add(vPanel2); + + vPanel2.add(new TextEntry1Space(1,3, nbSentences, 0, true, this, colorSet[2])); //for user4 + vPanel2.getWidget(0).setSize("100%", "100%"); + vPanel2.add(new TextEntry1Space(1,2, nbSentences, 0, true, this, colorSet[1])); //for user2 + vPanel2.getWidget(1).setSize("100%", "100%"); + + } } - } // ------------------------------------------------------------------------ private void log() { +// if (experimentNo != -1) { //COMMENTED FOR NOW EventingServiceAsync svc = GWT.create(EventingService.class); svc.log(ICEMain.identifier, loggedData, ExperimentIdentifier.TEXTEDITSPACES, nbUser, new AsyncCallback() { @Override public void onSuccess(Void result) { - Window.alert("Successfully logged"); + TextEntrySepSpace.this.clear(); + Window.alert("Successfully logged! Experiment finished"); } @Override public void onFailure(Throwable caught) { + TextEntrySepSpace.this.clear(); GWT.log("Error:", caught); Window.alert("Not logged"); } }); + } private String[] getLoggedResult(Vector resultVector) { @@ -127,17 +238,40 @@ private String[] getLoggedResult(Vector resultVector) { } @Override - public void setLoggedData(Collection textData) { + public void setLoggedData(Vector textData , boolean finished , boolean check) { + if (nbExpFinished < nbUser) { + + if(finished) { + userLogVector.addAll(textData); nbExpFinished++; - System.out.println("user: " + nbExpFinished + "; no records:" + userLogVector.size()); + } + + else + { + userLogVector.add(textData.lastElement()); + } + } if (nbExpFinished == nbUser) { + + finishTime = System.currentTimeMillis(); + userLogVector.add("Experiment Finish Time: " + finishTime + + '\n' + "---------------------------------------------------------------"); loggedData = new String[userLogVector.size()]; + + userLogVector.copyInto(loggedData); - System.out.println("user: " + nbExpFinished + " - Finished!"); + + System.out.println("-------------------------------------------------------------------"); + System.out.println("***TASK FINISHED***"); + + for(int i = 0 ; i< userLogVector.size() ; i++ ){ + System.out.println(i+ ". "+loggedData[i]); + } + System.out.println("-------------------------------------------------------------------"); log(); } } @@ -148,7 +282,7 @@ public void setLoggedData(Collection textData) { * @param blobData */ @Override - public void setLoggedData(Vector blobData) { + public void setLoggedData(Vector blobData , boolean finished) { } @@ -164,3 +298,4 @@ public void initialise() { } } + diff --git a/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/tracking/CursorXY.java b/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/tracking/CursorXY.java index e060081..b95f48e 100644 --- a/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/tracking/CursorXY.java +++ b/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/tracking/CursorXY.java @@ -26,16 +26,19 @@ public class CursorXY { long timeStamp; String user; int color; + + int blobNumber ; public CursorXY() { } - public CursorXY(String user, int x, int y, long timeStamp) { + public CursorXY(String user, int x, int y, long timeStamp, int blobNumber) { this.user = user; this.x = x; this.y = y; this.timeStamp = timeStamp; + this.blobNumber = blobNumber; } public int getColor() { @@ -77,5 +80,15 @@ public long getTimeStamp() { public void setTimeStamp(long timeStamp) { this.timeStamp = timeStamp; } + + public int getblobNumber() { + return blobNumber;} + + public void setblobNumber(int num) { + this.blobNumber = num; + } + + + } diff --git a/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/tracking/LineTracking1user.java b/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/tracking/LineTracking1user.java index 59207b2..275dafc 100644 --- a/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/tracking/LineTracking1user.java +++ b/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/tracking/LineTracking1user.java @@ -77,7 +77,7 @@ public class LineTracking1user extends AbsolutePanel implements RequireInitialis @Override public void run() { if (tracking && (x != prevX || y != prevY)) { - cursorPosVector.add(new CursorXY("user1", x, y, System.currentTimeMillis())); + cursorPosVector.add(new CursorXY("user1", x, y, System.currentTimeMillis() , 0)); prevX = x; prevY = y; } @@ -181,6 +181,11 @@ public void onMouseDown(MouseDownEvent event) { @Override public void initialise() { + + 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(); this.setWidgetPosition(startBt, 0, lineImage.getOffsetHeight() + lineOffset); this.setWidgetPosition(stopBt, lineImage.getOffsetWidth(), lineImage.getOffsetHeight() + lineOffset); @@ -237,6 +242,15 @@ private String[] getLoggedResult(Vector data) { 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 + 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() ); + + } return result; } diff --git a/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/tracking/LineTracking2users.java b/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/tracking/LineTracking2users.java index 2a37c84..11bee9a 100644 --- a/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/tracking/LineTracking2users.java +++ b/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/tracking/LineTracking2users.java @@ -81,7 +81,7 @@ public class LineTracking2users extends HorizontalPanel implements RequireInitia @Override public void run() { if (startBt1.isDown() && !stopBt1.isDown() && (x1 != prevX1 || y1 != prevY1)) { - cursorPosVector1.add(new CursorXY("user1", x1, y1, System.currentTimeMillis())); + cursorPosVector1.add(new CursorXY("user1", x1, y1, System.currentTimeMillis() , 0)); prevX1 = x1; prevY1 = y1; } @@ -101,7 +101,7 @@ public void run() { @Override public void run() { if (startBt2.isDown() && !stopBt2.isDown() && (x2 != prevX2 || y2 != prevY2)) { - cursorPosVector2.add(new CursorXY("user2", x2, y2, System.currentTimeMillis())); + cursorPosVector2.add(new CursorXY("user2", x2, y2, System.currentTimeMillis() , 0)); prevX2 = x2; prevY2 = y2; } diff --git a/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/tracking/LineTracking4users.java b/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/tracking/LineTracking4users.java index 81bdb7d..810634d 100644 --- a/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/tracking/LineTracking4users.java +++ b/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/tracking/LineTracking4users.java @@ -92,7 +92,7 @@ public class LineTracking4users extends VerticalPanel implements RequireInitiali @Override public void run() { if (startBt1.isDown() && !stopBt1.isDown() && (x1 != prevX1 || y1 != prevY1)) { - cursorPosVector1.add(new CursorXY("user1", x1, y1, System.currentTimeMillis())); + cursorPosVector1.add(new CursorXY("user1", x1, y1, System.currentTimeMillis() , 0)); prevX1 = x1; prevY1 = y1; } @@ -112,7 +112,7 @@ public void run() { @Override public void run() { if (startBt2.isDown() && !stopBt2.isDown() && (x2 != prevX2 || y2 != prevY2)) { - cursorPosVector2.add(new CursorXY("user2", x2, y2, System.currentTimeMillis())); + cursorPosVector2.add(new CursorXY("user2", x2, y2, System.currentTimeMillis() , 0)); prevX2 = x2; prevY2 = y2; } @@ -133,7 +133,7 @@ public void run() { @Override public void run() { if (startBt3.isDown() && !stopBt3.isDown() && (x3 != prevX3 || y3 != prevY3)) { - cursorPosVector3.add(new CursorXY("user3", x3, y3, System.currentTimeMillis())); + cursorPosVector3.add(new CursorXY("user3", x3, y3, System.currentTimeMillis() , 0)); prevX3 = x3; prevY3 = y3; } @@ -153,7 +153,7 @@ public void run() { @Override public void run() { if (startBt4.isDown() && !stopBt4.isDown() && (x4 != prevX4 || y4 != prevY4)) { - cursorPosVector4.add(new CursorXY("user4", x4, y4, System.currentTimeMillis())); + cursorPosVector4.add(new CursorXY("user4", x4, y4, System.currentTimeMillis() , 0)); prevX4 = x4; prevY4 = y4; } diff --git a/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/utils/ICEDataLogger.java b/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/utils/ICEDataLogger.java index 5bb1630..eabfd05 100644 --- a/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/utils/ICEDataLogger.java +++ b/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/utils/ICEDataLogger.java @@ -30,10 +30,10 @@ public interface ICEDataLogger { - public void setLoggedData(Vector blobData); + public void setLoggedData(Vector blobData , boolean finished); - public void setLoggedData(String[] blobData); + public void setLoggedData(String[] blobData); - public void setLoggedData(Collection blobData); + public void setLoggedData(Vector blobData , boolean finished , boolean check); } diff --git a/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/utils/PositioningUtils.java b/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/utils/PositioningUtils.java index 65ec977..a8861e1 100644 --- a/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/utils/PositioningUtils.java +++ b/ICEExperiments/src/main/java/ch/unifr/pai/ice/client/utils/PositioningUtils.java @@ -15,11 +15,12 @@ * limitations under the License. */ public class PositioningUtils { + public static int[][] getPositionsInCircle(int nbElements, int xCenter, int yCenter, int radius) { - int nbPos = (nbElements == 0) ? 2 : nbElements; + int nbPos = (nbElements == 0) ? 2 : nbElements; // check if nbPos is even - nbPos = (nbPos % 2 == 0) ? nbPos : nbPos + 1; + nbPos = (nbPos % 2 == 0) ? nbPos : nbPos + 1; //nbPos is always even int[][] blobPos = new int[nbPos][2]; int dAngle = 360 / nbPos; @@ -35,20 +36,20 @@ public static int[][] getPositionsInCircle(int nbElements, int xCenter, int yCen blobPos[1][1] = yCenter + radius; for (int i = 2; i < nbPos; i = i + 2) { - angle = angle + dAngle; - + angle = angle + dAngle; if (angle < 90) { x = radius * Math.sin(Math.toRadians(angle)); y = radius * Math.cos(Math.toRadians(angle)); - blobPos[i][0] = (int) (xCenter + x); - blobPos[i][1] = (int) (yCenter - y); + blobPos[i][0] = (int) (xCenter + x); + blobPos[i][1] = (int) (yCenter - y); blobPos[i + 1][0] = (int) (xCenter - x); blobPos[i + 1][1] = (int) (yCenter + y); } else if (angle == 90) { + blobPos[i][0] = xCenter + radius; blobPos[i][1] = (yCenter); blobPos[i + 1][0] = xCenter - radius; @@ -56,7 +57,7 @@ else if (angle == 90) { } else if (angle > 90) { - + x = radius * Math.cos(Math.toRadians(angle - 90)); y = radius * Math.sin(Math.toRadians(angle - 90)); @@ -69,4 +70,6 @@ else if (angle > 90) { return blobPos; } + + } diff --git a/ICEExperiments/src/main/java/ch/unifr/pai/ice/server/EventingServiceImpl.java b/ICEExperiments/src/main/java/ch/unifr/pai/ice/server/EventingServiceImpl.java index 0924b4b..9e1d43a 100644 --- a/ICEExperiments/src/main/java/ch/unifr/pai/ice/server/EventingServiceImpl.java +++ b/ICEExperiments/src/main/java/ch/unifr/pai/ice/server/EventingServiceImpl.java @@ -33,15 +33,17 @@ import ch.unifr.pai.ice.client.tracking.CursorXY; import ch.unifr.pai.ice.client.utils.ResultAnalyzer; import ch.unifr.pai.ice.shared.ExperimentIdentifier; +import ch.unifr.pai.twice.multipointer.commons.client.rpc.MouseControllerService; import com.google.gwt.user.server.rpc.RemoteServiceServlet; @WebServlet("/icetexteditgwt/logger") + public class EventingServiceImpl extends RemoteServiceServlet implements EventingService { private static final long serialVersionUID = 1L; Logger experimentLog = Logger.getLogger("experiment"); - + // Logger log1 = Logger.getLogger("experiment1"); // Text Entry // Logger log2 = Logger.getLogger("experiment2"); // Text Entry // Logger log3 = Logger.getLogger("experiment3"); // Text Entry @@ -70,7 +72,8 @@ public class EventingServiceImpl extends RemoteServiceServlet implements Eventin public void log(String experimentId, String[] message, ExperimentIdentifier experimentName, int numberOfUsers) { // initText(text); for (String m : message) { - experimentLog.info(experimentId + "; " + experimentName.name() + "; " + numberOfUsers + "; " + m); + experimentLog.info(experimentId + "; " + experimentName.name() + "; " + numberOfUsers + "; " + m); + } // // process the text input received from the user @@ -189,30 +192,30 @@ public void log(String experimentId, String[] message, ExperimentIdentifier expe // break; // // case 4: { - // log4.info("Click blobs 1 users"); - // log4.info("Session of " + new Date()); - // log4.info("user; Xcoord; Ycoord; TimeStamp (ms)"); - // log4.info("-------------------------------------------------"); - // - // for (String s : message) { - // log4.info(s); - // } - // log4.info("-------------------------------------------------"); +// log4.info("Click blobs 1 users"); +// log4.info("Session of " + new Date()); +// log4.info("user; Xcoord; Ycoord; TimeStamp (ms)"); +// log4.info("-------------------------------------------------"); +// +// for (String s : message) { +// log4.info(s); +// } +// log4.info("-------------------------------------------------"); // // break; // } // // case 5: - // log5.info("Click blobs 2 users"); - // log5.info("Session of " + new Date()); - // log5.info("user; Xcoord; Ycoord; TimeStamp (ms)"); - // log5.info("-------------------------------------------------"); - // - // for (String s : message) { - // log5.info(s); - // } - // log5.info("-------------------------------------------------"); - // +// log5.info("Click blobs 2 users"); +// log5.info("Session of " + new Date()); +// log5.info("user; Xcoord; Ycoord; TimeStamp (ms)"); +// log5.info("-------------------------------------------------"); +// +// for (String s : message) { +// log5.info(s); +// } +// log5.info("-------------------------------------------------"); +// // break; // // case 6: diff --git a/ICEExperiments/src/main/java/ch/unifr/pai/ice/shared/ExperimentIdentifier.java b/ICEExperiments/src/main/java/ch/unifr/pai/ice/shared/ExperimentIdentifier.java index baaf6e9..98682a1 100644 --- a/ICEExperiments/src/main/java/ch/unifr/pai/ice/shared/ExperimentIdentifier.java +++ b/ICEExperiments/src/main/java/ch/unifr/pai/ice/shared/ExperimentIdentifier.java @@ -1,6 +1,8 @@ package ch.unifr.pai.ice.shared; -import java.io.Serializable; +//import java.io.Serializable; +import com.google.gwt.user.client.rpc.IsSerializable; + /* * Copyright 2013 Pascal Bruegger @@ -16,6 +18,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -public enum ExperimentIdentifier implements Serializable { +public enum ExperimentIdentifier implements IsSerializable { CLICKBLOB, DRAGNDROP, DRAGNDROPSPACES, TEXTEDIT, TEXTEDITSPACES, TRACKING; } diff --git a/MPProxy/src/main/java/ch/unifr/pai/twice/widgets/mpProxyScreenShot/ScreenShot.gwt.xml b/MPProxy/src/main/java/ch/unifr/pai/twice/widgets/mpProxyScreenShot/ScreenShot.gwt.xml index ce49764..c42573d 100644 --- a/MPProxy/src/main/java/ch/unifr/pai/twice/widgets/mpProxyScreenShot/ScreenShot.gwt.xml +++ b/MPProxy/src/main/java/ch/unifr/pai/twice/widgets/mpProxyScreenShot/ScreenShot.gwt.xml @@ -16,6 +16,9 @@ --> + + + \ No newline at end of file diff --git a/MPProxy/src/main/java/ch/unifr/pai/twice/widgets/mpProxyScreenShot/client/Viewer.java b/MPProxy/src/main/java/ch/unifr/pai/twice/widgets/mpProxyScreenShot/client/Viewer.java index 788f31f..95e6f50 100644 --- a/MPProxy/src/main/java/ch/unifr/pai/twice/widgets/mpProxyScreenShot/client/Viewer.java +++ b/MPProxy/src/main/java/ch/unifr/pai/twice/widgets/mpProxyScreenShot/client/Viewer.java @@ -1,4 +1,5 @@ package ch.unifr.pai.twice.widgets.mpProxyScreenShot.client; + /* * Copyright 2013 Oliver Schmid * Licensed under the Apache License, Version 2.0 (the "License"); @@ -13,43 +14,208 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + +import ch.unifr.pai.twice.multipointer.controller.client.TouchPadWidget; +import ch.unifr.pai.twice.multipointer.provider.client.MultiCursorController; +import ch.unifr.pai.twice.multipointer.provider.client.NoMultiCursorController; +import ch.unifr.pai.twice.multipointer.provider.client.widgets.MultiFocusTextBox; +import ch.unifr.pai.twice.utils.device.client.DeviceType; +import com.google.gwt.user.client.Window; import com.google.gwt.core.client.EntryPoint; +import com.google.gwt.core.client.GWT; +import com.google.gwt.dom.client.Element; +import com.google.gwt.dom.client.Style.Display; +import com.google.gwt.dom.client.Style.Unit; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.http.client.Request; import com.google.gwt.http.client.RequestBuilder; import com.google.gwt.http.client.RequestCallback; import com.google.gwt.http.client.RequestException; import com.google.gwt.http.client.Response; +import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.Timer; -import com.google.gwt.user.client.Window; +import com.google.gwt.user.client.ui.RootLayoutPanel; +import com.google.gwt.user.client.ui.Button; +import com.google.gwt.user.client.ui.HorizontalPanel; +import com.google.gwt.user.client.ui.DockLayoutPanel; + import com.google.gwt.user.client.ui.RootPanel; +import com.google.gwt.user.client.ui.TextArea; +import com.google.gwt.user.client.ui.VerticalPanel; + public class Viewer implements EntryPoint { + Element preparationStage; + + // SplitLayoutPanel browserSplit = new SplitLayoutPanel(); + // String previousHTML = ""; // + + TextArea ta = new TextArea(); + Button addButton = new Button("Add"); // Add + Button scrollDown = new Button("▼"); // Down + Button scrollUp = new Button("▲"); // Up + int count = 0; + + static int height; + static int width; + + static int top; + static int left; + + MultiFocusTextBox textBox = new MultiFocusTextBox(); + + VerticalPanel vPanel = new VerticalPanel(); + DockLayoutPanel panel = new DockLayoutPanel(Unit.PX); + HorizontalPanel hPanel = new HorizontalPanel(); + DockLayoutPanel scrollBar = new DockLayoutPanel(Unit.PX); + + String oldValue = " "; + String newValue = " "; + @Override public void onModuleLoad() { - Timer t = new Timer(){ - - @Override - public void run() { - try { - RequestBuilder rb = new RequestBuilder(RequestBuilder.GET, Window.Location.getProtocol()+"//"+Window.Location.getHost()+"/miceScreenShot/manager"); - rb.sendRequest(null, new RequestCallback() { - - @Override - public void onResponseReceived(Request request, Response response) { - RootPanel.getBodyElement().setInnerHTML(response.getText()); - } - - @Override - public void onError(Request request, Throwable exception) { - } - } ); - } catch (RequestException e) { - e.printStackTrace(); + + if (DeviceType.getDeviceType() == DeviceType.MULTICURSOR) { + + MultiCursorController multiCursor = GWT + .create(NoMultiCursorController.class); + multiCursor.start(); + + height = Window.getClientHeight(); + width = Window.getClientWidth(); + left = RootPanel.get().getAbsoluteLeft(); + top = RootPanel.get().getAbsoluteTop(); + + scrollBar.getElement().getStyle().setBackgroundColor("lightgrey"); + scrollBar.addNorth(scrollUp, 30); + scrollBar.addSouth(scrollDown, 30); + + textBox.setVisible(true); + textBox.setWidth("100%"); + hPanel.add(textBox); + hPanel.add(addButton); + hPanel.setCellWidth(addButton, "52px"); + hPanel.setWidth("100%"); + + ta.setVisibleLines(150); + ta.setHeight("100%"); + ta.setWidth("100%"); + ta.getElement().getStyle().setFontSize(12, Unit.PX); + + panel.addSouth(hPanel, 30); + panel.addEast(scrollBar, 26); + panel.add(ta); + + panel.setSize(width / 2 + "px", height / 2 + "px"); + + preparationStage = DOM.createDiv(); + preparationStage.getStyle().setDisplay(Display.NONE); + + RootPanel.get("chatbox").add(panel, width / 2, height / 2); + + addButton.addClickHandler(new ClickHandler() { + + @Override + public void onClick(ClickEvent event) { + count++; + + String color = textBox.getTextColor(); + String username = ""; + + if (color.equalsIgnoreCase("#1a1a1a")) { + username = "User1"; + } + if (color.equalsIgnoreCase("#ff0000")) { + username = "User2"; + } + if (color.equalsIgnoreCase("#336aa6")) { + username = "User3"; + } + + double time = System.currentTimeMillis(); + + newValue = username + ": " + textBox.getValue() + + " @" + time; + ta.setValue(oldValue + '\n' + newValue); + oldValue = oldValue + '\n' + newValue; + textBox.setValue(""); + + if (count >= 13) { // number of lines in ta + ta.getElement().setScrollTop(ta.getElement().getScrollTop() + 20); // auto scroll down + + } + + } + }); + + scrollDown.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + + if (ta.getElement() != null) { + ta.getElement().setScrollTop( + Math.min(ta.getElement().getScrollHeight(), ta + .getElement().getScrollTop() + 20)); + } + } + }); + + scrollUp.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + + if (ta.getElement() != null) { + ta.getElement().setScrollTop(Math.max(0, ta.getElement().getScrollTop() - 20)); + } + } + }); + + Timer t = new Timer() { + + @Override + public void run() { + try { + + RequestBuilder rb = new RequestBuilder( + RequestBuilder.GET, GWT.getHostPageBaseURL()+ "miceScreenShot/manager"); + + rb.sendRequest(null, new RequestCallback() { + + @Override + public void onResponseReceived(Request request, + Response response) { + // if(!response.getText().equals(previousHTML)){} + + RootPanel.get("screenshotArea").getElement().setInnerHTML(preparationStage.getInnerHTML()); + RootPanel.get("screenshotArea").getElement().appendChild(preparationStage); + + preparationStage.setInnerHTML(response.getText()); + // previousHTML = response.getText(); + // RootPanel.getBodyElement().setInnerHTML(response.getText()); + } + + @Override + public void onError(Request request,Throwable exception) { + } + }); + } catch (RequestException e) { + e.printStackTrace(); + } } - }}; - t.scheduleRepeating(2000); - + }; + // t.run(); + t.scheduleRepeating(6000); // 6sc + + } + + else { + TouchPadWidget touchPad = GWT.create(TouchPadWidget.class); + RootLayoutPanel.get().add(touchPad); + // touchPad.initialize(UUID.get(), null, null); + touchPad.start(); + } } } diff --git a/MPProxy/src/main/java/ch/unifr/pai/twice/widgets/mpProxyScreenShot/server/ReadOnlyPresentation.java b/MPProxy/src/main/java/ch/unifr/pai/twice/widgets/mpProxyScreenShot/server/ReadOnlyPresentation.java index 2fbd096..4cda65a 100644 --- a/MPProxy/src/main/java/ch/unifr/pai/twice/widgets/mpProxyScreenShot/server/ReadOnlyPresentation.java +++ b/MPProxy/src/main/java/ch/unifr/pai/twice/widgets/mpProxyScreenShot/server/ReadOnlyPresentation.java @@ -36,7 +36,8 @@ public class ReadOnlyPresentation extends HttpServlet { private static final long serialVersionUID = 1L; - private static double scaleFactor = 0.25; + private static double scaleFactor = 0.5; + private static double scrollFactor = 0.65; private static class Screenshot { private String html; @@ -66,10 +67,10 @@ public static String getScreenshotForUUID(String uuid) { Screenshot s = uuidToScreenshot.get(uuid); String html = s.html; html = html.replace("", ""); - html = html.replaceAll("
", ""); - html = html.replace("
", ""); - html = html.replace("", ""); + //html = html.replaceAll("
", ""); + //html = html.replaceAll("
", ""); + //html = html.replace("
", "
"); + html = html.replace("", ""); return s != null ? html : null; } diff --git a/MPProxy/src/main/java/ch/unifr/pai/twice/widgets/mpbrowser/client/BrowserWindow.java b/MPProxy/src/main/java/ch/unifr/pai/twice/widgets/mpbrowser/client/BrowserWindow.java index 5d0e849..fed2617 100644 --- a/MPProxy/src/main/java/ch/unifr/pai/twice/widgets/mpbrowser/client/BrowserWindow.java +++ b/MPProxy/src/main/java/ch/unifr/pai/twice/widgets/mpbrowser/client/BrowserWindow.java @@ -1,4 +1,5 @@ package ch.unifr.pai.twice.widgets.mpbrowser.client; + /* * Copyright 2013 Oliver Schmid * Licensed under the Apache License, Version 2.0 (the "License"); @@ -6,17 +7,17 @@ * 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. */ -import ch.unifr.pai.twice.multipointer.provider.client.widgets.MultiFocusTextBox; -import ch.unifr.pai.twice.utils.device.client.DeviceType; +import ch.unifr.pai.twice.multipointer.provider.client.widgets.MultiFocusTextBox; import com.google.gwt.core.client.GWT; + import com.google.gwt.dom.client.Document; import com.google.gwt.dom.client.IFrameElement; import com.google.gwt.dom.client.Style.Unit; @@ -24,19 +25,18 @@ import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.dom.client.LoadEvent; import com.google.gwt.event.dom.client.LoadHandler; + import com.google.gwt.user.client.History; -import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.*; -public class BrowserWindow extends DockLayoutPanel{ - - +public class BrowserWindow extends DockLayoutPanel { + Frame frame; HorizontalPanel navig = new HorizontalPanel(); MultiFocusTextBox textBox = new MultiFocusTextBox(); DockLayoutPanel scrollBar = new DockLayoutPanel(Unit.PX); - - public BrowserWindow(String frameName){ + + public BrowserWindow(String frameName) { super(Unit.PX); frame = new NamedFrame(frameName); scrollBar.getElement().getStyle().setBackgroundColor("lightgrey"); @@ -52,8 +52,8 @@ public BrowserWindow(String frameName){ navig.add(go); navig.setCellWidth(go, "50px"); navig.setWidth("100%"); - - frame.setUrl("https://duckduckgo.com/?deviceType=multicursor"); + + frame.setUrl(GWT.getHostPageBaseURL() + "https://duckduckgo.com/"); // frame.setUrl("https://duckduckgo.com/?deviceType=multicursor"); frame.setHeight("100%"); frame.setWidth("100%"); frame.getElement().setAttribute("scrolling", "no"); @@ -61,34 +61,41 @@ public BrowserWindow(String frameName){ @Override public void onLoad(LoadEvent event) { - if(!frame.getUrl().contains(DeviceType.MULTICURSOR.name().toLowerCase())){ - String appendParam = (frame.getUrl().contains("?") ? "&":"?")+"deviceType="+DeviceType.MULTICURSOR.name().toLowerCase(); - frame.setUrl(frame.getUrl()+appendParam); + if (frame.getUrl() != null + && !frame.getUrl().startsWith(GWT.getHostPageBaseURL())) { // if(!frame.getUrl().contains(DeviceType.MULTICURSOR.name().toLowerCase())){ + frame.setUrl(GWT.getHostPageBaseURL() + frame.getUrl()); + // String appendParam = (frame.getUrl().contains("?") ? + // "&":"?")+"deviceType="+DeviceType.MULTICURSOR.name().toLowerCase(); + // frame.setUrl(frame.getUrl()+appendParam); updateScrollBar(); } - Document d = IFrameElement.as(frame.getElement()).getContentDocument(); + + Document d = IFrameElement.as(frame.getElement()) + .getContentDocument(); textBox.setValue(d.getURL()); + } + }); addNorth(navig, 25); addEast(scrollBar, 30); add(frame); } - - Button forward = new Button("Forward", new ClickHandler() { - @Override - public void onClick(ClickEvent event) { - History.forward(); - } - }); - Button backward = new Button("Backward", new ClickHandler() { + Button forward = new Button("▶", new ClickHandler() { // Forward + @Override + public void onClick(ClickEvent event) { + History.forward(); + } + }); + + Button backward = new Button("◀", new ClickHandler() { // Backward + @Override + public void onClick(ClickEvent event) { + History.back(); + } + }); - @Override - public void onClick(ClickEvent event) { - History.back(); - } - }); Button go = new Button("Go", new ClickHandler() { @Override public void onClick(ClickEvent event) { @@ -96,36 +103,41 @@ public void onClick(ClickEvent event) { } }); + Button scrollDown = new Button("▼", new ClickHandler() { // "Down" + @Override + public void onClick(ClickEvent event) { + Document d = IFrameElement.as(frame.getElement()) + .getContentDocument(); + if (d != null) { + d.getBody().setScrollTop( + Math.min(d.getBody().getScrollTop() + 20, d + .getBody().getScrollHeight())); + } + } + }); - Button scrollDown = new Button("Down", new ClickHandler() { - - @Override - public void onClick(ClickEvent event) { - Document d = IFrameElement.as(frame.getElement()).getContentDocument(); - if (d != null) { - d.getBody().setScrollTop(Math.min(d.getBody().getScrollTop() + 20, d.getBody().getScrollHeight())); - } - } - }); - Button scrollUp = new Button("Up", new ClickHandler() { + Button scrollUp = new Button("▲", new ClickHandler() { // "Up" + @Override + public void onClick(ClickEvent event) { + Document d = IFrameElement.as(frame.getElement()) + .getContentDocument(); + if (d != null) { + d.getBody().setScrollTop( + Math.max(d.getBody().getScrollTop() - 20, 0)); + } + } + }); - @Override - public void onClick(ClickEvent event) { - Document d = IFrameElement.as(frame.getElement()).getContentDocument(); - if (d != null) { - d.getBody().setScrollTop(Math.max(d.getBody().getScrollTop() - 20, 0)); - } - } - }); - - private void updateScrollBar() { Document d = IFrameElement.as(frame.getElement()).getContentDocument(); - boolean scrollVertical = d.getBody().getScrollHeight() > frame.getOffsetHeight(); - boolean scrollHorizontal = d.getBody().getScrollWidth() > frame.getOffsetWidth(); + boolean scrollVertical = d.getBody().getScrollHeight() > frame + .getOffsetHeight(); + boolean scrollHorizontal = d.getBody().getScrollWidth() > frame + .getOffsetWidth(); scrollDown.setEnabled(scrollVertical); scrollUp.setEnabled(scrollVertical); - scrollBar.getElement().getStyle().setBackgroundColor(scrollVertical ? "lightgrey" : "lightgrey"); + scrollBar.getElement().getStyle() + .setBackgroundColor(scrollVertical ? "lightgrey" : "lightgrey"); } - -} + +} \ No newline at end of file diff --git a/MPProxy/src/main/java/ch/unifr/pai/twice/widgets/mpbrowser/client/MPBrowser.java b/MPProxy/src/main/java/ch/unifr/pai/twice/widgets/mpbrowser/client/MPBrowser.java index 74dfead..9fbbf3d 100644 --- a/MPProxy/src/main/java/ch/unifr/pai/twice/widgets/mpbrowser/client/MPBrowser.java +++ b/MPProxy/src/main/java/ch/unifr/pai/twice/widgets/mpbrowser/client/MPBrowser.java @@ -14,16 +14,28 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + import ch.unifr.pai.twice.multipointer.controller.client.TouchPadWidget; import ch.unifr.pai.twice.multipointer.provider.client.MultiCursorController; import ch.unifr.pai.twice.multipointer.provider.client.NoMultiCursorController; +import ch.unifr.pai.twice.multipointer.provider.client.widgets.MultiFocusTextBox; import ch.unifr.pai.twice.utils.device.client.DeviceType; - import com.google.gwt.core.client.EntryPoint; import com.google.gwt.core.client.GWT; +import com.google.gwt.dom.client.Style.Unit; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.dom.client.ClickHandler; + import com.google.gwt.storage.client.Storage; + +import com.google.gwt.user.client.Window; +import com.google.gwt.user.client.ui.Button; +import com.google.gwt.user.client.ui.DockLayoutPanel; +import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.RootLayoutPanel; import com.google.gwt.user.client.ui.SplitLayoutPanel; +import com.google.gwt.user.client.ui.VerticalPanel; +import com.google.gwt.user.client.ui.TextArea; /** * This is a browser in a browser. It provides URL bars to enter standard URLs @@ -36,16 +48,59 @@ public class MPBrowser implements EntryPoint { SplitLayoutPanel browserSplit = new SplitLayoutPanel(); + VerticalPanel vPanel1 = new VerticalPanel(); + VerticalPanel vPanel2 = new VerticalPanel(); + DockLayoutPanel scrollBar = new DockLayoutPanel(Unit.PX); + + HorizontalPanel hPanel = new HorizontalPanel(); + + MultiFocusTextBox textBox = new MultiFocusTextBox(); + Button addButton = new Button("Add"); + Button scrollDown = new Button("▼"); // Down + Button scrollUp = new Button("▲"); // Up + TextArea textArea = new TextArea(); + DockLayoutPanel ChatBox = new DockLayoutPanel(Unit.PX); + + String oldValue = " "; + String newValue = " "; + int count = 0; + + static int height; + static int width; @Override public void onModuleLoad() { if (DeviceType.getDeviceType() == DeviceType.MULTICURSOR) { + MultiCursorController multiCursor = GWT .create(NoMultiCursorController.class); multiCursor.start(); + height = Window.getClientHeight(); + width = Window.getClientWidth(); + + scrollBar.getElement().getStyle().setBackgroundColor("lightgrey"); + scrollBar.addNorth(scrollUp, 26); + scrollBar.addSouth(scrollDown, 26); + + textBox.setVisible(true); + textBox.setWidth("100%"); + textBox.setHeight("22px"); + + hPanel.add(textBox); + hPanel.add(addButton); + hPanel.setCellWidth(addButton, "51px"); + hPanel.setWidth("100%"); + + textArea.setVisibleLines(150); + textArea.setHeight("100%"); + textArea.setWidth("100%"); + textArea.getElement().getStyle().setFontSize(12, Unit.PX); + BrowserWindow window1 = new BrowserWindow("window1"); BrowserWindow window2 = new BrowserWindow("window2"); + BrowserWindow window3 = new BrowserWindow("window3"); + Storage s = Storage.getSessionStorageIfSupported(); if (s != null) { String type = s.getItem(DeviceType.SESSION_STORAGE_VARIABLE); @@ -56,15 +111,97 @@ public void onModuleLoad() { DeviceType.MULTICURSOR.name().toLowerCase()); } } - browserSplit.addNorth(window1, 500); - browserSplit.add(window2); + + // browserSplit.addEast(window3,400); //User3 + // browserSplit.addNorth(window2, 400); //User2 + // browserSplit.insertNorth(window1, 400, window2); //User1 + + /* ChatBox */ + ChatBox.addSouth(hPanel, 25); + ChatBox.addEast(scrollBar, 30); + ChatBox.add(textArea); + + vPanel1.setSize("100%", "100%"); + + vPanel1.add(window3); // User3 + vPanel1.getWidget(0).setSize("100%", "100%"); + vPanel1.add(ChatBox); // ChatBox + vPanel1.getWidget(1).setSize("100%", "100%"); + + vPanel2.setSize("100%", "100%"); + + vPanel2.add(window2); // User2 + vPanel2.getWidget(0).setSize("100%", "100%"); + vPanel2.add(window1); // User1 + vPanel2.getWidget(1).setSize("100%", "100%"); + + browserSplit.addEast(vPanel1, width / 2); + browserSplit.add(vPanel2); RootLayoutPanel.get().add(browserSplit); + + /* ChatBox Buttons */ + addButton.addClickHandler(new ClickHandler() { + + @Override + public void onClick(ClickEvent event) { + count++; + + String color = textBox.getTextColor(); + String username = ""; + + if (color.equalsIgnoreCase("#1a1a1a")) { + username = "User1"; + } + if (color.equalsIgnoreCase("#ff0000")) { + username = "User2"; + } + if (color.equalsIgnoreCase("#336aa6")) { + username = "User3"; + } + + newValue = username + ": " + textBox.getValue(); + + textArea.setValue(oldValue + '\n' + newValue); + oldValue = oldValue + '\n' + newValue; + textBox.setValue(""); + + if (count >= 13) { // number of lines in ta + textArea.getElement().setScrollTop( + textArea.getElement().getScrollTop() + 20); // auto scroll down + } + } + }); + scrollDown.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + + if (textArea.getElement() != null) { + textArea.getElement().setScrollTop( + Math.min(textArea.getElement() + .getScrollHeight(), textArea + .getElement().getScrollTop() + 20)); // scroll down + } + } + }); + + scrollUp.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + + if (textArea.getElement() != null) { + textArea.getElement().setScrollTop( + Math.max(0, textArea.getElement() + .getScrollTop() - 20)); // scroll up + } + } + }); + } else { TouchPadWidget touchPad = GWT.create(TouchPadWidget.class); RootLayoutPanel.get().add(touchPad); + // touchPad.initialize(UUID.get(), null, null); touchPad.start(); } } - -} +} \ No newline at end of file diff --git a/MPProxy/src/main/java/ch/unifr/pai/twice/widgets/mpproxy/client/MPProxyBody.java b/MPProxy/src/main/java/ch/unifr/pai/twice/widgets/mpproxy/client/MPProxyBody.java index 00129bd..8b9b501 100644 --- a/MPProxy/src/main/java/ch/unifr/pai/twice/widgets/mpproxy/client/MPProxyBody.java +++ b/MPProxy/src/main/java/ch/unifr/pai/twice/widgets/mpproxy/client/MPProxyBody.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import ch.unifr.pai.twice.multipointer.provider.client.MultiCursorController; + import ch.unifr.pai.twice.multipointer.provider.client.widgets.MultiFocusTextBox; import com.google.gwt.dom.client.InputElement; import com.google.gwt.dom.client.NodeList; @@ -23,7 +23,6 @@ import com.google.gwt.user.client.ui.TextArea; import com.google.gwt.user.client.ui.TextBox; import com.google.gwt.user.client.ui.TextBoxBase; - import java.util.HashMap; import java.util.HashSet; import java.util.Map; @@ -37,13 +36,16 @@ */ public class MPProxyBody extends ProxyBody { - private static TextBox hiddenTextBoxForFocusControl = new TextBox(); - private final String[] colors = { "red", "green", "blue", "yellow" }; - private final Map deviceToColor = new HashMap(); - private final int currentColorIndex = -1; + // private static TextBox hiddenTextBoxForFocusControl = new TextBox(); + // private final String[] colors = { "red", "green", "blue", "yellow" }; + // private final Map deviceToColor = new HashMap(); + // private final int currentColorIndex = -1; private static Map focusedElement = new HashMap(); private static Set owningDevices = new HashSet(); - private final MultiCursorController multiCursor = new MultiCursorController(); + + // private final MultiCursorController multiCursor = new + // MultiCursorController(); /** * Replace all textboxes with multi focus text boxes @@ -51,11 +53,13 @@ public class MPProxyBody extends ProxyBody { * @param mainElement */ private void replaceAllTextBoxes(Element mainElement) { - NodeList inputFields = mainElement.getElementsByTagName("input"); + NodeList inputFields = mainElement + .getElementsByTagName("input"); for (int i = 0; i < inputFields.getLength(); i++) { final com.google.gwt.dom.client.Element el = inputFields.getItem(i); String type = el.getAttribute("type"); - if (type == null || type.isEmpty() || type.equalsIgnoreCase("text") || type.equalsIgnoreCase("search")) { + if (type == null || type.isEmpty() || type.equalsIgnoreCase("text") + || type.equalsIgnoreCase("search")) { MultiFocusTextBox box = new MultiFocusTextBox(); box.replaceTextInput(InputElement.as(el)); replacements.add(box); @@ -81,8 +85,10 @@ public void initialize() { // // hiddenTextBoxForFocusControl.setWidth("0px"); // // hiddenTextBoxForFocusControl.getElement().getStyle() // // .setPosition(Position.ABSOLUTE); - // // hiddenTextBoxForFocusControl.getElement().getStyle().setZIndex(-1); - // // hiddenTextBoxForFocusControl.getElement().getStyle().setTop(0, Unit.PX); + // // + // hiddenTextBoxForFocusControl.getElement().getStyle().setZIndex(-1); + // // hiddenTextBoxForFocusControl.getElement().getStyle().setTop(0, + // Unit.PX); // // hiddenTextBoxForFocusControl.getElement().getStyle() // // .setLeft(0, Unit.PX); // // RootPanel.get().add(hiddenTextBoxForFocusControl); @@ -200,11 +206,14 @@ private static void setOwningDevices(String devices) { /** * @param e - * @return a textbox or textarea widget if the element is one of those, otherwise null + * @return a textbox or textarea widget if the element is one of those, + * otherwise null */ private TextBoxBase getTextBoxBase(Element e) { if (e.getTagName().equalsIgnoreCase("input") - && (e.getAttribute("type") == null || e.getAttribute("type").isEmpty() || e.getAttribute("type").equalsIgnoreCase("text"))) + && (e.getAttribute("type") == null + || e.getAttribute("type").isEmpty() || e.getAttribute( + "type").equalsIgnoreCase("text"))) return TextBox.wrap(e); else if (e.getTagName().equalsIgnoreCase("textarea")) return TextArea.wrap(e); diff --git a/MPProxy/src/main/java/ch/unifr/pai/twice/widgets/mpproxy/client/ProxyBody.java b/MPProxy/src/main/java/ch/unifr/pai/twice/widgets/mpproxy/client/ProxyBody.java index a4f83f9..8a18ad8 100644 --- a/MPProxy/src/main/java/ch/unifr/pai/twice/widgets/mpproxy/client/ProxyBody.java +++ b/MPProxy/src/main/java/ch/unifr/pai/twice/widgets/mpproxy/client/ProxyBody.java @@ -70,10 +70,10 @@ public void onPreviewNativeEvent(NativePreviewEvent event) { } } }); - Storage s = Storage.getSessionStorageIfSupported(); - if (s != null) { - RootPanel.get().add(new Label("Multicursor: " + s.getItem("ch.unifr.pai.mice.deviceType"))); - } + //Storage s = Storage.getSessionStorageIfSupported(); + //if (s != null) { + // RootPanel.get().add(new Label("Multicursor: " + s.getItem("ch.unifr.pai.mice.deviceType"))); + //} publishInterfaces(); rewriteUrls((Element) Document.get().getDocumentElement()); addDomChangeEvents(); diff --git a/MPProxy/src/main/java/ch/unifr/pai/twice/widgets/mpproxy/client/ScreenShotDistributor.java b/MPProxy/src/main/java/ch/unifr/pai/twice/widgets/mpproxy/client/ScreenShotDistributor.java index 5a58d18..e28948f 100644 --- a/MPProxy/src/main/java/ch/unifr/pai/twice/widgets/mpproxy/client/ScreenShotDistributor.java +++ b/MPProxy/src/main/java/ch/unifr/pai/twice/widgets/mpproxy/client/ScreenShotDistributor.java @@ -14,11 +14,19 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +import java.util.ArrayList; +import java.util.List; + import ch.unifr.pai.twice.widgets.mpproxy.shared.Rewriter; import ch.unifr.pai.twice.widgets.mpproxy.shared.URLParser; import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.Document; +import com.google.gwt.dom.client.InputElement; +import com.google.gwt.dom.client.LabelElement; +import com.google.gwt.dom.client.NodeList; +import com.google.gwt.dom.client.OptionElement; +import com.google.gwt.dom.client.SpanElement; import com.google.gwt.http.client.Request; import com.google.gwt.http.client.RequestBuilder; import com.google.gwt.http.client.RequestCallback; @@ -26,22 +34,36 @@ import com.google.gwt.http.client.Response; import com.google.gwt.user.client.Timer; import com.google.gwt.user.client.Window; +import com.google.gwt.dom.client.SelectElement; +import com.google.gwt.dom.client.Element; /** - * Takes a snapshot of the current HTML DOM structure, removes script tags and submits the content to the server in regular intervals + * Takes a snapshot of the current HTML DOM structure, removes script tags and + * submits the content to the server in regular intervals * * @author Oliver Schmid * */ public class ScreenShotDistributor { + private String lastSent; private int lastTop = -1; private int lastLeft = -1; + + private static String lastTitle = ""; + private static String lastInput = ""; + private static String lastSelect = ""; + + private int height = 932; // Window.getClientHeight() + private int width = 1920; // Window.getClientWidth() + private final Timer t = new Timer() { @Override public void run() { - sendScreenShot(); + + sendScreenShot(); // ScreenShot mode + // sendMetaData(); // MetaData mode } }; @@ -49,7 +71,8 @@ public void run() { * Begin to update the server with screenshots */ public void start() { - t.scheduleRepeating(1000); + + t.scheduleRepeating(4000); // 4 seconds } /** @@ -63,39 +86,348 @@ public void stop() { * Send the screenshot to the server */ public void sendScreenShot() { + String screen = Document.get().getDocumentElement().getInnerHTML(); - if (!screen.equals(lastSent) || lastLeft != Window.getScrollLeft() || lastTop != Window.getScrollTop()) { + + if (!screen.equals(lastSent) || lastLeft != Window.getScrollLeft() + || lastTop != Window.getScrollTop()) { String url = Window.Location.getHref(); - URLParser p = new URLParser(url, Rewriter.getServletPath(Window.Location.getHref())); - RequestBuilder rb = new RequestBuilder(RequestBuilder.POST, GWT.getModuleBaseURL() + "manager?url=" + p.getProxyBasePath() + "&width=" - + Window.getClientWidth() + "&height=" + Window.getClientHeight() + "&top=" + Window.getScrollTop() + "&left=" + Window.getScrollLeft()); + URLParser p = new URLParser(url, + Rewriter.getServletPath(Window.Location.getHref())); + RequestBuilder rb = new RequestBuilder(RequestBuilder.POST, + GWT.getModuleBaseURL() + "manager?url=" + + p.getProxyBasePath() + "&width=" + width + + "&height=" + height + "&top=" + + Window.getScrollTop() + "&left=" + + Window.getScrollLeft()); + lastSent = screen; lastLeft = Window.getScrollLeft(); lastTop = Window.getScrollTop(); - screen = screen.replace('\n', ' '); - screen = screen.replaceAll("
", "
"); - screen = screen.replaceAll("()", ""); + + // screen = screen.replace('\n', ' '); + // screen = screen.replaceAll("
", "
"); + // screen = screen.replaceAll("()", ""); + try { - rb.sendRequest(screen, new RequestCallback() { + rb.sendRequest(screen, new RequestCallback() { // screen + + @Override + public void onResponseReceived(Request request, + Response response) { + // TODO Auto-generated method stub + + } + + @Override + public void onError(Request request, + Throwable exception) { + Window.alert("Screenshot sent"); + } + }); + } catch (RequestException e) { + e.printStackTrace(); + } + + } + + } + + public void sendMetaData() { + List mytext = new ArrayList(); + List mySelectiontext = new ArrayList(); + + String inputscreen = ""; + String selectscreen = ""; + String full = ""; + String domainUrl = ""; + + String title = Document.get().getTitle(); + + NodeList iframeFields = Document + .get().getElementsByTagName("iframe"); + + for (int i = 0; i < iframeFields.getLength(); i++) { + final com.google.gwt.dom.client.Element el = iframeFields + .getItem(i); + com.google.gwt.dom.client.Element parentEl = el.getParentElement(); + + parentEl.removeChild(el); + + } + + NodeList scriptFields = Document + .get().getElementsByTagName("script"); + + for (int i = 0; i < scriptFields.getLength(); i++) { + final com.google.gwt.dom.client.Element el = scriptFields + .getItem(i); + + if (el.getAttribute("src").contains("adobedtm")) { + el.removeAttribute("src"); + com.google.gwt.dom.client.Element parentEl = el + .getParentElement(); + parentEl.removeChild(el); + } + + } + + NodeList inputFields = Document.get().getElementsByTagName("input"); + NodeList selectionFields = Document.get().getElementsByTagName("select"); + + for (int i = 0; i < inputFields.getLength(); i++) { + + final com.google.gwt.dom.client.Element el = inputFields.getItem(i); + String type = el.getAttribute("type"); + + if (!type.equalsIgnoreCase("hidden")) { + if (type == null || type.isEmpty() + || type.equalsIgnoreCase("text") + || type.equalsIgnoreCase("search") + || type.equalsIgnoreCase("radio") + || type.equalsIgnoreCase("checkbox")) { + + InputElement input = InputElement.as(el); + + if (type.equalsIgnoreCase("radio")) { + if (input.isChecked() && input.getOffsetHeight() != 0 + && input.getOffsetWidth() != 0) { + NodeList labelFields = input + .getParentElement().getElementsByTagName( + "label"); + + if (labelFields.getLength() > 0) { + for (int s = 0; s < labelFields.getLength(); s++) { + final com.google.gwt.dom.client.Element label = labelFields + .getItem(s); + LabelElement labelinput = LabelElement + .as(label); - @Override - public void onResponseReceived(Request request, Response response) { - // TODO Auto-generated method stub + if (el.getAttribute("checked") + .equalsIgnoreCase("") + && (input + .getClassName() + .equalsIgnoreCase( + "b-booker-type__input b-booker-type__input_business-booker") || input + .getClassName() + .equalsIgnoreCase( + "b-booker-type__input b-booker-type__input_leisure-booker"))) { + mytext.add(labelinput.getInnerText()); + } + if (!labelinput.getInnerText().isEmpty() + && !labelinput + .getId() + .equalsIgnoreCase( + "extra-information-select-label-s") + && !labelinput + .getId() + .equalsIgnoreCase( + "extra-information-select-label-d")) { + mytext.add(labelinput.getInnerText()); + } + } + } + } } - @Override - public void onError(Request request, Throwable exception) { - Window.alert("Screenshot sent"); + else if (type.equalsIgnoreCase("checkbox")) { + + if (input.isChecked()) { + NodeList cb_spanFields = input + .getFirstChildElement() + .getElementsByTagName("span"); + + if (cb_spanFields.getLength() > 0) { + for (int s = 0; s < cb_spanFields.getLength(); s++) { + final com.google.gwt.dom.client.Element span = cb_spanFields + .getItem(s); + SpanElement spaninput = SpanElement + .as(span); + if (!spaninput.getInnerText().isEmpty()) { + + mytext.add(spaninput.getInnerText()); + } + } + } + } } - }); + + else + // create labels + if (!input.isDisabled() && input.getOffsetHeight() != 0 + && input.getOffsetWidth() != 0) { + if (!input.getValue().isEmpty()) { + if (input.getId().equalsIgnoreCase("home_from") + || input.getId().equalsIgnoreCase("from") + || input.getId().equalsIgnoreCase("Origin")) { // SBB + // //SWISS + + mytext.add("From: " + input.getValue()); + } else if (input.getId() + .equalsIgnoreCase("home_to") + || input.getId().equalsIgnoreCase("to") + || input.getId().equals("Destination")) { // SBB + // //SWISS + + mytext.add("To: " + input.getValue()); + } else if (input.getId().equalsIgnoreCase( + "home_via") + || input.getId().equalsIgnoreCase("via1")) { // SBB + mytext.add("Via: " + input.getValue()); + } else if (input.getId().equalsIgnoreCase( + "home_date")) { // SBB + mytext.add("Date: " + input.getValue()); + } else if (input.getId().equalsIgnoreCase( + "home_time") + || input.getId().equalsIgnoreCase( + "hfs_time")) { // SBB + mytext.add("Time: " + input.getValue()); + } else if (input.getId().equals("destination")) { // Booking + mytext.add("Destination/Hotel Name: " + + input.getValue()); + } else if (!input.getId().equalsIgnoreCase( + "newsletter_to")) { + mytext.add(input.getValue()); + } + } + } + } } - catch (RequestException e) { - e.printStackTrace(); + + } + + for (int a = 0; a < selectionFields.getLength(); a++) { + final com.google.gwt.dom.client.Element ele = selectionFields + .getItem(a); + + SelectElement selectinput = SelectElement.as(ele); + + if (selectinput.getOffsetHeight() != 0 + && selectinput.getOffsetWidth() != 0) { + NodeList options = selectinput.getOptions(); + + for (int j = 0; j < options.getLength(); j++) { + if (options.getItem(j).isSelected() + && !options.getItem(j).isDisabled()) { + if (!options.getItem(j).getInnerText().isEmpty()) { + if (selectinput.getName().equalsIgnoreCase( + "checkin_monthday")) { + mySelectiontext.add("Check-in Day: " + + options.getItem(j).getInnerText()); + } else if (selectinput.getName().equalsIgnoreCase( + "checkin_year_month")) { + mySelectiontext.add("Check-in Month: " + + options.getItem(j).getInnerText()); + } else if (selectinput.getName().equalsIgnoreCase( + "checkout_monthday")) { + mySelectiontext.add("Check-out Day: " + + options.getItem(j).getInnerText()); + } else if (selectinput.getName().equalsIgnoreCase( + "checkout_year_month")) { + mySelectiontext.add("Check-out Month: " + + options.getItem(j).getInnerText()); + } else if (selectinput + .getClassName() + .equalsIgnoreCase( + "b-selectbox__element b-selectbox__groupselection")) { + mySelectiontext.add("Guests: " + + options.getItem(j).getInnerText()); + } else if (selectinput.getName().equalsIgnoreCase( + "no_rooms")) { + mySelectiontext.add("Rooms: " + + options.getItem(j).getInnerText()); + } else if (selectinput.getName().equalsIgnoreCase( + "group_adults")) { + mySelectiontext.add("Adults: " + + options.getItem(j).getInnerText()); + } else if (selectinput.getName().equalsIgnoreCase( + "group_children")) { + mySelectiontext.add("Children: " + + options.getItem(j).getInnerText()); + } + + else { + mySelectiontext.add(options.getItem(j) + .getInnerText()); // "s: "+ + } + } + + } + + } + } + } + + String url = Window.Location.getHref(); + + URLParser p = new URLParser(url, + Rewriter.getServletPath(Window.Location.getHref())); + + RequestBuilder rb = new RequestBuilder(RequestBuilder.POST, + GWT.getModuleBaseURL() + "manager?url=" + p.getProxyBasePath() + + "&width=" + 1200 + "&height=" + 600 + "&top=" + + Window.getScrollTop() + "&left=" + + Window.getScrollLeft()); + + if (p.getProxyBasePath().contains("adobedtm")) { //due to screenshot input problem in SBB, presents the previous home page + + Element input_element = Document.get().getElementById("from"); + InputElement input = InputElement.as(input_element); + + String value = input.getValue(); + + full = lastTitle + '\n' + "- - - - - - - - - - - - - - - - - " + + value + '\n' + lastSelect + '\n' + + "- - - - - - - - - - - - - - - - - " + '\n' + + "http://www.sbb.ch"; + } + + else { + + for (int k = 0; k < mytext.size(); k++) { + inputscreen = inputscreen + '\n' + mytext.get(k); + } + + for (int l = 0; l < mySelectiontext.size(); l++) { + selectscreen = selectscreen + '\n' + mySelectiontext.get(l); } + + domainUrl = p.getProxyBasePath(); + + full = title + '\n' + "- - - - - - - - - - - - - - - - - " + + inputscreen + '\n' + selectscreen + '\n' + + "- - - - - - - - - - - - - - - - - " + '\n' + domainUrl; + + lastTitle = title; + lastInput = inputscreen; + lastSelect = selectscreen; + + } + + try { + rb.sendRequest(full, new RequestCallback() { + + @Override + public void onResponseReceived(Request request, + Response response) { + // TODO Auto-generated method stub + + } + + @Override + public void onError(Request request, Throwable exception) { + Window.alert("Screenshot sent"); + } + }); + } catch (RequestException e) { + e.printStackTrace(); } + } } diff --git a/MPProxy/src/main/webapp/miceScreenShotViewer.html b/MPProxy/src/main/webapp/miceScreenShotViewer.html index ccc1087..894983c 100644 --- a/MPProxy/src/main/webapp/miceScreenShotViewer.html +++ b/MPProxy/src/main/webapp/miceScreenShotViewer.html @@ -19,5 +19,10 @@ MICE Portal - + + +
+
+ + \ No newline at end of file diff --git a/MouseControl/pom.xml b/MouseControl/pom.xml index f7758f4..37bc59e 100644 --- a/MouseControl/pom.xml +++ b/MouseControl/pom.xml @@ -34,6 +34,10 @@ ch.unifr.pai.twice.comm.serverPush ServerPush + + ch.unifr.pai.twice.widgets + RemoteWidgets + ch.unifr.pai.twice diff --git a/MouseControl/src/main/java/ch/unifr/pai/twice/multipointer/controller/MultipointerController.gwt.xml b/MouseControl/src/main/java/ch/unifr/pai/twice/multipointer/controller/MultipointerController.gwt.xml index 35c04ae..97a8b0c 100644 --- a/MouseControl/src/main/java/ch/unifr/pai/twice/multipointer/controller/MultipointerController.gwt.xml +++ b/MouseControl/src/main/java/ch/unifr/pai/twice/multipointer/controller/MultipointerController.gwt.xml @@ -86,7 +86,7 @@ - + diff --git a/MouseControl/src/main/java/ch/unifr/pai/twice/multipointer/controller/client/TouchPadWidget.java b/MouseControl/src/main/java/ch/unifr/pai/twice/multipointer/controller/client/TouchPadWidget.java index 39ae768..2d2d2e8 100644 --- a/MouseControl/src/main/java/ch/unifr/pai/twice/multipointer/controller/client/TouchPadWidget.java +++ b/MouseControl/src/main/java/ch/unifr/pai/twice/multipointer/controller/client/TouchPadWidget.java @@ -232,7 +232,8 @@ public void onPreviewNativeEvent(NativePreviewEvent event) { keyDownEvent); switch(event.getNativeEvent().getKeyCode()){ case KeyCodes.KEY_BACKSPACE: - case KeyCodes.KEY_ENTER: + //case KeyCodes.KEY_ENTER: + event.getNativeEvent().preventDefault(); event.getNativeEvent().stopPropagation(); event.cancel(); @@ -244,9 +245,11 @@ public void onPreviewNativeEvent(NativePreviewEvent event) { keyUpEvent.keyCode = event.getNativeEvent().getKeyCode(); CommunicationManager.getBidirectionalEventBus().fireEvent( keyUpEvent); + switch(event.getNativeEvent().getKeyCode()){ case KeyCodes.KEY_BACKSPACE: - case KeyCodes.KEY_ENTER: + //case KeyCodes.KEY_ENTER: + event.getNativeEvent().preventDefault(); event.getNativeEvent().stopPropagation(); event.cancel(); diff --git a/MouseControl/src/main/java/ch/unifr/pai/twice/multipointer/provider/MultipointerProvider.gwt.xml b/MouseControl/src/main/java/ch/unifr/pai/twice/multipointer/provider/MultipointerProvider.gwt.xml index f406165..6690075 100644 --- a/MouseControl/src/main/java/ch/unifr/pai/twice/multipointer/provider/MultipointerProvider.gwt.xml +++ b/MouseControl/src/main/java/ch/unifr/pai/twice/multipointer/provider/MultipointerProvider.gwt.xml @@ -18,6 +18,10 @@ + + + + () { @Override public void onFailure(Throwable caught) { + Window.alert("Not Registered"); // TODO Auto-generated method stub } @@ -266,7 +273,7 @@ private MouseCursor getOrCreateCursor(String uuid) { m.setUuid(uuid); assignedMouseCursors.put(uuid, m); if (storage != null) - storage.setItem("ch.unifr.pai.mice.multicursor.assignedCursor." + m.getFileName(), uuid); + storage.setItem("ch.unifr.pai.mice.multicursor.assignedCursor." + m.getFileName(), uuid); CommunicationManager.getBidirectionalEventBus().fireEvent( InformationUpdateEvent.changeColorAndResize(m.getColor(), Window.getClientWidth(), Window.getClientHeight(), uuid)); return m; diff --git a/MouseControl/src/main/java/ch/unifr/pai/twice/multipointer/provider/client/widgets/MultiFocusTextBox.java b/MouseControl/src/main/java/ch/unifr/pai/twice/multipointer/provider/client/widgets/MultiFocusTextBox.java index 0046a17..369df20 100644 --- a/MouseControl/src/main/java/ch/unifr/pai/twice/multipointer/provider/client/widgets/MultiFocusTextBox.java +++ b/MouseControl/src/main/java/ch/unifr/pai/twice/multipointer/provider/client/widgets/MultiFocusTextBox.java @@ -67,8 +67,10 @@ public class MultiFocusTextBox extends Composite implements HasValue { private final Canvas c; private final Timer blinkTimer; private boolean cursorsVisible; + + private String color; - private void showCursor() { + private void showCursor() { Event.addNativePreviewHandler(new NativePreviewHandler() { @Override @@ -94,6 +96,7 @@ private void setStyle() { int currentWidth; int currentHeight; + public void replaceTextInput(InputElement el) { if (!el.isDisabled() && !el.getAttribute("multifocus").equals("true")) { replacedElement = el; @@ -138,6 +141,7 @@ private void copyProperty(String property, Element original, Element target) { } public MultiFocusTextBox() { + blinkTimer = new Timer() { @Override @@ -148,6 +152,7 @@ public void run() { cursorsVisible = !cursorsVisible; } }; + blinkTimer.scheduleRepeating(cursorSpeed); p.getElement().getStyle().setDisplay(Display.INLINE_BLOCK); c = Canvas.createIfSupported(); @@ -160,14 +165,21 @@ public void run() { @Override public void onKeyPress(KeyPressEvent event) { processInput(NoMultiCursorController.getUUID(event.getNativeEvent()), event.getCharCode()); + String textcolor = NoMultiCursorController.getColorNative(event.getNativeEvent()); + setTextColor(textcolor); + } }); + c.addKeyUpHandler(new KeyUpHandler() { + @Override public void onKeyUp(KeyUpEvent event) { Cursor c = cursors.get(NoMultiCursorController.getUUID(event.getNativeEvent())); + if (c != null) { + switch (event.getNativeKeyCode()) { case KeyCodes.KEY_LEFT: c.setPosition(Math.max(0, c.position - 1)); @@ -207,18 +219,24 @@ public void onKeyUp(KeyUpEvent event) { } scrollIfNecessary(); } + break; + case KeyCodes.KEY_ENTER: //ICEExperiments-TextEdit + setValue(""); + c.setPosition(0); + break; } } } }); + c.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { repositionCursor(NoMultiCursorController.getUUID(event.getNativeEvent()), NoMultiCursorController.getColorNative(event.getNativeEvent()), event.getRelativeX(c.getCanvasElement()), event.getRelativeY(c.getCanvasElement())); - } + } }); multiFocus.insert(c, 0, 0, 0); initWidget(multiFocus); @@ -235,7 +253,8 @@ public void onClick(ClickEvent event) { multiFocus.setHeight("25px"); } - + + private void repositionCursor(String uuid, String color, int x, int y) { Cursor c = getOrCreateCursor(uuid, color); if (c != null) { @@ -307,6 +326,16 @@ public void setPosition(int position) { c.show(); } } + +// private int getYpositionForLine(int linenumber){ +// StringBuilder sb = new StringBuilder(); +// for(int i=0; i multiFocus.getOffsetWidth() - padding) { } } } - + @Override public void setValue(String value) { + this.value = value; if (replacedElement != null) replacedElement.setValue(value); @@ -393,6 +426,7 @@ public void setValue(String value) { context.setTextAlign(TextAlign.LEFT); context.setTextBaseline(TextBaseline.TOP); context.fillText(value, 0, 0); + } @Override @@ -400,4 +434,16 @@ public void setValue(String value, boolean fireEvents) { setValue(value); // TODO } + + public void setTextColor(String color){ + context.setFillStyle(color); + this.color= color; + + } + + public String getTextColor(){ + return this.color; + } + + }