/** * <p>Copyright: Copyright (c) 2009</p> * <p>Company: �������ӹɷ����޹�˾</p> */ package com.hundsun.ares.studio.ui.control; import org.eclipse.jface.viewers.CheckStateChangedEvent; import org.eclipse.jface.viewers.CheckboxTreeViewer; import org.eclipse.jface.viewers.ICheckStateListener; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Tree; /** * ʵ����̬ѡ��򣬺�����Ŀ�Զ�ѡ�� * * @author gongyf * */ public class CheckboxTreeViewerEx extends CheckboxTreeViewer { private CheckStateListener listener = new CheckStateListener(); public CheckboxTreeViewerEx(Composite parent, int style) { super(parent, style); addCheckStateListener(listener); } public CheckboxTreeViewerEx(Composite parent) { super(parent); addCheckStateListener(listener); } public CheckboxTreeViewerEx(Tree tree) { super(tree); addCheckStateListener(listener); } public void checkChange(CheckStateChangedEvent event){ listener.checkStateChanged(event); } /** * ���ø���Ԫ�ص�ѡ��״̬�����Զ����������¼��ڵ��ѡ��״̬�� * @param elements */ public void setCheckedElementsWithNotify(Object[] elements) { super.setCheckedElements(elements); for(Object o : elements) { listener.checkStateChanged(new CheckStateChangedEvent(this, o, true)); } } class CheckStateListener implements ICheckStateListener { private final int CHECK_WHITE = 1; private final int CHECK_GRAY = 2; private final int CHECK_NOT = 0; public void checkStateChanged(CheckStateChangedEvent event) { Object thisObj = event.getElement(); Object parent = CheckboxTreeViewerEx.this.getParentElement(thisObj); CheckboxTreeViewerEx.this.setGrayed(thisObj, false); if (event.getChecked()) { if(parent != null){ check(parent, CHECK_WHITE); } // ��ѡ���ˣ���ѡ�������ӽ�� setSubtreeChecked(thisObj, true); } else { if(parent != null){ check(parent, CHECK_NOT); } setSubtreeChecked(thisObj, false); } while (parent != null) { setCurrentCheckState(parent); parent = CheckboxTreeViewerEx.this.getParentElement(parent); } } /** * �����ӽ��״̬����ѡ��״̬ * @param parent */ private void setCurrentCheckState(Object parent) { Object[] children = CheckboxTreeViewerEx.this.getSortedChildren(parent); int checkCount1 = 0; // ��ѡ����ӽ�� int checkCount2 = 0; // ����ѡ����ӽ�� for (Object child : children) { if (CheckboxTreeViewerEx.this.getChecked(child)) { if ( CheckboxTreeViewerEx.this.getGrayed(child)) { checkCount2++; } else { checkCount1++; } } } if (checkCount1 == children.length) { check(parent, CHECK_WHITE); } else if (checkCount1 > 0 || checkCount2 > 0) { check(parent, CHECK_GRAY); } else { check(parent, CHECK_NOT); } } private void check(Object element, int state) { switch (state) { case CHECK_WHITE: CheckboxTreeViewerEx.this.setGrayed(element, false); CheckboxTreeViewerEx.this.setChecked(element, true); break; case CHECK_GRAY: CheckboxTreeViewerEx.this.setGrayChecked(element, true); break; case CHECK_NOT: CheckboxTreeViewerEx.this.setGrayChecked(element, false); break; default: break; } } } }