Skip to content

Commit f664d10

Browse files
committed
Added OpenUrlAction, Refactored MergeEntriesAction, MergeWitchFetchedEntryAction, AttachFileAction
1 parent d1d74c7 commit f664d10

11 files changed

+175
-170
lines changed

src/main/java/org/jabref/gui/BasePanel.java

+3-68
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
import java.util.Map;
1111
import java.util.Objects;
1212
import java.util.Optional;
13-
import java.util.Set;
1413
import java.util.stream.Collectors;
1514

1615
import javax.swing.undo.CannotRedoException;
@@ -35,22 +34,18 @@
3534
import org.jabref.gui.cleanup.CleanupAction;
3635
import org.jabref.gui.collab.DatabaseChangeMonitor;
3736
import org.jabref.gui.collab.DatabaseChangePane;
38-
import org.jabref.gui.desktop.JabRefDesktop;
3937
import org.jabref.gui.edit.CopyBibTeXKeyAndLinkAction;
4038
import org.jabref.gui.edit.ReplaceStringAction;
4139
import org.jabref.gui.entryeditor.EntryEditor;
4240
import org.jabref.gui.exporter.SaveDatabaseAction;
4341
import org.jabref.gui.externalfiles.DownloadFullTextAction;
44-
import org.jabref.gui.externalfiletype.ExternalFileType;
4542
import org.jabref.gui.externalfiletype.ExternalFileTypes;
4643
import org.jabref.gui.importer.actions.AppendDatabaseAction;
4744
import org.jabref.gui.journals.AbbreviateAction;
4845
import org.jabref.gui.journals.AbbreviationType;
4946
import org.jabref.gui.journals.UnabbreviateAction;
5047
import org.jabref.gui.maintable.MainTable;
5148
import org.jabref.gui.maintable.MainTableDataModel;
52-
import org.jabref.gui.mergeentries.MergeEntriesAction;
53-
import org.jabref.gui.mergeentries.MergeWithFetchedEntryAction;
5449
import org.jabref.gui.preview.CitationStyleToClipboardWorker;
5550
import org.jabref.gui.specialfields.SpecialFieldDatabaseChangeListener;
5651
import org.jabref.gui.specialfields.SpecialFieldValueViewModel;
@@ -70,9 +65,6 @@
7065
import org.jabref.logic.pdf.FileAnnotationCache;
7166
import org.jabref.logic.search.SearchQuery;
7267
import org.jabref.logic.util.UpdateField;
73-
import org.jabref.logic.util.io.FileFinder;
74-
import org.jabref.logic.util.io.FileFinders;
75-
import org.jabref.logic.util.io.FileUtil;
7668
import org.jabref.model.FieldChange;
7769
import org.jabref.model.database.BibDatabase;
7870
import org.jabref.model.database.BibDatabaseContext;
@@ -84,15 +76,12 @@
8476
import org.jabref.model.database.shared.DatabaseLocation;
8577
import org.jabref.model.database.shared.DatabaseSynchronizer;
8678
import org.jabref.model.entry.BibEntry;
87-
import org.jabref.model.entry.FileFieldParser;
88-
import org.jabref.model.entry.LinkedFile;
8979
import org.jabref.model.entry.event.EntriesEventSource;
9080
import org.jabref.model.entry.event.EntryChangedEvent;
9181
import org.jabref.model.entry.field.Field;
9282
import org.jabref.model.entry.field.FieldFactory;
9383
import org.jabref.model.entry.field.SpecialField;
9484
import org.jabref.model.entry.field.SpecialFieldValue;
95-
import org.jabref.model.entry.field.StandardField;
9685
import org.jabref.preferences.JabRefPreferences;
9786

