content: /* 
   * Copyright (C) 2015 Adrien Guille <adrien.guille@univ-lyon2.fr>
   *
   * This program 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 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 General Public License
   * along with this program.  If not, see <http://www.gnu.org/licenses/>.
   */
  package main.java.fr.ericlab.sondy.core.ui;
  
  import main.java.fr.ericlab.sondy.core.app.Main;
  import main.java.fr.ericlab.sondy.core.utils.UIUtils;
  import java.io.IOException;
  import java.nio.file.Paths;
  import java.util.Set;
  import java.util.logging.Level;
  import java.util.logging.Logger;
  import javafx.application.Platform;
  import javafx.event.ActionEvent;
  import javafx.geometry.Insets;
  import javafx.geometry.Pos;
  import javafx.scene.Scene;
  import javafx.scene.control.Button;
  import javafx.scene.control.Label;
  import javafx.scene.control.Menu;
  import javafx.scene.control.MenuBar;
  import javafx.scene.control.MenuItem;
  import javafx.scene.control.Tab;
  import javafx.scene.control.TabPane;
  import javafx.scene.control.TextArea;
  import javafx.scene.layout.GridPane;
  import javafx.scene.layout.VBoxBuilder;
  import javafx.scene.web.WebView;
  import javafx.stage.Modality;
  import javafx.stage.Stage;
  import javafx.stage.StageStyle;
  import main.java.fr.ericlab.sondy.algo.eventdetection.EventDetectionMethod;
  import main.java.fr.ericlab.sondy.algo.influenceanalysis.InfluenceAnalysisMethod;
  import main.java.fr.ericlab.sondy.core.app.Configuration;
  import org.apache.commons.io.FileUtils;
  import org.reflections.Reflections;
  
  /**
   *
   *   @author Adrien GUILLE, Laboratoire ERIC, Université Lumière Lyon 2
   */
  public class GlobalUI {
      // Global UI component
      public GridPane globalGridPane;
      MenuBar globalMenu;
      public static TabPane tabPane;
      
      // UI components
      DataCollectionUI dataCollectionUI;
      DataManipulationUI dataManipulationUI;
      EventDetectionUI eventDetectionUI;
      InfluenceAnalysisUI influenceAnalysisUI;
      LogUI logUI;
      
      public GlobalUI(){
          globalGridPane = new GridPane();
  //        dataCollectionUI = new DataCollectionUI();
          dataManipulationUI = new DataManipulationUI();
          eventDetectionUI = new EventDetectionUI();
          influenceAnalysisUI = new InfluenceAnalysisUI();
          logUI = new LogUI();
          menuBar();
          tabPane = new TabPane();
          tabPane.setTabClosingPolicy(TabPane.TabClosingPolicy.UNAVAILABLE);
  //        Tab dataCollectionTab = new Tab("Data Collection");
  //        dataCollectionTab.setContent(dataCollectionUI.grid);
          Tab dataManipulationTab = new Tab("Data Manipulation");
          dataManipulationTab.setContent(dataManipulationUI.grid);
          Tab eventTab = new Tab("Event Detection");
          eventTab.setContent(eventDetectionUI.grid);
          Tab influenceTab = new Tab("Influence Analysis");
          influenceTab.setContent(influenceAnalysisUI.grid);
          tabPane.getTabs().addAll(dataManipulationTab,eventTab,influenceTab);
          tabPane.getSelectionModel().select(0);
          globalGridPane.add(globalMenu,0,0);
          globalGridPane.add(tabPane,0,1);
          globalGridPane.add(logUI.logGrid,0,2);
          LogUI.addLogEntry("Application started - available cores: "+Configuration.numberOfCores+", workspace: "+Configuration.workspace);
      }
      
      public final void menuBar(){
          globalMenu = new MenuBar();
          globalMenu.setMinWidth(Main.windowWidth);
          Menu fileMenu = new Menu("File");
          Menu editMenu = new Menu("Edit");
          Menu aboutMenu = new Menu("About");
          globalMenu.getMenus().addAll(fileMenu,editMenu,aboutMenu);
          MenuItem exitItem = new MenuItem("Quit SONDY");
          fileMenu.getItems().add(exitItem);
          exitItem.setOnAction((ActionEvent t) -> {
              Platform.exit();
              System.exit(0);
          });
          MenuItem configurationItem = new MenuItem("Edit configuration");
          editMenu.getItems().add(configurationItem);
          configurationItem.setOnAction((ActionEvent t) -> {
              editConfigurationFile();
          });
          MenuItem aboutItem = new MenuItem("About SONDY");
          aboutMenu.getItems().add(aboutItem);
          aboutItem.setOnAction((ActionEvent t) -> {
              about();
          });
      }
      
      public final void editConfigurationFile(){
          try {
              TextArea textArea = new TextArea();
              textArea.setText(FileUtils.readFileToString(Paths.get("./configuration.properties").toFile()));
              UIUtils.setSize(textArea, Main.columnWidthLEFT/2+10, 100);
              final Stage stage = new Stage();
              stage.setResizable(false);
              stage.initModality(Modality.WINDOW_MODAL);
              stage.initStyle(StageStyle.UTILITY);
              stage.setTitle("Edit configuration");
              Button saveButton = new Button("Save changes");
              UIUtils.setSize(saveButton, Main.columnWidthLEFT/2+10, 24);
              Button cancelButton = new Button("Cancel changes");
              cancelButton.setOnAction((ActionEvent t) -> {
                  stage.close();
              });
              saveButton.setOnAction((ActionEvent t) -> {
                  try {
                      FileUtils.write(Paths.get("./configuration.properties").toFile(),textArea.getText());
                      stage.close();
                  } catch (IOException ex) {
                      Logger.getLogger(GlobalUI.class.getName()).log(Level.SEVERE, null, ex);
                  }
              });
              UIUtils.setSize(cancelButton, Main.columnWidthLEFT/2+10, 24);
              Label label = new Label();
              label.setId("smalltext");
              label.setText("SONDY needs to restart for the changes to take effect");
              Scene scene = new Scene(VBoxBuilder.create().children(textArea,label,saveButton,cancelButton).alignment(Pos.CENTER).padding(new Insets(10)).spacing(3).build());
              scene.getStylesheets().add("resources/fr/ericlab/sondy/css/GlobalStyle.css");
              stage.setScene(scene);
              stage.show();
          } catch (IOException ex) {
              Logger.getLogger(GlobalUI.class.getName()).log(Level.SEVERE, null, ex);
          }
      }
      
      public void about(){
          final Stage stage = new Stage();
          stage.setResizable(false);
          stage.initModality(Modality.WINDOW_MODAL);
          stage.initStyle(StageStyle.UTILITY);
          stage.setTitle("About SONDY");
          WebView webView = new WebView();
          webView.getEngine().loadContent(getReferences());
          webView.setMaxWidth(Main.columnWidthLEFT);
          webView.setMinWidth(Main.columnWidthLEFT);
          webView.setMaxHeight(Main.columnWidthLEFT);
          webView.setMinHeight(Main.columnWidthLEFT);
          Scene scene = new Scene(VBoxBuilder.create().children(new Label("SONDY "+Main.version),new Label("Main developper: Adrien Guille <adrien.guille@univ-lyon2.fr>"),webView).alignment(Pos.CENTER).padding(new Insets(10)).spacing(3).build());
          scene.getStylesheets().add("resources/fr/ericlab/sondy/css/GlobalStyle.css");
          stage.setScene(scene);
          stage.show();
      }
      
      public String getReferences(){
          String references = "<html><body><h1>Event detection</h1><ul>";
          Reflections reflections = new Reflections("main.java.fr.ericlab.sondy.algo.eventdetection");    
          Set<Class<? extends EventDetectionMethod>> classes = reflections.getSubTypesOf(EventDetectionMethod.class);   
          for(Class<? extends EventDetectionMethod> aClass : classes){
              try {
                  EventDetectionMethod method = (EventDetectionMethod) Class.forName(aClass.getName()).newInstance();
                  references += method.getCitation();
              } catch (ClassNotFoundException | InstantiationException | IllegalAccessException ex) {
                  Logger.getLogger(EventDetectionUI.class.getName()).log(Level.SEVERE, null, ex);
              }
          }
          references += "</ul><h1>Influence analysis</h1><ul>";
          reflections = new Reflections("main.java.fr.ericlab.sondy.algo.influenceanalysis");    
          Set<Class<? extends InfluenceAnalysisMethod>> classes1 = reflections.getSubTypesOf(InfluenceAnalysisMethod.class);   
          for(Class<? extends InfluenceAnalysisMethod> aClass : classes1){
              try {
                  InfluenceAnalysisMethod method = (InfluenceAnalysisMethod) Class.forName(aClass.getName()).newInstance();
                  references += method.getCitation();
              } catch (ClassNotFoundException | InstantiationException | IllegalAccessException ex) {
                  Logger.getLogger(EventDetectionUI.class.getName()).log(Level.SEVERE, null, ex);
              }
          }
          return references+"</ul></body></html>";
      }
  }
  