diff --git a/commander/pom.xml b/commander/pom.xml index 42bb88f3..028d157a 100644 --- a/commander/pom.xml +++ b/commander/pom.xml @@ -13,8 +13,8 @@ UTF-8 - 25 - 25 + 21 + 21 21.0.6 5.12.1 3.2.5 @@ -80,6 +80,7 @@ maven-surefire-plugin ${maven.surefire.version} + ${groups:-} ${failIfNoTests:-true} diff --git a/commander/src/main/java/hse/java/commander/CommanderApplication.java b/commander/src/main/java/hse/java/commander/CommanderApplication.java index 471f6fd5..2f7f32cf 100644 --- a/commander/src/main/java/hse/java/commander/CommanderApplication.java +++ b/commander/src/main/java/hse/java/commander/CommanderApplication.java @@ -13,6 +13,11 @@ public class CommanderApplication extends Application { public void start(Stage stage) throws IOException { FXMLLoader fxmlLoader = new FXMLLoader(CommanderApplication.class.getResource("commander-ui.fxml")); Scene scene = new Scene(fxmlLoader.load(), 400, 400); + scene.getStylesheets().add( + CommanderApplication.class.getResource("commander.css").toExternalForm() + ); + + MainController ctrl = fxmlLoader.getController(); String home = System.getProperty("user.home"); if (ctrl != null && home != null) { diff --git a/commander/src/main/java/hse/java/commander/Examples/FillListViewWithFiles.java b/commander/src/main/java/hse/java/commander/Examples/FillListViewWithFiles.java new file mode 100644 index 00000000..20a8f6fb --- /dev/null +++ b/commander/src/main/java/hse/java/commander/Examples/FillListViewWithFiles.java @@ -0,0 +1,54 @@ +package hse.java.commander.Examples; + +import javafx.application.Application; +import javafx.scene.Scene; +import javafx.scene.control.ListView; +import javafx.scene.layout.VBox; +import javafx.stage.Stage; +import java.nio.file.*; +import java.util.List; + +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.stream.Collectors; + +public class FillListViewWithFiles extends Application { + + public List listDir(Path dir) throws IOException { + try (var stream = Files.list(dir)) { + return stream + .map(p -> p.getFileName().toString()) + .sorted() + .collect(Collectors.toList()); + } + } + + public void refreshList(ListView listView, Path dir) throws IOException { + listView.getItems().clear(); + listView.getItems().add("..."); + listView.getItems().addAll(listDir(dir)); + } + + @Override + public void start(Stage primaryStage) { + ListView listView = new ListView<>(); + Path path = Paths.get("/Users/qwertz/Desktop/code/Java_codes/HSE/hse-java/commander/src/main/java/hse/java/commander/"); + + try { + refreshList(listView, path); + } catch (IOException e) { + e.printStackTrace(); // Обработка ошибки + } + + VBox vbox = new VBox(listView); + Scene scene = new Scene(vbox, 400, 500); + primaryStage.setScene(scene); + primaryStage.setTitle("File List Viewer"); + primaryStage.show(); + } + + public static void main(String[] args) { + launch(args); // Запускаем JavaFX приложение + } +} diff --git a/commander/src/main/java/hse/java/commander/Examples/Main.java b/commander/src/main/java/hse/java/commander/Examples/Main.java new file mode 100644 index 00000000..6e2f6b09 --- /dev/null +++ b/commander/src/main/java/hse/java/commander/Examples/Main.java @@ -0,0 +1,56 @@ +package hse.java.commander.Examples; + +import javafx.application.Application; +import javafx.scene.Scene; +import javafx.scene.control.Button; // Import Button +import javafx.scene.layout.VBox; // Import VBox +import javafx.scene.text.Text; +import javafx.stage.Stage; + +import java.util.List; + +public class Main extends Application { + Integer countTap = 0 ; + + public static void main(String[] args) { + System.out.println("Launching Application"); + Application.launch(args); + } + + @Override + public void init() throws Exception { + System.out.println("Application inits"); + super.init(); + } + + @Override + public void start(Stage stage) { + System.out.println("Application starts"); + + // Create button and set action + Button btn = new Button("Hello"); + + btn.setOnAction(event -> System.out.println("Button clicked!" + countTap++) ); + + // Use VBox for layout + VBox vbox = new VBox(10); // Vertical spacing of 10 + vbox.getChildren().add(btn); // Add button to VBox + + List unnamedParams = getParameters().getUnnamed(); + for (String param : unnamedParams) { + Text text = new Text(param); + vbox.getChildren().add(text); // Add text parameters to VBox + } + + Scene scene = new Scene(vbox, 300, 250); + stage.setScene(scene); + stage.setTitle("JavaFX Application"); + stage.show(); + } + + @Override + public void stop() throws Exception { + System.out.println("Application stops"); + super.stop(); + } +} diff --git a/commander/src/main/java/hse/java/commander/Launcher.java b/commander/src/main/java/hse/java/commander/Launcher.java index 9b842aa2..9e2c6b37 100644 --- a/commander/src/main/java/hse/java/commander/Launcher.java +++ b/commander/src/main/java/hse/java/commander/Launcher.java @@ -7,3 +7,4 @@ public static void main(String[] args) { Application.launch(CommanderApplication.class, args); } } + diff --git a/commander/src/main/java/hse/java/commander/MainController.java b/commander/src/main/java/hse/java/commander/MainController.java index 5de3b66d..3ddad5e3 100644 --- a/commander/src/main/java/hse/java/commander/MainController.java +++ b/commander/src/main/java/hse/java/commander/MainController.java @@ -2,44 +2,169 @@ import javafx.fxml.FXML; import javafx.scene.control.Button; +import javafx.scene.control.Label; import javafx.scene.control.ListView; +import javafx.scene.layout.VBox; +import java.io.IOException; +import java.nio.file.Files; import java.nio.file.Path; +import java.nio.file.StandardCopyOption; +import java.util.List; +import java.util.stream.Collectors; public class MainController { - @FXML - public ListView left; + private ListView activeList; + private Path activeDir; - @FXML - public ListView right; - - @FXML - public Button move; + @FXML public ListView left; + @FXML public ListView right; + @FXML public Button move; + @FXML public Button copy; + @FXML public Button delete; private Path leftDir; private Path rightDir; - // for testing + + @FXML public Label leftPathBar; + @FXML public Label rightPathBar; + @FXML public VBox leftPanel; + @FXML public VBox rightPanel; + + public void setInitialDirs(Path leftStart, Path rightStart) { this.leftDir = leftStart; this.rightDir = rightStart; + refreshList(left, leftDir); + refreshList(right, rightDir); } public void initialize() { - move.setOnMouseClicked(event -> { - + left.setOnMouseClicked(event -> { + activeList = left; + activeDir = leftDir; + leftPanel.getStyleClass().remove("panel-active"); + leftPanel.getStyleClass().add("panel-active"); + if (event.getClickCount() == 2) { + handleDoubleClick(left, leftDir, true); + } }); - System.out.println(System.getProperty("user.home")); - left.getItems().add("Kek"); - left.setOnMouseClicked(event -> { + right.setOnMouseClicked(event -> { + activeList = right; + activeDir = rightDir; + rightPanel.getStyleClass().add("panel-active"); + rightPanel.getStyleClass().remove("panel-active"); if (event.getClickCount() == 2) { - int index = left.getSelectionModel().getSelectedIndex(); - if (index >= 0) { - left.getItems().set(index, "clicked"); - } + handleDoubleClick(right, rightDir, false); } }); + + copy.setOnMouseClicked(event -> handleCopy()); + move.setOnMouseClicked(event -> handleMove()); + delete.setOnMouseClicked(event -> handleDelete()); + } + + private void handleDoubleClick(ListView listView, Path currentDir, boolean isLeft) { + String selected = listView.getSelectionModel().getSelectedItem(); + if (selected == null) return; + + if (selected.equals("...")) { + Path parent = currentDir.getParent(); + if (parent != null) { + if (isLeft) { + leftDir = parent; + activeDir = leftDir; + refreshList(left, leftDir); + } else { + rightDir = parent; + activeDir = rightDir; + refreshList(right, rightDir); + } + } + } else { + Path target = currentDir.resolve(selected); + if (Files.isDirectory(target)) { + if (isLeft) { + leftDir = target; + activeDir = leftDir; + refreshList(left, leftDir); + } else { + rightDir = target; + activeDir = rightDir; + refreshList(right, rightDir); + } + } + } + } + + private void handleCopy() { + if (activeList == null || activeDir == null) return; + String selected = activeList.getSelectionModel().getSelectedItem(); + if (selected == null || selected.equals("...")) return; + + Path source = activeDir.resolve(selected); + Path targetDir = (activeList == left) ? rightDir : leftDir; + Path target = targetDir.resolve(selected); + + try { + Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING); + refreshList(left, leftDir); + refreshList(right, rightDir); + } catch (IOException e) { + e.printStackTrace(); + } + } + + private void handleMove() { + if (activeList == null || activeDir == null) return; + String selected = activeList.getSelectionModel().getSelectedItem(); + if (selected == null || selected.equals("...")) return; + + Path source = activeDir.resolve(selected); + Path targetDir = (activeList == left) ? rightDir : leftDir; + Path target = targetDir.resolve(selected); + + try { + Files.move(source, target, StandardCopyOption.REPLACE_EXISTING); + refreshList(left, leftDir); + refreshList(right, rightDir); + } catch (IOException e) { + e.printStackTrace(); + } + } + + private void handleDelete() { + if (activeList == null || activeDir == null) return; + String selected = activeList.getSelectionModel().getSelectedItem(); + if (selected == null || selected.equals("...")) return; + + Path toDelete = activeDir.resolve(selected); + try { + Files.deleteIfExists(toDelete); + refreshList(left, leftDir); + refreshList(right, rightDir); + } catch (IOException e) { + e.printStackTrace(); + } + } + + private void refreshList(ListView listView, Path dir) { + listView.getItems().clear(); + listView.getItems().add("..."); + try (var stream = Files.list(dir)) { + List names = stream + .map(p -> p.getFileName().toString()) + .sorted() + .collect(Collectors.toList()); + listView.getItems().addAll(names); + } catch (IOException e) { + e.printStackTrace(); + } + + if (listView == left && leftPathBar != null) leftPathBar.setText(dir.toString()); + if (listView == right && rightPathBar != null) rightPathBar.setText(dir.toString()); } -} +} \ No newline at end of file diff --git a/commander/src/main/java/module-info.java b/commander/src/main/java/module-info.java index 0a750cc2..6a7516ff 100644 --- a/commander/src/main/java/module-info.java +++ b/commander/src/main/java/module-info.java @@ -1,7 +1,11 @@ module hse.java.commander { requires javafx.controls; requires javafx.fxml; + requires java.xml; + requires java.desktop; opens hse.java.commander to javafx.fxml; exports hse.java.commander; + exports hse.java.commander.Examples; + opens hse.java.commander.Examples to javafx.fxml; } \ 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..293fbe3c 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,26 @@ - - - - + + + + + + - -