/* * Copyright 2006-2016 The MZmine 3 Development Team * * This file is part of MZmine 3. * * MZmine 3 is free software; you can redistribute it and/or modify it under the terms of the GNU * General Public License as published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * MZmine 3 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 General Public License along with MZmine 3; if not, * write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 * USA */ package io.github.mzmine.gui; import java.io.IOException; import java.net.URL; import java.util.ArrayList; import java.util.List; import java.util.Optional; import javax.annotation.Nonnull; import org.controlsfx.control.StatusBar; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import io.github.msdk.datamodel.featuretables.FeatureTable; import io.github.msdk.datamodel.rawdata.RawDataFile; import io.github.mzmine.gui.mainwindow.MainWindowController; import io.github.mzmine.main.MZmineCore; import io.github.mzmine.main.NewVersionCheck; import io.github.mzmine.main.NewVersionCheck.CheckType; import io.github.mzmine.modules.MZmineRunnableModule; import io.github.mzmine.parameters.ParameterSet; import io.github.mzmine.project.MZmineGUIProject; import javafx.application.Application; import javafx.application.Platform; import javafx.fxml.FXMLLoader; import javafx.scene.Node; import javafx.scene.Scene; import javafx.scene.control.Alert; import javafx.scene.control.Alert.AlertType; import javafx.scene.control.ButtonType; import javafx.scene.control.Dialog; import javafx.scene.control.TreeItem; import javafx.scene.control.TreeView; import javafx.scene.image.Image; import javafx.scene.layout.BorderPane; import javafx.stage.Stage; /** * MZmine JavaFX Application class */ public final class MZmineGUI extends Application { private final Logger logger = LoggerFactory.getLogger(this.getClass()); private static final Image mzMineIcon = new Image("file:icon/mzmine-icon.png"); private static final String mzMineFXML = "file:conf/MainWindow.fxml"; private static MainWindowController mainWindowController; private static Scene rootScene; public void start(Stage stage) { try { // Load the main window URL mainFXML = new URL(mzMineFXML); FXMLLoader loader = new FXMLLoader(mainFXML); rootScene = loader.load(); mainWindowController = loader.getController(); stage.setScene(rootScene); } catch (IOException e) { e.printStackTrace(); logger.error("Error loading MZmine GUI from FXML: " + e); Platform.exit(); } stage.setTitle("MZmine " + MZmineCore.getMZmineVersion()); stage.setMinWidth(300); stage.setMinHeight(300); // Set application icon stage.getIcons().setAll(mzMineIcon); stage.setOnCloseRequest(e -> { requestQuit(); e.consume(); }); // Activate new GUI-supported project MZmineGUIProject project = new MZmineGUIProject(); MZmineGUI.activateProject(project); stage.show(); // Check for new version of MZmine NewVersionCheck NVC = new NewVersionCheck(CheckType.DESKTOP); Thread nvcThread = new Thread(NVC); nvcThread.setPriority(Thread.MIN_PRIORITY); nvcThread.start(); } public static void requestQuit() { Alert alert = new Alert(AlertType.CONFIRMATION); Stage stage = (Stage) alert.getDialogPane().getScene().getWindow(); stage.getIcons().add(mzMineIcon); alert.setTitle("Confirmation"); alert.setHeaderText("Exit MZmine"); String s = "Are you sure you want to exit?"; alert.setContentText(s); Optional<ButtonType> result = alert.showAndWait(); if ((result.isPresent()) && (result.get() == ButtonType.OK)) { Platform.exit(); System.exit(0); } } public static void closeProject() { Alert alert = new Alert(AlertType.CONFIRMATION); Stage stage = (Stage) alert.getDialogPane().getScene().getWindow(); stage.getIcons().add(mzMineIcon); alert.setTitle("Confirmation"); alert.setHeaderText("Close project"); String s = "Are you sure you want to close the current project?"; alert.setContentText(s); Optional<ButtonType> result = alert.showAndWait(); if ((result.isPresent()) && (result.get() == ButtonType.OK)) { MZmineGUIProject newProject = new MZmineGUIProject(); activateProject(newProject); setStatusBarMessage(""); } } public static void displayMessage(String msg) { Platform.runLater(() -> { Dialog<ButtonType> dialog = new Dialog<>(); Stage stage = (Stage) dialog.getDialogPane().getScene().getWindow(); stage.getIcons().add(mzMineIcon); dialog.setTitle("Warning"); dialog.setContentText(msg); dialog.getDialogPane().getButtonTypes().add(ButtonType.OK); dialog.showAndWait(); }); } public static void setStatusBarMessage(String message) { Platform.runLater(() -> { StatusBar statusBar = mainWindowController.getStatusBar(); statusBar.setText(message); }); } public static MainWindowController getMainWindowController() { return mainWindowController; } public static void addWindow(Node node, String title) { BorderPane parent = new BorderPane(); parent.setCenter(node); Scene newScene = new Scene(parent); // Copy CSS styles newScene.getStylesheets().addAll(rootScene.getStylesheets()); Stage newStage = new Stage(); newStage.setTitle(title); newStage.getIcons().add(mzMineIcon); newStage.setScene(newScene); newStage.show(); } public static void activateProject(MZmineGUIProject project) { MZmineCore.setCurrentProject(project); TreeView<Object> rawDataTree = mainWindowController.getRawDataTree(); rawDataTree.setRoot(project.getRawDataRootItem()); TreeView<Object> featureTree = mainWindowController.getFeatureTree(); featureTree.setRoot(project.getFeatureTableRootItem()); } public static @Nonnull List<RawDataFile> getSelectedRawDataFiles() { final ArrayList<RawDataFile> list = new ArrayList<>(); final TreeView<Object> rawDataTree = mainWindowController.getRawDataTree(); for (TreeItem<Object> item : rawDataTree.getSelectionModel().getSelectedItems()) { if (!(item.getValue() instanceof RawDataFile)) continue; RawDataFile file = (RawDataFile) item.getValue(); list.add(file); } return list; } public static @Nonnull List<FeatureTable> getSelectedFeatureTables() { final ArrayList<FeatureTable> list = new ArrayList<>(); final TreeView<Object> featureTableTree = mainWindowController.getFeatureTree(); for (TreeItem<Object> item : featureTableTree.getSelectionModel().getSelectedItems()) { if (!(item.getValue() instanceof FeatureTable)) continue; FeatureTable ft = (FeatureTable) item.getValue(); list.add(ft); } return list; } public static <ModuleType extends MZmineRunnableModule> void setupAndRunModule( @Nonnull Class<ModuleType> moduleClass) { final ParameterSet moduleParameters = MZmineCore.getConfiguration().getModuleParameters(moduleClass); ButtonType result = moduleParameters.showSetupDialog(null); if (result == ButtonType.OK) { MZmineCore.runMZmineModule(moduleClass, moduleParameters); } } }