diff --git a/src/main/java/org/jabref/gui/JabRefFrame.java b/src/main/java/org/jabref/gui/JabRefFrame.java index e849be5d19a..f17cefdc166 100644 --- a/src/main/java/org/jabref/gui/JabRefFrame.java +++ b/src/main/java/org/jabref/gui/JabRefFrame.java @@ -68,6 +68,7 @@ import org.jabref.gui.actions.AutoLinkFilesAction; import org.jabref.gui.actions.ConnectToSharedDatabaseAction; import org.jabref.gui.actions.ErrorConsoleAction; +import org.jabref.gui.actions.ExportLinkedFilesAction; import org.jabref.gui.actions.IntegrityCheckAction; import org.jabref.gui.actions.LookupIdentifierAction; import org.jabref.gui.actions.ManageKeywordsAction; @@ -390,6 +391,7 @@ public void actionPerformed(ActionEvent e) { Localization.menuTitle("Unabbreviate journal names"), Localization.lang("Unabbreviate journal names of the selected entries"), Globals.getKeyPrefs().getKey(KeyBinding.UNABBREVIATE)); + private final AbstractAction exportLinkedFiles = new ExportLinkedFilesAction(); private final AbstractAction manageJournals = new ManageJournalsAction(); private final AbstractAction databaseProperties = new DatabasePropertiesAction(); private final AbstractAction bibtexKeyPattern = new BibtexKeyPatternAction(); @@ -1234,6 +1236,8 @@ private void fillMenu() { tools.add(abbreviateIso); tools.add(abbreviateMedline); tools.add(unabbreviate); + tools.addSeparator(); + tools.add(exportLinkedFiles); mb.add(tools); options.add(showPrefs); @@ -1434,7 +1438,7 @@ dupliCheck, autoSetFile, newEntryAction, newSpec, customizeAction, plainTextImpo twoEntriesOnlyActions.addAll(Arrays.asList(mergeEntries)); atLeastOneEntryActions.clear(); - atLeastOneEntryActions.addAll(Arrays.asList(downloadFullText, lookupIdentifiers)); + atLeastOneEntryActions.addAll(Arrays.asList(downloadFullText, lookupIdentifiers, exportLinkedFiles)); tabbedPane.addChangeListener(event -> updateEnabledState()); diff --git a/src/main/java/org/jabref/gui/actions/ExportLinkedFilesAction.java b/src/main/java/org/jabref/gui/actions/ExportLinkedFilesAction.java new file mode 100644 index 00000000000..f677546b0d5 --- /dev/null +++ b/src/main/java/org/jabref/gui/actions/ExportLinkedFilesAction.java @@ -0,0 +1,98 @@ +package org.jabref.gui.actions; + +import java.awt.event.ActionEvent; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.List; +import java.util.Optional; +import java.util.function.BiFunction; + +import javax.swing.AbstractAction; + +import javafx.scene.control.ProgressBar; + +import org.jabref.Globals; +import org.jabref.JabRefGUI; +import org.jabref.gui.DialogService; +import org.jabref.gui.FXDialogService; +import org.jabref.gui.util.BackgroundTask; +import org.jabref.gui.util.DefaultTaskExecutor; +import org.jabref.gui.util.DirectoryDialogConfiguration; +import org.jabref.gui.util.TaskExecutor; +import org.jabref.logic.l10n.Localization; +import org.jabref.logic.util.io.FileUtil; +import org.jabref.model.database.BibDatabaseContext; +import org.jabref.model.entry.BibEntry; +import org.jabref.model.entry.LinkedFile; +import org.jabref.model.util.FileHelper; +import org.jabref.model.util.OptionalUtil; +import org.jabref.preferences.JabRefPreferences; + + +public class ExportLinkedFilesAction extends AbstractAction { + + private final TaskExecutor taskExecutor = Globals.taskExecutor; + + public ExportLinkedFilesAction() { + super(Localization.lang("Export linked files")); + } + + @Override + public void actionPerformed(ActionEvent e) { + + DirectoryDialogConfiguration dirDialogConfiguration = new DirectoryDialogConfiguration.Builder() + .withInitialDirectory( + Paths.get(Globals.prefs.get(JabRefPreferences.EXPORT_WORKING_DIRECTORY))) + .build(); + List entries = JabRefGUI.getMainFrame().getCurrentBasePanel().getSelectedEntries(); + + DialogService ds = new FXDialogService(); + Optional path = DefaultTaskExecutor + .runInJavaFXThread(() -> ds.showDirectorySelectionDialog(dirDialogConfiguration)); + + BibDatabaseContext databaseContext = JabRefGUI.getMainFrame().getCurrentBasePanel().getDatabaseContext(); + + System.out.println("Files count " + entries.stream().flatMap(entry -> entry.getFiles().stream()).count()); + + + int counter = 0; + BackgroundTask task = BackgroundTask.wrap(() -> { + + + for (BibEntry entry : entries) { + + List files = entry.getFiles(); + for (LinkedFile fileEntry : files) { + + String fileName = fileEntry.getLink(); + + Optional fileToExport = FileHelper.expandFilename(fileName, + databaseContext.getFileDirectories(Globals.prefs.getFileDirectoryPreferences())); + + Optional newPath = OptionalUtil.combine(path, fileToExport, resolvePathFilename); + + newPath.ifPresent(newFile -> { + System.out.println(newFile); + FileUtil.copyFile(fileToExport.get(), newFile, false); + + }); + + } + } + return null; + }); + + System.out.println("Final counter " + counter); + + + ProgressBar bar = new ProgressBar(); + + + + } + + BiFunction resolvePathFilename = (p, f) -> { + return p.resolve(f.getFileName()); + }; + +} diff --git a/src/main/java/org/jabref/logic/exporter/ExportFormat.java b/src/main/java/org/jabref/logic/exporter/ExportFormat.java index 871d3509136..031b315d5c6 100644 --- a/src/main/java/org/jabref/logic/exporter/ExportFormat.java +++ b/src/main/java/org/jabref/logic/exporter/ExportFormat.java @@ -313,12 +313,6 @@ public void performExport(final BibDatabaseContext databaseContext, final String } - @Override - public void performExport(final BibDatabaseContext databaseContext, Path file, final Charset encoding, - List entries) throws Exception { - performExport(databaseContext, file.getFileName().toString(), encoding, entries); - } - /** * See if there is a name formatter file bundled with this export format. If so, read * all the name formatters so they can be used by the filter layouts. diff --git a/src/main/java/org/jabref/logic/exporter/IExportFormat.java b/src/main/java/org/jabref/logic/exporter/IExportFormat.java index 0b176a6c9c8..b2f5a9b781a 100644 --- a/src/main/java/org/jabref/logic/exporter/IExportFormat.java +++ b/src/main/java/org/jabref/logic/exporter/IExportFormat.java @@ -1,7 +1,6 @@ package org.jabref.logic.exporter; import java.nio.charset.Charset; -import java.nio.file.Path; import java.util.List; import org.jabref.model.database.BibDatabaseContext; @@ -38,18 +37,4 @@ public interface IExportFormat { void performExport(BibDatabaseContext databaseContext, String file, Charset encoding, List entries) throws Exception; - /** - * Perform the Export. - * Gets the path as a java.nio.path instead of a string. - * - * @param databaseContext the database to export from. - * @param file the Path to the file to write to.The path should be an java.nio.Path - * @param encoding The encoding to use. - * @param entries A list containing all entries that - * should be exported. The list of entries must be non null - * @throws Exception - */ - void performExport(BibDatabaseContext databaseContext, Path file, Charset encoding, List entries) - throws Exception; - }