diff --git a/src/main/java/org/jabref/Globals.java b/src/main/java/org/jabref/Globals.java index b86cc83cbd2..1a5cc0ee385 100644 --- a/src/main/java/org/jabref/Globals.java +++ b/src/main/java/org/jabref/Globals.java @@ -9,6 +9,7 @@ import org.jabref.gui.ClipBoardManager; import org.jabref.gui.StateManager; import org.jabref.gui.keyboard.KeyBindingRepository; +import org.jabref.gui.undo.CountingUndoManager; import org.jabref.gui.util.DefaultFileUpdateMonitor; import org.jabref.gui.util.DefaultTaskExecutor; import org.jabref.gui.util.TaskExecutor; @@ -57,6 +58,7 @@ public class Globals { public static StateManager stateManager = new StateManager(); public static ExporterFactory exportFactory; + public static CountingUndoManager undoManager = new CountingUndoManager(); // Key binding preferences private static KeyBindingRepository keyBindingRepository; private static DefaultFileUpdateMonitor fileUpdateMonitor; diff --git a/src/main/java/org/jabref/gui/Base.css b/src/main/java/org/jabref/gui/Base.css index 14c7861eb45..8c6b1dbe2d8 100644 --- a/src/main/java/org/jabref/gui/Base.css +++ b/src/main/java/org/jabref/gui/Base.css @@ -364,6 +364,11 @@ -fx-fill: white; } +.toggle-button:selected.icon-button:selected { + -fx-background-color: transparent; + -fx-fill: -jr-selected; +} + .icon-buttonNoSpaceBottom { -fx-padding: 0.5em 0.5em -0.1em 0.5em; } @@ -976,6 +981,35 @@ We want to have a look that matches our icons in the tool-bar */ -fx-border-width: 0px; } +.bibEntry { + +} + +.bibEntry .type { + -fx-font-size: 110%; +} + +.bibEntry .title { + -fx-font-size: 110%; + -fx-font-weight: bold; +} + +.bibEntry .year { + -fx-font-size: 101%; + -fx-font-weight: bold; +} + +.bibEntry .journal { + -fx-font-size: 101%; +} + +.bibEntry .authors { + -fx-font-size: 101%; +} + +.bibEntry .summary { + -fx-padding: 1ex 0ex 0ex 0ex; +} .warning-icon { -fx-fill: -jr-warn; diff --git a/src/main/java/org/jabref/gui/DefaultInjector.java b/src/main/java/org/jabref/gui/DefaultInjector.java index 4f18a03b9e6..ee7c8c05839 100644 --- a/src/main/java/org/jabref/gui/DefaultInjector.java +++ b/src/main/java/org/jabref/gui/DefaultInjector.java @@ -2,6 +2,8 @@ import java.util.function.Function; +import javax.swing.undo.UndoManager; + import org.jabref.Globals; import org.jabref.gui.keyboard.KeyBindingRepository; import org.jabref.gui.util.TaskExecutor; @@ -43,6 +45,8 @@ private static Object createDependency(Class clazz) { return Globals.protectedTermsLoader; } else if (clazz == ClipBoardManager.class) { return Globals.clipboardManager; + } else if (clazz == UndoManager.class) { + return Globals.undoManager; } else { try { return clazz.newInstance(); diff --git a/src/main/java/org/jabref/gui/DuplicateResolverDialog.java b/src/main/java/org/jabref/gui/DuplicateResolverDialog.java index 0be0d823c83..858a7c7e7f2 100644 --- a/src/main/java/org/jabref/gui/DuplicateResolverDialog.java +++ b/src/main/java/org/jabref/gui/DuplicateResolverDialog.java @@ -12,10 +12,13 @@ import org.jabref.gui.util.BaseDialog; import org.jabref.logic.help.HelpFile; import org.jabref.logic.l10n.Localization; +import org.jabref.model.database.BibDatabaseContext; import org.jabref.model.entry.BibEntry; public class DuplicateResolverDialog extends BaseDialog { + private final BibDatabaseContext database; + public enum DuplicateResolverType { DUPLICATE_SEARCH, IMPORT_CHECK, @@ -32,13 +35,12 @@ public enum DuplicateResolverResult { BREAK } - private final JabRefFrame frame; private MergeEntries me; - public DuplicateResolverDialog(JabRefFrame frame, BibEntry one, BibEntry two, DuplicateResolverType type) { - this.frame = frame; + public DuplicateResolverDialog(BibEntry one, BibEntry two, DuplicateResolverType type, BibDatabaseContext database) { this.setTitle(Localization.lang("Possible duplicate entries")); init(one, two, type); + this.database = database; } private void init(BibEntry one, BibEntry two, DuplicateResolverType type) { @@ -61,14 +63,14 @@ private void init(BibEntry one, BibEntry two, DuplicateResolverType type) { first = new ButtonType(Localization.lang("Keep left"), ButtonData.APPLY); second = new ButtonType(Localization.lang("Keep right"), ButtonData.APPLY); both = new ButtonType(Localization.lang("Keep both"), ButtonData.APPLY); - me = new MergeEntries(one, two, frame.getCurrentBasePanel().getBibDatabaseContext().getMode()); + me = new MergeEntries(one, two, database.getMode()); break; case INSPECTION: first = new ButtonType(Localization.lang("Remove old entry"), ButtonData.APPLY); second = new ButtonType(Localization.lang("Remove entry from import"), ButtonData.APPLY); both = new ButtonType(Localization.lang("Keep both"), ButtonData.APPLY); me = new MergeEntries(one, two, Localization.lang("Old entry"), - Localization.lang("From import"), frame.getCurrentBasePanel().getBibDatabaseContext().getMode()); + Localization.lang("From import"), database.getMode()); break; case DUPLICATE_SEARCH_WITH_EXACT: first = new ButtonType(Localization.lang("Keep left"), ButtonData.APPLY); @@ -77,14 +79,14 @@ private void init(BibEntry one, BibEntry two, DuplicateResolverType type) { removeExactVisible = true; - me = new MergeEntries(one, two, frame.getCurrentBasePanel().getBibDatabaseContext().getMode()); + me = new MergeEntries(one, two, database.getMode()); break; default: first = new ButtonType(Localization.lang("Import and remove old entry"), ButtonData.APPLY); second = new ButtonType(Localization.lang("Do not import entry"), ButtonData.APPLY); both = new ButtonType(Localization.lang("Import and keep old entry"), ButtonData.APPLY); me = new MergeEntries(one, two, Localization.lang("Old entry"), - Localization.lang("From import"), frame.getCurrentBasePanel().getBibDatabaseContext().getMode()); + Localization.lang("From import"), database.getMode()); break; } if (removeExactVisible) { diff --git a/src/main/java/org/jabref/gui/DuplicateSearch.java b/src/main/java/org/jabref/gui/DuplicateSearch.java index 9e9921f741a..0db4c5df1c2 100644 --- a/src/main/java/org/jabref/gui/DuplicateSearch.java +++ b/src/main/java/org/jabref/gui/DuplicateSearch.java @@ -122,7 +122,7 @@ private DuplicateSearchResult verifyDuplicates() { } private void askResolveStrategy(DuplicateSearchResult result, BibEntry first, BibEntry second, DuplicateResolverType resolverType) { - DuplicateResolverDialog dialog = new DuplicateResolverDialog(frame, first, second, resolverType); + DuplicateResolverDialog dialog = new DuplicateResolverDialog(first, second, resolverType, frame.getCurrentBasePanel().getBibDatabaseContext()); DuplicateResolverResult resolverResult = dialog.showAndWait().orElse(DuplicateResolverResult.BREAK); diff --git a/src/main/java/org/jabref/gui/EntryTypeViewModel.java b/src/main/java/org/jabref/gui/EntryTypeViewModel.java index d023aa48900..766d449f6c4 100644 --- a/src/main/java/org/jabref/gui/EntryTypeViewModel.java +++ b/src/main/java/org/jabref/gui/EntryTypeViewModel.java @@ -1,6 +1,5 @@ package org.jabref.gui; -import java.util.Arrays; import java.util.Optional; import javafx.beans.property.BooleanProperty; @@ -15,7 +14,6 @@ import javafx.concurrent.Task; import javafx.concurrent.Worker; -import org.jabref.gui.importer.ImportInspectionDialog; import org.jabref.logic.bibtex.DuplicateCheck; import org.jabref.logic.bibtexkeypattern.BibtexKeyGenerator; import org.jabref.logic.importer.FetcherException; @@ -138,18 +136,30 @@ public void runFetcherWorker() { fetcherWorker.setOnSucceeded(evt -> { Optional result = fetcherWorker.getValue(); if (result.isPresent()) { - final BibEntry bibEntry = result.get(); - if ((DuplicateCheck.containsDuplicate(basePanel.getDatabase(), bibEntry, basePanel.getBibDatabaseContext().getMode()).isPresent())) { - //If there are duplicates starts ImportInspectionDialog - ImportInspectionDialog diag = new ImportInspectionDialog(basePanel.frame(), basePanel, Localization.lang("Import"), false); - diag.addEntries(Arrays.asList(bibEntry)); - diag.entryListComplete(); - diag.setVisible(true); - diag.toFront(); + final BibEntry entry = result.get(); + Optional duplicate = DuplicateCheck.containsDuplicate(basePanel.getDatabase(), entry, basePanel.getBibDatabaseContext().getMode()); + if ((duplicate.isPresent())) { + DuplicateResolverDialog dialog = new DuplicateResolverDialog(entry, duplicate.get(), DuplicateResolverDialog.DuplicateResolverType.IMPORT_CHECK, basePanel.getBibDatabaseContext()); + switch (dialog.showAndWait().orElse(DuplicateResolverDialog.DuplicateResolverResult.BREAK)) { + case KEEP_LEFT: + basePanel.getDatabase().removeEntry(duplicate.get()); + basePanel.getDatabase().insertEntry(entry); + break; + case KEEP_BOTH: + basePanel.getDatabase().insertEntry(entry); + break; + case KEEP_MERGE: + basePanel.getDatabase().removeEntry(duplicate.get()); + basePanel.getDatabase().insertEntry(dialog.getMergedEntry()); + break; + default: + // Do nothing + break; + } } else { // Regenerate CiteKey of imported BibEntry - new BibtexKeyGenerator(basePanel.getBibDatabaseContext(), prefs.getBibtexKeyPatternPreferences()).generateAndSetKey(bibEntry); - basePanel.insertEntry(bibEntry); + new BibtexKeyGenerator(basePanel.getBibDatabaseContext(), prefs.getBibtexKeyPatternPreferences()).generateAndSetKey(entry); + basePanel.insertEntry(entry); } searchSuccesfulProperty.set(true); diff --git a/src/main/java/org/jabref/gui/JabRefFrame.java b/src/main/java/org/jabref/gui/JabRefFrame.java index e80c93d9386..74144a9ab42 100644 --- a/src/main/java/org/jabref/gui/JabRefFrame.java +++ b/src/main/java/org/jabref/gui/JabRefFrame.java @@ -93,7 +93,7 @@ import org.jabref.gui.help.AboutAction; import org.jabref.gui.help.HelpAction; import org.jabref.gui.importer.ImportCommand; -import org.jabref.gui.importer.ImportInspectionDialog; +import org.jabref.gui.importer.ImportEntriesDialog; import org.jabref.gui.importer.actions.OpenDatabaseAction; import org.jabref.gui.integrity.IntegrityCheckAction; import org.jabref.gui.keyboard.KeyBinding; @@ -107,6 +107,7 @@ import org.jabref.gui.search.GlobalSearchBar; import org.jabref.gui.specialfields.SpecialFieldMenuItemFactory; import org.jabref.gui.undo.CountingUndoManager; +import org.jabref.gui.util.BackgroundTask; import org.jabref.gui.util.DefaultTaskExecutor; import org.jabref.logic.autosaveandbackup.AutosaveManager; import org.jabref.logic.autosaveandbackup.BackupManager; @@ -179,7 +180,6 @@ public class JabRefFrame extends BorderPane implements OutputPrinter { private SidePaneManager sidePaneManager; private TabPane tabbedPane; private PushToApplications pushApplications; - private final CountingUndoManager undoManager = new CountingUndoManager(); private final DialogService dialogService; private SidePane sidePane; @@ -785,7 +785,7 @@ private MenuBar createMenu() { if (Globals.prefs.getBoolean(JabRefPreferences.SPECIALFIELDSENABLED)) { boolean menuItemAdded = false; if (Globals.prefs.getBoolean(JabRefPreferences.SHOWCOLUMN_RANKING)) { - edit.getItems().add(SpecialFieldMenuItemFactory.createSpecialFieldMenuForActiveDatabase(SpecialField.RANKING, factory, undoManager)); + edit.getItems().add(SpecialFieldMenuItemFactory.createSpecialFieldMenuForActiveDatabase(SpecialField.RANKING, factory, Globals.undoManager)); menuItemAdded = true; } @@ -805,12 +805,12 @@ private MenuBar createMenu() { } if (Globals.prefs.getBoolean(JabRefPreferences.SHOWCOLUMN_PRIORITY)) { - edit.getItems().add(SpecialFieldMenuItemFactory.createSpecialFieldMenuForActiveDatabase(SpecialField.PRIORITY, factory, undoManager)); + edit.getItems().add(SpecialFieldMenuItemFactory.createSpecialFieldMenuForActiveDatabase(SpecialField.PRIORITY, factory, Globals.undoManager)); menuItemAdded = true; } if (Globals.prefs.getBoolean(JabRefPreferences.SHOWCOLUMN_READ)) { - edit.getItems().add(SpecialFieldMenuItemFactory.createSpecialFieldMenuForActiveDatabase(SpecialField.READ_STATUS, factory, undoManager)); + edit.getItems().add(SpecialFieldMenuItemFactory.createSpecialFieldMenuForActiveDatabase(SpecialField.READ_STATUS, factory, Globals.undoManager)); menuItemAdded = true; } @@ -1204,21 +1204,16 @@ private boolean readyForAutosave(BibDatabaseContext context) { } /** - * This method does the job of adding imported entries into the active database, or into a new one. It shows the - * ImportInspectionDialog if preferences indicate it should be used. Otherwise it imports directly. + * Opens the import inspection dialog to let the user decide which of the given entries to import. * * @param panel The BasePanel to add to. * @param entries The entries to add. */ private void addImportedEntries(final BasePanel panel, final List entries) { - SwingUtilities.invokeLater(() -> { - ImportInspectionDialog diag = new ImportInspectionDialog(JabRefFrame.this, panel, - Localization.lang("Import"), false); - diag.addEntries(entries); - diag.entryListComplete(); - diag.setVisible(true); - diag.toFront(); - }); + BackgroundTask> task = BackgroundTask.wrap(() -> entries); + ImportEntriesDialog dialog = new ImportEntriesDialog(panel.getBibDatabaseContext(), task); + dialog.setTitle(Localization.lang("Import")); + dialog.showAndWait(); } public FileHistoryMenu getFileHistory() { @@ -1389,7 +1384,7 @@ public GlobalSearchBar getGlobalSearchBar() { } public CountingUndoManager getUndoManager() { - return undoManager; + return Globals.undoManager; } public DialogService getDialogService() { diff --git a/src/main/java/org/jabref/gui/externalfiles/FindUnlinkedFilesDialog.java b/src/main/java/org/jabref/gui/externalfiles/FindUnlinkedFilesDialog.java index f9e0e8a689c..a4892565632 100644 --- a/src/main/java/org/jabref/gui/externalfiles/FindUnlinkedFilesDialog.java +++ b/src/main/java/org/jabref/gui/externalfiles/FindUnlinkedFilesDialog.java @@ -92,8 +92,8 @@ public FindUnlinkedFilesDialog(JabRefFrame frame) { Globals.prefs.getImportFormatPreferences(), Globals.prefs.getUpdateFieldPreferences(), Globals.getFileUpdateMonitor(), - frame.getUndoManager() - ); + frame.getUndoManager(), + Globals.stateManager); initialize(); } diff --git a/src/main/java/org/jabref/gui/externalfiles/ImportHandler.java b/src/main/java/org/jabref/gui/externalfiles/ImportHandler.java index 6d0860f53f0..53189b82dbd 100644 --- a/src/main/java/org/jabref/gui/externalfiles/ImportHandler.java +++ b/src/main/java/org/jabref/gui/externalfiles/ImportHandler.java @@ -1,6 +1,7 @@ package org.jabref.gui.externalfiles; import java.nio.file.Path; +import java.util.Collection; import java.util.Collections; import java.util.List; @@ -9,19 +10,23 @@ import org.jabref.Globals; import org.jabref.gui.DialogService; +import org.jabref.gui.StateManager; import org.jabref.gui.externalfiletype.ExternalFileTypes; import org.jabref.gui.undo.UndoableInsertEntry; +import org.jabref.logic.bibtexkeypattern.BibtexKeyGenerator; import org.jabref.logic.externalfiles.ExternalFilesContentImporter; import org.jabref.logic.importer.ImportFormatPreferences; import org.jabref.logic.util.UpdateField; import org.jabref.logic.util.UpdateFieldPreferences; import org.jabref.logic.util.io.FileUtil; +import org.jabref.model.FieldChange; import org.jabref.model.database.BibDatabaseContext; import org.jabref.model.entry.BibEntry; import org.jabref.model.entry.FieldName; +import org.jabref.model.groups.GroupEntryChanger; +import org.jabref.model.groups.GroupTreeNode; import org.jabref.model.metadata.FilePreferences; import org.jabref.model.util.FileUpdateMonitor; -import org.jabref.preferences.JabRefPreferences; public class ImportHandler { @@ -32,6 +37,7 @@ public class ImportHandler { private final ExternalFilesEntryLinker linker; private final ExternalFilesContentImporter contentImporter; private final UndoManager undoManager; + private final StateManager stateManager; public ImportHandler(DialogService dialogService, BibDatabaseContext database, @@ -40,12 +46,14 @@ public ImportHandler(DialogService dialogService, ImportFormatPreferences importFormatPreferences, UpdateFieldPreferences updateFieldPreferences, FileUpdateMonitor fileupdateMonitor, - UndoManager undoManager) { + UndoManager undoManager, + StateManager stateManager) { this.dialogService = dialogService; this.database = database; this.updateFieldPreferences = updateFieldPreferences; this.fileUpdateMonitor = fileupdateMonitor; + this.stateManager = stateManager; this.linker = new ExternalFilesEntryLinker(externalFileTypes, filePreferences, database); this.contentImporter = new ExternalFilesContentImporter(importFormatPreferences); @@ -83,7 +91,7 @@ public void importAsNewEntries(List files) { entriesToAdd = Collections.singletonList(createEmptyEntryWithLink(file)); } - insertEntries(entriesToAdd); + importEntries(entriesToAdd); entriesToAdd.forEach(entry -> ce.addEdit(new UndoableInsertEntry(database.getDatabase(), entry))); } ce.end(); @@ -99,15 +107,52 @@ private BibEntry createEmptyEntryWithLink(Path file) { public void importEntriesFromBibFiles(Path bibFile) { List entriesToImport = contentImporter.importFromBibFile(bibFile, fileUpdateMonitor); - insertEntries(entriesToImport); + importEntries(entriesToImport); } - private void insertEntries(List entries) { + public void importEntries(List entries) { + //TODO: Add undo/redo + //ce.addEdit(new UndoableInsertEntry(panel.getDatabase(), entry)); + database.getDatabase().insertEntries(entries); - if (Globals.prefs.getBoolean(JabRefPreferences.USE_OWNER)) { - // Set owner field to default value - UpdateField.setAutomaticFields(entries, true, true, updateFieldPreferences); + // Set owner/timestamp + UpdateField.setAutomaticFields(entries, updateFieldPreferences); + + // Generate bibtex keys + generateKeys(entries); + + // Add to group + addToGroups(entries, stateManager.getSelectedGroup(database)); + } + + private void addToGroups(List entries, Collection groups) { + for (GroupTreeNode node : groups) { + if (node.getGroup() instanceof GroupEntryChanger) { + GroupEntryChanger entryChanger = (GroupEntryChanger) node.getGroup(); + List undo = entryChanger.add(entries); + // TODO: Add undo + //if (!undo.isEmpty()) { + // ce.addEdit(UndoableChangeEntriesOfGroup.getUndoableEdit(new GroupTreeNodeViewModel(node), + // undo)); + //} + } + } + } + + /** + * Generate keys for given entries. + * + * @param entries entries to generate keys for + */ + private void generateKeys(List entries) { + BibtexKeyGenerator keyGenerator = new BibtexKeyGenerator( + database.getMetaData().getCiteKeyPattern(Globals.prefs.getBibtexKeyPatternPreferences().getKeyPattern()), + database.getDatabase(), + Globals.prefs.getBibtexKeyPatternPreferences()); + + for (BibEntry entry : entries) { + keyGenerator.generateAndSetKey(entry); } } } diff --git a/src/main/java/org/jabref/gui/icon/IconTheme.java b/src/main/java/org/jabref/gui/icon/IconTheme.java index 55341a664d0..fbb97842ecf 100644 --- a/src/main/java/org/jabref/gui/icon/IconTheme.java +++ b/src/main/java/org/jabref/gui/icon/IconTheme.java @@ -44,6 +44,7 @@ public class IconTheme { */ public static final Color DEFAULT_COLOR = JabRefPreferences.getInstance().getColor(JabRefPreferences.ICON_ENABLED_COLOR); public static final Color DEFAULT_DISABLED_COLOR = JabRefPreferences.getInstance().getColor(JabRefPreferences.ICON_DISABLED_COLOR); + public static final javafx.scene.paint.Color SELECTED_COLOR = javafx.scene.paint.Color.web("#50618F"); public static Font FONT; private static final String DEFAULT_ICON_PATH = "/images/external/red.png"; private static final Logger LOGGER = LoggerFactory.getLogger(IconTheme.class); @@ -179,6 +180,7 @@ public static List getLogoSetFX() { public enum JabRefIcons implements JabRefIcon { ADD(MaterialDesignIcon.PLUS_CIRCLE_OUTLINE), + ADD_FILLED(MaterialDesignIcon.PLUS_CIRCLE), ADD_NOBOX(MaterialDesignIcon.PLUS), ADD_ENTRY(MaterialDesignIcon.BOOKMARK_PLUS), EDIT_ENTRY(MaterialDesignIcon.TOOLTIP_EDIT), @@ -314,7 +316,9 @@ public enum JabRefIcons implements JabRefIcon { NEW_FILE(MaterialDesignIcon.PLUS), DOWNLOAD(MaterialDesignIcon.DOWNLOAD), OWNER(MaterialDesignIcon.ACCOUNT), - CLOSE_JABREF(MaterialDesignIcon.GLASSDOOR); + CLOSE_JABREF(MaterialDesignIcon.GLASSDOOR), + ARTICLE(MaterialDesignIcon.FILE_DOCUMENT), + BOOK(MaterialDesignIcon.BOOK_OPEN_PAGE_VARIANT); private final JabRefIcon icon; diff --git a/src/main/java/org/jabref/gui/importer/ImportAction.java b/src/main/java/org/jabref/gui/importer/ImportAction.java index f81bb517c9e..99fa2b36f33 100644 --- a/src/main/java/org/jabref/gui/importer/ImportAction.java +++ b/src/main/java/org/jabref/gui/importer/ImportAction.java @@ -9,9 +9,8 @@ import java.util.Optional; import java.util.stream.Collectors; -import javax.swing.SwingUtilities; - import org.jabref.Globals; +import org.jabref.JabRefException; import org.jabref.gui.BasePanel; import org.jabref.gui.DialogService; import org.jabref.gui.JabRefFrame; @@ -24,6 +23,7 @@ import org.jabref.logic.l10n.Localization; import org.jabref.logic.util.UpdateField; import org.jabref.model.database.BibDatabase; +import org.jabref.model.database.BibDatabaseContext; import org.jabref.model.database.KeyCollisionException; import org.jabref.model.entry.BibEntry; import org.jabref.model.entry.BibtexString; @@ -37,10 +37,6 @@ public class ImportAction { private Exception importError; private final TaskExecutor taskExecutor = Globals.TASK_EXECUTOR; - public ImportAction(JabRefFrame frame, boolean openInNew) { - this(frame, openInNew, null); - } - public ImportAction(JabRefFrame frame, boolean openInNew, Importer importer) { this.importer = Optional.ofNullable(importer); this.frame = frame; @@ -54,53 +50,41 @@ public ImportAction(JabRefFrame frame, boolean openInNew, Importer importer) { */ public void automatedImport(List filenames) { List files = filenames.stream().map(Paths::get).collect(Collectors.toList()); - BackgroundTask.wrap(() -> doImport(files)) - .onSuccess(this::reportResult) - .executeWith(taskExecutor); - } - - private void reportResult(List imports) { - // Ok, done. Then try to gather in all we have found. Since we might - // have found - // one or more bibtex results, it's best to gather them in a - // BibDatabase. - ParserResult bibtexResult = mergeImportResults(imports); - - /* show parserwarnings, if any. */ - for (ImportFormatReader.UnknownFormatImport p : imports) { - if (p != null) { - ParserResult pr = p.parserResult; - ParserResultWarningDialog.showParserResultWarningDialog(pr, frame); - } - } - - if (bibtexResult == null) { - if (importer == null) { - frame.output(Localization.lang("Could not find a suitable import format.")); - } else { - // Import in a specific format was specified. Check if we have stored error information: + BackgroundTask> task = BackgroundTask.wrap(() -> { + List imports = doImport(files); + // Ok, done. Then try to gather in all we have found. Since we might + // have found + // one or more bibtex results, it's best to gather them in a + // BibDatabase. + ParserResult bibtexResult = mergeImportResults(imports); + + // TODO: show parserwarnings, if any (not here) + // for (ImportFormatReader.UnknownFormatImport p : imports) { + // ParserResultWarningDialog.showParserResultWarningDialog(p.parserResult, frame); + //} + if (bibtexResult == null) { if (importError == null) { - dialogService.showErrorDialogAndWait(Localization.lang("Import failed"), - Localization.lang("No entries found. Please make sure you are using the correct import filter.")); + throw new JabRefException(Localization.lang("No entries found. Please make sure you are using the correct import filter.")); } else { - dialogService.showErrorDialogAndWait(Localization.lang("Import failed"), importError); + throw importError; } } + + return bibtexResult.getDatabase().getEntries(); + }); + + if (openInNew) { + task.onSuccess(entries -> { + frame.addTab(new BibDatabaseContext(new BibDatabase(entries)), true); + dialogService.notify(Localization.lang("Imported entries") + ": " + entries.size()); + }) + .executeWith(taskExecutor); } else { - if (openInNew) { - frame.addTab(bibtexResult.getDatabaseContext(), true); - frame.output(Localization.lang("Imported entries") + ": " + bibtexResult.getDatabase().getEntryCount()); - } else { - final BasePanel panel = frame.getCurrentBasePanel(); - - SwingUtilities.invokeLater(() -> { - ImportInspectionDialog diag = new ImportInspectionDialog(frame, panel, Localization.lang("Import"), false); - diag.addEntries(bibtexResult.getDatabase().getEntries()); - diag.entryListComplete(); - diag.setVisible(true); - diag.toFront(); - }); - } + final BasePanel panel = frame.getCurrentBasePanel(); + + ImportEntriesDialog dialog = new ImportEntriesDialog(panel.getBibDatabaseContext(), task); + dialog.setTitle(Localization.lang("Import")); + dialog.showAndWait(); } } diff --git a/src/main/java/org/jabref/gui/importer/ImportEntriesDialog.css b/src/main/java/org/jabref/gui/importer/ImportEntriesDialog.css new file mode 100644 index 00000000000..81442716e85 --- /dev/null +++ b/src/main/java/org/jabref/gui/importer/ImportEntriesDialog.css @@ -0,0 +1,15 @@ +.addEntryButton { + -fx-font-size: 2em; +} + +.entry-container { + /*-fx-padding: 0.5em 0em 0.5em 0em;*/ +} + +.list-cell { + -fx-padding: 0.5em 0 1em 0.5em; +} + +.list-cell:entry-selected { + -fx-background-color: derive(-jr-selected, 60%); +} diff --git a/src/main/java/org/jabref/gui/importer/ImportEntriesDialog.fxml b/src/main/java/org/jabref/gui/importer/ImportEntriesDialog.fxml new file mode 100644 index 00000000000..005abb8ca28 --- /dev/null +++ b/src/main/java/org/jabref/gui/importer/ImportEntriesDialog.fxml @@ -0,0 +1,26 @@ + + + + + + + + + + + + +