Lines 15-22
Link Here
|
15 |
package org.eclipse.ui.dialogs; |
15 |
package org.eclipse.ui.dialogs; |
16 |
|
16 |
|
17 |
import java.util.ArrayList; |
17 |
import java.util.ArrayList; |
18 |
import java.util.Arrays; |
|
|
19 |
import java.util.HashSet; |
18 |
import java.util.HashSet; |
|
|
19 |
import java.util.Set; |
20 |
import org.eclipse.jface.viewers.CheckboxTreeViewer; |
20 |
import org.eclipse.jface.viewers.CheckboxTreeViewer; |
21 |
import org.eclipse.jface.viewers.ITreeViewerListener; |
21 |
import org.eclipse.jface.viewers.ITreeViewerListener; |
22 |
import org.eclipse.jface.viewers.TreeExpansionEvent; |
22 |
import org.eclipse.jface.viewers.TreeExpansionEvent; |
Lines 209-235
Link Here
|
209 |
@Override |
209 |
@Override |
210 |
public void setCheckedElements(Object[] elements) { |
210 |
public void setCheckedElements(Object[] elements) { |
211 |
Object[] oldCheckedElements = getCheckedElements(); |
211 |
Object[] oldCheckedElements = getCheckedElements(); |
212 |
super.setCheckedElements(elements); |
212 |
Set<Object> elementsToCheck = new HashSet<>(); |
|
|
213 |
Set<Object> elementsToUncheck = getSetOf(oldCheckedElements); |
214 |
for (Object element : elements) { |
215 |
if (!elementsToUncheck.remove(element)) { |
216 |
elementsToCheck.add(element); |
217 |
} |
218 |
} |
219 |
|
220 |
if (elementsToCheck.isEmpty() && elementsToUncheck.isEmpty()) { |
221 |
return; // noting changed |
222 |
} |
223 |
|
224 |
elementsToCheck.forEach(element -> super.setChecked(element, true)); |
225 |
elementsToUncheck.forEach(element -> super.setChecked(element, false)); |
213 |
|
226 |
|
214 |
Control tree = getControl(); |
227 |
Control tree = getControl(); |
215 |
try { |
228 |
try { |
216 |
tree.setRedraw(false); |
229 |
tree.setRedraw(false); |
217 |
if (oldCheckedElements.length > 0) { |
230 |
if (!elementsToCheck.isEmpty()) { |
218 |
// calculate intersection of previously and newly checked elements to avoid |
231 |
doCheckStateChanged(elementsToCheck.toArray()); |
219 |
// no-op updates |
232 |
} |
220 |
HashSet<Object> changedElements = new HashSet<>(Arrays.asList(elements)); |
233 |
|
221 |
for (Object element : oldCheckedElements) { |
234 |
if (!elementsToUncheck.isEmpty()) { |
222 |
changedElements.remove(element); |
235 |
updateElementsState(elementsToUncheck); |
223 |
} |
|
|
224 |
doCheckStateChanged(changedElements.toArray()); |
225 |
} else { |
226 |
doCheckStateChanged(elements); |
227 |
} |
236 |
} |
228 |
} finally { |
237 |
} finally { |
229 |
tree.setRedraw(true); |
238 |
tree.setRedraw(true); |
230 |
} |
239 |
} |
231 |
} |
240 |
} |
232 |
|
241 |
|
|
|
242 |
private void updateElementsState(Set<Object> elementsToUpdate) { |
243 |
for (Object element : elementsToUpdate) { |
244 |
Widget item = findItem(element); |
245 |
if (item instanceof TreeItem) { |
246 |
updateParentItems((TreeItem) item); |
247 |
} |
248 |
} |
249 |
} |
250 |
|
233 |
@Override |
251 |
@Override |
234 |
public boolean setSubtreeChecked(Object element, boolean state) { |
252 |
public boolean setSubtreeChecked(Object element, boolean state) { |
235 |
if (super.setSubtreeChecked(element, state)) { |
253 |
if (super.setSubtreeChecked(element, state)) { |
Lines 281-284
Link Here
|
281 |
} |
299 |
} |
282 |
} |
300 |
} |
283 |
|
301 |
|
|
|
302 |
private Set<Object> getSetOf(Object[] objects) { |
303 |
Set<Object> set = new HashSet<>(objects.length); |
304 |
for (Object o : objects) { |
305 |
set.add(o); |
306 |
} |
307 |
|
308 |
return set; |
309 |
} |
284 |
} |
310 |
} |