1 11 package org.eclipse.jface.internal.databinding.provisional.observable.value; 12 13 import java.util.ArrayList ; 14 import java.util.Collection ; 15 import java.util.HashSet ; 16 17 import org.eclipse.jface.internal.databinding.provisional.observable.Diffs; 18 19 23 public abstract class AbstractVetoableValue extends AbstractObservableValue 24 implements IVetoableValue { 25 26 public void setValue(Object value) { 27 Object currentValue = doGetValue(); 28 ValueDiff diff = Diffs.createValueDiff(currentValue, value); 29 boolean okToProceed = fireValueChanging(diff); 30 if (!okToProceed) { 31 throw new ChangeVetoException("Change not permitted"); } 33 doSetValue(value); 34 fireValueChange(diff); 35 } 36 37 private Collection valueChangingListeners = null; 38 39 public void addValueChangingListener(IValueChangingListener listener) { 40 if (valueChangingListeners == null) { 41 boolean hadListeners = hasListeners(); 42 valueChangingListeners = new ArrayList (); 43 valueChangingListeners.add(listener); 44 if (!hadListeners) { 45 firstListenerAdded(); 46 } 47 } else if (valueChangingListeners.size() > 16) { 48 HashSet listenerList = new HashSet (); 49 listenerList.addAll(valueChangingListeners); 50 valueChangingListeners = listenerList; 51 valueChangingListeners.add(listener); 52 } 53 } 54 55 public void removeValueChangingListener(IValueChangingListener listener) { 56 valueChangingListeners.remove(listener); 57 if (valueChangingListeners.size() == 0) { 58 valueChangingListeners = null; 59 } 60 if (!hasListeners()) { 61 lastListenerRemoved(); 62 } 63 } 64 65 72 protected boolean fireValueChanging(ValueDiff diff) { 73 if (valueChangingListeners != null) { 74 IValueChangingListener[] listeners = (IValueChangingListener[]) valueChangingListeners 75 .toArray(new IValueChangingListener[valueChangingListeners 76 .size()]); 77 for (int i = 0; i < listeners.length; i++) { 78 boolean okToProceed = listeners[i].handleValueChanging(this, 79 diff); 80 if (!okToProceed) { 81 return false; 82 } 83 } 84 } 85 return true; 86 } 87 88 protected abstract void doSetValue(Object value); 89 90 protected boolean hasListeners() { 91 return super.hasListeners(); 92 } 93 94 public void dispose() { 95 super.dispose(); 96 } 97 98 } 99 | Popular Tags |