package org.markdownwriterfx.controls;
import java.io.File;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.event.ActionEvent;
import javafx.scene.control.Button;
import javafx.scene.control.Tooltip;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.stage.FileChooser;
import javafx.stage.FileChooser.ExtensionFilter;
import org.markdownwriterfx.Messages;
import de.jensd.fx.glyphs.GlyphsDude;
import de.jensd.fx.glyphs.fontawesome.FontAwesomeIcon;
public class BrowseFileButton
extends Button
{
private final List<ExtensionFilter> extensionFilters = new ArrayList<>();
public BrowseFileButton() {
setGraphic(GlyphsDude.createIcon(FontAwesomeIcon.FILE_ALT, "1.2em"));
setTooltip(new Tooltip(Messages.get("BrowseFileButton.tooltip")));
setOnAction(this::browse);
disableProperty().bind(basePath.isNull());
addEventHandler(KeyEvent.KEY_RELEASED, e-> {
if (e.getCode() == KeyCode.ESCAPE)
e.consume();
});
}
public void addExtensionFilter(ExtensionFilter extensionFilter) {
extensionFilters.add(extensionFilter);
}
private final ObjectProperty<Path> basePath = new SimpleObjectProperty<>();
public Path getBasePath() { return basePath.get(); }
public void setBasePath(Path basePath) { this.basePath.set(basePath); }
public ObjectProperty<Path> basePathProperty() { return basePath; }
private final ObjectProperty<String> url = new SimpleObjectProperty<>();
public String getUrl() { return url.get(); }
public void setUrl(String url) { this.url.set(url); }
public ObjectProperty<String> urlProperty() { return url; }
protected void browse(ActionEvent e) {
FileChooser fileChooser = new FileChooser();
fileChooser.setTitle(Messages.get("BrowseFileButton.chooser.title"));
fileChooser.getExtensionFilters().addAll(extensionFilters);
fileChooser.getExtensionFilters().add(new ExtensionFilter(Messages.get("BrowseFileButton.chooser.allFilesFilter"), "*.*"));
fileChooser.setInitialDirectory(getInitialDirectory());
File result = fileChooser.showOpenDialog(getScene().getWindow());
if (result != null)
updateUrl(result);
}
protected File getInitialDirectory() {
return getBasePath().toFile();
}
protected void updateUrl(File file) {
String newUrl;
try {
newUrl = getBasePath().relativize(file.toPath()).toString();
} catch (IllegalArgumentException ex) {
newUrl = file.toString();
}
url.set(newUrl.replace('\\', '/'));
}
}