From fb80915f390a5c2d9e6b8b7477dee55eca8e8f15 Mon Sep 17 00:00:00 2001 From: Carl Christian Snethlage <50491877+calixtus@users.noreply.github.com> Date: Fri, 2 Sep 2022 16:07:29 +0200 Subject: [PATCH] Visual improvements to LinkedFilesEditor (#9114) * Visual improvements to LinkedFilesEditor * CHANGELOG.md * Moved and changed icons for better readability * Updated CHANGELOG.md --- CHANGELOG.md | 1 + .../gui/fieldeditors/LinkedFileViewModel.java | 13 ++++ .../gui/fieldeditors/LinkedFilesEditor.fxml | 64 +++++++++---------- .../gui/fieldeditors/LinkedFilesEditor.java | 23 +++++-- .../java/org/jabref/gui/icon/IconTheme.java | 3 + .../gui/linkedfile/LinkedFileEditDialog.fxml | 50 +++++++++------ .../linkedfile/LinkedFileEditDialogView.java | 9 +++ src/main/resources/l10n/JabRef_en.properties | 2 + 8 files changed, 106 insertions(+), 59 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6df0aae6bef..b35e36b8296 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -34,6 +34,7 @@ Note that this project **does not** adhere to [Semantic Versioning](http://semve - The [HtmlToLaTeXFormatter](https://docs.jabref.org/finding-sorting-and-cleaning-entries/saveactions#html-to-latex) keeps single `<` characters. - We fixed a performance regression when opening large libraries [#9041](https://github.com/JabRef/jabref/issues/9041) - We fixed a bug where spaces are trimmed when highlighting differences in the Entries merge dialog. [koppor#371](https://github.com/koppor/jabref/issues/371) +- We fixed some visual glitches with the linked files editor field in the entry editor and increased its height. [#8823](https://github.com/JabRef/jabref/issues/8823) - We fixed several bugs regarding the manual and the autosave of library files that sometimes lead to exceptions or data loss. [#9067](https://github.com/JabRef/jabref/pull/9067), [#8448](https://github.com/JabRef/jabref/issues/8484), [#8746](https://github.com/JabRef/jabref/issues/8746), [#6684](https://github.com/JabRef/jabref/issues/6684), [#6644](https://github.com/JabRef/jabref/issues/6644), [#6102](https://github.com/JabRef/jabref/issues/6102), [#6002](https://github.com/JabRef/jabref/issues/6000) - We fixed an issue where applied save actions on saving the library file would lead to the dialog "The libary has been modified by another program" popping up [#4877](https://github.com/JabRef/jabref/issues/4877) - We fixed an issue where title case didn't capitalize words after en-dash characters [#9068] diff --git a/src/main/java/org/jabref/gui/fieldeditors/LinkedFileViewModel.java b/src/main/java/org/jabref/gui/fieldeditors/LinkedFileViewModel.java index 20dd904978b..14fcf013668 100644 --- a/src/main/java/org/jabref/gui/fieldeditors/LinkedFileViewModel.java +++ b/src/main/java/org/jabref/gui/fieldeditors/LinkedFileViewModel.java @@ -16,11 +16,14 @@ import javax.net.ssl.SSLSocketFactory; import javafx.beans.Observable; +import javafx.beans.binding.Bindings; +import javafx.beans.binding.ObjectBinding; import javafx.beans.property.BooleanProperty; import javafx.beans.property.DoubleProperty; import javafx.beans.property.SimpleBooleanProperty; import javafx.beans.property.SimpleDoubleProperty; import javafx.beans.property.StringProperty; +import javafx.scene.Node; import javafx.scene.control.Alert.AlertType; import javafx.scene.control.ButtonBar.ButtonData; import javafx.scene.control.ButtonType; @@ -83,6 +86,8 @@ public class LinkedFileViewModel extends AbstractViewModel { private final PreferencesService preferences; private final LinkedFileHandler linkedFileHandler; + private ObjectBinding linkedFileIconBinding; + private final Validator fileExistsValidator; public LinkedFileViewModel(LinkedFile linkedFile, @@ -178,6 +183,14 @@ public JabRefIcon getTypeIcon() { .orElse(IconTheme.JabRefIcons.FILE); } + public ObjectBinding typeIconProperty() { + if (linkedFileIconBinding == null) { + linkedFileIconBinding = Bindings.createObjectBinding(() -> this.getTypeIcon().getGraphicNode(), linkedFile.fileTypeProperty()); + } + + return linkedFileIconBinding; + } + public void markAsAutomaticallyFound() { isAutomaticallyFound.setValue(true); } diff --git a/src/main/java/org/jabref/gui/fieldeditors/LinkedFilesEditor.fxml b/src/main/java/org/jabref/gui/fieldeditors/LinkedFilesEditor.fxml index 7d34c27164e..5f61cfd109c 100644 --- a/src/main/java/org/jabref/gui/fieldeditors/LinkedFilesEditor.fxml +++ b/src/main/java/org/jabref/gui/fieldeditors/LinkedFilesEditor.fxml @@ -6,40 +6,40 @@ + - - - + + + + + diff --git a/src/main/java/org/jabref/gui/fieldeditors/LinkedFilesEditor.java b/src/main/java/org/jabref/gui/fieldeditors/LinkedFilesEditor.java index 8a1a0c81fc9..e93c3952858 100644 --- a/src/main/java/org/jabref/gui/fieldeditors/LinkedFilesEditor.java +++ b/src/main/java/org/jabref/gui/fieldeditors/LinkedFilesEditor.java @@ -12,7 +12,9 @@ import javafx.scene.Parent; import javafx.scene.control.Button; import javafx.scene.control.ContextMenu; +import javafx.scene.control.Label; import javafx.scene.control.ListView; +import javafx.scene.control.OverrunStyle; import javafx.scene.control.ProgressBar; import javafx.scene.control.SelectionMode; import javafx.scene.control.SeparatorMenuItem; @@ -84,7 +86,7 @@ public LinkedFilesEditor(Field field, .load(); ViewModelListCellFactory cellFactory = new ViewModelListCellFactory() - .withStringTooltip(LinkedFileViewModel::getDescription) + .withStringTooltip(LinkedFileViewModel::getDescriptionAndLink) .withGraphic(this::createFileDisplay) .withContextMenu(this::createContextMenuForFile) .withOnMouseClickedEvent(this::handleItemMouseClick) @@ -165,10 +167,17 @@ private Node createFileDisplay(LinkedFileViewModel linkedFile) { progressIndicator.progressProperty().bind(linkedFile.downloadProgressProperty()); progressIndicator.visibleProperty().bind(linkedFile.downloadOngoingProperty()); + Label label = new Label(); + label.graphicProperty().bind(linkedFile.typeIconProperty()); + label.textProperty().bind(linkedFile.linkProperty()); + label.getStyleClass().setAll("file-row-text"); + label.textOverrunProperty().setValue(OverrunStyle.LEADING_ELLIPSIS); + EasyBind.subscribe(linkedFile.isAutomaticallyFoundProperty(), found -> label.pseudoClassStateChanged(opacity, found)); + HBox info = new HBox(8); HBox.setHgrow(info, Priority.ALWAYS); info.setStyle("-fx-padding: 0.5em 0 0.5em 0;"); // To align with buttons below which also have 0.5em padding - info.getChildren().setAll(icon, link, desc, progressIndicator); + info.getChildren().setAll(label, progressIndicator); Button acceptAutoLinkedFile = IconTheme.JabRefIcons.AUTO_LINKED_FILE.asButton(); acceptAutoLinkedFile.setTooltip(new Tooltip(Localization.lang("This file was found automatically. Do you want to link it to this entry?"))); @@ -177,7 +186,7 @@ private Node createFileDisplay(LinkedFileViewModel linkedFile) { acceptAutoLinkedFile.setOnAction(event -> linkedFile.acceptAsLinked()); acceptAutoLinkedFile.getStyleClass().setAll("icon-button"); - Button writeMetadataToPdf = IconTheme.JabRefIcons.IMPORT.asButton(); + Button writeMetadataToPdf = IconTheme.JabRefIcons.PDF_METADATA_WRITE.asButton(); writeMetadataToPdf.setTooltip(new Tooltip(Localization.lang("Write BibTeXEntry metadata to PDF."))); writeMetadataToPdf.visibleProperty().bind(linkedFile.isOfflinePdfProperty()); writeMetadataToPdf.getStyleClass().setAll("icon-button"); @@ -186,7 +195,7 @@ private Node createFileDisplay(LinkedFileViewModel linkedFile) { writeMetadataToPdf.disableProperty().bind(writeMetadataToPdfCommand.executableProperty().not()); writeMetadataToPdf.setOnAction(event -> writeMetadataToPdfCommand.execute()); - Button parsePdfMetadata = IconTheme.JabRefIcons.FILE_SEARCH.asButton(); + Button parsePdfMetadata = IconTheme.JabRefIcons.PDF_METADATA_READ.asButton(); parsePdfMetadata.setTooltip(new Tooltip(Localization.lang("Parse Metadata from PDF."))); parsePdfMetadata.visibleProperty().bind(linkedFile.isOfflinePdfProperty()); parsePdfMetadata.setOnAction(event -> { @@ -195,9 +204,9 @@ private Node createFileDisplay(LinkedFileViewModel linkedFile) { }); parsePdfMetadata.getStyleClass().setAll("icon-button"); - HBox container = new HBox(10); + HBox container = new HBox(2); container.setPrefHeight(Double.NEGATIVE_INFINITY); - + container.maxWidthProperty().bind(listView.widthProperty().subtract(20d)); container.getChildren().addAll(acceptAutoLinkedFile, info, writeMetadataToPdf, parsePdfMetadata); return container; @@ -261,7 +270,7 @@ private void handleItemMouseClick(LinkedFileViewModel linkedFile, MouseEvent eve @Override public double getWeight() { - return 2; + return 3; } private ContextMenu createContextMenuForFile(LinkedFileViewModel linkedFile) { diff --git a/src/main/java/org/jabref/gui/icon/IconTheme.java b/src/main/java/org/jabref/gui/icon/IconTheme.java index 80eb1824a9b..a573bf6c74c 100644 --- a/src/main/java/org/jabref/gui/icon/IconTheme.java +++ b/src/main/java/org/jabref/gui/icon/IconTheme.java @@ -192,6 +192,8 @@ public enum JabRefIcons implements JabRefIcon { DELETE_ENTRY(MaterialDesignD.DELETE), SEARCH(MaterialDesignM.MAGNIFY), FILE_SEARCH(MaterialDesignF.FILE_FIND), + PDF_METADATA_READ(MaterialDesignF.FORMAT_ALIGN_TOP), + PDF_METADATA_WRITE(MaterialDesignF.FORMAT_ALIGN_BOTTOM), ADVANCED_SEARCH(Color.CYAN, MaterialDesignM.MAGNIFY), PREFERENCES(MaterialDesignC.COG), SELECTORS(MaterialDesignS.STAR_SETTINGS), @@ -309,6 +311,7 @@ public enum JabRefIcons implements JabRefIcon { NEW_GROUP(MaterialDesignP.PLUS), OPEN_LINK(MaterialDesignO.OPEN_IN_NEW), LOOKUP_IDENTIFIER(MaterialDesignS.SEARCH_WEB), + LINKED_FILE_ADD(MaterialDesignP.PLUS), FETCH_FULLTEXT(MaterialDesignS.SEARCH_WEB), FETCH_BY_IDENTIFIER(MaterialDesignC.CLIPBOARD_ARROW_DOWN), TOGGLE_ABBREVIATION(MaterialDesignF.FORMAT_ALIGN_CENTER), diff --git a/src/main/java/org/jabref/gui/linkedfile/LinkedFileEditDialog.fxml b/src/main/java/org/jabref/gui/linkedfile/LinkedFileEditDialog.fxml index 592a99d1567..364f3da9214 100644 --- a/src/main/java/org/jabref/gui/linkedfile/LinkedFileEditDialog.fxml +++ b/src/main/java/org/jabref/gui/linkedfile/LinkedFileEditDialog.fxml @@ -1,42 +1,52 @@ - + - + + - + - - + + - - - + + + - diff --git a/src/main/java/org/jabref/gui/linkedfile/LinkedFileEditDialogView.java b/src/main/java/org/jabref/gui/linkedfile/LinkedFileEditDialogView.java index 6ed39ce1ae9..3d6149a203b 100644 --- a/src/main/java/org/jabref/gui/linkedfile/LinkedFileEditDialogView.java +++ b/src/main/java/org/jabref/gui/linkedfile/LinkedFileEditDialogView.java @@ -12,6 +12,8 @@ import org.jabref.gui.StateManager; import org.jabref.gui.externalfiletype.ExternalFileType; import org.jabref.gui.util.BaseDialog; +import org.jabref.gui.util.ViewModelListCellFactory; +import org.jabref.logic.l10n.Localization; import org.jabref.model.entry.LinkedFile; import org.jabref.preferences.PreferencesService; @@ -40,6 +42,8 @@ public LinkedFileEditDialogView(LinkedFile linkedFile) { .setAsContent(this.getDialogPane()); this.getDialogPane().getButtonTypes().addAll(ButtonType.APPLY, ButtonType.CANCEL); + this.setResizable(false); + this.setTitle(Localization.lang("Edit file link")); this.setResultConverter(button -> { if (button == ButtonType.APPLY) { @@ -54,6 +58,11 @@ public LinkedFileEditDialogView(LinkedFile linkedFile) { private void initialize() { viewModel = new LinkedFilesEditDialogViewModel(linkedFile, stateManager.getActiveDatabase().get(), dialogService, preferences.getFilePreferences()); fileType.itemsProperty().bindBidirectional(viewModel.externalFileTypeProperty()); + new ViewModelListCellFactory() + .withIcon(ExternalFileType::getIcon) + .withText(ExternalFileType::getName) + .install(fileType); + description.textProperty().bindBidirectional(viewModel.descriptionProperty()); link.textProperty().bindBidirectional(viewModel.linkProperty()); fileType.valueProperty().bindBidirectional(viewModel.selectedExternalFileTypeProperty()); diff --git a/src/main/resources/l10n/JabRef_en.properties b/src/main/resources/l10n/JabRef_en.properties index 6b1a6822bde..141212c61fc 100644 --- a/src/main/resources/l10n/JabRef_en.properties +++ b/src/main/resources/l10n/JabRef_en.properties @@ -2514,6 +2514,8 @@ Plain\ Text=Plain Text Show\ Diff=Show Diff Merged\ Entry=Merged Entry +Edit\ file\ link=Edit file link + (Note\:\ If\ original\ entries\ lack\ keywords\ to\ qualify\ for\ the\ new\ group\ configuration,\ confirming\ here\ will\ add\ them)=(Note: If original entries lack keywords to qualify for the new group configuration, confirming here will add them) Assign=Assign Do\ not\ assign=Do not assign