package gueei.binding;
import java.util.ArrayList;
import java.util.Collection;
import gueei.binding.IObservable;
import gueei.binding.Observable;
import gueei.binding.Observer;
/**
* tracks for modification for the given dependents
*
* you have to enable tracking by enableTracking(true)
* and you have to reset the modify state by calling resetModified()
*
*/
public class ModificationObservable extends Observable<Boolean> implements Observer {
protected IObservable<?>[] mDependents;
public ModificationObservable(IObservable<?>... dependents) {
super(Boolean.class);
for(IObservable<?> o : dependents){
o.subscribe(this);
}
this.mDependents = dependents;
this.onPropertyChanged(null, new ArrayList<Object>());
}
// This is provided in case the constructor can't be used.
// Not intended for normal usage
public void addDependents(IObservable<?>... dependents){
IObservable<?>[] temp = mDependents;
mDependents = new IObservable<?>[temp.length + dependents.length];
int len = temp.length;
for(int i=0; i<len; i++){
mDependents[i] = temp[i];
}
int len2 = dependents.length;
for(int i=0; i<len2; i++){
mDependents[i+len] = dependents[i];
dependents[i].subscribe(this);
}
this.onPropertyChanged(null, new ArrayList<Object>());
}
public final void onPropertyChanged(IObservable<?> prop,
Collection<Object> initiators) {
set(true);
initiators.add(this);
this.notifyChanged(initiators);
}
private boolean isTracking = false;
@Override
public Boolean get() {
if(!isTracking)
return false;
return super.get();
}
public void resetModified() {
setWithoutNotify(false);
}
public void enableTracking(boolean enabled) {
isTracking = enabled;
if( isTracking )
resetModified();
}
public Boolean isTrackingEnabled() {
return isTracking;
}
}