Lines 15-35
Link Here
|
15 |
|
15 |
|
16 |
package org.eclipse.jface.databinding.dialog; |
16 |
package org.eclipse.jface.databinding.dialog; |
17 |
|
17 |
|
18 |
import java.util.Iterator; |
|
|
19 |
|
20 |
import org.eclipse.core.databinding.AggregateValidationStatus; |
18 |
import org.eclipse.core.databinding.AggregateValidationStatus; |
21 |
import org.eclipse.core.databinding.DataBindingContext; |
19 |
import org.eclipse.core.databinding.DataBindingContext; |
22 |
import org.eclipse.core.databinding.ValidationStatusProvider; |
20 |
import org.eclipse.core.databinding.TargetsListener; |
23 |
import org.eclipse.core.databinding.observable.ChangeEvent; |
21 |
import org.eclipse.core.databinding.observable.ChangeEvent; |
24 |
import org.eclipse.core.databinding.observable.IChangeListener; |
22 |
import org.eclipse.core.databinding.observable.IChangeListener; |
25 |
import org.eclipse.core.databinding.observable.IObservable; |
|
|
26 |
import org.eclipse.core.databinding.observable.IStaleListener; |
23 |
import org.eclipse.core.databinding.observable.IStaleListener; |
27 |
import org.eclipse.core.databinding.observable.StaleEvent; |
24 |
import org.eclipse.core.databinding.observable.StaleEvent; |
28 |
import org.eclipse.core.databinding.observable.list.IListChangeListener; |
|
|
29 |
import org.eclipse.core.databinding.observable.list.IObservableList; |
30 |
import org.eclipse.core.databinding.observable.list.ListChangeEvent; |
31 |
import org.eclipse.core.databinding.observable.list.ListDiff; |
32 |
import org.eclipse.core.databinding.observable.list.ListDiffEntry; |
33 |
import org.eclipse.core.databinding.observable.value.IObservableValue; |
25 |
import org.eclipse.core.databinding.observable.value.IObservableValue; |
34 |
import org.eclipse.core.databinding.observable.value.IValueChangeListener; |
26 |
import org.eclipse.core.databinding.observable.value.IValueChangeListener; |
35 |
import org.eclipse.core.databinding.observable.value.ValueChangeEvent; |
27 |
import org.eclipse.core.databinding.observable.value.ValueChangeEvent; |
Lines 68-122
Link Here
|
68 |
private DataBindingContext dbc; |
60 |
private DataBindingContext dbc; |
69 |
private IObservableValue aggregateStatus; |
61 |
private IObservableValue aggregateStatus; |
70 |
private boolean uiChanged = false; |
62 |
private boolean uiChanged = false; |
71 |
private IChangeListener uiChangeListener = new IChangeListener() { |
|
|
72 |
public void handleChange(ChangeEvent event) { |
73 |
handleUIChanged(); |
74 |
} |
75 |
}; |
76 |
private IListChangeListener validationStatusProvidersListener = new IListChangeListener() { |
77 |
public void handleListChange(ListChangeEvent event) { |
78 |
ListDiff diff = event.diff; |
79 |
ListDiffEntry[] differences = diff.getDifferences(); |
80 |
for (int i = 0; i < differences.length; i++) { |
81 |
ListDiffEntry listDiffEntry = differences[i]; |
82 |
ValidationStatusProvider validationStatusProvider = (ValidationStatusProvider) listDiffEntry |
83 |
.getElement(); |
84 |
IObservableList targets = validationStatusProvider.getTargets(); |
85 |
if (listDiffEntry.isAddition()) { |
86 |
targets |
87 |
.addListChangeListener(validationStatusProviderTargetsListener); |
88 |
for (Iterator it = targets.iterator(); it.hasNext();) { |
89 |
((IObservable) it.next()) |
90 |
.addChangeListener(uiChangeListener); |
91 |
} |
92 |
} else { |
93 |
targets |
94 |
.removeListChangeListener(validationStatusProviderTargetsListener); |
95 |
for (Iterator it = targets.iterator(); it.hasNext();) { |
96 |
((IObservable) it.next()) |
97 |
.removeChangeListener(uiChangeListener); |
98 |
} |
99 |
} |
100 |
} |
101 |
} |
102 |
}; |
103 |
private IListChangeListener validationStatusProviderTargetsListener = new IListChangeListener() { |
104 |
public void handleListChange(ListChangeEvent event) { |
105 |
ListDiff diff = event.diff; |
106 |
ListDiffEntry[] differences = diff.getDifferences(); |
107 |
for (int i = 0; i < differences.length; i++) { |
108 |
ListDiffEntry listDiffEntry = differences[i]; |
109 |
IObservable target = (IObservable) listDiffEntry.getElement(); |
110 |
if (listDiffEntry.isAddition()) { |
111 |
target.addChangeListener(uiChangeListener); |
112 |
} else { |
113 |
target.removeChangeListener(uiChangeListener); |
114 |
} |
115 |
} |
116 |
} |
117 |
}; |
118 |
protected IStatus currentStatus; |
63 |
protected IStatus currentStatus; |
119 |
protected boolean currentStatusStale; |
64 |
protected boolean currentStatusStale; |
|
|
65 |
private TargetsListener targetsListener; |
120 |
|
66 |
|
121 |
/** |
67 |
/** |
122 |
* @param dialogPage |
68 |
* @param dialogPage |
Lines 161-179
Link Here
|
161 |
currentStatus = (IStatus) aggregateStatus.getValue(); |
107 |
currentStatus = (IStatus) aggregateStatus.getValue(); |
162 |
currentStatusStale = aggregateStatus.isStale(); |
108 |
currentStatusStale = aggregateStatus.isStale(); |
163 |
handleStatusChanged(); |
109 |
handleStatusChanged(); |
164 |
dbc.getValidationStatusProviders().addListChangeListener( |
110 |
targetsListener = TargetsListener.listenOnce(dbc, new IChangeListener() { |
165 |
validationStatusProvidersListener); |
111 |
public void handleChange(ChangeEvent event) { |
166 |
for (Iterator it = dbc.getValidationStatusProviders().iterator(); it |
112 |
handleUIChanged(); |
167 |
.hasNext();) { |
|
|
168 |
ValidationStatusProvider validationStatusProvider = (ValidationStatusProvider) it |
169 |
.next(); |
170 |
IObservableList targets = validationStatusProvider.getTargets(); |
171 |
targets |
172 |
.addListChangeListener(validationStatusProviderTargetsListener); |
173 |
for (Iterator iter = targets.iterator(); iter.hasNext();) { |
174 |
((IObservable) iter.next()).addChangeListener(uiChangeListener); |
175 |
} |
113 |
} |
176 |
} |
114 |
}); |
177 |
} |
115 |
} |
178 |
|
116 |
|
179 |
/** |
117 |
/** |
Lines 184-203
Link Here
|
184 |
if (currentStatus != null) { |
122 |
if (currentStatus != null) { |
185 |
handleStatusChanged(); |
123 |
handleStatusChanged(); |
186 |
} |
124 |
} |
187 |
dbc.getValidationStatusProviders().removeListChangeListener( |
|
|
188 |
validationStatusProvidersListener); |
189 |
for (Iterator it = dbc.getValidationStatusProviders().iterator(); it |
190 |
.hasNext();) { |
191 |
ValidationStatusProvider validationStatusProvider = (ValidationStatusProvider) it |
192 |
.next(); |
193 |
IObservableList targets = validationStatusProvider.getTargets(); |
194 |
targets |
195 |
.removeListChangeListener(validationStatusProviderTargetsListener); |
196 |
for (Iterator iter = targets.iterator(); iter.hasNext();) { |
197 |
((IObservable) iter.next()) |
198 |
.removeChangeListener(uiChangeListener); |
199 |
} |
200 |
} |
201 |
} |
125 |
} |
202 |
|
126 |
|
203 |
/** |
127 |
/** |
Lines 298-323
Link Here
|
298 |
public void dispose() { |
222 |
public void dispose() { |
299 |
aggregateStatus.dispose(); |
223 |
aggregateStatus.dispose(); |
300 |
if (!uiChanged) { |
224 |
if (!uiChanged) { |
301 |
for (Iterator it = dbc.getValidationStatusProviders().iterator(); it |
225 |
targetsListener.dispose(); |
302 |
.hasNext();) { |
|
|
303 |
ValidationStatusProvider validationStatusProvider = (ValidationStatusProvider) it |
304 |
.next(); |
305 |
IObservableList targets = validationStatusProvider.getTargets(); |
306 |
targets |
307 |
.removeListChangeListener(validationStatusProviderTargetsListener); |
308 |
for (Iterator iter = targets.iterator(); iter.hasNext();) { |
309 |
((IObservable) iter.next()) |
310 |
.removeChangeListener(uiChangeListener); |
311 |
} |
312 |
} |
313 |
dbc.getValidationStatusProviders().removeListChangeListener( |
314 |
validationStatusProvidersListener); |
315 |
} |
226 |
} |
316 |
aggregateStatus = null; |
227 |
aggregateStatus = null; |
317 |
dbc = null; |
228 |
dbc = null; |
318 |
uiChangeListener = null; |
|
|
319 |
validationStatusProvidersListener = null; |
320 |
validationStatusProviderTargetsListener = null; |
321 |
dialogPage = null; |
229 |
dialogPage = null; |
322 |
} |
230 |
} |
323 |
} |
231 |
} |