diff --git a/src/main/java/de/deadlocker8/smarttime/controller/Controller.java b/src/main/java/de/deadlocker8/smarttime/controller/Controller.java index ef94bfc697fadaf5cf19b52c4d10882662c23f8b..c3782b8bfff1b17aace0115e0e88405519ca0532 100644 --- a/src/main/java/de/deadlocker8/smarttime/controller/Controller.java +++ b/src/main/java/de/deadlocker8/smarttime/controller/Controller.java @@ -860,6 +860,34 @@ public class Controller settings.setSavePath(DEFAULT_SAVE_PATH); } } + + @FXML + public void createReport() + { + try + { + FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/de/deadlocker8/smarttime/fxml/ReportGUI.fxml")); + Parent root = (Parent)fxmlLoader.load(); + Stage newStage = new Stage(); + newStage.setScene(new Scene(root, 500, 500)); + newStage.setMinWidth(300); + newStage.setMinHeight(300); + newStage.setTitle("PDF-Report erstellen"); + newStage.getIcons().add(icon); + newStage.initOwner(stage); + + ReportController reportController = (ReportController)fxmlLoader.getController(); + reportController.init(this, newStage, settings, icon); + + newStage.setResizable(true); + newStage.initModality(Modality.APPLICATION_MODAL); + newStage.showAndWait(); + } + catch(IOException d) + { + Logger.error(d); + } + } public void about() { diff --git a/src/main/java/de/deadlocker8/smarttime/controller/ReportController.java b/src/main/java/de/deadlocker8/smarttime/controller/ReportController.java new file mode 100644 index 0000000000000000000000000000000000000000..14f39099def53f6f624f8c98661fbf87ee5d3499 --- /dev/null +++ b/src/main/java/de/deadlocker8/smarttime/controller/ReportController.java @@ -0,0 +1,155 @@ +package de.deadlocker8.smarttime.controller; + +import java.util.ArrayList; +import java.util.Collections; + +import de.deadlocker8.smarttime.core.SQL; +import de.deadlocker8.smarttime.core.Settings; +import de.deadlocker8.smarttime.core.Utils; +import javafx.fxml.FXML; +import javafx.scene.control.Alert.AlertType; +import javafx.scene.control.CheckBox; +import javafx.scene.control.ComboBox; +import javafx.scene.control.ListView; +import javafx.scene.control.RadioButton; +import javafx.scene.control.ToggleGroup; +import javafx.scene.image.Image; +import javafx.stage.Stage; +import logger.Logger; +import tools.AlertGenerator; + +public class ReportController +{ + @FXML private ComboBox<String> comboBoxProject; + @FXML private ListView<CheckBox> listViewTasks; + @FXML private RadioButton radioButtonList; + @FXML private RadioButton radioButtonGroupByTasks; + @FXML private RadioButton radioButtonGroupByDate; + + private Controller controller; + private Stage stage; + private Image icon; + private Settings settings; + private SQL sql; + private final String ALL_PROJECTS = "Alle"; + + public void init(Controller controller, Stage stage, Settings settings, Image icon) + { + this.controller = controller; + this.stage = stage; + this.settings = settings; + this.icon = icon; + + sql = new SQL(settings.getSavePath() + "/" + Utils.DATABASE_NAME); + prefill(); + } + + private void prefill() + { + ToggleGroup toggleGroup = new ToggleGroup(); + radioButtonList.setToggleGroup(toggleGroup); + radioButtonGroupByTasks.setToggleGroup(toggleGroup); + radioButtonGroupByDate.setToggleGroup(toggleGroup); + + radioButtonList.setSelected(true); + + try + { + ArrayList<String> projectNames = sql.getProjectNames(); + Collections.sort(projectNames); + comboBoxProject.getItems().add(ALL_PROJECTS); + comboBoxProject.getItems().addAll(projectNames); + } + catch(Exception e) + { + Logger.error(e); + } + + comboBoxProject.valueProperty().addListener((observable, oldValue, newValue)->{ + if(newValue.equals(ALL_PROJECTS)) + { + radioButtonGroupByTasks.setDisable(true); + listViewTasks.getItems().clear(); + return; + } + + try + { + ArrayList<String> tasks = sql.getTaskNamesByProject(newValue); + Collections.sort(tasks); + listViewTasks.getItems().clear(); + for(String currentTask : tasks) + { + CheckBox currentCheckBox = new CheckBox(currentTask); + currentCheckBox.setSelected(true); + currentCheckBox.selectedProperty().addListener((obs, oldVal, newVal)->{ + checkTasks(); + }); + listViewTasks.getItems().add(currentCheckBox); + } + + radioButtonGroupByTasks.setDisable(false); + } + catch(Exception e) + { + Logger.error(e); + } + + checkTasks(); + }); + + comboBoxProject.setValue(ALL_PROJECTS); + } + + private int getNumberOfActivatedTasks() + { + int numberOfActivatedTasks = 0; + for(CheckBox currentCheckBox : listViewTasks.getItems()) + { + if(currentCheckBox.isSelected()) + { + numberOfActivatedTasks++; + } + } + + return numberOfActivatedTasks; + } + + private void checkTasks() + { + if(getNumberOfActivatedTasks() > 1) + { + radioButtonGroupByTasks.setDisable(false); + } + else + { + radioButtonGroupByTasks.setDisable(true); + } + } + + @FXML + public void generateReport() + { + String project = comboBoxProject.getValue(); + if(project == null || project.equals("")) + { + AlertGenerator.showAlert(AlertType.WARNING, "Warnung", "", "Bitte wähle ein Projekt aus", icon, stage, null, false); + return; + } + + if(!project.equals(ALL_PROJECTS) && getNumberOfActivatedTasks() == 0) + { + AlertGenerator.showAlert(AlertType.WARNING, "Warnung", "", "Bitte wähle mindestens einen Task aus aus", icon, stage, null, false); + return; + } + + //TODO file chooser + //TODO generate report + } + + @FXML + public void cancel() + { + stage.close(); + } +} \ No newline at end of file diff --git a/src/main/resources/de/deadlocker8/smarttime/fxml/MainGUI.fxml b/src/main/resources/de/deadlocker8/smarttime/fxml/MainGUI.fxml index 942a20f8a1bd5d12b93ced6f2f3ce33d5d3e2b0e..91b8e87296f5df456a2fe28aadc3f008ed0b55ea 100644 --- a/src/main/resources/de/deadlocker8/smarttime/fxml/MainGUI.fxml +++ b/src/main/resources/de/deadlocker8/smarttime/fxml/MainGUI.fxml @@ -41,6 +41,11 @@ <MenuItem mnemonicParsing="false" onAction="#exportAsJSON" text="als JSON" /> </items> </Menu> + <Menu mnemonicParsing="false" text="Report"> + <items> + <MenuItem mnemonicParsing="false" onAction="#createReport" text="PDF Report erstellen" /> + </items> + </Menu> <Menu mnemonicParsing="false" text="?"> <items> <MenuItem mnemonicParsing="false" onAction="#about" text="Über" /> diff --git a/src/main/resources/de/deadlocker8/smarttime/fxml/ReportGUI.fxml b/src/main/resources/de/deadlocker8/smarttime/fxml/ReportGUI.fxml new file mode 100644 index 0000000000000000000000000000000000000000..4ca0941a3fb0672e0344e7dc9c5003b0e0963222 --- /dev/null +++ b/src/main/resources/de/deadlocker8/smarttime/fxml/ReportGUI.fxml @@ -0,0 +1,74 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<?import javafx.geometry.Insets?> +<?import javafx.scene.control.Button?> +<?import javafx.scene.control.ComboBox?> +<?import javafx.scene.control.Label?> +<?import javafx.scene.control.ListView?> +<?import javafx.scene.control.RadioButton?> +<?import javafx.scene.layout.AnchorPane?> +<?import javafx.scene.layout.HBox?> +<?import javafx.scene.layout.VBox?> +<?import javafx.scene.text.Font?> + +<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="500.0" prefWidth="500.0" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1" fx:controller="de.deadlocker8.smarttime.controller.ReportController"> + <children> + <VBox prefHeight="200.0" prefWidth="100.0" spacing="14.0" AnchorPane.bottomAnchor="14.0" AnchorPane.leftAnchor="14.0" AnchorPane.rightAnchor="14.0" AnchorPane.topAnchor="14.0"> + <children> + <HBox spacing="14.0"> + <children> + <Label alignment="CENTER_RIGHT" minWidth="100.0" prefWidth="100.0" text="Projekt:"> + <font> + <Font name="System Bold" size="16.0" /> + </font> + </Label> + <ComboBox fx:id="comboBoxProject" maxWidth="1.7976931348623157E308" HBox.hgrow="ALWAYS" /> + </children> + </HBox> + <HBox spacing="14.0" VBox.vgrow="ALWAYS"> + <children> + <Label alignment="CENTER_RIGHT" minWidth="100.0" prefWidth="100.0" text="Task:"> + <font> + <Font name="System Bold" size="16.0" /> + </font> + </Label> + <ListView fx:id="listViewTasks" prefWidth="358.0" HBox.hgrow="ALWAYS" /> + </children> + </HBox> + <HBox spacing="14.0"> + <children> + <Label alignment="CENTER_RIGHT" minWidth="100.0" prefWidth="100.0" text="Darstellung:"> + <font> + <Font name="System Bold" size="16.0" /> + </font> + </Label> + <VBox spacing="5.0"> + <children> + <RadioButton fx:id="radioButtonList" mnemonicParsing="false" text="Liste" /> + <RadioButton fx:id="radioButtonGroupByTasks" mnemonicParsing="false" text="gruppiert nach Tasks" /> + <RadioButton fx:id="radioButtonGroupByDate" mnemonicParsing="false" text="gruppiert nach Datum" /> + </children> + </VBox> + </children> + </HBox> + <HBox alignment="BOTTOM_CENTER" prefHeight="100.0" prefWidth="200.0" spacing="25.0"> + <children> + <Button mnemonicParsing="false" onAction="#generateReport" text="Erzeugen"> + <font> + <Font name="System Bold" size="14.0" /> + </font> + </Button> + <Button mnemonicParsing="false" onAction="#cancel" text="Abbrechen"> + <font> + <Font name="System Bold" size="14.0" /> + </font> + </Button> + </children> + <VBox.margin> + <Insets top="10.0" /> + </VBox.margin> + </HBox> + </children> + </VBox> + </children> +</AnchorPane>