From 407d0cab26e65df1baf8f2410013a07034e9296c Mon Sep 17 00:00:00 2001 From: Oscar Gustafsson Date: Mon, 4 Apr 2016 22:15:41 +0200 Subject: [PATCH 1/3] Added all person name and date fields to InternalBibtexFields --- .../bibtex/BibtexSingleFieldProperties.java | 6 +-- .../jabref/bibtex/InternalBibtexFields.java | 44 +++++++++++++------ .../bibtex/comparator/EntryComparator.java | 3 +- .../sf/jabref/gui/ImportInspectionDialog.java | 27 ++++++------ .../java/net/sf/jabref/gui/JabRefFrame.java | 3 +- .../jabref/gui/entryeditor/EntryEditor.java | 8 ++-- .../gui/entryeditor/FieldExtraComponents.java | 5 ++- .../gui/search/SearchResultsDialog.java | 3 +- .../sf/jabref/importer/ImportMenuItem.java | 4 +- .../importer/fetcher/GeneralFetcher.java | 6 +-- .../importer/fileformat/BibtexParser.java | 4 +- .../autocompleter/AutoCompleterFactory.java | 5 ++- .../bibtexfields/NormalizeDateFormatter.java | 3 +- .../logic/integrity/IntegrityCheck.java | 9 +++- .../sf/jabref/logic/xmp/XMPSchemaBibtex.java | 5 ++- .../net/sf/jabref/model/DuplicateCheck.java | 4 +- .../model/entry/BibLatexEntryTypes.java | 6 +++ 17 files changed, 92 insertions(+), 53 deletions(-) diff --git a/src/main/java/net/sf/jabref/bibtex/BibtexSingleFieldProperties.java b/src/main/java/net/sf/jabref/bibtex/BibtexSingleFieldProperties.java index e83e5090293..f4ee83d8b0d 100644 --- a/src/main/java/net/sf/jabref/bibtex/BibtexSingleFieldProperties.java +++ b/src/main/java/net/sf/jabref/bibtex/BibtexSingleFieldProperties.java @@ -5,11 +5,11 @@ public enum BibtexSingleFieldProperties { YES_NO, URL, - DATEPICKER, - JOURNAL_NAMES, + DATE, + JOURNAL_NAME, EXTERNAL, DOI, - SET_OWNER, + OWNER, MONTH, FILE_EDITOR, NUMERIC, diff --git a/src/main/java/net/sf/jabref/bibtex/InternalBibtexFields.java b/src/main/java/net/sf/jabref/bibtex/InternalBibtexFields.java index c920d6565e7..4087805f165 100644 --- a/src/main/java/net/sf/jabref/bibtex/InternalBibtexFields.java +++ b/src/main/java/net/sf/jabref/bibtex/InternalBibtexFields.java @@ -44,6 +44,7 @@ import net.sf.jabref.Globals; import net.sf.jabref.JabRefPreferences; import net.sf.jabref.model.entry.BibEntry; +import net.sf.jabref.model.entry.BibLatexEntryTypes; import net.sf.jabref.model.entry.IEEETranEntryTypes; import net.sf.jabref.specialfields.SpecialFieldsUtils; @@ -58,9 +59,6 @@ public class InternalBibtexFields { private static final String ENTRYTYPE = "entrytype"; public static final String NUMBER_COL = "#"; - public static final String[] DEFAULT_INSPECTION_FIELDS = new String[] - {"author", "title", "year", BibEntry.KEY_FIELD}; - // singleton instance private static final InternalBibtexFields RUNTIME = new InternalBibtexFields(); @@ -83,24 +81,20 @@ private InternalBibtexFields() { // but may be used by others that produce an annotated bibliography. // http://www.ecst.csuchico.edu/~jacobsd/bib/formats/bibtex.html add(new BibtexSingleField("annote", true, BibtexSingleField.LARGE_W)); - dummy = new BibtexSingleField("author", true, BibtexSingleField.MEDIUM_W, 280); - dummy.setExtras(EnumSet.of(BibtexSingleFieldProperties.PERSON_NAMES)); - add(dummy); + add(new BibtexSingleField("author", true, BibtexSingleField.MEDIUM_W, 280)); add(new BibtexSingleField("booktitle", true, 175)); add(new BibtexSingleField("chapter", true, BibtexSingleField.SMALL_W)); add(new BibtexSingleField("crossref", true, BibtexSingleField.SMALL_W)); add(new BibtexSingleField("edition", true, BibtexSingleField.SMALL_W)); - dummy = new BibtexSingleField("editor", true, BibtexSingleField.MEDIUM_W, 280); - dummy.setExtras(EnumSet.of(BibtexSingleFieldProperties.PERSON_NAMES)); - add(dummy); + add(new BibtexSingleField("editor", true, BibtexSingleField.MEDIUM_W, 280)); add(new BibtexSingleField("howpublished", true, BibtexSingleField.MEDIUM_W)); add(new BibtexSingleField("institution", true, BibtexSingleField.MEDIUM_W)); dummy = new BibtexSingleField("journal", true, BibtexSingleField.SMALL_W); - dummy.setExtras(EnumSet.of(BibtexSingleFieldProperties.JOURNAL_NAMES)); + dummy.setExtras(EnumSet.of(BibtexSingleFieldProperties.JOURNAL_NAME)); add(dummy); dummy = new BibtexSingleField("journaltitle", true, BibtexSingleField.SMALL_W); - dummy.setExtras(EnumSet.of(BibtexSingleFieldProperties.JOURNAL_NAMES)); + dummy.setExtras(EnumSet.of(BibtexSingleFieldProperties.JOURNAL_NAME)); add(dummy); add(new BibtexSingleField("key", true)); @@ -205,12 +199,12 @@ private InternalBibtexFields() { add(dummy); dummy = new BibtexSingleField(InternalBibtexFields.OWNER, false, BibtexSingleField.SMALL_W); - dummy.setExtras(EnumSet.of(BibtexSingleFieldProperties.SET_OWNER)); + dummy.setExtras(EnumSet.of(BibtexSingleFieldProperties.OWNER)); dummy.setPrivate(); add(dummy); dummy = new BibtexSingleField(InternalBibtexFields.TIMESTAMP, false, BibtexSingleField.SMALL_W); - dummy.setExtras(EnumSet.of(BibtexSingleFieldProperties.DATEPICKER)); + dummy.setExtras(EnumSet.of(BibtexSingleFieldProperties.DATE)); dummy.setPrivate(); add(dummy); @@ -247,6 +241,30 @@ private InternalBibtexFields() { add(new BibtexSingleField(numericField, false).setNumeric(true)); } + // Set all fields with person names + for (String fieldText : BibLatexEntryTypes.BIBLATEX_PERSON_NAME_FIELDS) { + BibtexSingleField field = fieldSet.get(fieldText); + if (field == null) { + field = new BibtexSingleField(fieldText, true, BibtexSingleField.SMALL_W); + } + Set extras = field.getExtras(); + extras.add(BibtexSingleFieldProperties.PERSON_NAMES); + field.setExtras(extras); + add(field); + } + + // Set all fields with dates + for (String fieldText : BibLatexEntryTypes.BIBLATEX_DATE_FIELDS) { + BibtexSingleField field = fieldSet.get(fieldText); + if (field == null) { + field = new BibtexSingleField(fieldText, true, BibtexSingleField.SMALL_W); + } + Set extras = field.getExtras(); + extras.add(BibtexSingleFieldProperties.DATE); + field.setExtras(extras); + add(field); + } + // collect all public fields for the PUBLIC_FIELDS array for (BibtexSingleField sField : fieldSet.values()) { if (!sField.isPrivate()) { diff --git a/src/main/java/net/sf/jabref/bibtex/comparator/EntryComparator.java b/src/main/java/net/sf/jabref/bibtex/comparator/EntryComparator.java index 9065788a6e8..67ad17d7522 100644 --- a/src/main/java/net/sf/jabref/bibtex/comparator/EntryComparator.java +++ b/src/main/java/net/sf/jabref/bibtex/comparator/EntryComparator.java @@ -15,6 +15,7 @@ */ package net.sf.jabref.bibtex.comparator; +import net.sf.jabref.bibtex.BibtexSingleFieldProperties; import net.sf.jabref.bibtex.InternalBibtexFields; import net.sf.jabref.model.entry.AuthorList; import net.sf.jabref.model.entry.BibEntry; @@ -76,7 +77,7 @@ public int compare(BibEntry e1, BibEntry e2) { // If the field is author or editor, we rearrange names so they are // sorted according to last name. - if ("author".equals(sortField) || "editor".equals(sortField)) { + if (InternalBibtexFields.getFieldExtras(sortField).contains(BibtexSingleFieldProperties.PERSON_NAMES)) { if (f1 != null) { f1 = AuthorList.fixAuthorForAlphabetization((String) f1).toLowerCase(); } diff --git a/src/main/java/net/sf/jabref/gui/ImportInspectionDialog.java b/src/main/java/net/sf/jabref/gui/ImportInspectionDialog.java index 1fd6af887b5..a72e9dd7bee 100644 --- a/src/main/java/net/sf/jabref/gui/ImportInspectionDialog.java +++ b/src/main/java/net/sf/jabref/gui/ImportInspectionDialog.java @@ -29,6 +29,7 @@ import com.jgoodies.forms.builder.ButtonBarBuilder; import com.jgoodies.forms.builder.ButtonStackBuilder; import net.sf.jabref.*; +import net.sf.jabref.bibtex.BibtexSingleFieldProperties; import net.sf.jabref.bibtex.InternalBibtexFields; import net.sf.jabref.bibtex.comparator.FieldComparator; import net.sf.jabref.external.DownloadExternalFile; @@ -117,8 +118,6 @@ public class ImportInspectionDialog extends JDialog implements ImportInspector, private final DefaultEventSelectionModel selectionModel; - private final String[] fields; - private final JProgressBar progressBar = new JProgressBar(SwingConstants.HORIZONTAL); private final JButton ok = new JButton(Localization.lang("OK")); @@ -166,6 +165,8 @@ public class ImportInspectionDialog extends JDialog implements ImportInspector, private final JLabel fileLabel = new JLabel(IconTheme.JabRefIcon.FILE.getSmallIcon()); private final JLabel urlLabel = new JLabel(IconTheme.JabRefIcon.WWW.getSmallIcon()); + private static final List INSPECTION_FIELDS = Arrays.asList("author", "title", "year", BibEntry.KEY_FIELD); + private static final int DUPL_COL = 1; private static final int FILE_COL = 2; private static final int URL_COL = 3; @@ -183,12 +184,10 @@ public class ImportInspectionDialog extends JDialog implements ImportInspector, * @param panel * @param fields */ - public ImportInspectionDialog(JabRefFrame frame, BasePanel panel, String[] fields, - String undoName, boolean newDatabase) { + public ImportInspectionDialog(JabRefFrame frame, BasePanel panel, String undoName, boolean newDatabase) { this.frame = frame; this.panel = panel; this.bibDatabaseContext = (panel == null) ? null : panel.getBibDatabaseContext(); - this.fields = Arrays.copyOf(fields, fields.length); this.undoName = undoName; this.newDatabase = newDatabase; preview = new PreviewPanel(null, bibDatabaseContext, Globals.prefs.get(JabRefPreferences.PREVIEW_0)); @@ -230,7 +229,7 @@ public ImportInspectionDialog(JabRefFrame frame, BasePanel panel, String[] field popup.add(deleteListener); popup.addSeparator(); - if (!newDatabase && bibDatabaseContext != null) { + if (!newDatabase && (bibDatabaseContext != null)) { GroupTreeNode node = bibDatabaseContext.getMetaData().getGroups(); JMenu groupsAdd = new JMenu(Localization.lang("Add to group")); groupsAdd.setEnabled(false); // Will get enabled if there are @@ -777,8 +776,8 @@ private void setWidths() { cm.getColumn(i).setMaxWidth(GUIGlobals.WIDTH_ICON_COL); } - for (int i = 0; i < fields.length; i++) { - int width = InternalBibtexFields.getFieldLength(fields[i]); + for (int i = 0; i < INSPECTION_FIELDS.size(); i++) { + int width = InternalBibtexFields.getFieldLength(INSPECTION_FIELDS.get(i)); glTable.getColumnModel().getColumn(i + PAD).setPreferredWidth(width); } } @@ -1240,10 +1239,10 @@ private void setupComparatorChooser() { } // Remaining columns: - for (int i = PAD; i < (PAD + fields.length); i++) { + for (int i = PAD; i < (PAD + INSPECTION_FIELDS.size()); i++) { comparators = comparatorChooser.getComparatorsForColumn(i); comparators.clear(); - comparators.add(new FieldComparator(fields[i - PAD])); + comparators.add(new FieldComparator(INSPECTION_FIELDS.get(i - PAD))); } // Set initial sort columns: @@ -1331,7 +1330,7 @@ private class EntryTableFormat implements TableFormat { @Override public int getColumnCount() { - return PAD + fields.length; + return PAD + INSPECTION_FIELDS.size(); } @Override @@ -1340,7 +1339,7 @@ public String getColumnName(int i) { return Localization.lang("Keep"); } if (i >= PAD) { - return EntryUtil.capitalizeFirst(fields[i - PAD]); + return EntryUtil.capitalizeFirst(INSPECTION_FIELDS.get(i - PAD)); } return ""; } @@ -1376,8 +1375,8 @@ public Object getColumnValue(BibEntry entry, int i) { return null; } } else { - String field = fields[i - PAD]; - if ("author".equals(field) || "editor".equals(field)) { + String field = INSPECTION_FIELDS.get(i - PAD); + if (InternalBibtexFields.getFieldExtras(field).contains(BibtexSingleFieldProperties.PERSON_NAMES)) { return entry.getFieldOptional(field).map(AuthorList::fixAuthorNatbib) .orElse(""); } else { diff --git a/src/main/java/net/sf/jabref/gui/JabRefFrame.java b/src/main/java/net/sf/jabref/gui/JabRefFrame.java index aa6d5749c82..9ea57ab2c7e 100644 --- a/src/main/java/net/sf/jabref/gui/JabRefFrame.java +++ b/src/main/java/net/sf/jabref/gui/JabRefFrame.java @@ -18,7 +18,6 @@ import com.jgoodies.looks.HeaderStyle; import com.jgoodies.looks.Options; import net.sf.jabref.*; -import net.sf.jabref.bibtex.InternalBibtexFields; import net.sf.jabref.exporter.*; import net.sf.jabref.external.ExternalFileTypeEditor; import net.sf.jabref.external.push.PushToApplicationButton; @@ -1717,7 +1716,7 @@ public void actionPerformed(ActionEvent e) { private void addImportedEntries(final BasePanel panel, final List entries, final boolean openInNew) { SwingUtilities.invokeLater(() -> { ImportInspectionDialog diag = new ImportInspectionDialog(JabRefFrame.this, panel, - InternalBibtexFields.DEFAULT_INSPECTION_FIELDS, Localization.lang("Import"), openInNew); + Localization.lang("Import"), openInNew); diag.addEntries(entries); diag.entryListComplete(); diag.setLocationRelativeTo(JabRefFrame.this); 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 b5f0f59e5d8..d408799475b 100644 --- a/src/main/java/net/sf/jabref/gui/entryeditor/EntryEditor.java +++ b/src/main/java/net/sf/jabref/gui/entryeditor/EntryEditor.java @@ -456,13 +456,13 @@ public Optional getExtra(final FieldEditor editor) { // timestamp or a other field with datepicker command if (Globals.prefs.get(JabRefPreferences.TIME_STAMP_FIELD).equals(fieldName) - || fieldExtras.contains(BibtexSingleFieldProperties.DATEPICKER)) { + || fieldExtras.contains(BibtexSingleFieldProperties.DATE)) { // double click AND datefield => insert the current date (today) return FieldExtraComponents.getDateTimeExtraComponent(editor, - fieldExtras.contains(BibtexSingleFieldProperties.DATEPICKER)); + fieldExtras.contains(BibtexSingleFieldProperties.DATE)); } else if (fieldExtras.contains(BibtexSingleFieldProperties.EXTERNAL)) { return FieldExtraComponents.getExternalExtraComponent(panel, editor); - } else if (fieldExtras.contains(BibtexSingleFieldProperties.JOURNAL_NAMES)) { + } else if (fieldExtras.contains(BibtexSingleFieldProperties.JOURNAL_NAME)) { // Add controls for switching between abbreviated and full journal names. // If this field also has a FieldContentSelector, we need to combine these. return FieldExtraComponents.getJournalExtraComponent(frame, panel, editor, entry, contentSelectors, @@ -474,7 +474,7 @@ public Optional getExtra(final FieldEditor editor) { return FieldExtraComponents.getURLExtraComponent(editor, getStoreFieldAction()); } else if (fieldExtras.contains(BibtexSingleFieldProperties.DOI)) { return FieldExtraComponents.getDoiExtraComponent(panel, editor); - } else if (fieldExtras.contains(BibtexSingleFieldProperties.SET_OWNER)) { + } else if (fieldExtras.contains(BibtexSingleFieldProperties.OWNER)) { return FieldExtraComponents.getSetOwnerExtraComponent(editor, getStoreFieldAction()); } else if (fieldExtras.contains(BibtexSingleFieldProperties.YES_NO)) { return FieldExtraComponents.getYesNoExtraComponent(editor, this); 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 c67acca8500..3ff0f748692 100644 --- a/src/main/java/net/sf/jabref/gui/entryeditor/FieldExtraComponents.java +++ b/src/main/java/net/sf/jabref/gui/entryeditor/FieldExtraComponents.java @@ -32,6 +32,8 @@ import net.sf.jabref.Globals; import net.sf.jabref.JabRefPreferences; +import net.sf.jabref.bibtex.BibtexSingleFieldProperties; +import net.sf.jabref.bibtex.InternalBibtexFields; import net.sf.jabref.gui.BasePanel; import net.sf.jabref.gui.FieldContentSelector; import net.sf.jabref.gui.JabRefFrame; @@ -305,7 +307,8 @@ public static Optional getSelectorExtraComponent(JabRefFrame frame, Set contentSelectors, StoreFieldAction storeFieldAction) { FieldContentSelector ws = new FieldContentSelector(frame, panel, frame, editor, panel.getBibDatabaseContext().getMetaData(), storeFieldAction, false, - "author".equals(editor.getFieldName()) || "editor".equals(editor.getFieldName()) ? " and " : ", "); + InternalBibtexFields.getFieldExtras(editor.getFieldName()) + .contains(BibtexSingleFieldProperties.PERSON_NAMES) ? " and " : ", "); contentSelectors.add(ws); return Optional.of(ws); } 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 92ad111559f..84d6a4498bf 100644 --- a/src/main/java/net/sf/jabref/gui/search/SearchResultsDialog.java +++ b/src/main/java/net/sf/jabref/gui/search/SearchResultsDialog.java @@ -58,6 +58,7 @@ import net.sf.jabref.gui.util.comparator.IconComparator; import net.sf.jabref.model.entry.BibEntry; import net.sf.jabref.model.entry.EntryUtil; +import net.sf.jabref.bibtex.BibtexSingleFieldProperties; import net.sf.jabref.bibtex.InternalBibtexFields; import net.sf.jabref.bibtex.comparator.EntryComparator; import net.sf.jabref.bibtex.comparator.FieldComparator; @@ -478,7 +479,7 @@ public Object getColumnValue(BibEntry entry, int column) { } else { String field = FIELDS[column - PAD]; - if ("author".equals(field) || "editor".equals(field)) { + if (InternalBibtexFields.getFieldExtras(field).contains(BibtexSingleFieldProperties.PERSON_NAMES)) { // For name fields, tap into a MainTableFormat instance and use // the same name formatting as is used in the entry table: if (frame.getCurrentBasePanel() != null) { diff --git a/src/main/java/net/sf/jabref/importer/ImportMenuItem.java b/src/main/java/net/sf/jabref/importer/ImportMenuItem.java index a96423660db..cfe6a97fcfc 100644 --- a/src/main/java/net/sf/jabref/importer/ImportMenuItem.java +++ b/src/main/java/net/sf/jabref/importer/ImportMenuItem.java @@ -28,7 +28,6 @@ import javax.swing.JOptionPane; import net.sf.jabref.*; -import net.sf.jabref.bibtex.InternalBibtexFields; import net.sf.jabref.gui.*; import net.sf.jabref.gui.undo.NamedCompound; import net.sf.jabref.gui.worker.AbstractWorker; @@ -189,7 +188,8 @@ public void update() { } else { final BasePanel panel = (BasePanel) frame.getTabbedPane().getSelectedComponent(); - ImportInspectionDialog diag = new ImportInspectionDialog(frame, panel, InternalBibtexFields.DEFAULT_INSPECTION_FIELDS, Localization.lang("Import"), openInNew); + ImportInspectionDialog diag = new ImportInspectionDialog(frame, panel, Localization.lang("Import"), + openInNew); diag.addEntries(bibtexResult.getDatabase().getEntries()); diag.entryListComplete(); diag.setLocationRelativeTo(frame); diff --git a/src/main/java/net/sf/jabref/importer/fetcher/GeneralFetcher.java b/src/main/java/net/sf/jabref/importer/fetcher/GeneralFetcher.java index d997ff9d098..bc56c34777c 100644 --- a/src/main/java/net/sf/jabref/importer/fetcher/GeneralFetcher.java +++ b/src/main/java/net/sf/jabref/importer/fetcher/GeneralFetcher.java @@ -18,7 +18,6 @@ import net.sf.jabref.Globals; import net.sf.jabref.JabRefExecutorService; import net.sf.jabref.JabRefPreferences; -import net.sf.jabref.bibtex.InternalBibtexFields; import net.sf.jabref.gui.*; import net.sf.jabref.gui.help.HelpAction; import net.sf.jabref.gui.keyboard.KeyBinding; @@ -220,8 +219,7 @@ public void actionPerformed(ActionEvent e) { dialog.setVisible(true); if (dialog.isOkPressed()) { final ImportInspectionDialog d2 = new ImportInspectionDialog(frame, - frame.getCurrentBasePanel(), InternalBibtexFields.DEFAULT_INSPECTION_FIELDS, - activeFetcher.getTitle(), false); + frame.getCurrentBasePanel(), activeFetcher.getTitle(), false); d2.addCallBack(activeFetcher); d2.setLocationRelativeTo(frame); d2.setVisible(true); @@ -238,7 +236,7 @@ public void actionPerformed(ActionEvent e) { // The other category downloads the entries first, then asks the user which ones to keep: else { final ImportInspectionDialog dialog = new ImportInspectionDialog(frame, frame.getCurrentBasePanel(), - InternalBibtexFields.DEFAULT_INSPECTION_FIELDS, activeFetcher.getTitle(), false); + activeFetcher.getTitle(), false); dialog.addCallBack(activeFetcher); dialog.setLocationRelativeTo(frame); dialog.setVisible(true); diff --git a/src/main/java/net/sf/jabref/importer/fileformat/BibtexParser.java b/src/main/java/net/sf/jabref/importer/fileformat/BibtexParser.java index b5c18a1589b..2ce2930d876 100644 --- a/src/main/java/net/sf/jabref/importer/fileformat/BibtexParser.java +++ b/src/main/java/net/sf/jabref/importer/fileformat/BibtexParser.java @@ -22,6 +22,8 @@ import java.util.*; import net.sf.jabref.*; +import net.sf.jabref.bibtex.BibtexSingleFieldProperties; +import net.sf.jabref.bibtex.InternalBibtexFields; import net.sf.jabref.logic.CustomEntryTypesManager; import net.sf.jabref.model.database.KeyCollisionException; import net.sf.jabref.importer.ParserResult; @@ -551,7 +553,7 @@ private void parseField(BibEntry entry) throws IOException { // at least one online database exports bibtex like that, making // it inconvenient // for users if JabRef didn't accept it. - if ("author".equals(key) || "editor".equals(key)) { + if (InternalBibtexFields.getFieldExtras(key).contains(BibtexSingleFieldProperties.PERSON_NAMES)) { entry.setField(key, entry.getField(key) + " and " + content); } else if ("keywords".equals(key)) { //multiple keywords fields should be combined to one diff --git a/src/main/java/net/sf/jabref/logic/autocompleter/AutoCompleterFactory.java b/src/main/java/net/sf/jabref/logic/autocompleter/AutoCompleterFactory.java index bfcb00b5b24..e9ed8e0fc2f 100644 --- a/src/main/java/net/sf/jabref/logic/autocompleter/AutoCompleterFactory.java +++ b/src/main/java/net/sf/jabref/logic/autocompleter/AutoCompleterFactory.java @@ -18,6 +18,9 @@ import java.util.Arrays; import java.util.Objects; +import net.sf.jabref.bibtex.BibtexSingleFieldProperties; +import net.sf.jabref.bibtex.InternalBibtexFields; + /** * Returns an autocompleter to a given fieldname. * @@ -35,7 +38,7 @@ public AutoCompleterFactory(AutoCompletePreferences preferences) { public AutoCompleter getFor(String fieldName) { Objects.requireNonNull(fieldName); - if ("author".equals(fieldName) || "editor".equals(fieldName)) { + if (InternalBibtexFields.getFieldExtras(fieldName).contains(BibtexSingleFieldProperties.PERSON_NAMES)) { return new NameFieldAutoCompleter(fieldName, preferences); } else if ("crossref".equals(fieldName)) { return new BibtexKeyAutoCompleter(preferences); diff --git a/src/main/java/net/sf/jabref/logic/formatter/bibtexfields/NormalizeDateFormatter.java b/src/main/java/net/sf/jabref/logic/formatter/bibtexfields/NormalizeDateFormatter.java index a0c1cab008f..cbc388c97b9 100644 --- a/src/main/java/net/sf/jabref/logic/formatter/bibtexfields/NormalizeDateFormatter.java +++ b/src/main/java/net/sf/jabref/logic/formatter/bibtexfields/NormalizeDateFormatter.java @@ -52,6 +52,7 @@ public String getDescription() { * "MMMM (dd), yyyy" (covers September 1, 2015 and September, 2015) * "yyyy-MM-dd" (covers 2009-1-15) * "d.M.uuuu" (covers 15.1.2015) + * "uuuu.M.d" (covers 2015.1.15) * The code is essentially taken from http://stackoverflow.com/questions/4024544/how-to-parse-dates-in-multiple-formats-using-simpledateformat. */ private Optional tryParseDate(String dateString) { @@ -59,7 +60,7 @@ private Optional tryParseDate(String dateString) { "uuuu-M-d", "uuuu-M", "M/uu", "M/uuuu", "MMMM d, uuuu", "MMMM, uuuu", - "d.M.uuuu"}; + "d.M.uuuu", "uuuu.M.d"}; for (String formatString : formatStrings) { try { return Optional.of(DateTimeFormatter.ofPattern(formatString).parse(dateString)); 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 6e8a6efcb6a..559d3abcc90 100644 --- a/src/main/java/net/sf/jabref/logic/integrity/IntegrityCheck.java +++ b/src/main/java/net/sf/jabref/logic/integrity/IntegrityCheck.java @@ -1,6 +1,8 @@ package net.sf.jabref.logic.integrity; import net.sf.jabref.BibDatabaseContext; +import net.sf.jabref.bibtex.BibtexSingleFieldProperties; +import net.sf.jabref.bibtex.InternalBibtexFields; import net.sf.jabref.logic.l10n.Localization; import net.sf.jabref.logic.util.io.FileUtil; import net.sf.jabref.model.entry.BibEntry; @@ -39,8 +41,11 @@ private List checkBibtexEntry(BibEntry entry) { return result; } - result.addAll(new AuthorNameChecker("author").check(entry)); - result.addAll(new AuthorNameChecker("editor").check(entry)); + for (String fieldName : entry.getFieldNames()) { + if (InternalBibtexFields.getFieldExtras(fieldName).contains(BibtexSingleFieldProperties.PERSON_NAMES)) { + result.addAll(new AuthorNameChecker(fieldName).check(entry)); + } + } if (!bibDatabaseContext.isBiblatexMode()) { result.addAll(new TitleChecker().check(entry)); 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 3afd81d322e..fb2dd559cc0 100644 --- a/src/main/java/net/sf/jabref/logic/xmp/XMPSchemaBibtex.java +++ b/src/main/java/net/sf/jabref/logic/xmp/XMPSchemaBibtex.java @@ -19,7 +19,8 @@ import java.util.*; import net.sf.jabref.*; - +import net.sf.jabref.bibtex.BibtexSingleFieldProperties; +import net.sf.jabref.bibtex.InternalBibtexFields; import net.sf.jabref.model.entry.*; import net.sf.jabref.model.database.BibDatabase; import org.apache.jempbox.xmp.XMPMetadata; @@ -288,7 +289,7 @@ public void setBibtexEntry(BibEntry entry, BibDatabase database) { if (value == null) { value = ""; } - if ("author".equals(field) || "editor".equals(field)) { + if (InternalBibtexFields.getFieldExtras(field).contains(BibtexSingleFieldProperties.PERSON_NAMES)) { setPersonList(field, value); } else { setTextProperty(field, value); diff --git a/src/main/java/net/sf/jabref/model/DuplicateCheck.java b/src/main/java/net/sf/jabref/model/DuplicateCheck.java index 6f0274f0f82..65739c88a27 100644 --- a/src/main/java/net/sf/jabref/model/DuplicateCheck.java +++ b/src/main/java/net/sf/jabref/model/DuplicateCheck.java @@ -17,6 +17,8 @@ import net.sf.jabref.model.database.BibDatabaseMode; import net.sf.jabref.model.entry.AuthorList; +import net.sf.jabref.bibtex.BibtexSingleFieldProperties; +import net.sf.jabref.bibtex.InternalBibtexFields; import net.sf.jabref.model.database.BibDatabase; import net.sf.jabref.model.entry.BibEntry; import net.sf.jabref.model.entry.EntryType; @@ -141,7 +143,7 @@ private static int compareSingleField(String field, BibEntry one, BibEntry two) return EMPTY_IN_TWO; } - if ("author".equals(field) || "editor".equals(field)) { + if (InternalBibtexFields.getFieldExtras(field).contains(BibtexSingleFieldProperties.PERSON_NAMES)) { // Specific for name fields. // Harmonise case: String auth1 = AuthorList.fixAuthorLastNameOnlyCommas(s1, false).replace(" and ", " ").toLowerCase(); diff --git a/src/main/java/net/sf/jabref/model/entry/BibLatexEntryTypes.java b/src/main/java/net/sf/jabref/model/entry/BibLatexEntryTypes.java index 2af1d3a5343..ec1e72a4a9c 100644 --- a/src/main/java/net/sf/jabref/model/entry/BibLatexEntryTypes.java +++ b/src/main/java/net/sf/jabref/model/entry/BibLatexEntryTypes.java @@ -871,4 +871,10 @@ public String getName() { public static Optional getType(String name) { return ALL.stream().filter(e -> e.getName().equalsIgnoreCase(name)).findFirst(); } + + public static final List BIBLATEX_PERSON_NAME_FIELDS = Arrays.asList("author", "editor", "editora", + "editorb", "editorc", "translator", "annotator", "commentator", "introduction", "foreword", "afterword", + "bookauthor", "holder", "shortauthor", "shorteditor"); + + public static final List BIBLATEX_DATE_FIELDS = Arrays.asList("date", "eventdate", "origdate", "urldate"); } From 31d75e43b490436791f854016e6818b620aa422d Mon Sep 17 00:00:00 2001 From: Oscar Gustafsson Date: Tue, 5 Apr 2016 11:56:39 +0200 Subject: [PATCH 2/3] Fixed based on comments, added support for gender and integer fields --- .../sf/jabref/bibtex/BibtexSingleField.java | 12 ++-- .../net/sf/jabref/bibtex/FieldProperties.java | 26 ++++++++ .../jabref/bibtex/InternalBibtexFields.java | 64 +++++++++++-------- .../bibtex/comparator/EntryComparator.java | 4 +- .../bibtex/comparator/FieldComparator.java | 3 +- .../sf/jabref/gui/ImportInspectionDialog.java | 4 +- .../jabref/gui/entryeditor/EntryEditor.java | 24 +++---- .../gui/entryeditor/EntryEditorTab.java | 4 +- .../gui/entryeditor/FieldExtraComponents.java | 25 +++++++- .../jabref/gui/maintable/MainTableColumn.java | 4 +- .../gui/search/SearchResultsDialog.java | 4 +- .../importer/fileformat/BibtexParser.java | 4 +- .../autocompleter/AutoCompleterFactory.java | 4 +- .../logic/integrity/IntegrityCheck.java | 41 +++++------- .../sf/jabref/logic/xmp/XMPSchemaBibtex.java | 4 +- .../net/sf/jabref/model/DuplicateCheck.java | 4 +- .../model/entry/BibLatexEntryTypes.java | 6 -- .../model/entry/IEEETranEntryTypes.java | 6 -- src/main/resources/l10n/JabRef_da.properties | 8 +++ src/main/resources/l10n/JabRef_de.properties | 7 ++ src/main/resources/l10n/JabRef_en.properties | 7 ++ src/main/resources/l10n/JabRef_es.properties | 8 +++ src/main/resources/l10n/JabRef_fa.properties | 8 +++ src/main/resources/l10n/JabRef_fr.properties | 7 ++ src/main/resources/l10n/JabRef_in.properties | 8 +++ src/main/resources/l10n/JabRef_it.properties | 8 +++ src/main/resources/l10n/JabRef_ja.properties | 8 +++ src/main/resources/l10n/JabRef_nl.properties | 8 +++ src/main/resources/l10n/JabRef_no.properties | 8 +++ .../resources/l10n/JabRef_pt_BR.properties | 8 +++ src/main/resources/l10n/JabRef_ru.properties | 8 +++ src/main/resources/l10n/JabRef_sv.properties | 8 +++ src/main/resources/l10n/JabRef_tr.properties | 8 +++ src/main/resources/l10n/JabRef_vi.properties | 8 +++ src/main/resources/l10n/JabRef_zh.properties | 9 +++ .../logic/integrity/IntegrityCheckTest.java | 4 +- .../model/entry/IEEETranEntryTypesTest.java | 7 +- 37 files changed, 284 insertions(+), 104 deletions(-) create mode 100644 src/main/java/net/sf/jabref/bibtex/FieldProperties.java diff --git a/src/main/java/net/sf/jabref/bibtex/BibtexSingleField.java b/src/main/java/net/sf/jabref/bibtex/BibtexSingleField.java index 39509e0c569..bb92d9cc620 100644 --- a/src/main/java/net/sf/jabref/bibtex/BibtexSingleField.java +++ b/src/main/java/net/sf/jabref/bibtex/BibtexSingleField.java @@ -42,7 +42,7 @@ private enum Flag { // the extras data // fieldExtras contains mappings to tell the EntryEditor to add a specific // function to this field, for instance a "browse" button for the "pdf" field. - private Set extras = EnumSet.noneOf(BibtexSingleFieldProperties.class); + private Set extras = EnumSet.noneOf(FieldProperties.class); // a comma separated list of alternative bibtex-fieldnames, e.g. // "LCCN" is the same like "lib-congress" @@ -115,13 +115,13 @@ public boolean isWriteable() { return flags.contains(Flag.WRITEABLE); } - public void setExtras(Set pExtras) { + public void setExtras(Set pExtras) { extras = pExtras; } // fieldExtras contains mappings to tell the EntryEditor to add a specific // function to this field, for instance a "browse" button for the "pdf" field. - public Set getExtras() { + public Set getExtras() { return extras; } @@ -153,15 +153,15 @@ public String getFieldName() { */ public BibtexSingleField setNumeric(boolean numeric) { if (numeric) { - extras.add(BibtexSingleFieldProperties.NUMERIC); + extras.add(FieldProperties.NUMERIC); } else { - extras.remove(BibtexSingleFieldProperties.NUMERIC); + extras.remove(FieldProperties.NUMERIC); } return this; } public boolean isNumeric() { - return extras.contains(BibtexSingleFieldProperties.NUMERIC); + return extras.contains(FieldProperties.NUMERIC); } } diff --git a/src/main/java/net/sf/jabref/bibtex/FieldProperties.java b/src/main/java/net/sf/jabref/bibtex/FieldProperties.java new file mode 100644 index 00000000000..e5266cf7c18 --- /dev/null +++ b/src/main/java/net/sf/jabref/bibtex/FieldProperties.java @@ -0,0 +1,26 @@ +package net.sf.jabref.bibtex; + +import java.util.EnumSet; + +public enum FieldProperties { + YES_NO, + URL, + DATE, + JOURNAL_NAME, + EXTERNAL, + BROWSE, + OWNER, + MONTH, + FILE_EDITOR, + NUMERIC, + PERSON_NAMES, + INTEGER, + GENDER, + LANGUAGE, + LANG_ID, + DOI; + + public static final EnumSet ALL_OPTS = EnumSet + .allOf(FieldProperties.class); + +} diff --git a/src/main/java/net/sf/jabref/bibtex/InternalBibtexFields.java b/src/main/java/net/sf/jabref/bibtex/InternalBibtexFields.java index 4087805f165..0fd91bdf4a8 100644 --- a/src/main/java/net/sf/jabref/bibtex/InternalBibtexFields.java +++ b/src/main/java/net/sf/jabref/bibtex/InternalBibtexFields.java @@ -31,6 +31,7 @@ package net.sf.jabref.bibtex; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.EnumSet; import java.util.HashMap; @@ -44,8 +45,6 @@ import net.sf.jabref.Globals; import net.sf.jabref.JabRefPreferences; import net.sf.jabref.model.entry.BibEntry; -import net.sf.jabref.model.entry.BibLatexEntryTypes; -import net.sf.jabref.model.entry.IEEETranEntryTypes; import net.sf.jabref.specialfields.SpecialFieldsUtils; public class InternalBibtexFields { @@ -59,8 +58,6 @@ public class InternalBibtexFields { private static final String ENTRYTYPE = "entrytype"; public static final String NUMBER_COL = "#"; - // singleton instance - private static final InternalBibtexFields RUNTIME = new InternalBibtexFields(); // contains all bibtex-field objects (BibtexSingleField) private final Map fieldSet; @@ -68,6 +65,18 @@ public class InternalBibtexFields { // contains all known (and public) bibtex fieldnames private final List PUBLIC_FIELDS = new ArrayList<>(); + // Lists of fields with special properties + public static final List IEEETRANBSTCTL_NUMERIC_FIELDS = Arrays.asList("ctlmax_names_forced_etal", + "ctlnames_show_etal", "ctlalt_stretch_factor"); + public static final List IEEETRANBSTCTL_YES_NO_FIELDS = Arrays.asList("ctluse_article_number", + "ctluse_paper", "ctluse_url", "ctluse_forced_etal", "ctluse_alt_spacing", "ctldash_repeated_names"); + public static final List BIBLATEX_DATE_FIELDS = Arrays.asList("date", "eventdate", "origdate", "urldate"); + public static final List BIBLATEX_PERSON_NAME_FIELDS = Arrays.asList("author", "editor", "editora", + "editorb", "editorc", "translator", "annotator", "commentator", "introduction", "foreword", "afterword", + "bookauthor", "holder", "shortauthor", "shorteditor", "sortname"); + + // singleton instance + private static final InternalBibtexFields RUNTIME = new InternalBibtexFields(); private InternalBibtexFields() { fieldSet = new HashMap<>(); @@ -91,15 +100,15 @@ private InternalBibtexFields() { add(new BibtexSingleField("institution", true, BibtexSingleField.MEDIUM_W)); dummy = new BibtexSingleField("journal", true, BibtexSingleField.SMALL_W); - dummy.setExtras(EnumSet.of(BibtexSingleFieldProperties.JOURNAL_NAME)); + dummy.setExtras(EnumSet.of(FieldProperties.JOURNAL_NAME)); add(dummy); dummy = new BibtexSingleField("journaltitle", true, BibtexSingleField.SMALL_W); - dummy.setExtras(EnumSet.of(BibtexSingleFieldProperties.JOURNAL_NAME)); + dummy.setExtras(EnumSet.of(FieldProperties.JOURNAL_NAME)); add(dummy); add(new BibtexSingleField("key", true)); dummy = new BibtexSingleField("month", true, BibtexSingleField.SMALL_W); - dummy.setExtras(EnumSet.of(BibtexSingleFieldProperties.MONTH)); + dummy.setExtras(EnumSet.of(FieldProperties.MONTH)); add(dummy); add(new BibtexSingleField("note", true, BibtexSingleField.MEDIUM_W)); add(new BibtexSingleField("number", true, BibtexSingleField.SMALL_W, 60).setNumeric(true)); @@ -164,7 +173,7 @@ private InternalBibtexFields() { add(dummy); dummy = new BibtexSingleField("doi", true, BibtexSingleField.SMALL_W); - dummy.setExtras(EnumSet.of(BibtexSingleFieldProperties.DOI)); + dummy.setExtras(EnumSet.of(FieldProperties.DOI)); add(dummy); add(new BibtexSingleField("eid", true, BibtexSingleField.SMALL_W)); @@ -179,18 +188,23 @@ private InternalBibtexFields() { add(new BibtexSingleField("abstract", false, BibtexSingleField.LARGE_W, 400)); dummy = new BibtexSingleField("url", false, BibtexSingleField.SMALL_W); - dummy.setExtras(EnumSet.of(BibtexSingleFieldProperties.EXTERNAL)); + dummy.setExtras(EnumSet.of(FieldProperties.EXTERNAL)); add(dummy); add(new BibtexSingleField("comment", false, BibtexSingleField.MEDIUM_W)); add(new BibtexSingleField("keywords", false, BibtexSingleField.SMALL_W)); dummy = new BibtexSingleField(Globals.FILE_FIELD, false); - dummy.setExtras(EnumSet.of(BibtexSingleFieldProperties.FILE_EDITOR)); + dummy.setExtras(EnumSet.of(FieldProperties.FILE_EDITOR)); add(dummy); add(new BibtexSingleField("search", false, 75)); + // some BibLatex fields + dummy = new BibtexSingleField("gender", true, BibtexSingleField.SMALL_W); + dummy.getExtras().add(FieldProperties.GENDER); + add(dummy); + // some internal fields ---------------------------------------------- dummy = new BibtexSingleField(InternalBibtexFields.NUMBER_COL, false, 32); dummy.setPrivate(); @@ -199,12 +213,12 @@ private InternalBibtexFields() { add(dummy); dummy = new BibtexSingleField(InternalBibtexFields.OWNER, false, BibtexSingleField.SMALL_W); - dummy.setExtras(EnumSet.of(BibtexSingleFieldProperties.OWNER)); + dummy.setExtras(EnumSet.of(FieldProperties.OWNER)); dummy.setPrivate(); add(dummy); dummy = new BibtexSingleField(InternalBibtexFields.TIMESTAMP, false, BibtexSingleField.SMALL_W); - dummy.setExtras(EnumSet.of(BibtexSingleFieldProperties.DATE)); + dummy.setExtras(EnumSet.of(FieldProperties.DATE)); dummy.setPrivate(); add(dummy); @@ -231,37 +245,35 @@ private InternalBibtexFields() { add(dummy); // IEEEtranBSTCTL fields - for (String yesNoField : IEEETranEntryTypes.IEEETRANBSTCTL_YES_NO_FIELDS) { + for (String yesNoField : IEEETRANBSTCTL_YES_NO_FIELDS) { dummy = new BibtexSingleField(yesNoField, false); - dummy.setExtras(EnumSet.of(BibtexSingleFieldProperties.YES_NO)); + dummy.setExtras(EnumSet.of(FieldProperties.YES_NO)); add(dummy); } - for (String numericField : IEEETranEntryTypes.IEEETRANBSTCTL_NUMERIC_FIELDS) { - add(new BibtexSingleField(numericField, false).setNumeric(true)); + for (String numericField : IEEETRANBSTCTL_NUMERIC_FIELDS) { + dummy = new BibtexSingleField(numericField, false).setNumeric(true); + dummy.getExtras().add(FieldProperties.INTEGER); + add(dummy); } // Set all fields with person names - for (String fieldText : BibLatexEntryTypes.BIBLATEX_PERSON_NAME_FIELDS) { + for (String fieldText : BIBLATEX_PERSON_NAME_FIELDS) { BibtexSingleField field = fieldSet.get(fieldText); if (field == null) { field = new BibtexSingleField(fieldText, true, BibtexSingleField.SMALL_W); } - Set extras = field.getExtras(); - extras.add(BibtexSingleFieldProperties.PERSON_NAMES); - field.setExtras(extras); + field.getExtras().add(FieldProperties.PERSON_NAMES); add(field); } // Set all fields with dates - for (String fieldText : BibLatexEntryTypes.BIBLATEX_DATE_FIELDS) { + for (String fieldText : BIBLATEX_DATE_FIELDS) { BibtexSingleField field = fieldSet.get(fieldText); if (field == null) { field = new BibtexSingleField(fieldText, true, BibtexSingleField.SMALL_W); } - Set extras = field.getExtras(); - extras.add(BibtexSingleFieldProperties.DATE); - field.setExtras(extras); + field.getExtras().add(FieldProperties.DATE); add(field); } @@ -328,12 +340,12 @@ private static Optional getField(String name) { return Optional.empty(); } - public static Set getFieldExtras(String name) { + public static Set getFieldExtras(String name) { Optional sField = InternalBibtexFields.getField(name); if (sField.isPresent()) { return sField.get().getExtras(); } - return EnumSet.noneOf(BibtexSingleFieldProperties.class); + return EnumSet.noneOf(FieldProperties.class); } public static double getFieldWeight(String name) { diff --git a/src/main/java/net/sf/jabref/bibtex/comparator/EntryComparator.java b/src/main/java/net/sf/jabref/bibtex/comparator/EntryComparator.java index 67ad17d7522..697f2e051c9 100644 --- a/src/main/java/net/sf/jabref/bibtex/comparator/EntryComparator.java +++ b/src/main/java/net/sf/jabref/bibtex/comparator/EntryComparator.java @@ -15,7 +15,7 @@ */ package net.sf.jabref.bibtex.comparator; -import net.sf.jabref.bibtex.BibtexSingleFieldProperties; +import net.sf.jabref.bibtex.FieldProperties; import net.sf.jabref.bibtex.InternalBibtexFields; import net.sf.jabref.model.entry.AuthorList; import net.sf.jabref.model.entry.BibEntry; @@ -77,7 +77,7 @@ public int compare(BibEntry e1, BibEntry e2) { // If the field is author or editor, we rearrange names so they are // sorted according to last name. - if (InternalBibtexFields.getFieldExtras(sortField).contains(BibtexSingleFieldProperties.PERSON_NAMES)) { + if (InternalBibtexFields.getFieldExtras(sortField).contains(FieldProperties.PERSON_NAMES)) { if (f1 != null) { f1 = AuthorList.fixAuthorForAlphabetization((String) f1).toLowerCase(); } diff --git a/src/main/java/net/sf/jabref/bibtex/comparator/FieldComparator.java b/src/main/java/net/sf/jabref/bibtex/comparator/FieldComparator.java index f915404237a..c3058ec8413 100644 --- a/src/main/java/net/sf/jabref/bibtex/comparator/FieldComparator.java +++ b/src/main/java/net/sf/jabref/bibtex/comparator/FieldComparator.java @@ -15,6 +15,7 @@ */ package net.sf.jabref.bibtex.comparator; +import net.sf.jabref.bibtex.FieldProperties; import net.sf.jabref.bibtex.InternalBibtexFields; import net.sf.jabref.gui.maintable.MainTableFormat; import net.sf.jabref.logic.config.SaveOrderConfig; @@ -93,7 +94,7 @@ public FieldComparator(String field, boolean reversed) { private FieldType determineFieldType() { if(BibEntry.TYPE_HEADER.equals(this.field[0])) { return FieldType.TYPE; - } else if("author".equals(this.field[0]) || "editor".equals(this.field[0])) { + } else if (InternalBibtexFields.getFieldExtras(this.field[0]).contains(FieldProperties.PERSON_NAMES)) { return FieldType.NAME; } else if ("year".equals(this.field[0])) { return FieldType.YEAR; diff --git a/src/main/java/net/sf/jabref/gui/ImportInspectionDialog.java b/src/main/java/net/sf/jabref/gui/ImportInspectionDialog.java index a72e9dd7bee..fc2b81a955e 100644 --- a/src/main/java/net/sf/jabref/gui/ImportInspectionDialog.java +++ b/src/main/java/net/sf/jabref/gui/ImportInspectionDialog.java @@ -29,7 +29,7 @@ import com.jgoodies.forms.builder.ButtonBarBuilder; import com.jgoodies.forms.builder.ButtonStackBuilder; import net.sf.jabref.*; -import net.sf.jabref.bibtex.BibtexSingleFieldProperties; +import net.sf.jabref.bibtex.FieldProperties; import net.sf.jabref.bibtex.InternalBibtexFields; import net.sf.jabref.bibtex.comparator.FieldComparator; import net.sf.jabref.external.DownloadExternalFile; @@ -1376,7 +1376,7 @@ public Object getColumnValue(BibEntry entry, int i) { } } else { String field = INSPECTION_FIELDS.get(i - PAD); - if (InternalBibtexFields.getFieldExtras(field).contains(BibtexSingleFieldProperties.PERSON_NAMES)) { + if (InternalBibtexFields.getFieldExtras(field).contains(FieldProperties.PERSON_NAMES)) { return entry.getFieldOptional(field).map(AuthorList::fixAuthorNatbib) .orElse(""); } else { 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 d408799475b..d477f3277d7 100644 --- a/src/main/java/net/sf/jabref/gui/entryeditor/EntryEditor.java +++ b/src/main/java/net/sf/jabref/gui/entryeditor/EntryEditor.java @@ -44,7 +44,7 @@ import javax.swing.text.JTextComponent; import net.sf.jabref.*; import net.sf.jabref.bibtex.BibEntryWriter; -import net.sf.jabref.bibtex.BibtexSingleFieldProperties; +import net.sf.jabref.bibtex.FieldProperties; import net.sf.jabref.bibtex.InternalBibtexFields; import net.sf.jabref.logic.TypedBibEntry; import net.sf.jabref.model.EntryTypes; @@ -452,17 +452,17 @@ public void rebuildPanels() { public Optional getExtra(final FieldEditor editor) { final String fieldName = editor.getFieldName(); - final Set fieldExtras = InternalBibtexFields.getFieldExtras(fieldName); + final Set fieldExtras = InternalBibtexFields.getFieldExtras(fieldName); // timestamp or a other field with datepicker command if (Globals.prefs.get(JabRefPreferences.TIME_STAMP_FIELD).equals(fieldName) - || fieldExtras.contains(BibtexSingleFieldProperties.DATE)) { + || fieldExtras.contains(FieldProperties.DATE)) { // double click AND datefield => insert the current date (today) return FieldExtraComponents.getDateTimeExtraComponent(editor, - fieldExtras.contains(BibtexSingleFieldProperties.DATE)); - } else if (fieldExtras.contains(BibtexSingleFieldProperties.EXTERNAL)) { + fieldExtras.contains(FieldProperties.DATE)); + } else if (fieldExtras.contains(FieldProperties.EXTERNAL)) { return FieldExtraComponents.getExternalExtraComponent(panel, editor); - } else if (fieldExtras.contains(BibtexSingleFieldProperties.JOURNAL_NAME)) { + } else if (fieldExtras.contains(FieldProperties.JOURNAL_NAME)) { // Add controls for switching between abbreviated and full journal names. // If this field also has a FieldContentSelector, we need to combine these. return FieldExtraComponents.getJournalExtraComponent(frame, panel, editor, entry, contentSelectors, @@ -470,16 +470,18 @@ public Optional getExtra(final FieldEditor editor) { } else if (panel.getBibDatabaseContext().getMetaData().getData(Globals.SELECTOR_META_PREFIX + fieldName) != null) { return FieldExtraComponents.getSelectorExtraComponent(frame, panel, editor, contentSelectors, getStoreFieldAction()); - } else if (fieldExtras.contains(BibtexSingleFieldProperties.URL)) { + } else if (fieldExtras.contains(FieldProperties.URL)) { return FieldExtraComponents.getURLExtraComponent(editor, getStoreFieldAction()); - } else if (fieldExtras.contains(BibtexSingleFieldProperties.DOI)) { + } else if (fieldExtras.contains(FieldProperties.DOI)) { return FieldExtraComponents.getDoiExtraComponent(panel, editor); - } else if (fieldExtras.contains(BibtexSingleFieldProperties.OWNER)) { + } else if (fieldExtras.contains(FieldProperties.OWNER)) { return FieldExtraComponents.getSetOwnerExtraComponent(editor, getStoreFieldAction()); - } else if (fieldExtras.contains(BibtexSingleFieldProperties.YES_NO)) { + } else if (fieldExtras.contains(FieldProperties.YES_NO)) { return FieldExtraComponents.getYesNoExtraComponent(editor, this); - } else if (fieldExtras.contains(BibtexSingleFieldProperties.MONTH)) { + } else if (fieldExtras.contains(FieldProperties.MONTH)) { return FieldExtraComponents.getMonthExtraComponent(editor, this, frame.getCurrentBasePanel().getBibDatabaseContext().getMode()); + } else if (fieldExtras.contains(FieldProperties.GENDER)) { + return FieldExtraComponents.getGenderExtraComponent(editor, this); } return Optional.empty(); } 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 1baca87f226..499bf714901 100644 --- a/src/main/java/net/sf/jabref/gui/entryeditor/EntryEditorTab.java +++ b/src/main/java/net/sf/jabref/gui/entryeditor/EntryEditorTab.java @@ -33,7 +33,7 @@ import javax.swing.text.JTextComponent; import net.sf.jabref.*; -import net.sf.jabref.bibtex.BibtexSingleFieldProperties; +import net.sf.jabref.bibtex.FieldProperties; import net.sf.jabref.bibtex.InternalBibtexFields; import net.sf.jabref.gui.*; import net.sf.jabref.gui.autocompleter.AutoCompleteListener; @@ -142,7 +142,7 @@ private void setupPanel(JabRefFrame frame, BasePanel bPanel, boolean addKeyField FieldEditor fieldEditor; int defaultHeight; int wHeight = (int) (50.0 * InternalBibtexFields.getFieldWeight(field)); - if (InternalBibtexFields.getFieldExtras(field).contains(BibtexSingleFieldProperties.FILE_EDITOR)) { + if (InternalBibtexFields.getFieldExtras(field).contains(FieldProperties.FILE_EDITOR)) { fieldEditor = new FileListEditor(frame, bPanel.getBibDatabaseContext(), field, null, parent); fileListEditor = (FileListEditor) fieldEditor; defaultHeight = 0; 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 3ff0f748692..98d246b6b94 100644 --- a/src/main/java/net/sf/jabref/gui/entryeditor/FieldExtraComponents.java +++ b/src/main/java/net/sf/jabref/gui/entryeditor/FieldExtraComponents.java @@ -32,7 +32,7 @@ import net.sf.jabref.Globals; import net.sf.jabref.JabRefPreferences; -import net.sf.jabref.bibtex.BibtexSingleFieldProperties; +import net.sf.jabref.bibtex.FieldProperties; import net.sf.jabref.bibtex.InternalBibtexFields; import net.sf.jabref.gui.BasePanel; import net.sf.jabref.gui.FieldContentSelector; @@ -308,7 +308,7 @@ public static Optional getSelectorExtraComponent(JabRefFrame frame, FieldContentSelector ws = new FieldContentSelector(frame, panel, frame, editor, panel.getBibDatabaseContext().getMetaData(), storeFieldAction, false, InternalBibtexFields.getFieldExtras(editor.getFieldName()) - .contains(BibtexSingleFieldProperties.PERSON_NAMES) ? " and " : ", "); + .contains(FieldProperties.PERSON_NAMES) ? " and " : ", "); contentSelectors.add(ws); return Optional.of(ws); } @@ -343,4 +343,25 @@ public void mouseClicked(MouseEvent e) { } + /** + * Return a dropdown list with the gender alternatives for fields with GENDER + * + * @param fieldEditor + * @param entryEditor + * @return + */ + + public static Optional getGenderExtraComponent(FieldEditor fieldEditor, EntryEditor entryEditor) { + final String[] optionValues = {"", "sf", "sm", "sp", "pf", "pm", "pn", "pp"}; + final String[] optionDescriptions = {"", Localization.lang("Female name"), Localization.lang("Male name"), + Localization.lang("Neuter name"), Localization.lang("Female names"), Localization.lang("Male names"), + Localization.lang("Neuter names"), Localization.lang("Mixed names")}; + JComboBox gender = new JComboBox<>(optionDescriptions); + gender.addActionListener(actionEvent -> { + fieldEditor.setText(optionValues[gender.getSelectedIndex()]); + entryEditor.updateField(fieldEditor); + }); + return Optional.of(gender); + + } } diff --git a/src/main/java/net/sf/jabref/gui/maintable/MainTableColumn.java b/src/main/java/net/sf/jabref/gui/maintable/MainTableColumn.java index 935a62e4701..501d25a9a65 100644 --- a/src/main/java/net/sf/jabref/gui/maintable/MainTableColumn.java +++ b/src/main/java/net/sf/jabref/gui/maintable/MainTableColumn.java @@ -1,6 +1,6 @@ package net.sf.jabref.gui.maintable; -import net.sf.jabref.bibtex.BibtexSingleFieldProperties; +import net.sf.jabref.bibtex.FieldProperties; import net.sf.jabref.bibtex.InternalBibtexFields; import net.sf.jabref.logic.layout.LayoutFormatter; import net.sf.jabref.logic.layout.format.LatexToUnicodeFormatter; @@ -73,7 +73,7 @@ public String getDisplayName() { */ public boolean isNameColumn() { for (String field : bibtexFields) { - if (InternalBibtexFields.getFieldExtras(field).contains(BibtexSingleFieldProperties.PERSON_NAMES)) { + if (InternalBibtexFields.getFieldExtras(field).contains(FieldProperties.PERSON_NAMES)) { return true; } } 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 84d6a4498bf..c7cee5af373 100644 --- a/src/main/java/net/sf/jabref/gui/search/SearchResultsDialog.java +++ b/src/main/java/net/sf/jabref/gui/search/SearchResultsDialog.java @@ -58,7 +58,7 @@ import net.sf.jabref.gui.util.comparator.IconComparator; import net.sf.jabref.model.entry.BibEntry; import net.sf.jabref.model.entry.EntryUtil; -import net.sf.jabref.bibtex.BibtexSingleFieldProperties; +import net.sf.jabref.bibtex.FieldProperties; import net.sf.jabref.bibtex.InternalBibtexFields; import net.sf.jabref.bibtex.comparator.EntryComparator; import net.sf.jabref.bibtex.comparator.FieldComparator; @@ -479,7 +479,7 @@ public Object getColumnValue(BibEntry entry, int column) { } else { String field = FIELDS[column - PAD]; - if (InternalBibtexFields.getFieldExtras(field).contains(BibtexSingleFieldProperties.PERSON_NAMES)) { + if (InternalBibtexFields.getFieldExtras(field).contains(FieldProperties.PERSON_NAMES)) { // For name fields, tap into a MainTableFormat instance and use // the same name formatting as is used in the entry table: if (frame.getCurrentBasePanel() != null) { diff --git a/src/main/java/net/sf/jabref/importer/fileformat/BibtexParser.java b/src/main/java/net/sf/jabref/importer/fileformat/BibtexParser.java index 2ce2930d876..916427a74e6 100644 --- a/src/main/java/net/sf/jabref/importer/fileformat/BibtexParser.java +++ b/src/main/java/net/sf/jabref/importer/fileformat/BibtexParser.java @@ -22,7 +22,7 @@ import java.util.*; import net.sf.jabref.*; -import net.sf.jabref.bibtex.BibtexSingleFieldProperties; +import net.sf.jabref.bibtex.FieldProperties; import net.sf.jabref.bibtex.InternalBibtexFields; import net.sf.jabref.logic.CustomEntryTypesManager; import net.sf.jabref.model.database.KeyCollisionException; @@ -553,7 +553,7 @@ private void parseField(BibEntry entry) throws IOException { // at least one online database exports bibtex like that, making // it inconvenient // for users if JabRef didn't accept it. - if (InternalBibtexFields.getFieldExtras(key).contains(BibtexSingleFieldProperties.PERSON_NAMES)) { + if (InternalBibtexFields.getFieldExtras(key).contains(FieldProperties.PERSON_NAMES)) { entry.setField(key, entry.getField(key) + " and " + content); } else if ("keywords".equals(key)) { //multiple keywords fields should be combined to one diff --git a/src/main/java/net/sf/jabref/logic/autocompleter/AutoCompleterFactory.java b/src/main/java/net/sf/jabref/logic/autocompleter/AutoCompleterFactory.java index e9ed8e0fc2f..3690c65d43e 100644 --- a/src/main/java/net/sf/jabref/logic/autocompleter/AutoCompleterFactory.java +++ b/src/main/java/net/sf/jabref/logic/autocompleter/AutoCompleterFactory.java @@ -18,7 +18,7 @@ import java.util.Arrays; import java.util.Objects; -import net.sf.jabref.bibtex.BibtexSingleFieldProperties; +import net.sf.jabref.bibtex.FieldProperties; import net.sf.jabref.bibtex.InternalBibtexFields; /** @@ -38,7 +38,7 @@ public AutoCompleterFactory(AutoCompletePreferences preferences) { public AutoCompleter getFor(String fieldName) { Objects.requireNonNull(fieldName); - if (InternalBibtexFields.getFieldExtras(fieldName).contains(BibtexSingleFieldProperties.PERSON_NAMES)) { + if (InternalBibtexFields.getFieldExtras(fieldName).contains(FieldProperties.PERSON_NAMES)) { return new NameFieldAutoCompleter(fieldName, preferences); } else if ("crossref".equals(fieldName)) { return new BibtexKeyAutoCompleter(preferences); 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 559d3abcc90..b480c3421a8 100644 --- a/src/main/java/net/sf/jabref/logic/integrity/IntegrityCheck.java +++ b/src/main/java/net/sf/jabref/logic/integrity/IntegrityCheck.java @@ -1,7 +1,7 @@ package net.sf.jabref.logic.integrity; import net.sf.jabref.BibDatabaseContext; -import net.sf.jabref.bibtex.BibtexSingleFieldProperties; +import net.sf.jabref.bibtex.FieldProperties; import net.sf.jabref.bibtex.InternalBibtexFields; import net.sf.jabref.logic.l10n.Localization; import net.sf.jabref.logic.util.io.FileUtil; @@ -41,11 +41,7 @@ private List checkBibtexEntry(BibEntry entry) { return result; } - for (String fieldName : entry.getFieldNames()) { - if (InternalBibtexFields.getFieldExtras(fieldName).contains(BibtexSingleFieldProperties.PERSON_NAMES)) { - result.addAll(new AuthorNameChecker(fieldName).check(entry)); - } - } + result.addAll(new AuthorNameChecker().check(entry)); if (!bibDatabaseContext.isBiblatexMode()) { result.addAll(new TitleChecker().check(entry)); @@ -160,29 +156,26 @@ public List check(BibEntry entry) { private static class AuthorNameChecker implements Checker { - private final String field; - - private AuthorNameChecker(String field) { - this.field = field; - } - @Override public List check(BibEntry entry) { - Optional value = entry.getFieldOptional(field); - if (!value.isPresent()) { - return Collections.emptyList(); - } + List result = new ArrayList<>(); + for (String field : entry.getFieldNames()) { + if (InternalBibtexFields.getFieldExtras(field).contains(FieldProperties.PERSON_NAMES)) { + Optional value = entry.getFieldOptional(field); + if (!value.isPresent()) { + return Collections.emptyList(); + } - String valueTrimmedAndLowerCase = value.get().trim().toLowerCase(); - if (valueTrimmedAndLowerCase.startsWith("and ") || valueTrimmedAndLowerCase.startsWith(",")) { - return Collections.singletonList(new IntegrityMessage(Localization.lang("should start with a name"), entry, field)); - } else if (valueTrimmedAndLowerCase.endsWith(" and") || valueTrimmedAndLowerCase.endsWith(",")) { - return Collections.singletonList(new IntegrityMessage(Localization.lang("should end with a name"), entry, field)); + String valueTrimmedAndLowerCase = value.get().trim().toLowerCase(); + if (valueTrimmedAndLowerCase.startsWith("and ") || valueTrimmedAndLowerCase.startsWith(",")) { + result.add(new IntegrityMessage(Localization.lang("should start with a name"), entry, field)); + } else if (valueTrimmedAndLowerCase.endsWith(" and") || valueTrimmedAndLowerCase.endsWith(",")) { + result.add(new IntegrityMessage(Localization.lang("should end with a name"), entry, field)); + } + } } - - return Collections.emptyList(); + return result; } - } private static class BracketChecker implements Checker { 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 fb2dd559cc0..6c59b5fdb46 100644 --- a/src/main/java/net/sf/jabref/logic/xmp/XMPSchemaBibtex.java +++ b/src/main/java/net/sf/jabref/logic/xmp/XMPSchemaBibtex.java @@ -19,7 +19,7 @@ import java.util.*; import net.sf.jabref.*; -import net.sf.jabref.bibtex.BibtexSingleFieldProperties; +import net.sf.jabref.bibtex.FieldProperties; import net.sf.jabref.bibtex.InternalBibtexFields; import net.sf.jabref.model.entry.*; import net.sf.jabref.model.database.BibDatabase; @@ -289,7 +289,7 @@ public void setBibtexEntry(BibEntry entry, BibDatabase database) { if (value == null) { value = ""; } - if (InternalBibtexFields.getFieldExtras(field).contains(BibtexSingleFieldProperties.PERSON_NAMES)) { + if (InternalBibtexFields.getFieldExtras(field).contains(FieldProperties.PERSON_NAMES)) { setPersonList(field, value); } else { setTextProperty(field, value); diff --git a/src/main/java/net/sf/jabref/model/DuplicateCheck.java b/src/main/java/net/sf/jabref/model/DuplicateCheck.java index 65739c88a27..133a295c33a 100644 --- a/src/main/java/net/sf/jabref/model/DuplicateCheck.java +++ b/src/main/java/net/sf/jabref/model/DuplicateCheck.java @@ -17,7 +17,7 @@ import net.sf.jabref.model.database.BibDatabaseMode; import net.sf.jabref.model.entry.AuthorList; -import net.sf.jabref.bibtex.BibtexSingleFieldProperties; +import net.sf.jabref.bibtex.FieldProperties; import net.sf.jabref.bibtex.InternalBibtexFields; import net.sf.jabref.model.database.BibDatabase; import net.sf.jabref.model.entry.BibEntry; @@ -143,7 +143,7 @@ private static int compareSingleField(String field, BibEntry one, BibEntry two) return EMPTY_IN_TWO; } - if (InternalBibtexFields.getFieldExtras(field).contains(BibtexSingleFieldProperties.PERSON_NAMES)) { + if (InternalBibtexFields.getFieldExtras(field).contains(FieldProperties.PERSON_NAMES)) { // Specific for name fields. // Harmonise case: String auth1 = AuthorList.fixAuthorLastNameOnlyCommas(s1, false).replace(" and ", " ").toLowerCase(); diff --git a/src/main/java/net/sf/jabref/model/entry/BibLatexEntryTypes.java b/src/main/java/net/sf/jabref/model/entry/BibLatexEntryTypes.java index ec1e72a4a9c..2af1d3a5343 100644 --- a/src/main/java/net/sf/jabref/model/entry/BibLatexEntryTypes.java +++ b/src/main/java/net/sf/jabref/model/entry/BibLatexEntryTypes.java @@ -871,10 +871,4 @@ public String getName() { public static Optional getType(String name) { return ALL.stream().filter(e -> e.getName().equalsIgnoreCase(name)).findFirst(); } - - public static final List BIBLATEX_PERSON_NAME_FIELDS = Arrays.asList("author", "editor", "editora", - "editorb", "editorc", "translator", "annotator", "commentator", "introduction", "foreword", "afterword", - "bookauthor", "holder", "shortauthor", "shorteditor"); - - public static final List BIBLATEX_DATE_FIELDS = Arrays.asList("date", "eventdate", "origdate", "urldate"); } diff --git a/src/main/java/net/sf/jabref/model/entry/IEEETranEntryTypes.java b/src/main/java/net/sf/jabref/model/entry/IEEETranEntryTypes.java index e91026f7512..abbd68e1037 100644 --- a/src/main/java/net/sf/jabref/model/entry/IEEETranEntryTypes.java +++ b/src/main/java/net/sf/jabref/model/entry/IEEETranEntryTypes.java @@ -49,12 +49,6 @@ public String getName() { }; - public static final String[] IEEETRANBSTCTL_YES_NO_FIELDS = {"ctluse_article_number", "ctluse_paper", "ctluse_url", - "ctluse_forced_etal", "ctluse_alt_spacing", "ctldash_repeated_names"}; - - public static final String[] IEEETRANBSTCTL_NUMERIC_FIELDS = {"ctlmax_names_forced_etal", "ctlnames_show_etal", - "ctlalt_stretch_factor"}; - /** * The periodical entry type is used for journals and magazines. *

diff --git a/src/main/resources/l10n/JabRef_da.properties b/src/main/resources/l10n/JabRef_da.properties index b5bd16359d0..304c162960a 100644 --- a/src/main/resources/l10n/JabRef_da.properties +++ b/src/main/resources/l10n/JabRef_da.properties @@ -1625,3 +1625,11 @@ Main_file_directory_not_set\!= This_operation_requires_exactly_one_item_to_be_selected.= Importing_in_%0_format= + +Female_name= +Female_names= +Male_name= +Male_names= +Mixed_names= +Neuter_name= +Neuter_names= diff --git a/src/main/resources/l10n/JabRef_de.properties b/src/main/resources/l10n/JabRef_de.properties index ec381b8d04b..fd2ea363c2d 100644 --- a/src/main/resources/l10n/JabRef_de.properties +++ b/src/main/resources/l10n/JabRef_de.properties @@ -2345,3 +2345,10 @@ Move_linked_files_to_default_file_directory_%0= wrong_entry_type_as_proceedings_has_page_numbers=falscher_Eintragstyp,_weil_'Konferenzbericht'_Feld_mit_Seitenzahlen_hat Importing_in_%0_format= +Female_name= +Female_names= +Male_name= +Male_names= +Mixed_names= +Neuter_name= +Neuter_names= diff --git a/src/main/resources/l10n/JabRef_en.properties b/src/main/resources/l10n/JabRef_en.properties index e3ef3ab6050..878aa7737d4 100644 --- a/src/main/resources/l10n/JabRef_en.properties +++ b/src/main/resources/l10n/JabRef_en.properties @@ -2215,3 +2215,10 @@ Directory_not_found=Directory_not_found Main_file_directory_not_set\!=Main_file_directory_not_set\! This_operation_requires_exactly_one_item_to_be_selected.=This_operation_requires_exactly_one_item_to_be_selected. Importing_in_%0_format=Importing_in_%0_format +Female_name=Female_name +Female_names=Female_names +Male_name=Male_name +Male_names=Male_names +Mixed_names=Mixed_names +Neuter_name=Neuter_name +Neuter_names=Neuter_names diff --git a/src/main/resources/l10n/JabRef_es.properties b/src/main/resources/l10n/JabRef_es.properties index dafa421d4b9..2894b25e637 100644 --- a/src/main/resources/l10n/JabRef_es.properties +++ b/src/main/resources/l10n/JabRef_es.properties @@ -1526,3 +1526,11 @@ Main_file_directory_not_set\!= This_operation_requires_exactly_one_item_to_be_selected.= Importing_in_%0_format= + +Female_name= +Female_names= +Male_name= +Male_names= +Mixed_names= +Neuter_name= +Neuter_names= diff --git a/src/main/resources/l10n/JabRef_fa.properties b/src/main/resources/l10n/JabRef_fa.properties index 162d755beb2..c37515f6577 100644 --- a/src/main/resources/l10n/JabRef_fa.properties +++ b/src/main/resources/l10n/JabRef_fa.properties @@ -2313,3 +2313,11 @@ Main_file_directory_not_set\!= This_operation_requires_exactly_one_item_to_be_selected.= Importing_in_%0_format= + +Female_name= +Female_names= +Male_name= +Male_names= +Mixed_names= +Neuter_name= +Neuter_names= diff --git a/src/main/resources/l10n/JabRef_fr.properties b/src/main/resources/l10n/JabRef_fr.properties index ee206c95709..6afa445a853 100644 --- a/src/main/resources/l10n/JabRef_fr.properties +++ b/src/main/resources/l10n/JabRef_fr.properties @@ -1571,3 +1571,10 @@ This_operation_requires_exactly_one_item_to_be_selected.=Cette_opération_néces Directory_not_found=Répertoire_non_trouvé Importing_in_%0_format=Importation_au_format_%0 +Female_name= +Female_names= +Male_name= +Male_names= +Mixed_names= +Neuter_name= +Neuter_names= diff --git a/src/main/resources/l10n/JabRef_in.properties b/src/main/resources/l10n/JabRef_in.properties index 8bd9de13b25..bea1eb7e896 100644 --- a/src/main/resources/l10n/JabRef_in.properties +++ b/src/main/resources/l10n/JabRef_in.properties @@ -1548,3 +1548,11 @@ Main_file_directory_not_set\!= This_operation_requires_exactly_one_item_to_be_selected.= Importing_in_%0_format= + +Female_name= +Female_names= +Male_name= +Male_names= +Mixed_names= +Neuter_name= +Neuter_names= diff --git a/src/main/resources/l10n/JabRef_it.properties b/src/main/resources/l10n/JabRef_it.properties index 1363af920e5..3f8b4e7c6b7 100644 --- a/src/main/resources/l10n/JabRef_it.properties +++ b/src/main/resources/l10n/JabRef_it.properties @@ -1644,3 +1644,11 @@ Main_file_directory_not_set\!= This_operation_requires_exactly_one_item_to_be_selected.= Importing_in_%0_format= + +Female_name= +Female_names= +Male_name= +Male_names= +Mixed_names= +Neuter_name= +Neuter_names= diff --git a/src/main/resources/l10n/JabRef_ja.properties b/src/main/resources/l10n/JabRef_ja.properties index 69131c0c421..f3fbbf692bd 100644 --- a/src/main/resources/l10n/JabRef_ja.properties +++ b/src/main/resources/l10n/JabRef_ja.properties @@ -2289,3 +2289,11 @@ Main_file_directory_not_set\!= This_operation_requires_exactly_one_item_to_be_selected.= Importing_in_%0_format= + +Female_name= +Female_names= +Male_name= +Male_names= +Mixed_names= +Neuter_name= +Neuter_names= diff --git a/src/main/resources/l10n/JabRef_nl.properties b/src/main/resources/l10n/JabRef_nl.properties index dd00d943763..1dd07a256c1 100644 --- a/src/main/resources/l10n/JabRef_nl.properties +++ b/src/main/resources/l10n/JabRef_nl.properties @@ -2321,3 +2321,11 @@ Main_file_directory_not_set\!= This_operation_requires_exactly_one_item_to_be_selected.= Importing_in_%0_format= + +Female_name= +Female_names= +Male_name= +Male_names= +Mixed_names= +Neuter_name= +Neuter_names= diff --git a/src/main/resources/l10n/JabRef_no.properties b/src/main/resources/l10n/JabRef_no.properties index 7c18902b1e3..1c54e73a712 100644 --- a/src/main/resources/l10n/JabRef_no.properties +++ b/src/main/resources/l10n/JabRef_no.properties @@ -2718,3 +2718,11 @@ Main_file_directory_not_set\!= This_operation_requires_exactly_one_item_to_be_selected.= Importing_in_%0_format= + +Female_name= +Female_names= +Male_name= +Male_names= +Mixed_names= +Neuter_name= +Neuter_names= diff --git a/src/main/resources/l10n/JabRef_pt_BR.properties b/src/main/resources/l10n/JabRef_pt_BR.properties index fafb8ac333c..7b07aa0e151 100644 --- a/src/main/resources/l10n/JabRef_pt_BR.properties +++ b/src/main/resources/l10n/JabRef_pt_BR.properties @@ -1539,3 +1539,11 @@ Main_file_directory_not_set\!= This_operation_requires_exactly_one_item_to_be_selected.= Importing_in_%0_format= + +Female_name= +Female_names= +Male_name= +Male_names= +Mixed_names= +Neuter_name= +Neuter_names= diff --git a/src/main/resources/l10n/JabRef_ru.properties b/src/main/resources/l10n/JabRef_ru.properties index 5fa39fc34bd..a63eae6ccfc 100644 --- a/src/main/resources/l10n/JabRef_ru.properties +++ b/src/main/resources/l10n/JabRef_ru.properties @@ -2289,3 +2289,11 @@ Main_file_directory_not_set\!= This_operation_requires_exactly_one_item_to_be_selected.= Importing_in_%0_format= + +Female_name= +Female_names= +Male_name= +Male_names= +Mixed_names= +Neuter_name= +Neuter_names= diff --git a/src/main/resources/l10n/JabRef_sv.properties b/src/main/resources/l10n/JabRef_sv.properties index ee245a2356f..1c7a1be3880 100644 --- a/src/main/resources/l10n/JabRef_sv.properties +++ b/src/main/resources/l10n/JabRef_sv.properties @@ -1481,3 +1481,11 @@ Normalize_month_to_BibTeX_standard_abbreviation.= Move_linked_files_to_default_file_directory_%0= Importing_in_%0_format= + +Female_name= +Female_names= +Male_name= +Male_names= +Mixed_names= +Neuter_name= +Neuter_names= diff --git a/src/main/resources/l10n/JabRef_tr.properties b/src/main/resources/l10n/JabRef_tr.properties index 8948b307e13..70171e80b5c 100644 --- a/src/main/resources/l10n/JabRef_tr.properties +++ b/src/main/resources/l10n/JabRef_tr.properties @@ -1564,3 +1564,11 @@ Main_file_directory_not_set\!= This_operation_requires_exactly_one_item_to_be_selected.= Importing_in_%0_format= + +Female_name= +Female_names= +Male_name= +Male_names= +Mixed_names= +Neuter_name= +Neuter_names= diff --git a/src/main/resources/l10n/JabRef_vi.properties b/src/main/resources/l10n/JabRef_vi.properties index fc028e63c14..ced16f900e4 100644 --- a/src/main/resources/l10n/JabRef_vi.properties +++ b/src/main/resources/l10n/JabRef_vi.properties @@ -2315,3 +2315,11 @@ Main_file_directory_not_set\!= This_operation_requires_exactly_one_item_to_be_selected.= Importing_in_%0_format= + +Female_name= +Female_names= +Male_name= +Male_names= +Mixed_names= +Neuter_name= +Neuter_names= diff --git a/src/main/resources/l10n/JabRef_zh.properties b/src/main/resources/l10n/JabRef_zh.properties index e1e5b3ae178..368c46dd9ff 100644 --- a/src/main/resources/l10n/JabRef_zh.properties +++ b/src/main/resources/l10n/JabRef_zh.properties @@ -1551,3 +1551,12 @@ Main_file_directory_not_set\!=未设置主文件目录\! This_operation_requires_exactly_one_item_to_be_selected.=这个操作仅限对选中的一条记录进行。 Importing_in_%0_format=正在以_%0_格式导入 +Clears_the_field_completely.= + +Female_name= +Female_names= +Male_name= +Male_names= +Mixed_names= +Neuter_name= +Neuter_names= diff --git a/src/test/java/net/sf/jabref/logic/integrity/IntegrityCheckTest.java b/src/test/java/net/sf/jabref/logic/integrity/IntegrityCheckTest.java index 666eeedcf9d..c222b7d141f 100644 --- a/src/test/java/net/sf/jabref/logic/integrity/IntegrityCheckTest.java +++ b/src/test/java/net/sf/jabref/logic/integrity/IntegrityCheckTest.java @@ -5,9 +5,11 @@ import java.util.*; import net.sf.jabref.*; +import net.sf.jabref.bibtex.InternalBibtexFields; import net.sf.jabref.model.database.BibDatabase; import net.sf.jabref.model.database.BibDatabaseMode; import net.sf.jabref.model.entry.BibEntry; + import org.junit.BeforeClass; import org.junit.Rule; import org.junit.Test; @@ -57,7 +59,7 @@ public void testBracketChecks() { @Test public void testAuthorNameChecks() { - for (String field : Arrays.asList("author", "editor")) { + for (String field : InternalBibtexFields.BIBLATEX_PERSON_NAME_FIELDS) { assertCorrect(createContext(field, "")); assertCorrect(createContext(field, "Knuth")); assertCorrect(createContext(field, " Knuth, Donald E. ")); diff --git a/src/test/java/net/sf/jabref/model/entry/IEEETranEntryTypesTest.java b/src/test/java/net/sf/jabref/model/entry/IEEETranEntryTypesTest.java index 318c106a880..5c68584835b 100644 --- a/src/test/java/net/sf/jabref/model/entry/IEEETranEntryTypesTest.java +++ b/src/test/java/net/sf/jabref/model/entry/IEEETranEntryTypesTest.java @@ -3,7 +3,8 @@ import org.junit.Assert; import org.junit.Test; -import java.util.Arrays; +import net.sf.jabref.bibtex.InternalBibtexFields; + import java.util.List; public class IEEETranEntryTypesTest { @@ -11,7 +12,7 @@ public class IEEETranEntryTypesTest { @Test public void ctlTypeContainsYesNoFields() { List ctlFields = IEEETranEntryTypes.IEEETRANBSTCTL.getAllFields(); - List ynFields = Arrays.asList(IEEETranEntryTypes.IEEETRANBSTCTL_YES_NO_FIELDS); + List ynFields = InternalBibtexFields.IEEETRANBSTCTL_YES_NO_FIELDS; Assert.assertTrue(ctlFields.containsAll(ynFields)); } @@ -19,7 +20,7 @@ public void ctlTypeContainsYesNoFields() { @Test public void ctlTypeContainsNumericFields() { List ctlFields = IEEETranEntryTypes.IEEETRANBSTCTL.getAllFields(); - List numericFields = Arrays.asList(IEEETranEntryTypes.IEEETRANBSTCTL_NUMERIC_FIELDS); + List numericFields = InternalBibtexFields.IEEETRANBSTCTL_NUMERIC_FIELDS; Assert.assertTrue(ctlFields.containsAll(numericFields)); } From 3d9149b2a17f1041743c5741db2f8c550a77abd5 Mon Sep 17 00:00:00 2001 From: Oscar Gustafsson Date: Fri, 8 Apr 2016 16:25:32 +0200 Subject: [PATCH 3/3] Rebased --- .../bibtex/BibtexSingleFieldProperties.java | 19 ------------------- .../gui/plaintextimport/TextInputDialog.java | 5 ++--- src/main/resources/l10n/JabRef_zh.properties | 1 - 3 files changed, 2 insertions(+), 23 deletions(-) delete mode 100644 src/main/java/net/sf/jabref/bibtex/BibtexSingleFieldProperties.java diff --git a/src/main/java/net/sf/jabref/bibtex/BibtexSingleFieldProperties.java b/src/main/java/net/sf/jabref/bibtex/BibtexSingleFieldProperties.java deleted file mode 100644 index f4ee83d8b0d..00000000000 --- a/src/main/java/net/sf/jabref/bibtex/BibtexSingleFieldProperties.java +++ /dev/null @@ -1,19 +0,0 @@ -package net.sf.jabref.bibtex; - -import java.util.EnumSet; - -public enum BibtexSingleFieldProperties { - YES_NO, - URL, - DATE, - JOURNAL_NAME, - EXTERNAL, - DOI, - OWNER, - MONTH, - FILE_EDITOR, - NUMERIC, - PERSON_NAMES; - - public static final EnumSet ALL_OPTS = EnumSet.allOf(BibtexSingleFieldProperties.class); -} diff --git a/src/main/java/net/sf/jabref/gui/plaintextimport/TextInputDialog.java b/src/main/java/net/sf/jabref/gui/plaintextimport/TextInputDialog.java index 63f40a59f8f..f80865a334d 100644 --- a/src/main/java/net/sf/jabref/gui/plaintextimport/TextInputDialog.java +++ b/src/main/java/net/sf/jabref/gui/plaintextimport/TextInputDialog.java @@ -56,7 +56,7 @@ import net.sf.jabref.Globals; import net.sf.jabref.JabRefPreferences; import net.sf.jabref.bibtex.BibEntryWriter; -import net.sf.jabref.bibtex.BibtexSingleFieldProperties; +import net.sf.jabref.bibtex.FieldProperties; import net.sf.jabref.bibtex.InternalBibtexFields; import net.sf.jabref.model.EntryTypes; import net.sf.jabref.exporter.LatexFieldFormatter; @@ -475,8 +475,7 @@ private void insertTextForTag(boolean overrideField) { entry.setField(fieldName, txt); } else { // insert a new name with an additional "and" - if (InternalBibtexFields.getFieldExtras(fieldName) - .contains(BibtexSingleFieldProperties.PERSON_NAMES)) { + if (InternalBibtexFields.getFieldExtras(fieldName).contains(FieldProperties.PERSON_NAMES)) { entry.setField(fieldName, old + " and " + txt); } else if ("keywords".equals(fieldName)) { // Add keyword diff --git a/src/main/resources/l10n/JabRef_zh.properties b/src/main/resources/l10n/JabRef_zh.properties index 368c46dd9ff..9ef436c3274 100644 --- a/src/main/resources/l10n/JabRef_zh.properties +++ b/src/main/resources/l10n/JabRef_zh.properties @@ -1551,7 +1551,6 @@ Main_file_directory_not_set\!=未设置主文件目录\! This_operation_requires_exactly_one_item_to_be_selected.=这个操作仅限对选中的一条记录进行。 Importing_in_%0_format=正在以_%0_格式导入 -Clears_the_field_completely.= Female_name= Female_names=