From 4a63c91703816812bff19a048d4f64a4c317f339 Mon Sep 17 00:00:00 2001 From: g-mixalowski Date: Wed, 18 Mar 2026 17:17:38 +0300 Subject: [PATCH 1/3] commander: test --- .../java/commander/CommanderApplication.java | 1 - .../hse/java/commander/MainController.java | 196 ++++++++++++++++-- .../hse/java/commander/commander-ui.fxml | 16 +- 3 files changed, 186 insertions(+), 27 deletions(-) diff --git a/commander/src/main/java/hse/java/commander/CommanderApplication.java b/commander/src/main/java/hse/java/commander/CommanderApplication.java index 471f6fd5..d5928f87 100644 --- a/commander/src/main/java/hse/java/commander/CommanderApplication.java +++ b/commander/src/main/java/hse/java/commander/CommanderApplication.java @@ -21,6 +21,5 @@ public void start(Stage stage) throws IOException { stage.setTitle("Commander"); stage.setScene(scene); stage.show(); - System.out.println("Hello world"); } } diff --git a/commander/src/main/java/hse/java/commander/MainController.java b/commander/src/main/java/hse/java/commander/MainController.java index 5de3b66d..bd641a1a 100644 --- a/commander/src/main/java/hse/java/commander/MainController.java +++ b/commander/src/main/java/hse/java/commander/MainController.java @@ -1,45 +1,203 @@ package hse.java.commander; +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; import javafx.fxml.FXML; -import javafx.scene.control.Button; -import javafx.scene.control.ListView; +import javafx.scene.control.*; +import javafx.scene.input.KeyCode; +import javafx.scene.input.MouseButton; -import java.nio.file.Path; +import java.io.IOException; +import java.nio.file.*; +import java.nio.file.attribute.BasicFileAttributes; +import java.util.stream.Collectors; public class MainController { @FXML - public ListView left; + public ListView left; @FXML - public ListView right; + public ListView right; + @FXML + public Button leftBack; + + @FXML + public Button rightBack; + + @FXML public Button move; - private Path leftDir; - private Path rightDir; + private Path leftCurPath; + private Path rightCurPath; - // for testing + private boolean leftSelected; + public void setInitialDirs(Path leftStart, Path rightStart) { - this.leftDir = leftStart; - this.rightDir = rightStart; + leftCurPath = leftStart; + rightCurPath = rightStart; + initialize(); } public void initialize() { - move.setOnMouseClicked(event -> { + showPanel(left); + showPanel(right); - }); - System.out.println(System.getProperty("user.home")); - left.getItems().add("Kek"); + updateLeft(); + updateRight(); + + leftBack.setOnAction(e -> goParent(left)); + rightBack.setOnAction(e -> goParent(right)); + + move.setOnAction(e -> moveSelected()); left.setOnMouseClicked(event -> { - if (event.getClickCount() == 2) { - int index = left.getSelectionModel().getSelectedIndex(); - if (index >= 0) { - left.getItems().set(index, "clicked"); + if (event.getButton() == MouseButton.PRIMARY && event.getClickCount() == 2) { + goSelected(left); + } + }); + right.setOnMouseClicked(event -> { + if (event.getButton() == MouseButton.PRIMARY && event.getClickCount() == 2) { + goSelected(right); + } + }); + + left.getSelectionModel().selectedItemProperty().addListener((obs, oldVal, newVal) -> { + if (newVal != null) { + leftSelected = true; + right.getSelectionModel().clearSelection(); + } + }); + right.getSelectionModel().selectedItemProperty().addListener((obs, oldVal, newVal) -> { + if (newVal != null) { + leftSelected = false; + left.getSelectionModel().clearSelection(); + } + }); + } + + private void showPanel(ListView paths) { + paths.setCellFactory(lv -> new ListCell<>() { + @Override + protected void updateItem(Path item, boolean empty) { + super.updateItem(item, empty); + if (empty || item == null) { + setText(null); + } else { + String name = item.getFileName().toString(); + if (Files.isDirectory(item)) { + name += "/"; + } + setText(name); } } }); } -} + + private void updateLeft() { + updatePanel(left, leftCurPath); + } + + private void updateRight() { + updatePanel(right, rightCurPath); + } + + private void updatePanel(ListView paths, Path dir) { + try { + ObservableList items = Files.list(dir).collect(Collectors.toCollection(FXCollections::observableArrayList)); + paths.setItems(items); + } catch(IOException e) { + alert("Ошибка (highly likely permission denied)"); + goParent(paths); + } + } + + private void goParent(ListView paths) { + Path curPath = (paths == left) ? leftCurPath : rightCurPath; + Path parent = curPath.getParent(); + goFolder(paths, parent); + } + + private void goSelected(ListView paths) { + Path selected = paths.getSelectionModel().getSelectedItem(); + goFolder(paths, selected); + } + + private void moveSelected() { + Path source = leftSelected ? left.getSelectionModel().getSelectedItem() : right.getSelectionModel().getSelectedItem(); + Path targetDir = leftSelected ? rightCurPath : leftCurPath; + + if (!Files.isDirectory(targetDir)) { + alert("NO DIR HUH"); + return; + } + + Path target = targetDir.resolve(source.getFileName()); + + if (target.equals(source)) { + return; + } + + try { + Files.move(source, target, StandardCopyOption.REPLACE_EXISTING); + updateLeft(); + updateRight(); + } catch(IOException e) { + try { + recCopy(source, target); + recDel(source); + updateLeft(); + updateRight(); + } catch(IOException e2) { + alert("CAN't MOVE"); + } + } + } + + private void recCopy(Path source, Path target) throws IOException { + if (Files.isDirectory(source)) { + Files.createDirectories(target); + try (DirectoryStream stream = Files.newDirectoryStream(source)) { + for (Path entry : stream) { + recCopy(entry, target.resolve(entry.getFileName())); + } + } + } else { + Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING); + } + } + + private void recDel(Path path) throws IOException { + if (Files.isDirectory(path)) { + try (DirectoryStream stream = Files.newDirectoryStream(path)) { + for (Path entry : stream) { + recDel(entry); + } + } + } + Files.delete(path); + } + + private void goFolder(ListView paths, Path folder) { + if (Files.isDirectory(folder)) { + if (paths == left) { + leftCurPath = folder; + updateLeft(); + } else { + rightCurPath = folder; + updateRight(); + } + } + } + + private void alert(String name) { + Alert alert = new Alert(Alert.AlertType.WARNING); + alert.setTitle(name); + alert.setHeaderText(null); + alert.setContentText("https://www.youtube.com/watch?v=dQw4w9WgXcQ"); + alert.showAndWait(); + } + +} \ No newline at end of file diff --git a/commander/src/main/resources/hse/java/commander/commander-ui.fxml b/commander/src/main/resources/hse/java/commander/commander-ui.fxml index 724bbc8a..5383d44b 100644 --- a/commander/src/main/resources/hse/java/commander/commander-ui.fxml +++ b/commander/src/main/resources/hse/java/commander/commander-ui.fxml @@ -5,12 +5,14 @@ - - - - -