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..4af8ec23 100644 --- a/commander/src/main/java/hse/java/commander/MainController.java +++ b/commander/src/main/java/hse/java/commander/MainController.java @@ -1,45 +1,160 @@ 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.MouseButton; +import javafx.util.Callback; -import java.nio.file.Path; +import java.io.IOException; +import java.nio.file.*; +import java.util.Comparator; +import java.util.stream.Collectors; +import java.util.stream.Stream; public class MainController { - @FXML - public ListView left; - - @FXML - public ListView right; - - @FXML - public Button move; + @FXML private ListView leftPane; + @FXML private ListView rightPane; + @FXML private Label leftPathLabel; + @FXML private Label rightPathLabel; + @FXML private Button btnCopy; + @FXML private Button btnMove; + @FXML private Button btnDelete; private Path leftDir; private Path rightDir; + private ListView focusedPane; + + public void initialize() { + if (leftDir == null) leftDir = Paths.get(System.getProperty("user.home")); + if (rightDir == null) rightDir = Paths.get(System.getProperty("user.home")); + + Callback, ListCell> cellFactory = lv -> new ListCell<>() { + @Override + protected void updateItem(Path item, boolean empty) { + super.updateItem(item, empty); + if (empty || item == null) { + setText(null); + } else { + if (item.getFileName() == null) setText(item.toString()); + else setText(item.getFileName().toString()); + if (Files.isDirectory(item)) setStyle("-fx-font-weight: bold;"); + else setStyle(""); + } + } + }; + + leftPane.setCellFactory(cellFactory); + rightPane.setCellFactory(cellFactory); + + setupPaneInteraction(leftPane, true); + setupPaneInteraction(rightPane, false); + + btnCopy.setOnAction(e -> transferSelected(TransferOp.COPY)); + btnMove.setOnAction(e -> transferSelected(TransferOp.MOVE)); + btnDelete.setOnAction(e -> transferSelected(TransferOp.DELETE)); + + refreshBoth(); + } - // for testing public void setInitialDirs(Path leftStart, Path rightStart) { - this.leftDir = leftStart; - this.rightDir = rightStart; + if (leftStart != null) leftDir = leftStart; + if (rightStart != null) rightDir = rightStart; + if (leftPane != null && rightPane != null) refreshBoth(); } - public void initialize() { - move.setOnMouseClicked(event -> { + private void setupPaneInteraction(ListView pane, boolean isLeft) { + pane.setOnMouseClicked(evt -> { + focusedPane = pane; + if (evt.getButton() == MouseButton.PRIMARY && evt.getClickCount() == 2) { + Path sel = pane.getSelectionModel().getSelectedItem(); + if (sel == null) return; - }); - System.out.println(System.getProperty("user.home")); - left.getItems().add("Kek"); - - left.setOnMouseClicked(event -> { - if (event.getClickCount() == 2) { - int index = left.getSelectionModel().getSelectedIndex(); - if (index >= 0) { - left.getItems().set(index, "clicked"); + Path current = isLeft ? leftDir : rightDir; + + if (sel.equals(current.getParent())) { + if (current.getParent() != null) { + if (isLeft) leftDir = current.getParent(); + else rightDir = current.getParent(); + refreshBoth(); + } + return; + } + + if (Files.isDirectory(sel)) { + if (isLeft) leftDir = sel; + else rightDir = sel; + refreshBoth(); } } }); } + + private enum TransferOp { COPY, MOVE, DELETE } + + private void transferSelected(TransferOp op) { + if (focusedPane == null) return; + Path selected = focusedPane.getSelectionModel().getSelectedItem(); + if (selected == null) return; + + Path sourceDir = (focusedPane == leftPane) ? leftDir : rightDir; + Path targetDir = (focusedPane == leftPane) ? rightDir : leftDir; + + if (selected.equals(sourceDir.getParent())) return; + + Path src = sourceDir.resolve(selected.getFileName()); + + if (op == TransferOp.DELETE) { + try { + Files.deleteIfExists(src); + } catch (IOException ignored) {} + refreshBoth(); + return; + } + + Path dst = targetDir.resolve(selected.getFileName()); + + try { + if (op == TransferOp.COPY) { + if (Files.isDirectory(src)) { + if (!Files.exists(dst)) Files.createDirectories(dst); + } else { + Files.copy(src, dst, StandardCopyOption.REPLACE_EXISTING); + } + } else if (op == TransferOp.MOVE) { + Files.move(src, dst, StandardCopyOption.REPLACE_EXISTING); + } + } catch (IOException ignored) {} + + refreshBoth(); + } + + private void refreshBoth() { + safeRefresh(leftPane, leftDir, leftPathLabel); + safeRefresh(rightPane, rightDir, rightPathLabel); + } + + private void safeRefresh(ListView pane, Path dir, Label label) { + if (dir == null) { + pane.setItems(FXCollections.observableArrayList()); + if (label != null) label.setText(""); + return; + } + + ObservableList items = FXCollections.observableArrayList(); + Path parent = dir.getParent(); + if (parent != null) items.add(parent); + + try (Stream stream = Files.list(dir)) { + var sorted = stream + .sorted(Comparator.comparing(p -> p.getFileName().toString().toLowerCase())) + .collect(Collectors.toList()); + items.addAll(sorted); + } catch (IOException ignored) {} + + pane.setItems(items); + if (label != null) label.setText(dir.toString()); + } } 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..e9ee9ab2 100644 --- a/commander/src/main/resources/hse/java/commander/commander-ui.fxml +++ b/commander/src/main/resources/hse/java/commander/commander-ui.fxml @@ -3,14 +3,28 @@ - + + - - + + + + + + -