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 (-11 / +35 lines)
Lines 17-22 Link Here
17
import java.util.ArrayList;
17
import java.util.ArrayList;
18
import java.util.Arrays;
18
import java.util.Arrays;
19
import java.util.HashSet;
19
import java.util.HashSet;
20
import java.util.Set;
20
import org.eclipse.jface.viewers.CheckboxTreeViewer;
21
import org.eclipse.jface.viewers.CheckboxTreeViewer;
21
import org.eclipse.jface.viewers.ITreeViewerListener;
22
import org.eclipse.jface.viewers.ITreeViewerListener;
22
import org.eclipse.jface.viewers.TreeExpansionEvent;
23
import org.eclipse.jface.viewers.TreeExpansionEvent;
Lines 176-181 Link Here
176
				}
177
				}
177
			}
178
			}
178
179
180
179
			// avoid accessing the widget, if there are no updates
181
			// avoid accessing the widget, if there are no updates
180
			boolean updated = false;
182
			boolean updated = false;
181
			boolean checked = item.getChecked();
183
			boolean checked = item.getChecked();
Lines 209-235 Link Here
209
	@Override
211
	@Override
210
	public void setCheckedElements(Object[] elements) {
212
	public void setCheckedElements(Object[] elements) {
211
		Object[] oldCheckedElements = getCheckedElements();
213
		Object[] oldCheckedElements = getCheckedElements();
212
		super.setCheckedElements(elements);
214
		HashSet<Object> elementsToCheck = new HashSet<>();
215
		HashSet<Object> elementsToUncheck = new HashSet<>(Arrays.asList(oldCheckedElements));
216
		for (Object element : elements) {
217
			if (!elementsToUncheck.remove(element)) {
218
				elementsToCheck.add(element);
219
			}
220
		}
221
222
		for (Object elementToCheck : elementsToCheck) {
223
			super.setChecked(elementToCheck, true);
224
		}
225
		for (Object elementToUncheck : elementsToUncheck) {
226
			super.setChecked(elementToUncheck, false);
227
		}
228
229
		if (elementsToCheck.isEmpty() && elementsToUncheck.isEmpty()) {
230
			return; // noting changed
231
		}
213
232
214
		Control tree = getControl();
233
		Control tree = getControl();
215
		try {
234
		try {
216
			tree.setRedraw(false);
235
			tree.setRedraw(false);
217
			if (oldCheckedElements.length > 0) {
236
			if (!elementsToCheck.isEmpty()) {
218
				// calculate intersection of previously and newly checked elements to avoid
237
				doCheckStateChanged(elementsToCheck.toArray());
219
				// no-op updates
238
			}
220
				HashSet<Object> changedElements = new HashSet<>(Arrays.asList(elements));
239
221
				for (Object element : oldCheckedElements) {
240
			if (!elementsToUncheck.isEmpty()) {
222
					changedElements.remove(element);
241
				updateElementsState(elementsToUncheck);
223
				}
224
				doCheckStateChanged(changedElements.toArray());
225
			} else {
226
				doCheckStateChanged(elements);
227
			}
242
			}
228
		} finally {
243
		} finally {
229
			tree.setRedraw(true);
244
			tree.setRedraw(true);
230
		}
245
		}
231
	}
246
	}
232
247
248
	private void updateElementsState(Set<Object> elementsToUpdate) {
249
		for (Object element : elementsToUpdate) {
250
			Widget item = findItem(element);
251
			if (item instanceof TreeItem) {
252
				updateParentItems((TreeItem) item);
253
			}
254
		}
255
	}
256
233
	@Override
257
	@Override
234
	public boolean setSubtreeChecked(Object element, boolean state) {
258
	public boolean setSubtreeChecked(Object element, boolean state) {
235
		if (super.setSubtreeChecked(element, state)) {
259
		if (super.setSubtreeChecked(element, state)) {

Return to bug 562374