package cri.sanity.pref; import android.content.Context; import android.preference.ListPreference; import android.preference.Preference; import android.preference.Preference.OnPreferenceChangeListener; import android.util.AttributeSet; import cri.sanity.*; public class PList extends ListPreference implements OnPreferenceChangeListener { private OnPreferenceChangeListener listener = null; private CharSequence sum = null; public PList(Context ctx) { super(ctx); init(); } public PList(Context ctx, AttributeSet attrs) { super(ctx, attrs); init(); update(); } //---- ListPreference override @Override public void setValue(String val) { super.setValue(val); update(findEntry(val)); } @Override public void setValueIndex(int idx) { super.setValueIndex(idx); update(getEntryValues()[idx]); } @Override public void setSummary(int id) { super.setSummary(sum = A.s(id)); } @Override public void setSummary(CharSequence text) { super.setSummary(sum = text); } @Override public OnPreferenceChangeListener getOnPreferenceChangeListener() { return listener; } @Override public void setOnPreferenceChangeListener(OnPreferenceChangeListener l) { listener = l; } @Override public boolean onPreferenceChange(Preference p, Object o) { if(listener!=null && !listener.onPreferenceChange(p, o)) return false; update(findEntry(o)); if(isWrap()) A.putc(getWrapKey(), Integer.parseInt((String)o)); // wrap key found: convert to integer return true; } //---- public api public final void update() { update(getEntry()); } public final CharSequence findEntry(Object findValue) { if(findValue == null) return null; CharSequence[] vals = getEntryValues(); if(vals == null) return null; final int n = vals.length; for(int i=0; i<n; i++) if(vals[i].equals(findValue)) return getEntries()[i]; return null; } public final boolean isWrap() { final String key = getKey(); return key!=null && key.endsWith(K.WS); } public final String getWrapKey() { final String key = getKey(); return key.substring(0, key.length()-K.WS.length()); } public final int getValueInt() { try { return Integer.parseInt(getValue()); } catch(Exception e) { return 0; } } public final void setValue(int v) { setValue(Integer.toString(v)); } //---- private api private void init() { super.setOnPreferenceChangeListener(this); if(!isWrap()) return; setPersistent(false); final String k = getWrapKey(); if(A.has(k)) super.setValue(Integer.toString(A.geti(k))); } private void update(Object entry) { if(sum == null) sum = getSummary(); final String e = entry==null? "" : " ("+entry+')'; super.setSummary(sum + e); } }