KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > eclipse > jface > internal > databinding > internal > viewers > MultiMappingAndSetBinding


1 /*******************************************************************************
2  * Copyright (c) 2005, 2006 IBM Corporation and others.
3  * All rights reserved. This program and the accompanying materials
4  * are made available under the terms of the Eclipse Public License v1.0
5  * which accompanies this distribution, and is available at
6  * http://www.eclipse.org/legal/epl-v10.html
7  *
8  * Contributors:
9  * IBM Corporation - initial API and implementation
10  *******************************************************************************/

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 /**
31  *
32  *
33  */

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     /**
47      * @param context
48      * @param targetSet
49      * @param target
50      * @param modelSet
51      * @param model
52      * @param bindSpec
53      */

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         // TODO validation/conversion as specified by the bindSpec
64
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             // TODO validation
88
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                 // get setDiff from event object - might have been modified by a
96
// listener
97
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         // FIXME: Need to fire a BindingEvent here
123
if (errorMessage != null
124                 && errorMessage.status == ValidationError.ERROR) {
125             return true;
126         }
127         return false;
128     }
129
130     /*
131      * (non-Javadoc)
132      *
133      * @see org.eclipse.jface.internal.databinding.Binding#updateTargetFromModel(org.eclipse.jface.internal.provisional.databinding.ChangeEvent)
134      */

135     public void updateTargetFromModel() {
136         targetSet.clear();
137         targetSet.addAll(modelSet);
138         target.init(new IMultiMapping() {
139             public Object JavaDoc[] getMappingValues(Object JavaDoc element, int[] columnIndices) {
140                 return model.getMappingValues(element, columnIndices);
141             }
142
143             public void setMappingValues(Object JavaDoc element, int[] columnIndices,
144                     Object JavaDoc[] 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         // no-op since the target is never out of sync with the model
160
}
161 }
162
Popular Tags