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.exception.ProcessInterruptedException;
import javafx.application.Platform;
import javafx.scene.control.Alert;
import javafx.scene.control.Label;
import javafx.scene.control.TextArea;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Priority;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.ResourceBundle;
/**
* This abstract class defines the handling of {@link ProcessInterruptedException}
* <p/>
* When such an error occurs, a dialog is shown with the exception stacktrace
*/
public abstract class InterruptibleProcessController {
public static final String PROCESS_INTERRUPTED_MESSAGE = "Process interrupted";
protected abstract ResourceBundle getResourceBundle();
/**
* Default handling of the exception, displays information in an alert dialog.
*
* @param e the exception
*/
public void handleInterruption(ProcessInterruptedException e) {
if (Platform.isFxApplicationThread()) {
showAlert(e);
} else {
Platform.runLater(() -> showAlert(e));
}
}
private void showAlert(ProcessInterruptedException e) {
Alert alert = new Alert(Alert.AlertType.ERROR);
ResourceBundle resources = getResourceBundle();
alert.setTitle(resources.getString("exception_alert.title"));
alert.setHeaderText(resources.getString("exception_alert.header"));
alert.setContentText(e.getMessage());
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
e.printStackTrace(pw);
String exceptionText = sw.toString();
Label stackTraceLabel = new Label(resources.getString("exception_alert.label"));
TextArea stackTraceTextArea = new TextArea(exceptionText);
stackTraceTextArea.setEditable(false);
stackTraceTextArea.setWrapText(true);
GridPane.setVgrow(stackTraceTextArea, Priority.ALWAYS);
GridPane.setHgrow(stackTraceTextArea, Priority.ALWAYS);
GridPane expandableContent = new GridPane();
expandableContent.setPrefSize(400, 400);
expandableContent.setMaxWidth(Double.MAX_VALUE);
expandableContent.add(stackTraceLabel, 0, 0);
expandableContent.add(stackTraceTextArea, 0, 1);
alert.getDialogPane().setExpandableContent(expandableContent);
// Dirty Linux only fix...
// Expandable zones cause the dialog not to resize correctly
if (System.getProperty("os.name").matches(".*[Ll]inux.*")) {
alert.getDialogPane().setPrefSize(600, 400);
alert.setResizable(true);
alert.getDialogPane().setExpanded(true);
}
alert.showAndWait();
}
}