From 85682e90cae2a7d048d7bb81c039bfc0aebd90fe Mon Sep 17 00:00:00 2001 From: Tobias Diez Date: Thu, 21 Feb 2019 22:19:56 +0100 Subject: [PATCH 1/3] Rework import inspection dialog in JavaFX --- src/main/java/org/jabref/Globals.java | 2 + src/main/java/org/jabref/gui/Base.css | 35 + .../java/org/jabref/gui/DefaultInjector.java | 7 +- .../jabref/gui/DuplicateResolverDialog.java | 16 +- .../java/org/jabref/gui/DuplicateSearch.java | 2 +- .../org/jabref/gui/EntryTypeViewModel.java | 34 +- src/main/java/org/jabref/gui/JabRefFrame.java | 27 +- .../FindUnlinkedFilesDialog.java | 4 +- .../gui/externalfiles/ImportHandler.java | 61 +- .../java/org/jabref/gui/icon/IconTheme.java | 6 +- .../org/jabref/gui/importer/ImportAction.java | 80 +- .../gui/importer/ImportEntriesDialog.css | 11 + .../gui/importer/ImportEntriesDialog.fxml | 24 + .../gui/importer/ImportEntriesDialog.java | 158 ++ .../gui/importer/ImportEntriesViewModel.java | 176 ++ .../gui/importer/ImportInspectionDialog.java | 1411 ----------------- .../fetcher/WebSearchPaneViewModel.java | 30 +- .../org/jabref/gui/maintable/MainTable.java | 3 +- .../preferences/BibtexKeyPatternPrefTab.java | 4 - .../jabref/gui/search/GlobalSearchBar.java | 25 +- .../gui/search/matchers/SearchMatcher.java | 19 - .../org/jabref/gui/util/BackgroundTask.java | 5 + .../org/jabref/gui/util/TextFlowLimited.java | 81 + .../jabref/model/database/BibDatabase.java | 9 +- .../java/org/jabref/model/entry/BibEntry.java | 19 - .../jabref/preferences/JabRefPreferences.java | 6 - 26 files changed, 661 insertions(+), 1594 deletions(-) create mode 100644 src/main/java/org/jabref/gui/importer/ImportEntriesDialog.css create mode 100644 src/main/java/org/jabref/gui/importer/ImportEntriesDialog.fxml create mode 100644 src/main/java/org/jabref/gui/importer/ImportEntriesDialog.java create mode 100644 src/main/java/org/jabref/gui/importer/ImportEntriesViewModel.java delete mode 100644 src/main/java/org/jabref/gui/importer/ImportInspectionDialog.java delete mode 100644 src/main/java/org/jabref/gui/search/matchers/SearchMatcher.java create mode 100644 src/main/java/org/jabref/gui/util/TextFlowLimited.java diff --git a/src/main/java/org/jabref/Globals.java b/src/main/java/org/jabref/Globals.java index b86cc83cbd2..634e5ffee85 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; @@ -62,6 +63,7 @@ public class Globals { private static DefaultFileUpdateMonitor fileUpdateMonitor; private static ThemeLoader themeLoader; private static TelemetryClient telemetryClient; + public static CountingUndoManager undoManager = new CountingUndoManager(); private Globals() { } diff --git a/src/main/java/org/jabref/gui/Base.css b/src/main/java/org/jabref/gui/Base.css index ec78513a06b..4da6ec88b8c 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; } @@ -975,3 +980,33 @@ We want to have a look that matches our icons in the tool-bar */ .color-palette-region .button { -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; +} diff --git a/src/main/java/org/jabref/gui/DefaultInjector.java b/src/main/java/org/jabref/gui/DefaultInjector.java index e94e6fe8697..23cb5e93521 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; @@ -40,7 +42,10 @@ private static Object createDependency(Class clazz) { return Globals.getFileUpdateMonitor(); } else if (clazz == ClipBoardManager.class) { return Globals.clipboardManager; - } else { + } else if (clazz == UndoManager.class) { + return Globals.undoManager; + } + { try { return clazz.newInstance(); } catch (InstantiationException | IllegalAccessException ex) { 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 8e4ca768b05..6df86a6f76d 100644 --- a/src/main/java/org/jabref/gui/JabRefFrame.java +++ b/src/main/java/org/jabref/gui/JabRefFrame.java @@ -92,7 +92,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; @@ -103,6 +103,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; @@ -176,7 +177,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; @@ -794,7 +794,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; } @@ -814,12 +814,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; } @@ -1221,21 +1221,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() { @@ -1406,7 +1401,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 5c0510f862a..5d271c203f1 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), @@ -312,7 +314,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..0fe81f0b524 --- /dev/null +++ b/src/main/java/org/jabref/gui/importer/ImportEntriesDialog.css @@ -0,0 +1,11 @@ +.addEntryButton { + -fx-font-size: 2em; +} + +.entry-container { + /*-fx-padding: 0.5em 0em 0.5em 0em;*/ +} + +.entry-container: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..db855229fe6 --- /dev/null +++ b/src/main/java/org/jabref/gui/importer/ImportEntriesDialog.fxml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + +