package edu.ualberta.med.biobank.widgets.trees.permission;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.eclipse.jface.viewers.AbstractTreeViewer;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.ui.dialogs.ContainerCheckedTreeViewer;
import edu.ualberta.med.biobank.model.PermissionEnum;
public class PermissionCheckTreeWidget extends Composite {
private final PermissionsCheckStateHandler permissionsCheckStateHandler =
new PermissionsCheckStateHandler();
private final Map<PermissionEnum, PermissionNode> nodes =
new HashMap<PermissionEnum, PermissionNode>();
private final Set<PermissionEnum> disabled = new HashSet<PermissionEnum>();
private ContainerCheckedTreeViewer treeviewer;
private PermissionRootNode rootNode;
public PermissionCheckTreeWidget(Composite parent, boolean title,
List<PermissionEnum> permissions) {
super(parent, SWT.NONE);
GridLayout gl = new GridLayout(2, false);
gl.marginWidth = 0;
gl.marginHeight = 0;
gl.marginTop = 10;
gl.horizontalSpacing = 5;
gl.verticalSpacing = 5;
this.setLayout(gl);
if (title) {
Label label = new Label(this, SWT.NONE);
label.setText(Messages.PermissionCheckTree_title);
GridData gd = new GridData(SWT.FILL, SWT.NONE, true, false);
gd.horizontalSpan = 2;
label.setLayoutData(gd);
}
// Label filterLabel = new Label(this, SWT.NONE);
// filterLabel.setText(Messages.PermissionCheckTreeWidget_show_label);
// final Combo comboShowRights = new Combo(this, SWT.READ_ONLY);
// comboShowRights
// .add(Messages.PermissionCheckTreeWidget_allcenters_label);
// comboShowRights.add(Messages.PermissionCheckTreeWidget_sites_label);
// comboShowRights.add(Messages.PermissionCheckTreeWidget_clinics_label);
// comboShowRights.add(Messages.PermissionCheckTreeWidget_rgs_labels);
// comboShowRights.select(0);
// comboShowRights.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true,
// false));
// comboShowRights.addSelectionListener(new SelectionAdapter() {
// @Override
// public void widgetSelected(SelectionEvent e) {
// treeviewer.refresh();
// }
// });
treeviewer = new ContainerCheckedTreeViewer(this);
GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
gd.heightHint = 160;
gd.horizontalSpan = 2;
treeviewer.getTree().setLayoutData(gd);
treeviewer.setUseHashlookup(true);
treeviewer.setLabelProvider(new PermissionLabelProvider());
treeviewer.setContentProvider(new PermissionContentProvider());
treeviewer.setComparator(new ViewerComparator());
treeviewer.setInput(buildContent(permissions));
treeviewer.expandToLevel(AbstractTreeViewer.ALL_LEVELS);
treeviewer.addCheckStateListener(permissionsCheckStateHandler);
}
@Override
public void setEnabled(boolean enabled) {
super.setEnabled(enabled);
treeviewer.getTree().setEnabled(enabled);
}
public void setInput(Collection<PermissionEnum> perms) {
treeviewer.removeCheckStateListener(permissionsCheckStateHandler);
try {
treeviewer.setInput(buildContent(perms));
} finally {
treeviewer.addCheckStateListener(permissionsCheckStateHandler);
}
}
private Collection<PermissionNode> buildContent(
Collection<PermissionEnum> allPermissions) {
nodes.clear();
for (PermissionEnum perm : allPermissions) {
PermissionNode node = new PermissionNode(rootNode, perm);
nodes.put(perm, node);
}
return nodes.values();
}
public void setSelections(Collection<PermissionEnum> permissions) {
treeviewer.removeCheckStateListener(permissionsCheckStateHandler);
try {
List<IPermissionCheckTreeNode> checkedNodes =
new ArrayList<IPermissionCheckTreeNode>();
for (PermissionEnum permission : permissions) {
PermissionNode node = nodes.get(permission);
checkedNodes.add(node);
}
treeviewer.setCheckedElements(checkedNodes.toArray());
} finally {
treeviewer.addCheckStateListener(permissionsCheckStateHandler);
}
}
public Set<PermissionEnum> getCheckedElements() {
Set<PermissionEnum> checked = new HashSet<PermissionEnum>();
for (Object checkedO : treeviewer.getCheckedElements()) {
if (checkedO instanceof PermissionNode) {
PermissionNode node = (PermissionNode) checkedO;
checked.add(node.getPermission());
}
}
return checked;
}
public void setDisabled(Set<PermissionEnum> perms) {
disabled.clear();
disabled.addAll(perms);
treeviewer.refresh();
}
public boolean hasCheckedItems() {
return treeviewer.getCheckedElements().length > 0;
}
public void addCheckStateListener(ICheckStateListener checkStateListener) {
treeviewer.addCheckStateListener(checkStateListener);
}
public void removeCheckStateListener(ICheckStateListener checkStateListener) {
treeviewer.removeCheckStateListener(checkStateListener);
}
public class PermissionContentProvider implements ITreeContentProvider {
@Override
public void dispose() {
}
@Override
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
@SuppressWarnings("rawtypes")
@Override
public Object[] getElements(Object inputElement) {
if (inputElement instanceof Object[]) {
return (Object[]) inputElement;
}
if (inputElement instanceof Collection) {
return ((Collection) inputElement).toArray();
}
return new Object[0];
}
@Override
public Object[] getChildren(Object parentElement) {
if (parentElement instanceof IPermissionCheckTreeNode)
return ((IPermissionCheckTreeNode) parentElement).getChildren()
.toArray();
return new Object[0];
}
@Override
public Object getParent(Object element) {
if (element instanceof IPermissionCheckTreeNode)
return ((IPermissionCheckTreeNode) element).getParent();
return null;
}
@Override
public boolean hasChildren(Object element) {
if (element instanceof IPermissionCheckTreeNode)
return getChildren(element).length > 0;
return false;
}
}
public class PermissionLabelProvider implements ILabelProvider {
@Override
public void addListener(ILabelProviderListener listener) {
}
@Override
public void dispose() {
}
@Override
public boolean isLabelProperty(Object element, String property) {
return false;
}
@Override
public void removeListener(ILabelProviderListener listener) {
}
@Override
public Image getImage(Object element) {
return null;
}
@Override
public String getText(Object element) {
if (element instanceof IPermissionCheckTreeNode)
return ((IPermissionCheckTreeNode) element).getText();
return "Problem with display"; //$NON-NLS-1$
}
}
private class PermissionsCheckStateHandler implements ICheckStateListener {
@Override
public void checkStateChanged(CheckStateChangedEvent event) {
Object element = event.getElement();
if (!(element instanceof PermissionNode)) return;
// PermissionNode node = (PermissionNode) event.getElement();
// PermissionEnum perm = node.getPermission();
}
@SuppressWarnings("unused")
private void updateParent(PermissionRootNode parent) {
}
}
}