/*
* 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.mainwindow;
import java.util.Collection;
import org.controlsfx.control.StatusBar;
import org.controlsfx.control.TaskProgressView;
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.MZmineGUI;
import io.github.mzmine.main.MZmineCore;
import io.github.mzmine.modules.featuretable.FeatureTableModule;
import io.github.mzmine.modules.featuretable.FeatureTableModuleParameters;
import io.github.mzmine.modules.plots.chromatogram.ChromatogramPlotModule;
import io.github.mzmine.modules.plots.chromatogram.ChromatogramPlotParameters;
import io.github.mzmine.modules.plots.msspectrum.MsSpectrumPlotModule;
import io.github.mzmine.modules.plots.msspectrum.MsSpectrumPlotParameters;
import io.github.mzmine.parameters.ParameterSet;
import io.github.mzmine.parameters.parametertypes.selectors.FeatureTablesParameter;
import io.github.mzmine.parameters.parametertypes.selectors.FeatureTablesSelectionType;
import io.github.mzmine.parameters.parametertypes.selectors.RawDataFilesParameter;
import io.github.mzmine.parameters.parametertypes.selectors.RawDataFilesSelectionType;
import io.github.mzmine.taskcontrol.MZmineTask;
import javafx.animation.Animation;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.collections.ObservableList;
import javafx.concurrent.Task;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.ProgressBar;
import javafx.scene.control.SelectionMode;
import javafx.scene.control.Tab;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeView;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.BorderPane;
import javafx.util.Duration;
/**
* This class controls the main window of the application
*
*/
public class MainWindowController {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@FXML
private Scene mainScene;
@FXML
private BorderPane mainWindowPane;
@FXML
private TreeView<Object> rawDataTree;
@FXML
private TreeView<Object> featureTree;
@FXML
private TaskProgressView<Task<?>> tasksView;
@FXML
private StatusBar statusBar;
@FXML
private ProgressBar memoryBar;
@FXML
private Label memoryBarLabel;
@FXML
public void initialize() {
rawDataTree.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
rawDataTree.setShowRoot(true);
// Add mouse clicked event handler
rawDataTree.setOnMouseClicked(event -> {
if (event.getClickCount() == 2) {
handleShowTIC(null);
}
});
featureTree.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
featureTree.setShowRoot(true);
// Add mouse clicked event handler
featureTree.setOnMouseClicked(event -> {
if (event.getClickCount() == 2) {
// Show feature table for selected row
ParameterSet moduleParameters =
MZmineCore.getConfiguration().getModuleParameters(FeatureTableModule.class);
FeatureTablesParameter inputTablesParam =
moduleParameters.getParameter(FeatureTableModuleParameters.featureTables);
inputTablesParam.switchType(FeatureTablesSelectionType.GUI_SELECTED_FEATURE_TABLES);
MZmineCore.runMZmineModule(FeatureTableModule.class, moduleParameters);
}
});
statusBar.setText("Welcome to MZmine " + MZmineCore.getMZmineVersion());
/*
* tasksView.setGraphicFactory(task -> { return new Glyph("FontAwesome",
* FontAwesome.Glyph.COG).size(24.0) .color(Color.BLUE); });
*/
// Setup the Timeline to update the memory indicator periodically
final Timeline memoryUpdater = new Timeline();
int UPDATE_FREQUENCY = 500; // ms
memoryUpdater.setCycleCount(Animation.INDEFINITE);
memoryUpdater.getKeyFrames().add(new KeyFrame(Duration.millis(UPDATE_FREQUENCY), e -> {
final long freeMemMB = Runtime.getRuntime().freeMemory() / (1024 * 1024);
final long totalMemMB = Runtime.getRuntime().totalMemory() / (1024 * 1024);
final double memory = ((double) (totalMemMB - freeMemMB)) / totalMemMB;
memoryBar.setProgress(memory);
memoryBarLabel.setText(freeMemMB + "/" + totalMemMB + " MB free");
}));
memoryUpdater.play();
// Setup the Timeline to update the MZmine tasks periodically
final Timeline msdkTaskUpdater = new Timeline();
UPDATE_FREQUENCY = 50; // ms
msdkTaskUpdater.setCycleCount(Animation.INDEFINITE);
msdkTaskUpdater.getKeyFrames().add(new KeyFrame(Duration.millis(UPDATE_FREQUENCY), e -> {
Collection<Task<?>> tasks = tasksView.getTasks();
for (Task<?> task : tasks) {
if (task instanceof MZmineTask) {
MZmineTask mzmineTask = (MZmineTask) task;
mzmineTask.refreshStatus();
}
}
}));
msdkTaskUpdater.play();
}
@FXML
public void memoryBarClicked(MouseEvent e) {
// Run garbage collector on a new thread, so it does not block the GUI
new Thread(() -> {
logger.info("Running garbage collector");
System.gc();
}).start();
}
public TreeView<Object> getRawDataTree() {
return rawDataTree;
}
public TreeView<Object> getFeatureTree() {
return featureTree;
}
public TaskProgressView<Task<?>> getTaskTable() {
return tasksView;
}
public StatusBar getStatusBar() {
return statusBar;
}
public void handleShowTIC(ActionEvent event) {
logger.debug("Activated Show chromatogram menu item");
ParameterSet chromPlotParams =
MZmineCore.getConfiguration().getModuleParameters(ChromatogramPlotModule.class);
RawDataFilesParameter inputFilesParam =
chromPlotParams.getParameter(ChromatogramPlotParameters.inputFiles);
inputFilesParam.switchType(RawDataFilesSelectionType.GUI_SELECTED_FILES);
MZmineGUI.setupAndRunModule(ChromatogramPlotModule.class);
}
public void handleShowMsSpectrum(ActionEvent event) {
logger.debug("Activated Show MS spectrum menu item");
ParameterSet specPlotParams =
MZmineCore.getConfiguration().getModuleParameters(MsSpectrumPlotModule.class);
RawDataFilesParameter inputFilesParam =
specPlotParams.getParameter(MsSpectrumPlotParameters.inputFiles);
inputFilesParam.switchType(RawDataFilesSelectionType.GUI_SELECTED_FILES);
MZmineGUI.setupAndRunModule(MsSpectrumPlotModule.class);
}
public void removeRawData(ActionEvent event) {
// Get selected tree items
ObservableList<TreeItem<Object>> rows = null;
if (rawDataTree.getSelectionModel() != null) {
rows = rawDataTree.getSelectionModel().getSelectedItems();
}
// Loop through all selected tree items
if (rows != null) {
for (int i = rows.size() - 1; i >= 0; i--) {
TreeItem<Object> row = rows.get(i);
if (!(row.getValue() instanceof RawDataFile))
continue;
// Remove feature table from current project
RawDataFile rawDataFile = (RawDataFile) row.getValue();
MZmineCore.getCurrentProject().removeFile(rawDataFile);
// Remove raw data file from tree table view
TreeItem<?> parent = row.getParent();
if (parent == null)
continue;
parent.getChildren().remove(row);
}
rawDataTree.getSelectionModel().clearSelection();
}
}
public void removeFeatureTable(ActionEvent event) {
// Get selected tree items
ObservableList<TreeItem<Object>> rows = null;
if (featureTree.getSelectionModel() != null) {
rows = featureTree.getSelectionModel().getSelectedItems();
}
// Loop through all selected tree items
if (rows != null) {
for (int i = rows.size() - 1; i >= 0; i--) {
TreeItem<Object> row = rows.get(i);
if (!(row.getValue() instanceof FeatureTable))
continue;
// Remove feature table from current project
FeatureTable featureTable = (FeatureTable) row.getValue();
MZmineCore.getCurrentProject().removeFeatureTable(featureTable);
// Remove feature table from tree table view
TreeItem<?> parent = row.getParent();
if (parent == null)
continue;
parent.getChildren().remove(row);
}
featureTree.getSelectionModel().clearSelection();
}
}
public void updateTabName(Tab tab) {
/*
* String title = ""; if (tab.equals(rawDataFilesTab)) { title = "Raw Data"; int rawDataFiles =
* MZmineCore.getCurrentProject().getRawDataFiles() .size(); if (rawDataFiles > 0) title += " ("
* + rawDataFiles + ")"; rawDataFilesTab.setText(title); return; } if
* (tab.equals(featureTablesTab)) { title = "Feature Tables"; int featureTables =
* MZmineCore.getCurrentProject() .getFeatureTables().size(); if (featureTables > 0) title +=
* " (" + featureTables + ")"; featureTablesTab.setText(title); return; }
*/
}
}