package org.azavea.otm.fields;
import android.app.Activity;
import android.content.Intent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;
import org.azavea.helpers.Logger;
import org.azavea.otm.R;
import org.azavea.otm.data.Plot;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
public class FieldGroup {
private String title;
protected Map<String, Field> fields = new LinkedHashMap<>();
public static enum DisplayMode {VIEW, EDIT}
protected FieldGroup() {
}
public FieldGroup(String title) {
this.title = title;
}
public FieldGroup(JSONObject groupDefinition,
Map<String, JSONObject> fieldDefinitions) throws JSONException {
this.title = groupDefinition.optString("header");
JSONArray fieldKeys = groupDefinition.getJSONArray("field_keys");
for (int i = 0; i < fieldKeys.length(); i++) {
String key = fieldKeys.getString(i);
addField(key, fieldDefinitions.get(key));
}
}
public void addFields(Map<String, Field> fields) {
this.fields = fields;
}
public void addField(String key, JSONObject fieldDef) {
if (fieldDef == null) {
Logger.warning("Missing field definition for display field: " + key);
return;
}
this.fields.put(key, Field.makeField(fieldDef));
}
public void addField(Field field) {
this.fields.put(field.key, field);
}
public String getTitle() {
return title;
}
public Map<String, Field> getFields() {
return fields;
}
private View render(LayoutInflater layout, Plot model, DisplayMode mode, Activity activity, ViewGroup parent) {
View container = layout.inflate(R.layout.plot_field_group, parent, false);
LinearLayout group = (LinearLayout) container.findViewById(R.id.field_group);
View fieldView;
int renderedFieldCount = 0;
((TextView) group.findViewById(R.id.group_name)).setText(this.title);
if (this.title != null) {
for (Field field : fields.values()) {
try {
fieldView = null;
switch (mode) {
case VIEW:
fieldView = field.renderForDisplay(layout, model, activity, group);
break;
case EDIT:
fieldView = field.renderForEdit(layout, model, activity, group);
break;
}
if (fieldView != null) {
renderedFieldCount++;
group.addView(fieldView);
}
} catch (JSONException e) {
Logger.error("Error rendering field '" + field.key + "'", e);
}
}
}
if (renderedFieldCount > 0) {
return group;
} else {
return null;
}
}
/**
* Render a field group and its child fields for viewing
*/
public View renderForDisplay(LayoutInflater layout, Plot model, Activity activity, ViewGroup parent) {
return render(layout, model, DisplayMode.VIEW, activity, parent);
}
/**
* Render a field group and its child fields for editing
*/
public View renderForEdit(LayoutInflater layout, Plot model, Activity activity, ViewGroup parent) {
return render(layout, model, DisplayMode.EDIT, activity, parent);
}
public void update(Plot plot) throws Exception {
for (Field field : fields.values()) {
field.update(plot);
}
}
public void receiveActivityResult(int resultCode, Intent data, Activity activity) {
Set<String> keys = data.getExtras().keySet();
for (String key : keys) {
if (fields.containsKey(key)) {
fields.get(key).receiveActivityResult(resultCode, data);
}
}
}
}