9887
import com.google.common.eventbus.Subscribe;
@@ -281,7 +270,7 @@ private void setupActions() {
281270
// The action for cleaning up entry.
282271
actions.put(Actions.CLEANUP, cleanUpAction);
283272

284-
actions.put(Actions.MERGE_ENTRIES, () -> new MergeEntriesAction(frame, Globals.stateManager).execute());
273+
// actions.put(Actions.MERGE_ENTRIES, () -> new MergeEntriesAction(frame, Globals.stateManager).execute());
285274

286275
// The action for copying the selected entry's key.
287276
actions.put(Actions.COPY_KEY, this::copyKey);
@@ -311,9 +300,9 @@ private void setupActions() {
311300
dbmsSynchronizer.pullChanges();
312301
});
313302

314-
actions.put(Actions.OPEN_URL, new OpenURLAction());
303+
// actions.put(Actions.OPEN_URL, new OpenURLAction());
315304

316-
actions.put(Actions.MERGE_WITH_FETCHED_ENTRY, new MergeWithFetchedEntryAction(this, frame.getDialogService()));
305+
// actions.put(Actions.MERGE_WITH_FETCHED_ENTRY, new MergeWithFetchedEntryAction(this, frame.getDialogService()));
317306

318307
actions.put(Actions.REPLACE_ALL, () -> (new ReplaceStringAction(this)).execute());
319308

@@ -1112,60 +1101,6 @@ public void action() {
11121101
}
11131102
}
11141103

