diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/ZipEntryManager.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/ZipEntryManager.java index 471b7ec6d9ee0c471fa3fbb5080e76f3d12802eb..b670159df71f673e17ac2a03585210074a6ccf68 100644 --- a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/ZipEntryManager.java +++ b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/ZipEntryManager.java @@ -2,6 +2,7 @@ package de.hft.stuttgart.citydoctor2.gui; import de.hft.stuttgart.citydoctor2.gui.tree.ZipEntryListCell; import de.hft.stuttgart.citydoctor2.gui.tree.ZipEntryNode; +import de.hft.stuttgart.citydoctor2.utils.ArchivePacker; import de.hft.stuttgart.citydoctor2.utils.Localization; import de.hft.stuttgart.citydoctor2.zip.CityGmlZipArchive; import de.hft.stuttgart.citydoctor2.zip.CityGmlZipEntry; @@ -22,14 +23,17 @@ import javafx.scene.image.ImageView; import javafx.scene.input.KeyCode; import javafx.scene.input.KeyEvent; import javafx.scene.layout.VBox; +import javafx.stage.FileChooser; import javafx.stage.Modality; import javafx.stage.Stage; import javafx.stage.Window; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import java.io.File; import java.io.IOException; import java.io.InputStream; +import java.util.function.Predicate; public class ZipEntryManager { @@ -96,6 +100,11 @@ public class ZipEntryManager { @FXML private ImageView showReportImageView; + @FXML + private Button saveBtn; + @FXML + private ImageView saveImageView; + @FXML private ListView<ZipEntryNode> entryList; @FXML @@ -165,6 +174,10 @@ public class ZipEntryManager { Image img = new Image(inStream); showReportImageView.setImage(img); } + try (InputStream inStream = MainWindow.class.getResourceAsStream("icons/save.png")) { + Image img = new Image(inStream); + saveImageView.setImage(img); + } } catch (IOException ignored) { //ignore exceptions } @@ -273,6 +286,19 @@ public class ZipEntryManager { }); showReportBtn.setDisable(true); + saveBtn.setOnAction(e -> { + FileChooser fileChooser = new FileChooser(); + fileChooser.setTitle("Export Zip file"); + FileChooser.ExtensionFilter zipFilter = new FileChooser.ExtensionFilter("Zip File", "*.zip"); + fileChooser.getExtensionFilters().add(zipFilter); + File f = fileChooser.showSaveDialog(stage.getOwner()); + if (f != null) { + ArchivePacker.packArchive(f.getAbsolutePath(), archive); + } + + }); + saveBtn.setDisable(true); + cancelBtn.setOnAction(e -> stage.close()); } @@ -311,9 +337,9 @@ public class ZipEntryManager { entryList.getSelectionModel().clearSelection(); entryList.getSelectionModel().select(selectionIndex); showMetadata(entryList.getSelectionModel().getSelectedItem().getEntry()); - decompressAllBtn.setDisable( - entryList.getItems().stream().allMatch(zipEntryNode -> - (zipEntryNode.getEntry().isDecompressed()) || zipEntryNode.getEntry().getErrorType() != null)); + Predicate<ZipEntryNode> allEntriesDecompressed = node -> (node.getEntry().isDecompressed() || node.getEntry().getErrorType() != null); + decompressAllBtn.setDisable(entryList.getItems().stream().allMatch(allEntriesDecompressed)); + saveBtn.setDisable(entryList.getItems().stream().allMatch(Predicate.not(allEntriesDecompressed))); } private void showMetadata(CityGmlZipEntry entry) { diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/resources/de/hft/stuttgart/citydoctor2/gui/ZipEntryManager.fxml b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/resources/de/hft/stuttgart/citydoctor2/gui/ZipEntryManager.fxml index 773b318d69de559c6d62ea10ee8bc26d10165ba2..2fa2f2d041fc0b5534e51b79b8ed949bdf085c36 100644 --- a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/resources/de/hft/stuttgart/citydoctor2/gui/ZipEntryManager.fxml +++ b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/resources/de/hft/stuttgart/citydoctor2/gui/ZipEntryManager.fxml @@ -17,60 +17,82 @@ <VBox xmlns="http://javafx.com/javafx/22" xmlns:fx="http://javafx.com/fxml/1"> <children> <HBox prefHeight="50.0" prefWidth="200.0" spacing="5.0"> - <padding> - <Insets bottom="5.0" left="5.0" right="5.0" top="5.0"/> - </padding> <children> - <Button fx:id="loadBtn" alignment="CENTER" maxWidth="1.7976931348623157E308" mnemonicParsing="false"> - <font> - <Font size="14.0"/> - </font> - <graphic> - <ImageView fx:id="loadImageView" fitHeight="32.0" fitWidth="32.0" pickOnBounds="true" - preserveRatio="true"/> - </graphic> - </Button> - <Button fx:id="decompressBtn" alignment="CENTER" layoutX="15.0" layoutY="15.0" - maxWidth="1.7976931348623157E308" mnemonicParsing="false"> - <font> - <Font size="14.0"/> - </font> - <graphic> - <ImageView fx:id="decompressImageView" fitHeight="32.0" fitWidth="32.0" pickOnBounds="true" - preserveRatio="true"/> - </graphic> - </Button> - <Button fx:id="showReportBtn" alignment="CENTER" layoutX="70.0" layoutY="15.0" - maxWidth="1.7976931348623157E308" mnemonicParsing="false"> - <font> - <Font size="14.0"/> - </font> - <graphic> - <ImageView fx:id="showReportImageView" fitHeight="32.0" fitWidth="32.0" pickOnBounds="true" - preserveRatio="true"/> - </graphic> - </Button> - <Separator orientation="VERTICAL" prefHeight="200.0"/> - <Button fx:id="decompressAllBtn" alignment="CENTER" layoutX="70.0" layoutY="15.0" - maxWidth="1.7976931348623157E308" mnemonicParsing="false"> - <font> - <Font size="14.0"/> - </font> - <graphic> - <ImageView fx:id="decompressAllImageView" fitHeight="32.0" fitWidth="32.0" pickOnBounds="true" - preserveRatio="true"/> - </graphic> - </Button> - <Button fx:id="checkAllBtn" alignment="CENTER" layoutX="126.0" layoutY="15.0" - maxWidth="1.7976931348623157E308" mnemonicParsing="false"> - <font> - <Font size="14.0"/> - </font> - <graphic> - <ImageView fx:id="checkAllImageView" fitHeight="32.0" fitWidth="32.0" pickOnBounds="true" - preserveRatio="true"/> - </graphic> - </Button> + <HBox spacing="5.0"> + <children> + <Button fx:id="loadBtn" alignment="CENTER" maxWidth="1.7976931348623157E308" + mnemonicParsing="false"> + <font> + <Font size="14.0"/> + </font> + <graphic> + <ImageView fx:id="loadImageView" fitHeight="32.0" fitWidth="32.0" pickOnBounds="true" + preserveRatio="true"/> + </graphic> + </Button> + <Button fx:id="decompressBtn" alignment="CENTER" maxWidth="1.7976931348623157E308" + mnemonicParsing="false"> + <font> + <Font size="14.0"/> + </font> + <graphic> + <ImageView fx:id="decompressImageView" fitHeight="32.0" fitWidth="32.0" + pickOnBounds="true" preserveRatio="true"/> + </graphic> + </Button> + <Button fx:id="showReportBtn" alignment="CENTER" maxWidth="1.7976931348623157E308" + mnemonicParsing="false"> + <font> + <Font size="14.0"/> + </font> + <graphic> + <ImageView fx:id="showReportImageView" fitHeight="32.0" fitWidth="32.0" + pickOnBounds="true" preserveRatio="true"/> + </graphic> + </Button> + <Separator orientation="VERTICAL" prefHeight="200.0"/> + <Button fx:id="decompressAllBtn" alignment="CENTER" maxWidth="1.7976931348623157E308" + mnemonicParsing="false"> + <font> + <Font size="14.0"/> + </font> + <graphic> + <ImageView fx:id="decompressAllImageView" fitHeight="32.0" fitWidth="32.0" + pickOnBounds="true" preserveRatio="true"/> + </graphic> + </Button> + <Button fx:id="checkAllBtn" alignment="CENTER" maxWidth="1.7976931348623157E308" + mnemonicParsing="false"> + <font> + <Font size="14.0"/> + </font> + <graphic> + <ImageView fx:id="checkAllImageView" fitHeight="32.0" fitWidth="32.0" + pickOnBounds="true" preserveRatio="true"/> + </graphic> + </Button> + </children> + <padding> + <Insets bottom="5.0" left="5.0" right="5.0" top="5.0"/> + </padding> + </HBox> + <HBox alignment="TOP_RIGHT" prefHeight="52.0" prefWidth="124.0"> + <children> + <Button fx:id="saveBtn" alignment="CENTER" maxWidth="1.7976931348623157E308" + mnemonicParsing="false"> + <font> + <Font size="14.0"/> + </font> + <graphic> + <ImageView fx:id="saveImageView" fitHeight="32.0" fitWidth="32.0" pickOnBounds="true" + preserveRatio="true"/> + </graphic> + </Button> + </children> + <padding> + <Insets bottom="5.0" left="5.0" right="5.0" top="5.0"/> + </padding> + </HBox> </children> </HBox> <HBox fillHeight="false" prefHeight="200.0" prefWidth="600.0" VBox.vgrow="ALWAYS">