package org.jabref.gui.importer; import java.awt.event.ActionEvent; import java.io.File; import java.nio.file.Files; import java.nio.file.Path; import java.util.Collections; import java.util.List; import java.util.Optional; import java.util.SortedSet; import java.util.stream.Collectors; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.JOptionPane; import javafx.stage.FileChooser; import org.jabref.Globals; import org.jabref.gui.DialogService; import org.jabref.gui.FXDialogService; import org.jabref.gui.JabRefFrame; import org.jabref.gui.actions.MnemonicAwareAction; import org.jabref.gui.keyboard.KeyBinding; import org.jabref.gui.util.DefaultTaskExecutor; import org.jabref.gui.util.FileDialogConfiguration; import org.jabref.logic.importer.Importer; import org.jabref.logic.l10n.Localization; import org.jabref.logic.util.FileExtensions; import org.jabref.preferences.JabRefPreferences; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; public class ImportFormats { private static final Log LOGGER = LogFactory.getLog(ImportFormats.class); private ImportFormats() { } /** * Create an AbstractAction for performing an Import operation. * @param frame The JabRefFrame of this JabRef instance. * @param openInNew Indicate whether the action should open into a new database or * into the currently open one. * @return The action. */ public static AbstractAction getImportAction(JabRefFrame frame, boolean openInNew) { class ImportAction extends MnemonicAwareAction { private final boolean newDatabase; public ImportAction(boolean newDatabase) { this.newDatabase = newDatabase; if (newDatabase) { putValue(Action.NAME, Localization.menuTitle("Import into new library")); putValue(Action.ACCELERATOR_KEY, Globals.getKeyPrefs().getKey(KeyBinding.IMPORT_INTO_NEW_DATABASE)); } else { putValue(Action.NAME, Localization.menuTitle("Import into current library")); putValue(Action.ACCELERATOR_KEY, Globals.getKeyPrefs().getKey(KeyBinding.IMPORT_INTO_CURRENT_DATABASE)); } } @Override public void actionPerformed(ActionEvent e) { SortedSet<Importer> importers = Globals.IMPORT_FORMAT_READER.getImportFormats(); List<FileExtensions> extensions = importers.stream().map(Importer::getExtensions) .collect(Collectors.toList()); FileChooser.ExtensionFilter allImports = ImportFileFilter .convert(Localization.lang("Available import formats"), importers); FileDialogConfiguration fileDialogConfiguration = new FileDialogConfiguration.Builder() .addExtensionFilters(extensions) .withInitialDirectory(Globals.prefs.get(JabRefPreferences.IMPORT_WORKING_DIRECTORY)) .build(); DialogService ds = new FXDialogService(); FileChooser fs = ds.getConfiguredFileChooser(fileDialogConfiguration); fs.setSelectedExtensionFilter(allImports); File f = DefaultTaskExecutor .runInJavaFXThread(() -> fs.showOpenDialog(null)); Optional<Path> selectedFile = Optional.ofNullable(f).map(File::toPath); FileChooser.ExtensionFilter selectedExtension = fs.getSelectedExtensionFilter(); // Add file filter for all supported types selectedFile.ifPresent(file -> { try { if (!Files.exists(file)) { JOptionPane.showMessageDialog(frame, Localization.lang("File not found") + ": '" + file.getFileName() + "'.", Localization.lang("Import"), JOptionPane.ERROR_MESSAGE); return; } Optional<Importer> format = ImportFileFilter.convert(selectedExtension, importers); ImportMenuItem importMenu = new ImportMenuItem(frame, newDatabase, format.orElse(null)); importMenu.automatedImport(Collections.singletonList(file.toString())); // Set last working dir for import Globals.prefs.put(JabRefPreferences.IMPORT_WORKING_DIRECTORY, file.getParent().toString()); } catch (Exception ex) { LOGGER.warn("Cannot import file", ex); } }); } } return new ImportAction(openInNew); } }