package com.scrivenvar.controls;
import com.scrivenvar.Messages;
import de.jensd.fx.glyphs.fontawesome.FontAwesomeIcon;
import de.jensd.fx.glyphs.fontawesome.utils.FontAwesomeIconFactory;
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 java.io.File;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
public class BrowseFileButton extends Button {
private final List<ExtensionFilter> extensionFilters = new ArrayList<>();
public BrowseFileButton() {
setGraphic(
FontAwesomeIconFactory.get().createIcon( FontAwesomeIcon.FILE_ALT )
);
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 );
}
private final ObjectProperty<String> url = new SimpleObjectProperty<>();
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( '\\', '/' ) );
}
}