View | Details | Raw Unified | Return to bug 562374 | Differences between
and this patch

Collapse All | Expand All

(-)a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/dialogs/ContainerCheckedTreeViewer.java (-12 / +38 lines)
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
}

Return to bug 562374