From 77d0201b27bab3a4d78bace900bf182992130e1d Mon Sep 17 00:00:00 2001 From: Eilert Tunheim <emtunhei@stud.ntnu.no> Date: Fri, 6 May 2022 14:43:00 +0200 Subject: [PATCH] Split up main class to multiple classes, each for each pane in the main window --- .gitignore | 2 +- .../java/com/application/DB/Constants.java | 3 + .../com/application/DB/HelpingFunctions.java | 3 +- .../com/application/GUI/Panes/BottomBar.java | 82 ++++ .../com/application/GUI/Panes/LogoBar.java | 46 +++ .../com/application/GUI/Panes/MenuBar.java | 97 +++++ .../com/application/GUI/Panes/SideBar.java | 143 +++++++ src/main/java/com/application/Main.java | 379 +++--------------- .../sf-drying-optimization-1e234ad2b0f4.json | 12 - .../sf-drying-optimization-8a2e1b7ffc14.json | 12 + .../com/application/DB/Constants.class | Bin 1117 -> 1206 bytes .../com/application/DB/HelpingFunctions.class | Bin 8491 -> 8496 bytes .../com/application/GUI/Panes/BottomBar.class | Bin 0 -> 3788 bytes .../com/application/GUI/Panes/LogoBar.class | Bin 0 -> 1593 bytes .../com/application/GUI/Panes/MenuBar.class | Bin 0 -> 4000 bytes .../GUI/Panes/SideBar$1WorkerThread.class | Bin 0 -> 3019 bytes .../com/application/GUI/Panes/SideBar.class | Bin 0 -> 4600 bytes .../com/application/Main$1WorkerThread.class | Bin 2938 -> 0 bytes target/classes/com/application/Main.class | Bin 14372 -> 7467 bytes 19 files changed, 439 insertions(+), 340 deletions(-) create mode 100644 src/main/java/com/application/GUI/Panes/BottomBar.java create mode 100644 src/main/java/com/application/GUI/Panes/LogoBar.java create mode 100644 src/main/java/com/application/GUI/Panes/MenuBar.java create mode 100644 src/main/java/com/application/GUI/Panes/SideBar.java delete mode 100644 target/classes/com.application/sf-drying-optimization-1e234ad2b0f4.json create mode 100644 target/classes/com.application/sf-drying-optimization-8a2e1b7ffc14.json create mode 100644 target/classes/com/application/GUI/Panes/BottomBar.class create mode 100644 target/classes/com/application/GUI/Panes/LogoBar.class create mode 100644 target/classes/com/application/GUI/Panes/MenuBar.class create mode 100644 target/classes/com/application/GUI/Panes/SideBar$1WorkerThread.class create mode 100644 target/classes/com/application/GUI/Panes/SideBar.class delete mode 100644 target/classes/com/application/Main$1WorkerThread.class diff --git a/.gitignore b/.gitignore index e450592..4f1c281 100644 --- a/.gitignore +++ b/.gitignore @@ -10,4 +10,4 @@ /doc/ /contacts.log /addressbook.dat -/src/main/resources/com.application/sf-drying-optimization-1e234ad2b0f4.json +/src/main/resources/com.application/sf-drying-optimization-8a2e1b7ffc14.json diff --git a/src/main/java/com/application/DB/Constants.java b/src/main/java/com/application/DB/Constants.java index 8c25393..0f20451 100644 --- a/src/main/java/com/application/DB/Constants.java +++ b/src/main/java/com/application/DB/Constants.java @@ -1,6 +1,9 @@ package com.application.DB; public class Constants { + + public static String KEY_FILE_NAME = "sf-drying-optimization-8a2e1b7ffc14.json"; + // Start- & end time public static String START_TIME = ""; public static String STOP_TIME = ""; diff --git a/src/main/java/com/application/DB/HelpingFunctions.java b/src/main/java/com/application/DB/HelpingFunctions.java index e30182e..cdeeafa 100644 --- a/src/main/java/com/application/DB/HelpingFunctions.java +++ b/src/main/java/com/application/DB/HelpingFunctions.java @@ -11,6 +11,7 @@ import java.util.HashMap; import java.util.Map; import java.util.TimeZone; +import static com.application.DB.Constants.KEY_FILE_NAME; import static com.application.DB.Settings.*; public class HelpingFunctions { @@ -36,7 +37,7 @@ public class HelpingFunctions { * @throws Exception for potential errors */ private static GoogleCredentials getCredentials() throws Exception { - File credentialsPath = new File("./src/main/resources/com.application/sf-drying-optimization-1e234ad2b0f4.json"); + File credentialsPath = new File("./src/main/resources/com.application/"+KEY_FILE_NAME); // Load credentials from JSON key file. If you can't set the GOOGLE_APPLICATION_CREDENTIALS // environment variable, you can explicitly load the credentials file to construct the diff --git a/src/main/java/com/application/GUI/Panes/BottomBar.java b/src/main/java/com/application/GUI/Panes/BottomBar.java new file mode 100644 index 0000000..d7023b0 --- /dev/null +++ b/src/main/java/com/application/GUI/Panes/BottomBar.java @@ -0,0 +1,82 @@ +package com.application.GUI.Panes; + +import com.application.DB.Constants; +import com.application.GUI.LineChartFunctionality; +import com.application.Main; +import javafx.geometry.Pos; +import javafx.scene.control.CheckBox; +import javafx.scene.control.Label; +import javafx.scene.layout.HBox; + +public class BottomBar { + private final Main main; + + public BottomBar(Main main) { + this.main = main; + } + + public HBox createBottomBar() { + HBox hBox = new HBox(); + + Label liveDataText = new Label("View Live Data"); + main.setLiveDataBox(new CheckBox()); + Main.getLiveDataBox().setSelected(Constants.DEFAULT_IS_SELECTED_LIVE_DATA); + Main.getLiveDataBox().setOnAction(event -> { + if (Main.getLiveDataBox().isSelected()) { + LineChartFunctionality.setPrintLiveData(true); + LineChartFunctionality.printGraphs(); + + } else { + LineChartFunctionality.setPrintLiveData(false); + LineChartFunctionality.printGraphs(); + } + }); + + Label regressionText = new Label("View Regression"); + main.setRegressionBox(new CheckBox()); + Main.getRegressionBox().setSelected(Constants.DEFAULT_IS_SELECTED_REGRESSION); + Main.getRegressionBox().setOnAction(event -> { + if (Main.getRegressionBox().isSelected()) { + LineChartFunctionality.setPrintRegression(true); + LineChartFunctionality.printGraphs(); + + } else { + LineChartFunctionality.setPrintRegression(false); + LineChartFunctionality.printGraphs(); + } + }); + + Label regressionConfidenceIntervalText = new Label("View Regression Shadow"); + main.setRegressionConfidenceIntervalBox(new CheckBox()); + Main.getRegressionConfidenceIntervalBox().setSelected(Constants.DEFAULT_IS_SELECTED_REGRESSION_SHADOW); + Main.getRegressionConfidenceIntervalBox().setOnAction(event -> { + if (Main.getRegressionConfidenceIntervalBox().isSelected()) { + LineChartFunctionality.setPrintRegressionConfidenceInterval(true); + LineChartFunctionality.printGraphs(); + } else { + LineChartFunctionality.setPrintRegressionConfidenceInterval(false); + LineChartFunctionality.printGraphs(); + } + }); + + Label previousText = new Label("View Previous Data"); + main.setPreviousBox(new CheckBox()); + Main.getPreviousBox().setSelected(Constants.DEFAULT_IS_SELECTED_PREVIOUS_DATA); + Main.getPreviousBox().setOnAction(event -> { + if (Main.getPreviousBox().isSelected()) { + LineChartFunctionality.setPrintPreviousData(true); + LineChartFunctionality.printGraphs(); + } else { + LineChartFunctionality.setPrintPreviousData(false); + LineChartFunctionality.printGraphs(); + } + }); + + + hBox.getChildren().addAll(liveDataText, Main.getLiveDataBox(), regressionText, Main.getRegressionBox(), regressionConfidenceIntervalText, Main.getRegressionConfidenceIntervalBox(), previousText, Main.getPreviousBox()); + hBox.setAlignment(Pos.CENTER_RIGHT); + hBox.setSpacing(5); + + return hBox; + } +} \ No newline at end of file diff --git a/src/main/java/com/application/GUI/Panes/LogoBar.java b/src/main/java/com/application/GUI/Panes/LogoBar.java new file mode 100644 index 0000000..f819c95 --- /dev/null +++ b/src/main/java/com/application/GUI/Panes/LogoBar.java @@ -0,0 +1,46 @@ +package com.application.GUI.Panes; + +import javafx.scene.image.Image; +import javafx.scene.image.ImageView; +import javafx.scene.layout.HBox; +import javafx.scene.layout.Priority; +import javafx.scene.layout.Region; + +import java.io.FileInputStream; +import java.io.FileNotFoundException; + +public class LogoBar { + public LogoBar() { + } + + /** + * This function imports the logos and defines the alignments + * + * @return a logoBar containing the logos in proper alignments + * @throws FileNotFoundException + */ + public HBox createLogoBar() throws FileNotFoundException { + // Defining the image paths + Image moelvenLogoM = new Image(new FileInputStream("src/main/resources/com.application/GUI/moelven_logo_m.png")); + Image moelvenLogoTitle = new Image(new FileInputStream("src/main/resources/com.application/GUI/moelven_logo_title.png")); + + // Creating imageview objects + ImageView imageViewM = new ImageView(moelvenLogoM); + ImageView imageViewTitle = new ImageView(moelvenLogoTitle); + + // Defining resolution and aspect ratio + imageViewM.setFitHeight(100); + imageViewM.setPreserveRatio(true); + imageViewTitle.setFitHeight(100); + imageViewTitle.setPreserveRatio(true); + + // Defining alignments + Region region1 = new Region(); + HBox.setHgrow(region1, Priority.ALWAYS); + + Region region2 = new Region(); + HBox.setHgrow(region2, Priority.ALWAYS); + + return new HBox(imageViewM, region1, imageViewTitle, region2); + } +} \ No newline at end of file diff --git a/src/main/java/com/application/GUI/Panes/MenuBar.java b/src/main/java/com/application/GUI/Panes/MenuBar.java new file mode 100644 index 0000000..77550ca --- /dev/null +++ b/src/main/java/com/application/GUI/Panes/MenuBar.java @@ -0,0 +1,97 @@ +package com.application.GUI.Panes; + +import com.application.DB.Constants; +import com.application.GUI.LineChartFunctionality; +import com.application.Main; +import javafx.scene.control.CheckMenuItem; +import javafx.scene.control.Menu; +import javafx.scene.control.MenuItem; + +public class MenuBar { + private final Main main; + + public MenuBar(Main main) { + this.main = main; + } + + /** + * Creates the menubar with buttons. + * Defines each action when button is clicked. + * + * @return MenuBar as a HBox + */ + public javafx.scene.control.MenuBar createMenuBar() { + + // Creating a menubar + javafx.scene.control.MenuBar menuBar = new javafx.scene.control.MenuBar(); + + // Defining the individual menus + Menu menuFile = new Menu("File"); + Menu menuView = new Menu("View"); + Menu menuHelp = new Menu("Help"); + + MenuItem menuFileExit = new MenuItem("Exit"); + menuFileExit.setOnAction(event -> Main.exitApplication()); + + Main.setMenuViewLiveData(new CheckMenuItem("Live Data")); + main.setMenuViewRegression(new CheckMenuItem("Regression")); + main.setMenuViewRegressionShadow(new CheckMenuItem("Regression Shadow")); + main.setMenuViewPreviousData(new CheckMenuItem("Previous Data")); + + Main.getMenuViewLiveData().setSelected(Constants.DEFAULT_IS_SELECTED_LIVE_DATA); + Main.getMenuViewRegression().setSelected(Constants.DEFAULT_IS_SELECTED_REGRESSION); + Main.getMenuViewRegressionShadow().setSelected(Constants.DEFAULT_IS_SELECTED_REGRESSION_SHADOW); + Main.getMenuViewPreviousData().setSelected(Constants.DEFAULT_IS_SELECTED_PREVIOUS_DATA); + + Main.getMenuViewLiveData().setOnAction(event -> { + if (Main.getMenuViewLiveData().isSelected()) { + LineChartFunctionality.setPrintLiveData(true); + LineChartFunctionality.printGraphs(); + } else { + LineChartFunctionality.setPrintLiveData(false); + LineChartFunctionality.printGraphs(); + } + }); + Main.getMenuViewRegression().setOnAction(event -> { + if (Main.getMenuViewRegression().isSelected()) { + LineChartFunctionality.setPrintRegression(true); + LineChartFunctionality.printGraphs(); + } else { + LineChartFunctionality.setPrintRegression(false); + LineChartFunctionality.printGraphs(); + } + }); + Main.getMenuViewRegressionShadow().setOnAction(event -> { + if (Main.getMenuViewRegressionShadow().isSelected()) { + LineChartFunctionality.setPrintRegressionConfidenceInterval(true); + LineChartFunctionality.printGraphs(); + } else { + LineChartFunctionality.setPrintRegressionConfidenceInterval(false); + LineChartFunctionality.printGraphs(); + } + }); + Main.getMenuViewPreviousData().setOnAction(event -> { + if (Main.getMenuViewPreviousData().isSelected()) { + LineChartFunctionality.setPrintPreviousData(true); + LineChartFunctionality.printGraphs(); + } else { + LineChartFunctionality.setPrintPreviousData(false); + LineChartFunctionality.printGraphs(); + } + }); + + MenuItem aboutUs = new MenuItem("About Us"); + MenuItem help = new MenuItem("Help"); + + + menuFile.getItems().addAll(menuFileExit); + menuView.getItems().addAll(Main.getMenuViewLiveData(), Main.getMenuViewRegression(), Main.getMenuViewRegressionShadow(), Main.getMenuViewPreviousData()); + menuHelp.getItems().addAll(aboutUs, help); + + // Adding the menus to the menubar + menuBar.getMenus().addAll(menuFile, menuView, menuHelp); + + // Returns the menubar + return menuBar; + } +} \ No newline at end of file diff --git a/src/main/java/com/application/GUI/Panes/SideBar.java b/src/main/java/com/application/GUI/Panes/SideBar.java new file mode 100644 index 0000000..ac1de60 --- /dev/null +++ b/src/main/java/com/application/GUI/Panes/SideBar.java @@ -0,0 +1,143 @@ +package com.application.GUI.Panes; + +import com.application.DB.Constants; +import com.application.DB.HelpingFunctions; +import com.application.DB.Settings; +import com.application.GUI.InputPopUpWindow; +import com.application.GUI.LineChartFunctionality; +import com.application.GUI.OutputPopUpWindow; +import com.application.GUI.ProgressBar.RingProgressIndicator; +import com.application.Main; +import javafx.application.Platform; +import javafx.scene.control.Button; +import javafx.scene.control.Label; +import javafx.scene.control.TextField; +import javafx.scene.layout.Priority; +import javafx.scene.layout.VBox; + +import java.util.logging.Level; +import java.util.logging.Logger; + +import static com.application.DB.HelpingFunctions.isLoadedData; +import static com.application.DB.Settings.NUMBER_OF_SECONDS_LIVE_DATA; +import static com.application.GUI.LineChartFunctionality.getDataPointsXAxis; +import static com.application.GUI.LineChartFunctionality.getLiveData; +import static java.util.logging.Level.SEVERE; + +public class SideBar { + + public SideBar(Main main) { + } + + public VBox createSideBar() { + + // Creating a vbox + VBox sideBarVBox = new VBox(); + + Label treeSpeciesLabel = new Label("Tree Species"); + treeSpeciesLabel.setId("sideBarLabelText"); + Main.setTreeSpeciesText(new TextField()); + Main.getTreeSpeciesText().setId("sideBarLabelText"); + Main.getTreeSpeciesText().setPromptText("No Input"); + Main.getTreeSpeciesText().setText(Constants.TREE_SPECIES); + Main.getTreeSpeciesText().setEditable(false); + + Label dimensionsLabel = new Label("Width x Height"); + dimensionsLabel.setId("sideBarLabelText"); + Main.setDimensionsText(new TextField()); + Main.getDimensionsText().setId("sideBarLabelText"); + Main.getDimensionsText().setPromptText("No Input"); + Main.getDimensionsText().setText(Constants.DIMENSIONS); + Main.getDimensionsText().setEditable(false); + + Label sawsetLabel = new Label("Sawset"); + sawsetLabel.setId("sideBarLabelText"); + Main.setSawsetText(new TextField()); + Main.getSawsetText().setId("sideBarLabelText"); + Main.getSawsetText().setPromptText("No Input"); + Main.getSawsetText().setText(Constants.SAWSET); + Main.getSawsetText().setEditable(false); + + Label moistureGoalLabel = new Label("Moisture Goal"); + moistureGoalLabel.setId("sideBarLabelText"); + Main.setMoistureGoalText(new TextField()); + Main.getMoistureGoalText().setId("sideBarLabelText"); + Main.getMoistureGoalText().setPromptText("No Input"); + Main.getMoistureGoalText().setText(Constants.MOISTURE_GOAL); + Main.getMoistureGoalText().setEditable(false); + + Label timeLeftLabel = new Label("Time Left"); + timeLeftLabel.setId("sideBarLabelText"); + Main.setTimeLeftText(new TextField()); + Main.getTimeLeftText().setId("sideBarLabelText"); + Main.getTimeLeftText().setPromptText("Calculating..."); + Main.getTimeLeftText().setText(Constants.TIME_LEFT); + Main.getTimeLeftText().setEditable(false); + + Button inputParametersButton = new Button("Input Parameters"); + inputParametersButton.setId("sideBarButtonInputParameters"); + inputParametersButton.setOnAction(e -> InputPopUpWindow.display()); + + Button finishButton = new Button("Finish"); + finishButton.setId("sideBarButtonFinish"); + finishButton.setOnAction(e -> OutputPopUpWindow.displayOutputWindow()); + + Button exitButton = new Button("Exit"); + exitButton.setId("sideBarButtonExit"); + exitButton.setOnAction(e -> Main.exitApplication()); + + + // Creating the circular progressbar + RingProgressIndicator ringProgressIndicator = new RingProgressIndicator(); + ringProgressIndicator.setRingWidth(100); + ringProgressIndicator.makeIndeterminate(); + + class WorkerThread extends Thread{ + RingProgressIndicator rpi; + int progress = 0; + + public WorkerThread(RingProgressIndicator rpi){ + this.rpi = rpi; + } + + @Override + public void run() { + while (!Constants.IS_FINISHED) { + + try { + ringProgressIndicator.makeIndeterminate(); + Thread.sleep(500L * NUMBER_OF_SECONDS_LIVE_DATA); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + while (isLoadedData()) { + try { + Thread.sleep(100); + } catch (InterruptedException e) { + e.printStackTrace(); + Logger.getLogger(getClass().getName()).log(SEVERE, null, e); + } + Platform.runLater(() -> rpi.setProgress(progress)); + + progress = getLiveData().size()/ getDataPointsXAxis()*100; + + if (progress > 100) { + break; + } + } + } + } + } + + new WorkerThread(ringProgressIndicator).start(); + + + sideBarVBox.getChildren().addAll(ringProgressIndicator, treeSpeciesLabel, Main.getTreeSpeciesText(), dimensionsLabel, Main.getDimensionsText(), + sawsetLabel, Main.getSawsetText(), moistureGoalLabel, Main.getMoistureGoalText(), timeLeftLabel, Main.getTimeLeftText(), inputParametersButton, finishButton, exitButton); + + VBox.setVgrow(sideBarVBox, Priority.ALWAYS); + + return sideBarVBox; + } +} \ No newline at end of file diff --git a/src/main/java/com/application/Main.java b/src/main/java/com/application/Main.java index 8fe99e1..761e4f5 100644 --- a/src/main/java/com/application/Main.java +++ b/src/main/java/com/application/Main.java @@ -1,33 +1,21 @@ package com.application; -import com.application.DB.Constants; import com.application.GUI.InputPopUpWindow; -import com.application.GUI.OutputPopUpWindow; -import com.application.GUI.ProgressBar.RingProgressIndicator; +import com.application.GUI.Panes.BottomBar; +import com.application.GUI.Panes.LogoBar; +import com.application.GUI.Panes.SideBar; import com.application.GUI.LineChartFunctionality; import javafx.application.Application; import javafx.application.Platform; -import javafx.geometry.Pos; import javafx.scene.chart.LineChart; import javafx.scene.control.*; -import javafx.scene.image.Image; -import javafx.scene.image.ImageView; import javafx.scene.layout.*; import javafx.scene.Scene; import javafx.stage.Stage; -import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; -import java.util.logging.Logger; - -import static com.application.DB.Constants.*; -import static com.application.DB.Settings.*; -import static com.application.DB.HelpingFunctions.isLoadedData; -import static com.application.GUI.LineChartFunctionality.getDataPointsXAxis; -import static com.application.GUI.LineChartFunctionality.getLiveData; -import static java.util.logging.Level.SEVERE; /** * This class launches the application @@ -37,7 +25,10 @@ import static java.util.logging.Level.SEVERE; */ public class Main extends Application { - private LineChartFunctionality lineChartFunctionality; + private final BottomBar bottomBar1 = new BottomBar(this); + private final com.application.GUI.Panes.MenuBar menuBar1 = new com.application.GUI.Panes.MenuBar(this); + private final SideBar sideBar1 = new SideBar(this); + private final LogoBar logoBar1 = new LogoBar(); private BorderPane topBar; private HBox logoBar; @@ -86,7 +77,7 @@ public class Main extends Application { super.init(); // Initializing variables - this.lineChartFunctionality = new LineChartFunctionality(); + LineChartFunctionality lineChartFunctionality = new LineChartFunctionality(); this.topBar = new BorderPane(); this.logoBar = new HBox(); this.sideBar = new VBox(); @@ -105,9 +96,9 @@ public class Main extends Application { // Create panes for root BorderPane root = new BorderPane(); - this.menuBar = createMenuBar(); - this.sideBar = createSideBar(); - this.logoBar = createLogoBar(); + this.menuBar = menuBar1.createMenuBar(); + this.sideBar = sideBar1.createSideBar(); + this.logoBar = logoBar1.createLogoBar(); LineChart<String, Number> lineChart = LineChartFunctionality.getLineChart(); @@ -117,7 +108,7 @@ public class Main extends Application { this.logoBar.setId("logoBar"); this.menuBar.setId("menuBar"); this.sideBar.setId("sideBar"); - this.bottomBar = createBottomBar(); + this.bottomBar = bottomBar1.createBottomBar(); this.bottomBar.setId("bottomBar"); lineChart.setId("lineChart"); @@ -152,306 +143,6 @@ public class Main extends Application { InputPopUpWindow.display(); } - /** - * Creates the menubar with buttons. - * Defines each action when button is clicked. - * - * @return MenuBar as a HBox - */ - private MenuBar createMenuBar() { - - // Creating a menubar - MenuBar menuBar = new MenuBar(); - - // Defining the individual menus - Menu menuFile = new Menu("File"); - Menu menuView = new Menu("View"); - Menu menuHelp = new Menu("Help"); - - MenuItem menuFileExit = new MenuItem("Exit"); - menuFileExit.setOnAction(event -> exitApplication()); - - setMenuViewLiveData(new CheckMenuItem ("Live Data")); - setMenuViewRegression(new CheckMenuItem ("Regression")); - setMenuViewRegressionShadow(new CheckMenuItem ("Regression Shadow")); - setMenuViewPreviousData(new CheckMenuItem ("Previous Data")); - - getMenuViewLiveData().setSelected(DEFAULT_IS_SELECTED_LIVE_DATA); - getMenuViewRegression().setSelected(DEFAULT_IS_SELECTED_REGRESSION); - getMenuViewRegressionShadow().setSelected(DEFAULT_IS_SELECTED_REGRESSION_SHADOW); - getMenuViewPreviousData().setSelected(DEFAULT_IS_SELECTED_PREVIOUS_DATA); - - getMenuViewLiveData().setOnAction(event -> { - if(getMenuViewLiveData().isSelected()){ - LineChartFunctionality.setPrintLiveData(true); - LineChartFunctionality.printGraphs(); - } else { - LineChartFunctionality.setPrintLiveData(false); - LineChartFunctionality.printGraphs(); - } - }); - getMenuViewRegression().setOnAction(event -> { - if(getMenuViewRegression().isSelected()){ - LineChartFunctionality.setPrintRegression(true); - LineChartFunctionality.printGraphs(); - } else { - LineChartFunctionality.setPrintRegression(false); - LineChartFunctionality.printGraphs(); - } - }); - getMenuViewRegressionShadow().setOnAction(event -> { - if(getMenuViewRegressionShadow().isSelected()){ - LineChartFunctionality.setPrintRegressionConfidenceInterval(true); - LineChartFunctionality.printGraphs(); - } else { - LineChartFunctionality.setPrintRegressionConfidenceInterval(false); - LineChartFunctionality.printGraphs(); - } - }); - getMenuViewPreviousData().setOnAction(event -> { - if(getMenuViewPreviousData().isSelected()){ - LineChartFunctionality.setPrintPreviousData(true); - LineChartFunctionality.printGraphs(); - } else { - LineChartFunctionality.setPrintPreviousData(false); - LineChartFunctionality.printGraphs(); - } - }); - - MenuItem aboutUs = new MenuItem("About Us"); - MenuItem help = new MenuItem("Help"); - - - - menuFile.getItems().addAll(menuFileExit); - menuView.getItems().addAll(getMenuViewLiveData(), getMenuViewRegression(), getMenuViewRegressionShadow(), getMenuViewPreviousData()); - menuHelp.getItems().addAll(aboutUs, help); - - // Adding the menus to the menubar - menuBar.getMenus().addAll(menuFile, menuView, menuHelp); - - // Returns the menubar - return menuBar; - } - - - - private VBox createSideBar(){ - - // Creating a vbox - VBox sideBarVBox = new VBox(); - - Label treeSpeciesLabel = new Label("Tree Species"); - treeSpeciesLabel.setId("sideBarLabelText"); - treeSpeciesText = new TextField(); - treeSpeciesText.setId("sideBarLabelText"); - treeSpeciesText.setPromptText("No Input"); - treeSpeciesText.setText(Constants.TREE_SPECIES); - treeSpeciesText.setEditable(false); - - Label dimensionsLabel = new Label("Width x Height"); - dimensionsLabel.setId("sideBarLabelText"); - dimensionsText = new TextField(); - dimensionsText.setId("sideBarLabelText"); - dimensionsText.setPromptText("No Input"); - dimensionsText.setText(Constants.DIMENSIONS); - dimensionsText.setEditable(false); - - Label sawsetLabel = new Label("Sawset"); - sawsetLabel.setId("sideBarLabelText"); - sawsetText = new TextField(); - sawsetText.setId("sideBarLabelText"); - sawsetText.setPromptText("No Input"); - sawsetText.setText(Constants.SAWSET); - sawsetText.setEditable(false); - - Label moistureGoalLabel = new Label("Moisture Goal"); - moistureGoalLabel.setId("sideBarLabelText"); - moistureGoalText = new TextField(); - moistureGoalText.setId("sideBarLabelText"); - moistureGoalText.setPromptText("No Input"); - moistureGoalText.setText(Constants.MOISTURE_GOAL); - moistureGoalText.setEditable(false); - - Label timeLeftLabel = new Label("Time Left"); - timeLeftLabel.setId("sideBarLabelText"); - timeLeftText = new TextField(); - timeLeftText.setId("sideBarLabelText"); - timeLeftText.setPromptText("Calculating..."); - timeLeftText.setText(Constants.TIME_LEFT); - timeLeftText.setEditable(false); - - Button inputParametersButton = new Button("Input Parameters"); - inputParametersButton.setId("sideBarButtonInputParameters"); - inputParametersButton.setOnAction(e -> InputPopUpWindow.display()); - - Button finishButton = new Button("Finish"); - finishButton.setId("sideBarButtonFinish"); - finishButton.setOnAction(e -> OutputPopUpWindow.displayOutputWindow()); - - Button exitButton = new Button("Exit"); - exitButton.setId("sideBarButtonExit"); - exitButton.setOnAction(e -> exitApplication()); - - - - // Creating the circular progressbar - RingProgressIndicator ringProgressIndicator = new RingProgressIndicator(); - ringProgressIndicator.setRingWidth(100); - ringProgressIndicator.makeIndeterminate(); - - class WorkerThread extends Thread{ - RingProgressIndicator rpi; - int progress = 0; - - public WorkerThread(RingProgressIndicator rpi){ - this.rpi = rpi; - } - - @Override - public void run() { - while (!Constants.IS_FINISHED) { - - try { - ringProgressIndicator.makeIndeterminate(); - Thread.sleep(500L * NUMBER_OF_SECONDS_LIVE_DATA); - } catch (InterruptedException e) { - e.printStackTrace(); - } - - while (isLoadedData()) { - try { - Thread.sleep(100); - } catch (InterruptedException e) { - e.printStackTrace(); - Logger.getLogger(getClass().getName()).log(SEVERE, null, e); - } - Platform.runLater(() -> { - rpi.setProgress(progress); - }); - - progress = getLiveData().size()/ getDataPointsXAxis()*100; - - if (progress > 100) { - break; - } - } - } - } - } - - new WorkerThread(ringProgressIndicator).start(); - - - - sideBarVBox.getChildren().addAll(ringProgressIndicator, treeSpeciesLabel, treeSpeciesText, dimensionsLabel, dimensionsText, - sawsetLabel, sawsetText, moistureGoalLabel, moistureGoalText, timeLeftLabel, timeLeftText, inputParametersButton, finishButton, exitButton); - - VBox.setVgrow(sideBarVBox, Priority.ALWAYS); - - return sideBarVBox; - } - - - /** - * This function imports the logos and defines the alignments - * - * @return a logoBar containing the logos in proper alignments - * @throws FileNotFoundException - */ - private HBox createLogoBar() throws FileNotFoundException { - // Defining the image paths - Image moelvenLogoM = new Image(new FileInputStream("src/main/resources/com.application/GUI/moelven_logo_m.png")); - Image moelvenLogoTitle = new Image(new FileInputStream("src/main/resources/com.application/GUI/moelven_logo_title.png")); - - // Creating imageview objects - ImageView imageViewM = new ImageView(moelvenLogoM); - ImageView imageViewTitle = new ImageView(moelvenLogoTitle); - - // Defining resolution and aspect ratio - imageViewM.setFitHeight(100); - imageViewM.setPreserveRatio(true); - imageViewTitle.setFitHeight(100); - imageViewTitle.setPreserveRatio(true); - - // Defining alignments - Region region1 = new Region(); - HBox.setHgrow(region1, Priority.ALWAYS); - - Region region2 = new Region(); - HBox.setHgrow(region2, Priority.ALWAYS); - - return new HBox(imageViewM, region1, imageViewTitle, region2); - } - - private HBox createBottomBar(){ - HBox hBox = new HBox(); - - Label liveDataText = new Label("View Live Data"); - setLiveDataBox(new CheckBox()); - getLiveDataBox().setSelected(DEFAULT_IS_SELECTED_LIVE_DATA); - getLiveDataBox().setOnAction(event -> { - if(getLiveDataBox().isSelected()){ - LineChartFunctionality.setPrintLiveData(true); - LineChartFunctionality.printGraphs(); - - } else { - LineChartFunctionality.setPrintLiveData(false); - LineChartFunctionality.printGraphs(); - } - }); - - Label regressionText = new Label("View Regression"); - setRegressionBox(new CheckBox()); - getRegressionBox().setSelected(DEFAULT_IS_SELECTED_REGRESSION); - getRegressionBox().setOnAction(event -> { - if(getRegressionBox().isSelected()){ - LineChartFunctionality.setPrintRegression(true); - LineChartFunctionality.printGraphs(); - - } else { - LineChartFunctionality.setPrintRegression(false); - LineChartFunctionality.printGraphs(); - } - }); - - Label regressionConfidenceIntervalText = new Label("View Regression Shadow"); - setRegressionConfidenceIntervalBox(new CheckBox()); - getRegressionConfidenceIntervalBox().setSelected(DEFAULT_IS_SELECTED_REGRESSION_SHADOW); - getRegressionConfidenceIntervalBox().setOnAction(event -> { - if(getRegressionConfidenceIntervalBox().isSelected()){ - LineChartFunctionality.setPrintRegressionConfidenceInterval(true); - LineChartFunctionality.printGraphs(); - } else { - LineChartFunctionality.setPrintRegressionConfidenceInterval(false); - LineChartFunctionality.printGraphs(); - } - }); - - Label previousText = new Label("View Previous Data"); - setPreviousBox(new CheckBox()); - getPreviousBox().setSelected(DEFAULT_IS_SELECTED_PREVIOUS_DATA); - getPreviousBox().setOnAction(event -> { - if(getPreviousBox().isSelected()){ - LineChartFunctionality.setPrintPreviousData(true); - LineChartFunctionality.printGraphs(); - } else { - LineChartFunctionality.setPrintPreviousData(false); - LineChartFunctionality.printGraphs(); - } - }); - - - hBox.getChildren().addAll(liveDataText, liveDataBox, regressionText, regressionBox, regressionConfidenceIntervalText, regressionConfidenceIntervalBox, previousText, previousBox); - hBox.setAlignment(Pos.CENTER_RIGHT); - hBox.setSpacing(5); - - return hBox; - } - - - - public static void setTreeSpeciesText(String treeSpeciesText) { Main.treeSpeciesText.setText(treeSpeciesText); } @@ -472,10 +163,6 @@ public class Main extends Application { Main.timeLeftText.setText(moistureGoalText); } - public LineChartFunctionality getLineChartFunctionality() { - return lineChartFunctionality; - } - public static CheckMenuItem getMenuViewLiveData() { return menuViewLiveData; } @@ -497,7 +184,7 @@ public class Main extends Application { } public void setMenuViewRegressionShadow(CheckMenuItem menuViewRegressionShadow) { - this.menuViewRegressionShadow = menuViewRegressionShadow; + Main.menuViewRegressionShadow = menuViewRegressionShadow; } public static CheckMenuItem getMenuViewPreviousData() { @@ -539,6 +226,46 @@ public class Main extends Application { public void setPreviousBox(CheckBox previousBox) { Main.previousBox = previousBox; } + + public static TextField getTreeSpeciesText() { + return treeSpeciesText; + } + + public static void setTreeSpeciesText(TextField treeSpeciesText) { + Main.treeSpeciesText = treeSpeciesText; + } + + public static TextField getDimensionsText() { + return dimensionsText; + } + + public static void setDimensionsText(TextField dimensionsText) { + Main.dimensionsText = dimensionsText; + } + + public static TextField getSawsetText() { + return sawsetText; + } + + public static void setSawsetText(TextField sawsetText) { + Main.sawsetText = sawsetText; + } + + public static TextField getMoistureGoalText() { + return moistureGoalText; + } + + public static void setMoistureGoalText(TextField moistureGoalText) { + Main.moistureGoalText = moistureGoalText; + } + + public static TextField getTimeLeftText() { + return timeLeftText; + } + + public static void setTimeLeftText(TextField timeLeftText) { + Main.timeLeftText = timeLeftText; + } } diff --git a/target/classes/com.application/sf-drying-optimization-1e234ad2b0f4.json b/target/classes/com.application/sf-drying-optimization-1e234ad2b0f4.json deleted file mode 100644 index 9444592..0000000 --- a/target/classes/com.application/sf-drying-optimization-1e234ad2b0f4.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "type": "service_account", - "project_id": "sf-drying-optimization", - "private_key_id": "1e234ad2b0f42caff46c54993f72e6ed7a6e47f5", - "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC9uUivxQCvsUYW\nM2GCJaioM4/KdHIhkgbtGFKtYacQcvJaE1z9RsgTBThWAYXblkigptJ9pCOPIpFR\naqDGujua7+bEm37eQ8pEAPiiSHqNWaevzSjS9OZ8vLD+0AdDy17HuL1KjnR6vJi6\nBRfVfvu3DtzxJbsUutxTwjDTUIZqg6QLeRja0sfa5r1lbqJ6o/uK99fYi3cuW9XW\nbK5czMROw+lNeVU9S2B/5EfezeD+Qtt0hPL6IVdz5oCtbQY9Sj/C+N+tyjPYYXKG\neEZhfvVZOmilIyTupXH+5CJfezxYP6Weg0nD8a6Zt71FSces82PufCU/swiEgh9/\n9zv+anPrAgMBAAECggEAJxcI6eY+OPTeiu51NbqKoHVXOBB7/3y13p33Uu/e2x3D\n31lD/I9b48dcjyPrL44sUqVskySBixlFNbAxhiCS7V5mfrXHEwaGozJMCCvEzGDf\nkvJDagu5fZPnJ+k2xfoeAiqHHdhyGWPIV/N6sKtkM5hlX241uJSzlrJZGwDpYQJ5\na2s5YIw+wLZ90Ybj/V7mvZ0UFLDJV6JztIg1pxSC0CTA7Fz6oZdwIKytBGcYSved\n8tkVPufkL7LtYoNZFrzkgPrTBpm0Teq+XUpCazIySEcOBySbdlhdhMf66nawY1Tx\nRsRUxTtWuFrtDl3XIFOv8C1iAtDiPA4b4Yb8sTR2eQKBgQDuz7xvxYeZdzyFWZlI\nQRVvJAYWT2p2bhImSA9I097B8mWtQ/TY5qankwFcuP+nu3u2MKYRszPrIt5eoH73\nMFi2cqMHOVmsx8JALG4vWlkNNKier06JnuJjH6hh5nQBU+cFuhkHIVfbjBnCiSz8\nizIZxeFG88JfqZFVBR6OIpYyzQKBgQDLYRLQGseonf8Rdv5oRLAL49Q+NnimC2Mo\n7io+DqlhbTFWxE0M6DUZO9C+MesHHSCmw3ZgqT6ykQPxCKZ6ZLQzQzDRqNi+4vy7\n2+BFwKqvUIJtMP0cLNMBRpsjmYMXQqhHGFAHuDsRyyKu0YTUayEB4/MBBnoqnC48\nygBudP5xlwKBgQDQTBu1dhqHTkxYl8UuE66paUdx8EURFYL5JwNF5581lcL/9PU8\ntzoHkh6vDKHZYJtQV3CSobcYUiqZaO41l1LZmHYAmBJStU4GgXp+DRT9gr/M4WXk\nfdRC11scQVFP0yn/gcnQwVGLqtDRMKsvgA3sEwAizfztSc781GFJYnuVxQKBgQCC\npQoDuqA1FcFLA8hrTGxWRvUJPc6Ew13gZhWmpZ5y4kTGevUP7H5nhkASXVifyjs2\nROtfLnkDFhqVFDx09Qm4wFm05KTPAlrdhmHsDNbYJXyTDdwZ5EVrVWLFHJDUOVKF\n0P1f6B2x0W6nJBoSpfqfD0IDj5iclJUzIYPjcK4eYwKBgFfUiZhVj4cWPb1k2MJf\nXC0LBmFgqiW9w4rXfyEXtRSRbO4661TvVHw66SF09hwzz/+MW2R7HLi1IWZNyRF3\nXw39WtI8bmUsLTJbH6gshanmu8cSPLBt82WlRd6gS+SMxyZ65wY/kt9adfIolefm\nICsfIETnkHRpwF3RurchKfjk\n-----END PRIVATE KEY-----\n", - "client_email": "svc-students-sf-drying-opt@sf-drying-optimization.iam.gserviceaccount.com", - "client_id": "106308201919438112497", - "auth_uri": "https://accounts.google.com/o/oauth2/auth", - "token_uri": "https://oauth2.googleapis.com/token", - "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", - "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/svc-students-sf-drying-opt%40sf-drying-optimization.iam.gserviceaccount.com" -} diff --git a/target/classes/com.application/sf-drying-optimization-8a2e1b7ffc14.json b/target/classes/com.application/sf-drying-optimization-8a2e1b7ffc14.json new file mode 100644 index 0000000..0f96220 --- /dev/null +++ b/target/classes/com.application/sf-drying-optimization-8a2e1b7ffc14.json @@ -0,0 +1,12 @@ +{ + "type": "service_account", + "project_id": "sf-drying-optimization", + "private_key_id": "8a2e1b7ffc14999d4795f6986b032b390c7330cc", + "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCv7DxYcTWV+nEW\nE4q5ckKAu2oQ6z669IYTSzrR7SQ17BCEwaMzLGEDJL1xWjJnNUknu4VKuYu0rUIk\npvJPt/m/OZStCBAbP6uPRQDY+dF34+P50Tts6e3YTD7AiZ4mYFDTkmHn00lFtKCn\nQxOtcmIKonRmBJN3r5izpVN8rX9dyiqi8KwsQQ1dEWclsr6uSUZZbGTbqLHBxJRo\ninAwDlSQTp3B1sh7ujxW3x3osFyqRdpVB1Ba2zvAXx9NbJQMdUDPi38acn8FliUq\n/HeB1F8z8rsXHq72NDQCZ9YcJVtlXlX2rQKkkTAI6Cmm8CSZtYTKYeLC/KXTJYia\nWyOWCVgBAgMBAAECggEAKrEJc+0FNAAysUjMwXQY72SLuM9dycDNSKFZBNinkO5Y\nk97p2+FJKZog3wEkeidUOXAoSJn+bToecwaQhwf+c4llqxfp0LMCzyHPstftHUsQ\nZ+9+nE+oiHT4RYEf//AfrTg4yilb/q52ziBZBh5b7HjABoHVx5W1WOMl/3ubDQc7\nSqZ6A8ZmJ6waUWc+Y0OCR3z6/PjWXoe/hHfrHl6PoMkh7LXNhZmGnf8sAdGXtFTk\nl3XJEVio+Rlc9V7v7E8DXjygSMpkV87DFwhT/WiPIyiJMS1foTsF2y3iAA2yb6o2\nOMn+ld+9c96zxQwbs+KFs7bdi2LjgLtXZchMr/HSgQKBgQDkXEOcofgNx1wHZmdj\nOHi3zNOoSthPCxsXa7Vcv/yPFFs904c6s2lcMsnHNeOzQLqpA3W4s9Nn4wcxonXy\nE91cwu1dZ4607wz2CjaQEXi+Hrb79ws4MStw2u9ivsCN+gJs8qZlU9ML5k8EsLkb\nfwlipVl+7GO8Mff+rNBc59C0UwKBgQDFNzHhBFrd4J4ps+/um2LA2d9DneMh83kZ\n5MLL/xvZEXGHPcSSfgeJOiOZpO4/NVEZ8NJ8POTkk6Xd+lp5nOyg384PEX6eyPb7\nArbJ/ISicInXb41FFf1Q9jgcFxa5423X+Czeu+iVI7C3L+g28oYesjkLuLcQM/9O\nrKVDdRH32wKBgBEmhMVsvK58PIMpw7YF9bsIHRVUma5GDUDTDAntOVCdnMSl8FAO\nTWlpPxJBD9rUj7BF3D+E8empeU7W/rixmTxwP1d2gZdBJN4Nok9roH/W2rNNuH/9\n4V9Wcggef2OqVShNiQWvJ/iK0YBurVhNUC0icfhAVLU7o35zCCsSFfCVAoGAcpXV\nN0ZOfWgKvXQ8zcgeoqp0HFdaJtnN3QubWueIiKCn88ohsnPjcQoEsTqw6qzRyF6y\nDVlcLKrUzpqtgsd4fShME1k41o0xYzp6dfVwIul8TV4VGLTkD+xfQYLww2Su57Lc\nbzWCt1SbUnRVWcejwaYPmw3h31o21sFc7ErS+80CgYEAlkJK/datMd2DjUl7xXSx\nN85xxs5mpKRvJXW7CA/eiBtbb4mg1WHMtWx78Er88Kb7+DVKpYailpyxHNsCwfJi\nGv4GCzNPUA7xcBfL/oDt5dj1z6TPyjLfyuLGP6nyCl8jhfNLbYPpzW0jE16ivGOQ\np6zpS3AFMThDcIdV35MMQ9M=\n-----END PRIVATE KEY-----\n", + "client_email": "svc-students-sf-drying-opt@sf-drying-optimization.iam.gserviceaccount.com", + "client_id": "106308201919438112497", + "auth_uri": "https://accounts.google.com/o/oauth2/auth", + "token_uri": "https://oauth2.googleapis.com/token", + "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", + "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/svc-students-sf-drying-opt%40sf-drying-optimization.iam.gserviceaccount.com" +} diff --git a/target/classes/com/application/DB/Constants.class b/target/classes/com/application/DB/Constants.class index 501917412f2c4c5a9a647aa4b881d3dfe95fca6c..26210281ae400661b01ed5042905c7a853142fb2 100644 GIT binary patch delta 713 zcmcc1v5m9-)W2Q(7#J8#7`(X{#28FD7|b{sL>bIE7%V`vC5W&B5!N8W21M9`2s;pA z4<Z~ugd>P>0ujz2!UaUQf(SPd;SM4^*cm+88N3)7c)eXC<J~-cT;u&5eU)7q8H9YY z63Y_xa}x8?^@B@_GV{`{85y{OLmY!b;zK-rT{m`}VXW6?&|zfIC{EK&DXPrOOV`aW zD9OyttV%4&%+J%cNHj_{OfpYPOExso%PP*#<6#hIkYHqB;9-ztkl<mE0uj;-GCT~j zAVLnrl?M?DAVLvDC^0DWFsOhCRS;JVM5u!lYk&w%b`Yt>ATxOllWDyugBSw?gCGMZ z$QA|$22PMIU|Nbn0!&LY$be~CC@lvSmxs~{P+Ad6D={d8)vG{hRj9ZclvanDqXDAp z88{g<K@0{?1}!kn#K6d)&7i};$e_!>z@X2-$iT?Jz`&}toq=&90|NsSgB}9|0~=V7 znL(cc6fR%|3<eB_3=9k$3`TIx%fYG`82p8pHZw2_v212w1rcn_n;F=dH#2Yuv23nq z-~<VAfe3C8!NandfmeWQGXo!p#}6U|ST-{VvTSA$V&2Rk%(9t51mq4zushrs1VN5t zU}fN7;9}rp;Ah}w5M}_y7$1WS13!Zzg8+jXgCK)8gD`_Wg9w8OgBXJ)gE)g7gCv6! WgA{|C0E0Ax7lRA~BZD#6b0z?Z`B7g0 delta 613 zcmdnSd6%R9)W2Q(7#J8#7~HrRL>P=X7>qd?gc(dggeizH0}<vR!U9BCf(R=RVGSZ| zK!h!bumchHAi@DeID!Z#5aG<u;KI(}%E-VK9O4)h5+CB}>&nO=<dc<HmZ+aIv5R-( zl2eRf8Vs6@3=BLBq6}g@4B{X{f<cmpK?+1jgSavvLKZ~Gfe3j91s(=P5TOL(DuW0W zkYZI3p#~z<86+ovVKS{3W)NXuU=U#71R2i2z`zMIA52RyNP=l8C@sw(2Ik8^X;~;O z2c_j16u|O|P+AEpt_-DBpysGTX*CdC&%nu`4q`AcF)%V{FlaI`GH5X{Fz7QdGB7eQ zFtBQEXJFjOz`(%7pv}O*zy=m%X3${(1qWCGgD!&}0|NsGgFamIJg_PT1}`C|%?!*S zf`xfA11s}p1~w3f9Yk<|2u`6orp*joESnj)1-Ldd@PNd4K?EPmW(Izi%?tv}n;8U| zH!}!<oWKZnf)j%P$XyJq3~UTs3>*x644e!?4BQOj3_J`n47?1A415e~3<3;V41x^$ gpv1x;!eGfD#$d}J&fv%(!Qjdu$-u~90QQn004~}$y#N3J diff --git a/target/classes/com/application/DB/HelpingFunctions.class b/target/classes/com/application/DB/HelpingFunctions.class index 41894bfa944331ce4e1a3bf49468d8b843ca897e..7166717be98c08b21717c8005665d8fe9bd7c817 100644 GIT binary patch delta 3024 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 YF}5(AW#MGF#&88pKVx{paF#(50FPETK>z>% delta 3037 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 BKV|>` diff --git a/target/classes/com/application/GUI/Panes/BottomBar.class b/target/classes/com/application/GUI/Panes/BottomBar.class new file mode 100644 index 0000000000000000000000000000000000000000..12ce86ef6278f3b1a3a17d788f51dd8d0ac0ae24 GIT binary patch literal 3788 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 literal 0 HcmV?d00001 diff --git a/target/classes/com/application/GUI/Panes/LogoBar.class b/target/classes/com/application/GUI/Panes/LogoBar.class new file mode 100644 index 0000000000000000000000000000000000000000..cb180a3b27155aecbea2709a056ca51aa590cb8e GIT binary patch literal 1593 zcmX^0Z`VEs1_l!be=Y_w23>XrJ$43t4h91*24)6BE(RtBBMt^*b_NqJ1`Y;OHit+C zFaYt)K!iCvg9R4@AA>F@gC&C%7lROkH9Lb1JA*BVX~)iB&(7e$$iQZknU`5&$H>5} zp&7==z~Y>rlFG=y?~|FA>Q|bZlv)&$n3R*s$ROmCpPZNzmROVt;zI>lN-{Ew85xv) zlJj%*6AKD*GLsWaGV}BF-9tU~0}}I6i}ii-)AOAYi>w(Lc$14#6H8K|0*nkY8k#;? ziDijt75c@=sd=gTIf<3|r6u|vPWctqj0`-v`KdW&sd*svzKje~sA@BF6Vp@mJwc>3 zBZB~v+K|i=kbAknD#9{T%Y7Lc<Zx;RDX?Z_;Df7%YG*G>P0!5FGh}3tLDdU&WDr=| znvnsj(1?+N%e5jowE*P(Vs-{cMh33n{L-T2RJTl!b9g}Ba7rxF1NoSTL7YK?kwF5) zhWj4u0*H?o8N@+S`kDFqAl;sM1*IjyB}J);xr_{!#YM^bxrv#1`bDY5U<-=%lk;=+ z&_f>@BJnx->G|=wdIfpuAX}Y4gfk<9Ejgx?fI=2z5+j2Q$bHzH4hm0@9WFc!t_*HG z4DJjbj0{pJs!>9aoxzib!HdD0hrx%z7d=RzDnSW?kwFl}5WoDCRFFM>j0}nd6CWdk z07$cbPGVlVzJF3yYH|r9gDhAG8pMA2C2skpc`5KHWMmN407pDTQ*cR9W?s5AD2GTu z#WVBuks<~xB@2<l7A|0Up5oLJx6Bfc)XemZ5=I6V4HuAs0>!B%0Y$0BsYPX}L7?md zl8FMzpoTIuGy;k;^NTV|Dj6Br9DTwaBZD!LH=06gMh1@J)Dn;MqWp431`{+lf&$VS z>{Gb2(e;CzBCZjQstBx4GmJrzL6kuZT<|b4FoM!G10#bZ0|SFG10w??0|NuA)^-NQ zjSLJ7Obk*C3=E)Ri-CccfrWvOL7IVqfd`_9L54w=fq{XML5@M5feB;)qZ$Jn13Lo) z!-U-oOp&`8m?MQ)wllD9XJGSz3$Q~3e0MW&L~3tm;PeAAbha~aTCwPgFmP>S;L&B- z#=tAd0^vxqfOxwZ_#(G6@LRD;vTkA!*ufwO6JV2Mg9!*lvhQUOj%3yij%1N!4US}$ zWC@OBlVl6t&LFY@?iVu#UIqpR2?jw1Nd_eb83t_zSq4)E1qK@iMFvL(B?eChWd?r+ zHHHWVb%q26O@>ScErvn{9k9PWAbx}TTacliL4iS$fssLpA&)_cL6L!pL7O3!L772? zftkUSA(}yzL4|>ZA%ekzL5)G3ft4YXL7hQ^L7jn(L6d=jfrWvQL5qQrK^yEg9RU7K BmIwd< literal 0 HcmV?d00001 diff --git a/target/classes/com/application/GUI/Panes/MenuBar.class b/target/classes/com/application/GUI/Panes/MenuBar.class new file mode 100644 index 0000000000000000000000000000000000000000..f0739d79edee37306f75f45a673629ca1af4f02c GIT binary patch literal 4000 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 G3`qdoHTqTn literal 0 HcmV?d00001 diff --git a/target/classes/com/application/GUI/Panes/SideBar$1WorkerThread.class b/target/classes/com/application/GUI/Panes/SideBar$1WorkerThread.class new file mode 100644 index 0000000000000000000000000000000000000000..450d307b1d6f8b2a24b00f5799befaf2063a31bd GIT binary patch literal 3019 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 a!%T+h43Z3?3=9k)-C+#O4B-qB4B-G=L^h=W literal 0 HcmV?d00001 diff --git a/target/classes/com/application/GUI/Panes/SideBar.class b/target/classes/com/application/GUI/Panes/SideBar.class new file mode 100644 index 0000000000000000000000000000000000000000..f7ae4740731e37590f720ae00bef3fe68a0ffe60 GIT binary patch literal 4600 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 TnW2ZFm!S{Jnha-6W9S0_uWJ4k literal 0 HcmV?d00001 diff --git a/target/classes/com/application/Main$1WorkerThread.class b/target/classes/com/application/Main$1WorkerThread.class deleted file mode 100644 index e8a9cd2292906aca53dcf7b6dd6e26aeed5ad998..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2938 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 WAjuHQz`y{~9mc@S5Y7<65DoyY;TJ3b diff --git a/target/classes/com/application/Main.class b/target/classes/com/application/Main.class index 0e74a2edc3fd289b455a1b7f5b90599afb638e2a..ee3d701f0d6550698d1ac30cfa88421ea7d442ce 100644 GIT binary patch literal 7467 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 z%0D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 IDHFqf0IWw6BLDyZ literal 14372 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 KhqJgDR|5dK$KAF7 -- GitLab