private void initLegend()

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();
	}