diff --git a/CHANGELOG.md b/CHANGELOG.md index 44886a9fd5c..fede47dc032 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,7 @@ to [sourceforge feature requests](https://sourceforge.net/p/jabref/features/) by - Implemented [#668](https://github.com/JabRef/jabref/issues/668): Replace clear with icon to reduce search bar width - Improved layout for OSX: Toolbar buttons and search field - Migrated JabRef help to markdown at https://github.com/JabRef/help.jabref.org +- BibTeX and BibLaTeX mode is now file based and can be switched at runtime. The information is stored in the .bib file, and if it is not there detected by the entry types. ### Fixed - Make BibTex parser more robust against missing newlines diff --git a/src/main/java/net/sf/jabref/BibDatabaseContext.java b/src/main/java/net/sf/jabref/BibDatabaseContext.java new file mode 100644 index 00000000000..a76d7260541 --- /dev/null +++ b/src/main/java/net/sf/jabref/BibDatabaseContext.java @@ -0,0 +1,82 @@ +package net.sf.jabref; + +import net.sf.jabref.model.database.BibDatabase; +import net.sf.jabref.model.database.BibDatabaseMode; +import net.sf.jabref.model.database.BibDatabaseModeDetection; + +import java.io.File; +import java.util.Collections; +import java.util.List; +import java.util.Objects; + +/** + * Represents everything related to a .bib file. + *

+ * The entries are stored in BibDatabase, the other data in MetaData and the options relevant for this file in Defaults. + */ +public class BibDatabaseContext { + + private final BibDatabase database; + private final MetaData metaData; + private final Defaults defaults; + + public BibDatabaseContext(Defaults defaults) { + this(new BibDatabase(), defaults); + } + + public BibDatabaseContext(BibDatabase database, Defaults defaults) { + this(database, new MetaData(), defaults); + } + + public BibDatabaseContext(BibDatabase database, MetaData metaData, Defaults defaults) { + this.defaults = Objects.requireNonNull(defaults); + this.database = Objects.requireNonNull(database); + this.metaData = Objects.requireNonNull(metaData); + + this.setMode(getMode()); + } + + public BibDatabaseContext(BibDatabase database, MetaData metaData, File file, Defaults defaults) { + this(database, metaData, defaults); + + this.metaData.setFile(file); + } + + public BibDatabaseMode getMode() { + List data = metaData.getData(MetaData.DATABASE_TYPE); + if (data == null) { + BibDatabaseMode inferredMode = BibDatabaseModeDetection.inferMode(database); + if (defaults.mode == BibDatabaseMode.BIBLATEX || inferredMode == BibDatabaseMode.BIBLATEX) { + return BibDatabaseMode.BIBLATEX; + } else { + return BibDatabaseMode.BIBTEX; + } + } + return BibDatabaseMode.valueOf(data.get(0).toUpperCase()); + } + + public void setMode(BibDatabaseMode bibDatabaseMode) { + metaData.putData(MetaData.DATABASE_TYPE, Collections.singletonList(bibDatabaseMode.getFormattedName())); + } + + /** + * Get the file where this database was last saved to or loaded from, if any. + * + * @return The relevant File, or null if none is defined. + */ + public File getDatabaseFile() { + return metaData.getFile(); + } + + public BibDatabase getDatabase() { + return database; + } + + public MetaData getMetaData() { + return metaData; + } + + public boolean isBiblatexMode() { + return getMode() == BibDatabaseMode.BIBLATEX; + } +} diff --git a/src/main/java/net/sf/jabref/JabRef.java b/src/main/java/net/sf/jabref/JabRef.java index 023b31850ed..f835cfea166 100644 --- a/src/main/java/net/sf/jabref/JabRef.java +++ b/src/main/java/net/sf/jabref/JabRef.java @@ -41,6 +41,7 @@ import net.sf.jabref.logic.util.strings.StringUtil; import net.sf.jabref.migrations.PreferencesMigrations; import net.sf.jabref.model.database.BibDatabase; +import net.sf.jabref.model.database.BibDatabaseMode; import net.sf.jabref.model.entry.BibEntry; import net.sf.jabref.util.Util; import net.sf.jabref.wizard.auximport.AuxCommandLine; @@ -308,8 +309,9 @@ public Optional> processArguments(String[] args, boolean in if (!pr.isInvalid()) { try { System.out.println(Localization.lang("Saving") + ": " + data[0]); + Defaults defaults = new Defaults(BibDatabaseMode.fromPreference(Globals.prefs.getBoolean(JabRefPreferences.BIBLATEX_MODE))); SaveSession session = FileActions.saveDatabase( - new LoadedDatabase(pr.getDatabase(), pr.getMetaData()), + new BibDatabaseContext(pr.getDatabase(), pr.getMetaData(), defaults), new File(data[0]), Globals.prefs, false, false, Globals.prefs.getDefaultEncoding(), false); // Show just a warning message if encoding didn't work for all characters: @@ -397,7 +399,8 @@ public Optional> processArguments(String[] args, boolean in try { System.out.println(Localization.lang("Saving") + ": " + subName); - SaveSession session = FileActions.saveDatabase(new LoadedDatabase(newBase, new MetaData()), + Defaults defaults = new Defaults(BibDatabaseMode.fromPreference(Globals.prefs.getBoolean(JabRefPreferences.BIBLATEX_MODE))); + SaveSession session = FileActions.saveDatabase(new BibDatabaseContext(newBase, defaults), new File(subName), Globals.prefs, false, false, Globals.prefs.getDefaultEncoding(), false); // Show just a warning message if encoding didn't work for all characters: diff --git a/src/main/java/net/sf/jabref/JabRefPreferences.java b/src/main/java/net/sf/jabref/JabRefPreferences.java index 6b165b9ca02..68018319708 100644 --- a/src/main/java/net/sf/jabref/JabRefPreferences.java +++ b/src/main/java/net/sf/jabref/JabRefPreferences.java @@ -83,6 +83,7 @@ public final class JabRefPreferences { public static final String ABBR_AUTHOR_NAMES = "abbrAuthorNames"; public static final String NAMES_NATBIB = "namesNatbib"; public static final String NAMES_FIRST_LAST = "namesFf"; + public static final String BIBLATEX_MODE = "biblatexMode"; public static final String NAMES_AS_IS = "namesAsIs"; public static final String TABLE_COLOR_CODES_ON = "tableColorCodesOn"; public static final String ENTRY_EDITOR_HEIGHT = "entryEditorHeight"; @@ -430,6 +431,8 @@ private JabRefPreferences() { defaults.put(LATEX_EDITOR_PATH, OS.guessProgramPath("LEd", "LEd")); defaults.put(TEXSTUDIO_PATH, OS.guessProgramPath("texstudio", "TeXstudio")); + defaults.put(BIBLATEX_MODE, false); + if (OS.OS_X) { //defaults.put(JabRefPreferences.PDFVIEWER, "/Applications/Preview.app"); //defaults.put(JabRefPreferences.PSVIEWER, "/Applications/Preview.app"); diff --git a/src/main/java/net/sf/jabref/LoadedDatabase.java b/src/main/java/net/sf/jabref/LoadedDatabase.java deleted file mode 100644 index bbd33caa8d2..00000000000 --- a/src/main/java/net/sf/jabref/LoadedDatabase.java +++ /dev/null @@ -1,71 +0,0 @@ -package net.sf.jabref; - -import net.sf.jabref.model.database.BibDatabase; -import net.sf.jabref.model.database.BibDatabaseMode; -import net.sf.jabref.model.database.BibDatabaseModeDetection; - -import java.io.File; -import java.util.Objects; -import java.util.Vector; - -public class LoadedDatabase { - - private final BibDatabase database; - private final MetaData metaData; - - public LoadedDatabase() { - this(new BibDatabase()); - } - - public LoadedDatabase(BibDatabase database) { - this(database, new MetaData()); - } - - public LoadedDatabase(BibDatabase database, MetaData metaData) { - this.database = Objects.requireNonNull(database); - this.metaData = Objects.requireNonNull(metaData); - - this.setMode(getMode()); - } - - public LoadedDatabase(BibDatabase database, MetaData metaData, File file) { - this(database, metaData); - - this.metaData.setFile(file); - } - - public BibDatabaseMode getMode() { - Vector data = metaData.getData(MetaData.DATABASE_TYPE); - if(data == null) { - return BibDatabaseModeDetection.inferMode(database); - } - return BibDatabaseMode.valueOf(data.get(0)); - } - - public void setMode(BibDatabaseMode bibDatabaseMode) { - Vector list = new Vector<>(); - list.add(bibDatabaseMode.name()); - metaData.putData(MetaData.DATABASE_TYPE, list); - } - - /** - * Get the file where this database was last saved to or loaded from, if any. - * - * @return The relevant File, or null if none is defined. - */ - public File getDatabaseFile() { - return metaData.getFile(); - } - - public BibDatabase getDatabase() { - return database; - } - - public MetaData getMetaData() { - return metaData; - } - - public boolean isBiblatexMode() { - return getMode() == BibDatabaseMode.BIBLATEX; - } -} diff --git a/src/main/java/net/sf/jabref/collab/ChangeScanner.java b/src/main/java/net/sf/jabref/collab/ChangeScanner.java index b7ff7d414e3..0b358b42cff 100644 --- a/src/main/java/net/sf/jabref/collab/ChangeScanner.java +++ b/src/main/java/net/sf/jabref/collab/ChangeScanner.java @@ -23,6 +23,7 @@ import javax.swing.SwingUtilities; import javax.swing.tree.DefaultMutableTreeNode; +import net.sf.jabref.model.database.BibDatabaseMode; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -77,7 +78,7 @@ public ChangeScanner(JabRefFrame frame, BasePanel bp, File file) { //, BibDataba this.panel = bp; this.frame = frame; this.inMem = bp.database(); - this.mdInMem = bp.getLoadedDatabase().getMetaData(); + this.mdInMem = bp.getBibDatabaseContext().getMetaData(); this.f = file; } @@ -158,7 +159,8 @@ private void storeTempDatabase() { @Override public void run() { try { - SaveSession ss = FileActions.saveDatabase(new LoadedDatabase(inTemp, mdInTemp), + Defaults defaults = new Defaults(BibDatabaseMode.fromPreference(Globals.prefs.getBoolean(JabRefPreferences.BIBLATEX_MODE))); + SaveSession ss = FileActions.saveDatabase(new BibDatabaseContext(inTemp, mdInTemp, defaults), Globals.fileUpdateMonitor.getTempFile(panel.fileMonitorHandle()), Globals.prefs, false, false, panel.getEncoding(), true); ss.commit(); diff --git a/src/main/java/net/sf/jabref/collab/GroupChange.java b/src/main/java/net/sf/jabref/collab/GroupChange.java index 9a9ac97e9f4..8a2d6662454 100644 --- a/src/main/java/net/sf/jabref/collab/GroupChange.java +++ b/src/main/java/net/sf/jabref/collab/GroupChange.java @@ -41,9 +41,9 @@ public GroupChange(GroupTreeNode changedGroups, GroupTreeNode tmpGroupRoot) { @Override public boolean makeChange(BasePanel panel, BibDatabase secondary, NamedCompound undoEdit) { - final GroupTreeNode root = panel.getLoadedDatabase().getMetaData().getGroups(); + final GroupTreeNode root = panel.getBibDatabaseContext().getMetaData().getGroups(); final UndoableModifySubtree undo = new UndoableModifySubtree( - panel.getGroupSelector(), panel.getLoadedDatabase().getMetaData().getGroups(), + panel.getGroupSelector(), panel.getBibDatabaseContext().getMetaData().getGroups(), root, Localization.lang("Modified groups")); root.removeAllChildren(); if (changedGroups == null) { diff --git a/src/main/java/net/sf/jabref/exporter/AutoSaveManager.java b/src/main/java/net/sf/jabref/exporter/AutoSaveManager.java index 7f9376f0a97..145dfdcf5bc 100644 --- a/src/main/java/net/sf/jabref/exporter/AutoSaveManager.java +++ b/src/main/java/net/sf/jabref/exporter/AutoSaveManager.java @@ -15,15 +15,14 @@ */ package net.sf.jabref.exporter; -import net.sf.jabref.LoadedDatabase; +import net.sf.jabref.BibDatabaseContext; +import net.sf.jabref.Defaults; import net.sf.jabref.gui.JabRefFrame; import net.sf.jabref.gui.BasePanel; import net.sf.jabref.Globals; import net.sf.jabref.JabRefPreferences; +import net.sf.jabref.model.database.BibDatabaseMode; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.StandardCopyOption; import java.util.Timer; import java.util.TimerTask; import java.util.List; @@ -72,7 +71,7 @@ public void run() { } for (BasePanel panel : panels) { - if (panel.isModified() && (panel.getLoadedDatabase().getDatabaseFile() != null)) { + if (panel.isModified() && (panel.getBibDatabaseContext().getDatabaseFile() != null)) { AutoSaveManager.autoSave(panel); } } @@ -95,10 +94,11 @@ public static File getAutoSaveFile(File f) { * @return true if successful, false otherwise. */ private static boolean autoSave(BasePanel panel) { - File databaseFile = panel.getLoadedDatabase().getDatabaseFile(); + File databaseFile = panel.getBibDatabaseContext().getDatabaseFile(); File backupFile = AutoSaveManager.getAutoSaveFile(databaseFile); try { - SaveSession ss = FileActions.saveDatabase(new LoadedDatabase(panel.database(), panel.getLoadedDatabase().getMetaData()), + Defaults defaults = new Defaults(BibDatabaseMode.fromPreference(Globals.prefs.getBoolean(JabRefPreferences.BIBLATEX_MODE))); + SaveSession ss = FileActions.saveDatabase(new BibDatabaseContext(panel.database(), panel.getBibDatabaseContext().getMetaData(), defaults), backupFile, Globals.prefs, false, false, panel.getEncoding(), true); ss.commit(); } catch (SaveException e) { @@ -117,10 +117,10 @@ private static boolean autoSave(BasePanel panel) { * @return true if there was no autosave or if the autosave was successfully deleted, false otherwise. */ public static boolean deleteAutoSaveFile(BasePanel panel) { - if (panel.getLoadedDatabase().getDatabaseFile() == null) { + if (panel.getBibDatabaseContext().getDatabaseFile() == null) { return true; } - File backupFile = AutoSaveManager.getAutoSaveFile(panel.getLoadedDatabase().getDatabaseFile()); + File backupFile = AutoSaveManager.getAutoSaveFile(panel.getBibDatabaseContext().getDatabaseFile()); if (backupFile.exists()) { return backupFile.delete(); } else { diff --git a/src/main/java/net/sf/jabref/exporter/ExportFormats.java b/src/main/java/net/sf/jabref/exporter/ExportFormats.java index bf84768ce36..6948bdbdbf5 100644 --- a/src/main/java/net/sf/jabref/exporter/ExportFormats.java +++ b/src/main/java/net/sf/jabref/exporter/ExportFormats.java @@ -207,10 +207,10 @@ public void actionPerformed(ActionEvent e) { // Set the global variable for this database's file directory before exporting, // so formatters can resolve linked files correctly. // (This is an ugly hack!) - Globals.prefs.fileDirForDatabase = frame.getCurrentBasePanel().getLoadedDatabase().getMetaData() + Globals.prefs.fileDirForDatabase = frame.getCurrentBasePanel().getBibDatabaseContext().getMetaData() .getFileDirectory(Globals.FILE_FIELD).toArray(new String[0]); // Also store the database's file in a global variable: - Globals.prefs.databaseFile = frame.getCurrentBasePanel().getLoadedDatabase().getDatabaseFile(); + Globals.prefs.databaseFile = frame.getCurrentBasePanel().getBibDatabaseContext().getDatabaseFile(); // Make sure we remember which filter was used, to set // the default for next time: @@ -228,7 +228,7 @@ public void actionPerformed(ActionEvent e) { public void run() { try { format.performExport(frame.getCurrentBasePanel().database(), - frame.getCurrentBasePanel().getLoadedDatabase().getMetaData(), + frame.getCurrentBasePanel().getBibDatabaseContext().getMetaData(), finFile.getPath(), frame .getCurrentBasePanel().getEncoding(), finEntryIDs); } catch (Exception ex) { diff --git a/src/main/java/net/sf/jabref/exporter/ExportToClipboardAction.java b/src/main/java/net/sf/jabref/exporter/ExportToClipboardAction.java index 75755681f4d..d316e4ec765 100644 --- a/src/main/java/net/sf/jabref/exporter/ExportToClipboardAction.java +++ b/src/main/java/net/sf/jabref/exporter/ExportToClipboardAction.java @@ -100,10 +100,10 @@ public void run() { // Set the global variable for this database's file directory before exporting, // so formatters can resolve linked files correctly. // (This is an ugly hack!) - Globals.prefs.fileDirForDatabase = frame.getCurrentBasePanel().getLoadedDatabase().getMetaData() + Globals.prefs.fileDirForDatabase = frame.getCurrentBasePanel().getBibDatabaseContext().getMetaData() .getFileDirectory(Globals.FILE_FIELD).toArray(new String[0]); // Also store the database's file in a global variable: - Globals.prefs.databaseFile = frame.getCurrentBasePanel().getLoadedDatabase().getDatabaseFile(); + Globals.prefs.databaseFile = frame.getCurrentBasePanel().getBibDatabaseContext().getDatabaseFile(); File tmp = null; try { @@ -118,7 +118,7 @@ public void run() { } // Write to file: - format.performExport(database, panel.getLoadedDatabase().getMetaData(), + format.performExport(database, panel.getBibDatabaseContext().getMetaData(), tmp.getPath(), panel.getEncoding(), entries); // Read the file and put the contents on the clipboard: StringBuilder sb = new StringBuilder(); diff --git a/src/main/java/net/sf/jabref/exporter/FileActions.java b/src/main/java/net/sf/jabref/exporter/FileActions.java index 3203bf2797c..224842c2f52 100644 --- a/src/main/java/net/sf/jabref/exporter/FileActions.java +++ b/src/main/java/net/sf/jabref/exporter/FileActions.java @@ -171,7 +171,7 @@ private static void writeBibFileHeader(Writer out, Charset encoding) throws IOEx * let the user save only the results of a search. False and false means all * entries are saved. */ - public static SaveSession saveDatabase(LoadedDatabase loadedDatabase, File target, JabRefPreferences prefs, + public static SaveSession saveDatabase(BibDatabaseContext bibDatabaseContext, File target, JabRefPreferences prefs, boolean checkSearch, boolean checkGroup, Charset encoding, boolean suppressBackup) throws SaveException { @@ -205,18 +205,18 @@ public static SaveSession saveDatabase(LoadedDatabase loadedDatabase, File targe FileActions.writeBibFileHeader(writer, encoding); // Write preamble if there is one. - FileActions.writePreamble(writer, loadedDatabase.getDatabase().getPreamble()); + FileActions.writePreamble(writer, bibDatabaseContext.getDatabase().getPreamble()); // Write strings if there are any. - FileActions.writeStrings(writer, loadedDatabase.getDatabase()); + FileActions.writeStrings(writer, bibDatabaseContext.getDatabase()); // Write database entries. Take care, using CrossRefEntry- // Comparator, that referred entries occur after referring // ones. Apart from crossref requirements, entries will be // sorted as they appear on the screen. - List sorter = FileActions.getSortedEntries(loadedDatabase.getDatabase(), loadedDatabase.getMetaData(), null, true); + List sorter = FileActions.getSortedEntries(bibDatabaseContext.getDatabase(), bibDatabaseContext.getMetaData(), null, true); - sorter = FileActions.applySaveActions(sorter, loadedDatabase.getMetaData()); + sorter = FileActions.applySaveActions(sorter, bibDatabaseContext.getMetaData()); BibEntryWriter bibtexEntryWriter = new BibEntryWriter(new LatexFieldFormatter(), true); @@ -226,9 +226,9 @@ public static SaveSession saveDatabase(LoadedDatabase loadedDatabase, File targe // Check if we must write the type definition for this // entry, as well. Our criterion is that all non-standard // types (*not* customized standard types) must be written. - EntryType entryType = EntryTypes.getType(entry.getType(), loadedDatabase.getMode()); + EntryType entryType = EntryTypes.getType(entry.getType(), bibDatabaseContext.getMode()); - if (EntryTypes.getStandardType(entryType.getName(), loadedDatabase.getMode()) == null) { + if (EntryTypes.getStandardType(entryType.getName(), bibDatabaseContext.getMode()) == null) { types.put(entryType.getName(), entryType); } @@ -244,13 +244,13 @@ public static SaveSession saveDatabase(LoadedDatabase loadedDatabase, File targe } if (write) { - bibtexEntryWriter.write(entry, writer, loadedDatabase.getMode()); + bibtexEntryWriter.write(entry, writer, bibDatabaseContext.getMode()); } } // Write meta data. - if (loadedDatabase.getMetaData() != null) { - loadedDatabase.getMetaData().writeMetaData(writer); + if (bibDatabaseContext.getMetaData() != null) { + bibDatabaseContext.getMetaData().writeMetaData(writer); } // Write type definitions, if any: @@ -266,8 +266,8 @@ public static SaveSession saveDatabase(LoadedDatabase loadedDatabase, File targe } //finally write whatever remains of the file, but at least a concluding newline - if ((loadedDatabase.getDatabase().getEpilog() != null) && !(loadedDatabase.getDatabase().getEpilog().isEmpty())) { - writer.write(loadedDatabase.getDatabase().getEpilog()); + if ((bibDatabaseContext.getDatabase().getEpilog() != null) && !(bibDatabaseContext.getDatabase().getEpilog().isEmpty())) { + writer.write(bibDatabaseContext.getDatabase().getEpilog()); } else { writer.write(Globals.NEWLINE); } @@ -378,7 +378,7 @@ private static List> getSaveComparators(boolean isSaveOpera * * @return A List containing warnings, if any. */ - public static SaveSession savePartOfDatabase(LoadedDatabase loadedDatabase, File target, + public static SaveSession savePartOfDatabase(BibDatabaseContext bibDatabaseContext, File target, JabRefPreferences prefs, BibEntry[] bes, Charset encoding, DatabaseSaveType saveType) throws SaveException { @@ -406,16 +406,16 @@ public static SaveSession savePartOfDatabase(LoadedDatabase loadedDatabase, File } // Write preamble if there is one. - FileActions.writePreamble(fw, loadedDatabase.getDatabase().getPreamble()); + FileActions.writePreamble(fw, bibDatabaseContext.getDatabase().getPreamble()); // Write strings if there are any. - FileActions.writeStrings(fw, loadedDatabase.getDatabase()); + FileActions.writeStrings(fw, bibDatabaseContext.getDatabase()); // Write database entries. Take care, using CrossRefEntry- // Comparator, that referred entries occur after referring // ones. Apart from crossref requirements, entries will be // sorted as they appear on the screen. - List> comparators = FileActions.getSaveComparators(true, loadedDatabase.getMetaData()); + List> comparators = FileActions.getSaveComparators(true, bibDatabaseContext.getMetaData()); // Use glazed lists to get a sorted view of the entries: List sorter = new ArrayList<>(bes.length); @@ -430,12 +430,12 @@ public static SaveSession savePartOfDatabase(LoadedDatabase loadedDatabase, File // Check if we must write the type definition for this // entry, as well. Our criterion is that all non-standard // types (*not* customized standard types) must be written. - EntryType tp = EntryTypes.getType(be.getType(), loadedDatabase.getMode()); - if (EntryTypes.getStandardType(tp.getName(), loadedDatabase.getMode()) == null) { + EntryType tp = EntryTypes.getType(be.getType(), bibDatabaseContext.getMode()); + if (EntryTypes.getStandardType(tp.getName(), bibDatabaseContext.getMode()) == null) { types.put(tp.getName(), tp); } - bibtexEntryWriter.write(be, fw, loadedDatabase.getMode()); + bibtexEntryWriter.write(be, fw, bibDatabaseContext.getMode()); //only append newline if the entry has changed if (!be.hasChanged()) { fw.write(Globals.NEWLINE); @@ -443,8 +443,8 @@ public static SaveSession savePartOfDatabase(LoadedDatabase loadedDatabase, File } // Write meta data. - if ((saveType != DatabaseSaveType.PLAIN_BIBTEX) && (loadedDatabase.getMetaData() != null)) { - loadedDatabase.getMetaData().writeMetaData(fw); + if ((saveType != DatabaseSaveType.PLAIN_BIBTEX) && (bibDatabaseContext.getMetaData() != null)) { + bibDatabaseContext.getMetaData().writeMetaData(fw); } // Write type definitions, if any: diff --git a/src/main/java/net/sf/jabref/exporter/SaveAllAction.java b/src/main/java/net/sf/jabref/exporter/SaveAllAction.java index 6a7a77b1e78..3fe3cf1cc51 100644 --- a/src/main/java/net/sf/jabref/exporter/SaveAllAction.java +++ b/src/main/java/net/sf/jabref/exporter/SaveAllAction.java @@ -63,7 +63,7 @@ public void run() { for (int i = 0; i < databases; i++) { if (i < frame.getTabbedPane().getTabCount()) { BasePanel panel = frame.getBasePanelAt(i); - if (panel.getLoadedDatabase().getDatabaseFile() == null) { + if (panel.getBibDatabaseContext().getDatabaseFile() == null) { frame.showBasePanelAt(i); } panel.runCommand(Actions.SAVE); diff --git a/src/main/java/net/sf/jabref/exporter/SaveDatabaseAction.java b/src/main/java/net/sf/jabref/exporter/SaveDatabaseAction.java index a9b4c3f6fcc..056d308fe58 100644 --- a/src/main/java/net/sf/jabref/exporter/SaveDatabaseAction.java +++ b/src/main/java/net/sf/jabref/exporter/SaveDatabaseAction.java @@ -30,6 +30,7 @@ import net.sf.jabref.logic.util.io.FileBasedLock; import javax.swing.*; +import net.sf.jabref.model.database.BibDatabaseMode; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -66,7 +67,7 @@ public void init() throws Throwable { success = false; cancelled = false; fileLockedError = false; - if (panel.getLoadedDatabase().getDatabaseFile() == null) { + if (panel.getBibDatabaseContext().getDatabaseFile() == null) { saveAs(); } else { @@ -94,12 +95,12 @@ else if (answer == JOptionPane.YES_OPTION) { @Override public void run() { - if (!FileBasedLock.waitForFileLock(panel.getLoadedDatabase().getDatabaseFile(), 10)) { + if (!FileBasedLock.waitForFileLock(panel.getBibDatabaseContext().getDatabaseFile(), 10)) { // TODO: GUI handling of the situation when the externally modified file keeps being locked. LOGGER.error("File locked, this will be trouble."); } - ChangeScanner scanner = new ChangeScanner(panel.frame(), panel, panel.getLoadedDatabase().getDatabaseFile()); + ChangeScanner scanner = new ChangeScanner(panel.frame(), panel, panel.getBibDatabaseContext().getDatabaseFile()); JabRefExecutorService.INSTANCE.executeWithLowPriorityInOwnThreadAndWait(scanner); if (scanner.changesFound()) { scanner.displayResult(new ChangeScanner.DisplayResultCallback() { @@ -128,7 +129,7 @@ public void run() { } else { // User indicated to store anyway. // See if the database has the protected flag set: - List pd = panel.getLoadedDatabase().getMetaData().getData(Globals.PROTECTED_FLAG_META); + List pd = panel.getBibDatabaseContext().getMetaData().getData(Globals.PROTECTED_FLAG_META); boolean databaseProtectionFlag = (pd != null) && Boolean.parseBoolean(pd.get(0)); if (databaseProtectionFlag) { JOptionPane.showMessageDialog(frame, Localization.lang("Database is protected. Cannot save until external changes have been reviewed."), @@ -151,8 +152,8 @@ public void run() { public void update() { if (success) { // Reset title of tab - frame.setTabTitle(panel, panel.getTabTitle(), panel.getLoadedDatabase().getDatabaseFile().getAbsolutePath()); - frame.output(Localization.lang("Saved database") + " '" + panel.getLoadedDatabase().getDatabaseFile().getPath() + "'."); + frame.setTabTitle(panel, panel.getTabTitle(), panel.getBibDatabaseContext().getDatabaseFile().getAbsolutePath()); + frame.output(Localization.lang("Saved database") + " '" + panel.getBibDatabaseContext().getDatabaseFile().getPath() + "'."); frame.setWindowTitle(); frame.updateAllTabTitles(); } else if (!cancelled) { @@ -167,7 +168,7 @@ public void update() { @Override public void run() { - if (cancelled || (panel.getLoadedDatabase().getDatabaseFile() == null)) { + if (cancelled || (panel.getBibDatabaseContext().getDatabaseFile() == null)) { return; } @@ -180,9 +181,9 @@ public void run() { // lacking keys, before saving: panel.autoGenerateKeysBeforeSaving(); - if (FileBasedLock.waitForFileLock(panel.getLoadedDatabase().getDatabaseFile(), 10)) { + if (FileBasedLock.waitForFileLock(panel.getBibDatabaseContext().getDatabaseFile(), 10)) { // Save the database: - success = saveDatabase(panel.getLoadedDatabase().getDatabaseFile(), false, panel.getEncoding()); + success = saveDatabase(panel.getBibDatabaseContext().getDatabaseFile(), false, panel.getEncoding()); try { Globals.fileUpdateMonitor.updateTimeStamp(panel.getFileMonitorHandle()); @@ -225,12 +226,15 @@ private boolean saveDatabase(File file, boolean selectedOnly, Charset encoding) SaveSession session; frame.block(); try { + Defaults defaults = new Defaults(BibDatabaseMode.fromPreference(Globals.prefs.getBoolean(JabRefPreferences.BIBLATEX_MODE))); if (selectedOnly) { - session = FileActions.savePartOfDatabase(new LoadedDatabase(panel.database(), panel.getLoadedDatabase().getMetaData()), + session = FileActions.savePartOfDatabase( + new BibDatabaseContext(panel.database(), panel.getBibDatabaseContext().getMetaData(), defaults), file, Globals.prefs, panel.getSelectedEntries(), encoding, FileActions.DatabaseSaveType.DEFAULT); } else { - session = FileActions.saveDatabase(new LoadedDatabase(panel.database(), panel.getLoadedDatabase().getMetaData()), + session = FileActions.saveDatabase( + new BibDatabaseContext(panel.database(), panel.getBibDatabaseContext().getMetaData(), defaults), file, Globals.prefs, false, false, encoding, false); } @@ -376,22 +380,22 @@ public void saveAs() throws Throwable { } if (chosenFile != null) { - File oldFile = panel.getLoadedDatabase().getDatabaseFile(); - panel.getLoadedDatabase().getMetaData().setFile(f); + File oldFile = panel.getBibDatabaseContext().getDatabaseFile(); + panel.getBibDatabaseContext().getMetaData().setFile(f); Globals.prefs.put(JabRefPreferences.WORKING_DIRECTORY, f.getParent()); runCommand(); // If the operation failed, revert the file field and return: if (!success) { - panel.getLoadedDatabase().getMetaData().setFile(oldFile); + panel.getBibDatabaseContext().getMetaData().setFile(oldFile); return; } // Register so we get notifications about outside changes to the file. try { - panel.setFileMonitorHandle(Globals.fileUpdateMonitor.addUpdateListener(panel, panel.getLoadedDatabase().getDatabaseFile())); + panel.setFileMonitorHandle(Globals.fileUpdateMonitor.addUpdateListener(panel, panel.getBibDatabaseContext().getDatabaseFile())); } catch (IOException ex) { LOGGER.error("Problem registering file change notifications", ex); } - frame.getFileHistory().newFile(panel.getLoadedDatabase().getDatabaseFile().getPath()); + frame.getFileHistory().newFile(panel.getBibDatabaseContext().getDatabaseFile().getPath()); } } diff --git a/src/main/java/net/sf/jabref/external/AttachFileAction.java b/src/main/java/net/sf/jabref/external/AttachFileAction.java index c29f26745e9..6fa4b629000 100644 --- a/src/main/java/net/sf/jabref/external/AttachFileAction.java +++ b/src/main/java/net/sf/jabref/external/AttachFileAction.java @@ -30,7 +30,7 @@ public void action() { BibEntry entry = panel.getSelectedEntries()[0]; FileListEntry flEntry = new FileListEntry("", "", null); FileListEntryEditor editor = new FileListEntryEditor(panel.frame(), flEntry, false, true, - panel.getLoadedDatabase().getMetaData()); + panel.getBibDatabaseContext().getMetaData()); editor.setVisible(true, true); if (editor.okPressed()) { FileListTableModel model = new FileListTableModel(); diff --git a/src/main/java/net/sf/jabref/external/DroppedFileHandler.java b/src/main/java/net/sf/jabref/external/DroppedFileHandler.java index ef730050d67..4ec7e040bdf 100644 --- a/src/main/java/net/sf/jabref/external/DroppedFileHandler.java +++ b/src/main/java/net/sf/jabref/external/DroppedFileHandler.java @@ -155,7 +155,7 @@ public void handleDroppedfile(String fileName, ExternalFileType fileType, boolea String destFilename; if (linkInPlace.isSelected()) { - destFilename = FileUtil.shortenFileName(new File(fileName), panel.getLoadedDatabase().getMetaData().getFileDirectory(Globals.FILE_FIELD)).toString(); + destFilename = FileUtil.shortenFileName(new File(fileName), panel.getBibDatabaseContext().getMetaData().getFileDirectory(Globals.FILE_FIELD)).toString(); } else { destFilename = renameCheckBox.isSelected() ? renameToTextBox.getText() : new File(fileName).getName(); if (copyRadioButton.isSelected()) { @@ -200,7 +200,7 @@ public void linkPdfToEntry(String fileName, MainTable entryTable, BibEntry entry String destFilename; if (linkInPlace.isSelected()) { - destFilename = FileUtil.shortenFileName(new File(fileName), panel.getLoadedDatabase().getMetaData().getFileDirectory(Globals.FILE_FIELD)).toString(); + destFilename = FileUtil.shortenFileName(new File(fileName), panel.getBibDatabaseContext().getMetaData().getFileDirectory(Globals.FILE_FIELD)).toString(); } else { destFilename = renameCheckBox.isSelected() ? renameToTextBox.getText() : new File(fileName).getName(); if (copyRadioButton.isSelected()) { @@ -230,7 +230,7 @@ public void importXmp(List xmpEntriesInFile, String fileName) { String destFilename; if (linkInPlace.isSelected()) { - destFilename = FileUtil.shortenFileName(new File(fileName), panel.getLoadedDatabase().getMetaData().getFileDirectory(Globals.FILE_FIELD)).toString(); + destFilename = FileUtil.shortenFileName(new File(fileName), panel.getBibDatabaseContext().getMetaData().getFileDirectory(Globals.FILE_FIELD)).toString(); } else { if (renameCheckBox.isSelected()) { destFilename = fileName; @@ -317,7 +317,7 @@ private boolean tryXmpImport(String fileName, ExternalFileType fileType, boolean String destFilename; if (linkInPlace.isSelected()) { - destFilename = FileUtil.shortenFileName(new File(fileName), panel.getLoadedDatabase().getMetaData().getFileDirectory(Globals.FILE_FIELD)).toString(); + destFilename = FileUtil.shortenFileName(new File(fileName), panel.getBibDatabaseContext().getMetaData().getFileDirectory(Globals.FILE_FIELD)).toString(); } else { if (renameCheckBox.isSelected()) { destFilename = fileName; @@ -354,7 +354,7 @@ private boolean showLinkMoveCopyRenameDialog(String linkFileName, ExternalFileTy BibEntry entry, boolean newEntry, final boolean multipleEntries, BibDatabase database) { String dialogTitle = Localization.lang("Link to file %0", linkFileName); - List dirs = panel.getLoadedDatabase().getMetaData().getFileDirectory(Globals.FILE_FIELD); + List dirs = panel.getBibDatabaseContext().getMetaData().getFileDirectory(Globals.FILE_FIELD); int found = -1; for (int i = 0; i < dirs.size(); i++) { if (new File(dirs.get(i)).exists()) { @@ -456,7 +456,7 @@ private void doLink(BibEntry entry, ExternalFileType fileType, String filename, // If avoidDuplicate==true, we should check if this file is already linked: if (avoidDuplicate) { // For comparison, find the absolute filename: - List dirs = panel.getLoadedDatabase().getMetaData().getFileDirectory(Globals.FILE_FIELD); + List dirs = panel.getBibDatabaseContext().getMetaData().getFileDirectory(Globals.FILE_FIELD); String absFilename = !new File(filename).isAbsolute() && (dirs.size() > 0) ? FileUtil.expandFilename(filename, dirs).getAbsolutePath() : filename; @@ -497,7 +497,7 @@ private void doLink(BibEntry entry, ExternalFileType fileType, String filename, */ private boolean doMove(String fileName, ExternalFileType fileType, String destFilename, NamedCompound edits) { - List dirs = panel.getLoadedDatabase().getMetaData().getFileDirectory(Globals.FILE_FIELD); + List dirs = panel.getBibDatabaseContext().getMetaData().getFileDirectory(Globals.FILE_FIELD); int found = -1; for (int i = 0; i < dirs.size(); i++) { if (new File(dirs.get(i)).exists()) { @@ -548,7 +548,7 @@ private boolean doMove(String fileName, ExternalFileType fileType, String destFi private boolean doCopy(String fileName, ExternalFileType fileType, String toFile, NamedCompound edits) { - List dirs = panel.getLoadedDatabase().getMetaData().getFileDirectory(Globals.FILE_FIELD); + List dirs = panel.getBibDatabaseContext().getMetaData().getFileDirectory(Globals.FILE_FIELD); int found = -1; for (int i = 0; i < dirs.size(); i++) { if (new File(dirs.get(i)).exists()) { diff --git a/src/main/java/net/sf/jabref/external/ExternalFileMenuItem.java b/src/main/java/net/sf/jabref/external/ExternalFileMenuItem.java index 761a962ee05..2a65296e578 100644 --- a/src/main/java/net/sf/jabref/external/ExternalFileMenuItem.java +++ b/src/main/java/net/sf/jabref/external/ExternalFileMenuItem.java @@ -76,7 +76,7 @@ public boolean openLink() { ExternalFileType type = fileType; if (this.fileType == null) { if (this.fieldName != null) { - JabRefDesktop.openExternalViewer(frame.getCurrentBasePanel().getLoadedDatabase().getMetaData(), link, fieldName); + JabRefDesktop.openExternalViewer(frame.getCurrentBasePanel().getBibDatabaseContext().getMetaData(), link, fieldName); return true; } else { diff --git a/src/main/java/net/sf/jabref/external/FindFullTextAction.java b/src/main/java/net/sf/jabref/external/FindFullTextAction.java index 7a576128922..0fe9b4fc062 100644 --- a/src/main/java/net/sf/jabref/external/FindFullTextAction.java +++ b/src/main/java/net/sf/jabref/external/FindFullTextAction.java @@ -60,7 +60,7 @@ public void run() { @Override public void update() { if (result.isPresent()) { - List dirs = basePanel.getLoadedDatabase().getMetaData().getFileDirectory(Globals.FILE_FIELD); + List dirs = basePanel.getBibDatabaseContext().getMetaData().getFileDirectory(Globals.FILE_FIELD); if (dirs.size() == 0) { // FIXME: Localization JOptionPane.showMessageDialog(basePanel.frame(), "Main file directory not set! Preferences -> External programs", "Directory not found", JOptionPane.ERROR_MESSAGE); @@ -68,7 +68,7 @@ public void update() { } String bibtexKey = entry.getCiteKey(); // TODO: this needs its own thread as it blocks the UI! - DownloadExternalFile def = new DownloadExternalFile(basePanel.frame(), basePanel.getLoadedDatabase().getMetaData(), bibtexKey); + DownloadExternalFile def = new DownloadExternalFile(basePanel.frame(), basePanel.getBibDatabaseContext().getMetaData(), bibtexKey); try { def.download(result.get(), new DownloadExternalFile.DownloadCallback() { @Override diff --git a/src/main/java/net/sf/jabref/external/MoveFileAction.java b/src/main/java/net/sf/jabref/external/MoveFileAction.java index 8e525bb5faf..6f8b030fe3e 100644 --- a/src/main/java/net/sf/jabref/external/MoveFileAction.java +++ b/src/main/java/net/sf/jabref/external/MoveFileAction.java @@ -70,7 +70,7 @@ public void actionPerformed(ActionEvent event) { } // Get an absolute path representation: - List dirs = frame.getCurrentBasePanel().getLoadedDatabase().getMetaData().getFileDirectory(Globals.FILE_FIELD); + List dirs = frame.getCurrentBasePanel().getBibDatabaseContext().getMetaData().getFileDirectory(Globals.FILE_FIELD); int found = -1; for (int i = 0; i < dirs.size(); i++) { if (new File(dirs.get(i)).exists()) { diff --git a/src/main/java/net/sf/jabref/external/SynchronizeFileField.java b/src/main/java/net/sf/jabref/external/SynchronizeFileField.java index aa5f78a4d6f..f16779a2356 100644 --- a/src/main/java/net/sf/jabref/external/SynchronizeFileField.java +++ b/src/main/java/net/sf/jabref/external/SynchronizeFileField.java @@ -74,7 +74,7 @@ public void init() { // Ask about rules for the operation: if (optDiag == null) { - optDiag = new SynchronizeFileField.OptionsDialog(panel.frame(), panel.getLoadedDatabase().getMetaData()); + optDiag = new SynchronizeFileField.OptionsDialog(panel.frame(), panel.getBibDatabaseContext().getMetaData()); } PositionWindow.placeDialog(optDiag, panel.frame()); optDiag.setVisible(true); @@ -111,7 +111,7 @@ public void run() { Collections.addAll(entries, sel); // Start the autosetting process: - Runnable r = Util.autoSetLinks(entries, ce, changedEntries, null, panel.getLoadedDatabase().getMetaData(), null, null); + Runnable r = Util.autoSetLinks(entries, ce, changedEntries, null, panel.getBibDatabaseContext().getMetaData(), null, null); JabRefExecutorService.INSTANCE.executeAndWait(r); } progress += sel.length * weightAutoSet; @@ -128,7 +128,7 @@ public void run() { tableModel.setContentDontGuessTypes(old); // We need to specify which directories to search in for Util.expandFilename: - List dirsS = panel.getLoadedDatabase().getMetaData().getFileDirectory(Globals.FILE_FIELD); + List dirsS = panel.getBibDatabaseContext().getMetaData().getFileDirectory(Globals.FILE_FIELD); ArrayList dirs = new ArrayList<>(); for (String dirs1 : dirsS) { dirs.add(new File(dirs1)); @@ -166,7 +166,7 @@ public void run() { case 1: // Assign new file. FileListEntryEditor flEditor = new FileListEntryEditor - (panel.frame(), flEntry, false, true, panel.getLoadedDatabase().getMetaData()); + (panel.frame(), flEntry, false, true, panel.getBibDatabaseContext().getMetaData()); flEditor.setVisible(true, true); break; case 2: @@ -222,7 +222,7 @@ public void run() { // User wants to change the type of this link. // First get a model of all file links for this entry: FileListEntryEditor editor = new FileListEntryEditor - (panel.frame(), flEntry, false, true, panel.getLoadedDatabase().getMetaData()); + (panel.frame(), flEntry, false, true, panel.getBibDatabaseContext().getMetaData()); editor.setVisible(true, false); } } diff --git a/src/main/java/net/sf/jabref/external/TransferableFileLinkSelection.java b/src/main/java/net/sf/jabref/external/TransferableFileLinkSelection.java index 1f56c323ca5..66fb5819b4a 100644 --- a/src/main/java/net/sf/jabref/external/TransferableFileLinkSelection.java +++ b/src/main/java/net/sf/jabref/external/TransferableFileLinkSelection.java @@ -42,7 +42,7 @@ public TransferableFileLinkSelection(BasePanel panel, BibEntry[] selection) { selection[0].getFieldOptional(Globals.FILE_FIELD).ifPresent(file -> tm.setContent(file)); if (tm.getRowCount() > 0) { // Find the default directory for this field type, if any: - List dirs = panel.getLoadedDatabase().getMetaData().getFileDirectory(Globals.FILE_FIELD); + List dirs = panel.getBibDatabaseContext().getMetaData().getFileDirectory(Globals.FILE_FIELD); File expLink = FileUtil.expandFilename(tm.getEntry(0).link, dirs); fileList.add(expLink); diff --git a/src/main/java/net/sf/jabref/external/WriteXMPAction.java b/src/main/java/net/sf/jabref/external/WriteXMPAction.java index 5aca50dc85e..fb4f4db1b65 100644 --- a/src/main/java/net/sf/jabref/external/WriteXMPAction.java +++ b/src/main/java/net/sf/jabref/external/WriteXMPAction.java @@ -123,14 +123,14 @@ public void run() { // First check the (legacy) "pdf" field: String pdf = entry.getField("pdf"); - List dirs = panel.getLoadedDatabase().getMetaData().getFileDirectory("pdf"); + List dirs = panel.getBibDatabaseContext().getMetaData().getFileDirectory("pdf"); File f = FileUtil.expandFilename(pdf, dirs); if (f != null) { files.add(f); } // Then check the "file" field: - dirs = panel.getLoadedDatabase().getMetaData().getFileDirectory(Globals.FILE_FIELD); + dirs = panel.getBibDatabaseContext().getMetaData().getFileDirectory(Globals.FILE_FIELD); if (entry.hasField(Globals.FILE_FIELD)) { FileListTableModel tm = new FileListTableModel(); tm.setContent(entry.getField(Globals.FILE_FIELD)); diff --git a/src/main/java/net/sf/jabref/external/WriteXMPEntryEditorAction.java b/src/main/java/net/sf/jabref/external/WriteXMPEntryEditorAction.java index 7f031d22a26..3697b0a590f 100644 --- a/src/main/java/net/sf/jabref/external/WriteXMPEntryEditorAction.java +++ b/src/main/java/net/sf/jabref/external/WriteXMPEntryEditorAction.java @@ -65,14 +65,14 @@ public void actionPerformed(ActionEvent actionEvent) { // First check the (legacy) "pdf" field: String pdf = entry.getField("pdf"); - List dirs = panel.getLoadedDatabase().getMetaData().getFileDirectory("pdf"); + List dirs = panel.getBibDatabaseContext().getMetaData().getFileDirectory("pdf"); File f = FileUtil.expandFilename(pdf, dirs); if (f != null) { files.add(f); } // Then check the "file" field: - dirs = panel.getLoadedDatabase().getMetaData().getFileDirectory(Globals.FILE_FIELD); + dirs = panel.getBibDatabaseContext().getMetaData().getFileDirectory(Globals.FILE_FIELD); if (entry.hasField(Globals.FILE_FIELD)) { FileListTableModel tm = new FileListTableModel(); tm.setContent(entry.getField(Globals.FILE_FIELD)); diff --git a/src/main/java/net/sf/jabref/external/push/PushToApplicationAction.java b/src/main/java/net/sf/jabref/external/push/PushToApplicationAction.java index 2a1341d6061..a5aad3e96a2 100644 --- a/src/main/java/net/sf/jabref/external/push/PushToApplicationAction.java +++ b/src/main/java/net/sf/jabref/external/push/PushToApplicationAction.java @@ -79,7 +79,7 @@ public void actionPerformed(ActionEvent e) { @Override public void run() { // Do the operation: - operation.pushEntries(panel.database(), entries, getKeyString(entries), panel.getLoadedDatabase().getMetaData()); + operation.pushEntries(panel.database(), entries, getKeyString(entries), panel.getBibDatabaseContext().getMetaData()); // Call the operationCompleted() method on the event dispatch thread: SwingUtilities.invokeLater(new Runnable() { diff --git a/src/main/java/net/sf/jabref/groups/GroupDialog.java b/src/main/java/net/sf/jabref/groups/GroupDialog.java index 23701c1feeb..65f4262520b 100644 --- a/src/main/java/net/sf/jabref/groups/GroupDialog.java +++ b/src/main/java/net/sf/jabref/groups/GroupDialog.java @@ -149,7 +149,7 @@ public GroupDialog(JabRefFrame jabrefFrame, BasePanel basePanel, builderKG.append(Localization.lang("Keyword")); builderKG.append(m_kgSearchTerm); builderKG.append(new FieldContentSelector(jabrefFrame, m_basePanel, this, - m_kgSearchTerm, m_basePanel.getLoadedDatabase().getMetaData(), null, true, ", ")); + m_kgSearchTerm, m_basePanel.getBibDatabaseContext().getMetaData(), null, true, ", ")); builderKG.nextLine(); builderKG.append(m_kgCaseSensitive, 3); builderKG.nextLine(); diff --git a/src/main/java/net/sf/jabref/groups/GroupSelector.java b/src/main/java/net/sf/jabref/groups/GroupSelector.java index e1ce467a2f8..8a724f5df9b 100644 --- a/src/main/java/net/sf/jabref/groups/GroupSelector.java +++ b/src/main/java/net/sf/jabref/groups/GroupSelector.java @@ -1419,7 +1419,7 @@ public void setActiveBasePanel(BasePanel panel) { frame.sidePaneManager.hide("groups"); return; } - MetaData metaData = panel.getLoadedDatabase().getMetaData(); + MetaData metaData = panel.getBibDatabaseContext().getMetaData(); if (metaData.getGroups() == null) { GroupTreeNode newGroupsRoot = new GroupTreeNode(new AllEntriesGroup()); metaData.setGroups(newGroupsRoot); diff --git a/src/main/java/net/sf/jabref/groups/GroupTreeCellRenderer.java b/src/main/java/net/sf/jabref/groups/GroupTreeCellRenderer.java index d344c0504fc..26a2322abcd 100644 --- a/src/main/java/net/sf/jabref/groups/GroupTreeCellRenderer.java +++ b/src/main/java/net/sf/jabref/groups/GroupTreeCellRenderer.java @@ -20,6 +20,7 @@ import javax.swing.*; import javax.swing.tree.DefaultTreeCellRenderer; +import net.sf.jabref.gui.BasePanel; import net.sf.jabref.gui.IconTheme; import net.sf.jabref.model.entry.BibEntry; import net.sf.jabref.Globals; @@ -114,9 +115,12 @@ public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sb.append(" [").append(((ExplicitGroup) group).getNumEntries()).append(']'); } else if ((group instanceof KeywordGroup) || (group instanceof SearchGroup)) { int hits = 0; - for (BibEntry entry : JabRef.jrf.getCurrentBasePanel().getDatabase().getEntries()) { - if (group.contains(entry)) { - hits++; + BasePanel currentBasePanel = JabRef.jrf.getCurrentBasePanel(); + if(currentBasePanel != null) { + for (BibEntry entry : currentBasePanel.getDatabase().getEntries()) { + if (group.contains(entry)) { + hits++; + } } } sb.append(" [").append(hits).append(']'); diff --git a/src/main/java/net/sf/jabref/gui/BasePanel.java b/src/main/java/net/sf/jabref/gui/BasePanel.java index 1e61b9145dd..d12662ba605 100644 --- a/src/main/java/net/sf/jabref/gui/BasePanel.java +++ b/src/main/java/net/sf/jabref/gui/BasePanel.java @@ -65,11 +65,8 @@ import net.sf.jabref.logic.search.matchers.SearchMatcher; import net.sf.jabref.logic.util.io.FileBasedLock; import net.sf.jabref.logic.util.io.FileUtil; -import net.sf.jabref.model.database.BibDatabase; -import net.sf.jabref.model.database.DatabaseChangeEvent; +import net.sf.jabref.model.database.*; import net.sf.jabref.model.database.DatabaseChangeEvent.ChangeType; -import net.sf.jabref.model.database.DatabaseChangeListener; -import net.sf.jabref.model.database.KeyCollisionException; import net.sf.jabref.model.entry.BibEntry; import net.sf.jabref.model.entry.EntryType; import net.sf.jabref.model.entry.IdGenerator; @@ -107,7 +104,7 @@ public class BasePanel extends JPanel implements ClipboardOwner, FileUpdateListe public static final int WILL_SHOW_EDITOR = 3; private final BibDatabase database; - private final LoadedDatabase loadedDatabase; + private final BibDatabaseContext bibDatabaseContext; private int mode; private EntryEditor currentEditor; @@ -182,17 +179,17 @@ public ContentAutoCompleters getAutoCompleters() { } - public BasePanel(JabRefFrame frame, LoadedDatabase loadedDatabase, Charset encoding) { + public BasePanel(JabRefFrame frame, BibDatabaseContext bibDatabaseContext, Charset encoding) { Objects.requireNonNull(frame); Objects.requireNonNull(encoding); - Objects.requireNonNull(loadedDatabase); + Objects.requireNonNull(bibDatabaseContext); this.encoding = encoding; - this.loadedDatabase = loadedDatabase; + this.bibDatabaseContext = bibDatabaseContext; this.sidePaneManager = GUIGlobals.sidePaneManager; this.frame = frame; - this.database = loadedDatabase.getDatabase(); + this.database = bibDatabaseContext.getDatabase(); searchBar = new SearchBar(this); @@ -200,7 +197,7 @@ public BasePanel(JabRefFrame frame, LoadedDatabase loadedDatabase, Charset encod setupActions(); - File file = loadedDatabase.getDatabaseFile(); + File file = bibDatabaseContext.getDatabaseFile(); // ensure that at each addition of a new entry, the entry is added to the groups interface this.database.addDatabaseChangeListener(new GroupTreeUpdater()); @@ -228,7 +225,7 @@ public BasePanel(JabRefFrame frame, LoadedDatabase loadedDatabase, Charset encod public String getTabTitle() { String title; - if (getLoadedDatabase().getDatabaseFile() == null) { + if (getBibDatabaseContext().getDatabaseFile() == null) { title = GUIGlobals.untitledTitle; if (!database().getEntries().isEmpty()) { @@ -241,7 +238,7 @@ public String getTabTitle() { } else { // check if file is modified String changeFlag = isModified() ? "*" : ""; - title = getLoadedDatabase().getDatabaseFile().getName() + changeFlag; + title = getBibDatabaseContext().getDatabaseFile().getName() + changeFlag; } return title; } @@ -508,7 +505,7 @@ private void setupActions() { @Override public void init() { - DBStrings dbs = loadedDatabase.getMetaData().getDBStrings(); + DBStrings dbs = bibDatabaseContext.getMetaData().getDBStrings(); // get DBStrings from user if necessary if (dbs.isConfigValid()) { @@ -529,7 +526,7 @@ public void init() { // store database strings if (connectToDB) { dbs = dbd.getDBStrings(); - loadedDatabase.getMetaData().setDBStrings(dbs); + bibDatabaseContext.getMetaData().setDBStrings(dbs); dbd.dispose(); } } @@ -541,13 +538,13 @@ public void run() { if (connectToDB) { - final DBStrings dbs = loadedDatabase.getMetaData().getDBStrings(); + final DBStrings dbs = bibDatabaseContext.getMetaData().getDBStrings(); try { frame.output(Localization.lang("Attempting SQL export...")); final DBExporterAndImporterFactory factory = new DBExporterAndImporterFactory(); final DBExporter exporter = factory.getExporter(dbs.getServerType()); - exporter.exportDatabaseToDBMS(database, loadedDatabase.getMetaData(), null, dbs, frame); + exporter.exportDatabaseToDBMS(database, bibDatabaseContext.getMetaData(), null, dbs, frame); dbs.isConfigValid(true); } catch (Exception ex) { final String preamble = Localization @@ -559,7 +556,7 @@ public void run() { Localization.lang("Export to SQL database"), JOptionPane.ERROR_MESSAGE); } - loadedDatabase.getMetaData().setDBStrings(dbs); + bibDatabaseContext.getMetaData().setDBStrings(dbs); } } @@ -671,7 +668,7 @@ public void run() { // Finally, set the new keys: for (BibEntry entry : entries) { bes = entry; - LabelPatternUtil.makeLabel(loadedDatabase.getMetaData(), database, bes); + LabelPatternUtil.makeLabel(bibDatabaseContext.getMetaData(), database, bes); ce.addEdit(new UndoableKeyChange(database, bes.getId(), (String) oldvals.get(bes), bes.getField(BibEntry.KEY_FIELD))); } @@ -879,7 +876,7 @@ public void run() { } FileListEntry flEntry = tableModel.getEntry(0); ExternalFileMenuItem item = new ExternalFileMenuItem(frame(), entry, "", flEntry.link, - flEntry.type.getIcon(), loadedDatabase.getMetaData(), flEntry.type); + flEntry.type.getIcon(), bibDatabaseContext.getMetaData(), flEntry.type); item.openLink(); } }); @@ -893,7 +890,7 @@ public void action() { JabRefExecutorService.INSTANCE.execute(() -> { final BibEntry[] bes = mainTable.getSelectedEntries(); final List files = FileUtil.getListOfLinkedFiles(Arrays.asList(bes), - loadedDatabase.getMetaData().getFileDirectory(Globals.FILE_FIELD)); + bibDatabaseContext.getMetaData().getFileDirectory(Globals.FILE_FIELD)); for (final File f : files) { try { JabRefDesktop.openFolderAndSelectFile(f.getAbsolutePath()); @@ -938,7 +935,7 @@ public void action() { output(Localization.lang("No url defined") + '.'); } else { try { - JabRefDesktop.openExternalFileAnyFormat(loadedDatabase.getMetaData(), entry.link, entry.type); + JabRefDesktop.openExternalFileAnyFormat(bibDatabaseContext.getMetaData(), entry.link, entry.type); output(Localization.lang("External viewer called") + '.'); } catch (IOException e) { output(Localization.lang("Could not open link")); @@ -947,7 +944,7 @@ public void action() { } } else { try { - JabRefDesktop.openExternalViewer(loadedDatabase.getMetaData(), link.toString(), field); + JabRefDesktop.openExternalViewer(bibDatabaseContext.getMetaData(), link.toString(), field); output(Localization.lang("External viewer called") + '.'); } catch (IOException ex) { output(Localization.lang("Error") + ": " + ex.getMessage()); @@ -1124,7 +1121,7 @@ public void action() { actions.put(Actions.MANAGE_SELECTORS, (BaseAction) () -> { ContentSelectorDialog2 csd = new ContentSelectorDialog2 - (frame, frame, BasePanel.this, false, loadedDatabase.getMetaData(), null); + (frame, frame, BasePanel.this, false, bibDatabaseContext.getMetaData(), null); PositionWindow.placeDialog(csd, frame); csd.setVisible(true); }); @@ -1200,12 +1197,13 @@ private boolean saveDatabase(File file, boolean selectedOnly, Charset enc, FileA SaveSession session; frame.block(); final String SAVE_DATABASE = Localization.lang("Save database"); + Defaults defaults = new Defaults(BibDatabaseMode.fromPreference(Globals.prefs.getBoolean(JabRefPreferences.BIBLATEX_MODE))); try { if (selectedOnly) { - session = FileActions.savePartOfDatabase(new LoadedDatabase(database, loadedDatabase.getMetaData()), + session = FileActions.savePartOfDatabase(new BibDatabaseContext(database, bibDatabaseContext.getMetaData(), defaults), file, Globals.prefs, mainTable.getSelectedEntries(), enc, saveType); } else { - session = FileActions.saveDatabase(new LoadedDatabase(database, loadedDatabase.getMetaData()), + session = FileActions.saveDatabase(new BibDatabaseContext(database, bibDatabaseContext.getMetaData(), defaults), file, Globals.prefs, false, false, enc, false); } @@ -1644,7 +1642,7 @@ protected boolean accept(Component c) { AutoCompletePreferences autoCompletePreferences = new AutoCompletePreferences(Globals.prefs); // Set up AutoCompleters for this panel: if (Globals.prefs.getBoolean(JabRefPreferences.AUTO_COMPLETE)) { - autoCompleters = new ContentAutoCompleters(getDatabase(), loadedDatabase.getMetaData(), autoCompletePreferences); + autoCompleters = new ContentAutoCompleters(getDatabase(), bibDatabaseContext.getMetaData(), autoCompletePreferences); // ensure that the autocompleters are in sync with entries this.getDatabase().addDatabaseChangeListener(new AutoCompletersUpdater()); } else { @@ -1936,7 +1934,6 @@ public void rebuildAllEntryEditors() { EntryEditor ed = stringEntryEditorEntry.getValue(); ed.rebuildPanels(); } - } public void markBaseChanged() { @@ -1966,10 +1963,10 @@ private synchronized void markChangedOrUnChanged() { } } else if (baseChanged && !nonUndoableChange) { baseChanged = false; - if (getLoadedDatabase().getDatabaseFile() == null) { + if (getBibDatabaseContext().getDatabaseFile() == null) { frame.setTabTitle(this, GUIGlobals.untitledTitle, null); } else { - frame.setTabTitle(this, getTabTitle(), getLoadedDatabase().getDatabaseFile().getAbsolutePath()); + frame.setTabTitle(this, getTabTitle(), getBibDatabaseContext().getDatabaseFile().getAbsolutePath()); } } frame.setWindowTitle(); @@ -2136,7 +2133,7 @@ public void autoGenerateKeysBeforeSaving() { for (BibEntry bes : database.getEntries()) { String oldKey = bes.getCiteKey(); if ((oldKey == null) || oldKey.isEmpty()) { - LabelPatternUtil.makeLabel(loadedDatabase.getMetaData(), database, bes); + LabelPatternUtil.makeLabel(bibDatabaseContext.getMetaData(), database, bes); ce.addEdit(new UndoableKeyChange(database, bes.getId(), null, bes.getCiteKey())); any = true; } @@ -2266,11 +2263,11 @@ public void fileUpdated() { //LOGGER.debug("File '"+file.getPath()+"' has been modified."); updatedExternally = true; - final ChangeScanner scanner = new ChangeScanner(frame, BasePanel.this, getLoadedDatabase().getDatabaseFile()); + final ChangeScanner scanner = new ChangeScanner(frame, BasePanel.this, getBibDatabaseContext().getDatabaseFile()); // Test: running scan automatically in background - if ((getLoadedDatabase().getDatabaseFile() != null) - && !FileBasedLock.waitForFileLock(getLoadedDatabase().getDatabaseFile(), 10)) { + if ((getBibDatabaseContext().getDatabaseFile() != null) + && !FileBasedLock.waitForFileLock(getBibDatabaseContext().getDatabaseFile(), 10)) { // The file is locked even after the maximum wait. Do nothing. LOGGER.error("File updated externally, but change scan failed because the file is locked."); // Perturb the stored timestamp so successive checks are made: @@ -2294,7 +2291,7 @@ public void run() { sidePaneManager.hideComponent(FileUpdatePanel.NAME); sidePaneManager.unregisterComponent(FileUpdatePanel.NAME); } - FileUpdatePanel pan = new FileUpdatePanel(BasePanel.this, sidePaneManager, getLoadedDatabase().getDatabaseFile(), scanner); + FileUpdatePanel pan = new FileUpdatePanel(BasePanel.this, sidePaneManager, getBibDatabaseContext().getDatabaseFile(), scanner); sidePaneManager.register(FileUpdatePanel.NAME, pan); sidePaneManager.show(FileUpdatePanel.NAME); //setUpdatedExternally(false); @@ -2312,7 +2309,7 @@ public void run() { @Override public void fileRemoved() { - LOGGER.info("File '" + getLoadedDatabase().getDatabaseFile().getPath() + "' has been deleted."); + LOGGER.info("File '" + getBibDatabaseContext().getDatabaseFile().getPath() + "' has been deleted."); } /** @@ -2346,8 +2343,8 @@ public BibEntry[] getSelectedEntries() { return mainTable.getSelectedEntries(); } - public LoadedDatabase getLoadedDatabase() { - return this.loadedDatabase; + public BibDatabaseContext getBibDatabaseContext() { + return this.bibDatabaseContext; } /** @@ -2538,8 +2535,8 @@ public Optional searchAndOpen() { final ExternalFileType[] types = ExternalFileTypes.getInstance().getExternalFileTypeSelection(); final List dirs = new ArrayList<>(); - if (basePanel.getLoadedDatabase().getMetaData().getFileDirectory(Globals.FILE_FIELD).size() > 0) { - final List mdDirs = basePanel.getLoadedDatabase().getMetaData().getFileDirectory(Globals.FILE_FIELD); + if (basePanel.getBibDatabaseContext().getMetaData().getFileDirectory(Globals.FILE_FIELD).size() > 0) { + final List mdDirs = basePanel.getBibDatabaseContext().getMetaData().getFileDirectory(Globals.FILE_FIELD); for (final String mdDir : mdDirs) { dirs.add(new File(mdDir)); @@ -2567,7 +2564,7 @@ public Optional searchAndOpen() { .getExternalFileTypeByExt(extension.get()); if (type != null) { try { - JabRefDesktop.openExternalFileAnyFormat(basePanel.getLoadedDatabase().getMetaData(), filepath, type); + JabRefDesktop.openExternalFileAnyFormat(basePanel.getBibDatabaseContext().getMetaData(), filepath, type); basePanel.output(Localization.lang("External viewer called") + '.'); return Optional.of(filepath); } catch (IOException ex) { diff --git a/src/main/java/net/sf/jabref/gui/BibtexKeyPatternDialog.java b/src/main/java/net/sf/jabref/gui/BibtexKeyPatternDialog.java index ce38e156e7d..3375545911a 100644 --- a/src/main/java/net/sf/jabref/gui/BibtexKeyPatternDialog.java +++ b/src/main/java/net/sf/jabref/gui/BibtexKeyPatternDialog.java @@ -49,7 +49,7 @@ public BibtexKeyPatternDialog(JabRefFrame parent, BasePanel panel) { */ public void setPanel(BasePanel panel) { this.panel = panel; - this.metaData = panel.getLoadedDatabase().getMetaData(); + this.metaData = panel.getBibDatabaseContext().getMetaData(); AbstractLabelPattern keypatterns = metaData.getLabelPattern(); labelPatternPanel.setValues(keypatterns); } diff --git a/src/main/java/net/sf/jabref/gui/ContentSelectorDialog2.java b/src/main/java/net/sf/jabref/gui/ContentSelectorDialog2.java index b3ad3a490d1..c6ee62cb8da 100644 --- a/src/main/java/net/sf/jabref/gui/ContentSelectorDialog2.java +++ b/src/main/java/net/sf/jabref/gui/ContentSelectorDialog2.java @@ -380,7 +380,7 @@ private void applyChanges() { } else { panel.updateAllContentSelectors(); } - panel.getAutoCompleters().addContentSelectorValuesToAutoCompleters(panel.getLoadedDatabase().getMetaData()); + panel.getAutoCompleters().addContentSelectorValuesToAutoCompleters(panel.getBibDatabaseContext().getMetaData()); } diff --git a/src/main/java/net/sf/jabref/gui/DatabasePropertiesDialog.java b/src/main/java/net/sf/jabref/gui/DatabasePropertiesDialog.java index d6548bc71a6..3a5b3166655 100644 --- a/src/main/java/net/sf/jabref/gui/DatabasePropertiesDialog.java +++ b/src/main/java/net/sf/jabref/gui/DatabasePropertiesDialog.java @@ -103,7 +103,7 @@ public DatabasePropertiesDialog(JFrame parent) { public void setPanel(BasePanel panel) { this.panel = panel; - this.metaData = panel.getLoadedDatabase().getMetaData(); + this.metaData = panel.getBibDatabaseContext().getMetaData(); } private void init(JFrame parent) { diff --git a/src/main/java/net/sf/jabref/gui/DuplicateResolverDialog.java b/src/main/java/net/sf/jabref/gui/DuplicateResolverDialog.java index ed2966a9574..a6e206708cc 100644 --- a/src/main/java/net/sf/jabref/gui/DuplicateResolverDialog.java +++ b/src/main/java/net/sf/jabref/gui/DuplicateResolverDialog.java @@ -79,28 +79,28 @@ private void init(BibEntry one, BibEntry two, int type) { first = new JButton(Localization.lang("Keep left")); second = new JButton(Localization.lang("Keep right")); both = new JButton(Localization.lang("Keep both")); - me = new MergeEntries(one, two, frame.getCurrentBasePanel().getLoadedDatabase().getMode()); + me = new MergeEntries(one, two, frame.getCurrentBasePanel().getBibDatabaseContext().getMode()); break; case INSPECTION: first = new JButton(Localization.lang("Remove old entry")); second = new JButton(Localization.lang("Remove entry from import")); both = new JButton(Localization.lang("Keep both")); me = new MergeEntries(one, two, Localization.lang("Old entry"), - Localization.lang("From import"), frame.getCurrentBasePanel().getLoadedDatabase().getMode()); + Localization.lang("From import"), frame.getCurrentBasePanel().getBibDatabaseContext().getMode()); break; case DUPLICATE_SEARCH_WITH_EXACT: first = new JButton(Localization.lang("Keep left")); second = new JButton(Localization.lang("Keep right")); both = new JButton(Localization.lang("Keep both")); removeExact = new JButton(Localization.lang("Automatically remove exact duplicates")); - me = new MergeEntries(one, two, frame.getCurrentBasePanel().getLoadedDatabase().getMode()); + me = new MergeEntries(one, two, frame.getCurrentBasePanel().getBibDatabaseContext().getMode()); break; default: first = new JButton(Localization.lang("Import and remove old entry")); second = new JButton(Localization.lang("Do not import entry")); both = new JButton(Localization.lang("Import and keep old entry")); me = new MergeEntries(one, two, Localization.lang("Old entry"), - Localization.lang("From import"), frame.getCurrentBasePanel().getLoadedDatabase().getMode()); + Localization.lang("From import"), frame.getCurrentBasePanel().getBibDatabaseContext().getMode()); } if (removeExact != null) { diff --git a/src/main/java/net/sf/jabref/gui/DuplicateSearch.java b/src/main/java/net/sf/jabref/gui/DuplicateSearch.java index 01ca21b1b0d..3f3630a0ea1 100644 --- a/src/main/java/net/sf/jabref/gui/DuplicateSearch.java +++ b/src/main/java/net/sf/jabref/gui/DuplicateSearch.java @@ -171,7 +171,7 @@ class SearcherRunnable implements Runnable { public void run() { for (int i = 0; (i < (bes.length - 1)) && !finished; i++) { for (int j = i + 1; (j < bes.length) && !finished; j++) { - boolean eq = DuplicateCheck.isDuplicate(bes[i], bes[j], panel.getLoadedDatabase().getMode()); + boolean eq = DuplicateCheck.isDuplicate(bes[i], bes[j], panel.getBibDatabaseContext().getMode()); // If (suspected) duplicates, add them to the duplicates vector. if (eq) { diff --git a/src/main/java/net/sf/jabref/gui/EntryCustomizationDialog.java b/src/main/java/net/sf/jabref/gui/EntryCustomizationDialog.java index 954c40a1f04..45b5c4140f0 100644 --- a/src/main/java/net/sf/jabref/gui/EntryCustomizationDialog.java +++ b/src/main/java/net/sf/jabref/gui/EntryCustomizationDialog.java @@ -60,7 +60,7 @@ public class EntryCustomizationDialog extends JDialog implements ListSelectionLi private final Set changed = new HashSet<>(); private boolean biblatexMode; - private LoadedDatabase loadedDatabase; + private BibDatabaseContext bibDatabaseContext; /** * Creates a new instance of EntryCustomizationDialog @@ -76,8 +76,8 @@ private void initGui() { Container pane = getContentPane(); pane.setLayout(new BorderLayout()); - loadedDatabase = frame.getCurrentBasePanel().getLoadedDatabase(); - biblatexMode = loadedDatabase.isBiblatexMode(); + bibDatabaseContext = frame.getCurrentBasePanel().getBibDatabaseContext(); + biblatexMode = bibDatabaseContext.isBiblatexMode(); JPanel main = new JPanel(); JPanel buttons = new JPanel(); @@ -86,11 +86,11 @@ private void initGui() { right.setLayout(new GridLayout(biblatexMode ? 2 : 1, 2)); List entryTypes = new ArrayList<>(); - for (String s : EntryTypes.getAllTypes(loadedDatabase.getMode())) { + for (String s : EntryTypes.getAllTypes(bibDatabaseContext.getMode())) { entryTypes.add(s); } - typeComp = new EntryTypeList(entryTypes, loadedDatabase.getMode()); + typeComp = new EntryTypeList(entryTypes, bibDatabaseContext.getMode()); typeComp.addListSelectionListener(this); typeComp.addAdditionActionListener(this); typeComp.addDefaultActionListener(new DefaultListener()); @@ -180,7 +180,7 @@ public void valueChanged(ListSelectionEvent e) { } List rl = reqLists.get(s); if (rl == null) { - EntryType type = EntryTypes.getType(s,loadedDatabase.getMode()); + EntryType type = EntryTypes.getType(s, bibDatabaseContext.getMode()); if (type == null) { // New entry reqComp.setFields(new ArrayList<>()); @@ -248,13 +248,13 @@ private void applyChanges() { if (defaulted.contains(stringListEntry.getKey())) { // This type should be reverted to its default setup. String nm = EntryUtil.capitalizeFirst(stringListEntry.getKey()); - EntryTypes.removeType(nm, loadedDatabase.getMode()); + EntryTypes.removeType(nm, bibDatabaseContext.getMode()); updateTypesForEntries(nm); continue; } - EntryType oldType = EntryTypes.getType(stringListEntry.getKey(), loadedDatabase.getMode()); + EntryType oldType = EntryTypes.getType(stringListEntry.getKey(), bibDatabaseContext.getMode()); if (oldType != null) { List oldReq = oldType.getRequiredFieldsFlat(); List oldOpt = oldType.getOptionalFields(); @@ -281,7 +281,7 @@ private void applyChanges() { } Set toRemove = new HashSet<>(); - for (String o : EntryTypes.getAllTypes(loadedDatabase.getMode())) { + for (String o : EntryTypes.getAllTypes(bibDatabaseContext.getMode())) { if (!types.contains(o)) { toRemove.add(o); } @@ -298,10 +298,10 @@ private void applyChanges() { } private void typeDeletion(String name) { - EntryType type = EntryTypes.getType(name, loadedDatabase.getMode()); + EntryType type = EntryTypes.getType(name, bibDatabaseContext.getMode()); if (type instanceof CustomEntryType) { - if (EntryTypes.getStandardType(name, loadedDatabase.getMode()) == null) { + if (EntryTypes.getStandardType(name, bibDatabaseContext.getMode()) == null) { int reply = JOptionPane.showConfirmDialog (frame, Localization.lang("All entries of this " + "type will be declared " @@ -313,7 +313,7 @@ private void typeDeletion(String name) { return; } } - EntryTypes.removeType(name, loadedDatabase.getMode()); + EntryTypes.removeType(name, bibDatabaseContext.getMode()); updateTypesForEntries(EntryUtil.capitalizeFirst(name)); changed.remove(name); reqLists.remove(name); @@ -373,7 +373,7 @@ private void updateTypesForEntries(String typeName) { bp.entryEditors.remove(typeName); for (BibEntry entry : bp.database().getEntries()) { - EntryType newType = EntryTypes.getType(entry.getType(), loadedDatabase.getMode()); + EntryType newType = EntryTypes.getType(entry.getType(), bibDatabaseContext.getMode()); if (newType != null) { entry.setType(newType); } @@ -401,7 +401,7 @@ public void actionPerformed(ActionEvent e) { } defaulted.add(lastSelected); - EntryType type = EntryTypes.getStandardType(lastSelected, loadedDatabase.getMode()); + EntryType type = EntryTypes.getStandardType(lastSelected, bibDatabaseContext.getMode()); if (type != null) { List of = type.getOptionalFields(); List req = type.getRequiredFields(); diff --git a/src/main/java/net/sf/jabref/gui/EntryTypeDialog.java b/src/main/java/net/sf/jabref/gui/EntryTypeDialog.java index 95c4865b6c6..a4112cf3fc9 100644 --- a/src/main/java/net/sf/jabref/gui/EntryTypeDialog.java +++ b/src/main/java/net/sf/jabref/gui/EntryTypeDialog.java @@ -26,7 +26,7 @@ import com.jgoodies.forms.builder.ButtonBarBuilder; import net.sf.jabref.Globals; -import net.sf.jabref.LoadedDatabase; +import net.sf.jabref.BibDatabaseContext; import net.sf.jabref.gui.keyboard.KeyBinding; import net.sf.jabref.logic.CustomEntryTypesManager; import net.sf.jabref.logic.l10n.Localization; @@ -44,7 +44,7 @@ public class EntryTypeDialog extends JDialog implements ActionListener { private final boolean biblatexMode; private final CancelAction cancelAction = new CancelAction(); - private final LoadedDatabase loadedDatabase; + private final BibDatabaseContext bibDatabaseContext; static class TypeButton extends JButton implements Comparable { final EntryType type; @@ -65,8 +65,8 @@ public EntryTypeDialog(JabRefFrame frame) { // modal dialog super(frame, true); - loadedDatabase = frame.getCurrentBasePanel().getLoadedDatabase(); - biblatexMode = loadedDatabase.isBiblatexMode(); + bibDatabaseContext = frame.getCurrentBasePanel().getBibDatabaseContext(); + biblatexMode = bibDatabaseContext.isBiblatexMode(); setTitle(Localization.lang("Select entry type")); @@ -91,7 +91,7 @@ private JPanel createEntryGroupsPanel() { panel.setLayout(new VerticalLayout()); if(biblatexMode) { - panel.add(createEntryGroupPanel("BibLateX", EntryTypes.getAllValues(loadedDatabase.getMode()))); + panel.add(createEntryGroupPanel("BibLateX", EntryTypes.getAllValues(bibDatabaseContext.getMode()))); } else { panel.add(createEntryGroupPanel("BibTeX", BibtexEntryTypes.ALL)); panel.add(createEntryGroupPanel("IEEETran", IEEETranEntryTypes.ALL)); diff --git a/src/main/java/net/sf/jabref/gui/FindUnlinkedFilesDialog.java b/src/main/java/net/sf/jabref/gui/FindUnlinkedFilesDialog.java index 7993b2f97a8..f0b3735eadf 100644 --- a/src/main/java/net/sf/jabref/gui/FindUnlinkedFilesDialog.java +++ b/src/main/java/net/sf/jabref/gui/FindUnlinkedFilesDialog.java @@ -973,7 +973,7 @@ public void mousePressed(MouseEvent e) { if ((userObject instanceof FileNodeWrapper) && node.isLeaf()) { FileNodeWrapper fnw = (FileNodeWrapper) userObject; try { - JabRefDesktop.openExternalViewer(JabRef.jrf.getCurrentBasePanel().getLoadedDatabase().getMetaData(), fnw.file.getAbsolutePath(), "pdf"); + JabRefDesktop.openExternalViewer(JabRef.jrf.getCurrentBasePanel().getBibDatabaseContext().getMetaData(), fnw.file.getAbsolutePath(), "pdf"); } catch (IOException e1) { LOGGER.info("Error opening file", e1); } @@ -1042,7 +1042,7 @@ public Component getListCellRendererComponent(JList list, Object value, int i */ private void createEntryTypesCombobox() { - Iterator iterator = EntryTypes.getAllValues(frame.getCurrentBasePanel().getLoadedDatabase().getMode()).iterator(); + Iterator iterator = EntryTypes.getAllValues(frame.getCurrentBasePanel().getBibDatabaseContext().getMode()).iterator(); Vector list = new Vector<>(); list.add(new BibtexEntryTypeWrapper(null)); while (iterator.hasNext()) { diff --git a/src/main/java/net/sf/jabref/gui/GUIGlobals.java b/src/main/java/net/sf/jabref/gui/GUIGlobals.java index 49e47e2500f..3b069d3fa63 100644 --- a/src/main/java/net/sf/jabref/gui/GUIGlobals.java +++ b/src/main/java/net/sf/jabref/gui/GUIGlobals.java @@ -48,7 +48,8 @@ public class GUIGlobals { private static final Log LOGGER = LogFactory.getLog(GUIGlobals.class); // Frame titles. - public static final String frameTitle = "JabRef"; + public static final String FRAME_TITLE = "JabRef"; + public static final String stringsTitle = Localization.lang("Strings for database"); public static final String untitledTitle = Localization.lang("untitled"); public static final String NUMBER_COL = "#"; diff --git a/src/main/java/net/sf/jabref/gui/GroupAddRemoveDialog.java b/src/main/java/net/sf/jabref/gui/GroupAddRemoveDialog.java index 1782b993a55..5d546146f89 100644 --- a/src/main/java/net/sf/jabref/gui/GroupAddRemoveDialog.java +++ b/src/main/java/net/sf/jabref/gui/GroupAddRemoveDialog.java @@ -46,7 +46,7 @@ public GroupAddRemoveDialog(BasePanel panel, boolean add, boolean move) { @Override public void action() throws Throwable { - GroupTreeNode groups = panel.getLoadedDatabase().getMetaData().getGroups(); + GroupTreeNode groups = panel.getBibDatabaseContext().getMetaData().getGroups(); if (groups == null) { return; } diff --git a/src/main/java/net/sf/jabref/gui/ImportInspectionDialog.java b/src/main/java/net/sf/jabref/gui/ImportInspectionDialog.java index f9773170b10..6e6e194fa2f 100644 --- a/src/main/java/net/sf/jabref/gui/ImportInspectionDialog.java +++ b/src/main/java/net/sf/jabref/gui/ImportInspectionDialog.java @@ -52,6 +52,7 @@ import net.sf.jabref.logic.labelPattern.LabelPatternUtil; import net.sf.jabref.model.DuplicateCheck; import net.sf.jabref.model.database.BibDatabase; +import net.sf.jabref.model.database.BibDatabaseMode; import net.sf.jabref.model.entry.AuthorList; import net.sf.jabref.model.entry.BibEntry; import net.sf.jabref.model.entry.EntryUtil; @@ -201,7 +202,7 @@ public ImportInspectionDialog(JabRefFrame frame, BasePanel panel, String[] field String undoName, boolean newDatabase) { this.frame = frame; this.panel = panel; - this.metaData = (panel == null) ? new MetaData() : panel.getLoadedDatabase().getMetaData(); + this.metaData = (panel == null) ? new MetaData() : panel.getBibDatabaseContext().getMetaData(); this.fields = Arrays.copyOf(fields, fields.length); this.undoName = undoName; this.newDatabase = newDatabase; @@ -369,7 +370,7 @@ public void addEntries(Collection entriesToAdd) { // Checking duplicates means both checking against the background // database (if // applicable) and against entries already in the table. - if (((panel != null) && (DuplicateCheck.containsDuplicate(panel.database(), entry, panel.getLoadedDatabase().getMode()).isPresent())) + if (((panel != null) && (DuplicateCheck.containsDuplicate(panel.database(), entry, panel.getBibDatabaseContext().getMode()).isPresent())) || (internalDuplicate(this.entries, entry).isPresent())) { entry.setGroupHit(true); deselectAllDuplicates.setEnabled(true); @@ -393,7 +394,7 @@ private Optional internalDuplicate(Collection entriesDupe, B if (othEntry.equals(entry)) { continue; // Don't compare the entry to itself } - if (DuplicateCheck.isDuplicate(entry, othEntry, panel.getLoadedDatabase().getMode())) { + if (DuplicateCheck.isDuplicate(entry, othEntry, panel.getBibDatabaseContext().getMode())) { return Optional.of(othEntry); } } @@ -479,7 +480,7 @@ private void generateKeySelectedEntry() { localMetaData = new MetaData(); } else { database = panel.database(); - localMetaData = panel.getLoadedDatabase().getMetaData(); + localMetaData = panel.getBibDatabaseContext().getMetaData(); } entry.setId(IdGenerator.next()); @@ -514,7 +515,7 @@ private void generateKeys() { localMetaData = new MetaData(); } else { database = panel.database(); - localMetaData = panel.getLoadedDatabase().getMetaData(); + localMetaData = panel.getBibDatabaseContext().getMetaData(); } List keys = new ArrayList<>(entries.size()); @@ -685,7 +686,8 @@ public void actionPerformed(ActionEvent event) { if (newDatabase) { // Create a new BasePanel for the entries: - panel = new BasePanel(frame, new LoadedDatabase(), Globals.prefs.getDefaultEncoding()); + Defaults defaults = new Defaults(BibDatabaseMode.fromPreference(Globals.prefs.getBoolean(JabRefPreferences.BIBLATEX_MODE))); + panel = new BasePanel(frame, new BibDatabaseContext(defaults), Globals.prefs.getDefaultEncoding()); } boolean groupingCanceled = false; @@ -916,7 +918,7 @@ public void mouseClicked(MouseEvent e) { return; } FileListEntry fl = tableModel.getEntry(0); - (new ExternalFileMenuItem(frame, entry, "", fl.link, null, panel.getLoadedDatabase().getMetaData(), fl.type)) + (new ExternalFileMenuItem(frame, entry, "", fl.link, null, panel.getBibDatabaseContext().getMetaData(), fl.type)) .actionPerformed(null); } } else { // Must be URL_COL @@ -975,7 +977,7 @@ private void showFileFieldMenu(MouseEvent e) { description = flEntry.link; } menu.add(new ExternalFileMenuItem(panel.frame(), entry, description, flEntry - .link, flEntry.type.getIcon(), panel.getLoadedDatabase().getMetaData(), flEntry.type)); + .link, flEntry.type.getIcon(), panel.getBibDatabaseContext().getMetaData(), flEntry.type)); count++; } if (count == 0) { @@ -997,7 +999,7 @@ private void openExternalLink(String fieldName, MouseEvent e) { entry.getFieldOptional(fieldName).ifPresent(link -> { try { - JabRefDesktop.openExternalViewer(panel.getLoadedDatabase().getMetaData(), link, fieldName); + JabRefDesktop.openExternalViewer(panel.getBibDatabaseContext().getMetaData(), link, fieldName); } catch (IOException ex) { LOGGER.warn("Could not open link", ex); } @@ -1028,7 +1030,7 @@ public void mousePressed(MouseEvent e) { // Is this the duplicate icon column, and is there an icon? if ((col == DUPL_COL) && (glTable.getValueAt(row, col) != null)) { BibEntry first = sortedList.get(row); - Optional other = DuplicateCheck.containsDuplicate(panel.database(), first, panel.getLoadedDatabase().getMode()); + Optional other = DuplicateCheck.containsDuplicate(panel.database(), first, panel.getBibDatabaseContext().getMode()); if (other.isPresent()) { // This will be true if the duplicate is in the existing // database. diff --git a/src/main/java/net/sf/jabref/gui/JabRefFrame.java b/src/main/java/net/sf/jabref/gui/JabRefFrame.java index cc244526e89..15ef3441b99 100644 --- a/src/main/java/net/sf/jabref/gui/JabRefFrame.java +++ b/src/main/java/net/sf/jabref/gui/JabRefFrame.java @@ -54,7 +54,9 @@ import net.sf.jabref.logic.util.io.FileUtil; import net.sf.jabref.model.database.BibDatabase; import net.sf.jabref.model.database.BibDatabaseMode; -import net.sf.jabref.model.entry.*; +import net.sf.jabref.model.entry.BibEntry; +import net.sf.jabref.model.entry.BibtexEntryTypes; +import net.sf.jabref.model.entry.EntryType; import net.sf.jabref.openoffice.OpenOfficePanel; import net.sf.jabref.specialfields.*; import net.sf.jabref.sql.importer.DbImportAction; @@ -109,7 +111,7 @@ public class JabRefFrame extends JFrame implements OutputPrinter { public void actionPerformed(ActionEvent e) { IntegrityCheck check = new IntegrityCheck(); List messages = check.checkBibtexDatabase(getCurrentBasePanel().database(), - getCurrentBasePanel().getLoadedDatabase().isBiblatexMode()); + getCurrentBasePanel().getBibDatabaseContext().isBiblatexMode()); if (messages.isEmpty()) { JOptionPane.showMessageDialog(getCurrentBasePanel(), Localization.lang("No problems found.")); @@ -221,30 +223,48 @@ void addJToogleButton(JToggleButton button) { public JToggleButton previewToggle; public JToggleButton fetcherToggle; - final OpenDatabaseAction open = new OpenDatabaseAction(this, true); - private final AbstractAction editModeAction = new AbstractAction() { + private class EditModeAction extends AbstractAction { - @Override - public void actionPerformed(ActionEvent evt) { - if (isBiblatexMode()) { - // to BibteX - JabRefFrame.this.getCurrentBasePanel().getLoadedDatabase().setMode(BibDatabaseMode.BIBTEX); + public EditModeAction() { + initName(); + } + + public void initName() { + if (JabRefFrame.this.getCurrentBasePanel() == null) { + putValue(Action.NAME, Localization.menuTitle("Switch to %0 mode", "BibTeX/BibLaTeX")); } else { - // to Biblatex - JabRefFrame.this.getCurrentBasePanel().getLoadedDatabase().setMode(BibDatabaseMode.BIBLATEX); + BibDatabaseMode mode = JabRefFrame.this.getCurrentBasePanel().getBibDatabaseContext().getMode(); + String modeName = mode.getOppositeMode().getFormattedName(); + putValue(Action.NAME, Localization.menuTitle("Switch to %0 mode", modeName)); } - // update menu label - putValue(Action.NAME, Localization.menuTitle("Switch to %0 mode", "BibTeX/BibLaTeX")); } - private boolean isBiblatexMode() { - return JabRefFrame.this.getCurrentBasePanel().getLoadedDatabase().isBiblatexMode(); + @Override + public void actionPerformed(ActionEvent evt) { + if (JabRefFrame.this.getCurrentBasePanel() == null) { + return; + } + + BibDatabaseMode newMode = JabRefFrame.this.getCurrentBasePanel().getBibDatabaseContext().getMode().getOppositeMode(); + JabRefFrame.this.getCurrentBasePanel().getBibDatabaseContext().setMode(newMode); + JabRefFrame.this.refreshTitleAndTabs(); + + initName(); + + // update all elements in current base panel + JabRefFrame.this.getCurrentBasePanel().hideBottomComponent(); + JabRefFrame.this.getCurrentBasePanel().rebuildAllEntryEditors(); + JabRefFrame.this.getCurrentBasePanel().updateEntryEditorIfShowing(); } - }; + } + + final OpenDatabaseAction open = new OpenDatabaseAction(this, true); + private final EditModeAction editModeAction = new EditModeAction(); private final AbstractAction quit = new CloseAction(); private final AbstractAction selectKeys = new SelectKeysAction(); - private final AbstractAction newDatabaseAction = new NewDatabaseAction(this); + private final AbstractAction newBibtexDatabaseAction = new NewDatabaseAction(this, BibDatabaseMode.BIBTEX); + private final AbstractAction newBiblatexDatabaseAction = new NewDatabaseAction(this, BibDatabaseMode.BIBLATEX); private final AbstractAction newSubDatabaseAction = new NewSubDatabaseAction(this); private final AbstractAction forkMeOnGitHubAction = new ForkMeOnGitHubAction(); private final AbstractAction donationAction = new DonateAction(); @@ -492,29 +512,14 @@ public void actionPerformed(ActionEvent e) { private final List newSpecificEntryAction = getNewEntryActions(); private List getNewEntryActions() { + // only Bibtex List actions = new ArrayList<>(); - - if (this.getCurrentBasePanel() != null && this.getCurrentBasePanel().getLoadedDatabase().isBiblatexMode()) { - for (EntryType entryType : BibLatexEntryTypes.ALL) { - actions.add(new NewEntryAction(this, entryType.getName())); - } - } else { - // Bibtex - for (EntryType type : BibtexEntryTypes.ALL) { - KeyStroke keyStroke = new ChangeEntryTypeMenu().entryShortCuts.get(type.getName()); - if (keyStroke == null) { - actions.add(new NewEntryAction(this, type.getName())); - } else { - actions.add(new NewEntryAction(this, type.getName(), keyStroke)); - } - } - // ieeetran - for (EntryType type : IEEETranEntryTypes.ALL) { - actions.add(new NewEntryAction(this, type.getName())); - } - // custom types - for (EntryType type : CustomEntryTypesManager.ALL) { + for (EntryType type : BibtexEntryTypes.ALL) { + KeyStroke keyStroke = new ChangeEntryTypeMenu().entryShortCuts.get(type.getName()); + if (keyStroke == null) { actions.add(new NewEntryAction(this, type.getName())); + } else { + actions.add(new NewEntryAction(this, type.getName(), keyStroke)); } } return actions; @@ -543,9 +548,9 @@ private JPopupMenu tabPopupMenu() { popupMenu.addSeparator(); - JMenuItem databasePropertiesBtn = new JMenuItem(Localization.lang("Database properties")); - databasePropertiesBtn.addActionListener(databaseProperties); - popupMenu.add(databasePropertiesBtn); + JMenuItem databaseProperties = new JMenuItem(Localization.lang("Database properties")); + databaseProperties.addActionListener(this.databaseProperties); + popupMenu.add(databaseProperties); JMenuItem bibtexKeyPatternBtn = new JMenuItem(Localization.lang("BibTeX key patterns")); bibtexKeyPatternBtn.addActionListener(bibtexKeyPattern); @@ -564,7 +569,7 @@ private void init() { MyGlassPane glassPane = new MyGlassPane(); setGlassPane(glassPane); - setTitle(GUIGlobals.frameTitle); + setTitle(GUIGlobals.FRAME_TITLE); setIconImage(new ImageIcon(IconTheme.getIconUrl("jabrefIcon48")).getImage()); setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); addWindowListener(new WindowAdapter() { @@ -625,18 +630,21 @@ public void stateChanged(ChangeEvent e) { markActiveBasePanel(); BasePanel bp = getCurrentBasePanel(); - if (bp != null) { - groupToggle.setSelected(sidePaneManager.isComponentVisible("groups")); - previewToggle.setSelected(Globals.prefs.getBoolean(JabRefPreferences.PREVIEW_ENABLED)); - fetcherToggle.setSelected(sidePaneManager.isComponentVisible(generalFetcher.getTitle())); - Globals.focusListener.setFocused(bp.mainTable); - setWindowTitle(); - // Update search autocompleter with information for the correct database: - bp.updateSearchManager(); - // Set correct enabled state for Back and Forward actions: - bp.setBackAndForwardEnabledState(); - new FocusRequester(bp.mainTable); + if (bp == null) { + return; } + + groupToggle.setSelected(sidePaneManager.isComponentVisible("groups")); + previewToggle.setSelected(Globals.prefs.getBoolean(JabRefPreferences.PREVIEW_ENABLED)); + fetcherToggle.setSelected(sidePaneManager.isComponentVisible(generalFetcher.getTitle())); + Globals.focusListener.setFocused(bp.mainTable); + setWindowTitle(); + editModeAction.initName(); + // Update search autocompleter with information for the correct database: + bp.updateSearchManager(); + // Set correct enabled state for Back and Forward actions: + bp.setBackAndForwardEnabledState(); + new FocusRequester(bp.mainTable); } }); @@ -675,26 +683,32 @@ public void openBrowser(String url) { } } + public void refreshTitleAndTabs() { + setWindowTitle(); + updateAllTabTitles(); + } + /** * Sets the title of the main window. */ public void setWindowTitle() { BasePanel panel = getCurrentBasePanel(); - String mode = panel.getLoadedDatabase().isBiblatexMode() ? " (" + Localization.lang("%0 mode", "BibLaTeX") + ")" : " (" + Localization.lang("%0 mode", "BibTeX") + ")"; // no database open if (panel == null) { - setTitle(GUIGlobals.frameTitle + mode); + setTitle(GUIGlobals.FRAME_TITLE); return; } + String mode = panel.getBibDatabaseContext().getMode().getFormattedName(); + String modeInfo = String.format(" (%s)", Localization.lang("%0 mode", mode)); String changeFlag = panel.isModified() ? "*" : ""; - if (panel.getLoadedDatabase().getDatabaseFile() == null) { - setTitle(GUIGlobals.frameTitle + " - " + GUIGlobals.untitledTitle + changeFlag + mode); + if (panel.getBibDatabaseContext().getDatabaseFile() == null) { + setTitle(GUIGlobals.FRAME_TITLE + " - " + GUIGlobals.untitledTitle + changeFlag + modeInfo); } else { - String databaseFile = panel.getLoadedDatabase().getDatabaseFile().getPath(); - setTitle(GUIGlobals.frameTitle + " - " + databaseFile + changeFlag + mode); + String databaseFile = panel.getBibDatabaseContext().getDatabaseFile().getPath(); + setTitle(GUIGlobals.FRAME_TITLE + " - " + databaseFile + changeFlag + modeInfo); } } @@ -793,7 +807,7 @@ private void tearDownJabRef(List filenames) { prefs.remove(JabRefPreferences.LAST_EDITED); } else { prefs.putStringList(JabRefPreferences.LAST_EDITED, filenames); - File focusedDatabase = getCurrentBasePanel().getLoadedDatabase().getDatabaseFile(); + File focusedDatabase = getCurrentBasePanel().getBibDatabaseContext().getDatabaseFile(); new LastFocusedTabPreferences(prefs).setLastFocusedTab(focusedDatabase); } @@ -844,10 +858,10 @@ public boolean quit() { tabbedPane.setSelectedIndex(i); String filename; - if (getBasePanelAt(i).getLoadedDatabase().getDatabaseFile() == null) { + if (getBasePanelAt(i).getBibDatabaseContext().getDatabaseFile() == null) { filename = GUIGlobals.untitledTitle; } else { - filename = getBasePanelAt(i).getLoadedDatabase().getDatabaseFile().getAbsolutePath(); + filename = getBasePanelAt(i).getBibDatabaseContext().getDatabaseFile().getAbsolutePath(); } int answer = showSaveDialog(filename); @@ -876,8 +890,8 @@ public boolean quit() { } } - if (getBasePanelAt(i).getLoadedDatabase().getDatabaseFile() != null) { - filenames.add(getBasePanelAt(i).getLoadedDatabase().getDatabaseFile().getAbsolutePath()); + if (getBasePanelAt(i).getBibDatabaseContext().getDatabaseFile() != null) { + filenames.add(getBasePanelAt(i).getBibDatabaseContext().getDatabaseFile().getAbsolutePath()); } } } @@ -1144,7 +1158,8 @@ private void fillMenu() { JMenu newSpec = JabRefFrame.subMenu(Localization.menuTitle("New entry...")); JMenu helpMenu = JabRefFrame.subMenu(Localization.menuTitle("Help")); - file.add(newDatabaseAction); + file.add(newBibtexDatabaseAction); + file.add(newBiblatexDatabaseAction); file.add(open); //opendatabaseaction file.add(mergeDatabaseAction); file.add(save); @@ -1278,7 +1293,6 @@ private void fillMenu() { for (NewEntryAction a : newSpecificEntryAction) { newSpec.add(a); } - bibtex.add(newSpec); bibtex.add(plainTextImport); @@ -1382,7 +1396,11 @@ private void createToolBar() { tlb.setRollover(true); tlb.setFloatable(false); - tlb.addAction(newDatabaseAction); + if(Globals.prefs.getBoolean(JabRefPreferences.BIBLATEX_MODE)) { + tlb.addAction(newBiblatexDatabaseAction); + } else { + tlb.addAction(newBibtexDatabaseAction); + } tlb.addAction(open); tlb.addAction(save); tlb.addAction(saveAll); @@ -1491,13 +1509,7 @@ private void initActions() { severalDatabasesOnlyActions.addAll(Arrays .asList(nextTab, prevTab, sortTabs)); - tabbedPane.addChangeListener(new ChangeListener() { - - @Override - public void stateChanged(ChangeEvent event) { - updateEnabledState(); - } - }); + tabbedPane.addChangeListener(event -> updateEnabledState()); } @@ -1570,7 +1582,8 @@ public BasePanel addTab(BibDatabase db, File file, MetaData metaData, Charset en encoding = Globals.prefs.getDefaultEncoding(); } - BasePanel bp = new BasePanel(JabRefFrame.this, new LoadedDatabase(db, metaData, file), encoding); + Defaults defaults = new Defaults(BibDatabaseMode.fromPreference(Globals.prefs.getBoolean(JabRefPreferences.BIBLATEX_MODE))); + BasePanel bp = new BasePanel(JabRefFrame.this, new BibDatabaseContext(db, metaData, file, defaults), encoding); addTab(bp, file, raisePanel); return bp; } @@ -1581,10 +1594,10 @@ private List collectDatabaseFilePaths() { for (int i = 0; i < getBasePanelCount(); i++) { try { // db file exists - if (getBasePanelAt(i).getLoadedDatabase().getDatabaseFile() == null) { + if (getBasePanelAt(i).getBibDatabaseContext().getDatabaseFile() == null) { dbPaths.add(""); } else { - dbPaths.add(getBasePanelAt(i).getLoadedDatabase().getDatabaseFile().getCanonicalPath()); + dbPaths.add(getBasePanelAt(i).getBibDatabaseContext().getDatabaseFile().getCanonicalPath()); } } catch (IOException ex) { LOGGER.error("Invalid database file path: " + ex.getMessage()); @@ -1603,7 +1616,7 @@ public void updateAllTabTitles() { List paths = getUniquePathParts(); for (int i = 0; i < getBasePanelCount(); i++) { String uniqPath = paths.get(i); - File file = getBasePanelAt(i).getLoadedDatabase().getDatabaseFile(); + File file = getBasePanelAt(i).getBibDatabaseContext().getDatabaseFile(); if ((file != null) && !uniqPath.equals(file.getName())) { // remove filename @@ -1818,13 +1831,7 @@ public void setProgressBarIndeterminate(final boolean value) { if (SwingUtilities.isEventDispatchThread()) { progressBar.setIndeterminate(value); } else { - SwingUtilities.invokeLater(new Runnable() { - - @Override - public void run() { - progressBar.setIndeterminate(value); - } - }); + SwingUtilities.invokeLater(() -> progressBar.setIndeterminate(value)); } } @@ -1841,13 +1848,7 @@ public void setProgressBarMaximum(final int value) { if (SwingUtilities.isEventDispatchThread()) { progressBar.setMaximum(value); } else { - SwingUtilities.invokeLater(new Runnable() { - - @Override - public void run() { - progressBar.setMaximum(value); - } - }); + SwingUtilities.invokeLater(() -> progressBar.setMaximum(value)); } } @@ -2118,10 +2119,10 @@ private boolean confirmClose(BasePanel panel) { boolean close = false; String filename; - if (panel.getLoadedDatabase().getDatabaseFile() == null) { + if (panel.getBibDatabaseContext().getDatabaseFile() == null) { filename = GUIGlobals.untitledTitle; } else { - filename = panel.getLoadedDatabase().getDatabaseFile().getAbsolutePath(); + filename = panel.getBibDatabaseContext().getDatabaseFile().getAbsolutePath(); } int answer = showSaveDialog(filename); diff --git a/src/main/java/net/sf/jabref/gui/RightClickMenu.java b/src/main/java/net/sf/jabref/gui/RightClickMenu.java index 6c9530d02e9..b6350645a5e 100644 --- a/src/main/java/net/sf/jabref/gui/RightClickMenu.java +++ b/src/main/java/net/sf/jabref/gui/RightClickMenu.java @@ -229,7 +229,7 @@ public static void populateSpecialFieldMenu(JMenu menu, SpecialField field, JabR @Override public void popupMenuWillBecomeVisible(PopupMenuEvent e) { panel.storeCurrentEdit(); - GroupTreeNode groups = panel.getLoadedDatabase().getMetaData().getGroups(); + GroupTreeNode groups = panel.getBibDatabaseContext().getMetaData().getGroups(); if (groups == null) { groupAdd.setEnabled(false); groupRemove.setEnabled(false); diff --git a/src/main/java/net/sf/jabref/gui/StringDialog.java b/src/main/java/net/sf/jabref/gui/StringDialog.java index 4a6583eb2a8..053cd7bc0f4 100644 --- a/src/main/java/net/sf/jabref/gui/StringDialog.java +++ b/src/main/java/net/sf/jabref/gui/StringDialog.java @@ -128,10 +128,10 @@ protected boolean accept(Component c) { conPane.add(tlb, BorderLayout.NORTH); conPane.add(pan, BorderLayout.CENTER); - if (panel.getLoadedDatabase().getDatabaseFile() == null) { + if (panel.getBibDatabaseContext().getDatabaseFile() == null) { setTitle(GUIGlobals.stringsTitle + ": " + GUIGlobals.untitledTitle); } else { - setTitle(GUIGlobals.stringsTitle + ": " + panel.getLoadedDatabase().getDatabaseFile().getName()); + setTitle(GUIGlobals.stringsTitle + ": " + panel.getBibDatabaseContext().getDatabaseFile().getName()); } pw = new PositionWindow(this, JabRefPreferences.STRINGS_POS_X, JabRefPreferences.STRINGS_POS_Y, JabRefPreferences.STRINGS_SIZE_X, JabRefPreferences.STRINGS_SIZE_Y); diff --git a/src/main/java/net/sf/jabref/gui/actions/AutoLinkFilesAction.java b/src/main/java/net/sf/jabref/gui/actions/AutoLinkFilesAction.java index 025dcd360b6..a12adc0b0e4 100644 --- a/src/main/java/net/sf/jabref/gui/actions/AutoLinkFilesAction.java +++ b/src/main/java/net/sf/jabref/gui/actions/AutoLinkFilesAction.java @@ -43,7 +43,7 @@ public void actionPerformed(ActionEvent event) { JDialog diag = new JDialog(JabRef.jrf, true); final NamedCompound nc = new NamedCompound(Localization.lang("Automatically set file links")); Runnable runnable = Util.autoSetLinks(entries, nc, null, null, - JabRef.jrf.getCurrentBasePanel().getLoadedDatabase().getMetaData(), new ActionListener() { + JabRef.jrf.getCurrentBasePanel().getBibDatabaseContext().getMetaData(), new ActionListener() { @Override public void actionPerformed(ActionEvent e) { diff --git a/src/main/java/net/sf/jabref/gui/actions/CleanupAction.java b/src/main/java/net/sf/jabref/gui/actions/CleanupAction.java new file mode 100644 index 00000000000..4ae08af13c5 --- /dev/null +++ b/src/main/java/net/sf/jabref/gui/actions/CleanupAction.java @@ -0,0 +1,174 @@ +/* Copyright (C) 2012-2015 JabRef contributors. + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +package net.sf.jabref.gui.actions; + +import net.sf.jabref.Globals; +import net.sf.jabref.JabRefPreferences; +import net.sf.jabref.gui.BasePanel; +import net.sf.jabref.gui.CheckBoxMessage; +import net.sf.jabref.gui.CleanupPresetPanel; +import net.sf.jabref.gui.JabRefFrame; +import net.sf.jabref.gui.undo.NamedCompound; +import net.sf.jabref.gui.undo.UndoableFieldChange; +import net.sf.jabref.gui.worker.AbstractWorker; +import net.sf.jabref.logic.FieldChange; +import net.sf.jabref.logic.cleanup.CleanupPreset; +import net.sf.jabref.logic.cleanup.CleanupWorker; +import net.sf.jabref.logic.l10n.Localization; +import net.sf.jabref.model.entry.BibEntry; + +import javax.swing.*; +import java.util.List; +import java.util.Objects; + +public class CleanupAction extends AbstractWorker { + + private final BasePanel panel; + private final JabRefFrame frame; + + /** + * Global variable to count unsuccessful renames + */ + private int unsuccessfulRenames; + + private boolean cancelled; + private int modifiedEntriesCount; + private final JabRefPreferences preferences; + private final CleanupPresetPanel presetPanel; + + public CleanupAction(BasePanel panel, JabRefPreferences preferences) { + this.panel = panel; + this.frame = panel.frame(); + this.preferences = Objects.requireNonNull(preferences); + this.presetPanel = new CleanupPresetPanel(CleanupPreset.loadFromPreferences(preferences)); + } + + @Override + public void init() { + cancelled = false; + modifiedEntriesCount = 0; + int numSelected = panel.getSelectedEntries().length; + if (numSelected == 0) { // None selected. Inform the user to select entries first. + JOptionPane.showMessageDialog(frame, Localization.lang("First select entries to clean up."), + Localization.lang("Cleanup entry"), JOptionPane.INFORMATION_MESSAGE); + cancelled = true; + return; + } + frame.block(); + panel.output(Localization.lang("Doing a cleanup for %0 entries...", Integer.toString(numSelected))); + } + + @Override + public void run() { + if (cancelled) { + return; + } + int choice = showDialog(); + if (choice != JOptionPane.OK_OPTION) { + cancelled = true; + return; + } + CleanupPreset cleanupPreset = presetPanel.getCleanupPreset(); + cleanupPreset.storeInPreferences(preferences); + + if (cleanupPreset.isRenamePDF() && Globals.prefs.getBoolean(JabRefPreferences.AKS_AUTO_NAMING_PDFS_AGAIN)) { + CheckBoxMessage cbm = new CheckBoxMessage( + Localization.lang("Auto-generating PDF-Names does not support undo. Continue?"), + Localization.lang("Disable this confirmation dialog"), false); + int answer = JOptionPane.showConfirmDialog(frame, cbm, Localization.lang("Autogenerate PDF Names"), + JOptionPane.YES_NO_OPTION); + if (cbm.isSelected()) { + Globals.prefs.putBoolean(JabRefPreferences.AKS_AUTO_NAMING_PDFS_AGAIN, false); + } + if (answer == JOptionPane.NO_OPTION) { + cancelled = true; + return; + } + } + + for (BibEntry entry : panel.getSelectedEntries()) { + // undo granularity is on entry level + NamedCompound ce = new NamedCompound(Localization.lang("Cleanup entry")); + + doCleanup(cleanupPreset, entry, ce); + + ce.end(); + if (ce.hasEdits()) { + modifiedEntriesCount++; + panel.undoManager.addEdit(ce); + } + } + } + + @Override + public void update() { + if (cancelled) { + frame.unblock(); + return; + } + if (unsuccessfulRenames > 0) { //Rename failed for at least one entry + JOptionPane.showMessageDialog(frame, + Localization.lang("File rename failed for %0 entries.", Integer.toString(unsuccessfulRenames)), + Localization.lang("Autogenerate PDF Names"), JOptionPane.INFORMATION_MESSAGE); + } + if (modifiedEntriesCount > 0) { + panel.updateEntryEditorIfShowing(); + panel.markBaseChanged(); + } + String message; + switch (modifiedEntriesCount) { + case 0: + message = Localization.lang("No entry needed a clean up"); + break; + case 1: + message = Localization.lang("One entry needed a clean up"); + break; + default: + message = Localization.lang("%0 entries needed a clean up", Integer.toString(modifiedEntriesCount)); + break; + } + panel.output(message); + frame.unblock(); + } + + private int showDialog() { + String dialogTitle = Localization.lang("Cleanup entries"); + + Object[] messages = {Localization.lang("What would you like to clean up?"), presetPanel.getPanel()}; + return JOptionPane.showConfirmDialog(frame, messages, dialogTitle, JOptionPane.OK_CANCEL_OPTION, + JOptionPane.QUESTION_MESSAGE); + } + + /** + * Runs the cleanup on the entry and records the change. + */ + private void doCleanup(CleanupPreset preset, BibEntry entry, NamedCompound ce) { + // Run cleaner + CleanupWorker cleaner = new CleanupWorker(preset, panel.getBibDatabaseContext().getMetaData().getFileDirectory(Globals.FILE_FIELD)); + List changes = cleaner.cleanup(entry); + + unsuccessfulRenames = cleaner.getUnsuccessfulRenames(); + + if (changes.isEmpty()) { + return; + } + + // Register undo action + for (FieldChange change : changes) { + ce.addEdit(new UndoableFieldChange(change)); + } + } +} diff --git a/src/main/java/net/sf/jabref/gui/actions/NewDatabaseAction.java b/src/main/java/net/sf/jabref/gui/actions/NewDatabaseAction.java index 25aa913ec6b..d56ccb49231 100644 --- a/src/main/java/net/sf/jabref/gui/actions/NewDatabaseAction.java +++ b/src/main/java/net/sf/jabref/gui/actions/NewDatabaseAction.java @@ -1,11 +1,13 @@ package net.sf.jabref.gui.actions; +import net.sf.jabref.Defaults; import net.sf.jabref.Globals; -import net.sf.jabref.MetaData; +import net.sf.jabref.BibDatabaseContext; import net.sf.jabref.gui.IconTheme; import net.sf.jabref.gui.JabRefFrame; import net.sf.jabref.logic.l10n.Localization; import net.sf.jabref.model.database.BibDatabase; +import net.sf.jabref.model.database.BibDatabaseMode; import javax.swing.*; import java.awt.event.ActionEvent; @@ -14,22 +16,25 @@ * The action concerned with opening a new database. */ public class NewDatabaseAction extends MnemonicAwareAction { + private final JabRefFrame jabRefFrame; + private final BibDatabaseMode mode; - public NewDatabaseAction(JabRefFrame jabRefFrame) { + public NewDatabaseAction(JabRefFrame jabRefFrame, BibDatabaseMode mode) { super(IconTheme.JabRefIcon.NEW.getIcon()); this.jabRefFrame = jabRefFrame; - putValue(Action.NAME, Localization.menuTitle("New database")); - putValue(Action.SHORT_DESCRIPTION, Localization.lang("New BibTeX database")); - //putValue(MNEMONIC_KEY, GUIGlobals.newKeyCode); + this.mode = mode; + putValue(Action.NAME, Localization.menuTitle("New %0 database", mode.getFormattedName())); + putValue(Action.SHORT_DESCRIPTION, Localization.lang("New %0 database", mode.getFormattedName())); } @Override public void actionPerformed(ActionEvent e) { // Create a new, empty, database. - BibDatabase database = new BibDatabase(); - jabRefFrame.addTab(database, null, new MetaData(), - Globals.prefs.getDefaultEncoding(), true); - jabRefFrame.output(Localization.lang("New database created.")); + BibDatabaseContext bibDatabaseContext = new BibDatabaseContext(new Defaults(BibDatabaseMode.BIBTEX)); + bibDatabaseContext.setMode(mode); + jabRefFrame.addTab(bibDatabaseContext.getDatabase(), null, bibDatabaseContext.getMetaData(), + Globals.prefs.getDefaultEncoding(), true); + jabRefFrame.output(Localization.lang("New %0 database created.", mode.getFormattedName())); } } diff --git a/src/main/java/net/sf/jabref/gui/actions/NewEntryAction.java b/src/main/java/net/sf/jabref/gui/actions/NewEntryAction.java index 06b159df6dd..b857a14c29a 100644 --- a/src/main/java/net/sf/jabref/gui/actions/NewEntryAction.java +++ b/src/main/java/net/sf/jabref/gui/actions/NewEntryAction.java @@ -59,7 +59,7 @@ public void actionPerformed(ActionEvent e) { if (jabRefFrame.tabbedPane.getTabCount() > 0) { ((BasePanel) jabRefFrame.tabbedPane.getSelectedComponent()) - .newEntry(EntryTypes.getType(thisType, jabRefFrame.getCurrentBasePanel().getLoadedDatabase().getMode())); + .newEntry(EntryTypes.getType(thisType, jabRefFrame.getCurrentBasePanel().getBibDatabaseContext().getMode())); } else { LOGGER.info("Action 'New entry' must be disabled when no database is open."); } diff --git a/src/main/java/net/sf/jabref/gui/actions/NewSubDatabaseAction.java b/src/main/java/net/sf/jabref/gui/actions/NewSubDatabaseAction.java index c490d942906..51c01a261c6 100644 --- a/src/main/java/net/sf/jabref/gui/actions/NewSubDatabaseAction.java +++ b/src/main/java/net/sf/jabref/gui/actions/NewSubDatabaseAction.java @@ -1,11 +1,13 @@ package net.sf.jabref.gui.actions; +import net.sf.jabref.Defaults; import net.sf.jabref.Globals; -import net.sf.jabref.LoadedDatabase; -import net.sf.jabref.MetaData; +import net.sf.jabref.BibDatabaseContext; +import net.sf.jabref.JabRefPreferences; import net.sf.jabref.gui.*; import net.sf.jabref.gui.util.PositionWindow; import net.sf.jabref.logic.l10n.Localization; +import net.sf.jabref.model.database.BibDatabaseMode; import net.sf.jabref.wizard.auximport.gui.FromAuxDialog; import javax.swing.*; @@ -35,8 +37,9 @@ public void actionPerformed(ActionEvent e) { dialog.setVisible(true); if (dialog.generatePressed()) { + Defaults defaults = new Defaults(BibDatabaseMode.fromPreference(Globals.prefs.getBoolean(JabRefPreferences.BIBLATEX_MODE))); BasePanel bp = new BasePanel(jabRefFrame, - new LoadedDatabase(dialog.getGenerateDB()), Globals.prefs.getDefaultEncoding()); // meta data + new BibDatabaseContext(dialog.getGenerateDB(), defaults), Globals.prefs.getDefaultEncoding()); // meta data jabRefFrame.tabbedPane.add(GUIGlobals.untitledTitle, bp); jabRefFrame.tabbedPane.setSelectedComponent(bp); jabRefFrame.output(Localization.lang("New database created.")); diff --git a/src/main/java/net/sf/jabref/gui/entryeditor/EntryEditor.java b/src/main/java/net/sf/jabref/gui/entryeditor/EntryEditor.java index 2b5b9864b13..416b58b3271 100644 --- a/src/main/java/net/sf/jabref/gui/entryeditor/EntryEditor.java +++ b/src/main/java/net/sf/jabref/gui/entryeditor/EntryEditor.java @@ -198,7 +198,7 @@ private void setupFieldPanels() { tabbed.removeAll(); tabs.clear(); - EntryType type = EntryTypes.getType(entry.getType(), this.frame.getCurrentBasePanel().getLoadedDatabase().getMode()); + EntryType type = EntryTypes.getType(entry.getType(), this.frame.getCurrentBasePanel().getBibDatabaseContext().getMode()); List fieldList = type.getRequiredFieldsFlat(); @@ -212,7 +212,7 @@ private void setupFieldPanels() { if ((type.getOptionalFields() != null) && (type.getOptionalFields().size() >= 1)) { EntryEditorTab optPan; - if (!this.frame.getCurrentBasePanel().getLoadedDatabase().isBiblatexMode()) { + if (!this.frame.getCurrentBasePanel().getBibDatabaseContext().isBiblatexMode()) { optPan = new EntryEditorTab(frame, panel, type.getOptionalFields(), this, false, false, Localization.lang("Optional fields")); if (optPan.fileListEditor != null) { @@ -356,7 +356,7 @@ private void setupToolBar() { leftPan.add(closeBut, BorderLayout.NORTH); // Create type-label - TypedBibEntry typedEntry = new TypedBibEntry(entry, Optional.empty(), panel.getLoadedDatabase().getMode()); + TypedBibEntry typedEntry = new TypedBibEntry(entry, Optional.empty(), panel.getBibDatabaseContext().getMode()); leftPan.add(new TypeLabel(typedEntry.getTypeForDisplay()), BorderLayout.CENTER); TypeButton typeButton = new TypeButton(); @@ -430,7 +430,7 @@ public Optional getExtra(final FieldEditor editor) { // If this field also has a FieldContentSelector, we need to combine these. return FieldExtraComponents.getJournalExtraComponent(frame, panel, editor, entry, contentSelectors, storeFieldAction); - } else if (panel.getLoadedDatabase().getMetaData().getData(Globals.SELECTOR_META_PREFIX + fieldName) != null) { + } else if (panel.getBibDatabaseContext().getMetaData().getData(Globals.SELECTOR_META_PREFIX + fieldName) != null) { return FieldExtraComponents.getSelectorExtraComponent(frame, panel, editor, contentSelectors, storeFieldAction); } else if (BibtexFields.EXTRA_BROWSE.equals(fieldExtras)) { @@ -446,7 +446,7 @@ public Optional getExtra(final FieldEditor editor) { } else if (BibtexFields.EXTRA_YES_NO.equals(fieldExtras)) { return FieldExtraComponents.getYesNoExtraComponent(editor, this); } else if (BibtexFields.EXTRA_MONTH.equals(fieldExtras)) { - return FieldExtraComponents.getMonthExtraComponent(editor, this, this.frame.getCurrentBasePanel().getLoadedDatabase().getMode()); + return FieldExtraComponents.getMonthExtraComponent(editor, this, this.frame.getCurrentBasePanel().getBibDatabaseContext().getMode()); } return Optional.empty(); } @@ -479,7 +479,7 @@ public void updateSource() { if (updateSource) { try { - String srcString = getSourceString(entry, panel.getLoadedDatabase().getMode()); + String srcString = getSourceString(entry, panel.getBibDatabaseContext().getMode()); source.setText(srcString); lastSourceStringAccepted = srcString; @@ -688,17 +688,6 @@ public void setFocusToField(String fieldName) { * @param switchEntry a BibEntry value */ public synchronized void switchTo(BibEntry switchEntry) { - if (this.entry == switchEntry) { - /** - * Even if the editor is already showing the same entry, update - * the source panel. I'm not sure if this is the correct place to - * do this, but in some cases the source panel will otherwise not - * be up-to-date when an entry is changed while the entry editor - * is existing, set to the same entry, but not visible. - */ - updateSource(); - return; - } storeCurrentEdit(); // Remove this instance as property listener for the entry: @@ -1329,7 +1318,7 @@ public void actionPerformed(ActionEvent e) { } } - LabelPatternUtil.makeLabel(panel.getLoadedDatabase().getMetaData(), panel.getDatabase(), entry); + LabelPatternUtil.makeLabel(panel.getBibDatabaseContext().getMetaData(), panel.getDatabase(), entry); // Store undo information: panel.undoManager.addEdit(new UndoableKeyChange(panel.getDatabase(), entry.getId(), (String) oldValue, entry.getCiteKey())); @@ -1410,7 +1399,7 @@ public void mouseClicked(MouseEvent evt) { String link = tf.getText(); // get selected ? String try { - JabRefDesktop.openExternalViewer(panel.getLoadedDatabase().getMetaData(), link, tf.getFieldName()); + JabRefDesktop.openExternalViewer(panel.getBibDatabaseContext().getMetaData(), link, tf.getFieldName()); } catch (IOException ex) { LOGGER.warn("Error opening file.", ex); } diff --git a/src/main/java/net/sf/jabref/gui/entryeditor/EntryEditorTab.java b/src/main/java/net/sf/jabref/gui/entryeditor/EntryEditorTab.java index 8bf18a040b8..ae5f348c59d 100644 --- a/src/main/java/net/sf/jabref/gui/entryeditor/EntryEditorTab.java +++ b/src/main/java/net/sf/jabref/gui/entryeditor/EntryEditorTab.java @@ -141,7 +141,7 @@ private void setupPanel(JabRefFrame frame, BasePanel bPanel, boolean addKeyField int defaultHeight; int wHeight = (int) (50.0 * BibtexFields.getFieldWeight(fields[i])); if (editorType == GUIGlobals.FILE_LIST_EDITOR) { - fieldEditor = new FileListEditor(frame, bPanel.getLoadedDatabase().getMetaData(), fields[i], null, parent); + fieldEditor = new FileListEditor(frame, bPanel.getBibDatabaseContext().getMetaData(), fields[i], null, parent); fileListEditor = (FileListEditor) fieldEditor; defaultHeight = 0; } else { diff --git a/src/main/java/net/sf/jabref/gui/entryeditor/EntryEditorTabList.java b/src/main/java/net/sf/jabref/gui/entryeditor/EntryEditorTabList.java index bdfbcea1658..5a7aaf67af9 100644 --- a/src/main/java/net/sf/jabref/gui/entryeditor/EntryEditorTabList.java +++ b/src/main/java/net/sf/jabref/gui/entryeditor/EntryEditorTabList.java @@ -30,7 +30,6 @@ public final class EntryEditorTabList { private List> list; private List names; - public EntryEditorTabList() { init(); } diff --git a/src/main/java/net/sf/jabref/gui/entryeditor/FieldExtraComponents.java b/src/main/java/net/sf/jabref/gui/entryeditor/FieldExtraComponents.java index 21a5fb86992..6be16e8e277 100644 --- a/src/main/java/net/sf/jabref/gui/entryeditor/FieldExtraComponents.java +++ b/src/main/java/net/sf/jabref/gui/entryeditor/FieldExtraComponents.java @@ -77,8 +77,8 @@ public static Optional getJournalExtraComponent(JabRefFrame frame, B BibEntry entry, Set contentSelectors, StoreFieldAction storeFieldAction) { JPanel controls = new JPanel(); controls.setLayout(new BorderLayout()); - if (panel.getLoadedDatabase().getMetaData().getData(Globals.SELECTOR_META_PREFIX + editor.getFieldName()) != null) { - FieldContentSelector ws = new FieldContentSelector(frame, panel, frame, editor, panel.getLoadedDatabase().getMetaData(), + if (panel.getBibDatabaseContext().getMetaData().getData(Globals.SELECTOR_META_PREFIX + editor.getFieldName()) != null) { + FieldContentSelector ws = new FieldContentSelector(frame, panel, frame, editor, panel.getBibDatabaseContext().getMetaData(), storeFieldAction, false, ", "); contentSelectors.add(ws); controls.add(ws, BorderLayout.NORTH); @@ -167,7 +167,7 @@ public static Optional getBrowseDocExtraComponent(JabRefFrame frame, off = new OpenFileFilter(new String[] {ext}); } - return Optional.of(new ExternalFilePanel(frame, panel.getLoadedDatabase().getMetaData(), entryEditor, fieldEditor.getFieldName(), off, + return Optional.of(new ExternalFilePanel(frame, panel.getBibDatabaseContext().getMetaData(), entryEditor, fieldEditor.getFieldName(), off, fieldEditor)); } @@ -292,7 +292,7 @@ public static Optional getURLExtraComponent(FieldEditor fieldEditor, */ public static Optional getSelectorExtraComponent(JabRefFrame frame, BasePanel panel, FieldEditor editor, Set contentSelectors, StoreFieldAction storeFieldAction) { - FieldContentSelector ws = new FieldContentSelector(frame, panel, frame, editor, panel.getLoadedDatabase().getMetaData(), + FieldContentSelector ws = new FieldContentSelector(frame, panel, frame, editor, panel.getBibDatabaseContext().getMetaData(), storeFieldAction, false, "author".equals(editor.getFieldName()) || "editor".equals(editor.getFieldName()) ? " and " : ", "); contentSelectors.add(ws); diff --git a/src/main/java/net/sf/jabref/gui/fieldeditors/FileListEditor.java b/src/main/java/net/sf/jabref/gui/fieldeditors/FileListEditor.java index f36314a4580..38f54187a4d 100644 --- a/src/main/java/net/sf/jabref/gui/fieldeditors/FileListEditor.java +++ b/src/main/java/net/sf/jabref/gui/fieldeditors/FileListEditor.java @@ -474,7 +474,7 @@ private void downloadFile() { } } DownloadExternalFile def = new DownloadExternalFile(frame, - frame.getCurrentBasePanel().getLoadedDatabase().getMetaData(), bibtexKey); + frame.getCurrentBasePanel().getBibDatabaseContext().getMetaData(), bibtexKey); try { def.download(this); } catch (IOException ex) { diff --git a/src/main/java/net/sf/jabref/gui/labelPattern/LabelPatternPanel.java b/src/main/java/net/sf/jabref/gui/labelPattern/LabelPatternPanel.java index 870e4240143..1bf2a2c5a94 100644 --- a/src/main/java/net/sf/jabref/gui/labelPattern/LabelPatternPanel.java +++ b/src/main/java/net/sf/jabref/gui/labelPattern/LabelPatternPanel.java @@ -112,7 +112,7 @@ public void actionPerformed(ActionEvent event) { gbl.setConstraints(btnDefault, con); pan.add(btnDefault); - for (EntryType type : EntryTypes.getAllValues(panel.getLoadedDatabase().getMode())) { + for (EntryType type : EntryTypes.getAllValues(panel.getBibDatabaseContext().getMode())) { textFields.put(type.getName().toLowerCase(), addEntryType(pan, type, y)); y++; } diff --git a/src/main/java/net/sf/jabref/gui/labelPattern/SearchFixDuplicateLabels.java b/src/main/java/net/sf/jabref/gui/labelPattern/SearchFixDuplicateLabels.java index 44524b4b6e2..298aec0fde1 100644 --- a/src/main/java/net/sf/jabref/gui/labelPattern/SearchFixDuplicateLabels.java +++ b/src/main/java/net/sf/jabref/gui/labelPattern/SearchFixDuplicateLabels.java @@ -107,7 +107,7 @@ public void update() { NamedCompound ce = new NamedCompound("resolve duplicate keys"); for (BibEntry entry : toGenerateFor) { String oldKey = entry.getCiteKey(); - LabelPatternUtil.makeLabel(panel.getLoadedDatabase().getMetaData(), panel.database(), entry); + LabelPatternUtil.makeLabel(panel.getBibDatabaseContext().getMetaData(), panel.database(), entry); ce.addEdit(new UndoableKeyChange(panel.database(), entry.getId(), oldKey, entry.getCiteKey())); } diff --git a/src/main/java/net/sf/jabref/gui/maintable/MainTable.java b/src/main/java/net/sf/jabref/gui/maintable/MainTable.java index 81ea63395ae..14f464fb273 100644 --- a/src/main/java/net/sf/jabref/gui/maintable/MainTable.java +++ b/src/main/java/net/sf/jabref/gui/maintable/MainTable.java @@ -468,7 +468,7 @@ private void setupComparatorChooser() { // First column: List comparators = comparatorChooser.getComparatorsForColumn(0); comparators.clear(); - comparators.add(new FirstColumnComparator(panel.getLoadedDatabase())); + comparators.add(new FirstColumnComparator(panel.getBibDatabaseContext())); for (int i = 1; i < tableFormat.getColumnCount(); i++) { MainTableColumn tableColumn = tableFormat.getTableColumn(i); @@ -565,7 +565,7 @@ public void actionPerformed(ActionEvent actionEvent) { private int getCellStatus(int row, int col) { try { BibEntry be = sortedForGrouping.get(row); - EntryType type = EntryTypes.getType(be.getType(), panel.getLoadedDatabase().getMode()); + EntryType type = EntryTypes.getType(be.getType(), panel.getBibDatabaseContext().getMode()); String columnName = getColumnName(col).toLowerCase(); if (columnName.equals(BibEntry.KEY_FIELD) || type.getRequiredFieldsFlat().contains(columnName)) { return MainTable.REQUIRED; @@ -630,7 +630,7 @@ private boolean matches(int row, Matcher m) { private boolean isComplete(int row) { try { BibEntry entry = sortedForGrouping.get(row); - TypedBibEntry typedEntry = new TypedBibEntry(entry, Optional.of(panel.database()), panel.getLoadedDatabase().getMode()); + TypedBibEntry typedEntry = new TypedBibEntry(entry, Optional.of(panel.database()), panel.getBibDatabaseContext().getMode()); return typedEntry.hasAllRequiredFields(); } catch (NullPointerException ex) { return true; diff --git a/src/main/java/net/sf/jabref/gui/maintable/MainTableSelectionListener.java b/src/main/java/net/sf/jabref/gui/maintable/MainTableSelectionListener.java index 24c62e3a41e..c62f722b2cb 100644 --- a/src/main/java/net/sf/jabref/gui/maintable/MainTableSelectionListener.java +++ b/src/main/java/net/sf/jabref/gui/maintable/MainTableSelectionListener.java @@ -86,9 +86,9 @@ public MainTableSelectionListener(BasePanel panel, MainTable table) { this.panel = panel; this.tableRows = table.getTableRows(); previewPanel = new PreviewPanel[] { - new PreviewPanel(panel.database(), null, panel, panel.getLoadedDatabase().getMetaData(), Globals.prefs + new PreviewPanel(panel.database(), null, panel, panel.getBibDatabaseContext().getMetaData(), Globals.prefs .get(JabRefPreferences.PREVIEW_0)), - new PreviewPanel(panel.database(), null, panel, panel.getLoadedDatabase().getMetaData(), Globals.prefs + new PreviewPanel(panel.database(), null, panel, panel.getBibDatabaseContext().getMetaData(), Globals.prefs .get(JabRefPreferences.PREVIEW_1))}; panel.getSearchBar().getSearchQueryHighlightObservable().addSearchListener(previewPanel[0]); @@ -319,7 +319,7 @@ public void run() { } if (flEntry != null) { ExternalFileMenuItem item = new ExternalFileMenuItem(panel.frame(), entry, "", - flEntry.link, flEntry.type.getIcon(), panel.getLoadedDatabase().getMetaData(), + flEntry.link, flEntry.type.getIcon(), panel.getBibDatabaseContext().getMetaData(), flEntry.type); boolean success = item.openLink(); if (!success) { @@ -328,7 +328,7 @@ public void run() { } } else { try { - JabRefDesktop.openExternalViewer(panel.getLoadedDatabase().getMetaData(), link, fieldName); + JabRefDesktop.openExternalViewer(panel.getBibDatabaseContext().getMetaData(), link, fieldName); } catch (IOException ex) { panel.output(Localization.lang("Unable to open link.")); } @@ -377,7 +377,7 @@ private void processPopupTrigger(MouseEvent e, int row) { table.setRowSelectionInterval(row, row); //panel.updateViewToSelected(); } - RightClickMenu rightClickMenu = new RightClickMenu(panel, panel.getLoadedDatabase().getMetaData()); + RightClickMenu rightClickMenu = new RightClickMenu(panel, panel.getBibDatabaseContext().getMetaData()); rightClickMenu.show(table, e.getX(), e.getY()); } @@ -414,7 +414,7 @@ private void showIconRightClickMenu(MouseEvent e, int row, MainTableColumn colum description = flEntry.link; } menu.add(new ExternalFileMenuItem(panel.frame(), entry, description, - flEntry.link, flEntry.type.getIcon(), panel.getLoadedDatabase().getMetaData(), + flEntry.link, flEntry.type.getIcon(), panel.getBibDatabaseContext().getMetaData(), flEntry.type)); showDefaultPopup = false; } @@ -431,7 +431,7 @@ private void showIconRightClickMenu(MouseEvent e, int row, MainTableColumn colum icon = iconLabel.getIcon(); } menu.add(new ExternalFileMenuItem(panel.frame(), entry, content, content, icon, - panel.getLoadedDatabase().getMetaData(), field)); + panel.getBibDatabaseContext().getMetaData(), field)); showDefaultPopup = false; } } else { diff --git a/src/main/java/net/sf/jabref/gui/menus/ChangeEntryTypeMenu.java b/src/main/java/net/sf/jabref/gui/menus/ChangeEntryTypeMenu.java index 2e03ab9c5d8..24a0c51d158 100644 --- a/src/main/java/net/sf/jabref/gui/menus/ChangeEntryTypeMenu.java +++ b/src/main/java/net/sf/jabref/gui/menus/ChangeEntryTypeMenu.java @@ -48,7 +48,7 @@ private void populateChangeEntryTypeMenu(JMenu menu, BasePanel panel) { menu.removeAll(); // biblatex? - if(panel.getLoadedDatabase().isBiblatexMode()) { + if(panel.getBibDatabaseContext().isBiblatexMode()) { for (String key : EntryTypes.getAllTypes(BibDatabaseMode.BIBLATEX)) { menu.add(new ChangeTypeAction(EntryTypes.getType(key, BibDatabaseMode.BIBLATEX), panel)); } diff --git a/src/main/java/net/sf/jabref/gui/mergeentries/MergeEntriesDialog.java b/src/main/java/net/sf/jabref/gui/mergeentries/MergeEntriesDialog.java index feba34221dc..7a7f04cb95c 100644 --- a/src/main/java/net/sf/jabref/gui/mergeentries/MergeEntriesDialog.java +++ b/src/main/java/net/sf/jabref/gui/mergeentries/MergeEntriesDialog.java @@ -85,7 +85,7 @@ private void init(BibEntry[] selected) { one = selected[0]; two = selected[1]; - mergeEntries = new MergeEntries(one, two, panel.getLoadedDatabase().getMode()); + mergeEntries = new MergeEntries(one, two, panel.getBibDatabaseContext().getMode()); // Create undo-compound ce = new NamedCompound(MERGE_ENTRIES); diff --git a/src/main/java/net/sf/jabref/gui/mergeentries/MergeEntryDOIDialog.java b/src/main/java/net/sf/jabref/gui/mergeentries/MergeEntryDOIDialog.java index d49358dddbc..85ede2711d6 100644 --- a/src/main/java/net/sf/jabref/gui/mergeentries/MergeEntryDOIDialog.java +++ b/src/main/java/net/sf/jabref/gui/mergeentries/MergeEntryDOIDialog.java @@ -93,7 +93,7 @@ public MergeEntryDOIDialog(BasePanel panel) { */ private void init() { mergeEntries = new MergeEntries(this.originalEntry, this.doiEntry, Localization.lang("Original entry"), - Localization.lang("Entry from DOI"), panel.getLoadedDatabase().getMode()); + Localization.lang("Entry from DOI"), panel.getBibDatabaseContext().getMode()); // Create undo-compound ce = new NamedCompound(Localization.lang("Merge from DOI")); diff --git a/src/main/java/net/sf/jabref/gui/preftabs/AdvancedTab.java b/src/main/java/net/sf/jabref/gui/preftabs/AdvancedTab.java index 9560acd5da9..f15170decac 100644 --- a/src/main/java/net/sf/jabref/gui/preftabs/AdvancedTab.java +++ b/src/main/java/net/sf/jabref/gui/preftabs/AdvancedTab.java @@ -48,10 +48,12 @@ class AdvancedTab extends JPanel implements PrefsTab { private final JCheckBox useDefault; private final JCheckBox useRemoteServer; private final JCheckBox useIEEEAbrv; + private final JCheckBox biblatexMode; private final JComboBox className; private final JTextField remoteServerPort; private String oldLnf = ""; private boolean oldUseDef; + private boolean oldBiblMode; private final JCheckBox useConvertToEquation; private final JCheckBox useCaseKeeperOnSearch; @@ -68,6 +70,7 @@ public AdvancedTab(JabRefPreferences prefs, AboutDialog diag, JabRef jabRef) { useDefault = new JCheckBox(Localization.lang("Use other look and feel")); useRemoteServer = new JCheckBox(Localization.lang("Listen for remote operation on port") + ':'); useIEEEAbrv = new JCheckBox(Localization.lang("Use IEEE LaTeX abbreviations")); + biblatexMode = new JCheckBox(Localization.lang("%0 mode", "BibLaTeX")); remoteServerPort = new JTextField(); String[] possibleLookAndFeels = {UIManager.getSystemLookAndFeelClassName(), UIManager.getCrossPlatformLookAndFeelClassName(), "com.jgoodies.looks.plastic.Plastic3DLookAndFeel", @@ -150,6 +153,12 @@ public AdvancedTab(JabRefPreferences prefs, AboutDialog diag, JabRef jabRef) { builder.nextLine(); builder.append(new JPanel()); builder.append(useIEEEAbrv); + + builder.nextLine(); + builder.appendSeparator(Localization.lang("%0 mode", "BibLaTeX")); + builder.append(new JPanel()); + builder.append(biblatexMode); + builder.nextLine(); builder.appendSeparator(Localization.lang("Import conversions")); builder.nextLine(); @@ -179,6 +188,8 @@ public void setValues() { useRemoteServer.setSelected(remotePreferences.useRemoteServer()); remoteServerPort.setText(String.valueOf(remotePreferences.getPort())); useIEEEAbrv.setSelected(Globals.prefs.getBoolean(JabRefPreferences.USE_IEEE_ABRV)); + oldBiblMode = Globals.prefs.getBoolean(JabRefPreferences.BIBLATEX_MODE); + biblatexMode.setSelected(oldBiblMode); useConvertToEquation.setSelected(Globals.prefs.getBoolean(JabRefPreferences.USE_CONVERT_TO_EQUATION)); useCaseKeeperOnSearch.setSelected(Globals.prefs.getBoolean(JabRefPreferences.USE_CASE_KEEPER_ON_SEARCH)); useUnitFormatterOnSearch.setSelected(Globals.prefs.getBoolean(JabRefPreferences.USE_UNIT_FORMATTER_ON_SEARCH)); @@ -195,6 +206,8 @@ public void storeSettings() { } storeRemoteSettings(); + preferences.putBoolean(JabRefPreferences.BIBLATEX_MODE, biblatexMode.isSelected()); + if ((useDefault.isSelected() == oldUseDef) || !oldLnf.equals(className.getSelectedItem().toString())) { JOptionPane.showMessageDialog(null, Localization.lang("You have changed the look and feel setting.").concat(" ") diff --git a/src/main/java/net/sf/jabref/gui/search/SearchBar.java b/src/main/java/net/sf/jabref/gui/search/SearchBar.java index 0620c0f95d2..58308aca467 100644 --- a/src/main/java/net/sf/jabref/gui/search/SearchBar.java +++ b/src/main/java/net/sf/jabref/gui/search/SearchBar.java @@ -97,7 +97,7 @@ public SearchBar(BasePanel basePanel) { openCurrentResultsInDialog.setToolTipText(Localization.lang("Show search results in a window")); openCurrentResultsInDialog.addActionListener(ae -> { SearchResultsDialog searchDialog = new SearchResultsDialog(basePanel.frame(), Localization.lang("Search results in database %0 for %1", - basePanel.getLoadedDatabase().getDatabaseFile().getName(), SearchQueryLocalizer.localize(this.getSearchQuery()))); + basePanel.getBibDatabaseContext().getDatabaseFile().getName(), SearchQueryLocalizer.localize(this.getSearchQuery()))); List entries = basePanel.getDatabase().getEntries().stream().filter(BibEntry::isSearchHit).collect(Collectors.toList()); searchDialog.addEntries(entries, basePanel); searchDialog.selectFirstEntry(); diff --git a/src/main/java/net/sf/jabref/gui/search/SearchResultsDialog.java b/src/main/java/net/sf/jabref/gui/search/SearchResultsDialog.java index 1f107d133ac..f52e8b62101 100644 --- a/src/main/java/net/sf/jabref/gui/search/SearchResultsDialog.java +++ b/src/main/java/net/sf/jabref/gui/search/SearchResultsDialog.java @@ -349,12 +349,12 @@ public void mouseClicked(MouseEvent e) { } FileListEntry fl = tableModel.getEntry(0); (new ExternalFileMenuItem(frame, entry, "", fl.link, null, - p.getLoadedDatabase().getMetaData(), fl.type)).actionPerformed(null); + p.getBibDatabaseContext().getMetaData(), fl.type)).actionPerformed(null); } break; case URL_COL: entry.getFieldOptional("url").ifPresent(link -> { try { - JabRefDesktop.openExternalViewer(p.getLoadedDatabase().getMetaData(), link, "url"); + JabRefDesktop.openExternalViewer(p.getBibDatabaseContext().getMetaData(), link, "url"); } catch (IOException ex) { LOGGER.warn("Could not open viewer", ex); } @@ -391,7 +391,7 @@ public void processPopupTrigger(MouseEvent e) { description = flEntry.link; } menu.add(new ExternalFileMenuItem(p.frame(), entry, description, - flEntry.link, flEntry.type.getIcon(), p.getLoadedDatabase().getMetaData(), + flEntry.link, flEntry.type.getIcon(), p.getBibDatabaseContext().getMetaData(), flEntry.type)); count++; } @@ -417,7 +417,7 @@ public void listChanged(ListEvent listEvent) { // Find out which BasePanel the selected entry belongs to: BasePanel p = entryHome.get(entry); // Update the preview's metadata reference: - preview.setMetaData(p.getLoadedDatabase().getMetaData()); + preview.setMetaData(p.getBibDatabaseContext().getMetaData()); // Update the preview's entry: preview.setEntry(entry); contentPane.setDividerLocation(0.5f); diff --git a/src/main/java/net/sf/jabref/gui/util/FirstColumnComparator.java b/src/main/java/net/sf/jabref/gui/util/FirstColumnComparator.java index 9ad3d1c2ba4..7c17c710176 100644 --- a/src/main/java/net/sf/jabref/gui/util/FirstColumnComparator.java +++ b/src/main/java/net/sf/jabref/gui/util/FirstColumnComparator.java @@ -15,7 +15,7 @@ */ package net.sf.jabref.gui.util; -import net.sf.jabref.LoadedDatabase; +import net.sf.jabref.BibDatabaseContext; import net.sf.jabref.model.entry.BibEntry; import net.sf.jabref.model.entry.TypedBibEntry; @@ -24,9 +24,9 @@ public class FirstColumnComparator implements Comparator { - private final LoadedDatabase database; + private final BibDatabaseContext database; - public FirstColumnComparator(LoadedDatabase database) { + public FirstColumnComparator(BibDatabaseContext database) { this.database = database; } diff --git a/src/main/java/net/sf/jabref/gui/worker/SendAsEMailAction.java b/src/main/java/net/sf/jabref/gui/worker/SendAsEMailAction.java index ad8033e1af3..f1f416b52e9 100644 --- a/src/main/java/net/sf/jabref/gui/worker/SendAsEMailAction.java +++ b/src/main/java/net/sf/jabref/gui/worker/SendAsEMailAction.java @@ -84,7 +84,7 @@ public void run() { for (BibEntry entry : bes) { try { - bibtexEntryWriter.write(entry, sw, panel.getLoadedDatabase().getMode()); + bibtexEntryWriter.write(entry, sw, panel.getBibDatabaseContext().getMode()); } catch (IOException e) { LOGGER.warn("Problem creating BibTeX file for mailing.", e); } @@ -97,7 +97,7 @@ public void run() { boolean openFolders = JabRefPreferences.getInstance().getBoolean(JabRefPreferences.OPEN_FOLDERS_OF_ATTACHED_FILES); List fileList = FileUtil.getListOfLinkedFiles(Arrays.asList(bes), - frame.getCurrentBasePanel().getLoadedDatabase().getMetaData().getFileDirectory(Globals.FILE_FIELD)); + frame.getCurrentBasePanel().getBibDatabaseContext().getMetaData().getFileDirectory(Globals.FILE_FIELD)); for (File f : fileList) { attachments.add(f.getPath()); if (openFolders) { diff --git a/src/main/java/net/sf/jabref/importer/AppendDatabaseAction.java b/src/main/java/net/sf/jabref/importer/AppendDatabaseAction.java index 9d16a5c9889..fec609dfb82 100644 --- a/src/main/java/net/sf/jabref/importer/AppendDatabaseAction.java +++ b/src/main/java/net/sf/jabref/importer/AppendDatabaseAction.java @@ -210,7 +210,7 @@ private static void mergeFromBibtex(JabRefFrame frame, BasePanel panel, ParserRe if (importSelectorWords) { for (String s : meta) { if (s.startsWith(Globals.SELECTOR_META_PREFIX)) { - panel.getLoadedDatabase().getMetaData().putData(s, meta.getData(s)); + panel.getBibDatabaseContext().getMetaData().putData(s, meta.getData(s)); } } } diff --git a/src/main/java/net/sf/jabref/importer/CheckForNewEntryTypesAction.java b/src/main/java/net/sf/jabref/importer/CheckForNewEntryTypesAction.java index d6cd788c30f..d2075426379 100644 --- a/src/main/java/net/sf/jabref/importer/CheckForNewEntryTypesAction.java +++ b/src/main/java/net/sf/jabref/importer/CheckForNewEntryTypesAction.java @@ -20,7 +20,10 @@ import javax.swing.JOptionPane; -import net.sf.jabref.LoadedDatabase; +import net.sf.jabref.BibDatabaseContext; +import net.sf.jabref.Defaults; +import net.sf.jabref.Globals; +import net.sf.jabref.JabRefPreferences; import net.sf.jabref.gui.BasePanel; import net.sf.jabref.model.database.BibDatabaseMode; import net.sf.jabref.model.entry.CustomEntryType; @@ -36,7 +39,8 @@ public class CheckForNewEntryTypesAction implements PostOpenAction { @Override public boolean isActionNecessary(ParserResult pr) { - BibDatabaseMode type = new LoadedDatabase(pr.getDatabase(), pr.getMetaData()).getMode(); + Defaults defaults = new Defaults(BibDatabaseMode.fromPreference(Globals.prefs.getBoolean(JabRefPreferences.BIBLATEX_MODE))); + BibDatabaseMode type = new BibDatabaseContext(pr.getDatabase(), pr.getMetaData(), defaults).getMode(); // See if any custom entry types were imported, but disregard those we already know: for (Iterator i = pr.getEntryTypes().keySet().iterator(); i.hasNext();) { String typeName = i.next().toLowerCase(); diff --git a/src/main/java/net/sf/jabref/importer/DatabaseFileLookup.java b/src/main/java/net/sf/jabref/importer/DatabaseFileLookup.java index afdc87aff0c..f71a2ef4356 100644 --- a/src/main/java/net/sf/jabref/importer/DatabaseFileLookup.java +++ b/src/main/java/net/sf/jabref/importer/DatabaseFileLookup.java @@ -48,7 +48,7 @@ class DatabaseFileLookup { */ public DatabaseFileLookup(BibDatabase database) { Objects.requireNonNull(database); - possibleFilePaths = Optional.ofNullable(JabRef.jrf.getCurrentBasePanel().getLoadedDatabase().getMetaData().getFileDirectory(Globals.FILE_FIELD)).orElse(new ArrayList<>()); + possibleFilePaths = Optional.ofNullable(JabRef.jrf.getCurrentBasePanel().getBibDatabaseContext().getMetaData().getFileDirectory(Globals.FILE_FIELD)).orElse(new ArrayList<>()); for (BibEntry entry : database.getEntries()) { fileCache.addAll(parseFileField(entry)); diff --git a/src/main/java/net/sf/jabref/importer/EntryFromFileCreator.java b/src/main/java/net/sf/jabref/importer/EntryFromFileCreator.java index dd8177b386b..a752810a030 100644 --- a/src/main/java/net/sf/jabref/importer/EntryFromFileCreator.java +++ b/src/main/java/net/sf/jabref/importer/EntryFromFileCreator.java @@ -154,7 +154,7 @@ private void addFileInfo(BibEntry entry, File file) { ExternalFileType fileType = ExternalFileTypes.getInstance() .getExternalFileTypeByExt(externalFileType.getFieldName()); - List possibleFilePaths = JabRef.jrf.getCurrentBasePanel().getLoadedDatabase().getMetaData().getFileDirectory(Globals.FILE_FIELD); + List possibleFilePaths = JabRef.jrf.getCurrentBasePanel().getBibDatabaseContext().getMetaData().getFileDirectory(Globals.FILE_FIELD); File shortenedFileName = FileUtil.shortenFileName(file, possibleFilePaths); FileListEntry fileListEntry = new FileListEntry("", shortenedFileName.getPath(), fileType); diff --git a/src/main/java/net/sf/jabref/importer/OpenDatabaseAction.java b/src/main/java/net/sf/jabref/importer/OpenDatabaseAction.java index 4dce4e0811b..9c4659d6170 100644 --- a/src/main/java/net/sf/jabref/importer/OpenDatabaseAction.java +++ b/src/main/java/net/sf/jabref/importer/OpenDatabaseAction.java @@ -42,6 +42,7 @@ import net.sf.jabref.importer.fileformat.BibtexParser; import net.sf.jabref.logic.l10n.Localization; import net.sf.jabref.model.database.BibDatabase; +import net.sf.jabref.model.database.BibDatabaseMode; import net.sf.jabref.model.entry.BibEntry; import net.sf.jabref.specialfields.SpecialFieldsUtils; import net.sf.jabref.logic.util.io.FileBasedLock; @@ -156,7 +157,7 @@ public void openFiles(List filesToOpen, boolean raisePanel) { File file = iterator.next(); for (int i = 0; i < frame.getTabbedPane().getTabCount(); i++) { BasePanel basePanel = frame.getBasePanelAt(i); - if ((basePanel.getLoadedDatabase().getDatabaseFile() != null) && basePanel.getLoadedDatabase().getDatabaseFile().equals(file)) { + if ((basePanel.getBibDatabaseContext().getDatabaseFile() != null) && basePanel.getBibDatabaseContext().getDatabaseFile().equals(file)) { iterator.remove(); removed++; // See if we removed the final one. If so, we must perhaps @@ -190,7 +191,7 @@ public void run() { // If no files are remaining to open, this could mean that a file was // already open. If so, we may have to raise the correct tab: else if (toRaise != null) { - frame.output(Localization.lang("File '%0' is already open.", toRaise.getLoadedDatabase().getDatabaseFile().getPath())); + frame.output(Localization.lang("File '%0' is already open.", toRaise.getBibDatabaseContext().getDatabaseFile().getPath())); frame.getTabbedPane().setSelectedComponent(toRaise); } @@ -338,7 +339,9 @@ public BasePanel addNewDatabase(ParserResult result, final File file, boolean ra if (result.hasWarnings()) { JabRefExecutorService.INSTANCE.execute(() -> ParserResultWarningDialog.showParserResultWarningDialog(result, frame)); } - BasePanel basePanel = new BasePanel(frame, new LoadedDatabase(database, meta, file), result.getEncoding()); + + Defaults defaults = new Defaults(BibDatabaseMode.fromPreference(Globals.prefs.getBoolean(JabRefPreferences.BIBLATEX_MODE))); + BasePanel basePanel = new BasePanel(frame, new BibDatabaseContext(database, meta, file, defaults), result.getEncoding()); // file is set to null inside the EventDispatcherThread SwingUtilities.invokeLater(new OpenItSwingHelper(basePanel, file, raisePanel)); diff --git a/src/main/java/net/sf/jabref/importer/fileformat/EndnoteImporter.java b/src/main/java/net/sf/jabref/importer/fileformat/EndnoteImporter.java index 7ee330a1863..2f3f4566868 100644 --- a/src/main/java/net/sf/jabref/importer/fileformat/EndnoteImporter.java +++ b/src/main/java/net/sf/jabref/importer/fileformat/EndnoteImporter.java @@ -116,7 +116,7 @@ public List importEntries(InputStream stream, OutputPrinter status) th for (String entry : entries) { hm.clear(); author = ""; - type = ""; + type = "misc"; editor = ""; artnum = ""; diff --git a/src/main/java/net/sf/jabref/importer/fileformat/FreeCiteImporter.java b/src/main/java/net/sf/jabref/importer/fileformat/FreeCiteImporter.java index 4c1a09f04fa..6e14f57e356 100644 --- a/src/main/java/net/sf/jabref/importer/fileformat/FreeCiteImporter.java +++ b/src/main/java/net/sf/jabref/importer/fileformat/FreeCiteImporter.java @@ -212,7 +212,7 @@ public List importEntries(String text, OutputPrinter status) { e.setType(type); // autogenerate label (BibTeX key) - LabelPatternUtil.makeLabel(JabRef.jrf.getCurrentBasePanel().getLoadedDatabase().getMetaData(), JabRef.jrf.getCurrentBasePanel().database(), e); + LabelPatternUtil.makeLabel(JabRef.jrf.getCurrentBasePanel().getBibDatabaseContext().getMetaData(), JabRef.jrf.getCurrentBasePanel().database(), e); res.add(e); } diff --git a/src/main/java/net/sf/jabref/importer/fileformat/MedlinePlainImporter.java b/src/main/java/net/sf/jabref/importer/fileformat/MedlinePlainImporter.java index 7573e697d0a..94b8d34e471 100644 --- a/src/main/java/net/sf/jabref/importer/fileformat/MedlinePlainImporter.java +++ b/src/main/java/net/sf/jabref/importer/fileformat/MedlinePlainImporter.java @@ -105,7 +105,7 @@ public List importEntries(InputStream stream, OutputPrinter status) th continue; } - String type = ""; + String type = "misc"; String author = ""; String editor = ""; String comment = ""; diff --git a/src/main/java/net/sf/jabref/importer/fileformat/OvidImporter.java b/src/main/java/net/sf/jabref/importer/fileformat/OvidImporter.java index 0211ca93759..a6bf56fd89e 100644 --- a/src/main/java/net/sf/jabref/importer/fileformat/OvidImporter.java +++ b/src/main/java/net/sf/jabref/importer/fileformat/OvidImporter.java @@ -230,7 +230,7 @@ public List importEntries(InputStream stream, OutputPrinter status) th } // Set the entrytype properly: - String entryType = h.containsKey("entrytype") ? h.get("entrytype") : "other"; + String entryType = h.containsKey("entrytype") ? h.get("entrytype") : "misc"; h.remove("entrytype"); if ("book".equals(entryType) && h.containsKey("chaptertitle")) { // This means we have an "incollection" entry. diff --git a/src/main/java/net/sf/jabref/logic/integrity/IntegrityCheck.java b/src/main/java/net/sf/jabref/logic/integrity/IntegrityCheck.java index 42cb112e2d8..9151bff05c9 100644 --- a/src/main/java/net/sf/jabref/logic/integrity/IntegrityCheck.java +++ b/src/main/java/net/sf/jabref/logic/integrity/IntegrityCheck.java @@ -1,8 +1,5 @@ package net.sf.jabref.logic.integrity; -import net.sf.jabref.Globals; -import net.sf.jabref.JabRefPreferences; -import net.sf.jabref.LoadedDatabase; import net.sf.jabref.logic.l10n.Localization; import net.sf.jabref.model.database.BibDatabase; import net.sf.jabref.model.entry.BibEntry; diff --git a/src/main/java/net/sf/jabref/logic/l10n/Localization.java b/src/main/java/net/sf/jabref/logic/l10n/Localization.java index 7d12d5277ed..ca2bacceb88 100644 --- a/src/main/java/net/sf/jabref/logic/l10n/Localization.java +++ b/src/main/java/net/sf/jabref/logic/l10n/Localization.java @@ -67,7 +67,7 @@ private static String translate(ResourceBundle resBundle, String idForErrorMessa LOGGER.warn("Warning: no " + idForErrorMessage + " translation for \"" + key + "\" for locale " + Locale.getDefault()); - return key; + translation = key; } return new LocalizationKeyParams(translation, params).replacePlaceholders(); diff --git a/src/main/java/net/sf/jabref/logic/xmp/XMPSchemaBibtex.java b/src/main/java/net/sf/jabref/logic/xmp/XMPSchemaBibtex.java index 0afb01e8e6e..41978dcaf52 100644 --- a/src/main/java/net/sf/jabref/logic/xmp/XMPSchemaBibtex.java +++ b/src/main/java/net/sf/jabref/logic/xmp/XMPSchemaBibtex.java @@ -299,7 +299,7 @@ public void setBibtexEntry(BibEntry entry, BibDatabase database) { public BibEntry getBibtexEntry() { String type = getTextProperty("entrytype"); - BibEntry e = new BibEntry(IdGenerator.next(), String.valueOf(type)); + BibEntry e = new BibEntry(IdGenerator.next(), Optional.ofNullable(type).orElse("misc")); // Get Text Properties Map text = XMPSchemaBibtex.getAllProperties(this, "bibtex"); diff --git a/src/main/java/net/sf/jabref/logic/xmp/XMPUtil.java b/src/main/java/net/sf/jabref/logic/xmp/XMPUtil.java index a9f2903ff6c..e1e6ab3d640 100644 --- a/src/main/java/net/sf/jabref/logic/xmp/XMPUtil.java +++ b/src/main/java/net/sf/jabref/logic/xmp/XMPUtil.java @@ -143,7 +143,11 @@ public static List readXMP(InputStream inputStream) for (XMPSchema schema : schemas) { XMPSchemaBibtex bib = (XMPSchemaBibtex) schema; - result.add(bib.getBibtexEntry()); + BibEntry entry = bib.getBibtexEntry(); + if(entry.getType() == null) { + entry.setType("misc"); + } + result.add(entry); } // If we did not find anything have a look if a Dublin Core exists @@ -156,6 +160,9 @@ public static List readXMP(InputStream inputStream) BibEntry entry = XMPUtil.getBibtexEntryFromDublinCore(dc); if (entry != null) { + if(entry.getType() == null) { + entry.setType("misc"); + } result.add(entry); } } @@ -166,6 +173,9 @@ public static List readXMP(InputStream inputStream) .getDocumentInformation()); if (entry != null) { + if(entry.getType() == null) { + entry.setType("misc"); + } result.add(entry); } } @@ -173,7 +183,7 @@ public static List readXMP(InputStream inputStream) // return null, if no metadata was found if (result.isEmpty()) { - return null; + return Collections.emptyList(); } return result; } @@ -866,7 +876,7 @@ private static void writeToDCSchema(XMPSchemaDublinCore dcSchema, */ TypedBibEntry typedEntry = new TypedBibEntry(entry, Optional.empty(), BibDatabaseMode.BIBTEX); String o = typedEntry.getTypeForDisplay(); - if (o != null) { + if (!o.isEmpty()) { dcSchema.addType(o); } } diff --git a/src/main/java/net/sf/jabref/model/database/BibDatabaseMode.java b/src/main/java/net/sf/jabref/model/database/BibDatabaseMode.java index 1cca335e59e..277307b9c7f 100644 --- a/src/main/java/net/sf/jabref/model/database/BibDatabaseMode.java +++ b/src/main/java/net/sf/jabref/model/database/BibDatabaseMode.java @@ -2,5 +2,25 @@ public enum BibDatabaseMode { BIBTEX, - BIBLATEX + BIBLATEX; + + public String getFormattedName() { + if(this == BIBTEX) { + return "BibTeX"; + } else { + return "BibLaTeX"; + } + } + + public BibDatabaseMode getOppositeMode() { + if(this == BIBTEX) { + return BIBLATEX; + } else { + return BIBTEX; + } + } + + public static BibDatabaseMode fromPreference(boolean isBibLatex) { + return isBibLatex ? BIBLATEX : BIBTEX; + } } diff --git a/src/main/java/net/sf/jabref/model/database/BibDatabaseModeDetection.java b/src/main/java/net/sf/jabref/model/database/BibDatabaseModeDetection.java index 465c53fc1c3..e9e124de10a 100644 --- a/src/main/java/net/sf/jabref/model/database/BibDatabaseModeDetection.java +++ b/src/main/java/net/sf/jabref/model/database/BibDatabaseModeDetection.java @@ -35,26 +35,8 @@ public static BibDatabaseMode inferMode(BibDatabase database) { return BibDatabaseMode.BIBLATEX; } else { // field-based check - if(database.getEntries().stream().anyMatch(hasBiblatexFields())) { - return BibDatabaseMode.BIBLATEX; - } + return BibDatabaseMode.BIBTEX; } - return BibDatabaseMode.BIBTEX; - } - - private static List exclusiveBiblatexFields(String type) { - final Optional biblatexType = BibLatexEntryTypes.getType(type); - final Optional bibtexType = BibtexEntryTypes.getType(type); - - // return empty array if this is no Biblatex or BibTex type - if (!biblatexType.isPresent() || !bibtexType.isPresent()) { - return new ArrayList<>(0); - } - - final List bibtexFields = bibtexType.get().getAllFields(); - final List biblatexFields = biblatexType.get().getAllFields(); - - return biblatexFields.stream().filter(f -> !bibtexFields.contains(f)).collect(Collectors.toList()); } private static List getEntryTypes(Collection collection) { @@ -73,8 +55,4 @@ private static Predicate isIncludedIn(List collection) { return entry -> collection.stream().anyMatch(c -> c.getName().equalsIgnoreCase(entry)); } - private static Predicate hasBiblatexFields() { - return e -> e.getFieldNames().stream() - .anyMatch(name -> exclusiveBiblatexFields(e.getType()).stream().anyMatch(c -> c.equalsIgnoreCase(name))); - } } diff --git a/src/main/java/net/sf/jabref/model/entry/TypedBibEntry.java b/src/main/java/net/sf/jabref/model/entry/TypedBibEntry.java index 0156924d02b..981fbd651c0 100644 --- a/src/main/java/net/sf/jabref/model/entry/TypedBibEntry.java +++ b/src/main/java/net/sf/jabref/model/entry/TypedBibEntry.java @@ -52,8 +52,8 @@ public boolean hasAllRequiredFields() { */ public String getTypeForDisplay() { EntryType entryType = EntryTypes.getType(entry.getType(), type); - if (entryType != null) { - return entryType.getName(); + if (entryType == null) { + return ""; } else { return EntryUtil.capitalizeFirst(entry.getType()); } diff --git a/src/main/java/net/sf/jabref/pdfimport/PdfImporter.java b/src/main/java/net/sf/jabref/pdfimport/PdfImporter.java index 34c56bb5227..e2925a68dd8 100644 --- a/src/main/java/net/sf/jabref/pdfimport/PdfImporter.java +++ b/src/main/java/net/sf/jabref/pdfimport/PdfImporter.java @@ -167,7 +167,7 @@ private List importPdfFiles(List fileNames, OutputPrinter stat int globalChoice = Globals.prefs.getInt(ImportSettingsTab.PREF_IMPORT_DEFAULT_PDF_IMPORT_STYLE); // Get a list of file directories: - List dirsS = panel.getLoadedDatabase().getMetaData().getFileDirectory(Globals.FILE_FIELD); + List dirsS = panel.getBibDatabaseContext().getMetaData().getFileDirectory(Globals.FILE_FIELD); List res = new ArrayList<>(); @@ -273,7 +273,7 @@ private List importPdfFiles(List fileNames, OutputPrinter stat panel.database().insertEntry(entry); panel.markBaseChanged(); - LabelPatternUtil.makeLabel(panel.getLoadedDatabase().getMetaData(), panel.database(), entry); + LabelPatternUtil.makeLabel(panel.getBibDatabaseContext().getMetaData(), panel.database(), entry); dfh = new DroppedFileHandler(frame, panel); dfh.linkPdfToEntry(fileName, entryTable, entry); panel.highlightEntry(entry); diff --git a/src/main/java/net/sf/jabref/sql/DbConnectAction.java b/src/main/java/net/sf/jabref/sql/DbConnectAction.java index f4b168d7e36..40a952adad3 100644 --- a/src/main/java/net/sf/jabref/sql/DbConnectAction.java +++ b/src/main/java/net/sf/jabref/sql/DbConnectAction.java @@ -59,7 +59,7 @@ public void actionPerformed(ActionEvent e) { @Override public void action() { - DBStrings dbs = panel.getLoadedDatabase().getMetaData().getDBStrings(); + DBStrings dbs = panel.getBibDatabaseContext().getMetaData().getDBStrings(); // init DB strings if necessary if (!dbs.isInitialized()) { @@ -99,7 +99,7 @@ public void action() { Localization.lang("Connect to SQL database"), JOptionPane.ERROR_MESSAGE); } finally { - panel.getLoadedDatabase().getMetaData().setDBStrings(dbs); + panel.getBibDatabaseContext().getMetaData().setDBStrings(dbs); dbd.dispose(); } } diff --git a/src/main/java/net/sf/jabref/sql/exporter/DBExporter.java b/src/main/java/net/sf/jabref/sql/exporter/DBExporter.java index b2ea7f98549..212f495a1f0 100644 --- a/src/main/java/net/sf/jabref/sql/exporter/DBExporter.java +++ b/src/main/java/net/sf/jabref/sql/exporter/DBExporter.java @@ -28,7 +28,7 @@ import javax.swing.JOptionPane; -import net.sf.jabref.LoadedDatabase; +import net.sf.jabref.*; import net.sf.jabref.model.database.BibDatabaseMode; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -37,7 +37,6 @@ import net.sf.jabref.model.entry.BibEntry; import net.sf.jabref.model.entry.BibtexString; import net.sf.jabref.gui.JabRefFrame; -import net.sf.jabref.MetaData; import net.sf.jabref.groups.structure.*; import net.sf.jabref.logic.l10n.Localization; import net.sf.jabref.logic.util.strings.StringUtil; @@ -83,7 +82,8 @@ private void performExport(final BibDatabase database, final MetaData metaData, final int database_id = getDatabaseIDByName(metaData, out, dbName); removeAllRecordsForAGivenDB(out, database_id); - populateEntryTypesTable(out, new LoadedDatabase(database, metaData).getMode()); + Defaults defaults = new Defaults(BibDatabaseMode.fromPreference(Globals.prefs.getBoolean(JabRefPreferences.BIBLATEX_MODE))); + populateEntryTypesTable(out, new BibDatabaseContext(database, metaData, defaults).getMode()); populateEntriesTable(database_id, entries, out); populateStringTable(database, out, database_id); populateGroupTypesTable(out); diff --git a/src/main/java/net/sf/jabref/sql/importer/DbImportAction.java b/src/main/java/net/sf/jabref/sql/importer/DbImportAction.java index e8fb558ef05..407eca55c5a 100644 --- a/src/main/java/net/sf/jabref/sql/importer/DbImportAction.java +++ b/src/main/java/net/sf/jabref/sql/importer/DbImportAction.java @@ -163,7 +163,7 @@ private void performImport() { importer.removeDB(dialogo, dbName, conn, metaData); performImport(); } else if (dialogo.moreThanOne) { - databases = importer.performImport(dbs, dialogo.listOfDBs, frame.getCurrentBasePanel().getLoadedDatabase().getMode()); + databases = importer.performImport(dbs, dialogo.listOfDBs, frame.getCurrentBasePanel().getBibDatabaseContext().getMode()); for (DBImporterResult res : databases) { database = res.getDatabase(); metaData = res.getMetaData(); @@ -199,7 +199,7 @@ public void update() { metaData = res.getMetaData(); if (database != null) { BasePanel pan = frame.addTab(database, null, metaData, Globals.prefs.getDefaultEncoding(), true); - pan.getLoadedDatabase().getMetaData().setDBStrings(dbs); + pan.getBibDatabaseContext().getMetaData().setDBStrings(dbs); frame.setTabTitle(pan, res.getName() + "(Imported)", "Imported DB"); pan.markBaseChanged(); } diff --git a/src/main/java/net/sf/jabref/wizard/text/gui/TextInputDialog.java b/src/main/java/net/sf/jabref/wizard/text/gui/TextInputDialog.java index 7b0a70c401f..559b4c3d352 100644 --- a/src/main/java/net/sf/jabref/wizard/text/gui/TextInputDialog.java +++ b/src/main/java/net/sf/jabref/wizard/text/gui/TextInputDialog.java @@ -483,7 +483,7 @@ private boolean parseWithFreeCiteAndAddEntries() { private void updateSourceView() { StringWriter sw = new StringWriter(200); try { - new BibEntryWriter(new LatexFieldFormatter(), false).write(entry, sw, frame.getCurrentBasePanel().getLoadedDatabase().getMode()); + new BibEntryWriter(new LatexFieldFormatter(), false).write(entry, sw, frame.getCurrentBasePanel().getBibDatabaseContext().getMode()); String srcString = sw.getBuffer().toString(); preview.setText(srcString); } catch (IOException ignored) { @@ -495,7 +495,7 @@ private void updateSourceView() { private String[] getAllFields() { ArrayList f = new ArrayList<>(); - EntryType type = EntryTypes.getType(entry.getType(), frame.getCurrentBasePanel().getLoadedDatabase().getMode()); + EntryType type = EntryTypes.getType(entry.getType(), frame.getCurrentBasePanel().getBibDatabaseContext().getMode()); List req = type.getRequiredFieldsFlat(); List opt = type.getOptionalFields(); List allFields = BibtexFields.getAllFieldNames(); diff --git a/src/main/resources/l10n/JabRef_da.properties b/src/main/resources/l10n/JabRef_da.properties index c088e795abb..8801415de00 100644 --- a/src/main/resources/l10n/JabRef_da.properties +++ b/src/main/resources/l10n/JabRef_da.properties @@ -1742,3 +1742,7 @@ Regenerate_all_keys_for_the_entries_in_a_bibtex_file= Show_debug_level_messages= Export_Sorting= + +New_%0_database= + +New_%0_database_created.= diff --git a/src/main/resources/l10n/JabRef_de.properties b/src/main/resources/l10n/JabRef_de.properties index d9fb8f77a17..c9313bbfb06 100644 --- a/src/main/resources/l10n/JabRef_de.properties +++ b/src/main/resources/l10n/JabRef_de.properties @@ -2451,3 +2451,7 @@ Regenerate_all_keys_for_the_entries_in_a_bibtex_file= Show_debug_level_messages= Export_Sorting= + +New_%0_database= + +New_%0_database_created.= diff --git a/src/main/resources/l10n/JabRef_en.properties b/src/main/resources/l10n/JabRef_en.properties index af07c31f38c..f9374c5808b 100644 --- a/src/main/resources/l10n/JabRef_en.properties +++ b/src/main/resources/l10n/JabRef_en.properties @@ -958,6 +958,7 @@ New_BibTeX_subdatabase=New_BibTeX_subdatabase New_content=New_content New_database_created.=New_database_created. +New_%0_database=New_%0_database New_field_value=New_field_value New_file=New_file @@ -2431,4 +2432,6 @@ Automatically_setting_file_links=Automatically_setting_file_links Regenerating_bibtex_keys_according_to_metadata=Regenerating_bibtex_keys_according_to_metadata No_meta_data_present_in_bibfile._Cannot_regenerate_bibtex_keys=No_meta_data_present_in_bibfile._Cannot_regenerate_bibtex_keys Regenerate_all_keys_for_the_entries_in_a_bibtex_file=Regenerate_all_keys_for_the_entries_in_a_bibtex_file -Show_debug_level_messages=Show_debug_level_messages \ No newline at end of file +Show_debug_level_messages=Show_debug_level_messages + +New_%0_database_created.=New_%0_database_created. diff --git a/src/main/resources/l10n/JabRef_es.properties b/src/main/resources/l10n/JabRef_es.properties index b118d0c318d..9749906bfc7 100644 --- a/src/main/resources/l10n/JabRef_es.properties +++ b/src/main/resources/l10n/JabRef_es.properties @@ -1640,3 +1640,7 @@ Regenerate_all_keys_for_the_entries_in_a_bibtex_file= Show_debug_level_messages= Export_Sorting= + +New_%0_database= + +New_%0_database_created.= diff --git a/src/main/resources/l10n/JabRef_fa.properties b/src/main/resources/l10n/JabRef_fa.properties index a9131d16004..b77245a6c6c 100644 --- a/src/main/resources/l10n/JabRef_fa.properties +++ b/src/main/resources/l10n/JabRef_fa.properties @@ -2427,3 +2427,7 @@ Regenerate_all_keys_for_the_entries_in_a_bibtex_file= Show_debug_level_messages= Export_Sorting= + +New_%0_database= + +New_%0_database_created.= diff --git a/src/main/resources/l10n/JabRef_fr.properties b/src/main/resources/l10n/JabRef_fr.properties index d3a6aefe98a..c4bdd85d669 100644 --- a/src/main/resources/l10n/JabRef_fr.properties +++ b/src/main/resources/l10n/JabRef_fr.properties @@ -1680,3 +1680,7 @@ Regenerate_all_keys_for_the_entries_in_a_bibtex_file= Show_debug_level_messages= Export_Sorting= + +New_%0_database= + +New_%0_database_created.= diff --git a/src/main/resources/l10n/JabRef_in.properties b/src/main/resources/l10n/JabRef_in.properties index 237c45e0aa1..4727653f139 100644 --- a/src/main/resources/l10n/JabRef_in.properties +++ b/src/main/resources/l10n/JabRef_in.properties @@ -1661,3 +1661,7 @@ Regenerate_all_keys_for_the_entries_in_a_bibtex_file= Show_debug_level_messages= Export_Sorting= + +New_%0_database= + +New_%0_database_created.= diff --git a/src/main/resources/l10n/JabRef_it.properties b/src/main/resources/l10n/JabRef_it.properties index fc0f877012f..f7fa8c5849c 100644 --- a/src/main/resources/l10n/JabRef_it.properties +++ b/src/main/resources/l10n/JabRef_it.properties @@ -1759,3 +1759,7 @@ Regenerate_all_keys_for_the_entries_in_a_bibtex_file= Show_debug_level_messages= Export_Sorting= + +New_%0_database= + +New_%0_database_created.= diff --git a/src/main/resources/l10n/JabRef_ja.properties b/src/main/resources/l10n/JabRef_ja.properties index bdb7d4dcf48..1a6a9737cb3 100644 --- a/src/main/resources/l10n/JabRef_ja.properties +++ b/src/main/resources/l10n/JabRef_ja.properties @@ -2432,3 +2432,7 @@ Regenerate_all_keys_for_the_entries_in_a_bibtex_file= Show_debug_level_messages= Export_Sorting= + +New_%0_database= + +New_%0_database_created.= diff --git a/src/main/resources/l10n/JabRef_nl.properties b/src/main/resources/l10n/JabRef_nl.properties index d2869884b7b..0c4169f6f68 100644 --- a/src/main/resources/l10n/JabRef_nl.properties +++ b/src/main/resources/l10n/JabRef_nl.properties @@ -2434,3 +2434,7 @@ Regenerate_all_keys_for_the_entries_in_a_bibtex_file= Show_debug_level_messages= Export_Sorting= + +New_%0_database= + +New_%0_database_created.= diff --git a/src/main/resources/l10n/JabRef_no.properties b/src/main/resources/l10n/JabRef_no.properties index 180d8f76959..077cf62365b 100644 --- a/src/main/resources/l10n/JabRef_no.properties +++ b/src/main/resources/l10n/JabRef_no.properties @@ -2833,3 +2833,7 @@ Regenerate_all_keys_for_the_entries_in_a_bibtex_file= Show_debug_level_messages= Export_Sorting= + +New_%0_database= + +New_%0_database_created.= diff --git a/src/main/resources/l10n/JabRef_pt_BR.properties b/src/main/resources/l10n/JabRef_pt_BR.properties index 7aa10c20bdf..168d03f5ecd 100644 --- a/src/main/resources/l10n/JabRef_pt_BR.properties +++ b/src/main/resources/l10n/JabRef_pt_BR.properties @@ -1653,3 +1653,7 @@ Regenerate_all_keys_for_the_entries_in_a_bibtex_file= Show_debug_level_messages= Export_Sorting= + +New_%0_database= + +New_%0_database_created.= diff --git a/src/main/resources/l10n/JabRef_ru.properties b/src/main/resources/l10n/JabRef_ru.properties index bfdf7615f86..5cba51a1d86 100644 --- a/src/main/resources/l10n/JabRef_ru.properties +++ b/src/main/resources/l10n/JabRef_ru.properties @@ -2433,3 +2433,7 @@ Regenerate_all_keys_for_the_entries_in_a_bibtex_file= Show_debug_level_messages= Export_Sorting= + +New_%0_database= + +New_%0_database_created.= diff --git a/src/main/resources/l10n/JabRef_tr.properties b/src/main/resources/l10n/JabRef_tr.properties index 421f8482c0c..bc5e6eb2100 100644 --- a/src/main/resources/l10n/JabRef_tr.properties +++ b/src/main/resources/l10n/JabRef_tr.properties @@ -1674,3 +1674,7 @@ Regenerate_all_keys_for_the_entries_in_a_bibtex_file= Show_debug_level_messages= Export_Sorting= + +New_%0_database= + +New_%0_database_created.= diff --git a/src/main/resources/l10n/JabRef_vi.properties b/src/main/resources/l10n/JabRef_vi.properties index 0e95f9146a1..271c7140f18 100644 --- a/src/main/resources/l10n/JabRef_vi.properties +++ b/src/main/resources/l10n/JabRef_vi.properties @@ -2431,3 +2431,7 @@ Regenerate_all_keys_for_the_entries_in_a_bibtex_file= Show_debug_level_messages= Export_Sorting= + +New_%0_database= + +New_%0_database_created.= diff --git a/src/main/resources/l10n/JabRef_zh.properties b/src/main/resources/l10n/JabRef_zh.properties index ccf8dca40e9..9d9c15b97bc 100644 --- a/src/main/resources/l10n/JabRef_zh.properties +++ b/src/main/resources/l10n/JabRef_zh.properties @@ -2428,3 +2428,7 @@ Regenerate_all_keys_for_the_entries_in_a_bibtex_file= Show_debug_level_messages= Export_Sorting= + +New_%0_database= + +New_%0_database_created.= diff --git a/src/main/resources/l10n/Menu_da.properties b/src/main/resources/l10n/Menu_da.properties index 29ad74491a3..4eb0f9d8a8a 100644 --- a/src/main/resources/l10n/Menu_da.properties +++ b/src/main/resources/l10n/Menu_da.properties @@ -142,3 +142,5 @@ Switch_to_%0_mode= Check_integrity=Tjek_integritet Quality= + +New_%0_database= diff --git a/src/main/resources/l10n/Menu_de.properties b/src/main/resources/l10n/Menu_de.properties index 0c5ec69157e..72d63ecdb8c 100644 --- a/src/main/resources/l10n/Menu_de.properties +++ b/src/main/resources/l10n/Menu_de.properties @@ -239,3 +239,5 @@ Switch_to_%0_mode=In_den_%0-Modus_wechseln Check_integrity=Integrit\u00e4t_pr\u00fcfen Quality= + +New_%0_database= diff --git a/src/main/resources/l10n/Menu_en.properties b/src/main/resources/l10n/Menu_en.properties index 2230f47eb7f..0b80981b0d8 100644 --- a/src/main/resources/l10n/Menu_en.properties +++ b/src/main/resources/l10n/Menu_en.properties @@ -51,6 +51,7 @@ Manage_journal_abbreviations=Manage_&journal_abbreviations Mark_entries=&Mark_entries # File menu New_database=&New_database +New_%0_database=&New_%0_database # Menu BibTeX (BibTeX) New_entry=N&ew_entry New_entry...=&New_entry... diff --git a/src/main/resources/l10n/Menu_es.properties b/src/main/resources/l10n/Menu_es.properties index f3e2f2a503a..74da555ca3b 100644 --- a/src/main/resources/l10n/Menu_es.properties +++ b/src/main/resources/l10n/Menu_es.properties @@ -168,3 +168,5 @@ Switch_to_%0_mode= Check_integrity=Verificar_Integridad Quality= + +New_%0_database= diff --git a/src/main/resources/l10n/Menu_fa.properties b/src/main/resources/l10n/Menu_fa.properties index 4be725ed2f9..690051d8026 100644 --- a/src/main/resources/l10n/Menu_fa.properties +++ b/src/main/resources/l10n/Menu_fa.properties @@ -164,3 +164,5 @@ Switch_to_%0_mode= Check_integrity=بررسی_بی‌نقصی Quality= + +New_%0_database= diff --git a/src/main/resources/l10n/Menu_fr.properties b/src/main/resources/l10n/Menu_fr.properties index 96aabaa656c..7df57f6efda 100644 --- a/src/main/resources/l10n/Menu_fr.properties +++ b/src/main/resources/l10n/Menu_fr.properties @@ -154,3 +154,5 @@ Switch_to_%0_mode=Basculer_dans_le_mode_%0 Check_integrity=V\u00e9rifier_l'int\u00e9grit\u00e9 Quality= + +New_%0_database= diff --git a/src/main/resources/l10n/Menu_in.properties b/src/main/resources/l10n/Menu_in.properties index 423fccf2d48..c8aecf39bec 100644 --- a/src/main/resources/l10n/Menu_in.properties +++ b/src/main/resources/l10n/Menu_in.properties @@ -139,3 +139,5 @@ Switch_to_%0_mode= Check_integrity=Periksa_Integritas Quality= + +New_%0_database= diff --git a/src/main/resources/l10n/Menu_it.properties b/src/main/resources/l10n/Menu_it.properties index 4f251d65762..e35bc949c2a 100644 --- a/src/main/resources/l10n/Menu_it.properties +++ b/src/main/resources/l10n/Menu_it.properties @@ -160,3 +160,5 @@ Switch_to_%0_mode= Check_integrity=Verifica_di_integrit\u00e0 Quality= + +New_%0_database= diff --git a/src/main/resources/l10n/Menu_ja.properties b/src/main/resources/l10n/Menu_ja.properties index d6c46c7a4c2..afa811aba16 100644 --- a/src/main/resources/l10n/Menu_ja.properties +++ b/src/main/resources/l10n/Menu_ja.properties @@ -167,3 +167,5 @@ Switch_to_%0_mode=%0\u30e2\u30fc\u30c9\u306b\u5207\u63db Check_integrity=\u6574\u5408\u6027\u691c\u67fb Quality= + +New_%0_database= diff --git a/src/main/resources/l10n/Menu_nl.properties b/src/main/resources/l10n/Menu_nl.properties index 724bbb52989..ff7822bbe58 100644 --- a/src/main/resources/l10n/Menu_nl.properties +++ b/src/main/resources/l10n/Menu_nl.properties @@ -246,3 +246,5 @@ Switch_to_%0_mode= Check_integrity=Integriteitscontrole Quality= + +New_%0_database= diff --git a/src/main/resources/l10n/Menu_no.properties b/src/main/resources/l10n/Menu_no.properties index 8348e822263..2191cd863a1 100644 --- a/src/main/resources/l10n/Menu_no.properties +++ b/src/main/resources/l10n/Menu_no.properties @@ -163,3 +163,5 @@ Switch_to_%0_mode= Check_integrity=Sjekk_integritet Quality= + +New_%0_database= diff --git a/src/main/resources/l10n/Menu_pt_BR.properties b/src/main/resources/l10n/Menu_pt_BR.properties index 22e4b970aca..05ca600aec1 100644 --- a/src/main/resources/l10n/Menu_pt_BR.properties +++ b/src/main/resources/l10n/Menu_pt_BR.properties @@ -142,3 +142,5 @@ Switch_to_%0_mode= Check_integrity=Verifica\u00e7\u00e3o_de_integridade Quality= + +New_%0_database= diff --git a/src/main/resources/l10n/Menu_ru.properties b/src/main/resources/l10n/Menu_ru.properties index aff9c7564d0..4f5339c9f88 100644 --- a/src/main/resources/l10n/Menu_ru.properties +++ b/src/main/resources/l10n/Menu_ru.properties @@ -164,3 +164,5 @@ Switch_to_%0_mode= Check_integrity=Проверка_целостности Quality= + +New_%0_database= diff --git a/src/main/resources/l10n/Menu_tr.properties b/src/main/resources/l10n/Menu_tr.properties index 448b5ab1d53..bb06cf75916 100644 --- a/src/main/resources/l10n/Menu_tr.properties +++ b/src/main/resources/l10n/Menu_tr.properties @@ -143,3 +143,5 @@ Switch_to_%0_mode= Check_integrity=B\u00fct\u00fcnl\u00fck_kontrol\u00fc Quality= + +New_%0_database= diff --git a/src/main/resources/l10n/Menu_vi.properties b/src/main/resources/l10n/Menu_vi.properties index 8fede6a8c56..a75624ecb4d 100644 --- a/src/main/resources/l10n/Menu_vi.properties +++ b/src/main/resources/l10n/Menu_vi.properties @@ -166,3 +166,5 @@ Switch_to_%0_mode= Check_integrity=Ki\u1ec3m_tra_t\u00ednh_nguy\u00ean_v\u1eb9n Quality= + +New_%0_database= diff --git a/src/main/resources/l10n/Menu_zh.properties b/src/main/resources/l10n/Menu_zh.properties index 2c602f4bb03..b978b00af70 100644 --- a/src/main/resources/l10n/Menu_zh.properties +++ b/src/main/resources/l10n/Menu_zh.properties @@ -165,3 +165,5 @@ Switch_to_%0_mode= Check_integrity=\u5b8c\u6574\u6027\u68c0\u67e5 Quality= + +New_%0_database= diff --git a/src/test/java/net/sf/jabref/BibDatabaseContextTest.java b/src/test/java/net/sf/jabref/BibDatabaseContextTest.java new file mode 100644 index 00000000000..b38ccb11cef --- /dev/null +++ b/src/test/java/net/sf/jabref/BibDatabaseContextTest.java @@ -0,0 +1,21 @@ +package net.sf.jabref; + +import net.sf.jabref.model.database.BibDatabase; +import net.sf.jabref.model.database.BibDatabaseMode; +import org.junit.Test; + +import static org.junit.Assert.*; + +public class BibDatabaseContextTest { + + @Test + public void testReadWriteType() { + BibDatabaseContext bibDatabaseContext = new BibDatabaseContext(new BibDatabase(), new MetaData(), new Defaults(BibDatabaseMode.BIBTEX)); + bibDatabaseContext.setMode(BibDatabaseMode.BIBLATEX); + assertEquals(BibDatabaseMode.BIBLATEX, bibDatabaseContext.getMode()); + + bibDatabaseContext.setMode(BibDatabaseMode.BIBTEX); + assertEquals(BibDatabaseMode.BIBTEX, bibDatabaseContext.getMode()); + } + +} diff --git a/src/test/java/net/sf/jabref/LoadedDatabaseTest.java b/src/test/java/net/sf/jabref/LoadedDatabaseTest.java deleted file mode 100644 index 760cf134095..00000000000 --- a/src/test/java/net/sf/jabref/LoadedDatabaseTest.java +++ /dev/null @@ -1,21 +0,0 @@ -package net.sf.jabref; - -import net.sf.jabref.model.database.BibDatabase; -import net.sf.jabref.model.database.BibDatabaseMode; -import org.junit.Test; - -import static org.junit.Assert.*; - -public class LoadedDatabaseTest { - - @Test - public void testReadWriteType() { - LoadedDatabase loadedDatabase = new LoadedDatabase(new BibDatabase(), new MetaData()); - loadedDatabase.setMode(BibDatabaseMode.BIBLATEX); - assertEquals(BibDatabaseMode.BIBLATEX, loadedDatabase.getMode()); - - loadedDatabase.setMode(BibDatabaseMode.BIBTEX); - assertEquals(BibDatabaseMode.BIBTEX, loadedDatabase.getMode()); - } - -} diff --git a/src/test/java/net/sf/jabref/exporter/layout/format/RisKeywordsTest.java b/src/test/java/net/sf/jabref/exporter/layout/format/RisKeywordsTest.java index 2486cf41c0a..ecba32fcadc 100644 --- a/src/test/java/net/sf/jabref/exporter/layout/format/RisKeywordsTest.java +++ b/src/test/java/net/sf/jabref/exporter/layout/format/RisKeywordsTest.java @@ -2,6 +2,7 @@ import static org.junit.Assert.*; +import net.sf.jabref.Globals; import org.junit.Test; @@ -9,22 +10,22 @@ public class RisKeywordsTest { @Test public void testEmpty() { - assertEquals("", new RisMonth().format("")); + assertEquals("", new RisKeywords().format("")); } @Test public void testNull() { - assertEquals("", new RisMonth().format(null)); + assertEquals("", new RisKeywords().format(null)); } @Test - public void testMonth() { - assertEquals("12", new RisMonth().format("dec")); + public void testSingleKeyword() { + assertEquals("KW - abcd", new RisKeywords().format("abcd")); } @Test - public void testInvalidMonth() { - assertEquals("abcd", new RisMonth().format("abcd")); + public void testTwoKeywords() { + assertEquals("KW - abcd" + Globals.NEWLINE + "KW - efg", new RisKeywords().format("abcd, efg")); } } diff --git a/src/test/java/net/sf/jabref/exporter/layout/format/RisMonthTest.java b/src/test/java/net/sf/jabref/exporter/layout/format/RisMonthTest.java index f963a52df30..a51b7c9273d 100644 --- a/src/test/java/net/sf/jabref/exporter/layout/format/RisMonthTest.java +++ b/src/test/java/net/sf/jabref/exporter/layout/format/RisMonthTest.java @@ -2,6 +2,7 @@ import static org.junit.Assert.*; +import net.sf.jabref.Globals; import org.junit.Test; @@ -9,26 +10,27 @@ public class RisMonthTest { @Test public void testEmpty() { - assertEquals("", new RisKeywords().format("")); + assertEquals("", new RisMonth().format("")); } @Test public void testNull() { - assertEquals("", new RisKeywords().format(null)); + assertEquals("", new RisMonth().format(null)); } @Test - public void testSingleKeyword() { - assertEquals("KW - abcd", new RisKeywords().format("abcd")); + public void testMonth() { + assertEquals("12", new RisMonth().format("dec")); } @Test - public void testTwoKeywords() { - assertEquals("KW - abcd\nKW - efg", new RisKeywords().format("abcd, efg")); + public void testInvalidMonth() { + assertEquals("abcd", new RisMonth().format("abcd")); } @Test public void testMultipleKeywords() { - assertEquals("KW - abcd\nKW - efg\nKW - hij\nKW - klm", new RisKeywords().format("abcd, efg, hij, klm")); + assertEquals("KW - abcd" + Globals.NEWLINE +"KW - efg" + Globals.NEWLINE + "KW - hij" + Globals.NEWLINE + "KW - klm", + new RisKeywords().format("abcd, efg, hij, klm")); } } diff --git a/src/test/java/net/sf/jabref/model/database/BibDatabaseModeDetectionTest.java b/src/test/java/net/sf/jabref/model/database/BibDatabaseModeDetectionTest.java index 935e7544a2e..aeb013cfcdb 100644 --- a/src/test/java/net/sf/jabref/model/database/BibDatabaseModeDetectionTest.java +++ b/src/test/java/net/sf/jabref/model/database/BibDatabaseModeDetectionTest.java @@ -20,24 +20,6 @@ public void detectBiblatex() { assertEquals(BibDatabaseMode.BIBLATEX, BibDatabaseModeDetection.inferMode(BibDatabases.createDatabase(entries))); } - @Test - public void detectBiblatexBasedOnFields() { - BibEntry entry = new BibEntry("someid", BibtexEntryTypes.ARTICLE.getName()); - entry.setField("translator", "Stefan Kolb"); - Collection entries = Arrays.asList(entry); - - assertEquals(BibDatabaseMode.BIBLATEX, BibDatabaseModeDetection.inferMode(BibDatabases.createDatabase(entries))); - } - - @Test - public void detectBibtexBasedOnFields() { - BibEntry entry = new BibEntry("someid", BibtexEntryTypes.ARTICLE.getName()); - entry.setField("journal", "IEEE Trans. Services Computing"); - Collection entries = Arrays.asList(entry); - - assertEquals(BibDatabaseMode.BIBTEX, BibDatabaseModeDetection.inferMode(BibDatabases.createDatabase(entries))); - } - @Test public void detectUndistinguishableAsBibtex() { BibEntry entry = new BibEntry("someid", BibtexEntryTypes.ARTICLE.getName()); @@ -55,21 +37,12 @@ public void detectMixedModeAsBiblatex() { biblatex.setField("translator", "Stefan Kolb"); Collection entries = Arrays.asList(bibtex, biblatex); - assertEquals(BibDatabaseMode.BIBLATEX, BibDatabaseModeDetection.inferMode(BibDatabases.createDatabase(entries))); - } - - @Test - public void detectUnknownTypeAsBibtex() { - BibEntry entry = new BibEntry("someid", new CustomEntryType("unknowntype", new ArrayList<>(0), new ArrayList<>(0)).getName()); - Collection entries = Arrays.asList(entry); - assertEquals(BibDatabaseMode.BIBTEX, BibDatabaseModeDetection.inferMode(BibDatabases.createDatabase(entries))); } @Test - public void detectUnknownTypeAsBibtexBasedOnFields() { + public void detectUnknownTypeAsBibtex() { BibEntry entry = new BibEntry("someid", new CustomEntryType("unknowntype", new ArrayList<>(0), new ArrayList<>(0)).getName()); - entry.setField("someunknownfield", "value"); Collection entries = Arrays.asList(entry); assertEquals(BibDatabaseMode.BIBTEX, BibDatabaseModeDetection.inferMode(BibDatabases.createDatabase(entries))); @@ -85,20 +58,6 @@ public void ignoreUnknownTypesForBibtexDecision() { assertEquals(BibDatabaseMode.BIBTEX, BibDatabaseModeDetection.inferMode(BibDatabases.createDatabase(entries))); } - @Test - public void ignoreUnknownTypesForBibtexDecisionBasedOnFields() { - BibEntry custom = new BibEntry("someid", new CustomEntryType("unknowntype", new ArrayList<>(0), new ArrayList<>(0)).getName()); - custom.setField("someunknownfield", "value"); - BibEntry bibtex = new BibEntry("someid", BibtexEntryTypes.ARTICLE.getName()); - bibtex.setField("journal", "IEEE Trans. Services Computing"); - BibEntry biblatex = new BibEntry("someid", BibLatexEntryTypes.ARTICLE.getName()); - biblatex.setField("title", "someothertitle"); - Collection entries = Arrays.asList(custom, bibtex, biblatex); - - - assertEquals(BibDatabaseMode.BIBTEX, BibDatabaseModeDetection.inferMode(BibDatabases.createDatabase(entries))); - } - @Test public void ignoreUnknownTypesForBiblatexDecision() { BibEntry custom = new BibEntry("someid", new CustomEntryType("unknowntype", new ArrayList<>(0), new ArrayList<>(0)).getName()); @@ -109,16 +68,4 @@ public void ignoreUnknownTypesForBiblatexDecision() { assertEquals(BibDatabaseMode.BIBLATEX, BibDatabaseModeDetection.inferMode(BibDatabases.createDatabase(entries))); } - @Test - public void ignoreUnknownTypesForBiblatexDecisionBasedOnFields() { - BibEntry custom = new BibEntry("someid", new CustomEntryType("unknowntype", new ArrayList<>(0), new ArrayList<>(0)).getName()); - custom.setField("someunknownfield", "value"); - BibEntry bibtex = new BibEntry("someid", BibtexEntryTypes.ARTICLE.getName()); - bibtex.setField("title", "IEEE Trans. Services Computing"); - BibEntry biblatex = new BibEntry("someid", BibLatexEntryTypes.ARTICLE.getName()); - biblatex.setField("translator", "Stefan Kolb"); - Collection entries = Arrays.asList(custom, bibtex, biblatex); - - assertEquals(BibDatabaseMode.BIBLATEX, BibDatabaseModeDetection.inferMode(BibDatabases.createDatabase(entries))); - } } diff --git a/src/test/java/net/sf/jabref/util/XMPUtilTest.java b/src/test/java/net/sf/jabref/util/XMPUtilTest.java index f24efff6e38..57104c02cd4 100644 --- a/src/test/java/net/sf/jabref/util/XMPUtilTest.java +++ b/src/test/java/net/sf/jabref/util/XMPUtilTest.java @@ -270,7 +270,6 @@ public void testReadXMPSimple() throws Exception { Assert.assertEquals("2003", e.getField("year")); Assert.assertEquals("Beach sand convolution by surf-wave optimzation", e.getField("title")); Assert.assertEquals("misc", e.getType()); - } /** @@ -514,7 +513,7 @@ public void testAttributeRead() throws Exception { @Test public void testEmpty() throws Exception { - Assert.assertEquals(null, XMPUtil.readXMP(pdfFile)); + Assert.assertEquals(Collections.emptyList(), XMPUtil.readXMP(pdfFile)); } @@ -542,7 +541,7 @@ public void testSimpleUpdate() throws Exception { writeManually(pdfFile, XMPUtilTest.bibtexXPacket(s)); // Nothing there yet, but should not crash - Assert.assertNull(XMPUtil.readXMP(pdfFile)); + Assert.assertEquals(Collections.emptyList(), XMPUtil.readXMP(pdfFile)); s = " " + " Acrobat PDFMaker 7.0.7" @@ -924,7 +923,7 @@ public void testReadWriteDC() throws IOException, TransformerException { Assert.assertEquals("Huey Duck", dcSchema.getContributors().get(0)); Assert.assertEquals("Dewey Duck", dcSchema.getContributors().get(1)); Assert.assertEquals("Louie Duck", dcSchema.getContributors().get(2)); - Assert.assertEquals("InProceedings", dcSchema.getTypes().get(0)); + Assert.assertEquals("InProceedings".toLowerCase(), dcSchema.getTypes().get(0).toLowerCase()); Assert.assertEquals("bibtex/bibtexkey/Clarkson06", dcSchema.getRelationships().get(0)); Assert.assertEquals("peanut", dcSchema.getSubjects().get(0)); Assert.assertEquals("butter", dcSchema.getSubjects().get(1)); @@ -990,7 +989,7 @@ public void testWriteSingleUpdatesDCAndInfo() throws IOException, TransformerExc Assert.assertEquals("Huey Duck", dcSchema.getContributors().get(0)); Assert.assertEquals("Dewey Duck", dcSchema.getContributors().get(1)); Assert.assertEquals("Louie Duck", dcSchema.getContributors().get(2)); - Assert.assertEquals("InProceedings", dcSchema.getTypes().get(0)); + Assert.assertEquals("InProceedings".toLowerCase(), dcSchema.getTypes().get(0).toLowerCase()); Assert.assertEquals("bibtex/bibtexkey/Clarkson06", dcSchema.getRelationships().get(0)); Assert.assertEquals("peanut", dcSchema.getSubjects().get(0)); Assert.assertEquals("butter", dcSchema.getSubjects().get(1)); @@ -1038,7 +1037,7 @@ public void testReadRawXMP() throws Exception { Assert.assertEquals("J. Howison", authors.get(2)); Assert.assertEquals("C. Masango", authors.get(3)); - Assert.assertEquals("Article", bib.getTextProperty("entrytype")); + Assert.assertEquals("article", bib.getTextProperty("entrytype")); Assert.assertEquals("Effective work practices for floss development: A model and propositions", bib.getTextProperty("title")); Assert.assertEquals("Hawaii International Conference On System Sciences (HICSS)",