package ch.ge.ve.offlineadmin.controller;
/*-
* #%L
* Admin offline
* %%
* Copyright (C) 2015 - 2016 République et Canton de Genève
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
* #L%
*/
import ch.ge.ve.offlineadmin.util.LogLevel;
import ch.ge.ve.offlineadmin.util.LogMessage;
import ch.ge.ve.offlineadmin.util.ProgressTracker;
import de.jensd.fx.glyphs.GlyphIcon;
import javafx.application.Platform;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.Event;
import javafx.fxml.FXML;
import javafx.scene.control.Label;
import javafx.scene.control.ProgressBar;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.Pane;
import java.io.IOException;
/**
* This controller defines a reusable component. It features a log table for displaying messages, as well as a progress
* bar to track process progression
*/
public class ConsoleOutputControl extends AnchorPane implements ProgressTracker {
private final ObservableList<LogMessage> logMessages = FXCollections.observableArrayList();
@FXML
private TableView<LogMessage> logTable;
@FXML
private ProgressBar progressBar;
private int stepCount;
private int currentStep = 0;
@FXML
public void initialize() throws IOException {
TableColumn<LogMessage, GlyphIcon> logLevelColumn = new TableColumn<>();
logLevelColumn.setCellValueFactory(new PropertyValueFactory<>("glyphIcon"));
logLevelColumn.setMinWidth(50.0);
logLevelColumn.setPrefWidth(50.0);
logLevelColumn.setMaxWidth(50.0);
TableColumn<LogMessage, String> messageColumn = new TableColumn<>();
messageColumn.setCellValueFactory(new PropertyValueFactory<>("message"));
logTable.setItems(logMessages);
ObservableList<TableColumn<LogMessage, ?>> tableColumns = logTable.getColumns();
tableColumns.add(logLevelColumn);
tableColumns.add(messageColumn);
logTable.setEditable(false);
// Prevent cell selection
logTable.addEventFilter(MouseEvent.ANY, Event::consume);
// Do not display a placeholder
logTable.setPlaceholder(new Label(""));
// Hide the header row
logTable.widthProperty().addListener((observable, oldValue, newValue) -> {
Pane header = (Pane) logTable.lookup("TableHeaderRow");
if (header.isVisible()) {
header.setMaxHeight(0);
header.setMinHeight(0);
header.setPrefHeight(0);
header.setVisible(false);
}
});
progressBar.setProgress(0f);
}
/**
* Add a message to the log table, with level {@link LogLevel#OK}
*
* @param message the message to be added
*/
public void logOnScreen(String message) {
logOnScreen(message, LogLevel.OK);
}
/**
* Add a message to the log table, with the specified level
*
* @param message the message to be added
* @param logLevel the level of the message
*/
public void logOnScreen(String message, LogLevel logLevel) {
logMessages.add(new LogMessage(logLevel, message));
logTable.scrollTo(logMessages.size() - 1);
logTable.getSelectionModel().clearSelection();
}
@Override
public void progressMessage(String message) {
logOnScreen(message);
}
@Override
public void progressMessage(String message, LogLevel logLevel) {
logOnScreen(message, logLevel);
}
@Override
public void setStepCount(int stepCount) {
this.stepCount = stepCount;
}
@Override
public void incrementStepCount() {
if (Platform.isFxApplicationThread()) {
incrementProgress();
} else {
Platform.runLater(this::incrementProgress);
}
}
private void incrementProgress() {
progressBar.setProgress(++currentStep / (double) stepCount);
}
}