package org.activiti.designer.eclipse.deployment; import org.eclipse.jface.viewers.CheckStateChangedEvent; import org.eclipse.jface.viewers.CheckboxTreeViewer; import org.eclipse.jface.viewers.ICheckStateListener; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.swt.widgets.Tree; public class IncludeInDeploymentTreeViewer extends CheckboxTreeViewer { public IncludeInDeploymentTreeViewer(Tree tree) { super(tree); addCheckStateListener(new ICheckStateListener() { public void checkStateChanged(CheckStateChangedEvent event) { handleCheckStateChanged(event); } }); } private void handleCheckStateChanged(CheckStateChangedEvent event) { updateChecks(event.getElement(), event.getChecked()); } public boolean setChecked(final Object element, final boolean state) { boolean result = super.setChecked(element, state); if (result) { updateChecks(element, state); } return result; } public void setCheckedElements(final Object[] elements) { if(elements == null) return; super.setCheckedElements(elements); for (int i = 0; i < elements.length; i++) { updateChecks(elements[i], true); } } private void updateChecks(Object object, boolean state) { updateChecksForChildren(object, state); updateChecksForParents(object, state); } private void updateChecksForChildren(Object object, boolean state) { setGrayed(object, false); Object[] children = ((ITreeContentProvider)getContentProvider()).getChildren(object); for (int i = 0; i < children.length; i++) { if (getChecked(children[i]) != state) { super.setChecked(children[i], state); updateChecksForChildren(children[i], state); } } } private void updateChecksForParents(Object object, boolean state) { ITreeContentProvider provider = (ITreeContentProvider)getContentProvider(); Object child = object; Object parent = provider.getParent(child); boolean change = true; while (parent != null && change) { Object[] siblings = provider.getChildren(parent); int numberChecked = 0; boolean grayed = false; change = false; for (int i = 0; i < siblings.length; i++) { if (getChecked(siblings[i])) numberChecked++; if (getGrayed(siblings[i])) grayed = true; } if (numberChecked == 0) { if (getChecked(parent) || getGrayed(parent)) change = true; setGrayChecked(parent, false); } else if (numberChecked == siblings.length) { if (!getChecked(parent) || getGrayed(parent) != grayed) change = true; setGrayed(parent, false); setChecked(parent, true); } else { if (!getChecked(parent) || !getGrayed(parent)) change = true; setGrayChecked(parent, true); } child = parent; parent = provider.getParent(child); } } }