blob: 4cc9bda28cac88345f73915ee32b275ca2b6b198 [file] [log] [blame]
package org.eclipse.epf.authoring.ui.views;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
import org.eclipse.epf.library.edit.util.TngUtil;
import org.eclipse.epf.uma.CustomCategory;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTreeViewer;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.ITreeViewerListener;
import org.eclipse.jface.viewers.TreeExpansionEvent;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Item;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.swt.widgets.Widget;
import org.eclipse.ui.dialogs.ContainerCheckedTreeViewer;
/**
* ContainerCheckedTreeViewer class that supports MethodElements.
* Specifically, has changes to support FeatureValueWrapperItemProviders.
*
* Also, expands the tree for checked items when they are set via
* setCheckedElements(..) iff expandWhenChecking is true.
* @author Jeff Hardy
*
*/
public class MethodContainerCheckedTreeViewer extends
ContainerCheckedTreeViewer {
protected boolean expandWhenChecking = false;
/**
* Constructor for ContainerCheckedTreeViewer2.
* @see CheckboxTreeViewer#CheckboxTreeViewer(Composite)
*/
public MethodContainerCheckedTreeViewer(Composite parent) {
super(parent);
initViewer();
}
/**
* Constructor for ContainerCheckedTreeViewer2.
* @see CheckboxTreeViewer#CheckboxTreeViewer(Composite,int)
*/
public MethodContainerCheckedTreeViewer(Composite parent, int style) {
super(parent, style);
initViewer();
}
/**
* Constructor for ContainerCheckedTreeViewer2.
* @see CheckboxTreeViewer#CheckboxTreeViewer(Tree)
*/
public MethodContainerCheckedTreeViewer(Tree tree) {
super(tree);
initViewer();
}
protected void initViewer() {
setUseHashlookup(true);
addCheckStateListener(new ICheckStateListener() {
public void checkStateChanged(CheckStateChangedEvent event) {
doCheckStateChanged(event.getElement());
}
});
addTreeListener(new ITreeViewerListener() {
public void treeCollapsed(TreeExpansionEvent event) {
}
public void treeExpanded(TreeExpansionEvent event) {
Widget item = findItem(event.getElement());
if (item instanceof TreeItem) {
initializeItem((TreeItem) item);
}
}
});
}
/**
* The item has expanded. Updates the checked state of its children.
*/
protected void initializeItem(TreeItem item) {
if (item.getChecked() && !item.getGrayed()) {
updateChildrenItems(item);
}
}
/**
* Updates the check state of all created children
*/
protected void updateChildrenItems(TreeItem parent) {
Item[] children = getChildren(parent);
boolean state = parent.getChecked();
for (int i = 0; i < children.length; i++) {
TreeItem curr = (TreeItem) children[i];
if (curr.getData() != null
&& ((curr.getChecked() != state) || curr.getGrayed())) {
curr.setChecked(state);
curr.setGrayed(false);
updateChildrenItems(curr);
}
}
}
/**
* Update element after a checkstate change.
* @param element
*/
protected void doCheckStateChanged(Object element) {
Widget item = findItem(element);
if (item instanceof TreeItem) {
TreeItem treeItem = (TreeItem) item;
treeItem.setGrayed(false);
updateChildrenItems(treeItem);
updateParentItems(treeItem.getParentItem());
}
}
/**
* Updates the check / gray state of all parent items
*/
protected void updateParentItems(TreeItem item) {
if (item != null) {
Item[] children = getChildren(item);
boolean containsChecked = false;
boolean containsUnchecked = false;
for (int i = 0; i < children.length; i++) {
TreeItem curr = (TreeItem) children[i];
containsChecked |= curr.getChecked();
containsUnchecked |= (!curr.getChecked() || curr.getGrayed());
}
item.setChecked(containsChecked);
item.setGrayed(containsChecked && containsUnchecked);
if (expandWhenChecking && item.getChecked()) {
item.setExpanded(true);
}
updateParentItems(item.getParentItem());
}
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.CheckboxTreeViewer#setCheckedElements(java.lang.Object[])
*/
public void setCheckedElements(Object[] elements) {
// fix elements list to use our wrappers
List<Object> treeElements = new ArrayList<Object>();
AdapterFactory adapterFactory = null;
if (getContentProvider() instanceof AdapterFactoryContentProvider) {
adapterFactory = ((AdapterFactoryContentProvider)getContentProvider()).getAdapterFactory();
}
for (int i = 0;i < elements.length; i++) {
Object element = elements[i];
if (element instanceof CustomCategory && adapterFactory != null) {
treeElements.add(TngUtil.getFeatureValueWrapperItemProviderForCC(adapterFactory, (CustomCategory)element));
} else {
treeElements.add(element);
}
}
super.setCheckedElements(treeElements.toArray());
for (Object element : treeElements) {
doCheckStateChanged(element);
}
}
public boolean isExpandWhenChecking() {
return expandWhenChecking;
}
public void setExpandWhenChecking(boolean expandWhenChecking) {
this.expandWhenChecking = expandWhenChecking;
}
}