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)) { |