diff --git a/src/main/java/org/jabref/gui/BasePanel.java b/src/main/java/org/jabref/gui/BasePanel.java index f45506934ff..e12ba0a5622 100644 --- a/src/main/java/org/jabref/gui/BasePanel.java +++ b/src/main/java/org/jabref/gui/BasePanel.java @@ -10,7 +10,6 @@ import java.util.Map; import java.util.Objects; import java.util.Optional; -import java.util.Set; import java.util.stream.Collectors; import javax.swing.undo.CannotRedoException; @@ -35,13 +34,11 @@ import org.jabref.gui.cleanup.CleanupAction; import org.jabref.gui.collab.DatabaseChangeMonitor; import org.jabref.gui.collab.DatabaseChangePane; -import org.jabref.gui.desktop.JabRefDesktop; import org.jabref.gui.edit.CopyBibTeXKeyAndLinkAction; import org.jabref.gui.edit.ReplaceStringAction; import org.jabref.gui.entryeditor.EntryEditor; import org.jabref.gui.exporter.SaveDatabaseAction; import org.jabref.gui.externalfiles.DownloadFullTextAction; -import org.jabref.gui.externalfiletype.ExternalFileType; import org.jabref.gui.externalfiletype.ExternalFileTypes; import org.jabref.gui.importer.actions.AppendDatabaseAction; import org.jabref.gui.journals.AbbreviateAction; @@ -49,8 +46,6 @@ import org.jabref.gui.journals.UnabbreviateAction; import org.jabref.gui.maintable.MainTable; import org.jabref.gui.maintable.MainTableDataModel; -import org.jabref.gui.mergeentries.MergeEntriesAction; -import org.jabref.gui.mergeentries.MergeWithFetchedEntryAction; import org.jabref.gui.preview.CitationStyleToClipboardWorker; import org.jabref.gui.specialfields.SpecialFieldDatabaseChangeListener; import org.jabref.gui.specialfields.SpecialFieldValueViewModel; @@ -70,9 +65,6 @@ import org.jabref.logic.pdf.FileAnnotationCache; import org.jabref.logic.search.SearchQuery; import org.jabref.logic.util.UpdateField; -import org.jabref.logic.util.io.FileFinder; -import org.jabref.logic.util.io.FileFinders; -import org.jabref.logic.util.io.FileUtil; import org.jabref.model.FieldChange; import org.jabref.model.database.BibDatabase; import org.jabref.model.database.BibDatabaseContext; @@ -84,15 +76,12 @@ import org.jabref.model.database.shared.DatabaseLocation; import org.jabref.model.database.shared.DatabaseSynchronizer; import org.jabref.model.entry.BibEntry; -import org.jabref.model.entry.FileFieldParser; -import org.jabref.model.entry.LinkedFile; import org.jabref.model.entry.event.EntriesEventSource; import org.jabref.model.entry.event.EntryChangedEvent; import org.jabref.model.entry.field.Field; import org.jabref.model.entry.field.FieldFactory; import org.jabref.model.entry.field.SpecialField; import org.jabref.model.entry.field.SpecialFieldValue; -import org.jabref.model.entry.field.StandardField; import org.jabref.preferences.JabRefPreferences; import com.google.common.eventbus.Subscribe; @@ -281,7 +270,7 @@ private void setupActions() { // The action for cleaning up entry. actions.put(Actions.CLEANUP, cleanUpAction); - actions.put(Actions.MERGE_ENTRIES, () -> new MergeEntriesAction(frame, Globals.stateManager).execute()); + // actions.put(Actions.MERGE_ENTRIES, () -> new MergeEntriesAction(frame, Globals.stateManager).execute()); // The action for copying the selected entry's key. actions.put(Actions.COPY_KEY, this::copyKey); @@ -311,9 +300,9 @@ private void setupActions() { dbmsSynchronizer.pullChanges(); }); - actions.put(Actions.OPEN_URL, new OpenURLAction()); + // actions.put(Actions.OPEN_URL, new OpenURLAction()); - actions.put(Actions.MERGE_WITH_FETCHED_ENTRY, new MergeWithFetchedEntryAction(this, frame.getDialogService())); + // actions.put(Actions.MERGE_WITH_FETCHED_ENTRY, new MergeWithFetchedEntryAction(this, frame.getDialogService())); actions.put(Actions.REPLACE_ALL, () -> (new ReplaceStringAction(this)).execute()); @@ -1112,60 +1101,6 @@ public void action() { } } - private class OpenURLAction implements BaseAction { - - @Override - public void action() { - final List bes = mainTable.getSelectedEntries(); - if (bes.size() == 1) { - Field field = StandardField.DOI; - Optional link = bes.get(0).getField(StandardField.DOI); - if (bes.get(0).hasField(StandardField.URL)) { - link = bes.get(0).getField(StandardField.URL); - field = StandardField.URL; - } - if (link.isPresent()) { - try { - JabRefDesktop.openExternalViewer(bibDatabaseContext, link.get(), field); - output(Localization.lang("External viewer called") + '.'); - } catch (IOException ex) { - output(Localization.lang("Error") + ": " + ex.getMessage()); - } - } else { - // No URL or DOI found in the "url" and "doi" fields. - // Look for web links in the "file" field as a fallback: - - List files = bes.get(0).getFiles(); - - Optional linkedFile = files.stream() - .filter(file -> (StandardField.URL.getName().equalsIgnoreCase(file.getFileType()) - || StandardField.PS.getName().equalsIgnoreCase(file.getFileType()) - || StandardField.PDF.getName().equalsIgnoreCase(file.getFileType()))) - .findFirst(); - - if (linkedFile.isPresent()) { - - try { - - JabRefDesktop.openExternalFileAnyFormat(bibDatabaseContext, - linkedFile.get().getLink(), - ExternalFileTypes.getInstance().fromLinkedFile(linkedFile.get(), true)); - - output(Localization.lang("External viewer called") + '.'); - } catch (IOException e) { - output(Localization.lang("Could not open link")); - LOGGER.info("Could not open link", e); - } - } else { - output(Localization.lang("No URL defined") + '.'); - } - } - } else { - output(Localization.lang("This operation requires exactly one item to be selected.")); - } - } - } - private class RedoAction implements BaseAction { @Override diff --git a/src/main/java/org/jabref/gui/JabRefFrame.java b/src/main/java/org/jabref/gui/JabRefFrame.java index e93c8c8896a..179855815df 100644 --- a/src/main/java/org/jabref/gui/JabRefFrame.java +++ b/src/main/java/org/jabref/gui/JabRefFrame.java @@ -749,7 +749,7 @@ private MenuBar createMenu() { quality.getItems().addAll( factory.createMenuItem(StandardActions.FIND_DUPLICATES, new DuplicateSearch(this, dialogService, stateManager)), - factory.createMenuItem(StandardActions.MERGE_ENTRIES, new MergeEntriesAction(this, stateManager)), + factory.createMenuItem(StandardActions.MERGE_ENTRIES, new MergeEntriesAction(this.getCurrentBasePanel(), dialogService, stateManager)), factory.createMenuItem(StandardActions.CHECK_INTEGRITY, new IntegrityCheckAction(this, stateManager, Globals.TASK_EXECUTOR)), factory.createMenuItem(StandardActions.CLEANUP_ENTRIES, new OldDatabaseCommandWrapper(Actions.CLEANUP, this, stateManager)), diff --git a/src/main/java/org/jabref/gui/OpenConsoleAction.java b/src/main/java/org/jabref/gui/OpenConsoleAction.java index 34cf38b261c..2dbfbbc992f 100644 --- a/src/main/java/org/jabref/gui/OpenConsoleAction.java +++ b/src/main/java/org/jabref/gui/OpenConsoleAction.java @@ -2,15 +2,15 @@ import java.io.IOException; +import org.jabref.gui.actions.ActionHelper; import org.jabref.gui.actions.SimpleCommand; import org.jabref.gui.desktop.JabRefDesktop; import org.jabref.model.database.BibDatabaseContext; +import org.jabref.model.entry.field.StandardField; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import static org.jabref.gui.actions.ActionHelper.needsDatabase; - public class OpenConsoleAction extends SimpleCommand { private static final Logger LOGGER = LoggerFactory.getLogger(OpenConsoleAction.class); @@ -19,7 +19,7 @@ public class OpenConsoleAction extends SimpleCommand { public OpenConsoleAction(StateManager stateManager) { this.stateManager = stateManager; - this.executable.bind(needsDatabase(stateManager)); + this.executable.bind(ActionHelper.isFieldSetForSelectedEntry(StandardField.FILE, stateManager)); } @Override diff --git a/src/main/java/org/jabref/gui/actions/ActionHelper.java b/src/main/java/org/jabref/gui/actions/ActionHelper.java index dfd66772a3a..199d959c1f9 100644 --- a/src/main/java/org/jabref/gui/actions/ActionHelper.java +++ b/src/main/java/org/jabref/gui/actions/ActionHelper.java @@ -1,9 +1,14 @@ package org.jabref.gui.actions; +import java.util.Collections; +import java.util.List; + import javafx.beans.binding.Bindings; import javafx.beans.binding.BooleanExpression; import org.jabref.gui.StateManager; +import org.jabref.model.entry.BibEntry; +import org.jabref.model.entry.field.Field; public class ActionHelper { public static BooleanExpression needsDatabase(StateManager stateManager) { @@ -13,4 +18,22 @@ public static BooleanExpression needsDatabase(StateManager stateManager) { public static BooleanExpression needsEntriesSelected(StateManager stateManager) { return Bindings.isNotEmpty(stateManager.getSelectedEntries()); } + + public static BooleanExpression needsEntriesSelected(int numberOfEntries, StateManager stateManager) { + return Bindings.createBooleanBinding( + () -> stateManager.getSelectedEntries().size() == numberOfEntries, + stateManager.getSelectedEntries()); + } + + public static BooleanExpression isFieldSetForSelectedEntry(Field field, StateManager stateManager) { + return isAnyFieldSetForSelectedEntry(Collections.singletonList(field), stateManager); + } + + public static BooleanExpression isAnyFieldSetForSelectedEntry(List fields, StateManager stateManager) { + BibEntry entry = stateManager.getSelectedEntries().get(0); + return Bindings.createBooleanBinding( + () -> !Collections.disjoint(fields, entry.getFields()), + entry.getFieldsObservable(), + stateManager.getSelectedEntries()); + } } diff --git a/src/main/java/org/jabref/gui/filelist/AttachFileAction.java b/src/main/java/org/jabref/gui/filelist/AttachFileAction.java index 51fa192c115..ff9a1ae3bf7 100644 --- a/src/main/java/org/jabref/gui/filelist/AttachFileAction.java +++ b/src/main/java/org/jabref/gui/filelist/AttachFileAction.java @@ -1,12 +1,12 @@ package org.jabref.gui.filelist; import java.nio.file.Path; -import java.nio.file.Paths; import java.util.Optional; -import org.jabref.Globals; import org.jabref.gui.BasePanel; import org.jabref.gui.DialogService; +import org.jabref.gui.StateManager; +import org.jabref.gui.actions.ActionHelper; import org.jabref.gui.actions.SimpleCommand; import org.jabref.gui.externalfiletype.ExternalFileTypes; import org.jabref.gui.fieldeditors.LinkedFilesEditorViewModel; @@ -16,51 +16,58 @@ import org.jabref.model.FieldChange; import org.jabref.model.entry.BibEntry; import org.jabref.model.entry.LinkedFile; -import org.jabref.preferences.JabRefPreferences; +import org.jabref.preferences.PreferencesService; public class AttachFileAction extends SimpleCommand { private final BasePanel panel; + private final StateManager stateManager; private final DialogService dialogService; + private final PreferencesService preferencesService; - public AttachFileAction(BasePanel panel, DialogService dialogService) { + public AttachFileAction(BasePanel panel, DialogService dialogService, StateManager stateManager, PreferencesService preferencesService) { this.panel = panel; + this.stateManager = stateManager; this.dialogService = dialogService; + this.preferencesService = preferencesService; + + this.executable.bind(ActionHelper.needsEntriesSelected(1, stateManager)); } @Override public void execute() { - if (panel.getSelectedEntries().size() != 1) { + if (stateManager.getSelectedEntries().size() != 1) { dialogService.notify(Localization.lang("This operation requires exactly one item to be selected.")); return; } - BibEntry entry = panel.getSelectedEntries().get(0); + stateManager.getActiveDatabase().ifPresent(databaseContext -> { + BibEntry entry = stateManager.getSelectedEntries().get(0); - Path workingDirectory = panel.getBibDatabaseContext() - .getFirstExistingFileDir(Globals.prefs.getFilePreferences()) - .orElse(Paths.get(Globals.prefs.get(JabRefPreferences.WORKING_DIRECTORY))); + Path workingDirectory = databaseContext.getFirstExistingFileDir(preferencesService.getFilePreferences()) + .orElse(preferencesService.getWorkingDir()); - FileDialogConfiguration fileDialogConfiguration = new FileDialogConfiguration.Builder() - .withInitialDirectory(workingDirectory) - .build(); + FileDialogConfiguration fileDialogConfiguration = new FileDialogConfiguration.Builder() + .withInitialDirectory(workingDirectory) + .build(); - dialogService.showFileOpenDialog(fileDialogConfiguration).ifPresent(newFile -> { - LinkedFile linkedFile = LinkedFilesEditorViewModel.fromFile(newFile, - panel.getBibDatabaseContext().getFileDirectoriesAsPaths(Globals.prefs.getFilePreferences()), - ExternalFileTypes.getInstance()); + dialogService.showFileOpenDialog(fileDialogConfiguration).ifPresent(newFile -> { + LinkedFile linkedFile = LinkedFilesEditorViewModel.fromFile(newFile, + databaseContext.getFileDirectoriesAsPaths(preferencesService.getFilePreferences()), + ExternalFileTypes.getInstance()); - LinkedFileEditDialogView dialog = new LinkedFileEditDialogView(linkedFile); + LinkedFileEditDialogView dialog = new LinkedFileEditDialogView(linkedFile); - dialog.showAndWait() - .ifPresent(editedLinkedFile -> { - Optional fieldChange = entry.addFile(editedLinkedFile); - fieldChange.ifPresent(change -> { - UndoableFieldChange ce = new UndoableFieldChange(change); - panel.getUndoManager().addEdit(ce); - panel.markBaseChanged(); + dialog.showAndWait() + .ifPresent(editedLinkedFile -> { + Optional fieldChange = entry.addFile(editedLinkedFile); + fieldChange.ifPresent(change -> { + UndoableFieldChange ce = new UndoableFieldChange(change); + panel.getUndoManager().addEdit(ce); + panel.markBaseChanged(); + }); }); - }); + }); }); } } diff --git a/src/main/java/org/jabref/gui/OpenExternalFileAction.java b/src/main/java/org/jabref/gui/maintable/OpenExternalFileAction.java similarity index 82% rename from src/main/java/org/jabref/gui/OpenExternalFileAction.java rename to src/main/java/org/jabref/gui/maintable/OpenExternalFileAction.java index 4fd2b376f76..6579eed3102 100644 --- a/src/main/java/org/jabref/gui/OpenExternalFileAction.java +++ b/src/main/java/org/jabref/gui/maintable/OpenExternalFileAction.java @@ -1,17 +1,19 @@ -package org.jabref.gui; +package org.jabref.gui.maintable; import java.util.List; import org.jabref.Globals; +import org.jabref.gui.DialogService; +import org.jabref.gui.StateManager; +import org.jabref.gui.actions.ActionHelper; import org.jabref.gui.actions.SimpleCommand; import org.jabref.gui.externalfiletype.ExternalFileTypes; import org.jabref.gui.fieldeditors.LinkedFileViewModel; import org.jabref.logic.l10n.Localization; import org.jabref.model.entry.BibEntry; +import org.jabref.model.entry.field.StandardField; import org.jabref.preferences.PreferencesService; -import static org.jabref.gui.actions.ActionHelper.needsDatabase; - public class OpenExternalFileAction extends SimpleCommand { private final DialogService dialogService; @@ -23,7 +25,8 @@ public OpenExternalFileAction(DialogService dialogService, StateManager stateMan this.stateManager = stateManager; this.preferencesService = preferencesService; - this.executable.bind(needsDatabase(stateManager)); + this.executable.bind(ActionHelper.isFieldSetForSelectedEntry(StandardField.FILE, stateManager) + .and(ActionHelper.needsEntriesSelected(1, stateManager))); } @Override diff --git a/src/main/java/org/jabref/gui/OpenFolderAction.java b/src/main/java/org/jabref/gui/maintable/OpenFolderAction.java similarity index 82% rename from src/main/java/org/jabref/gui/OpenFolderAction.java rename to src/main/java/org/jabref/gui/maintable/OpenFolderAction.java index d0512071b41..a2c3c211785 100644 --- a/src/main/java/org/jabref/gui/OpenFolderAction.java +++ b/src/main/java/org/jabref/gui/maintable/OpenFolderAction.java @@ -1,19 +1,17 @@ -package org.jabref.gui; +package org.jabref.gui.maintable; import org.jabref.Globals; +import org.jabref.gui.DialogService; +import org.jabref.gui.StateManager; +import org.jabref.gui.actions.ActionHelper; import org.jabref.gui.actions.SimpleCommand; import org.jabref.gui.externalfiletype.ExternalFileTypes; import org.jabref.gui.fieldeditors.LinkedFileViewModel; +import org.jabref.model.entry.field.StandardField; import org.jabref.preferences.PreferencesService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import static org.jabref.gui.actions.ActionHelper.needsDatabase; - public class OpenFolderAction extends SimpleCommand { - private static final Logger LOGGER = LoggerFactory.getLogger(OpenFolderAction.class); private final DialogService dialogService; private final StateManager stateManager; private final PreferencesService preferencesService; @@ -23,7 +21,7 @@ public OpenFolderAction(DialogService dialogService, StateManager stateManager, this.stateManager = stateManager; this.preferencesService = preferencesService; - this.executable.bind(needsDatabase(stateManager)); + this.executable.bind(ActionHelper.isFieldSetForSelectedEntry(StandardField.FILE, stateManager)); } @Override diff --git a/src/main/java/org/jabref/gui/maintable/OpenUrlAction.java b/src/main/java/org/jabref/gui/maintable/OpenUrlAction.java new file mode 100644 index 00000000000..2e42ec30d41 --- /dev/null +++ b/src/main/java/org/jabref/gui/maintable/OpenUrlAction.java @@ -0,0 +1,73 @@ +package org.jabref.gui.maintable; + +import java.io.IOException; +import java.util.List; +import java.util.Optional; + +import javafx.beans.binding.BooleanBinding; + +import org.jabref.gui.DialogService; +import org.jabref.gui.StateManager; +import org.jabref.gui.actions.ActionHelper; +import org.jabref.gui.actions.SimpleCommand; +import org.jabref.gui.desktop.JabRefDesktop; +import org.jabref.logic.l10n.Localization; +import org.jabref.model.entry.BibEntry; +import org.jabref.model.entry.field.Field; +import org.jabref.model.entry.field.StandardField; + +public class OpenUrlAction extends SimpleCommand { + + private final DialogService dialogService; + private final StateManager stateManager; + + public OpenUrlAction(DialogService dialogService, StateManager stateManager) { + this.dialogService = dialogService; + this.stateManager = stateManager; + + BooleanBinding fieldIsSet = ActionHelper.isFieldSetForSelectedEntry(StandardField.URL, stateManager) + .or(ActionHelper.isFieldSetForSelectedEntry(StandardField.DOI, stateManager) + .or(ActionHelper.isFieldSetForSelectedEntry(StandardField.URI, stateManager) + .or(ActionHelper.isFieldSetForSelectedEntry(StandardField.EPRINT, stateManager)))); + this.executable.bind(ActionHelper.needsEntriesSelected(1, stateManager).and(fieldIsSet)); + } + + @Override + public void execute() { + stateManager.getActiveDatabase().ifPresent(databaseContext -> { + final List entries = stateManager.getSelectedEntries(); + + if (entries.size() != 1) { + dialogService.notify(Localization.lang("This operation requires exactly one item to be selected.")); + return; + } + + BibEntry entry = entries.get(0); + + // ToDo: Create dialog or menu to chose which one to open + // URL - DOI - DOI - EPRINT + Optional link = entry.getField(StandardField.EPRINT); + Field field = StandardField.EPRINT; + if (entry.hasField(StandardField.URI)) { + link = entry.getField(StandardField.URI); + field = StandardField.URI; + } + if (entry.hasField(StandardField.DOI)) { + link = entry.getField(StandardField.DOI); + field = StandardField.DOI; + } + if (entry.hasField(StandardField.URL)) { + link = entry.getField(StandardField.URL); + field = StandardField.URL; + } + + if (link.isPresent()) { + try { + JabRefDesktop.openExternalViewer(databaseContext, link.get(), field); + } catch (IOException e) { + dialogService.showErrorDialogAndWait(Localization.lang("Unable to open link."), e); + } + } + }); + } +} diff --git a/src/main/java/org/jabref/gui/maintable/RightClickMenu.java b/src/main/java/org/jabref/gui/maintable/RightClickMenu.java index 1204706c66e..cabe83d8ab5 100644 --- a/src/main/java/org/jabref/gui/maintable/RightClickMenu.java +++ b/src/main/java/org/jabref/gui/maintable/RightClickMenu.java @@ -1,8 +1,5 @@ package org.jabref.gui.maintable; -import java.util.Collections; -import java.util.List; - import javafx.scene.control.ContextMenu; import javafx.scene.control.Menu; import javafx.scene.control.SeparatorMenuItem; @@ -10,8 +7,6 @@ import org.jabref.Globals; import org.jabref.gui.BasePanel; import org.jabref.gui.DialogService; -import org.jabref.gui.OpenExternalFileAction; -import org.jabref.gui.OpenFolderAction; import org.jabref.gui.StateManager; import org.jabref.gui.actions.ActionFactory; import org.jabref.gui.actions.Actions; @@ -21,14 +16,12 @@ import org.jabref.gui.filelist.AttachFileAction; import org.jabref.gui.keyboard.KeyBindingRepository; import org.jabref.gui.menus.ChangeEntryTypeMenu; -import org.jabref.gui.mergeentries.FetchAndMergeEntry; +import org.jabref.gui.mergeentries.MergeEntriesAction; +import org.jabref.gui.mergeentries.MergeWithFetchedEntryAction; import org.jabref.gui.specialfields.SpecialFieldMenuItemFactory; import org.jabref.logic.citationstyle.CitationStylePreviewLayout; import org.jabref.logic.citationstyle.PreviewLayout; -import org.jabref.model.entry.BibEntry; -import org.jabref.model.entry.field.Field; import org.jabref.model.entry.field.SpecialField; -import org.jabref.model.entry.field.StandardField; import org.jabref.preferences.JabRefPreferences; import org.jabref.preferences.PreferencesService; import org.jabref.preferences.PreviewPreferences; @@ -64,36 +57,18 @@ public static ContextMenu create(BibEntryTableViewModel entry, KeyBindingReposit contextMenu.getItems().add(factory.createMenuItem(StandardActions.OPEN_FOLDER, new OpenFolderAction(dialogService, stateManager, preferencesService))); contextMenu.getItems().add(factory.createMenuItem(StandardActions.OPEN_EXTERNAL_FILE, new OpenExternalFileAction(dialogService, stateManager, preferencesService))); - contextMenu.getItems().add(factory.createMenuItem(StandardActions.OPEN_URL, getOpenUrlCommand(panel))); + contextMenu.getItems().add(factory.createMenuItem(StandardActions.OPEN_URL, new OpenUrlAction(dialogService, stateManager))); contextMenu.getItems().add(new SeparatorMenuItem()); contextMenu.getItems().add(new ChangeEntryTypeMenu().getChangeEntryTypeMenu(entry.getEntry(), panel.getBibDatabaseContext(), panel.getUndoManager())); - contextMenu.getItems().add(factory.createMenuItem(StandardActions.MERGE_WITH_FETCHED_ENTRY, getFetchEntryData(panel))); - contextMenu.getItems().add(factory.createMenuItem(StandardActions.ATTACH_FILE, new AttachFileAction(panel, dialogService))); - contextMenu.getItems().add(factory.createMenuItem(StandardActions.MERGE_ENTRIES, mergeEntries(panel))); + contextMenu.getItems().add(factory.createMenuItem(StandardActions.MERGE_WITH_FETCHED_ENTRY, new MergeWithFetchedEntryAction(panel, dialogService, stateManager))); + contextMenu.getItems().add(factory.createMenuItem(StandardActions.ATTACH_FILE, new AttachFileAction(panel, dialogService, stateManager, preferencesService))); + contextMenu.getItems().add(factory.createMenuItem(StandardActions.MERGE_ENTRIES, new MergeEntriesAction(panel, dialogService, stateManager))); return contextMenu; } - private static OldCommandWrapper mergeEntries(BasePanel panel) { - OldCommandWrapper command = new OldCommandWrapper(Actions.MERGE_ENTRIES, panel); - command.setExecutable(panel.getMainTable().getSelectedEntries().size() == 2); - return command; - } - - private static OldCommandWrapper getFetchEntryData(BasePanel panel) { - OldCommandWrapper command = new OldCommandWrapper(Actions.MERGE_WITH_FETCHED_ENTRY, panel); - command.setExecutable(isAnyFieldSetForSelectedEntry(FetchAndMergeEntry.SUPPORTED_FIELDS, panel)); - return command; - } - - private static OldCommandWrapper getOpenUrlCommand(BasePanel panel) { - OldCommandWrapper command = new OldCommandWrapper(Actions.OPEN_URL, panel); - command.setExecutable(isFieldSetForSelectedEntry(StandardField.URL, panel) || isFieldSetForSelectedEntry(StandardField.DOI, panel)); - return command; - } - private static Menu createCopySubMenu(BasePanel panel, ActionFactory factory, DialogService dialogService) { Menu copySpecialMenu = factory.createMenu(StandardActions.COPY_MORE); copySpecialMenu.getItems().add(factory.createMenuItem(StandardActions.COPY_TITLE, new OldCommandWrapper(Actions.COPY_TITLE, panel))); @@ -120,16 +95,4 @@ private static Menu createCopySubMenu(BasePanel panel, ActionFactory factory, Di copySpecialMenu.getItems().add(factory.createMenuItem(StandardActions.EXPORT_TO_CLIPBOARD, new ExportToClipboardAction(panel, dialogService))); return copySpecialMenu; } - - private static boolean isFieldSetForSelectedEntry(Field field, BasePanel panel) { - return isAnyFieldSetForSelectedEntry(Collections.singletonList(field), panel); - } - - private static boolean isAnyFieldSetForSelectedEntry(List fields, BasePanel panel) { - if (panel.getMainTable().getSelectedEntries().size() == 1) { - BibEntry entry = panel.getMainTable().getSelectedEntries().get(0); - return !Collections.disjoint(fields, entry.getFields()); - } - return false; - } } diff --git a/src/main/java/org/jabref/gui/mergeentries/MergeEntriesAction.java b/src/main/java/org/jabref/gui/mergeentries/MergeEntriesAction.java index baca427159e..173523860e6 100644 --- a/src/main/java/org/jabref/gui/mergeentries/MergeEntriesAction.java +++ b/src/main/java/org/jabref/gui/mergeentries/MergeEntriesAction.java @@ -6,8 +6,8 @@ import org.jabref.gui.BasePanel; import org.jabref.gui.DialogService; -import org.jabref.gui.JabRefFrame; import org.jabref.gui.StateManager; +import org.jabref.gui.actions.ActionHelper; import org.jabref.gui.actions.SimpleCommand; import org.jabref.gui.undo.NamedCompound; import org.jabref.gui.undo.UndoableInsertEntries; @@ -15,23 +15,20 @@ import org.jabref.logic.l10n.Localization; import org.jabref.model.entry.BibEntry; -import static org.jabref.gui.actions.ActionHelper.needsDatabase; - public class MergeEntriesAction extends SimpleCommand { - private final JabRefFrame jabRefFrame; + private final BasePanel basePanel; private final DialogService dialogService; - public MergeEntriesAction(JabRefFrame jabRefFrame, StateManager stateManager) { - this.jabRefFrame = jabRefFrame; - this.dialogService = jabRefFrame.getDialogService(); + public MergeEntriesAction(BasePanel panel, DialogService dialogService, StateManager stateManager) { + this.basePanel = panel; + this.dialogService = dialogService; - this.executable.bind(needsDatabase(stateManager)); + this.executable.bind(ActionHelper.needsEntriesSelected(2, stateManager)); } @Override public void execute() { - BasePanel basePanel = jabRefFrame.getCurrentBasePanel(); // Check if there are two entries selected List selectedEntries = basePanel.getSelectedEntries(); diff --git a/src/main/java/org/jabref/gui/mergeentries/MergeWithFetchedEntryAction.java b/src/main/java/org/jabref/gui/mergeentries/MergeWithFetchedEntryAction.java index 2b2edf17017..e67c42b0df2 100644 --- a/src/main/java/org/jabref/gui/mergeentries/MergeWithFetchedEntryAction.java +++ b/src/main/java/org/jabref/gui/mergeentries/MergeWithFetchedEntryAction.java @@ -3,32 +3,38 @@ import org.jabref.Globals; import org.jabref.gui.BasePanel; import org.jabref.gui.DialogService; -import org.jabref.gui.actions.BaseAction; +import org.jabref.gui.StateManager; +import org.jabref.gui.actions.ActionHelper; +import org.jabref.gui.actions.SimpleCommand; import org.jabref.logic.l10n.Localization; import org.jabref.model.entry.BibEntry; import org.jabref.model.entry.field.OrFields; import org.jabref.model.entry.field.StandardField; -public class MergeWithFetchedEntryAction implements BaseAction { +public class MergeWithFetchedEntryAction extends SimpleCommand { private final BasePanel basePanel; private final DialogService dialogService; + private final StateManager stateManager; - public MergeWithFetchedEntryAction(BasePanel basePanel, DialogService dialogService) { + public MergeWithFetchedEntryAction(BasePanel basePanel, DialogService dialogService, StateManager stateManager) { this.basePanel = basePanel; this.dialogService = dialogService; + this.stateManager = stateManager; + + this.executable.bind(ActionHelper.needsEntriesSelected(1, stateManager) + .and(ActionHelper.isAnyFieldSetForSelectedEntry(FetchAndMergeEntry.SUPPORTED_FIELDS, stateManager))); } @Override - public void action() { - if (basePanel.getMainTable().getSelectedEntries().size() == 1) { - BibEntry originalEntry = basePanel.getMainTable().getSelectedEntries().get(0); - new FetchAndMergeEntry(basePanel, Globals.TASK_EXECUTOR).fetchAndMerge(originalEntry); - } else { + public void execute() { + if (stateManager.getSelectedEntries().size() != 1) { dialogService.showInformationDialogAndWait( Localization.lang("Merge entry with %0 information", new OrFields(StandardField.DOI, StandardField.ISBN, StandardField.EPRINT).getDisplayName()), Localization.lang("This operation requires exactly one item to be selected.")); - } + + BibEntry originalEntry = stateManager.getSelectedEntries().get(0); + new FetchAndMergeEntry(basePanel, Globals.TASK_EXECUTOR).fetchAndMerge(originalEntry); } }