protected IAnswerData getCurrentAnswer() { IAnswerData current = mPrompt.getAnswerValue(); if (current == null) { return null; } return getTemplate().cast(current.uncast()); }
public static Object getValue(String xpath, TreeReference context, FormInstance tree) { TreeElement node = tree.resolveReference(ref(xpath).contextualize(context)); if (node == null) { throw new RuntimeException( "Could not find node [" + xpath + "] when parsing saved instance!"); } if (node.isRelevant()) { IAnswerData val = node.getValue(); return (val == null ? null : val.getValue()); } else { return null; } }
private Integer getIntegerAnswerValue() { IAnswerData dataHolder = mPrompt.getAnswerValue(); Integer d = null; if (dataHolder != null) { Object dataValue = dataHolder.getValue(); if (dataValue != null) { if (dataValue instanceof Double) { d = Integer.valueOf(((Double) dataValue).intValue()); } else { d = (Integer) dataValue; } } } return d; }
private Double getDoubleAnswerValue() { IAnswerData dataHolder = mPrompt.getAnswerValue(); Double d = null; if (dataHolder != null) { Object dataValue = dataHolder.getValue(); if (dataValue != null) { if (dataValue instanceof Integer) { d = Double.valueOf(((Integer) dataValue).intValue()); } else { d = (Double) dataValue; } } } return d; }
private void attachControlsToInstanceData(TreeElement node) { for (int i = 0; i < node.getNumChildren(); i++) { attachControlsToInstanceData(node.getChildAt(i)); } IAnswerData val = node.getValue(); Vector selections = null; if (val instanceof SelectOneData) { selections = new Vector(); selections.addElement(val.getValue()); } else if (val instanceof SelectMultiData) { selections = (Vector) val.getValue(); } if (selections != null) { QuestionDef q = findQuestionByRef(node.getRef(), this); if (q == null) { throw new RuntimeException( "FormDef.attachControlsToInstanceData: can't find question to link"); } if (q.getDynamicChoices() != null) { // droos: i think we should do something like initializing the itemset here, so that default // answers // can be linked to the selectchoices. however, there are complications. for example, the // itemset might // not be ready to be evaluated at form initialization; it may require certain questions to // be answered // first. e.g., if we evaluate an itemset and it has no choices, the xform engine will throw // an error // itemset TODO } for (int i = 0; i < selections.size(); i++) { Selection s = (Selection) selections.elementAt(i); s.attachChoice(q); } } }
public String getMartusAnswerStringFromQuestion( IAnswerData answer, QuestionDef question, final int dataType) throws Exception { String answerAsString = answer.getDisplayText(); if (dataType == Constants.DATATYPE_DATE) { answerAsString = formatDateToMartusDateFormat(answerAsString); } else if (shouldTreatSingleItemChoiceListAsBooleanField(dataType, question) && answerAsString.isEmpty()) { answerAsString = FieldSpec.FALSESTRING; } else if (dataType == Constants.DATATYPE_CHOICE) { List<SelectChoice> list = question.getChoices(); for (int i = 0; i < list.size(); ++i) { SelectChoice choice = list.get(i); if (choice.getValue().equals(answerAsString)) { answerAsString = choice.getLabelInnerText(); break; } } } return answerAsString; }
public void copyItemsetAnswer(QuestionDef q, TreeElement targetNode, IAnswerData data) throws InvalidReferenceException { ItemsetBinding itemset = q.getDynamicChoices(); TreeReference targetRef = targetNode.getRef(); TreeReference destRef = itemset.getDestRef().contextualize(targetRef); Vector<Selection> selections = null; Vector<String> selectedValues = new Vector<String>(); if (data instanceof SelectMultiData) { selections = (Vector<Selection>) data.getValue(); } else if (data instanceof SelectOneData) { selections = new Vector<Selection>(); selections.addElement((Selection) data.getValue()); } if (itemset.valueRef != null) { for (int i = 0; i < selections.size(); i++) { selectedValues.addElement(selections.elementAt(i).choice.getValue()); } } // delete existing dest nodes that are not in the answer selection Hashtable<String, TreeElement> existingValues = new Hashtable<String, TreeElement>(); Vector<TreeReference> existingNodes = getInstance().expandReference(destRef); for (int i = 0; i < existingNodes.size(); i++) { TreeElement node = getInstance().resolveReference(existingNodes.elementAt(i)); if (itemset.valueRef != null) { String value = itemset .getRelativeValue() .evalReadable( this.getInstance(), new EvaluationContext(exprEvalContext, node.getRef())); if (selectedValues.contains(value)) { existingValues.put(value, node); // cache node if in selection and already exists } } // delete from target targetNode.removeChild(node); } // copy in nodes for new answer; preserve ordering in answer for (int i = 0; i < selections.size(); i++) { Selection s = selections.elementAt(i); SelectChoice ch = s.choice; TreeElement cachedNode = null; if (itemset.valueRef != null) { String value = ch.getValue(); if (existingValues.containsKey(value)) { cachedNode = existingValues.get(value); } } if (cachedNode != null) { cachedNode.setMult(i); targetNode.addChild(cachedNode); } else { getInstance().copyItemsetNode(ch.copyNode, destRef, this); } } triggerTriggerables( destRef); // trigger conditions that depend on the creation of these new nodes initializeTriggerables(destRef); // initialize conditions for the node (and sub-nodes) // not 100% sure this will work since destRef is ambiguous as the last step, but i think it's // supposed to work }
@SuppressWarnings("unchecked") public GridMultiWidget(Context context, FormEntryPrompt prompt, int numColumns) { super(context, prompt); mItems = prompt.getSelectChoices(); mPrompt = prompt; selected = new boolean[mItems.size()]; choices = new String[mItems.size()]; gridview = new GridView(context); imageViews = new ImageView[mItems.size()]; maxColumnWidth = -1; this.numColumns = numColumns; for (int i = 0; i < mItems.size(); i++) { imageViews[i] = new ImageView(getContext()); } // Build view for (int i = 0; i < mItems.size(); i++) { SelectChoice sc = mItems.get(i); // Read the image sizes and set maxColumnWidth. This allows us to make sure all of our // columns are going to fit String imageURI = prompt.getSpecialFormSelectChoiceText(sc, FormEntryCaption.TEXT_FORM_IMAGE); if (imageURI != null) { choices[i] = imageURI; String imageFilename; try { imageFilename = ReferenceManager._().DeriveReference(imageURI).getLocalURI(); final File imageFile = new File(imageFilename); if (imageFile.exists()) { Display display = ((WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE)) .getDefaultDisplay(); int screenWidth = display.getWidth(); int screenHeight = display.getHeight(); Bitmap b = FileUtils .getBitmapScaledToDisplay(imageFile, screenHeight, screenWidth); if (b != null) { if (b.getWidth() > maxColumnWidth) { maxColumnWidth = b.getWidth(); } } } } catch (InvalidReferenceException e) { Log.e("GridWidget", "image invalid reference exception"); e.printStackTrace(); } } else { choices[i] = prompt.getSelectChoiceText(sc); } } // Use the custom image adapter and initialize the grid view ImageAdapter ia = new ImageAdapter(getContext(), choices); gridview.setAdapter(ia); gridview.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View v, int position, long id) { if (selected[position]) { selected[position] = false; imageViews[position].setBackgroundColor(Color.WHITE); Collect.getInstance().getActivityLogger().logInstanceAction(this, "onItemClick.deselect", mItems.get(position).getValue(), mPrompt.getIndex()); } else { selected[position] = true; imageViews[position].setBackgroundColor(Color.rgb(orangeRedVal, orangeGreenVal, orangeBlueVal)); Collect.getInstance().getActivityLogger().logInstanceAction(this, "onItemClick.select", mItems.get(position).getValue(), mPrompt.getIndex()); } } }); // Read the screen dimensions and fit the grid view to them. It is important that the grid // view // knows how far out it can stretch. Display display = ((WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE)) .getDefaultDisplay(); int screenWidth = display.getWidth(); int screenHeight = display.getHeight(); GridView.LayoutParams params = new GridView.LayoutParams(screenWidth - 5, screenHeight - 5); gridview.setLayoutParams(params); // Use the user's choice for num columns, otherwise automatically decide. if (numColumns > 0) { gridview.setNumColumns(numColumns); } else { gridview.setNumColumns(GridView.AUTO_FIT); } gridview.setColumnWidth(maxColumnWidth); gridview.setHorizontalSpacing(2); gridview.setVerticalSpacing(2); gridview.setGravity(Gravity.LEFT); gridview.setStretchMode(GridView.NO_STRETCH); // Fill in answer IAnswerData answer = prompt.getAnswerValue(); Vector<Selection> ve; if ((answer == null) || (answer.getValue() == null)) { ve = new Vector<Selection>(); } else { ve = (Vector<Selection>) answer.getValue(); } for (int i = 0; i < choices.length; ++i) { String value = mItems.get(i).getValue(); boolean found = false; for (Selection s : ve) { if (value.equals(s.getValue())) { found = true; break; } } selected[i] = found; if (selected[i]) { imageViews[i].setBackgroundColor(Color.rgb(orangeRedVal, orangeGreenVal, orangeBlueVal)); } else { imageViews[i].setBackgroundColor(Color.WHITE); } } addView(gridview); }