1115-
private class OpenURLAction implements BaseAction {
1116-
1117-
@Override
1118-
public void action() {
1119-
final List<BibEntry> bes = mainTable.getSelectedEntries();
1120-
if (bes.size() == 1) {
1121-
Field field = StandardField.DOI;
1122-
Optional<String> link = bes.get(0).getField(StandardField.DOI);
1123-
if (bes.get(0).hasField(StandardField.URL)) {
1124-
link = bes.get(0).getField(StandardField.URL);
1125-
field = StandardField.URL;
1126-
}
1127-
if (link.isPresent()) {
1128-
try {
1129-
JabRefDesktop.openExternalViewer(bibDatabaseContext, link.get(), field);
1130-
output(Localization.lang("External viewer called") + '.');
1131-
} catch (IOException ex) {
1132-
output(Localization.lang("Error") + ": " + ex.getMessage());
1133-
}
1134-
} else {
1135-
// No URL or DOI found in the "url" and "doi" fields.
1136-
// Look for web links in the "file" field as a fallback:
1137-
1138-
List<LinkedFile> files = bes.get(0).getFiles();
1139-
1140-
Optional<LinkedFile> linkedFile = files.stream()
1141-
.filter(file -> (StandardField.URL.getName().equalsIgnoreCase(file.getFileType())
1142-
|| StandardField.PS.getName().equalsIgnoreCase(file.getFileType())
1143-
|| StandardField.PDF.getName().equalsIgnoreCase(file.getFileType())))
1144-
.findFirst();
1145-
1146-
if (linkedFile.isPresent()) {
1147-
1148-
try {
1149-
1150-
JabRefDesktop.openExternalFileAnyFormat(bibDatabaseContext,
1151-
linkedFile.get().getLink(),
1152-
ExternalFileTypes.getInstance().fromLinkedFile(linkedFile.get(), true));
1153-
1154-
output(Localization.lang("External viewer called") + '.');
1155-
} catch (IOException e) {
1156-
output(Localization.lang("Could not open link"));
1157-
LOGGER.info("Could not open link", e);
1158-
}
1159-
} else {
1160-
output(Localization.lang("No URL defined") + '.');
1161-
}
1162-
}
1163-
} else {
1164-
output(Localization.lang("This operation requires exactly one item to be selected."));
1165-
}
1166-
}
1167-
}
1168-
11691104
private class RedoAction implements BaseAction {
11701105

11711106
@Override

src/main/java/org/jabref/gui/JabRefFrame.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -749,7 +749,7 @@ private MenuBar createMenu() {
749749

750750
quality.getItems().addAll(
751751
factory.createMenuItem(StandardActions.FIND_DUPLICATES, new DuplicateSearch(this, dialogService, stateManager)),
752-
factory.createMenuItem(StandardActions.MERGE_ENTRIES, new MergeEntriesAction(this, stateManager)),
752+
factory.createMenuItem(StandardActions.MERGE_ENTRIES, new MergeEntriesAction(this.getCurrentBasePanel(), dialogService, stateManager)),
753753
factory.createMenuItem(StandardActions.CHECK_INTEGRITY, new IntegrityCheckAction(this, stateManager, Globals.TASK_EXECUTOR)),
754754
factory.createMenuItem(StandardActions.CLEANUP_ENTRIES, new OldDatabaseCommandWrapper(Actions.CLEANUP, this, stateManager)),
755755

src/main/java/org/jabref/gui/OpenConsoleAction.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,15 @@
22

33
import java.io.IOException;
44

5+
import org.jabref.gui.actions.ActionHelper;
56
import org.jabref.gui.actions.SimpleCommand;
67
import org.jabref.gui.desktop.JabRefDesktop;
78
import org.jabref.model.database.BibDatabaseContext;
9+
import org.jabref.model.entry.field.StandardField;
810

911
import org.slf4j.Logger;
1012
import org.slf4j.LoggerFactory;
1113

12-
import static org.jabref.gui.actions.ActionHelper.needsDatabase;
13-
1414
public class OpenConsoleAction extends SimpleCommand {
1515

1616
private static final Logger LOGGER = LoggerFactory.getLogger(OpenConsoleAction.class);
@@ -19,7 +19,7 @@ public class OpenConsoleAction extends SimpleCommand {
1919
public OpenConsoleAction(StateManager stateManager) {
2020
this.stateManager = stateManager;
2121

22-
this.executable.bind(needsDatabase(stateManager));
22+
this.executable.bind(ActionHelper.isFieldSetForSelectedEntry(StandardField.FILE, stateManager));
2323
}
2424

2525
@Override

src/main/java/org/jabref/gui/actions/ActionHelper.java

+23
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
11
package org.jabref.gui.actions;
22

3+
import java.util.Collections;
4+
import java.util.List;
5+
36
import javafx.beans.binding.Bindings;
47
import javafx.beans.binding.BooleanExpression;
58

69
import org.jabref.gui.StateManager;
10+
import org.jabref.model.entry.BibEntry;
11+
import org.jabref.model.entry.field.Field;
712

813
public class ActionHelper {
914
public static BooleanExpression needsDatabase(StateManager stateManager) {
@@ -13,4 +18,22 @@ public static BooleanExpression needsDatabase(StateManager stateManager) {
1318
public static BooleanExpression needsEntriesSelected(StateManager stateManager) {
1419
return Bindings.isNotEmpty(stateManager.getSelectedEntries());
1520
}
21+
22+
public static BooleanExpression needsEntriesSelected(int numberOfEntries, StateManager stateManager) {
23+
return Bindings.createBooleanBinding(
24+
() -> stateManager.getSelectedEntries().size() == numberOfEntries,
25+
stateManager.getSelectedEntries());
26+
}
27+
28+
public static BooleanExpression isFieldSetForSelectedEntry(Field field, StateManager stateManager) {
29+
return isAnyFieldSetForSelectedEntry(Collections.singletonList(field), stateManager);
30+
}
31+
32+
public static BooleanExpression isAnyFieldSetForSelectedEntry(List<Field> fields, StateManager stateManager) {
33+
BibEntry entry = stateManager.getSelectedEntries().get(0);
34+
return Bindings.createBooleanBinding(
35+
() -> !Collections.disjoint(fields, entry.getFields()),
36+
entry.getFieldsObservable(),
37+
stateManager.getSelectedEntries());
38+
}
1639
}
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
package org.jabref.gui.filelist;
22

33
import java.nio.file.Path;
4-
import java.nio.file.Paths;
54
import java.util.Optional;
65

7-
import org.jabref.Globals;
86
import org.jabref.gui.BasePanel;
97
import org.jabref.gui.DialogService;
8+
import org.jabref.gui.StateManager;
9+
import org.jabref.gui.actions.ActionHelper;
1010
import org.jabref.gui.actions.SimpleCommand;
1111
import org.jabref.gui.externalfiletype.ExternalFileTypes;
1212
import org.jabref.gui.fieldeditors.LinkedFilesEditorViewModel;
@@ -16,51 +16,58 @@
1616
import org.jabref.model.FieldChange;
1717
import org.jabref.model.entry.BibEntry;
1818
import org.jabref.model.entry.LinkedFile;
19-
import org.jabref.preferences.JabRefPreferences;
19+
import org.jabref.preferences.PreferencesService;
2020

2121
public class AttachFileAction extends SimpleCommand {
2222

2323
private final BasePanel panel;
24+
private final StateManager stateManager;
2425
private final DialogService dialogService;
26+
private final PreferencesService preferencesService;
2527

26-
public AttachFileAction(BasePanel panel, DialogService dialogService) {
28+
public AttachFileAction(BasePanel panel, DialogService dialogService, StateManager stateManager, PreferencesService preferencesService) {
2729
this.panel = panel;
30+
this.stateManager = stateManager;
2831
this.dialogService = dialogService;
32+
this.preferencesService = preferencesService;
33+
34+
this.executable.bind(ActionHelper.needsEntriesSelected(1, stateManager));
2935
}
3036

3137
@Override
3238
public void execute() {
33-
if (panel.getSelectedEntries().size() != 1) {
39+
if (stateManager.getSelectedEntries().size() != 1) {
3440
dialogService.notify(Localization.lang("This operation requires exactly one item to be selected."));
3541
return;
3642
}
3743

38-
BibEntry entry = panel.getSelectedEntries().get(0);
44+
stateManager.getActiveDatabase().ifPresent(databaseContext -> {
45+
BibEntry entry = stateManager.getSelectedEntries().get(0);
3946

40-
Path workingDirectory = panel.getBibDatabaseContext()
41-
.getFirstExistingFileDir(Globals.prefs.getFilePreferences())
42-
.orElse(Paths.get(Globals.prefs.get(JabRefPreferences.WORKING_DIRECTORY)));
47+
Path workingDirectory = databaseContext.getFirstExistingFileDir(preferencesService.getFilePreferences())
48+
.orElse(preferencesService.getWorkingDir());
4349

44-
FileDialogConfiguration fileDialogConfiguration = new FileDialogConfiguration.Builder()
45-
.withInitialDirectory(workingDirectory)
46-
.build();
50+
FileDialogConfiguration fileDialogConfiguration = new FileDialogConfiguration.Builder()
51+
.withInitialDirectory(workingDirectory)
52+
.build();
4753

48-
dialogService.showFileOpenDialog(fileDialogConfiguration).ifPresent(newFile -> {
49-
LinkedFile linkedFile = LinkedFilesEditorViewModel.fromFile(newFile,
50-
panel.getBibDatabaseContext().getFileDirectoriesAsPaths(Globals.prefs.getFilePreferences()),
51-
ExternalFileTypes.getInstance());
54+
dialogService.showFileOpenDialog(fileDialogConfiguration).ifPresent(newFile -> {
55+
LinkedFile linkedFile = LinkedFilesEditorViewModel.fromFile(newFile,
56+
databaseContext.getFileDirectoriesAsPaths(preferencesService.getFilePreferences()),
57+
ExternalFileTypes.getInstance());
5258

53-
LinkedFileEditDialogView dialog = new LinkedFileEditDialogView(linkedFile);
59+
LinkedFileEditDialogView dialog = new LinkedFileEditDialogView(linkedFile);
5460

55-
dialog.showAndWait()
56-
.ifPresent(editedLinkedFile -> {
57-
Optional<FieldChange> fieldChange = entry.addFile(editedLinkedFile);
58-
fieldChange.ifPresent(change -> {
59-
UndoableFieldChange ce = new UndoableFieldChange(change);
60-
panel.getUndoManager().addEdit(ce);
61-
panel.markBaseChanged();
61+
dialog.showAndWait()
62+
.ifPresent(editedLinkedFile -> {
63+
Optional<FieldChange> fieldChange = entry.addFile(editedLinkedFile);
64+
fieldChange.ifPresent(change -> {
65+
UndoableFieldChange ce = new UndoableFieldChange(change);
66+
panel.getUndoManager().addEdit(ce);
67+
panel.markBaseChanged();
68+
});
6269
});
63-
});
70+
});
6471
});
6572
}
6673
}

src/main/java/org/jabref/gui/OpenExternalFileAction.java src/main/java/org/jabref/gui/maintable/OpenExternalFileAction.java

+7-4
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,19 @@
1-
package org.jabref.gui;
1+
package org.jabref.gui.maintable;
22

33
import java.util.List;
44

55
import org.jabref.Globals;
6+
import org.jabref.gui.DialogService;
7+
import org.jabref.gui.StateManager;
8+
import org.jabref.gui.actions.ActionHelper;
69
import org.jabref.gui.actions.SimpleCommand;
710
import org.jabref.gui.externalfiletype.ExternalFileTypes;
811
import org.jabref.gui.fieldeditors.LinkedFileViewModel;
912
import org.jabref.logic.l10n.Localization;
1013
import org.jabref.model.entry.BibEntry;
14+
import org.jabref.model.entry.field.StandardField;
1115
import org.jabref.preferences.PreferencesService;
1216

13-
import static org.jabref.gui.actions.ActionHelper.needsDatabase;
14-
1517
public class OpenExternalFileAction extends SimpleCommand {
1618

1719
private final DialogService dialogService;
@@ -23,7 +25,8 @@ public OpenExternalFileAction(DialogService dialogService, StateManager stateMan
2325
this.stateManager = stateManager;
2426
this.preferencesService = preferencesService;
2527

26-
this.executable.bind(needsDatabase(stateManager));
28+
this.executable.bind(ActionHelper.isFieldSetForSelectedEntry(StandardField.FILE, stateManager)
29+
.and(ActionHelper.needsEntriesSelected(1, stateManager)));
2730
}
2831

2932
@Override

src/main/java/org/jabref/gui/OpenFolderAction.java src/main/java/org/jabref/gui/maintable/OpenFolderAction.java

+6-8
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,17 @@
1-
package org.jabref.gui;
1+
package org.jabref.gui.maintable;
22

33
import org.jabref.Globals;
4+
import org.jabref.gui.DialogService;
5+
import org.jabref.gui.StateManager;
6+
import org.jabref.gui.actions.ActionHelper;
47
import org.jabref.gui.actions.SimpleCommand;
58
import org.jabref.gui.externalfiletype.ExternalFileTypes;
69
import org.jabref.gui.fieldeditors.LinkedFileViewModel;
10+
import org.jabref.model.entry.field.StandardField;
711
import org.jabref.preferences.PreferencesService;
812

9-
import org.slf4j.Logger;
10-
import org.slf4j.LoggerFactory;
11-
12-
import static org.jabref.gui.actions.ActionHelper.needsDatabase;
13-
1413
public class OpenFolderAction extends SimpleCommand {
1514

16-
private static final Logger LOGGER = LoggerFactory.getLogger(OpenFolderAction.class);
1715
private final DialogService dialogService;
1816
private final StateManager stateManager;
1917
private final PreferencesService preferencesService;
@@ -23,7 +21,7 @@ public OpenFolderAction(DialogService dialogService, StateManager stateManager,
2321
this.stateManager = stateManager;
2422
this.preferencesService = preferencesService;
2523

26-
this.executable.bind(needsDatabase(stateManager));
24+
this.executable.bind(ActionHelper.isFieldSetForSelectedEntry(StandardField.FILE, stateManager));
2725
}
2826

2927
@Override

0 commit comments

Comments
 (0)