feat: add directory selectors for AI test toolchain
This commit is contained in:
@@ -0,0 +1,67 @@
|
|||||||
|
package com.example.workutils.biz.aitest.ui;
|
||||||
|
|
||||||
|
import javafx.geometry.Pos;
|
||||||
|
import javafx.scene.control.Button;
|
||||||
|
import javafx.scene.control.TextField;
|
||||||
|
import javafx.scene.layout.HBox;
|
||||||
|
import javafx.scene.layout.Priority;
|
||||||
|
import javafx.stage.DirectoryChooser;
|
||||||
|
import javafx.stage.Window;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
|
public class DirectoryPathSelector extends HBox {
|
||||||
|
private final String label;
|
||||||
|
private final Supplier<Window> ownerSupplier;
|
||||||
|
private final TextField pathField = new TextField();
|
||||||
|
private final Button chooseButton = new Button("选择目录");
|
||||||
|
|
||||||
|
public DirectoryPathSelector(String label, Supplier<Window> ownerSupplier) {
|
||||||
|
super(8);
|
||||||
|
this.label = label;
|
||||||
|
this.ownerSupplier = ownerSupplier;
|
||||||
|
pathField.setEditable(false);
|
||||||
|
pathField.setPromptText("请选择" + label);
|
||||||
|
pathField.setAccessibleText(label);
|
||||||
|
chooseButton.setAccessibleText("选择 " + label + " 目录");
|
||||||
|
chooseButton.setOnAction(event -> chooseDirectory());
|
||||||
|
setAlignment(Pos.CENTER_LEFT);
|
||||||
|
HBox.setHgrow(pathField, Priority.ALWAYS);
|
||||||
|
getChildren().addAll(pathField, chooseButton);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Path getPath() {
|
||||||
|
return pathField.getText().isBlank() ? Path.of("") : Path.of(pathField.getText());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPath(Path path) {
|
||||||
|
pathField.setText(path == null || path.toString().isBlank() ? "" : path.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
public TextField pathField() {
|
||||||
|
return pathField;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Button chooseButton() {
|
||||||
|
return chooseButton;
|
||||||
|
}
|
||||||
|
|
||||||
|
void applySelection(File selected) {
|
||||||
|
if (selected != null) {
|
||||||
|
setPath(selected.toPath());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void chooseDirectory() {
|
||||||
|
DirectoryChooser chooser = new DirectoryChooser();
|
||||||
|
chooser.setTitle("选择 " + label + " 目录");
|
||||||
|
Path current = getPath();
|
||||||
|
if (!current.toString().isBlank() && Files.isDirectory(current)) {
|
||||||
|
chooser.setInitialDirectory(current.toFile());
|
||||||
|
}
|
||||||
|
applySelection(chooser.showDialog(ownerSupplier.get()));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
package com.example.workutils.biz.aitest.ui;
|
||||||
|
|
||||||
|
import com.example.workutils.system.ui.FxTestSupport;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertFalse;
|
||||||
|
|
||||||
|
class DirectoryPathSelectorTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void pathIsReadOnlyAndCancelKeepsExistingValue() throws Exception {
|
||||||
|
DirectoryPathSelector selector = FxTestSupport.fx(
|
||||||
|
() -> new DirectoryPathSelector("JDK 8 Home", () -> null));
|
||||||
|
FxTestSupport.fx(() -> selector.setPath(Path.of("C:/jdk8")));
|
||||||
|
FxTestSupport.fx(() -> selector.applySelection(null));
|
||||||
|
|
||||||
|
assertFalse(FxTestSupport.fx(() -> selector.pathField().isEditable()));
|
||||||
|
assertEquals(Path.of("C:/jdk8"), FxTestSupport.fx(selector::getPath));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void selectedDirectoryUpdatesValue() throws Exception {
|
||||||
|
DirectoryPathSelector selector = FxTestSupport.fx(
|
||||||
|
() -> new DirectoryPathSelector("Maven Home", () -> null));
|
||||||
|
|
||||||
|
FxTestSupport.fx(() -> selector.applySelection(new File("C:/maven")));
|
||||||
|
|
||||||
|
assertEquals(Path.of("C:/maven"), FxTestSupport.fx(selector::getPath));
|
||||||
|
assertEquals("选择 Maven Home 目录", FxTestSupport.fx(
|
||||||
|
() -> selector.chooseButton().getAccessibleText()));
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user