package org.opennms.features.gwt.graph.resource.list.client.view;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.opennms.features.gwt.graph.resource.list.client.view.styles.CustomCellTreeResource;
import com.google.gwt.cell.client.AbstractCell;
import com.google.gwt.cell.client.Cell;
import com.google.gwt.cell.client.CheckboxCell;
import com.google.gwt.cell.client.CompositeCell;
import com.google.gwt.cell.client.FieldUpdater;
import com.google.gwt.cell.client.HasCell;
import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Element;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
import com.google.gwt.user.cellview.client.CellTree;
import com.google.gwt.user.cellview.client.TreeNode;
import com.google.gwt.view.client.DefaultSelectionEventManager;
import com.google.gwt.view.client.ListDataProvider;
import com.google.gwt.view.client.MultiSelectionModel;
import com.google.gwt.view.client.TreeViewModel;
public class ReportSelectListCellTree extends CellTree {
private static class ResourceType{
private final String m_name;
private final List<ResourceListItem> m_resourceList = new ArrayList<ResourceListItem>();
public ResourceType(String name) {
m_name = name;
}
public void addResourceListItem(ResourceListItem item) {
m_resourceList.add(item);
}
public String getName() {
return m_name;
}
public List<ResourceListItem> getResourceList(){
return m_resourceList;
}
}
private static class CustomTreeModel implements TreeViewModel {
private final class ResourceListItemCell extends AbstractCell<ResourceListItem> {
@Override
public void render(Context context, ResourceListItem value, SafeHtmlBuilder sb) {
if(value != null) {
sb.appendEscaped(value.getValue());
}
}
}
private final class ResourceTypCell extends AbstractCell<ResourceType> {
@Override
public void render(Context context, ResourceType value, SafeHtmlBuilder sb) {
if(value != null) {
sb.appendEscaped(value.getName() + " (" + value.getResourceList().size() + ")");
}
}
}
private final List<ResourceType> m_resourceTypes;
private final MultiSelectionModel<ResourceListItem> m_multipleSelectionModel;
private final Cell<ResourceListItem> m_resourceListItemCell;
private final DefaultSelectionEventManager<ResourceListItem> m_selectionManager = DefaultSelectionEventManager.createCheckboxManager();
public CustomTreeModel(List<ResourceListItem> resourceList, MultiSelectionModel<ResourceListItem> selectionModel) {
m_resourceTypes = new ArrayList<ResourceType>();
organizeList(resourceList);
m_multipleSelectionModel = selectionModel;
List<HasCell<ResourceListItem, ?>> hasCells = new ArrayList<HasCell<ResourceListItem, ?>>();
hasCells.add(new HasCell<ResourceListItem, Boolean>(){
private CheckboxCell m_cell = new CheckboxCell(true, false);
@Override
public Cell<Boolean> getCell() {
return m_cell;
}
@Override
public FieldUpdater<ResourceListItem, Boolean> getFieldUpdater() {
return null;
}
@Override
public Boolean getValue(ResourceListItem object) {
return m_multipleSelectionModel.isSelected(object);
}
});
hasCells.add(new HasCell<ResourceListItem, ResourceListItem>(){
private ResourceListItemCell m_cell = new ResourceListItemCell();
@Override
public Cell<ResourceListItem> getCell() {
return m_cell;
}
@Override
public FieldUpdater<ResourceListItem, ResourceListItem> getFieldUpdater() {
return null;
}
@Override
public ResourceListItem getValue(ResourceListItem object) {
return object;
}
});
m_resourceListItemCell = new CompositeCell<ResourceListItem>(hasCells) {
@Override
public void render(Context context, ResourceListItem value, SafeHtmlBuilder sb) {
super.render(context, value, sb);
}
@Override
protected Element getContainerElement(Element parent) {
return super.getContainerElement(parent);
}
@Override
protected <X> void render(Context context, ResourceListItem value, SafeHtmlBuilder sb,
HasCell<ResourceListItem, X> hasCell) {
super.render(context, value, sb, hasCell);
}
};
}
private void organizeList(List<ResourceListItem> resourceList) {
Map<String, String> types = new HashMap<String, String>();
for(ResourceListItem item : resourceList) {
if(!types.containsKey(item.getType())) {
types.put(item.getType(), item.getType());
}
}
for(String typeName : types.keySet()) {
ResourceType rType = new ResourceType(typeName);
for(ResourceListItem r : resourceList) {
if(r.getType().equals(typeName)) {
rType.addResourceListItem(r);
}
}
m_resourceTypes.add(rType);
}
}
/**
* Get the {@link NodeInfo} that provides the children of the specified
* value.
*/
public <T> NodeInfo<?> getNodeInfo(T value) {
if(value == null) {
ListDataProvider<ResourceType> dataProvider = new ListDataProvider<ResourceType>(m_resourceTypes);
Cell<ResourceType> cell = new ResourceTypCell();
return new DefaultNodeInfo<ResourceType>(dataProvider, cell);
}else if(value instanceof ResourceType) {
ListDataProvider<ResourceListItem> dataProvider = new ListDataProvider<ResourceListItem>(((ResourceType) value).getResourceList());
return new DefaultNodeInfo<ResourceListItem>(dataProvider, m_resourceListItemCell, m_multipleSelectionModel, m_selectionManager, null);
}
return null;
}
/**
* Check if the specified value represents a leaf node. Leaf nodes cannot be
* opened.
*/
public boolean isLeaf(Object value) {
if(value instanceof ResourceListItem) {
return true;
}else {
return false;
}
}
}
public ReportSelectListCellTree(List<ResourceListItem> resourceList, MultiSelectionModel<ResourceListItem> selectionModel) {
super(new CustomTreeModel(resourceList, selectionModel), null, (CellTree.Resources)GWT.create(CustomCellTreeResource.class));
setDefaultNodeSize(10000);
TreeNode treeNode = getRootTreeNode();
for(int i = 0; i < treeNode.getChildCount(); i++) {
treeNode.setChildOpen(i, true);
}
}
}