package mj.ocraptor.javafx.controllers; import javafx.application.Platform; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.concurrent.Task; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.geometry.Insets; import javafx.scene.Node; import javafx.scene.control.Button; import javafx.scene.control.ScrollPane; import javafx.scene.control.ScrollPane.ScrollBarPolicy; import javafx.scene.control.TextField; import javafx.scene.input.Clipboard; import javafx.scene.input.ClipboardContent; import javafx.scene.paint.Color; import javafx.scene.paint.Paint; import javafx.scene.shape.Line; import javafx.scene.text.Text; import javafx.scene.text.TextFlow; import javafx.stage.Stage; import mj.ocraptor.configuration.Config; import mj.ocraptor.javafx.GUITemplate; import org.apache.commons.lang.StringUtils; public class MessageDialog extends GUITemplate { private static final org.slf4j.Logger LOGGER = org.slf4j.LoggerFactory .getLogger(MessageDialog.class); // *INDENT-OFF* public static double INIT_WIDTH = 400; public static double INIT_HEIGHT = 300; public static final String FXML = "MessageDialog.fxml"; // *INDENT-ON* @FXML private TextFlow messageText; @FXML private Button closeApplicationButton; @FXML private Button copyButton; @FXML private Button closeWindowButton; @FXML private ScrollPane scrollPane; @FXML void closeApplicationButtonClicked(ActionEvent event) { this.g.exitApplication(); } @FXML void copyButtonClicked(ActionEvent event) { this.executeWorker(clipboardWorker()); copyButton.setText(g.getText("MESSAGE_DIALOG.CONTENT_COPIED")); copyButton.setTextFill(Color.DARKGREEN); } private Paint originalTextFill; /** * * * @return */ private Task<Object> clipboardWorker() { return new Task<Object>() { @Override protected Object call() throws Exception { StringBuffer plainText = new StringBuffer(); for (Node textNode : messageText.getChildren()) { if (Line.class.isInstance(textNode)) { plainText.append(StringUtils.repeat("-", 100)); } else if (Text.class.isInstance(textNode)) { Text text = (Text) textNode; plainText.append(text.getText()); } else if (TextField.class.isInstance(textNode)) { TextField text = (TextField) textNode; plainText.append(text.getText()); } } final ClipboardContent content = new ClipboardContent(); content.putString(plainText.toString()); if (!plainText.toString().trim().isEmpty()) { Platform.runLater(new Runnable() { @Override public void run() { Thread.currentThread().setName(Config.APP_NAME + "JavaFX: Clipboard button clicked"); Clipboard.getSystemClipboard().setContent(content); } }); } Thread.sleep(5000); Platform.runLater(new Runnable() { @Override public void run() { Thread.currentThread().setName(Config.APP_NAME + "JavaFX: Change Clipboard button text"); copyButton.setText(g.getText("MESSAGE_DIALOG.COPY_TO_CLIPBOARD")); copyButton.setTextFill(originalTextFill); } }); return true; } }; } @FXML void closeWindowButton(ActionEvent event) { // get a handle to the stage Stage stage = (Stage) copyButton.getScene().getWindow(); // do what you have to do stage.close(); } @Override protected void initVisibility() { this.helpButton.setManaged(false); this.helpButton.setVisible(false); this.closeApplicationButton.setManaged(false); this.closeApplicationButton.setVisible(false); this.originalTextFill = this.helpButton.getTextFill(); } @Override protected void initLabels() { closeWindowButton.setText(g.getText("MESSAGE_DIALOG.CLOSE")); closeApplicationButton.setText(g.getText("MESSAGE_DIALOG.SHUTDOWN")); copyButton.setText(g.getText("MESSAGE_DIALOG.COPY_TO_CLIPBOARD")); helpButton.setText(g.getText("HELP")); } @Override public void initCustomComponents() { this.executeWorker(showDelayedWorker()); } // ------------------------------------------------ // // -- // ------------------------------------------------ // private boolean autoScroll = true; @Override protected void initListeners() { messageText.heightProperty().addListener(new ChangeListener() { @Override public void changed(ObservableValue observable, Object oldvalue, Object newValue) { if (autoScroll) { scrollPane.setVvalue((Double) newValue); autoScroll = false; } } }); } @Override protected void asserts() { // TODO Auto-generated method stub } @Override protected double getWindowWidth() { return INIT_WIDTH; } @Override protected double getWindowHeight() { return INIT_HEIGHT; } // ------------------------------------------------ // // -- // ------------------------------------------------ // /** * * * @param messages */ public void addNodes(Node... messages) { this.addNodes(false, false, true, messages); } /** * * * @param message */ public void addNodes(boolean useDivider, boolean autoScroll, boolean firstMessage, Node... nodes) { this.autoScroll = autoScroll; if (useDivider) { if (firstMessage) { this.messageText.getChildren().add(getDialogDivider()); } this.messageText.getChildren().add(new Text(" \n")); } for (Node node : nodes) { this.messageText.getChildren().add(node); } this.messageText.getChildren().add(new Text("\n")); if (useDivider) { this.messageText.getChildren().add(getDialogDivider()); } } /** * * * @return */ private Line getDialogDivider() { return this.getDivider("messageDialogDivider", 1.0f, 35, 2d, 10d); } /** * * */ public void setRightPadding(double padding) { this.messageText.setPadding(new Insets(5, padding, 5, 5)); } /** * * */ public void wrapText() { messageText.setMaxWidth(pane.getWidth() - 10); this.scrollPane.setHbarPolicy(ScrollBarPolicy.NEVER); pane.widthProperty().addListener(new ChangeListener() { @Override public void changed(ObservableValue observable, Object oldvalue, Object newValue) { messageText.setMaxWidth((double) newValue - 10); } }); } /** * * * @param title * @param color */ public void setTitle(String title) { this.setTitle(title, Color.BLACK); } /** * * * @param title * @param color */ public void setTitle(String title, Color color) { this.title.setText(title); if (color != null) { this.title.setTextFill(color); } } /** * * */ public void enableHelpButton() { this.helpButton.setManaged(true); this.helpButton.setVisible(true); } /** * * */ public void enableCloseApplicationButton() { this.closeApplicationButton.setManaged(true); this.closeApplicationButton.setVisible(true); } /** * @param initWidth * the initWidth to set */ public static void setINIT_WIDTH(double initWidth) { MessageDialog.INIT_WIDTH = initWidth; } /** * @param initHeight * the initHeight to set */ public static void setINIT_HEIGHT(double initHeight) { MessageDialog.INIT_HEIGHT = initHeight; } @Override protected void initEventHandlers() { // } }