package org.kvj.bravo7.form;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.view.View;
public class FormController {
class Pair {
WidgetBundleAdapter<?, ?> viewAdapter;
}
private static final String TAG = "Form";
private Map<String, Pair> pairs = new LinkedHashMap<String, Pair>();
private Map<String, Object> originalValues = new HashMap<String, Object>();
protected View view;
public FormController(View view) {
this.view = view;
}
public <V, T> void add(WidgetBundleAdapter<V, T> viewAdapter, String name) {
Pair pair = new Pair();
pair.viewAdapter = viewAdapter;
pairs.put(name, pair);
viewAdapter.key = name;
viewAdapter.setController(this);
}
private void loadDefaultValues(Bundle values) {
originalValues.clear();
for (String name : pairs.keySet()) {
Pair pair = pairs.get(name);
originalValues.put(name, pair.viewAdapter.get(name, values));
// Log.i(TAG, "Load origins: " + name + " = " +
// pair.viewAdapter.get(name, values));
}
}
private void loadValues(Bundle data) {
if (null != data) {
for (String name : pairs.keySet()) {
Pair pair = pairs.get(name);
pair.viewAdapter.restore(name, data);
// Log.i(TAG, "Load: " + name + " = " +
// pair.viewAdapter.get(name, data));
}
}
}
public void load(Bundle dialogArguments, Bundle data) {
Bundle values = new Bundle();
if (null != dialogArguments) {
values = dialogArguments;
}
loadDefaultValues(values);
if (null == data) {
data = values;
}
// Set values to views
loadValues(data);
}
public void load(FragmentActivity activity, Bundle data) {
Bundle values = new Bundle();
if (null != activity.getIntent() && null != activity.getIntent().getExtras()) {
values = activity.getIntent().getExtras();
}
loadDefaultValues(values);
if (null == data) {
data = values;
}
// Set values to views
loadValues(data);
}
public void save(Bundle data) {
for (String name : pairs.keySet()) {
Pair pair = pairs.get(name);
pair.viewAdapter.save(name, data);
}
}
public <T> T getValue(String name, Class<T> cl) {
Pair p = pairs.get(name);
if (null == p) {
return null;
}
return (T) p.viewAdapter.getWidgetValue();
}
public <T extends WidgetBundleAdapter<?, ?>> T getAdapter(String name, Class<T> cl) {
Pair p = pairs.get(name);
if (null == p) {
return null;
}
return (T) p.viewAdapter;
}
public boolean changed() {
for (String name : pairs.keySet()) {
Pair pair = pairs.get(name);
Object value = pair.viewAdapter.getWidgetValue();
Object orig = originalValues.get(name);
// Log.i(TAG, "Load: " + name + " = " + orig + " - " + value);
if (null != value && null != orig && !value.equals(orig)) {
return true;
}
}
return false;
}
}