package org.peerbox.app.activity; import java.text.SimpleDateFormat; import java.util.Date; import javafx.geometry.HPos; import javafx.geometry.Insets; import javafx.scene.Node; import javafx.scene.control.Label; import javafx.scene.control.ListCell; import javafx.scene.layout.ColumnConstraints; import javafx.scene.layout.GridPane; import javafx.scene.layout.Priority; import org.controlsfx.glyphfont.FontAwesome; import org.controlsfx.glyphfont.GlyphFont; import org.peerbox.utils.IconUtils; /** * UI representation of an ActivityItem in a ListView. * This cell maps the properties of a ActivityItem to a GUI control. * * @author albrecht * */ class ActivityItemCell extends ListCell<ActivityItem> { /* CSS style class for the title */ private static final String STYLE_CLASS_ITEM_TITLE = "activity-item-title"; /* CSS style class for ActivityItem of type "warning" */ private static final String STYLE_CLASS_ITEM_WARNING = "activity-item-warning"; /* formatting of timestamp */ private static final String DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss"; /* controls of this cell */ private final GridPane grid; private final Label icon; private final Label title; private final Label dateTime; private final Label description; /* font that provides icons */ private final GlyphFont fontAwesome; public ActivityItemCell() { super(); IconUtils.initFontAwesomeOffline(); fontAwesome = IconUtils.getFontAwesome(); grid = new GridPane(); icon = new Label(); title = new Label(); title.getStyleClass().add(STYLE_CLASS_ITEM_TITLE); dateTime = new Label(); description = new Label(); initializeGrid(); addControlsToGrid(); } private void initializeGrid() { grid.setHgap(10); grid.setVgap(5); grid.setPadding(new Insets(0, 10, 0, 10)); // icon column ColumnConstraints col1 = new ColumnConstraints(); col1.setFillWidth(false); col1.setHgrow(Priority.NEVER); grid.getColumnConstraints().add(col1); // title column: grows ColumnConstraints col2 = new ColumnConstraints(); col2.setFillWidth(true); col2.setHgrow(Priority.ALWAYS); grid.getColumnConstraints().add(col2); // date column ColumnConstraints col3 = new ColumnConstraints(); col3.setFillWidth(false); col3.setHgrow(Priority.NEVER); grid.getColumnConstraints().add(col3); } private void addControlsToGrid() { grid.add(icon, 0, 0, 1, 2); grid.add(title, 1, 0); grid.add(dateTime, 2, 0); GridPane.setHalignment(dateTime, HPos.RIGHT); grid.add(description, 1, 1, 2, 1); } @Override public void updateItem(ActivityItem item, boolean empty) { super.updateItem(item, empty); if (empty) { clearContent(); } else { addContent(item); } } private void clearContent() { setText(null); setGraphic(null); } private void addContent(ActivityItem item) { setText(null); title.setText(item.getTitle()); dateTime.setText(formatTimestamp(item.getTimestamp())); description.setText(item.getDescription()); icon.setGraphic(getIconByType(item.getType())); switch(item.getType()) { case WARNING: grid.getStyleClass().add(STYLE_CLASS_ITEM_WARNING); break; default: // remove all style classes of other types grid.getStyleClass().removeAll(STYLE_CLASS_ITEM_WARNING); break; } setGraphic(grid); } private Node getIconByType(ActivityType type) { Node ico = null; switch (type) { case INFORMATION: ico = fontAwesome.create(FontAwesome.Glyph.INFO_CIRCLE); break; case WARNING: ico = fontAwesome.create(FontAwesome.Glyph.WARNING); break; default: break; } return ico; } private String formatTimestamp(long timestamp) { SimpleDateFormat dateFormat = new SimpleDateFormat(DATE_TIME_PATTERN); Date date = new Date(timestamp); String formatted = dateFormat.format(date); return formatted; } }