private void checkItem(TreeItem item,List<Object> authorities){
checkItem(item,authorities,false,false);
}
private void checkItem(TreeItem item, List<Object> allCheckedElements,boolean isParent,boolean isChild){
//此处树已经构建完成,所以在判断是父节点还是子节点是直接根据树的物理结构判断,而不需要再考虑逻辑
if(!isChild){
if(item.getItemCount() != 0)
isParent = true;
}
if(item.getParentItem() != null){
isChild = true;
} else {
isChild = false;
}
if (isParent) { // 是父节点时应该选中该选中该节点时级联选中其下的所有子节点,取消选中时同理
TreeItem[] children = item.getItems();
Object o = item.getData();
if (item.getChecked()) { //选中该父节点时,它所有的子节点也要被选中
if(!allCheckedElements.contains(o))
allCheckedElements.add(o);// 将选中的节点放入到allCheckedElements中
for (int i = 0; i < children.length; i++) {
children[i].setChecked(true);
checkItem(children[i],allCheckedElements);
}
} else {// 取消选中时它的所有子节点也同时被取消选中
if(allCheckedElements.contains(o))
allCheckedElements.remove(o);//如果选中的节点之前在allCheckedElements中,则移除
for (int i = 0; i < children.length; i++) {
children[i].setChecked(false);
checkItem(children[i],allCheckedElements);
}
}
}
if (isChild) {// 不是父节点
TreeItem[] brotheres = item.getParentItem().getItems();// 获得它的所有的兄弟节点
Object o = item.getData();
if (item.getChecked()) {
if(!allCheckedElements.contains(o))
allCheckedElements.add(o);// 将选中的节点加入到allCheckedElements中
} else {
if(allCheckedElements.contains(o))//如果之前allCheckedElements中没有包含该节点则加入
allCheckedElements.remove(o);
}
boolean hasBrotherChecked = false;
for (TreeItem brother : brotheres) {// 判断它的兄弟节点中有没有被选中的
if (brother.getChecked()) {
hasBrotherChecked = true;
break;
}
}
if(hasBrotherChecked){//如果兄弟节点中有被选中的那么父节点也被选中
item.getParentItem().setChecked(true);
Object po = item.getParentItem().getData();
if(!allCheckedElements.contains(po))
allCheckedElements.add(po);
checkItem(item.getParentItem(),allCheckedElements,false,true);
} else {//相么如果兄弟节点中一个都没有被选中的,那么父节点也不应被选中
item.getParentItem().setChecked(false);
Object po = item.getParentItem().getData();
if(allCheckedElements.contains(po))
allCheckedElements.remove(po);
checkItem(item.getParentItem(),allCheckedElements,false,true);
}
}
}
tree.addSelectionListener(new SelectionListener(){
@Override
public void widgetDefaultSelected(SelectionEvent e) {
// TODO Auto-generated method stub
}
@Override
public void widgetSelected(SelectionEvent e) {
// TODO Auto-generated method stub
TreeItem item = (TreeItem) e.item;
tree.setSelection(item);
List authorities = new ArrayList<Object>();
checkItem(item,authorities);
}
});
Tree tree = new Tree(container, SWT.BORDER | SWT.CHECK);