Skip to content

Commit d1d74c7

Browse files
committed
OpenConsole, OpenFolder, OpenExternalFile
1 parent 0d2efc4 commit d1d74c7

File tree

7 files changed

+142
-104
lines changed

7 files changed

+142
-104
lines changed

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

Lines changed: 0 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -306,21 +306,6 @@ private void setupActions() {
306306

307307
actions.put(Actions.MERGE_DATABASE, new AppendDatabaseAction(frame, this));
308308

309-
actions.put(Actions.OPEN_EXTERNAL_FILE, this::openExternalFile);
310-
311-
actions.put(Actions.OPEN_FOLDER, () -> JabRefExecutorService.INSTANCE.execute(() -> {
312-
final List<Path> files = FileUtil.getListOfLinkedFiles(mainTable.getSelectedEntries(), bibDatabaseContext.getFileDirectoriesAsPaths(Globals.prefs.getFilePreferences()));
313-
for (final Path f : files) {
314-
try {
315-
JabRefDesktop.openFolderAndSelectFile(f.toAbsolutePath());
316-
} catch (IOException e) {
317-
LOGGER.info("Could not open folder", e);
318-
}
319-
}
320-
}));
321-
322-
actions.put(Actions.OPEN_CONSOLE, () -> JabRefDesktop.openConsole(frame.getCurrentBasePanel().getBibDatabaseContext().getDatabaseFile().orElse(null)));
323-
324309
actions.put(Actions.PULL_CHANGES_FROM_SHARED_DATABASE, () -> {
325310
DatabaseSynchronizer dbmsSynchronizer = frame.getCurrentBasePanel().getBibDatabaseContext().getDBMSSynchronizer();
326311
dbmsSynchronizer.pullChanges();
@@ -542,37 +527,6 @@ private void copyKeyAndTitle() {
542527
}
543528
}
544529

545-
private void openExternalFile() {
546-
final List<BibEntry> selectedEntries = mainTable.getSelectedEntries();
547-
if (selectedEntries.size() != 1) {
548-
output(Localization.lang("This operation requires exactly one item to be selected."));
549-
return;
550-
}
551-
JabRefExecutorService.INSTANCE.execute(() -> {
552-
final BibEntry entry = selectedEntries.get(0);
553-
if (!entry.hasField(StandardField.FILE)) {
554-
// no bibtex field
555-
new SearchAndOpenFile(entry, BasePanel.this).searchAndOpen();
556-
return;
557-
}
558-
559-
List<LinkedFile> files = new ArrayList<>();
560-
entry.getField(StandardField.FILE).map(FileFieldParser::parse).ifPresent(files::addAll);
561-
562-
if (files.isEmpty()) {
563-
// content in BibTeX field is not readable
564-
new SearchAndOpenFile(entry, BasePanel.this).searchAndOpen();
565-
return;
566-
}
567-
LinkedFile flEntry = files.get(0);
568-
try {
569-
JabRefDesktop.openExternalFileAnyFormat(this.getBibDatabaseContext(), flEntry.getLink(), ExternalFileTypes.getInstance().fromLinkedFile(flEntry, true));
570-
} catch (IOException ex) {
571-
dialogService.showErrorDialogAndWait(ex);
572-
}
573-
});
574-
}
575-
576530
/**
577531
* This method is called from JabRefFrame if a database specific action is requested by the user. Runs the command
578532
* if it is defined, or prints an error message to the standard error stream.
@@ -1076,47 +1030,6 @@ public void cut() {
10761030
mainTable.cut();
10771031
}
10781032

1079-
private static class SearchAndOpenFile {
1080-
1081-
private final BibEntry entry;
1082-
private final BasePanel basePanel;
1083-
1084-
public SearchAndOpenFile(final BibEntry entry, final BasePanel basePanel) {
1085-
this.entry = entry;
1086-
this.basePanel = basePanel;
1087-
}
1088-
1089-
public void searchAndOpen() {
1090-
if (!Globals.prefs.getBoolean(JabRefPreferences.RUN_AUTOMATIC_FILE_SEARCH)) {
1091-
/* The search can lead to an unexpected 100% CPU usage which is perceived
1092-
as a bug, if the search incidentally starts at a directory with lots
1093-
of stuff below. It is now disabled by default. */
1094-
return;
1095-
}
1096-
1097-
final Set<ExternalFileType> types = ExternalFileTypes.getInstance().getExternalFileTypeSelection();
1098-
final List<Path> dirs = basePanel.getBibDatabaseContext().getFileDirectoriesAsPaths(Globals.prefs.getFilePreferences());
1099-
final List<String> extensions = types.stream().map(ExternalFileType::getExtension).collect(Collectors.toList());
1100-
1101-
// Run the search operation:
1102-
FileFinder fileFinder = FileFinders.constructFromConfiguration(Globals.prefs.getAutoLinkPreferences());
1103-
try {
1104-
List<Path> files = fileFinder.findAssociatedFiles(entry, dirs, extensions);
1105-
if (!files.isEmpty()) {
1106-
Path file = files.get(0);
1107-
Optional<ExternalFileType> type = ExternalFileTypes.getInstance().getExternalFileTypeByFile(file);
1108-
if (type.isPresent()) {
1109-
JabRefDesktop.openExternalFileAnyFormat(file, basePanel.getBibDatabaseContext(), type);
1110-
basePanel.output(Localization.lang("External viewer called") + '.');
1111-
}
1112-
}
1113-
} catch (IOException ex) {
1114-
LOGGER.error("Problems with finding/or opening files ", ex);
1115-
basePanel.output(Localization.lang("Error") + ": " + ex.getMessage());
1116-
}
1117-
}
1118-
}
1119-
11201033
private class GroupTreeListener {
11211034

11221035
@Subscribe

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -812,7 +812,7 @@ private MenuBar createMenu() {
812812

813813
factory.createMenuItem(StandardActions.SHOW_PDF_VIEWER, new ShowDocumentViewerAction()),
814814
factory.createMenuItem(StandardActions.EDIT_ENTRY, new OldDatabaseCommandWrapper(Actions.EDIT, this, stateManager)),
815-
factory.createMenuItem(StandardActions.OPEN_CONSOLE, new OldDatabaseCommandWrapper(Actions.OPEN_CONSOLE, this, stateManager))
815+
factory.createMenuItem(StandardActions.OPEN_CONSOLE, new OpenConsoleAction(stateManager))
816816
);
817817
});
818818

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package org.jabref.gui;
2+
3+
import java.io.IOException;
4+
5+
import org.jabref.gui.actions.SimpleCommand;
6+
import org.jabref.gui.desktop.JabRefDesktop;
7+
import org.jabref.model.database.BibDatabaseContext;
8+
9+
import org.slf4j.Logger;
10+
import org.slf4j.LoggerFactory;
11+
12+
import static org.jabref.gui.actions.ActionHelper.needsDatabase;
13+
14+
public class OpenConsoleAction extends SimpleCommand {
15+
16+
private static final Logger LOGGER = LoggerFactory.getLogger(OpenConsoleAction.class);
17+
private final StateManager stateManager;
18+
19+
public OpenConsoleAction(StateManager stateManager) {
20+
this.stateManager = stateManager;
21+
22+
this.executable.bind(needsDatabase(stateManager));
23+
}
24+
25+
@Override
26+
public void execute() {
27+
stateManager.getActiveDatabase().flatMap(BibDatabaseContext::getDatabasePath).ifPresent(path -> {
28+
try {
29+
JabRefDesktop.openConsole(path.toFile());
30+
} catch (IOException e) {
31+
LOGGER.info("Could not open console", e);
32+
}
33+
});
34+
}
35+
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package org.jabref.gui;
2+
3+
import java.util.List;
4+
5+
import org.jabref.Globals;
6+
import org.jabref.gui.actions.SimpleCommand;
7+
import org.jabref.gui.externalfiletype.ExternalFileTypes;
8+
import org.jabref.gui.fieldeditors.LinkedFileViewModel;
9+
import org.jabref.logic.l10n.Localization;
10+
import org.jabref.model.entry.BibEntry;
11+
import org.jabref.preferences.PreferencesService;
12+
13+
import static org.jabref.gui.actions.ActionHelper.needsDatabase;
14+
15+
public class OpenExternalFileAction extends SimpleCommand {
16+
17+
private final DialogService dialogService;
18+
private final StateManager stateManager;
19+
private final PreferencesService preferencesService;
20+
21+
public OpenExternalFileAction(DialogService dialogService, StateManager stateManager, PreferencesService preferencesService) {
22+
this.dialogService = dialogService;
23+
this.stateManager = stateManager;
24+
this.preferencesService = preferencesService;
25+
26+
this.executable.bind(needsDatabase(stateManager));
27+
}
28+
29+
@Override
30+
public void execute() {
31+
stateManager.getActiveDatabase().ifPresent(databaseContext -> {
32+
final List<BibEntry> selectedEntries = stateManager.getSelectedEntries();
33+
34+
if (selectedEntries.size() != 1) {
35+
dialogService.notify(Localization.lang("This operation requires exactly one item to be selected."));
36+
return;
37+
}
38+
39+
final BibEntry entry = selectedEntries.get(0);
40+
41+
LinkedFileViewModel linkedFileViewModel = new LinkedFileViewModel(
42+
entry.getFiles().get(0),
43+
entry,
44+
databaseContext,
45+
Globals.TASK_EXECUTOR,
46+
dialogService,
47+
preferencesService.getXMPPreferences(),
48+
preferencesService.getFilePreferences(),
49+
ExternalFileTypes.getInstance());
50+
linkedFileViewModel.open();
51+
});
52+
}
53+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package org.jabref.gui;
2+
3+
import org.jabref.Globals;
4+
import org.jabref.gui.actions.SimpleCommand;
5+
import org.jabref.gui.externalfiletype.ExternalFileTypes;
6+
import org.jabref.gui.fieldeditors.LinkedFileViewModel;
7+
import org.jabref.preferences.PreferencesService;
8+
9+
import org.slf4j.Logger;
10+
import org.slf4j.LoggerFactory;
11+
12+
import static org.jabref.gui.actions.ActionHelper.needsDatabase;
13+
14+
public class OpenFolderAction extends SimpleCommand {
15+
16+
private static final Logger LOGGER = LoggerFactory.getLogger(OpenFolderAction.class);
17+
private final DialogService dialogService;
18+
private final StateManager stateManager;
19+
private final PreferencesService preferencesService;
20+
21+
public OpenFolderAction(DialogService dialogService, StateManager stateManager, PreferencesService preferencesService) {
22+
this.dialogService = dialogService;
23+
this.stateManager = stateManager;
24+
this.preferencesService = preferencesService;
25+
26+
this.executable.bind(needsDatabase(stateManager));
27+
}
28+
29+
@Override
30+
public void execute() {
31+
stateManager.getActiveDatabase().ifPresent(databaseContext ->
32+
stateManager.getSelectedEntries().forEach(entry -> {
33+
LinkedFileViewModel linkedFileViewModel = new LinkedFileViewModel(
34+
entry.getFiles().get(0),
35+
entry,
36+
databaseContext,
37+
Globals.TASK_EXECUTOR,
38+
dialogService,
39+
preferencesService.getXMPPreferences(),
40+
preferencesService.getFilePreferences(),
41+
ExternalFileTypes.getInstance());
42+
linkedFileViewModel.openFolder();
43+
}));
44+
}
45+
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ public MainTable(MainTableDataModel model, JabRefFrame frame,
8585
panel.showAndEdit(entry.getEntry());
8686
}
8787
})
88-
.withContextMenu(entry -> RightClickMenu.create(entry, keyBindingRepository, panel, frame.getDialogService()))
88+
.withContextMenu(entry -> RightClickMenu.create(entry, keyBindingRepository, panel, frame.getDialogService(), Globals.stateManager, Globals.prefs))
8989
.setOnDragDetected(this::handleOnDragDetected)
9090
.setOnDragDropped(this::handleOnDragDropped)
9191
.setOnDragOver(this::handleOnDragOver)

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

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@
1010
import org.jabref.Globals;
1111
import org.jabref.gui.BasePanel;
1212
import org.jabref.gui.DialogService;
13+
import org.jabref.gui.OpenExternalFileAction;
14+
import org.jabref.gui.OpenFolderAction;
15+
import org.jabref.gui.StateManager;
1316
import org.jabref.gui.actions.ActionFactory;
1417
import org.jabref.gui.actions.Actions;
1518
import org.jabref.gui.actions.OldCommandWrapper;
@@ -27,11 +30,12 @@
2730
import org.jabref.model.entry.field.SpecialField;
2831
import org.jabref.model.entry.field.StandardField;
2932
import org.jabref.preferences.JabRefPreferences;
33+
import org.jabref.preferences.PreferencesService;
3034
import org.jabref.preferences.PreviewPreferences;
3135

3236
public class RightClickMenu {
3337

34-
public static ContextMenu create(BibEntryTableViewModel entry, KeyBindingRepository keyBindingRepository, BasePanel panel, DialogService dialogService) {
38+
public static ContextMenu create(BibEntryTableViewModel entry, KeyBindingRepository keyBindingRepository, BasePanel panel, DialogService dialogService, StateManager stateManager, PreferencesService preferencesService) {
3539
ContextMenu contextMenu = new ContextMenu();
3640
ActionFactory factory = new ActionFactory(keyBindingRepository);
3741

@@ -58,8 +62,8 @@ public static ContextMenu create(BibEntryTableViewModel entry, KeyBindingReposit
5862

5963
contextMenu.getItems().add(new SeparatorMenuItem());
6064

61-
contextMenu.getItems().add(factory.createMenuItem(StandardActions.OPEN_FOLDER, getOpenFolderCommand(panel)));
62-
contextMenu.getItems().add(factory.createMenuItem(StandardActions.OPEN_EXTERNAL_FILE, getOpenExternalFileCommand(panel)));
65+
contextMenu.getItems().add(factory.createMenuItem(StandardActions.OPEN_FOLDER, new OpenFolderAction(dialogService, stateManager, preferencesService)));
66+
contextMenu.getItems().add(factory.createMenuItem(StandardActions.OPEN_EXTERNAL_FILE, new OpenExternalFileAction(dialogService, stateManager, preferencesService)));
6367
contextMenu.getItems().add(factory.createMenuItem(StandardActions.OPEN_URL, getOpenUrlCommand(panel)));
6468

6569
contextMenu.getItems().add(new SeparatorMenuItem());
@@ -90,18 +94,6 @@ private static OldCommandWrapper getOpenUrlCommand(BasePanel panel) {
9094
return command;
9195
}
9296

93-
private static OldCommandWrapper getOpenExternalFileCommand(BasePanel panel) {
94-
OldCommandWrapper command = new OldCommandWrapper(Actions.OPEN_EXTERNAL_FILE, panel);
95-
command.setExecutable(isFieldSetForSelectedEntry(StandardField.FILE, panel));
96-
return command;
97-
}
98-
99-
private static OldCommandWrapper getOpenFolderCommand(BasePanel panel) {
100-
OldCommandWrapper command = new OldCommandWrapper(Actions.OPEN_FOLDER, panel);
101-
command.setExecutable(isFieldSetForSelectedEntry(StandardField.FILE, panel));
102-
return command;
103-
}
104-
10597
private static Menu createCopySubMenu(BasePanel panel, ActionFactory factory, DialogService dialogService) {
10698
Menu copySpecialMenu = factory.createMenu(StandardActions.COPY_MORE);
10799
copySpecialMenu.getItems().add(factory.createMenuItem(StandardActions.COPY_TITLE, new OldCommandWrapper(Actions.COPY_TITLE, panel)));

0 commit comments

Comments
 (0)