1 11 package org.eclipse.jface.internal.databinding.internal.viewers; 12 13 import org.eclipse.jface.internal.databinding.provisional.BindSpec; 14 import org.eclipse.jface.internal.databinding.provisional.Binding; 15 import org.eclipse.jface.internal.databinding.provisional.BindingEvent; 16 import org.eclipse.jface.internal.databinding.provisional.DataBindingContext; 17 import org.eclipse.jface.internal.databinding.provisional.observable.IObservable; 18 import org.eclipse.jface.internal.databinding.provisional.observable.mapping.IMappingChangeListener; 19 import org.eclipse.jface.internal.databinding.provisional.observable.mapping.IMultiMapping; 20 import org.eclipse.jface.internal.databinding.provisional.observable.mapping.IObservableMultiMappingWithDomain; 21 import org.eclipse.jface.internal.databinding.provisional.observable.mapping.MappingDiff; 22 import org.eclipse.jface.internal.databinding.provisional.observable.set.IObservableSet; 23 import org.eclipse.jface.internal.databinding.provisional.observable.set.ISetChangeListener; 24 import org.eclipse.jface.internal.databinding.provisional.observable.set.SetDiff; 25 import org.eclipse.jface.internal.databinding.provisional.observable.value.IObservableValue; 26 import org.eclipse.jface.internal.databinding.provisional.observable.value.WritableValue; 27 import org.eclipse.jface.internal.databinding.provisional.validation.ValidationError; 28 import org.eclipse.jface.internal.databinding.provisional.viewers.IObservableCollectionWithLabels; 29 30 34 public class MultiMappingAndSetBinding extends Binding { 35 36 private boolean updating = false; 37 38 private IObservableCollectionWithLabels target; 39 40 private IObservableMultiMappingWithDomain model; 41 42 private IObservableSet modelSet; 43 44 private final IObservableSet targetSet; 45 46 54 public MultiMappingAndSetBinding(DataBindingContext context, 55 IObservableSet targetSet, IObservableCollectionWithLabels target, 56 IObservableSet modelSet, IObservableMultiMappingWithDomain model, 57 BindSpec bindSpec) { 58 super(context); 59 this.targetSet = targetSet; 60 this.target = target; 61 this.model = model; 62 this.modelSet = modelSet; 63 targetSet.addSetChangeListener(targetChangeListener); 65 model.addMappingChangeListener(cellsChangeListener); 66 modelSet.addSetChangeListener(modelChangeListener); 67 updateTargetFromModel(); 68 } 69 70 private final ISetChangeListener targetChangeListener = new ISetChangeListener() { 71 public void handleSetChange(IObservableSet source, SetDiff diff) { 72 } 73 }; 74 75 private IMappingChangeListener cellsChangeListener = new IMappingChangeListener() { 76 public void handleMappingValueChange(IObservable source, 77 MappingDiff diff) { 78 target.updateElements(diff.getElements().toArray()); 79 } 80 }; 81 82 private ISetChangeListener modelChangeListener = new ISetChangeListener() { 83 public void handleSetChange(IObservableSet source, SetDiff diff) { 84 if (updating) { 85 return; 86 } 87 BindingEvent e = new BindingEvent(model, targetSet, diff, 89 BindingEvent.EVENT_COPY_TO_TARGET, 90 BindingEvent.PIPELINE_AFTER_GET); 91 if (failure(errMsg(fireBindingEvent(e)))) { 92 return; 93 } 94 try { 95 SetDiff setDiff = (SetDiff) e.diff; 98 targetSet.addAll(setDiff.getAdditions()); 99 targetSet.removeAll(setDiff.getRemovals()); 100 e.pipelinePosition = BindingEvent.PIPELINE_AFTER_CHANGE; 101 if (failure(errMsg(fireBindingEvent(e)))) { 102 return; 103 } 104 } finally { 105 updating = false; 106 } 107 } 108 }; 109 110 private WritableValue partialValidationErrorObservable = new WritableValue( 111 null); 112 113 private WritableValue validationErrorObservable = new WritableValue(null); 114 115 private ValidationError errMsg(ValidationError validationError) { 116 partialValidationErrorObservable.setValue(null); 117 validationErrorObservable.setValue(validationError); 118 return validationError; 119 } 120 121 private boolean failure(ValidationError errorMessage) { 122 if (errorMessage != null 124 && errorMessage.status == ValidationError.ERROR) { 125 return true; 126 } 127 return false; 128 } 129 130 135 public void updateTargetFromModel() { 136 targetSet.clear(); 137 targetSet.addAll(modelSet); 138 target.init(new IMultiMapping() { 139 public Object [] getMappingValues(Object element, int[] columnIndices) { 140 return model.getMappingValues(element, columnIndices); 141 } 142 143 public void setMappingValues(Object element, int[] columnIndices, 144 Object [] values) { 145 model.setMappingValues(element, columnIndices, values); 146 } 147 }); 148 } 149 150 public IObservableValue getValidationError() { 151 return validationErrorObservable; 152 } 153 154 public IObservableValue getPartialValidationError() { 155 return partialValidationErrorObservable; 156 } 157 158 public void updateModelFromTarget() { 159 } 161 } 162 | Popular Tags |