Skip to content

Commit

Permalink
Added OpenUrlAction, Refactored MergeEntriesAction, MergeWitchFetched…
Browse files Browse the repository at this point in the history
…EntryAction, AttachFileAction
  • Loading branch information
calixtus committed Feb 18, 2020
1 parent d1d74c7 commit f664d10
Show file tree
Hide file tree
Showing 11 changed files with 175 additions and 170 deletions.
71 changes: 3 additions & 68 deletions src/main/java/org/jabref/gui/BasePanel.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -35,22 +34,18 @@
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;
import org.jabref.gui.journals.AbbreviationType;
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;
Expand All @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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());

Expand Down Expand Up @@ -1112,60 +1101,6 @@ public void action() {
}
}

private class OpenURLAction implements BaseAction {

@Override
public void action() {
final List<BibEntry> bes = mainTable.getSelectedEntries();
if (bes.size() == 1) {
Field field = StandardField.DOI;
Optional<String> 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<LinkedFile> files = bes.get(0).getFiles();

Optional<LinkedFile> 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
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/org/jabref/gui/JabRefFrame.java
Original file line number Diff line number Diff line change
Expand Up @@ -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)),

Expand Down
6 changes: 3 additions & 3 deletions src/main/java/org/jabref/gui/OpenConsoleAction.java
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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
Expand Down
23 changes: 23 additions & 0 deletions src/main/java/org/jabref/gui/actions/ActionHelper.java
Original file line number Diff line number Diff line change
@@ -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) {
Expand All @@ -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<Field> fields, StateManager stateManager) {
BibEntry entry = stateManager.getSelectedEntries().get(0);
return Bindings.createBooleanBinding(
() -> !Collections.disjoint(fields, entry.getFields()),
entry.getFieldsObservable(),
stateManager.getSelectedEntries());
}
}
57 changes: 32 additions & 25 deletions src/main/java/org/jabref/gui/filelist/AttachFileAction.java
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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> fieldChange = entry.addFile(editedLinkedFile);
fieldChange.ifPresent(change -> {
UndoableFieldChange ce = new UndoableFieldChange(change);
panel.getUndoManager().addEdit(ce);
panel.markBaseChanged();
dialog.showAndWait()
.ifPresent(editedLinkedFile -> {
Optional<FieldChange> fieldChange = entry.addFile(editedLinkedFile);
fieldChange.ifPresent(change -> {
UndoableFieldChange ce = new UndoableFieldChange(change);
panel.getUndoManager().addEdit(ce);
panel.markBaseChanged();
});
});
});
});
});
}
}
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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
Expand Down
Loading

0 comments on commit f664d10

Please sign in to comment.