1 12 package org.eclipse.core.internal.databinding.observable.masterdetail; 13 14 import java.util.ArrayList ; 15 import java.util.List ; 16 17 import org.eclipse.core.databinding.observable.Diffs; 18 import org.eclipse.core.databinding.observable.IObserving; 19 import org.eclipse.core.databinding.observable.list.IListChangeListener; 20 import org.eclipse.core.databinding.observable.list.IObservableList; 21 import org.eclipse.core.databinding.observable.list.ListChangeEvent; 22 import org.eclipse.core.databinding.observable.list.ObservableList; 23 import org.eclipse.core.databinding.observable.masterdetail.IObservableFactory; 24 import org.eclipse.core.databinding.observable.value.IObservableValue; 25 import org.eclipse.core.databinding.observable.value.IValueChangeListener; 26 import org.eclipse.core.databinding.observable.value.ValueChangeEvent; 27 import org.eclipse.core.runtime.Assert; 28 29 33 34 public class DetailObservableList extends ObservableList implements IObserving { 35 36 private boolean updating = false; 37 38 private IListChangeListener innerChangeListener = new IListChangeListener() { 39 public void handleListChange(ListChangeEvent event) { 40 if (!updating) { 41 fireListChange(event.diff); 42 } 43 } 44 }; 45 46 private Object currentOuterValue; 47 48 private IObservableList innerObservableList; 49 50 private IObservableFactory factory; 51 52 private IObservableValue outerObservableValue; 53 54 private Object detailType; 55 56 61 public DetailObservableList(IObservableFactory factory, 62 IObservableValue outerObservableValue, Object detailType) { 63 super(outerObservableValue.getRealm(), new ArrayList (), detailType); 64 this.factory = factory; 65 this.outerObservableValue = outerObservableValue; 66 this.detailType = detailType; 67 updateInnerObservableValue(outerObservableValue); 68 69 outerObservableValue.addValueChangeListener(outerChangeListener); 70 } 71 72 IValueChangeListener outerChangeListener = new IValueChangeListener() { 73 public void handleValueChange(ValueChangeEvent event) { 74 List oldList = new ArrayList (wrappedList); 75 updateInnerObservableValue(outerObservableValue); 76 fireListChange(Diffs.computeListDiff(oldList, wrappedList)); 77 } 78 }; 79 80 private void updateInnerObservableValue( 81 IObservableValue outerObservableValue) { 82 currentOuterValue = outerObservableValue.getValue(); 83 if (innerObservableList != null) { 84 innerObservableList.removeListChangeListener(innerChangeListener); 85 innerObservableList.dispose(); 86 } 87 if (currentOuterValue == null) { 88 innerObservableList = null; 89 wrappedList = new ArrayList (); 90 } else { 91 this.innerObservableList = (IObservableList) factory 92 .createObservable(currentOuterValue); 93 wrappedList = innerObservableList; 94 95 if (detailType != null) { 96 Object innerValueType = innerObservableList.getElementType(); 97 Assert.isTrue(getElementType().equals(innerValueType), 98 "Cannot change value type in a nested observable list"); } 100 innerObservableList.addListChangeListener(innerChangeListener); 101 } 102 } 103 104 public void dispose() { 105 super.dispose(); 106 107 if (outerObservableValue != null) { 108 outerObservableValue.removeValueChangeListener(outerChangeListener); 109 outerObservableValue.dispose(); 110 } 111 if (innerObservableList != null) { 112 innerObservableList.removeListChangeListener(innerChangeListener); 113 innerObservableList.dispose(); 114 } 115 currentOuterValue = null; 116 factory = null; 117 innerObservableList = null; 118 innerChangeListener = null; 119 } 120 121 public Object getObserved() { 122 if (innerObservableList instanceof IObserving) { 123 return ((IObserving)innerObservableList).getObserved(); 124 } 125 return null; 126 } 127 128 } 129 | Popular Tags |