viewer.addCheckStateListener(new ICheckStateListener(){
@Override
public void checkStateChanged(CheckStateChangedEvent event) {
//级联勾选
handleCheckStateChange(event);
}
});
/**
* @param event
*/
protected void handleCheckStateChange(final CheckStateChangedEvent event) {
BusyIndicator.showWhile(getShell().getDisplay(), new Runnable() {
public void run() {
Object element = event.getElement();
boolean state = event.getChecked();
viewer.setGrayed(element, false);
if (isExpandable(element))
setSubtreeChecked(element, state, state);
// viewer.setSubtreeChecked(element, state);
// only check subtree if state is set to true
updateParentState(element, state);
// validateInput();
}
});
}
/**更新父节点状态
* @param element
* @param state
*/
protected void updateParentState(Object child, boolean baseChildState) {
if (child == null)
return;
Object parent = provider.getParent(child);
if (parent == null)
return;
boolean allSameState = true;
Object[] children = null;
children = provider.getChildren(parent);
for (int i = children.length - 1; i >= 0; i--) {
if (viewer.getChecked(children[i]) != baseChildState || viewer.getGrayed(children[i])) {
allSameState = false;
break;
}
}
viewer.setGrayed(parent, !allSameState);
viewer.setChecked(parent, !allSameState || baseChildState);
updateParentState(parent, baseChildState);
}
/**子目录选择
* @param element
* @param state
* @param state2
*/
private void setSubtreeChecked(Object parent, boolean state, boolean checkExpandedState) {
// CashHoldAccTreeElement element = (CashHoldAccTreeElement) parent;
Object[] children = provider.getChildren(parent);
for (int i = children.length - 1; i >= 0; i--) {
Object element = children[i];
if (state) {
viewer.setChecked(element, true);
viewer.setGrayed(element, false);
} else
viewer.setGrayChecked(element, false);
if (isExpandable(element))
setSubtreeChecked(element, state, checkExpandedState);
}
}
/**
* @param element
* @return
*/
boolean isExpandable(Object element) {
return provider.hasChildren(element);
}