package com.griddynamics.jagger.webclient.client.components;
import com.google.gwt.cell.client.AbstractCell;
import com.google.gwt.resources.client.ImageResource;
import com.google.gwt.safecss.shared.SafeStyles;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.griddynamics.jagger.dbapi.dto.NodeInfoDto;
import com.sencha.gxt.core.client.ValueProvider;
import com.sencha.gxt.data.shared.ModelKeyProvider;
import com.sencha.gxt.data.shared.TreeStore;
import com.sencha.gxt.data.shared.event.StoreAddEvent;
import com.sencha.gxt.widget.core.client.grid.ColumnConfig;
import com.sencha.gxt.widget.core.client.grid.ColumnModel;
import com.sencha.gxt.widget.core.client.treegrid.TreeGrid;
import java.util.*;
public class NodesTablePanel extends VerticalPanel{
private final String NAME = "name";
private final String SESSION_INFO_ID = "sessionInfo";
private final int MIN_COLUMN_WIDTH = 250;
private final String ONE_HUNDRED_PERCENTS = "100%";
private final double METRIC_COLUMN_WIDTH_FACTOR = 1.5;
private final String WHITE_SPACE_NORMAL = "white-space: normal";
private TreeGrid<TreeItem> treeGrid;
private TreeStore<TreeItem> treeStore = new TreeStore<TreeItem>(new ModelKeyProvider<TreeItem>() {
@Override
public String getKey(TreeItem item) {
return String.valueOf(item.getKey());
}
});
public NodesTablePanel(){
setWidth(ONE_HUNDRED_PERCENTS);
setHeight(ONE_HUNDRED_PERCENTS);
}
public void createTable(String sessionId, List<NodeInfoDto> nodeInfoDtoList){
int colWidth = MIN_COLUMN_WIDTH;
treeStore.clear();
List<ColumnConfig<TreeItem, ?>> columns = new ArrayList<ColumnConfig<TreeItem, ?>>();
//sort nodes by nodeId
SortedSet<NodeInfoDto> sortedNodeInfoDtoList = new TreeSet<NodeInfoDto>(new Comparator<NodeInfoDto>() {
@Override
public int compare(NodeInfoDto o, NodeInfoDto o2) {
int res = String.CASE_INSENSITIVE_ORDER.compare(o.getNodeId(), o2.getNodeId());
return (res != 0) ? res : o.getNodeId().compareTo(o2.getNodeId());
}
});
sortedNodeInfoDtoList.addAll(nodeInfoDtoList);
ColumnConfig<TreeItem, String> nameColumn =
new ColumnConfig<TreeItem, String>(new MapValueProvider(NAME), (int)(colWidth * METRIC_COLUMN_WIDTH_FACTOR));
nameColumn.setHeader("Parameter");
nameColumn.setSortable(false);
nameColumn.setMenuDisabled(true);
columns.add(nameColumn);
// Header
for (NodeInfoDto node : sortedNodeInfoDtoList) {
ColumnConfig<TreeItem, String> column =
new ColumnConfig<TreeItem, String>(new MapValueProvider(node.getNodeId()));
column.setHeader(node.getNodeId());
column.setWidth(colWidth);
column.setSortable(false);
column.setCell(new AbstractCell<String>() {
@Override
public void render(Context context, String value, SafeHtmlBuilder sb) {
if (value != null) {
sb.appendHtmlConstant(value);
}
}
});
column.setMenuDisabled(true);
column.setColumnTextStyle(new SafeStyles() {
@Override
public String asString() {
return WHITE_SPACE_NORMAL;
}
});
columns.add(column);
}
ColumnModel<TreeItem> cm = new ColumnModel<TreeItem>(columns);
treeGrid = new NoIconsTreeGrid(treeStore, cm, nameColumn);
treeGrid.setAutoExpand(true);
treeGrid.getView().setStripeRows(true);
treeGrid.setMinColumnWidth(MIN_COLUMN_WIDTH);
treeGrid.setAllowTextSelection(true);
treeStore.addStoreAddHandler(new StoreAddEvent.StoreAddHandler<TreeItem>() {
@Override
public void onAdd(StoreAddEvent<TreeItem> event) {
for (TreeItem item : event.getItems()) {
treeGrid.setExpanded(item, true);
}
}
});
add(treeGrid);
// Data
// Session
TreeItem sessionInfo = new TreeItem(SESSION_INFO_ID);
sessionInfo.put(NAME, "Session " + sessionId);
treeStore.insert(0, sessionInfo);
// Get all params
Set<String> param_names = new TreeSet<String>();
for (NodeInfoDto node : sortedNodeInfoDtoList){
param_names.addAll(node.getParameters().keySet());
}
for (String param_name : param_names) {
TreeItem date = new TreeItem(param_name);
date.put(NAME, param_name);
for (NodeInfoDto node : sortedNodeInfoDtoList){
if (node.getParameters().containsKey(param_name)) {
date.put(node.getNodeId(), node.getParameters().get(param_name));
}
else {
date.put(node.getNodeId(), "");
}
}
treeStore.add(sessionInfo, date);
}
}
private class NoIconsTreeGrid extends TreeGrid<TreeItem> {
public NoIconsTreeGrid(TreeStore<TreeItem> store, ColumnModel<TreeItem> cm, ColumnConfig<TreeItem, ?> treeColumn) {
super(store, cm, treeColumn);
}
@Override
protected ImageResource calculateIconStyle(TreeItem model) {
return null;
}
}
public class TreeItem extends HashMap<String, String> {
String key;
private String getKey() {
return key;
}
@SuppressWarnings("unused")
public TreeItem() {}
public TreeItem(String key) {
this.key = key;
}
}
private class MapValueProvider implements ValueProvider<TreeItem, String> {
private String field;
public MapValueProvider(String field) {
this.field = field;
}
@Override
public String getValue(TreeItem object) {
return object.get(field);
}
@Override
public void setValue(TreeItem object, String value) {
object.put(field, value);
}
@Override
public String getPath() {
return field;
}
}
}