// ============================================================================
//
// Copyright (C) 2006-2016 Talend Inc. - www.talend.com
//
// This source code is available under agreement available at
// %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt
//
// You should have received a copy of the agreement
// along with this program; if not, write to Talend SA
// 9 rue Pages 92150 Suresnes, France
//
// ============================================================================
package com.amalto.workbench.providers;
import java.util.HashMap;
import java.util.Map;
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.TreeItem;
import org.eclipse.ui.dialogs.ContainerCheckedTreeViewer;
import com.amalto.workbench.models.TreeObject;
import com.amalto.workbench.models.TreeParent;
/**
* DOC hcw class global comment. Detailled comment
*/
public class CheckboxRepositoryTreeViewer extends ContainerCheckedTreeViewer implements ITreeViewerListener {
private Map<String, Boolean> expanded = new HashMap<String, Boolean>();
public CheckboxRepositoryTreeViewer(Composite parent, int style) {
super(parent, style);
}
private TreeObject getTreeObject(Item node) {
Object data = node.getData();
TreeObject repositoryNode = null;
if (data instanceof TreeObject) {
repositoryNode = (TreeObject) data;
}
return repositoryNode;
}
@Override
protected boolean getExpanded(Item item) {
TreeObject repositoryNode = getTreeObject(item);
if (repositoryNode != null && repositoryNode.getDisplayName() != null) {
Boolean result = expanded.get(repositoryNode.getDisplayName());
if (result != null) {
if (item instanceof TreeItem) {
TreeItem treeItem = (TreeItem) item;
treeItem.setExpanded(result);
}
}
}
return super.getExpanded(item);
}
@Override
public void setExpandedState(Object elementOrTreePath, boolean expanded) {
if (expanded) {
internalExpand(elementOrTreePath);
} else {
internalCollapse(elementOrTreePath);
}
super.setExpandedState(elementOrTreePath, expanded);
}
public void treeCollapsed(TreeExpansionEvent event) {
Object element = event.getElement();
internalCollapse(element);
}
public void treeExpanded(TreeExpansionEvent event) {
Object element = event.getElement();
internalExpand(element);
}
private void internalCollapse(Object element) {
if (element instanceof TreeObject) {
TreeObject repositoryNode = (TreeObject) element;
if (idIsValid(repositoryNode)) {
expanded.put(repositoryNode.getDisplayName(), false);
}
if (repositoryNode instanceof TreeParent)
emptyExpandedChildren((TreeParent) repositoryNode);
}
}
private void internalExpand(Object element) {
if (element instanceof TreeObject) {
TreeObject repositoryNode = (TreeObject) element;
if (idIsValid(repositoryNode)) {
expanded.put(repositoryNode.getDisplayName(), true);
}
}
}
private void emptyExpandedChildren(TreeParent repositoryNode) {
for (TreeObject children : repositoryNode.getChildren()) {
if (children instanceof TreeParent)
emptyExpandedChildren((TreeParent) children);
else {
if (idIsValid(children)) {
expanded.remove(children.getDisplayName());
}
}
}
}
private boolean idIsValid(TreeObject repositoryNode) {
// String id = repositoryNode.getId();
// return id != null && !TreeObject.NO_ID.equals(id);
return true;
}
}