package org.openlca.app.ilcd_network;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTreeViewer;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.openlca.app.navigation.INavigationElement;
import org.openlca.app.navigation.ModelElement;
public class NavigationTreeCheck implements ICheckStateListener {
private CheckboxTreeViewer viewer;
public NavigationTreeCheck(CheckboxTreeViewer viewer) {
this.viewer = viewer;
}
@Override
public void checkStateChanged(CheckStateChangedEvent event) {
viewer.getControl().setRedraw(false);
Object element = event.getElement();
viewer.setGrayed(element, false);
if (element instanceof INavigationElement) {
INavigationElement<?> naviElement = (INavigationElement<?>) element;
updateChildren(naviElement, event.getChecked());
updateParent(naviElement);
}
viewer.getControl().setRedraw(true);
}
private void updateChildren(INavigationElement<?> naviElement, boolean state) {
for (final INavigationElement<?> child : naviElement.getChildren()) {
viewer.setGrayed(child, false);
viewer.setChecked(child, state);
if (!(child instanceof ModelElement))
updateChildren(child, state);
}
}
private void updateParent(INavigationElement<?> naviElement) {
INavigationElement<?> parent = naviElement.getParent();
if (parent == null)
return;
boolean hasCheckedChilds = false;
boolean allChildsChecked = true;
for (INavigationElement<?> child : parent.getChildren()) {
boolean isChecked = viewer.getChecked(child);
boolean isGrayed = viewer.getGrayed(child);
if (isChecked || isGrayed) {
hasCheckedChilds = true;
}
if (!isChecked || isGrayed) {
allChildsChecked = false;
}
}
viewer.setGrayed(parent, !allChildsChecked && hasCheckedChilds);
viewer.setChecked(parent, hasCheckedChilds);
updateParent(parent);
}
}