package com.radicaldynamic.groupinform.adapters;
import java.util.ArrayList;
import java.util.Iterator;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.radicaldynamic.groupinform.R;
import com.radicaldynamic.groupinform.utilities.StringUtils;
import com.radicaldynamic.groupinform.xform.Field;
import com.radicaldynamic.groupinform.xform.XForm;
public class FormBuilderFieldListAdapter extends ArrayAdapter<Field>
{
private ArrayList<Field> mFields;
private Context mContext;
public FormBuilderFieldListAdapter(Context context, ArrayList<Field> fieldList) {
super(context, R.layout.fb_field_row, fieldList);
mFields = fieldList;
mContext = context;
}
public View getView(int position, View convertView, ViewGroup parent)
{
View row = convertView;
Field field = mFields.get(position);
ArrayList<String> details = new ArrayList<String>();
if (row == null) {
LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = inflater.inflate(R.layout.fb_field_row, parent, false);
}
// If these objects are not reset to suitable defaults they might be reused with undesired side effects
TextView labelView = (TextView) row.findViewById(R.id.label);
TextView detailView = (TextView) row.findViewById(R.id.details);
ImageView fieldTypeView = (ImageView) row.findViewById(R.id.field_type);
/*
* Shorten label to an appropriate length
*
* TODO: this might not be suitable on different devices, resolutions, orientations etc.
*/
if (field.getLabel().toString().length() > 30) {
labelView.setText(field.getLabel().toString().substring(0, 27) + "...");
} else {
if (field.getLabel().toString().length() == 0)
labelView.setText("Label missing!");
else
labelView.setText(field.getLabel().toString());
}
/*
* Customize the row according to per-field specifics
*/
if (field.getType().equals("group")) {
fieldTypeView.setImageDrawable(getDrawable(R.drawable.element_group));
// Special logic to hide the complexity of repeated elements
if (Field.isRepeatedGroup(field)) {
if (field.getRepeat().getChildren().size() == 1)
details.add("Repeats " + field.getRepeat().getChildren().size() + " field");
else
details.add("Repeats " + field.getRepeat().getChildren().size() + " fields");
} else {
if (field.getAttributes().containsKey(XForm.Attribute.APPEARANCE) &&
field.getAttributes().get(XForm.Attribute.APPEARANCE).equals(XForm.Value.FIELD_LIST))
{
details.add("Displays " + field.getChildren().size() + " field(s) on one screen");
} else {
if (field.getChildren().size() == 1)
details.add("Contains " + field.getChildren().size() + " field");
else
details.add("Contains " + field.getChildren().size() + " fields");
}
}
} else if (field.getType().equals("input")) {
Drawable icon = getDrawable(R.drawable.element_string);
try {
String specificType = field.getBind().getType();
if (specificType.equals("barcode")) {
icon = getDrawable(R.drawable.element_barcode);
} else if (specificType.equals("date")) {
icon = getDrawable(R.drawable.element_calendar);
details.add("Pick date");
} else if (specificType.equals("dateTime")) {
icon = getDrawable(R.drawable.element_calendar);
details.add("Pick date & time");
} else if (specificType.equals("decimal")) {
icon = getDrawable(R.drawable.element_number);
} else if (specificType.equals("geopoint")) {
icon = getDrawable(R.drawable.element_location);
if (field.getAttributes().containsKey(XForm.Attribute.APPEARANCE)
&& field.getAttributes().get(XForm.Attribute.APPEARANCE).equals(XForm.Value.MAP))
details.add("With map");
} else if (specificType.equals("int")) {
icon = getDrawable(R.drawable.element_number);
} else if (specificType.equals("time")) {
icon = getDrawable(R.drawable.element_calendar);
details.add("Pick time");
}
} catch (NullPointerException e){
// TODO: is this really a problem?
} finally {
fieldTypeView.setImageDrawable(icon);
}
} else if (field.getType().equals("select")) {
fieldTypeView.setImageDrawable(getDrawable(R.drawable.element_selectmulti));
details.add(field.getChildren().size() + " items");
} else if (field.getType().equals("select1")) {
fieldTypeView.setImageDrawable(getDrawable(R.drawable.element_selectsingle));
details.add(field.getChildren().size() + " items");
} else if (field.getType().equals("trigger")) {
fieldTypeView.setImageDrawable(getDrawable(R.drawable.element_noicon));
details.add("Trigger");
} else if (field.getType().equals("upload")) {
if (field.getAttributes().get(XForm.Attribute.MEDIA_TYPE).contains("draw")) {
String appearance = field.getAttributes().get(XForm.Attribute.APPEARANCE);
fieldTypeView.setImageDrawable(getDrawable(R.drawable.element_draw));
if (appearance == null) {
details.add("Sketch");
} else {
details.add(StringUtils.ucfirst(appearance));
}
} else {
String mediaType = field.getAttributes().get(XForm.Attribute.MEDIA_TYPE);
mediaType = mediaType.substring(0, 1).toUpperCase() + mediaType.substring(1, mediaType.indexOf("/")) + " media";
fieldTypeView.setImageDrawable(getDrawable(R.drawable.element_media));
details.add(mediaType);
}
}
try {
if (field.getBind().isRequired()) {
details.add("Required");
}
} catch (NullPointerException e) {
// TODO: is this really a problem?
}
// Build details line
Iterator<String> it = details.iterator();
// Suitable default
String detailText = "";
while (it.hasNext()) {
String d = it.next();
if (detailText.length() > 0) {
detailText = detailText + ", " + d;
} else {
detailText = d;
}
}
detailView.setText(detailText);
return (row);
}
private Drawable getDrawable(int image)
{
return mContext.getResources().getDrawable(image);
}
}