package gueei.binding.viewAttributes.view; import java.util.Collection; import gueei.binding.DynamicObject; import gueei.binding.IObservable; import gueei.binding.Observable; import gueei.binding.Observer; public class ConditionalAnimationTrigger extends AnimationTrigger implements Observer{ private IObservable<?> mTrigger, mCondition; private IObservable<TriggerType> mType; private IObservable<? extends Integer> mId; public ConditionalAnimationTrigger(IObservable<? extends Integer> id, IObservable<?> trigger, IObservable<TriggerType> type, IObservable<?> condition) { mId = id; mTrigger = trigger; mType = type; mCondition = condition; mId.subscribe(this); mTrigger.subscribe(this); mType.subscribe(this); mCondition.subscribe(this); } public Object TriggerValue; public Object TriggerCondition; public TriggerType Type; private Object lastValue; private boolean lastTimeLarger = false; @SuppressWarnings({ "rawtypes", "unchecked" }) private void evaluateAnimation(){ if (ConditionalAnimationTrigger.TriggerType.Change.equals(Type)){ if ((lastValue!=null)&&(!lastValue.equals(TriggerValue))) notifyAnimationFire(); return; } if (TriggerValue == null) return; switch (Type){ case True: if (Boolean.TRUE.equals(TriggerValue)) notifyAnimationFire(); break; case Equal: if(TriggerValue.equals(TriggerCondition)) notifyAnimationFire(); case WhenLargerThan: if (TriggerValue instanceof Comparable){ int current = ((Comparable) TriggerValue).compareTo(TriggerCondition); if (current>0){ if (lastTimeLarger) return; notifyAnimationFire(); }else{ lastTimeLarger = false; return; } } case FireWhenLarger: if (TriggerValue instanceof Comparable){ int current = ((Comparable) TriggerValue).compareTo(TriggerCondition); if (current>0){ notifyAnimationFire(); }else{ lastTimeLarger = false; return; } } } } @SuppressWarnings("unchecked") public static ConditionalAnimationTrigger createFromDynamicObject(DynamicObject obj){ if (!(obj.observableExists("id") && obj.observableExists("trigger"))) return null; try { IObservable<Integer> id = (IObservable<Integer>)obj.getObservableByName("id"); IObservable<?> trigger = obj.getObservableByName("trigger"); IObservable<TriggerType> type = null; IObservable<?> condition = null; if (obj.observableExists("type")){ if (obj.observableExists("condition")){ condition = obj.getObservableByName("condition"); }else{ condition = new Observable<Object>(Object.class); } type = (IObservable<TriggerType>)obj.getObservableByName("type"); } else{ type = new Observable<TriggerType>(TriggerType.class, TriggerType.True); } return new ConditionalAnimationTrigger(id, trigger, type, condition); } catch (Exception e) { return null; } } public void onPropertyChanged(IObservable<?> prop, Collection<Object> initiators) { setAnimationId((int)mId.get()); TriggerValue = mTrigger.get(); Type = mType.get(); TriggerCondition = mCondition.get(); evaluateAnimation(); } }