use of org.javarosa.core.model.data.helper.Selection in project collect by opendatakit.
the class GridMultiWidget method getAnswer.
@Override
public IAnswerData getAnswer() {
List<Selection> vc = new ArrayList<>();
for (int i = 0; i < items.size(); i++) {
if (selected[i]) {
SelectChoice sc = items.get(i);
vc.add(new Selection(sc));
}
}
if (vc.size() == 0) {
return null;
} else {
return new SelectMultiData(vc);
}
}
use of org.javarosa.core.model.data.helper.Selection in project collect by opendatakit.
the class SelectImageMapWidget method unselectArea.
private void unselectArea(String areaId) {
Selection selectionToRemove = null;
for (Selection selection : selections) {
if (areaId.equalsIgnoreCase(selection.getValue())) {
selectionToRemove = selection;
}
}
selections.remove(selectionToRemove);
}
use of org.javarosa.core.model.data.helper.Selection in project collect by opendatakit.
the class SpinnerMultiWidget method getAnswer.
@Override
public IAnswerData getAnswer() {
clearFocus();
List<Selection> vc = new ArrayList<>();
for (int i = 0; i < items.size(); i++) {
if (selections[i]) {
SelectChoice sc = items.get(i);
vc.add(new Selection(sc));
}
}
if (vc.size() == 0) {
return null;
} else {
return new SelectMultiData(vc);
}
}
use of org.javarosa.core.model.data.helper.Selection in project collect by opendatakit.
the class ExternalAnswerResolver method resolveAnswer.
@Override
public IAnswerData resolveAnswer(String textVal, TreeElement treeElement, FormDef formDef) {
QuestionDef questionDef = XFormParser.ghettoGetQuestionDef(treeElement.getDataType(), formDef, treeElement.getRef());
if (questionDef != null && (questionDef.getControlType() == Constants.CONTROL_SELECT_ONE || questionDef.getControlType() == Constants.CONTROL_SELECT_MULTI)) {
boolean containsSearchExpression = false;
XPathFuncExpr xpathExpression = null;
try {
xpathExpression = ExternalDataUtil.getSearchXPathExpression(questionDef.getAppearanceAttr());
} catch (Exception e) {
Timber.e(e);
// there is a search expression, but has syntax errors
containsSearchExpression = true;
}
if (xpathExpression != null || containsSearchExpression) {
// that means that we have dynamic selects
// read the static choices from the options sheet
List<SelectChoice> staticChoices = questionDef.getChoices();
for (int index = 0; index < staticChoices.size(); index++) {
SelectChoice selectChoice = staticChoices.get(index);
String selectChoiceValue = selectChoice.getValue();
if (ExternalDataUtil.isAnInteger(selectChoiceValue)) {
Selection selection = selectChoice.selection();
switch(questionDef.getControlType()) {
case Constants.CONTROL_SELECT_ONE:
{
if (selectChoiceValue.equals(textVal)) {
// we just need to make sure, so we will override that.
if (questionDef.getControlType() == Constants.CONTROL_SELECT_ONE) {
// we don't need another, just return the static choice.
return new SelectOneData(selection);
}
}
break;
}
case Constants.CONTROL_SELECT_MULTI:
{
// we should search in a potential comma-separated string of
// values for a match
// copied from org.javarosa.xform.util.XFormAnswerDataParser
// .getSelections()
List<String> textValues = DateUtils.split(textVal, XFormAnswerDataSerializer.DELIMITER, true);
if (textValues.contains(textVal)) {
// choice.
if (selectChoiceValue.equals(textVal)) {
// this means that the user selected ONLY the static
// answer, so just return that
List<Selection> customSelections = new ArrayList<Selection>();
customSelections.add(selection);
return new SelectMultiData(customSelections);
} else {
// we will ignore it for now since we will return that
// selection together with the dynamic ones.
}
}
break;
}
default:
{
// There is a bug if we get here, so let's throw an Exception
throw createBugRuntimeException(treeElement, textVal);
}
}
} else {
switch(questionDef.getControlType()) {
case Constants.CONTROL_SELECT_ONE:
{
// the default implementation will search for the "textVal"
// (saved answer) inside the static choices.
// Since we know that there isn't such, we just wrap the textVal
// in a virtual choice in order to
// create a SelectOneData object to be used as the IAnswer to the
// TreeElement.
// (the caller of this function is searching for such an answer
// to populate the in-memory model.)
SelectChoice customSelectChoice = new SelectChoice(textVal, textVal, false);
customSelectChoice.setIndex(index);
return new SelectOneData(customSelectChoice.selection());
}
case Constants.CONTROL_SELECT_MULTI:
{
// we should create multiple selections and add them to the pile
List<SelectChoice> customSelectChoices = createCustomSelectChoices(textVal);
List<Selection> customSelections = new ArrayList<Selection>();
for (SelectChoice customSelectChoice : customSelectChoices) {
customSelections.add(customSelectChoice.selection());
}
return new SelectMultiData(customSelections);
}
default:
{
// There is a bug if we get here, so let's throw an Exception
throw createBugRuntimeException(treeElement, textVal);
}
}
}
}
// if we get there then that means that we have a bug
throw createBugRuntimeException(treeElement, textVal);
}
}
// default behavior matches original behavior (for static selects, etc.)
return super.resolveAnswer(textVal, treeElement, formDef);
}
use of org.javarosa.core.model.data.helper.Selection in project collect by opendatakit.
the class GridMultiWidgetTest method getAnswerShouldReflectWhichSelectionsWereMade.
@Test
public void getAnswerShouldReflectWhichSelectionsWereMade() {
GridMultiWidget widget = getWidget();
assertNull(widget.getAnswer());
List<SelectChoice> selectChoices = getSelectChoices();
List<String> selectedValues = new ArrayList<>();
boolean atLeastOneSelected = false;
for (int i = 0; i < widget.selected.length; i++) {
boolean shouldBeSelected = random.nextBoolean();
widget.selected[i] = shouldBeSelected;
atLeastOneSelected = atLeastOneSelected || shouldBeSelected;
if (shouldBeSelected) {
SelectChoice selectChoice = selectChoices.get(i);
selectedValues.add(selectChoice.getValue());
}
}
// null answer case:
if (!atLeastOneSelected) {
int randomIndex = (Math.abs(random.nextInt()) % widget.selected.length);
widget.selected[randomIndex] = true;
SelectChoice selectChoice = selectChoices.get(randomIndex);
selectedValues.add(selectChoice.getValue());
}
SelectMultiData answer = (SelectMultiData) widget.getAnswer();
@SuppressWarnings("unchecked") List<Selection> answerSelections = (List<Selection>) answer.getValue();
List<String> answerValues = selectionsToValues(answerSelections);
for (String selectedValue : selectedValues) {
assertTrue(answerValues.contains(selectedValue));
}
}
Aggregations