Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  package com.WazaBe.HoloEverywhere;
  
 import java.util.List;
 import java.util.Map;
 
 
 public abstract class Setting<T extends Setting<T>> {
 	public static class BooleanProperty extends Property<Boolean> {
 		protected void onSetDefaultValue(SettingProperty settingProperty) {
 			setValue(settingProperty.defaultBoolean());
 		}
 	}
 
 	public static class EnumProperty<T extends Enum<T>> extends Property<T> {
 		private String defaultValue;
 
 		@SuppressWarnings("unchecked")
 		protected void onSetDefaultValue(SettingProperty settingProperty) {
 			 = settingProperty.defaultEnum();
 			Class<?> t = settingProperty.enumClass();
 			Class<T> clazz = t == NullEnum.class ? null : (Class<T>) t;
 			if (clazz != null) {
 				setEnumClass(clazz);
 			}
 		}
 
 		@SuppressWarnings("unchecked")
 		public void setEnumClass(Class<T> clazz) {
 			if ( != null) {
 				try {
 					Method method = clazz.getMethod("valueOf"String.class);
 					method.setAccessible(true);
 					setValue((T) method.invoke(null));
 				} catch (Exception e) {
 					Log.w(."Error on getting enum value"e);
 				}
 			}
 		}
 	}
 
 	public static class IntegerProperty extends Property<Integer> {
 		protected void onSetDefaultValue(SettingProperty settingProperty) {
 			setValue(settingProperty.defaultInt());
 		}
 	}
 
 	private static enum NullEnum {
 
 	}
 
 	public static class Property<Z> {
 		private Setting<?> setting;
 		private Z value;
 		private boolean wasAttach = false;
 
 		public void attach(Setting<?> setting) {
 			if (setting != null) {
 				setting.attach(this);
 			}
 		}
 
 		public void detach() {
 			if ( != null) {
 				.detach(this);
 			}
 		}
 
 		public final Setting<?> getSetting() {
 			return ;
 		}
 
 		public Z getValue() {
 			return ;
 		}
 
 		public boolean isValid() {
 			return true;
 		}
 
 		public final void notifyOnChange() {
 			if ( != null) {
 			}
 		}
 
 		protected void onAttach(Setting<?> setting) {
 
		}
		protected void onDetach() {
		}
		protected void onSetDefaultValue(SettingProperty settingProperty) {
		}
		private final void setSetting(Setting<?> setting) {
			this. = setting;
			if (setting != null) {
				if () {
				}
				onAttach(setting);
				 = true;
else if () {
				 = false;
			}
		}
		public void setValue(Z value) {
			if (this. != value) {
				this. = value;
			}
		}
	}
	public static interface SettingListener<T extends Setting<T>> {
		public void onAttach(T setting);
		public void onDetach(T setting);
		public void onPropertyChange(T settingProperty<?> property);
	}
	public static @interface SettingProperty {
		public boolean create() default false;
		public boolean defaultBoolean() default false;
		public String defaultEnum() default "";
		public int defaultInt() default 0;
		public String defaultString() default "";
		public Class<? extends Enum<?>> enumClass() default NullEnum.class;
	}
	public static class StringProperty extends Property<String> {
		protected void onSetDefaultValue(SettingProperty settingProperty) {
			setValue(settingProperty.defaultString());
		}
	}
	private static final Map<Class<? extends Setting<?>>, Setting<?>> settingMap = new HashMap<Class<? extends Setting<?>>, Setting<?>>();
	private static final String TAG = Setting.class.getSimpleName();
	public static <T extends Setting<T>> void addListener(Class<T> clazz,
			SettingListener<T> settingListener) {
		Setting.get(clazz).addListener(settingListener);
	}
	@SuppressWarnings("unchecked")
	public static <T extends Setting<T>> T get(Class<T> clazz) {
			try {
t = clazz.newInstance();
				t.init();
catch (Exception e) {
				Log.e(."Error init setting instance"e);
			}
		}
		return (T) ..get(clazz);
	}
	public static <T extends Setting<T>> void removeListener(Class<T> clazz,
			SettingListener<T> settingListener) {
			Setting.get(clazz).removeListener(settingListener);
		}
	}
	private final List<SettingListener<T>> listeners = new ArrayList<SettingListener<T>>();
	private final List<Property<?>> propertyList = new ArrayList<Property<?>>();
	@SuppressWarnings("unchecked")
	public final T addListener(SettingListener<T> listener) {
		if (listener == null) {
			throw new IllegalArgumentException("SettingListener can't be null");
		}
		if (!.contains(listener)) {
			.add(listener);
			listener.onAttach((T) this);
else {
			.remove(listener);
			.add(listener);
		}
		return (T) this;
	}
	@SuppressWarnings("unchecked")
	public final T attach(Property<?> property) {
		if (property == null || !property.isValid()) {
			throw new RuntimeException("Property not valid");
		}
		if (property.getSetting() != null && property.getSetting() != this) {
			throw new RuntimeException("Property already attached to "
property.getSetting().getClass().getName());
		}
		property.setSetting(this);
		.add(property);
		return (T) this;
	}
	@SuppressWarnings("unchecked")
	public final T detach(Property<?> property) {
		if (property != null) {
			property.setSetting(null);
		}
		return (T) this;
	}
	private Field[] getFields() {
		try {
catch (Exception e) {
			return getClass().getFields();
		}
	}
	protected final void init() {
		for (Field field : getFields()) {
			try {
				field.setAccessible(true);
					SettingProperty settingProperty = field
					if (settingProperty.create()) {
						field.set(thisfield.getType().newInstance());
					}
					Property<?> property = (Property<?>) field.get(this);
					property.onSetDefaultValue(settingProperty);
					attach(property);
				}
catch (Exception e) {
				Log.e(."Error on processing property"e);
			}
		}
	}
	protected void onInit() {
	}
	@SuppressWarnings("unchecked")
	protected void onPropertyChange(Property<?> property) {
		for (SettingListener<T> listener : ) {
			try {
				listener.onPropertyChange((T) thisproperty);
catch (RuntimeException e) {
				Log.w(."Listener error"e);
			}
		}
	}
	@SuppressWarnings("unchecked")
	public final T removeListener(SettingListener<T> listener) {
		if (listener == null) {
			throw new IllegalArgumentException("SettingListener can't be null");
		}
		if (.contains(listener)) {
			listener.onDetach((T) this);
			.remove(listener);
		}
		return (T) this;
	}
New to GrepCode? Check out our FAQ X