Search in sources :

Example 11 with Selection

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);
    }
}
Also used : SelectMultiData(org.javarosa.core.model.data.SelectMultiData) ExternalSelectChoice(org.odk.collect.android.external.ExternalSelectChoice) SelectChoice(org.javarosa.core.model.SelectChoice) Selection(org.javarosa.core.model.data.helper.Selection) ArrayList(java.util.ArrayList) SuppressLint(android.annotation.SuppressLint)

Example 12 with Selection

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);
}
Also used : Selection(org.javarosa.core.model.data.helper.Selection)

Example 13 with Selection

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);
    }
}
Also used : SelectMultiData(org.javarosa.core.model.data.SelectMultiData) SelectChoice(org.javarosa.core.model.SelectChoice) Selection(org.javarosa.core.model.data.helper.Selection) ArrayList(java.util.ArrayList) SuppressLint(android.annotation.SuppressLint)

Example 14 with Selection

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);
}
Also used : SelectOneData(org.javarosa.core.model.data.SelectOneData) SelectChoice(org.javarosa.core.model.SelectChoice) Selection(org.javarosa.core.model.data.helper.Selection) XPathFuncExpr(org.javarosa.xpath.expr.XPathFuncExpr) SelectMultiData(org.javarosa.core.model.data.SelectMultiData) ArrayList(java.util.ArrayList) List(java.util.List) QuestionDef(org.javarosa.core.model.QuestionDef)

Example 15 with Selection

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));
    }
}
Also used : SelectChoice(org.javarosa.core.model.SelectChoice) Selection(org.javarosa.core.model.data.helper.Selection) ArrayList(java.util.ArrayList) SelectMultiData(org.javarosa.core.model.data.SelectMultiData) List(java.util.List) ArrayList(java.util.ArrayList) GeneralSelectMultiWidgetTest(org.odk.collect.android.widgets.base.GeneralSelectMultiWidgetTest) Test(org.junit.Test)

Aggregations

Selection (org.javarosa.core.model.data.helper.Selection)26 SelectMultiData (org.javarosa.core.model.data.SelectMultiData)14 ArrayList (java.util.ArrayList)13 SelectChoice (org.javarosa.core.model.SelectChoice)12 List (java.util.List)8 SelectOneData (org.javarosa.core.model.data.SelectOneData)8 QuestionDef (org.javarosa.core.model.QuestionDef)4 Constraint (org.javarosa.core.model.condition.Constraint)4 IAnswerData (org.javarosa.core.model.data.IAnswerData)4 SuppressLint (android.annotation.SuppressLint)3 NonNull (android.support.annotation.NonNull)2 EvaluationContext (org.javarosa.core.model.condition.EvaluationContext)2 ConstraintHint (org.javarosa.core.model.condition.pivot.ConstraintHint)2 DateData (org.javarosa.core.model.data.DateData)2 DateTimeData (org.javarosa.core.model.data.DateTimeData)2 TreeElement (org.javarosa.core.model.instance.TreeElement)2 TreeReference (org.javarosa.core.model.instance.TreeReference)2 Test (org.junit.Test)2 ImmutableList (com.google.common.collect.ImmutableList)1 BigDecimal (java.math.BigDecimal)1