diff --git a/CHANGELOG.md b/CHANGELOG.md index b71f0091dcd..c2285cad78e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -33,6 +33,11 @@ We refer to [GitHub issues](https://github.com/JabRef/jabref/issues) by using `# - We fixed an exception which occured when trying to open a non existing file from the "Recent files"-menu [#5334](https://github.com/JabRef/jabref/issues/5334) - The context menu for fields in the entry editor is back. [#5254](https://github.com/JabRef/jabref/issues/5254) - We fixed an exception which occurred when trying to open a non existing file from the "Recent files"-menu [#5334](https://github.com/JabRef/jabref/issues/5334) +- We re-introduced the feature to switch between different preview styles. [#5221](https://github.com/JabRef/jabref/issues/5221) + + + + ### Removed diff --git a/src/main/java/org/jabref/gui/BasePanel.java b/src/main/java/org/jabref/gui/BasePanel.java index b35a6bdce4d..30cc6f4aecb 100644 --- a/src/main/java/org/jabref/gui/BasePanel.java +++ b/src/main/java/org/jabref/gui/BasePanel.java @@ -95,7 +95,6 @@ import org.jabref.model.entry.field.SpecialFieldValue; import org.jabref.model.entry.field.StandardField; import org.jabref.preferences.JabRefPreferences; -import org.jabref.preferences.PreviewPreferences; import com.google.common.eventbus.Subscribe; import org.fxmisc.easybind.EasyBind; @@ -352,6 +351,13 @@ private void setupActions() { new SpecialFieldViewModel(SpecialField.READ_STATUS, undoManager).getSpecialFieldAction(status, this.frame)); } + actions.put(Actions.NEXT_PREVIEW_STYLE, () -> { + entryEditor.nextPreviewStyle(); + }); + actions.put(Actions.PREVIOUS_PREVIEW_STYLE, () -> { + entryEditor.previousPreviewStyle(); + }); + actions.put(Actions.SEND_AS_EMAIL, new SendAsEMailAction(frame)); actions.put(Actions.WRITE_XMP, new WriteXMPAction(this)::execute); @@ -844,23 +850,6 @@ private void showAndEdit() { } } - public void nextPreviewStyle() { - cyclePreview(Globals.prefs.getPreviewPreferences().getPreviewCyclePosition() + 1); - } - - public void previousPreviewStyle() { - cyclePreview(Globals.prefs.getPreviewPreferences().getPreviewCyclePosition() - 1); - } - - private void cyclePreview(int newPosition) { - PreviewPreferences previewPreferences = Globals.prefs.getPreviewPreferences() - .getBuilder() - .withPreviewCyclePosition(newPosition) - .build(); - Globals.prefs.storePreviewPreferences(previewPreferences); - entryEditor.updatePreviewInTabs(previewPreferences); - } - /** * Removes the bottom component. */ diff --git a/src/main/java/org/jabref/gui/entryeditor/EntryEditor.java b/src/main/java/org/jabref/gui/entryeditor/EntryEditor.java index dadcad8be9c..9bd2a2a9c4c 100644 --- a/src/main/java/org/jabref/gui/entryeditor/EntryEditor.java +++ b/src/main/java/org/jabref/gui/entryeditor/EntryEditor.java @@ -50,7 +50,6 @@ import org.jabref.model.entry.field.Field; import org.jabref.model.util.FileUpdateMonitor; import org.jabref.preferences.PreferencesService; -import org.jabref.preferences.PreviewPreferences; import com.airhacks.afterburner.views.ViewLoader; import org.fxmisc.easybind.EasyBind; @@ -404,11 +403,11 @@ public void setFocusToField(Field field) { }); } - public void updatePreviewInTabs(PreviewPreferences previewPreferences) { - for (Tab tab : this.entryEditorTabs) { - if (tab instanceof FieldsEditorTab) { - ((FieldsEditorTab) tab).previewPanel.updateLayout(previewPreferences); - } - } + public void nextPreviewStyle() { + this.entryEditorTabs.forEach(EntryEditorTab::nextPreviewStyle); + } + + public void previousPreviewStyle() { + this.entryEditorTabs.forEach(EntryEditorTab::previousPreviewStyle); } } diff --git a/src/main/java/org/jabref/gui/entryeditor/EntryEditorTab.java b/src/main/java/org/jabref/gui/entryeditor/EntryEditorTab.java index a0b91a914f7..6c5da5ec0f6 100644 --- a/src/main/java/org/jabref/gui/entryeditor/EntryEditorTab.java +++ b/src/main/java/org/jabref/gui/entryeditor/EntryEditorTab.java @@ -44,4 +44,18 @@ public void notifyAboutFocus(BibEntry entry) { handleFocus(); } + /** + * Switch to next Preview style - should be overriden if a EntryEditorTab is actually showing a preview + */ + protected void nextPreviewStyle() { + // do nothing by default + } + + /** + * Switch to previous Preview style - should be overriden if a EntryEditorTab is actually showing a preview + */ + protected void previousPreviewStyle() { + // do nothing by default + } + } diff --git a/src/main/java/org/jabref/gui/entryeditor/FieldsEditorTab.java b/src/main/java/org/jabref/gui/entryeditor/FieldsEditorTab.java index ce226b512f8..eba5b206523 100644 --- a/src/main/java/org/jabref/gui/entryeditor/FieldsEditorTab.java +++ b/src/main/java/org/jabref/gui/entryeditor/FieldsEditorTab.java @@ -40,12 +40,12 @@ * A single tab displayed in the EntryEditor holding several FieldEditors. */ abstract class FieldsEditorTab extends EntryEditorTab { - public PreviewPanel previewPanel; protected final BibDatabaseContext databaseContext; private final Map editors = new LinkedHashMap<>(); private final boolean isCompressed; private final SuggestionProviders suggestionProviders; private final DialogService dialogService; + private PreviewPanel previewPanel; private FieldEditorFX activeField; private UndoManager undoManager; private Collection fields = new ArrayList<>(); @@ -197,6 +197,16 @@ protected void bindToEntry(BibEntry entry) { }); } + @Override + protected void nextPreviewStyle() { + previewPanel.nextPreviewStyle(); + } + + @Override + protected void previousPreviewStyle() { + previewPanel.previousPreviewStyle(); + } + protected abstract SortedSet determineFieldsToShow(BibEntry entry); public Collection getShownFields() { @@ -208,7 +218,7 @@ private void initPanel() { gridPane = new GridPane(); gridPane.getStyleClass().add("editorPane"); - previewPanel = new PreviewPanel(databaseContext, null, dialogService, ExternalFileTypes.getInstance(), Globals.getKeyPrefs(), Globals.prefs.getPreviewPreferences()); + previewPanel = new PreviewPanel(databaseContext, dialogService, ExternalFileTypes.getInstance(), Globals.getKeyPrefs(), Globals.prefs); // Warp everything in a scroll-pane ScrollPane scrollPane = new ScrollPane(); diff --git a/src/main/java/org/jabref/gui/preview/PreviewPanel.java b/src/main/java/org/jabref/gui/preview/PreviewPanel.java index c4fbde25a1e..3f25375cf5b 100644 --- a/src/main/java/org/jabref/gui/preview/PreviewPanel.java +++ b/src/main/java/org/jabref/gui/preview/PreviewPanel.java @@ -17,7 +17,6 @@ import javafx.scene.layout.VBox; import org.jabref.Globals; -import org.jabref.gui.BasePanel; import org.jabref.gui.DialogService; import org.jabref.gui.externalfiles.ExternalFilesEntryLinker; import org.jabref.gui.externalfiletype.ExternalFileTypes; @@ -28,6 +27,7 @@ import org.jabref.logic.l10n.Localization; import org.jabref.model.database.BibDatabaseContext; import org.jabref.model.entry.BibEntry; +import org.jabref.preferences.JabRefPreferences; import org.jabref.preferences.PreviewPreferences; import org.slf4j.Logger; @@ -40,18 +40,19 @@ public class PreviewPanel extends VBox { private final ExternalFilesEntryLinker fileLinker; private final KeyBindingRepository keyBindingRepository; private final PreviewViewer previewView; + private final JabRefPreferences preferences; private BibEntry entry; - private BasePanel basePanel; private DialogService dialogService; - public PreviewPanel(BibDatabaseContext database, BasePanel basePanel, DialogService dialogService, ExternalFileTypes externalFileTypes, KeyBindingRepository keyBindingRepository, PreviewPreferences preferences) { - this.basePanel = basePanel; + public PreviewPanel(BibDatabaseContext database, DialogService dialogService, ExternalFileTypes externalFileTypes, KeyBindingRepository keyBindingRepository, JabRefPreferences preferences) { this.keyBindingRepository = keyBindingRepository; this.dialogService = dialogService; - fileLinker = new ExternalFilesEntryLinker(externalFileTypes, Globals.prefs.getFilePreferences(), database); + this.preferences = preferences; + fileLinker = new ExternalFilesEntryLinker(externalFileTypes, preferences.getFilePreferences(), database); + PreviewPreferences previewPreferences = preferences.getPreviewPreferences(); previewView = new PreviewViewer(database, dialogService, Globals.stateManager); - previewView.setLayout(preferences.getCurrentPreviewStyle()); + previewView.setLayout(previewPreferences.getCurrentPreviewStyle()); previewView.setContextMenu(createPopupMenu()); previewView.setOnDragDetected(event -> { previewView.startFullDrag(); @@ -97,11 +98,7 @@ public PreviewPanel(BibDatabaseContext database, BasePanel basePanel, DialogServ this.getChildren().add(previewView); createKeyBindings(); - updateLayout(preferences, true); - } - - public void close() { - basePanel.closeBottomPane(); + updateLayout(previewPreferences, true); } public void updateLayout(PreviewPreferences previewPreferences) { @@ -111,6 +108,7 @@ public void updateLayout(PreviewPreferences previewPreferences) { private void updateLayout(PreviewPreferences previewPreferences, boolean init) { PreviewLayout currentPreviewStyle = previewPreferences.getCurrentPreviewStyle(); previewView.setLayout(currentPreviewStyle); + preferences.storePreviewPreferences(previewPreferences); if (!init) { dialogService.notify(Localization.lang("Preview style changed to: %0", currentPreviewStyle.getName())); } @@ -125,10 +123,6 @@ private void createKeyBindings() { previewView.copyPreviewToClipBoard(); event.consume(); break; - case CLOSE: - close(); - event.consume(); - break; default: } } @@ -141,21 +135,19 @@ private ContextMenu createPopupMenu() { copyPreview.setOnAction(event -> previewView.copyPreviewToClipBoard()); MenuItem printEntryPreview = new MenuItem(Localization.lang("Print entry preview"), IconTheme.JabRefIcons.PRINTED.getGraphicNode()); printEntryPreview.setOnAction(event -> previewView.print()); - /* Deleted since it does not work anymore. Needs refactoring. MenuItem previousPreviewLayout = new MenuItem(Localization.lang("Previous preview layout")); previousPreviewLayout.setAccelerator(keyBindingRepository.getKeyCombination(KeyBinding.PREVIOUS_PREVIEW_LAYOUT)); - previousPreviewLayout.setOnAction(event -> basePanel.previousPreviewStyle()); + previousPreviewLayout.setOnAction(event -> this.previousPreviewStyle()); MenuItem nextPreviewLayout = new MenuItem(Localization.lang("Next preview layout")); nextPreviewLayout.setAccelerator(keyBindingRepository.getKeyCombination(KeyBinding.NEXT_PREVIEW_LAYOUT)); - nextPreviewLayout.setOnAction(event -> basePanel.nextPreviewStyle()); - */ + nextPreviewLayout.setOnAction(event -> this.nextPreviewStyle()); ContextMenu menu = new ContextMenu(); menu.getItems().add(copyPreview); menu.getItems().add(printEntryPreview); menu.getItems().add(new SeparatorMenuItem()); - // menu.getItems().add(nextPreviewLayout); - // menu.getItems().add(previousPreviewLayout); + menu.getItems().add(nextPreviewLayout); + menu.getItems().add(previousPreviewLayout); return menu; } @@ -167,4 +159,20 @@ public void setEntry(BibEntry entry) { public void print() { previewView.print(); } + + public void nextPreviewStyle() { + cyclePreview(preferences.getPreviewPreferences().getPreviewCyclePosition() + 1); + } + + public void previousPreviewStyle() { + cyclePreview(preferences.getPreviewPreferences().getPreviewCyclePosition() - 1); + } + + private void cyclePreview(int newPosition) { + PreviewPreferences previewPreferences = preferences.getPreviewPreferences() + .getBuilder() + .withPreviewCyclePosition(newPosition) + .build(); + updateLayout(previewPreferences); + } } diff --git a/src/main/java/org/jabref/preferences/JabRefPreferences.java b/src/main/java/org/jabref/preferences/JabRefPreferences.java index 60c7f191283..3fa059ee529 100644 --- a/src/main/java/org/jabref/preferences/JabRefPreferences.java +++ b/src/main/java/org/jabref/preferences/JabRefPreferences.java @@ -1603,7 +1603,6 @@ public JabRefPreferences storePreviewPreferences(PreviewPreferences previewPrefe @Override public PreviewPreferences getPreviewPreferences() { - int cyclePos = getInt(CYCLE_PREVIEW_POS); List cycle = getStringList(CYCLE_PREVIEW); double panelHeight = getDouble(PREVIEW_PANEL_HEIGHT); String style = get(PREVIEW_STYLE); @@ -1628,6 +1627,14 @@ public PreviewPreferences getPreviewPreferences() { .filter(Objects::nonNull) .collect(Collectors.toList()); + int cyclePos; + int storedCyclePos = getInt(CYCLE_PREVIEW_POS); + if (storedCyclePos < layouts.size()) { + cyclePos = storedCyclePos; + } else { + cyclePos = 0; // fallback if stored position is no longer valid + } + return new PreviewPreferences(layouts, cyclePos, panelHeight, enabled, style, styleDefault); } diff --git a/src/main/java/org/jabref/preferences/PreviewPreferences.java b/src/main/java/org/jabref/preferences/PreviewPreferences.java index f723652b0ee..38473567104 100644 --- a/src/main/java/org/jabref/preferences/PreviewPreferences.java +++ b/src/main/java/org/jabref/preferences/PreviewPreferences.java @@ -68,7 +68,7 @@ public PreviewLayout getTextBasedPreviewLayout() { public static class Builder { private List previewCycle; - private int previeCyclePosition; + private int previewCyclePosition; private Number previewPanelDividerPosition; private boolean previewPanelEnabled; private String previewStyle; @@ -76,7 +76,7 @@ public static class Builder { public Builder(PreviewPreferences previewPreferences) { this.previewCycle = previewPreferences.getPreviewCycle(); - this.previeCyclePosition = previewPreferences.getPreviewCyclePosition(); + this.previewCyclePosition = previewPreferences.getPreviewCyclePosition(); this.previewPanelDividerPosition = previewPreferences.getPreviewPanelDividerPosition(); this.previewPanelEnabled = previewPreferences.isPreviewPanelEnabled(); this.previewStyle = previewPreferences.getPreviewStyle(); @@ -85,18 +85,18 @@ public Builder(PreviewPreferences previewPreferences) { public Builder withPreviewCycle(List previewCycle) { this.previewCycle = previewCycle; - return withPreviewCyclePosition(previeCyclePosition); + return withPreviewCyclePosition(previewCyclePosition); } public Builder withPreviewCyclePosition(int position) { if (previewCycle.isEmpty()) { - previeCyclePosition = 0; + previewCyclePosition = 0; } else { - previeCyclePosition = position; - while (previeCyclePosition < 0) { - previeCyclePosition += previewCycle.size(); + previewCyclePosition = position; + while (previewCyclePosition < 0) { + previewCyclePosition += previewCycle.size(); } - previeCyclePosition %= previewCycle.size(); + previewCyclePosition %= previewCycle.size(); } return this; } @@ -117,7 +117,7 @@ public Builder withPreviewStyle(String previewStyle) { } public PreviewPreferences build() { - return new PreviewPreferences(previewCycle, previeCyclePosition, previewPanelDividerPosition, previewPanelEnabled, previewStyle, previewStyleDefault); + return new PreviewPreferences(previewCycle, previewCyclePosition, previewPanelDividerPosition, previewPanelEnabled, previewStyle, previewStyleDefault); } }