package org.sana.android.procedure;
import java.util.ArrayList;
import java.util.List;
import org.sana.R;
import org.sana.android.util.SanaUtil;
import org.w3c.dom.Node;
import android.content.Context;
import android.content.res.Resources;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.Log;
import android.util.Xml;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.LinearLayout;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.ScrollView;
/**
* RadioElement is a ProcedureElement that can display a question along with
* multiple-choice radio box answers. Unlike a MultiSelectElement, only one
* answer can be selected at a time.
* <p/>
* <ul type="none">
* <li><b>Clinical Use </b> Wherever the CHW needs to be prompted to select
* one, and only one, value from a predefined set.</li>
* <li><b>Collects </b>Zero or more string values representing an item in the
* list of available answers delimited by TOKEN_DELIMITER.</li>
* </ul>
*
* @author Sana Development Team
*/
public class RadioElement extends SelectionElement {
protected static final String TAG = RadioElement.class.getSimpleName();
ArrayList<RadioButton> rblist;
RadioGroup mRadioGroup;
/** {@inheritDoc} */
@Override
public ElementType getType() {
return ElementType.RADIO;
}
/** {@inheritDoc} */
@Override
protected View createView(Context c) {
Log.i(TAG, "[" + id + "]createView()");
ScrollView radioView = new ScrollView(c);
mRadioGroup = new RadioGroup(c);
mRadioGroup.setOrientation(LinearLayout.VERTICAL);
rblist = new ArrayList<RadioButton>(values.length);
if(answer == null)
answer = "";
for(String value : values) {
Log.d(TAG, "..." + value +":" + getLabelFromValue(value));
RadioButton rb = new RadioButton(c);
rb.setText(getLabelFromValue(value));
rb.setTag(value);
if(value.equals(answer)) {
rb.setChecked(true);
}
rblist.add(rb);
mRadioGroup.addView(rb);
}
mRadioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
setAnswer(String.valueOf(group.findViewById(checkedId).getTag
()));
}
});
radioView.addView(mRadioGroup, new ViewGroup.LayoutParams(-1,-1));
return encapsulateQuestion(c, radioView);
}
@Override
public void setAnswer(String answer) {
Log.i(TAG, "[" + id + "]setAnswer() --> " + answer);
this.answer = answer;
if(isViewActive()) {
for(RadioButton r : rblist) {
if(TextUtils.isEmpty(answer))
continue;
r.setChecked((String.valueOf(r.getTag()).equals(this.answer))?
true:false);
}
}
}
@Override
public String getAnswer() {
Log.i(TAG, "[" + id + "]getAnswer()");
/*
boolean active = isViewActive();
// If visible get pressed item
if (active) {
Log.d(TAG, "...checked id " + mRadioGroup.getCheckedRadioButtonId
());
String value = "";
for (RadioButton r : rblist) {
value = (r.isChecked()) ? String.valueOf(r.getTag()) : value;
}
answer = value;
}
*/
return answer;
}
/** Default constructor */
private RadioElement(String id, String question, String answer,
String concept, String figure, String audio, String[] choices)
{
super(id,question,answer, concept, figure, audio, choices);
}
private RadioElement(String id, String question, String answer,
String concept, String figure, String audio,
String[] choices, String[] values)
{
super(id,question,answer, concept, figure, audio, choices, values);
}
/** @see ProcedureElement#fromXML(String, String, String, String, String, String, Node) */
public static RadioElement fromXML(String id, String question,
String answer, String concept, String figure, String audio,
Node node) throws ProcedureParseException
{
String choicesStr = SanaUtil.getNodeAttributeOrDefault(node,
"choices", "");
String valuesStr = SanaUtil.getNodeAttributeOrDefault(node, "values",
choicesStr);
return new RadioElement(id, question, answer, concept, figure, audio,
choicesStr.split(SelectionElement.TOKEN_DELIMITER),
valuesStr.split(SelectionElement.TOKEN_DELIMITER));
}
}