in application/org.openjdk.jmc.joverflow.ui/src/main/java/org/openjdk/jmc/joverflow/ui/viewers/ItemPieChart.java [341:495]
private void initLegend() {
TableColumn<T, String> name = new TableColumn<T, String>("Name");
name.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<T, String>, ObservableValue<String>>() {
@Override
public ObservableValue<String> call(CellDataFeatures<T, String> param) {
return new SimpleObjectProperty<String>(param.getValue().getName());
}
});
name.setCellFactory(new Callback<TableColumn<T, String>, TableCell<T, String>>() {
@Override
public TableCell<T, String> call(TableColumn<T, String> param) {
return new TableCell<T, String>() {
Region icon = new Region();
{
icon.getStyleClass().setAll("chart-pie", "chart-legend-item-symbol", "pie-legend-symbol");
setGraphic(icon);
updateNodeHover(icon, false);
}
@Override
public void updateIndex(int i) {
if (i >= 0 && i < getTableView().getItems().size() && i != getIndex()) {
doUpdateContent(i);
}
super.updateIndex(i);
}
@Override
protected void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
if (!empty) {
doUpdateContent(getIndex());
} else {
setText(null);
setGraphic(null);
}
}
private void doUpdateContent(int i) {
T item = getTableView().getItems().get(i);
iconMap.put(icon, item);
updateNodeColor(icon, pieItems.containsKey(item) ? getColor(item.getIndex()) : OTHER_COLOR);
// updateNodeHover(icon, getTableRow().isHover());
setText(item.getName());
setGraphic(icon);
}
};
}
});
name.setPrefWidth(215);
final TableColumn<T, Number> memory = new TableColumn<T, Number>("Memory KB");
memory.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<T, Number>, ObservableValue<Number>>() {
@Override
public ObservableValue<Number> call(CellDataFeatures<T, Number> param) {
return param.getValue().memoryProperty();
}
});
memory.setCellFactory(CellFactories.<T, Number> getMemoryCellFactory());
memory.setPrefWidth(90);
memory.setSortType(SortType.DESCENDING);
final TableColumn<T, Number> ovhd = new TableColumn<T, Number>("Overhead KB");
ovhd.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<T, Number>, ObservableValue<Number>>() {
@Override
public ObservableValue<Number> call(CellDataFeatures<T, Number> param) {
return param.getValue().ovhdProperty();
}
});
ovhd.setCellFactory(CellFactories.<T, Number> getOvhdCellFactory());
ovhd.setPrefWidth(100);
final TableColumn<T, Number> size = new TableColumn<T, Number>("Objects");
size.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<T, Number>, ObservableValue<Number>>() {
@Override
public ObservableValue<Number> call(CellDataFeatures<T, Number> param) {
return param.getValue().sizeProperty();
}
});
size.setCellFactory(CellFactories.<T, Number> getSizeCellFactory());
size.setPrefWidth(75);
legend.getColumns().setAll(name, memory, ovhd, size);
legend.setRowFactory(new Callback<TableView<T>, TableRow<T>>() {
@Override
public TableRow<T> call(TableView<T> param) {
final TableRow<T> tr = new TableRow<T>();
tr.setOnMousePressed(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent me) {
if (legend.getItems().size() > tr.getIndex()) {
T item = legend.getItems().get(tr.getIndex());
switch (me.getButton()) {
case PRIMARY:
onItemPrimaryAction(item);
break;
case SECONDARY:
onItemSecondaryAction(item);
break;
case NONE:
case MIDDLE:
}
}
me.consume();
}
});
tr.hoverProperty().addListener(new ChangeListener<Boolean>() {
@Override
public void changed(ObservableValue<? extends Boolean> o, Boolean old, Boolean isHovered) {
int index = tr.getIndex();
if (legend.getItems().size() > index && index >= 0) {
T item = legend.getItems().get(index);
onItemHovered(item, isHovered);
}
}
});
return tr;
}
});
legend.getSortOrder().addListener(new InvalidationListener() {
@Override
public void invalidated(Observable observable) {
if (legend.getSortOrder().size() > 0) {
TableColumn<T, ?> tc = legend.getSortOrder().get(0);
if (tc.equals(memory)) {
setCurrentProperty(PieProperty.MEMORY);
} else if (tc.equals(ovhd)) {
setCurrentProperty(PieProperty.OVERHEAD);
} else if (tc.equals(size)) {
setCurrentProperty(PieProperty.COUNT);
}
}
}
private void setCurrentProperty(PieProperty newVal) {
currentProperty = newVal;
updatePie();
for (T item : pieItems.keySet()) {
pieItems.get(item).pieValueProperty().bind(getProperty(item));
}
}
});
legend.getSortOrder().add(memory);
legend.sort();
}