package com.xenoage.zong.demos.simplegui; import com.xenoage.utils.math.geom.Point2f; import com.xenoage.zong.layout.Layout; import com.xenoage.zong.renderer.awt.AwtLayoutRenderer; import com.xenoage.zong.renderer.javafx.JfxLayoutRenderer; import javafx.application.Platform; import javafx.embed.swing.SwingFXUtils; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.scene.control.Alert; import javafx.scene.control.Alert.AlertType; import javafx.scene.control.MenuItem; import javafx.scene.image.ImageView; import javafx.scene.image.WritableImage; import javafx.scene.input.KeyEvent; import javafx.scene.input.MouseEvent; import javafx.scene.layout.BorderPane; import lombok.Getter; import java.awt.image.BufferedImage; /** * Controller for the JavaFX main window (MainWindow.fxml). * * @author Andreas Wenger */ public class MainWindow { //GUI elements @FXML private MenuItem mnuPlaybackStop; @FXML private MenuItem mnuPlaybackStart; @FXML private BorderPane pnlCanvas; @FXML private ImageView scoreView; //loaded content private Content content = new Content(this); private WritableImage scoreImage = null; //rendering engine private boolean useJavaFX = true; //zoom @Getter private float zoom = 2; private final float zoomFactor = 2; @FXML public void initialize() { if (SimpleGuiDemo.startDoc == null) { //load the first demo score content.loadNextScore(); } else { //load the given start document content.loadScore(SimpleGuiDemo.startDoc); } } @FXML void onFileOpen(ActionEvent event) { content.loadNextScore(); } @FXML void onFileSaveAsPDF(ActionEvent event) { content.saveAs("pdf"); } @FXML void onFileSaveAsPNG(ActionEvent event) { content.saveAs("png"); } @FXML void onFileSaveAsMID(ActionEvent event) { content.saveAs("mid"); } @FXML void onFileSaveAsOGG(ActionEvent event) { content.saveAs("ogg"); } @FXML void onExit(ActionEvent event) { SimpleGuiDemo.exit(); } @FXML void onZoomIn(ActionEvent event) { zoom(zoomFactor); } @FXML void onZoomOut(ActionEvent event) { zoom(1 / zoomFactor); } private void zoom(float zoomFactor) { zoom *= zoomFactor; scoreImage = null; renderLayout(content.getLayout()); } @FXML void onPlaybackStart(ActionEvent event) { Playback.start(); } @FXML void onPlaybackStop(ActionEvent event) { Playback.stop(); } @FXML void onAbout(ActionEvent event) { showMessageDialog("This little demo app shows how to use Zong! in your own software.\n" + "There are much more complex use cases, but it may be helpful for the beginning.\n\n" + "Any questions or ideas? Contact us: info@xenoage.com"); } @FXML void onScoreClick(MouseEvent event) { content.onClick(new Point2f((float) event.getX(), (float) event.getY())); } public void renderLayout(Layout layout) { //run in JavaFX application thread Platform.runLater(() -> { if (useJavaFX) { //JavaFX renderer scoreImage = JfxLayoutRenderer.paintToImage(layout, 0, zoom); } else { //AWT renderer BufferedImage awtImage = AwtLayoutRenderer.paintToImage(layout, 0, zoom); scoreImage = SwingFXUtils.toFXImage(awtImage, scoreImage); } scoreView.setImage(scoreImage); scoreView.setFitWidth(scoreImage.getWidth()); scoreView.setFitHeight(scoreImage.getHeight()); }); } public void showMessageDialog(String message) { Alert dialog = dialog(); dialog.setContentText(message); dialog.showAndWait(); } public void handleKeyEvent(KeyEvent keyEvent) { /* if (keyEvent.getCode() == KeyCode.PLUS) { //edit the score //... content.onScoreUpdated(); } */ } private Alert dialog() { Alert ret = new Alert(AlertType.INFORMATION); ret.setTitle(SimpleGuiDemo.appName); return ret; } }