Revision: 18290 http://sourceforge.net/p/gate/code/18290 Author: ian_roberts Date: 2014-09-04 12:14:12 +0000 (Thu, 04 Sep 2014) Log Message: ----------- Added the option for a free-text "comment" field on each unit, allowing annotators to feed back arbitrary comments with each judgment (e.g. why they chose not to annotate anything, or the classification they think is correct if they've had to choose "none of the above").
Modified Paths: -------------- gate/trunk/plugins/Crowd_Sourcing/src/gate/crowdsource/classification/EntityClassificationResultsImporter.java gate/trunk/plugins/Crowd_Sourcing/src/gate/crowdsource/classification/NewClassificationJobAction.java gate/trunk/plugins/Crowd_Sourcing/src/gate/crowdsource/classification/newClassificationJobForm.xml gate/trunk/plugins/Crowd_Sourcing/src/gate/crowdsource/ne/EntityAnnotationResultsImporter.java gate/trunk/plugins/Crowd_Sourcing/src/gate/crowdsource/ne/NewAnnotationJobAction.java gate/trunk/plugins/Crowd_Sourcing/src/gate/crowdsource/ne/newAnnotationJobForm.xml gate/trunk/plugins/Crowd_Sourcing/src/gate/crowdsource/rest/CrowdFlowerClient.java Modified: gate/trunk/plugins/Crowd_Sourcing/src/gate/crowdsource/classification/EntityClassificationResultsImporter.java =================================================================== --- gate/trunk/plugins/Crowd_Sourcing/src/gate/crowdsource/classification/EntityClassificationResultsImporter.java 2014-09-04 01:19:45 UTC (rev 18289) +++ gate/trunk/plugins/Crowd_Sourcing/src/gate/crowdsource/classification/EntityClassificationResultsImporter.java 2014-09-04 12:14:12 UTC (rev 18290) @@ -159,9 +159,8 @@ if(judgments != null) { for(JsonElement judgmentElt : judgments) { JsonObject judgment = judgmentElt.getAsJsonObject(); - String answer = - judgment.getAsJsonObject("data").get("answer") - .getAsString(); + JsonObject data = judgment.getAsJsonObject("data"); + String answer = data.get("answer").getAsString(); long judgmentId = judgment.get("id").getAsLong(); double trust = judgment.get("trust").getAsDouble(); long workerId = judgment.get("worker_id").getAsLong(); @@ -172,6 +171,14 @@ judgmentAnn.getFeatures().put("trust", Double.valueOf(trust)); judgmentAnn.getFeatures() .put("worker_id", Long.valueOf(workerId)); + if(data.get("comment") != null) { + if(data.get("comment").isJsonPrimitive()) { + String comment = data.get("comment").getAsString().trim(); + if(comment.length() > 0) { + judgmentAnn.getFeatures().put("comment", comment); + } + } + } } } else { log.warn("Unit " + unitId + " has no judgments"); Modified: gate/trunk/plugins/Crowd_Sourcing/src/gate/crowdsource/classification/NewClassificationJobAction.java =================================================================== --- gate/trunk/plugins/Crowd_Sourcing/src/gate/crowdsource/classification/NewClassificationJobAction.java 2014-09-04 01:19:45 UTC (rev 18289) +++ gate/trunk/plugins/Crowd_Sourcing/src/gate/crowdsource/classification/NewClassificationJobAction.java 2014-09-04 12:14:12 UTC (rev 18290) @@ -28,13 +28,17 @@ import javax.swing.AbstractAction; import javax.swing.AbstractButton; +import javax.swing.JCheckBox; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JTable; +import javax.swing.JTextField; import javax.swing.ListSelectionModel; import javax.swing.SwingUtilities; import javax.swing.WindowConstants; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; import javax.swing.table.DefaultTableModel; import com.jeta.forms.components.panel.FormPanel; @@ -68,7 +72,9 @@ panel.setPreferredSize(new Dimension(500, 400)); - // attach listeners etc. + initListeners(panel); + + // put the panel in a JOptionPane final JTable commonOptionsTable = panel.getTable("commonOptions"); final DefaultTableModel optionsTableModel = new DefaultTableModel( new String[][] { @@ -173,7 +179,10 @@ panel.getTextField("title").getText().trim(), panel.getTextComponent("instructions").getText(), panel.getTextField("caption").getText().trim(), - commonOptions)); + commonOptions, + panel.getCheckBox("commentCheckbox").isSelected() + ? panel.getTextField("commentCaption").getText().trim() + : null)); // if the creation was successful we can dispose the dialog SwingUtilities.invokeLater(new Runnable() { public void run() { @@ -226,8 +235,28 @@ statusLabel.setText("<html><p>A caption is required</p></html>"); statusLabel.setIcon(MainFrame.getIcon("Invalid")); valid = false; + } else if(panel.getCheckBox("commentCheckbox").isSelected() + && "".equals(panel.getTextField("commentCaption").getText().trim())) { + statusLabel.setText("<html><p>A caption for the \"comment\" field is required</p></html>"); + statusLabel.setIcon(MainFrame.getIcon("Invalid")); + valid = false; } return valid; } + + protected void initListeners(FormPanel panel) { + final JLabel commentLabel = panel.getLabel("commentCaptionLabel"); + final JTextField commentField = panel.getTextField("commentCaption"); + final JCheckBox commentCheckbox = panel.getCheckBox("commentCheckbox"); + commentCheckbox.addChangeListener(new ChangeListener() { + + @Override + public void stateChanged(ChangeEvent e) { + commentLabel.setEnabled(commentCheckbox.isSelected()); + commentField.setEnabled(commentCheckbox.isSelected()); + } + }); + } + } Modified: gate/trunk/plugins/Crowd_Sourcing/src/gate/crowdsource/classification/newClassificationJobForm.xml =================================================================== --- gate/trunk/plugins/Crowd_Sourcing/src/gate/crowdsource/classification/newClassificationJobForm.xml 2014-09-04 01:19:45 UTC (rev 18289) +++ gate/trunk/plugins/Crowd_Sourcing/src/gate/crowdsource/classification/newClassificationJobForm.xml 2014-09-04 12:14:12 UTC (rev 18290) @@ -24,8 +24,8 @@ </at> <at name="componentclass">com.jeta.forms.gui.form.FormComponent</at> </super> - <at name="id">/Users/ian/svn/gate-extras/crowd-flower-tools/plugins/Crowd_Sourcing/src/gate/crowdsource/classification/newClassificationJobForm.xml</at> - <at name="rowspecs">TOP:30DLU:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,FILL:MIN(90DLU;DEFAULT):GROW(1.0),CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,FILL:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:MIN(90DLU;DEFAULT):GROW(1.0),CENTER:2DLU:NONE</at> + <at name="id">/Users/ian/svn/gate/plugins/Crowd_Sourcing/src/gate/crowdsource/classification/newClassificationJobForm.xml</at> + <at name="rowspecs">TOP:30DLU:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,FILL:MIN(90DLU;DEFAULT):GROW(1.0),CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,FILL:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:MIN(90DLU;DEFAULT):GROW(1.0),CENTER:2DLU:NONE</at> <at name="colspecs">FILL:4DLU:NONE,LEFT:DEFAULT:NONE,FILL:4DLU:NONE,FILL:MIN(75DLU;DEFAULT):GROW(1.0),FILL:DEFAULT:NONE,FILL:4DLU:NONE</at> <at name="components"> <object classname="java.util.LinkedList"> @@ -39,7 +39,7 @@ <at name="row">3</at> <at name="colspan">1</at> <at name="rowspan">1</at> - <at name="halign">default</at> + <at name="halign">right</at> <at name="valign">default</at> <at name="insets" object="insets">0,0,0,0</at> </object> @@ -55,8 +55,8 @@ <object classname="com.jeta.forms.store.support.PropertyMap"> <at name="text">Job title</at> <at name="height">16</at> + <at name="name"/> <at name="width">49</at> - <at name="name"></at> <at name="fill"> <object classname="com.jeta.forms.store.properties.effects.PaintProperty"> <at name="name">fill</at> @@ -114,7 +114,7 @@ <at name="properties"> <object classname="com.jeta.forms.store.support.PropertyMap"> <at name="height">28</at> - <at name="width">679</at> + <at name="width">594</at> <at name="name">title</at> <at name="toolTipText">The title of the CrowdFlower job.</at> <at name="border"> @@ -151,7 +151,7 @@ <at name="cellconstraints"> <object classname="com.jeta.forms.store.memento.CellConstraintsMemento"> <at name="column">2</at> - <at name="row">7</at> + <at name="row">11</at> <at name="colspan">4</at> <at name="rowspan">1</at> <at name="halign">default</at> @@ -170,8 +170,8 @@ <object classname="com.jeta.forms.store.support.PropertyMap"> <at name="text">Instructions</at> <at name="height">16</at> + <at name="name"/> <at name="width">772</at> - <at name="name"></at> <at name="fill"> <object classname="com.jeta.forms.store.properties.effects.PaintProperty"> <at name="name">fill</at> @@ -211,7 +211,7 @@ <at name="cellconstraints"> <object classname="com.jeta.forms.store.memento.CellConstraintsMemento"> <at name="column">2</at> - <at name="row">9</at> + <at name="row">13</at> <at name="colspan">4</at> <at name="rowspan">1</at> <at name="halign">default</at> @@ -288,6 +288,7 @@ </at> </object> </at> + <at name="y">-38</at> </object> </at> </object> @@ -302,7 +303,7 @@ <at name="cellconstraints"> <object classname="com.jeta.forms.store.memento.CellConstraintsMemento"> <at name="column">2</at> - <at name="row">11</at> + <at name="row">15</at> <at name="colspan">4</at> <at name="rowspan">1</at> <at name="halign">default</at> @@ -362,7 +363,7 @@ <at name="cellconstraints"> <object classname="com.jeta.forms.store.memento.CellConstraintsMemento"> <at name="column">2</at> - <at name="row">13</at> + <at name="row">17</at> <at name="colspan">3</at> <at name="rowspan">9</at> <at name="halign">default</at> @@ -506,7 +507,7 @@ <at name="cellconstraints"> <object classname="com.jeta.forms.store.memento.CellConstraintsMemento"> <at name="column">5</at> - <at name="row">13</at> + <at name="row">17</at> <at name="colspan">1</at> <at name="rowspan">1</at> <at name="halign">default</at> @@ -561,7 +562,7 @@ <at name="cellconstraints"> <object classname="com.jeta.forms.store.memento.CellConstraintsMemento"> <at name="column">5</at> - <at name="row">15</at> + <at name="row">19</at> <at name="colspan">1</at> <at name="rowspan">1</at> <at name="halign">default</at> @@ -616,7 +617,7 @@ <at name="cellconstraints"> <object classname="com.jeta.forms.store.memento.CellConstraintsMemento"> <at name="column">5</at> - <at name="row">17</at> + <at name="row">21</at> <at name="colspan">1</at> <at name="rowspan">1</at> <at name="halign">default</at> @@ -671,7 +672,7 @@ <at name="cellconstraints"> <object classname="com.jeta.forms.store.memento.CellConstraintsMemento"> <at name="column">5</at> - <at name="row">19</at> + <at name="row">23</at> <at name="colspan">1</at> <at name="rowspan">1</at> <at name="halign">default</at> @@ -729,7 +730,7 @@ <at name="row">5</at> <at name="colspan">1</at> <at name="rowspan">1</at> - <at name="halign">default</at> + <at name="halign">right</at> <at name="valign">default</at> <at name="insets" object="insets">0,0,0,0</at> </object> @@ -745,8 +746,8 @@ <object classname="com.jeta.forms.store.support.PropertyMap"> <at name="text">Task caption</at> <at name="height">16</at> + <at name="name"/> <at name="width">81</at> - <at name="name"></at> <at name="fill"> <object classname="com.jeta.forms.store.properties.effects.PaintProperty"> <at name="name">fill</at> @@ -803,10 +804,12 @@ <at name="classname">javax.swing.JTextField</at> <at name="properties"> <object classname="com.jeta.forms.store.support.PropertyMap"> + <at name="selectionEnd">51</at> <at name="text">Which of the following describes "{{entity}}" best?</at> <at name="height">28</at> - <at name="width">679</at> + <at name="width">594</at> <at name="name">caption</at> + <at name="selectionStart">51</at> <at name="toolTipText"><html><p>The question that will be presented to the user.</p><p>The caption may contain a placeholder {{entity}}, which will be replaced by the text of the entity that is the target of the current task.</p></html></at> <at name="border"> <object classname="com.jeta.forms.store.properties.CompoundBorderProperty"> @@ -835,6 +838,238 @@ </object> </at> </item> + <item > + <at name="value"> + <object classname="com.jeta.forms.store.memento.BeanMemento"> + <super classname="com.jeta.forms.store.memento.ComponentMemento"> + <at name="cellconstraints"> + <object classname="com.jeta.forms.store.memento.CellConstraintsMemento"> + <at name="column">2</at> + <at name="row">7</at> + <at name="colspan">1</at> + <at name="rowspan">1</at> + <at name="halign">right</at> + <at name="valign">default</at> + <at name="insets" object="insets">0,0,0,0</at> + </object> + </at> + <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at> + </super> + <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at> + <at name="beanclass">com.jeta.forms.components.label.JETALabel</at> + <at name="beanproperties"> + <object classname="com.jeta.forms.store.memento.PropertiesMemento"> + <at name="classname">com.jeta.forms.components.label.JETALabel</at> + <at name="properties"> + <object classname="com.jeta.forms.store.support.PropertyMap"> + <at name="text">Allow free-text comment</at> + <at name="height">16</at> + <at name="width">159</at> + <at name="name">commentCheckboxLabel</at> + <at name="fill"> + <object classname="com.jeta.forms.store.properties.effects.PaintProperty"> + <at name="name">fill</at> + </object> + </at> + <at name="border"> + <object classname="com.jeta.forms.store.properties.CompoundBorderProperty"> + <super classname="com.jeta.forms.store.properties.BorderProperty"> + <at name="name">border</at> + </super> + <at name="borders"> + <object classname="java.util.LinkedList"> + <item > + <at name="value"> + <object classname="com.jeta.forms.store.properties.DefaultBorderProperty"> + <super classname="com.jeta.forms.store.properties.BorderProperty"> + <at name="name">border</at> + </super> + </object> + </at> + </item> + </object> + </at> + </object> + </at> + </object> + </at> + </object> + </at> + </object> + </at> + </item> + <item > + <at name="value"> + <object classname="com.jeta.forms.store.memento.BeanMemento"> + <super classname="com.jeta.forms.store.memento.ComponentMemento"> + <at name="cellconstraints"> + <object classname="com.jeta.forms.store.memento.CellConstraintsMemento"> + <at name="column">2</at> + <at name="row">9</at> + <at name="colspan">1</at> + <at name="rowspan">1</at> + <at name="halign">right</at> + <at name="valign">default</at> + <at name="insets" object="insets">0,0,0,0</at> + </object> + </at> + <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at> + </super> + <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at> + <at name="beanclass">com.jeta.forms.components.label.JETALabel</at> + <at name="beanproperties"> + <object classname="com.jeta.forms.store.memento.PropertiesMemento"> + <at name="classname">com.jeta.forms.components.label.JETALabel</at> + <at name="properties"> + <object classname="com.jeta.forms.store.support.PropertyMap"> + <at name="text">Caption for comment field</at> + <at name="height">16</at> + <at name="width">166</at> + <at name="name">commentCaptionLabel</at> + <at name="fill"> + <object classname="com.jeta.forms.store.properties.effects.PaintProperty"> + <at name="name">fill</at> + </object> + </at> + <at name="border"> + <object classname="com.jeta.forms.store.properties.CompoundBorderProperty"> + <super classname="com.jeta.forms.store.properties.BorderProperty"> + <at name="name">border</at> + </super> + <at name="borders"> + <object classname="java.util.LinkedList"> + <item > + <at name="value"> + <object classname="com.jeta.forms.store.properties.DefaultBorderProperty"> + <super classname="com.jeta.forms.store.properties.BorderProperty"> + <at name="name">border</at> + </super> + </object> + </at> + </item> + </object> + </at> + </object> + </at> + </object> + </at> + </object> + </at> + </object> + </at> + </item> + <item > + <at name="value"> + <object classname="com.jeta.forms.store.memento.BeanMemento"> + <super classname="com.jeta.forms.store.memento.ComponentMemento"> + <at name="cellconstraints"> + <object classname="com.jeta.forms.store.memento.CellConstraintsMemento"> + <at name="column">4</at> + <at name="row">7</at> + <at name="colspan">1</at> + <at name="rowspan">1</at> + <at name="halign">default</at> + <at name="valign">default</at> + <at name="insets" object="insets">0,0,0,0</at> + </object> + </at> + <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at> + </super> + <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at> + <at name="beanclass">javax.swing.JCheckBox</at> + <at name="beanproperties"> + <object classname="com.jeta.forms.store.memento.PropertiesMemento"> + <at name="classname">javax.swing.JCheckBox</at> + <at name="properties"> + <object classname="com.jeta.forms.store.support.PropertyMap"> + <at name="selected">true</at> + <at name="height">20</at> + <at name="width">515</at> + <at name="name">commentCheckbox</at> + <at name="border"> + <object classname="com.jeta.forms.store.properties.CompoundBorderProperty"> + <super classname="com.jeta.forms.store.properties.BorderProperty"> + <at name="name">border</at> + </super> + <at name="borders"> + <object classname="java.util.LinkedList"> + <item > + <at name="value"> + <object classname="com.jeta.forms.store.properties.DefaultBorderProperty"> + <super classname="com.jeta.forms.store.properties.BorderProperty"> + <at name="name">border</at> + </super> + </object> + </at> + </item> + </object> + </at> + </object> + </at> + </object> + </at> + </object> + </at> + </object> + </at> + </item> + <item > + <at name="value"> + <object classname="com.jeta.forms.store.memento.BeanMemento"> + <super classname="com.jeta.forms.store.memento.ComponentMemento"> + <at name="cellconstraints"> + <object classname="com.jeta.forms.store.memento.CellConstraintsMemento"> + <at name="column">4</at> + <at name="row">9</at> + <at name="colspan">2</at> + <at name="rowspan">1</at> + <at name="halign">default</at> + <at name="valign">default</at> + <at name="insets" object="insets">0,0,0,0</at> + </object> + </at> + <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at> + </super> + <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at> + <at name="beanclass">javax.swing.JTextField</at> + <at name="beanproperties"> + <object classname="com.jeta.forms.store.memento.PropertiesMemento"> + <at name="classname">javax.swing.JTextField</at> + <at name="properties"> + <object classname="com.jeta.forms.store.support.PropertyMap"> + <at name="selectionEnd">7</at> + <at name="text">Comment</at> + <at name="height">28</at> + <at name="width">594</at> + <at name="name">commentCaption</at> + <at name="selectionStart">7</at> + <at name="border"> + <object classname="com.jeta.forms.store.properties.CompoundBorderProperty"> + <super classname="com.jeta.forms.store.properties.BorderProperty"> + <at name="name">border</at> + </super> + <at name="borders"> + <object classname="java.util.LinkedList"> + <item > + <at name="value"> + <object classname="com.jeta.forms.store.properties.DefaultBorderProperty"> + <super classname="com.jeta.forms.store.properties.BorderProperty"> + <at name="name">border</at> + </super> + </object> + </at> + </item> + </object> + </at> + </object> + </at> + </object> + </at> + </object> + </at> + </object> + </at> + </item> </object> </at> <at name="properties"> @@ -892,7 +1127,7 @@ <at name="cellpainters"> <object classname="com.jeta.forms.store.support.Matrix"> <at name="rows"> - <object classname="[Ljava.lang.Object;" size="22"> + <object classname="[Ljava.lang.Object;" size="26"> <at name="item" index="0"> <object classname="[Ljava.lang.Object;" size="6"/> </at> @@ -959,6 +1194,18 @@ <at name="item" index="21"> <object classname="[Ljava.lang.Object;" size="6"/> </at> + <at name="item" index="22"> + <object classname="[Ljava.lang.Object;" size="6"/> + </at> + <at name="item" index="23"> + <object classname="[Ljava.lang.Object;" size="6"/> + </at> + <at name="item" index="24"> + <object classname="[Ljava.lang.Object;" size="6"/> + </at> + <at name="item" index="25"> + <object classname="[Ljava.lang.Object;" size="6"/> + </at> </object> </at> </object> Modified: gate/trunk/plugins/Crowd_Sourcing/src/gate/crowdsource/ne/EntityAnnotationResultsImporter.java =================================================================== --- gate/trunk/plugins/Crowd_Sourcing/src/gate/crowdsource/ne/EntityAnnotationResultsImporter.java 2014-09-04 01:19:45 UTC (rev 18289) +++ gate/trunk/plugins/Crowd_Sourcing/src/gate/crowdsource/ne/EntityAnnotationResultsImporter.java 2014-09-04 12:14:12 UTC (rev 18290) @@ -25,6 +25,7 @@ import gate.Annotation; import gate.AnnotationSet; +import gate.FeatureMap; import gate.Resource; import gate.Utils; import gate.creole.AbstractLanguageAnalyser; @@ -202,12 +203,20 @@ if(judgments != null) { for(JsonElement judgmentElt : judgments) { JsonObject judgment = judgmentElt.getAsJsonObject(); - JsonArray answer = - judgment.getAsJsonObject("data").get("answer") - .getAsJsonArray(); + JsonObject data = judgment.getAsJsonObject("data"); + JsonArray answer = data.get("answer").getAsJsonArray(); Long judgmentId = judgment.get("id").getAsLong(); Double trust = judgment.get("trust").getAsDouble(); Long workerId = judgment.get("worker_id").getAsLong(); + String comment = null; + if(data.get("comment") != null) { + if(data.get("comment").isJsonPrimitive()) { + comment = data.get("comment").getAsString().trim(); + if("".equals(comment)) { + comment = null; + } + } + } if(answer.size() > 0) { // judgment says there are some entities to annotate. Look for // sequences of consecutive token indices and create one result @@ -235,10 +244,14 @@ if(!found) { // no existing annotation found, create one try { - resultAS.add(startOffset, endOffset, resultAnnotationType, Utils.featureMap( + FeatureMap features = Utils.featureMap( JUDGMENT_ID_FEATURE_NAME, judgmentId, "trust", trust, - "worker_id", workerId)); + "worker_id", workerId); + if(comment != null) { + features.put("comment", comment); + } + resultAS.add(startOffset, endOffset, resultAnnotationType, features); } catch(InvalidOffsetException e) { throw new ExecutionException("Invalid offset obtained from existing annotation!", e); } Modified: gate/trunk/plugins/Crowd_Sourcing/src/gate/crowdsource/ne/NewAnnotationJobAction.java =================================================================== --- gate/trunk/plugins/Crowd_Sourcing/src/gate/crowdsource/ne/NewAnnotationJobAction.java 2014-09-04 01:19:45 UTC (rev 18289) +++ gate/trunk/plugins/Crowd_Sourcing/src/gate/crowdsource/ne/NewAnnotationJobAction.java 2014-09-04 12:14:12 UTC (rev 18290) @@ -25,11 +25,15 @@ import java.io.InputStream; import javax.swing.AbstractAction; +import javax.swing.JCheckBox; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JOptionPane; +import javax.swing.JTextField; import javax.swing.SwingUtilities; import javax.swing.WindowConstants; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; import com.jeta.forms.components.panel.FormPanel; @@ -62,7 +66,9 @@ panel.setPreferredSize(new Dimension(500, 400)); - // attach listeners etc. + initListeners(panel); + + // wrap panel in a JOptionPane. final JOptionPane optionPane = new JOptionPane(panel, JOptionPane.PLAIN_MESSAGE, JOptionPane.OK_CANCEL_OPTION); final JDialog dialog = new JDialog(MainFrame.getInstance(), "New annotation job", true); @@ -103,7 +109,11 @@ panel.getTextComponent("instructions").getText(), panel.getTextField("caption").getText().trim(), panel.getTextField("noEntitiesCaption").getText().trim(), - panel.getTextField("noEntitiesError").getText().trim())); + panel.getTextField("noEntitiesError").getText().trim(), + panel.getCheckBox("commentCheckbox").isSelected() + ? panel.getTextField("commentCaption").getText().trim() + : null)); + // if the creation was successful we can dispose the dialog SwingUtilities.invokeLater(new Runnable() { public void run() { @@ -164,8 +174,27 @@ statusLabel.setText("<html><p>An error message for the \"no entities\" checkbox is required</p></html>"); statusLabel.setIcon(MainFrame.getIcon("Invalid")); valid = false; + } else if(panel.getCheckBox("commentCheckbox").isSelected() + && "".equals(panel.getTextField("commentCaption").getText().trim())) { + statusLabel.setText("<html><p>A caption for the \"comment\" field is required</p></html>"); + statusLabel.setIcon(MainFrame.getIcon("Invalid")); + valid = false; } return valid; } - + + protected void initListeners(FormPanel panel) { + final JLabel commentLabel = panel.getLabel("commentCaptionLabel"); + final JTextField commentField = panel.getTextField("commentCaption"); + final JCheckBox commentCheckbox = panel.getCheckBox("commentCheckbox"); + commentCheckbox.addChangeListener(new ChangeListener() { + + @Override + public void stateChanged(ChangeEvent e) { + commentLabel.setEnabled(commentCheckbox.isSelected()); + commentField.setEnabled(commentCheckbox.isSelected()); + } + }); + } + } Modified: gate/trunk/plugins/Crowd_Sourcing/src/gate/crowdsource/ne/newAnnotationJobForm.xml =================================================================== --- gate/trunk/plugins/Crowd_Sourcing/src/gate/crowdsource/ne/newAnnotationJobForm.xml 2014-09-04 01:19:45 UTC (rev 18289) +++ gate/trunk/plugins/Crowd_Sourcing/src/gate/crowdsource/ne/newAnnotationJobForm.xml 2014-09-04 12:14:12 UTC (rev 18290) @@ -24,8 +24,8 @@ </at> <at name="componentclass">com.jeta.forms.gui.form.FormComponent</at> </super> - <at name="id">/Users/ian/svn/gate-extras/crowd-flower-tools/plugins/Crowd_Sourcing/src/gate/crowdsource/ne/newAnnotationJobForm.xml</at> - <at name="rowspecs">TOP:30DLU:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,FILL:MIN(90DLU;DEFAULT):GROW(1.0),CENTER:2DLU:NONE</at> + <at name="id">/Users/ian/svn/gate/plugins/Crowd_Sourcing/src/gate/crowdsource/ne/newAnnotationJobForm.xml</at> + <at name="rowspecs">TOP:30DLU:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,FILL:MIN(90DLU;DEFAULT):GROW(1.0),CENTER:2DLU:NONE</at> <at name="colspecs">FILL:4DLU:NONE,LEFT:DEFAULT:NONE,FILL:4DLU:NONE,FILL:MIN(75DLU;DEFAULT):GROW(1.0),FILL:4DLU:NONE</at> <at name="components"> <object classname="java.util.LinkedList"> @@ -56,8 +56,8 @@ <at name="horizontalAlignment">11</at> <at name="text">Job title</at> <at name="height">16</at> - <at name="name"/> <at name="width">49</at> + <at name="name">titleLabel</at> <at name="horizontalTextPosition">10</at> <at name="fill"> <object classname="com.jeta.forms.store.properties.effects.PaintProperty"> @@ -153,7 +153,7 @@ <at name="cellconstraints"> <object classname="com.jeta.forms.store.memento.CellConstraintsMemento"> <at name="column">2</at> - <at name="row">11</at> + <at name="row">15</at> <at name="colspan">3</at> <at name="rowspan">1</at> <at name="halign">default</at> @@ -172,8 +172,8 @@ <object classname="com.jeta.forms.store.support.PropertyMap"> <at name="text">Instructions</at> <at name="height">16</at> - <at name="name"/> <at name="width">772</at> + <at name="name">instructionsLabel</at> <at name="fill"> <object classname="com.jeta.forms.store.properties.effects.PaintProperty"> <at name="name">fill</at> @@ -213,7 +213,7 @@ <at name="cellconstraints"> <object classname="com.jeta.forms.store.memento.CellConstraintsMemento"> <at name="column">2</at> - <at name="row">13</at> + <at name="row">17</at> <at name="colspan">3</at> <at name="rowspan">1</at> <at name="halign">default</at> @@ -234,7 +234,7 @@ <at name="text"><p>For this task you need to indicate whether each snippet of text contains any mentions of person names, and if so which words these are. Click on words to highlight them, and your task is to highlight all the words that form part of a person name.</p> <p>If there are <i>no</i> person names within the snippet of text, then do not highlight any words, instead tick the "there are no person names in this sentence" checkbox to confirm that you have verified this.</p></at> <at name="scrollableTracksViewportWidth">true</at> - <at name="height">313</at> + <at name="height">251</at> <at name="width">753</at> <at name="name">instructions</at> <at name="selectionStart">468</at> @@ -378,10 +378,11 @@ <at name="classname">com.jeta.forms.components.label.JETALabel</at> <at name="properties"> <object classname="com.jeta.forms.store.support.PropertyMap"> + <at name="horizontalAlignment">11</at> <at name="text">Task caption</at> <at name="height">16</at> <at name="width">81</at> - <at name="name"></at> + <at name="name">captionLabel</at> <at name="horizontalTextPosition">10</at> <at name="fill"> <object classname="com.jeta.forms.store.properties.effects.PaintProperty"> @@ -497,10 +498,11 @@ <at name="classname">com.jeta.forms.components.label.JETALabel</at> <at name="properties"> <object classname="com.jeta.forms.store.support.PropertyMap"> + <at name="horizontalAlignment">11</at> <at name="text">Caption for "no entities" checkbox</at> <at name="height">16</at> <at name="width">217</at> - <at name="name"></at> + <at name="name">noEntitiesCaptionLabel</at> <at name="horizontalTextPosition">10</at> <at name="fill"> <object classname="com.jeta.forms.store.properties.effects.PaintProperty"> @@ -619,7 +621,7 @@ <at name="text">Error message if "no entities" not checked</at> <at name="height">16</at> <at name="width">264</at> - <at name="name"></at> + <at name="name">noEntitiesErrorLabel</at> <at name="horizontalTextPosition">10</at> <at name="fill"> <object classname="com.jeta.forms.store.properties.effects.PaintProperty"> @@ -712,6 +714,236 @@ </object> </at> </item> + <item > + <at name="value"> + <object classname="com.jeta.forms.store.memento.BeanMemento"> + <super classname="com.jeta.forms.store.memento.ComponentMemento"> + <at name="cellconstraints"> + <object classname="com.jeta.forms.store.memento.CellConstraintsMemento"> + <at name="column">2</at> + <at name="row">11</at> + <at name="colspan">1</at> + <at name="rowspan">1</at> + <at name="halign">right</at> + <at name="valign">default</at> + <at name="insets" object="insets">0,0,0,0</at> + </object> + </at> + <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at> + </super> + <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at> + <at name="beanclass">com.jeta.forms.components.label.JETALabel</at> + <at name="beanproperties"> + <object classname="com.jeta.forms.store.memento.PropertiesMemento"> + <at name="classname">com.jeta.forms.components.label.JETALabel</at> + <at name="properties"> + <object classname="com.jeta.forms.store.support.PropertyMap"> + <at name="text">Allow free-text comment</at> + <at name="height">16</at> + <at name="width">159</at> + <at name="name">commentCheckboxLabel</at> + <at name="fill"> + <object classname="com.jeta.forms.store.properties.effects.PaintProperty"> + <at name="name">fill</at> + </object> + </at> + <at name="border"> + <object classname="com.jeta.forms.store.properties.CompoundBorderProperty"> + <super classname="com.jeta.forms.store.properties.BorderProperty"> + <at name="name">border</at> + </super> + <at name="borders"> + <object classname="java.util.LinkedList"> + <item > + <at name="value"> + <object classname="com.jeta.forms.store.properties.DefaultBorderProperty"> + <super classname="com.jeta.forms.store.properties.BorderProperty"> + <at name="name">border</at> + </super> + </object> + </at> + </item> + </object> + </at> + </object> + </at> + </object> + </at> + </object> + </at> + </object> + </at> + </item> + <item > + <at name="value"> + <object classname="com.jeta.forms.store.memento.BeanMemento"> + <super classname="com.jeta.forms.store.memento.ComponentMemento"> + <at name="cellconstraints"> + <object classname="com.jeta.forms.store.memento.CellConstraintsMemento"> + <at name="column">2</at> + <at name="row">13</at> + <at name="colspan">1</at> + <at name="rowspan">1</at> + <at name="halign">right</at> + <at name="valign">default</at> + <at name="insets" object="insets">0,0,0,0</at> + </object> + </at> + <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at> + </super> + <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at> + <at name="beanclass">com.jeta.forms.components.label.JETALabel</at> + <at name="beanproperties"> + <object classname="com.jeta.forms.store.memento.PropertiesMemento"> + <at name="classname">com.jeta.forms.components.label.JETALabel</at> + <at name="properties"> + <object classname="com.jeta.forms.store.support.PropertyMap"> + <at name="text">Comment field caption</at> + <at name="height">16</at> + <at name="width">144</at> + <at name="name">commentCaptionLabel</at> + <at name="fill"> + <object classname="com.jeta.forms.store.properties.effects.PaintProperty"> + <at name="name">fill</at> + </object> + </at> + <at name="border"> + <object classname="com.jeta.forms.store.properties.CompoundBorderProperty"> + <super classname="com.jeta.forms.store.properties.BorderProperty"> + <at name="name">border</at> + </super> + <at name="borders"> + <object classname="java.util.LinkedList"> + <item > + <at name="value"> + <object classname="com.jeta.forms.store.properties.DefaultBorderProperty"> + <super classname="com.jeta.forms.store.properties.BorderProperty"> + <at name="name">border</at> + </super> + </object> + </at> + </item> + </object> + </at> + </object> + </at> + </object> + </at> + </object> + </at> + </object> + </at> + </item> + <item > + <at name="value"> + <object classname="com.jeta.forms.store.memento.BeanMemento"> + <super classname="com.jeta.forms.store.memento.ComponentMemento"> + <at name="cellconstraints"> + <object classname="com.jeta.forms.store.memento.CellConstraintsMemento"> + <at name="column">4</at> + <at name="row">11</at> + <at name="colspan">1</at> + <at name="rowspan">1</at> + <at name="halign">default</at> + <at name="valign">default</at> + <at name="insets" object="insets">0,0,0,0</at> + </object> + </at> + <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at> + </super> + <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at> + <at name="beanclass">javax.swing.JCheckBox</at> + <at name="beanproperties"> + <object classname="com.jeta.forms.store.memento.PropertiesMemento"> + <at name="classname">javax.swing.JCheckBox</at> + <at name="properties"> + <object classname="com.jeta.forms.store.support.PropertyMap"> + <at name="selected">true</at> + <at name="height">20</at> + <at name="width">496</at> + <at name="name">commentCheckbox</at> + <at name="border"> + <object classname="com.jeta.forms.store.properties.CompoundBorderProperty"> + <super classname="com.jeta.forms.store.properties.BorderProperty"> + <at name="name">border</at> + </super> + <at name="borders"> + <object classname="java.util.LinkedList"> + <item > + <at name="value"> + <object classname="com.jeta.forms.store.properties.DefaultBorderProperty"> + <super classname="com.jeta.forms.store.properties.BorderProperty"> + <at name="name">border</at> + </super> + </object> + </at> + </item> + </object> + </at> + </object> + </at> + </object> + </at> + </object> + </at> + </object> + </at> + </item> + <item > + <at name="value"> + <object classname="com.jeta.forms.store.memento.BeanMemento"> + <super classname="com.jeta.forms.store.memento.ComponentMemento"> + <at name="cellconstraints"> + <object classname="com.jeta.forms.store.memento.CellConstraintsMemento"> + <at name="column">4</at> + <at name="row">13</at> + <at name="colspan">1</at> + <at name="rowspan">1</at> + <at name="halign">default</at> + <at name="valign">default</at> + <at name="insets" object="insets">0,0,0,0</at> + </object> + </at> + <at name="componentclass">com.jeta.forms.gui.form.StandardComponent</at> + </super> + <at name="jetabeanclass">com.jeta.forms.gui.beans.JETABean</at> + <at name="beanclass">javax.swing.JTextField</at> + <at name="beanproperties"> + <object classname="com.jeta.forms.store.memento.PropertiesMemento"> + <at name="classname">javax.swing.JTextField</at> + <at name="properties"> + <object classname="com.jeta.forms.store.support.PropertyMap"> + <at name="text">Comment</at> + <at name="height">28</at> + <at name="width">496</at> + <at name="name">commentCaption</at> + <at name="border"> + <object classname="com.jeta.forms.store.properties.CompoundBorderProperty"> + <super classname="com.jeta.forms.store.properties.BorderProperty"> + <at name="name">border</at> + </super> + <at name="borders"> + <object classname="java.util.LinkedList"> + <item > + <at name="value"> + <object classname="com.jeta.forms.store.properties.DefaultBorderProperty"> + <super classname="com.jeta.forms.store.properties.BorderProperty"> + <at name="name">border</at> + </super> + </object> + </at> + </item> + </object> + </at> + </object> + </at> + </object> + </at> + </object> + </at> + </object> + </at> + </item> </object> </at> <at name="properties"> @@ -769,7 +1001,7 @@ <at name="cellpainters"> <object classname="com.jeta.forms.store.support.Matrix"> <at name="rows"> - <object classname="[Ljava.lang.Object;" size="14"> + <object classname="[Ljava.lang.Object;" size="18"> <at name="item" index="0"> <object classname="[Ljava.lang.Object;" size="5"/> </at> @@ -812,6 +1044,18 @@ <at name="item" index="13"> <object classname="[Ljava.lang.Object;" size="5"/> </at> + <at name="item" index="14"> + <object classname="[Ljava.lang.Object;" size="5"/> + </at> + <at name="item" index="15"> + <object classname="[Ljava.lang.Object;" size="5"/> + </at> + <at name="item" index="16"> + <object classname="[Ljava.lang.Object;" size="5"/> + </at> + <at name="item" index="17"> + <object classname="[Ljava.lang.Object;" size="5"/> + </at> </object> </at> </object> Modified: gate/trunk/plugins/Crowd_Sourcing/src/gate/crowdsource/rest/CrowdFlowerClient.java =================================================================== --- gate/trunk/plugins/Crowd_Sourcing/src/gate/crowdsource/rest/CrowdFlowerClient.java 2014-09-04 01:19:45 UTC (rev 18289) +++ gate/trunk/plugins/Crowd_Sourcing/src/gate/crowdsource/rest/CrowdFlowerClient.java 2014-09-04 12:14:12 UTC (rev 18290) @@ -75,11 +75,14 @@ * task extracted from the entity annotation. This is * expressed as a List of [value, description] two-element * Lists, one for each option. + * @param commentCaption caption for the free-text "comment" field, or null + * if no comment field should be shown. * @return the newly created job ID. * @throws IOException */ public long createClassificationJob(String title, String instructions, - String caption, List<List<String>> commonOptions) throws IOException { + String caption, List<List<String>> commonOptions, + String commentCaption) throws IOException { log.debug("Creating classification job"); log.debug("title: " + title); log.debug("instructions: " + instructions); @@ -124,6 +127,11 @@ } } cml.append("</cml:radios>\n"); + if(commentCaption != null) { + cml.append("<cml:text name=\"comment\" label=\""); + StringEscapeUtils.escapeXml(cml, commentCaption); + cml.append("\"/>"); + } log.debug("cml: " + cml.toString()); @@ -316,11 +324,14 @@ * checkbox. * @param noEntitiesError the error message to show to the user if they have * not marked any annotations but have also not ticked the checkbox. + * @param commentCaption caption for the free-text "comment" field, or null + * if no comment field should be shown. * @return the newly created job ID. * @throws IOException */ public long createAnnotationJob(String title, String instructions, - String caption, String noEntitiesCaption, String noEntitiesError) + String caption, String noEntitiesCaption, String noEntitiesError, + String commentCaption) throws IOException { log.debug("Creating annotation job"); log.debug("title: " + title); @@ -378,6 +389,11 @@ cml.append("\" value=\"1\"\n" + " only-if=\"!answer:required\" validates=\"required\"/>\n" + "</div>\n"); + if(commentCaption != null) { + cml.append("<cml:text name=\"comment\" label=\""); + StringEscapeUtils.escapeXml(cml, commentCaption); + cml.append("\"/>"); + } log.debug("cml: " + cml.toString()); log.debug("POSTing to CrowdFlower"); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. ------------------------------------------------------------------------------ Slashdot TV. Video for Nerds. Stuff that matters. http://tv.slashdot.org/ _______________________________________________ GATE-cvs mailing list GATE-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/gate-cvs