1 11 package org.eclipse.jface.internal.databinding.internal.observable; 12 13 import java.util.HashSet ; 14 import java.util.Set ; 15 16 import org.eclipse.jface.internal.databinding.provisional.DataBindingContext; 17 import org.eclipse.jface.internal.databinding.provisional.description.Property; 18 import org.eclipse.jface.internal.databinding.provisional.observable.Diffs; 19 import org.eclipse.jface.internal.databinding.provisional.observable.set.IObservableSet; 20 import org.eclipse.jface.internal.databinding.provisional.observable.set.ISetChangeListener; 21 import org.eclipse.jface.internal.databinding.provisional.observable.set.ObservableSet; 22 import org.eclipse.jface.internal.databinding.provisional.observable.set.SetDiff; 23 import org.eclipse.jface.internal.databinding.provisional.observable.value.IObservableValue; 24 import org.eclipse.jface.internal.databinding.provisional.observable.value.IValueChangeListener; 25 import org.eclipse.jface.internal.databinding.provisional.observable.value.ValueDiff; 26 import org.eclipse.jface.util.Assert; 27 28 32 public class NestedObservableSet extends ObservableSet { 33 34 private boolean updating = false; 35 36 private ISetChangeListener innerChangeListener = new ISetChangeListener() { 37 public void handleSetChange(IObservableSet source, SetDiff diff) { 38 if (!updating) { 39 fireSetChange(diff); 40 } 41 } 42 }; 43 44 private Object currentOuterValue; 45 46 private Object feature; 47 48 private IObservableSet innerObservableSet; 49 50 private DataBindingContext databindingContext; 51 52 private IObservableValue outerObservableValue; 53 54 60 public NestedObservableSet(DataBindingContext databindingContext, 61 IObservableValue outerObservableValue, Object feature, 62 Object featureType) { 63 super(new HashSet (), featureType); 64 this.databindingContext = databindingContext; 65 this.feature = feature; 66 this.outerObservableValue = outerObservableValue; 67 updateInnerObservableValue(outerObservableValue); 68 69 outerObservableValue.addValueChangeListener(outerChangeListener); 70 } 71 72 IValueChangeListener outerChangeListener = new IValueChangeListener() { 73 public void handleValueChange(IObservableValue source, ValueDiff diff) { 74 Set oldSet = new HashSet (wrappedSet); 75 updateInnerObservableValue(outerObservableValue); 76 fireSetChange(Diffs.computeSetDiff(oldSet, wrappedSet)); 77 } 78 }; 79 80 private void updateInnerObservableValue( 81 IObservableValue outerObservableValue) { 82 currentOuterValue = outerObservableValue.getValue(); 83 if (innerObservableSet != null) { 84 innerObservableSet.removeSetChangeListener(innerChangeListener); 85 innerObservableSet.dispose(); 86 } 87 if (currentOuterValue == null) { 88 innerObservableSet = null; 89 wrappedSet = new HashSet (); 90 } else { 91 this.innerObservableSet = (IObservableSet) databindingContext 92 .createObservable(new Property(currentOuterValue, feature)); 93 wrappedSet = innerObservableSet; 94 Object innerValueType = innerObservableSet.getElementType(); 95 if (elementType == null) { 96 elementType = innerValueType; 97 } else { 98 Assert.isTrue(elementType.equals(innerValueType), 99 "Cannot change value type in a nested updatable value"); } 101 innerObservableSet.addSetChangeListener(innerChangeListener); 102 } 103 } 104 105 public void dispose() { 106 super.dispose(); 107 108 if (outerObservableValue != null) { 109 outerObservableValue.removeValueChangeListener(outerChangeListener); 110 outerObservableValue.dispose(); 111 } 112 if (innerObservableSet != null) { 113 innerObservableSet.removeSetChangeListener(innerChangeListener); 114 innerObservableSet.dispose(); 115 } 116 currentOuterValue = null; 117 databindingContext = null; 118 feature = null; 119 innerObservableSet = null; 120 innerChangeListener = null; 121 } 122 } 123 | Popular Tags |