package org.jabref.gui.fieldeditors; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.scene.Node; import javafx.scene.Parent; import javafx.scene.control.Button; import javafx.scene.control.ListView; import javafx.scene.control.ProgressBar; import javafx.scene.control.Tooltip; import javafx.scene.layout.HBox; import javafx.scene.text.Text; import org.jabref.gui.DialogService; import org.jabref.gui.util.ControlHelper; import org.jabref.gui.util.TaskExecutor; import org.jabref.gui.util.ViewModelListCellFactory; import org.jabref.logic.l10n.Localization; import org.jabref.model.database.BibDatabaseContext; import org.jabref.model.entry.BibEntry; import de.jensd.fx.glyphs.materialdesignicons.MaterialDesignIcon; import de.jensd.fx.glyphs.materialdesignicons.utils.MaterialDesignIconFactory; public class LinkedFilesEditor extends HBox implements FieldEditorFX { private final String fieldName; @FXML private LinkedFilesEditorViewModel viewModel; @FXML private ListView<LinkedFileViewModel> listView; public LinkedFilesEditor(String fieldName, DialogService dialogService, BibDatabaseContext databaseContext, TaskExecutor taskExecutor) { this.fieldName = fieldName; this.viewModel = new LinkedFilesEditorViewModel(dialogService, databaseContext, taskExecutor); ControlHelper.loadFXMLForControl(this); ViewModelListCellFactory<LinkedFileViewModel> cellFactory = new ViewModelListCellFactory<LinkedFileViewModel>() .withTooltip(LinkedFileViewModel::getDescription) .withGraphic(LinkedFilesEditor::createFileDisplay); listView.setCellFactory(cellFactory); listView.itemsProperty().bind(viewModel.filesProperty()); } private static Node createFileDisplay(LinkedFileViewModel linkedFile) { Text icon = MaterialDesignIconFactory.get().createIcon(linkedFile.getTypeIcon()); Text text = new Text(linkedFile.getLink()); ProgressBar progressIndicator = new ProgressBar(); progressIndicator.progressProperty().bind(linkedFile.downloadProgressProperty()); progressIndicator.visibleProperty().bind(linkedFile.downloadOngoingProperty()); Button acceptAutoLinkedFile = MaterialDesignIconFactory.get().createIconButton(MaterialDesignIcon.BRIEFCASE_CHECK); acceptAutoLinkedFile.setTooltip(new Tooltip(Localization.lang("This file was found automatically. Do you want to link it to this entry?"))); acceptAutoLinkedFile.visibleProperty().bind(linkedFile.isAutomaticallyFoundProperty()); acceptAutoLinkedFile.setOnAction(event -> linkedFile.acceptAsLinked()); acceptAutoLinkedFile.getStyleClass().setAll("flatButton"); HBox container = new HBox(10); container.setPrefHeight(Double.NEGATIVE_INFINITY); container.getChildren().addAll(icon, text, progressIndicator, acceptAutoLinkedFile); return container; } public LinkedFilesEditorViewModel getViewModel() { return viewModel; } @Override public void bindToEntry(BibEntry entry) { viewModel.bindToEntry(fieldName, entry); } @Override public Parent getNode() { return this; } @FXML private void addNewFile(ActionEvent event) { viewModel.addNewFile(); } @FXML private void fetchFulltext(ActionEvent event) { viewModel.fetchFulltext(); } @FXML private void addFromURL(ActionEvent event) { viewModel.addFromURL(); } }