From d9098e2d34f268b096d8daf23acbb2c3ac78aa5a Mon Sep 17 00:00:00 2001 From: Voomra Date: Thu, 27 Feb 2025 13:21:18 +0300 Subject: [PATCH] =?UTF-8?q?feat:=20=D1=8D=D0=BA=D1=81=D0=BF=D0=BE=D1=80?= =?UTF-8?q?=D1=82=20=D0=BF=D0=B0=D0=BF=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ss14/extractor/gui/MainController.java | 58 ++++++++++++++++++- 1 file changed, 55 insertions(+), 3 deletions(-) diff --git a/src/main/java/ru/di9/ss14/extractor/gui/MainController.java b/src/main/java/ru/di9/ss14/extractor/gui/MainController.java index df26b89..5945992 100644 --- a/src/main/java/ru/di9/ss14/extractor/gui/MainController.java +++ b/src/main/java/ru/di9/ss14/extractor/gui/MainController.java @@ -7,6 +7,7 @@ import javafx.scene.control.ContextMenu; import javafx.scene.control.MenuItem; import javafx.scene.control.TreeItem; import javafx.scene.control.TreeView; +import javafx.stage.DirectoryChooser; import javafx.stage.FileChooser; import javafx.stage.Stage; import lombok.Setter; @@ -16,12 +17,17 @@ import ru.di9.ss14.extractor.ContentRec; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; +import java.io.OutputStream; import java.net.URL; +import java.nio.file.Files; +import java.nio.file.Path; import java.util.HashMap; import java.util.Map; import java.util.ResourceBundle; import java.util.SortedSet; +import static java.lang.System.out; + public class MainController implements Initializable { private static final int STATE_NOT_LOADED = 0; private static final int STATE_LOAD_IN_PROGRESS = 1; @@ -107,14 +113,15 @@ public class MainController implements Initializable { if (contentRec.isFolder()) { createTreeItems(fileItem, contentRec.getChildren()); + fileItem.setContextMenuBuilder(() -> createFolderContextMenu(contentRec)); } else { - fileItem.setContextMenuBuilder(() -> createContextMenu(contentRec)); + fileItem.setContextMenuBuilder(() -> createFileContextMenu(contentRec)); } }); } - private ContextMenu createContextMenu(ContentRec contentRec) { - var menuItem = new MenuItem("\uD83D\uDCBE Сохранить %s в...".formatted(contentRec.getName())); + private ContextMenu createFileContextMenu(ContentRec contentRec) { + var menuItem = new MenuItem("\uD83D\uDCBE Сохранить файл '%s' в...".formatted(contentRec.getName())); menuItem.setOnAction(event -> { var fileChooser = new FileChooser(); fileChooser.setTitle("Сохранить " + contentRec.getName()); @@ -142,4 +149,49 @@ public class MainController implements Initializable { contextMenu.getItems().add(menuItem); return contextMenu; } + + private ContextMenu createFolderContextMenu(ContentRec contentRec) { + var menuItem = new MenuItem("\uD83D\uDCBE Сохранить папку '%s' в...".formatted(contentRec.getName())); + menuItem.setOnAction(event -> { + var dirChooser = new DirectoryChooser(); + dirChooser.setTitle("Сохранить " + contentRec.getName()); + if (lastSaveDir != null) { + dirChooser.setInitialDirectory(lastSaveDir); + } + File dir = dirChooser.showDialog(stage); + + if (dir == null) { + return; + } + + try { + exportRecursiveFolder(contentRec, dir.toPath()); + } catch (IOException e) { + throw new RuntimeException(e); + } + + lastSaveDir = dir; + }); + + var contextMenu = new ContextMenu(); + contextMenu.getItems().add(menuItem); + return contextMenu; + } + + private void exportRecursiveFolder(ContentRec contentRec, Path currentDir) throws IOException { + var subDir = currentDir.resolve(contentRec.getName()); + if (Files.notExists(subDir)) { + Files.createDirectory(subDir); + } + + for (ContentRec rec : contentRec.getChildren()) { + if (rec.isFolder()) { + exportRecursiveFolder(rec, subDir); + } else { + try (var out = new FileOutputStream(subDir.resolve(rec.getName()).toFile())) { + manager.readContent(rec.getId(), out); + } + } + } + } }