package org.seqcode.viz.preferences;
import java.util.*;
public interface PreferencesModel {
public Set<String> getKeys();
public Object getValue(String key);
public void setValue(String k, Object v);
public void addListener(PreferencesListener pl);
public void removeListener(PreferencesListener pl);
public static class Default implements PreferencesModel {
private LinkedHashMap<String,Object> values;
private LinkedList<PreferencesListener> listeners;
public Default() {
values = new LinkedHashMap<String,Object>();
listeners = new LinkedList<PreferencesListener>();
}
public void fireUpdatedEvent(Object src) {
PreferencesEvent pe = new PreferencesEvent(src, this);
for(PreferencesListener l : listeners) {
l.preferencesUpdated(pe);
}
}
public void fireCanceledEvent(Object src) {
PreferencesEvent pe = new PreferencesEvent(src, this);
for(PreferencesListener l : listeners) {
l.preferencesUpdateCanceled(pe);
}
}
public void setValue(String key, Object v) {
int sep = -1;
if((sep = key.indexOf(":")) != -1) {
String start = key.substring(0, sep);
String rest = key.substring(sep+1, key.length());
if(!values.containsKey(start)) {
values.put(start, new PreferencesModel.Default());
}
PreferencesModel inner = (PreferencesModel)values.get(start);
inner.setValue(rest, v);
} else {
values.put(key, v);
}
}
public void addListener(PreferencesListener pl) {
listeners.addLast(pl);
}
public Set<String> getKeys() {
LinkedHashSet<String> keys = new LinkedHashSet<String>();
for(String k : values.keySet()) {
Object val = values.get(k);
if(val instanceof PreferencesModel) {
PreferencesModel inner = (PreferencesModel)val;
for(String k2 : inner.getKeys()) {
keys.add(k + ":" + k2);
}
} else {
keys.add(k);
}
}
return keys;
}
public Object getValue(String key) {
int sep = -1;
if((sep = key.indexOf(":")) != -1) {
String start = key.substring(0, sep);
String rest = key.substring(sep+1, key.length());
PreferencesModel inner = (PreferencesModel)values.get(start);
return inner.getValue(rest);
} else {
return values.get(key);
}
}
public void removeListener(PreferencesListener pl) {
listeners.remove(pl);
}
}
}