diff --git a/.travis.yml b/.travis.yml
index b9d41f46860..81298472951 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -38,7 +38,7 @@ before_script:
- mysql -u root -e 'create database jabref'
script:
- # --scan enables the Gradle build scan, which can be used to investiage the time each action consumes
+ # --scan enables the Gradle build scan, which can be used to investigate the time each action consumes
# For more information see https://gradle.com/scans/get-started
- if [ "$TEST_SUITE" != "guiTest" ] && [ "$TEST_SUITE" != "checkstyle" ]; then ./gradlew $TEST_SUITE $OPTIONS --scan; fi
- if [ "$TEST_SUITE" == "checkstyle" ]; then ./gradlew checkstyleMain checkstyleTest checkstyleJmh; fi
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 0e9d4c58861..27356c72279 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,4 @@
+
# Changelog
All notable changes to this project will be documented in this file.
This project **does not** adhere to [Semantic Versioning](http://semver.org/).
@@ -22,11 +23,15 @@ We refer to [GitHub issues](https://github.com/JabRef/jabref/issues) by using `#
- Crossreferenced entries are now used when a BibTex key is generated for an entry with empty fields. [#2811](https://github.com/JabRef/jabref/issues/2811)
- We now set the WM_CLASS of the UI to org-jabref-JabRefMain to allow certain Un*x window managers to properly identify its windows
- We changed the default paths for the OpenOffice/LibreOffice binaries to the default path for LibreOffice
+- We moved the groups field from the "Other fields" tab to "General" (you may have to reset your editor preferences under Options > Set up general fields)
- We no longer create a new entry editor when selecting a new entry to increase performance. [#3187](https://github.com/JabRef/jabref/pull/3187)
- We added the possibility to copy linked files from entries to a single output folder [#2539](https://github.com/JabRef/jabref/pull/2593)
- We increased performance and decreased the memory footprint of the entry editor drastically. [#3331](https://github.com/JabRef/jabref/pull/3331)
- Late initialization of the context menus in the entry editor. This improves performance and memory footprint further [#3340](https://github.com/JabRef/jabref/pull/3340)
+- Integrity check "Abbreviation Detection" detects abbreviated names for journals and booktitles based on the internal list instead of only looking for "." signs. Fixes [#3144](https://github.com/JabRef/jabref/issues/3144).
- We added a dialog to show that JabRef is working on checking integrity. [#3358](https://github.com/JabRef/jabref/issues/3358)
+- We added an option to mass append to fields via the Quality -> set/clear/append/rename fields dialog. [#2721](https://github.com/JabRef/jabref/issues/2721)
+- We added a check on startup to ensure JabRef is run with an adequate Java version. [3310](https://github.com/JabRef/jabref/issues/3310)
### Fixed
- We fixed the translation of \textendash in the entry preview [#3307](https://github.com/JabRef/jabref/issues/3307)
@@ -35,12 +40,14 @@ We refer to [GitHub issues](https://github.com/JabRef/jabref/issues) by using `#
- We improved the way metadata is updated in remote databases. [#3235](https://github.com/JabRef/jabref/issues/3235)
- We improved font rendering of the Entry Editor for Linux based systems [#3295](https://github.com/JabRef/jabref/issues/3295)
- We fixed an issue where JabRef would freeze when trying to replace the original entry after a merge with new information from identifiers like DOI/ISBN etc. [3294](https://github.com/JabRef/jabref/issues/3294)
+ - We no longer allow to add a field multiple times in customized entry types and thereby fix an issue in the entry editor that resulted from having a field multiple times. [#3046](https://github.com/JabRef/jabref/issues/3046)
- We fixed an issue where JabRef would not show the translated content at some points, although there existed a translation
- We fixed an issue where editing in the source tab would override content of other entries [#3352](https://github.com/JabRef/jabref/issues/3352#issue-268580818)
- We fixed an issue where file links created under windows could not be opened on Linux/OSX [#3311](https://github.com/JabRef/jabref/issues/3311)
- We fixed several issues with the automatic linking of files in the entry editor where files were not found or not correctly saved in the bibtex source [#3346](https://github.com/JabRef/jabref/issues/3346)
- We fixed an issue where fetching entries from crossref that had no titles caused an error [#3376](https://github.com/JabRef/jabref/issues/3376)
- We fixed an issue where the same Java Look and Feel would be listed more than once in the Preferences. [#3391](https://github.com/JabRef/jabref/issues/3391)
+ - We fixed an issue where errors in citation styles triggered an exception when opening the preferences dialog [#3389](https://github.com/JabRef/jabref/issues/3389)
### Removed
@@ -94,7 +101,7 @@ We refer to [GitHub issues](https://github.com/JabRef/jabref/issues) by using `#
### Changed
-- We add a textArea to see versionInfo in the About JabRef Dialog.[#2942](https://github.com/JabRef/jabref/issues/2942)
+- We added a textArea to see versionInfo in the About JabRef Dialog. [#2942](https://github.com/JabRef/jabref/issues/2942)
- We turned the validation feature in the entry editor off by default, because of a bug in the library we have been using [#3145](https://github.com/JabRef/jabref/issues/3145)
- Added 'Filter All' and 'Filter None' buttons with corresponding functionality to Quality Check tool.
- We increased the size of the keywords and file text areas in the entry editor
@@ -299,717 +306,15 @@ We refer to [GitHub issues](https://github.com/JabRef/jabref/issues) by using `#
- The group selection is no longer lost when switching tabs [#1104](https://github.com/JabRef/jabref/issues/1104)
-## [3.8.2] – 2017-01-29
-
-### Changed
-- Added the option to update bibliographic information from DOI to the sidebar of the entryeditor. Implements [#2432](https://github.com/JabRef/jabref/issues/2432).
-- The default shortcut for "Cleanup entries" is now Alt + F8 since F8 alone did not work.
- Please [reset your key bindings](http://help.jabref.org/en/CustomKeyBindings) to get Alt + F8 as default.
- Fixes [#2251](https://github.com/JabRef/jabref/issues/2251).
-
-### Fixed
-- The formatter for normalizing pages now also can treat ACM pages such as `2:1--2:33`.
-- Backslashes in content selectors are now correctly escaped. Fixes [#2426](https://github.com/JabRef/jabref/issues/2426).
-- Non-ISO timestamp settings prevented the opening of the entry editor. Fixes [#2447](https://github.com/JabRef/jabref/issues/2447).
-- When pressing Ctrl + F and the searchbar is already focused, the text will be selected.
-- LaTeX symbols are now displayed as Unicode for the author column in the main table. `'n` and `\'{n}` are parsed correctly. Fixes [#2458](https://github.com/JabRef/jabref/issues/2458).
-- If one deleted the current query it was not saved (every basepanel can have its own query). Fixes [#2468](https://github.com/JabRef/jabref/issues/2468).
-- The [ACM fetcher](https://help.jabref.org/en/ACMPortal) does no longer add HTML code to the bib-file. Fixes [#2472](https://github.com/JabRef/jabref/issues/2472).
-- When [finding unlinked files](https://help.jabref.org/en/FindUnlinkedFiles), JabRef does not freeze any more. Fixes [#2309]()https://github.com/JabRef/jabref/issues/2309).
-- Collapse and expand all buttons in the group assignment dialog no longer lead to a crash of JabRef.
-- The aux export command line function does no longer add duplicates of references that were resolved via `crossref`. Fixes [#2475](https://github.com/JabRef/jabref/issues/2475).
-- When the database is changed externally, JabRef is no longer prevented from an orderly shutdown. Fixes [#2486](https://github.com/JabRef/jabref/issues/2486).
-- Parsing of damaged metadata is now more robust and reports a more detailed error message. Fixes [#2477](https://github.com/JabRef/jabref/issues/2477).
-- Dynamic groups with regular expression can be edited again. Fixes [#2481](https://github.com/JabRef/jabref/issues/2481).
-
-
-## [3.8.1] – 2016-12-24
-
-### Changed
-- When [adding a new entry](https://help.jabref.org/en/BaseFrame#adding-a-new-entry), one can select "title" to create a full BibTeX entry based on a title.
-- When [editing](https://help.jabref.org/en/EntryEditor) an article, the tab "Optional fields" now shows "ISSN".
-- When editing a book, the tab "Optional fields" now shows "ISBN".
-- When using "Copy citation (HTML)" and pasting into a text editor, plain text is always pasted.
-- When using the "Download from URL" functionality, one is not limited to http(s) URLs, but can, for instance, enter ftp URLs.
-- When using the "Look up full text documents" functionality, JabRef warns more explicitly about multiple requests.
-- The entry received from DOI does no longer contain the DOI as URL. Implements [#2417](https://github.com/JabRef/jabref/issues/2417).
-- We use following parameters for the JVM on Windows and OSX: `-XX:+UseG1GC -XX:+UseStringDeduplication -XX:StringTableSize=1000003`.
-
-### Fixed
-- Clicking on "Get Fulltext" button sets links correctly for the entry being edited. Fixes [#2391](https://github.com/JabRef/jabref/issues/2391).
-- The [integrity check](https://help.jabref.org/en/CheckIntegrity) now determines the set of biblatex-only fields differently. Fixes [#2390](https://github.com/JabRef/jabref/issues/2390).
-- The integrity check filter works again. Fixes [#2406](https://github.com/JabRef/jabref/issues/2406).
-- The [ArXiv fetcher](http://help.jabref.org/en/arXiv) also accepts identifiers that include the "arXiv:" prefix. Fixes [#2427](https://github.com/JabRef/jabref/issues/2427).
-- We fixed an issue where groups containing brackets were not working properly. Fixes [#2394](https://github.com/JabRef/jabref/issues/2394).
-- Closing of subtrees in the groups panel using "close subtree" is working again. Fixes [#2319](https://github.com/JabRef/jabref/issues/2319).
-- We fixed issues with the [timestamp](http://help.jabref.org/en/TimeStamp) field. However, clearing with the clear button is not possible if timestamp format does not match the current settings. Fixes [#2403](https://github.com/JabRef/jabref/issues/2403).
-- The proxy settings are now also applied to HTTPS connections. Fixes [#2249](https://github.com/JabRef/jabref/issues/2249).
-
-
-## [3.8] – 2016-12-16
-
-### Changed
-- Bibliographic information from web resources can now be used to complete existing entries.
- This functionality can be accessed via a new button in the entry editor.
-- URLs can now be passed as arguments to the `-import` and `-importToOpen` command line options.
- The referenced file is downloaded and then imported as usual.
-- We added integrity check to detect all bibtex keys which deviate from their generation pattern [#2206](https://github.com/JabRef/jabref/issues/2206)
-- We added an integrity check that detects invalid DOIs [#1445](https://github.com/JabRef/jabref/issues/1445)
-- We enhanced the integrity checks testing for biblatex-only fields to be aware of more fields (e.g., `location`).
-- ISBNs not available at [ebook.de](https://www.ebook.de) are now resolved using . [#684](https://github.com/JabRef/jabref/issues/684)
-- When using the ISBN fetcher, the names are now correctly rendered in BibTeX. [#2343](https://github.com/JabRef/jabref/issues/2343)
-- We display both the field name `journaltitle` and `journal` in biblatex mode as `journaltitle` only was causing headaches. [#2209](https://github.com/JabRef/jabref/issues/2209)
-- We changed the order of the cleanup operations so that the generated file name corresponds to the cleaned-up fields. [#1441](https://github.com/JabRef/jabref/issues/1441)
-- Files can now be moved to subfolders named by a custom format pattern, e.g., based on `entrytype`.
- The pattern can be specified in the settings like the filename pattern. [#1092](https://github.com/JabRef/jabref/issues/1092)
-- [#2375](https://github.com/JabRef/jabref/issues/2375) 'LaTeXCleanup' action does now escape % signs inside BibTeX fields
-- Add the possibility to copy citations of multiple entries to the clipboard
-- Custom EntryTypes are now stored independently for BibTeX and biblatex mode.
- - Upon the first start of JabRef 3.8 old entry type customizations will be converted to custom types for the set default database mode (BibTeX if not changed to biblatex)
-- Upon opening a file with customized entry types it is now possible to choose which customizations should be stored in local preferences.
-- The default emacs executable name on linux changed from `gnuclient` to `emacsclient`.
- [feature-request 433](https://sourceforge.net/p/jabref/feature-requests/433/)
-- Replaces manual thread management with cached thread pool
-- Windows and OSX binaries are now signed with a certificate.
-
-### Fixed
-- We fixed various problems with customized entry types:
- - Resetting the preferences now also resets custom entry types. [#2261](https://github.com/JabRef/jabref/issues/2261)
- - Importing preferences does no longer duplicate custom entry types. [#772](https://github.com/JabRef/jabref/issues/772)
- - Potenial problems upon resetting to defaults should be fixed. [#772](https://github.com/JabRef/jabref/issues/772)
- - Customized standard types (such as `@article`) are no longer listed as "custom" type in "New Entry" dialog.
- - Applying changes in the "Custom Entry Types" dialog is now faster. [#2318](https://github.com/JabRef/jabref/issues/2318)
-- We fixed a few groups related issues:
- - "Remove entries from group" no longer removes entries from groups with similar names. [#2334](https://github.com/JabRef/jabref/issues/2334)
- - If an entry's group field contains 'a b' it is no longer considered a member the groups 'a', 'b', and 'a b'. [1873](https://github.com/JabRef/jabref/issues/1873)
- - Reading and writing now works for groups that contain special escaped characters in their names. [1681](https://github.com/JabRef/jabref/issues/1681)
-- Fixed [#2221](https://github.com/JabRef/jabref/issues/2221): Customizable field content selectors due to popular demand. Content selectors now avoid duplicate words.
-- We fixed an issue which prevented JabRef from closing using the "Quit" menu command. [#2336](https://github.com/JabRef/jabref/issues/2336)
-- We fixed an issue where the file permissions of the .bib-file were changed upon saving [#2279](https://github.com/JabRef/jabref/issues/2279).
-- We fixed an issue which prevented that a database was saved successfully if JabRef failed to generate new BibTeX-keys [#2285](https://github.com/JabRef/jabref/issues/2285).
-- Update check now correctly notifies about new release if development version is used. [#2298](https://github.com/JabRef/jabref/issues/2298)
-- Fixed [#2311](https://github.com/JabRef/jabref/issues/2311): The DBLP fetcher has been rewritten and is working again.
-- Fixed [#2273](https://github.com/JabRef/jabref/issues/2273): Export via commandline in no-gui mode is now working again.
-- We fixed an issue when JabRef restores its session and a shared database was used: The error message "No suitable driver found" will not appear.
-- We fixed an issue which caused a metadata loss on reconnection to shared database. [#2219](https://github.com/JabRef/jabref/issues/2219)
-- We fixed an issue which caused an internal error when leaving the file path field empty and connecting to a shared database.
-- We fixed an issue where the biblatex Cleanup did not move the contents of the fields `year` and `month` to the field `date`. [#2335](https://github.com/JabRef/jabref/issues/2335)
-- Fixed [#2378](https://github.com/JabRef/jabref/issues/2378): Saving of the Backup-Option in the Preferences does now work.
-- We fixed an issue which prevented the preference dialog to open on systems with Java 9.
-
-
-## [3.7] – 2016-11-14
-
-### Changed
-- Implementation of eventbased autosave and backup functionality and file synchronization for shared DBs. Related to [#344](https://github.com/JabRef/jabref/issues/344)
-- Source tab in the entry editor displays "biblatex Source" when using biblatex mode
-- [koppor#171](https://github.com/koppor/jabref/issues/171): Add Shortcuts to context menu
-- Add session restoring functionality for shared database. Related to [#1703](https://github.com/JabRef/jabref/issues/1703)
-- Implementation of LiveUpdate for PostgreSQL & Oracle systems. Related to [#970](https://github.com/JabRef/jabref/issues/970).
-- [koppor#31](https://github.com/koppor/jabref/issues/31): Number column in the main table is always Left aligned
-- Added support for [1.0.1 CitationStyles](http://citationstyles.org/)
-- You can set and cycle between different preview styles (including CitationStyles)
-- Added fetcher for [MathSciNet](http://www.ams.org/mathscinet), [zbMATH](https://www.zbmath.org/) and [Astrophysics Data System](http://www.adsabs.harvard.edu/)
-- Improved search:
- - Search queries consisting of a normal query and a field-based query are now supported (for example, `JabRef AND author == you`)
- - Implemented [#825](https://github.com/JabRef/jabref/issues/825): Search Bar across all bib files instead each having its own
- - Implemented [#573](https://github.com/JabRef/jabref/issues/573): Add key shortcut for global search (Ctrl + Shift + F, if the searchfield is empty it will be focused instead)
- - The search result Window will now show which entry belongs to which bib file
- - The search result Window will now remember its location
- - The search result Window won't stay on top anymore if the main Window is focused and will be present in the taskbar
- - The user can jump from the searchbar to the maintable with Ctrl + Enter
- - Implemented [#573 (comment)](https://github.com/JabRef/jabref/issues/573#issuecomment-232284156): Added shortcut: closing the search result window with Ctrl + W
-- Added integrity check for fields with BibTeX keys, e.g., `crossref` and `related`, to check that the key exists
-- Fields linking to other entries (e.g., `crossref` and `related`) have now specialized editors in the entry editor. Check the tabs "Other fields" and "General".
-- [#1496](https://github.com/JabRef/jabref/issues/1496) Keep track of which entry a downloaded file belongs to
-- Made it possible to download multiple entries in one action
-- [#1506](https://github.com/JabRef/jabref/issues/1506) It is possible to apply two new key modifier `title_case` for Title Case, `capitalize` for Capitalized first character of each word (difference is that title case will leave prepositions etc in lower case), and `sentence_case` for normal sentence case (first word capitalized). In addition `lower_case` and `upper_case` can be used instead of `lower` and `upper`.
-- Added two new pseudo-fields for search: `anykeyword` to search for a specific keyword and `anyfield` to search in all fields (useful in combination with search in specific fields)
-- [#1813](https://github.com/JabRef/jabref/issues/1813) Import/Export preferences dialog default directory set to working directory
-- [#1897](https://github.com/JabRef/jabref/issues/1897) Implemented integrity check for `year` field: Last four nonpunctuation characters should be numerals
-- Address in MS-Office 2007 xml format is now imported as `location`
-- [#1912](https://github.com/JabRef/jabref/issues/1912) Implemented integrity check for `edition` field: Should have the first letter capitalized (BibTeX), Should contain an integer or a literal (biblatex)
-- The dialog for choosing new entries additionally supports ID-based entry generation. For instance, when searching for a DOI or ISBN, you have to press Ctrl + N instead of using the web search (Alt + 4).
-- `number` field is now exported as `number` field in MS-Office 2007 xml format, if no `issue` field is present and the entry type is not `patent`
-- `note` field is now exported as `comments` field in MS-Office 2007 xml format
-- `comments` field in MS-Office 2007 xml format is now imported as `note` field
-- [#463](https://github.com/JabRef/jabref/issues/463): Disable menu-item and toolbar-buttons while no database is open
-- Implemented integrity check for `note` and `howpublished` field: Should have the first letter capitalized (BibTeX)
-- Pos1 / Home now select the first/last entry in the main table and the search result frame.
-- Up / Down / Tab / Shift + Tab in the search result frame have now the same functionality as in the main table.
-- Importer for MODS format added
-- [#2012](https://github.com/JabRef/jabref/issues/2012) Implemented integrity check for `month` field: Should be an integer or normalized (biblatex), Should be normalized (BibTeX)
-- [#1779](https://github.com/JabRef/jabref/issues/1779) Implemented integrity check for `bibtexkey` field: Empty BibTeX key
-- Prohibit more than one connections to the same shared database.
-- Implemented integrity check for `journaltitle` field: biblatex field only (BibTeX)
-- [#463](https://github.com/JabRef/jabref/issues/463): Disable certain menu items, toolbar buttons and context menu items while multiple entries are selected
-- [#490](https://github.com/JabRef/jabref/issues/490) Added right click menu to main table and entry editor to allow copying doi url
-- [#549](https://github.com/JabRef/jabref/issues/549) Added new shortcut to copy the BibTeX key as a hyperlink to its url to the clipboard
-- Complete vietnam language translation in menu
-- Generalize German translation of database into "Datenbank"
-- Improve language quality of the German translation of shared database
-- Change "Recent files" to "Recent databases" to keep the file menu consistent
-- Customized importer files need to be slightly changed since the class `ImportFormat` was renamed to `Importer`
-- [koppor/#97] (https://github.com/koppor/jabref/issues/97): When importing preferences, the explorer will start where the preferences are last exported
-- [koppor#5](https://github.com/koppor/jabref/issues/5) When entries are found while dropping a pdf with xmp meta data the found entries will be displayed in the import dialog
-- [koppor#61](https://github.com/koppor/jabref/issues/61) Display gray background text in "Author" and "Editor" field to assist newcomers
-- Updated Vietnamese translation
-- Added greyed-out suggestion for `year`/`date`/`url` fields
-- [#1908](https://github.com/JabRef/jabref/issues/1908) Add a shortcut for check integrity Ctrl + F8
-- When creatig an entry based on an ISBN, but the ISBN is not available on ebook.de, the error message is now more clear.
-
-### Fixed
-- Fixed problem where closing brackets could not be used as texts in layout arguments
-- Fixed NullPointerException when opening search result window for an untitled database
-- Fixed selecting an entry out of multiple duplicates
-- Entries in the SearchResultPanel will be shown correctly (Latex to Unicode)
-- Suggestions in the autocomplete will be shown correctly (Latex to Unicode)
-- Selecting an entry in the search result Window will now select the correct entry in the bib file
-- Suggestions in the autocomplete (search) are now in Unicode
-- Entries in the SearchResultDialog are now converted to Unicode
-- Fixed NullPointerException when opening search result window for an untitled database
-- Fixed entry table traversal with Tab (no column traversal thus no double jump)
-- Fixed: When searching the first match will be selected if the current selection is no match
-- Fixed [koppor#160](https://github.com/koppor/jabref/issues/160): Tooltips now working in the main table
-- Fixed [koppor/#128](https://github.com/koppor/jabref/issues/128): Sensible default settings for "Enable save actions" and "Cleanup"
-- Fixed loop when pulling changes (shared database) when current selected field has changed
-- Fixed field `key` field is not exported to MS-Office 2008 xml format
-- Fixed field `location` containing only city is not exported correctly to MS-Office 2007 xml format
-- Fixed close action of entry editor not working after parsing error corrected
-- Fixed RTFChars would only use "?" for characters with unicode over the value of 127, now it uses the base character (é -> e instead of ?)
-- Fixed download files failed silently when an invalid directory is selected
-- Fixed InvalidBackgroundColor flickering with Ctrl + S and File > Save database
-- Fixed file menu displays wrong hotkey in the German translation
-- Fixed [#617](https://github.com/JabRef/jabref/issues/617): `Enter` in global search opens the selected entry & `Enter` in search dialog window opens the selected entry
-- Fixed [#1181](https://github.com/JabRef/jabref/issues/1181) and [#1504](https://github.com/JabRef/jabref/issues/1504): Improved "Normalize to BibTeX name format": Support separated names with commas and colons. Considered name affixes such as "Jr".
-- Fixed [#1235](https://github.com/JabRef/jabref/issues/1235): Modified Key bindings do not work correctly
-- Fixed [#1542](https://github.com/JabRef/jabref/issues/1542): Improved error messages when using fetcher
-- Fixed [#1663](https://github.com/JabRef/jabref/issues/1663): Better multi-monitor support
-- Fixed [#1757](https://github.com/JabRef/jabref/issues/1757): Crash after saving illegal argument in entry editor
-- Fixed [#1808](https://github.com/JabRef/jabref/issues/1808): Font preference dialog now keeps changes
-- Fixed [#1882](https://github.com/JabRef/jabref/issues/1882): Crash after saving illegal bibtexkey in entry editor
-- Fixed [#1937](https://github.com/JabRef/jabref/issues/1937): If no help page for the current chosen language exists, the english help page will be shown
-- Fixed [#1949](https://github.com/JabRef/jabref/issues/1949): Error message directs to the wrong preference tab
-- Fixed [#1958](https://github.com/JabRef/jabref/issues/1958): Verbatim fields are no longer checked for HTML encoded characters by integrity checks
-- Fixed [#1993](https://github.com/JabRef/jabref/issues/1993): Various optimizations regarding search performance
-- Fixed [#2021](https://github.com/JabRef/jabref/issues/2021): All filetypes can be selected on MacOS again
-- Fixed [#2054](https://github.com/JabRef/jabref/issues/2054): Ignoring a new version now works as expected
-- Fixed [#2060](https://github.com/JabRef/jabref/issues/2060): Medline fetcher now imports data in UTF-8 encoding
-- Fixed [#2064](https://github.com/JabRef/jabref/issues/2064): Not all `other fields` are shown on entry change of same type
-- Fixed [#2089](https://github.com/JabRef/jabref/issues/2089): Fixed faulty cite key generation
-- Fixed [#2090](https://github.com/JabRef/jabref/issues/#2090): If special fields were not selected, two menu item separator were shown
-- Fixed [#2092](https://github.com/JabRef/jabref/issues/2092): "None"-button in date picker clears the date field
-- Fixed [#2104](https://github.com/JabRef/jabref/issues/#2104): Crash after saving BibTeX source with parsing error
-- Fixed [#2109](https://github.com/JabRef/jabref/issues/#2109): Ctrl + S doesn't trigger parsing error message
-- Fixed [#2200](https://github.com/JabRef/jabref/issues/#2200): Sorting now uses the same unicode representation that is also used for showing the content in the maintable
-- Fixed [#2201](https://github.com/JabRef/jabref/issues/#2201) and [#1825](https://github.com/JabRef/jabref/issues/#1825): Status of the Group panel is saved and reused for next startup of JabRef
-- Fixed [#2228](https://github.com/JabRef/jabref/issues/2228): Fixed Medline fetcher no longer working. The fetcher now uses `https` for fetching
-
-### Removed
-- Removed 2nd preview style
-- The non-supported feature of being able to define file directories for any extension is removed. Still, it should work for older databases using the legacy `ps` and `pdf` fields, although we strongly encourage using the `file` field.
-- Automatic migration for the `evastar_pdf` field is removed.
-- We removed the customizable "content selectors" since they are replaced by the auto-completion feature
-- Removed optional fields from `other fields` (BibTeX), Removed deprecated fields from `other fields` (biblatex)
-
-
-## [3.6] – 2016-08-26
-
-### Changed
-- [#462](https://github.com/JabRef/jabref/issues/462) Extend the OpenConsoleFeature by offering a selection between default terminal emulator and configurable command execution.
-- [#970](https://github.com/JabRef/jabref/issues/970): Implementation of shared database support (full system) with event based synchronization for MySQL, PostgreSQL and Oracle database systems.
-- [#1026](https://github.com/JabRef/jabref/issues/1026) JabRef does no longer delete user comments outside of BibTeX entries and strings
-- [#1225](https://github.com/JabRef/jabref/issues/1225): Hotkeys are now consistent
-- [#1249](https://github.com/JabRef/jabref/issues/1249) Date layout formatter added
-- [#1345](https://github.com/JabRef/jabref/issues/1345) Cleanup ISSN
-- [#1516](https://github.com/JabRef/jabref/issues/1516) Selected field names are written in uppercase in the entry editor
-- [#1751](https://github.com/JabRef/jabref/issues/1751) Added tooltip to web search button
-- [#1758](https://github.com/JabRef/jabref/issues/1758) Added a button to open Database Properties dialog help
-- [#1841](https://github.com/JabRef/jabref/issues/1841) The "etal"-string in the Authors layout formatter can now be empty
-- Added EntryTypeFormatter to add camel casing to entry type in layouts, e.g., InProceedings
-- Added print entry preview to the right click menu
-- Added links to JabRef internet resources
-- Added integrity check to avoid non-ASCII characters in BibTeX files
-- Added ISBN integrity checker
-- Added filter to not show selected integrity checks
-- Automatically generated group names are now converted from LaTeX to Unicode
-- Enhance the entry customization dialog to give better visual feedback
-- Externally fetched information can be merged for entries with an ISBN
-- Externally fetched information can be merged for entries with an ArXiv eprint
-- File open dialogs now use default extensions as primary file filter
-- For developers: Moved the bst package into logic. This requires the regeneration of antlr sources, execute: `gradlew generateSource`
-- It is now possible to generate a new BIB database from the citations in an OpenOffice/LibreOffice document
-- It is now possible to add your own lists of protected terms, see Options -> Manage protected terms
-- Improve focus of the maintable after a sidepane gets closed (Before it would focus the toolbar or it would focus the wrong entry)
-- Table row height is adjusted on Windows which is useful for high resolution displays
-- The field name in the layout files for entry type is changed from `bibtextype` to `entrytype`. Please update your existing files as support for `bibtextype` will be removed eventually.
-- The contents of `crossref` and `related` will be automatically updated if a linked entry changes key
-- The information shown in the main table now resolves crossrefs and strings and it can be shown which fields are resolved in this way (Preferences -> Appearance -> Color codes for resolved fields)
-- The formatting of the main table is based on the actual field shown when using e.g. `title/author`
-- The arXiv fetcher now also supports free-text search queries
-- Undo/redo are enabled/disabled and show the action in the tool tip
-- Unified dialogs for opening/saving files
-
-### Fixed
-- Fixed [#636](https://github.com/JabRef/jabref/issues/636): DOI in export filters
-- Fixed [#1257](https://github.com/JabRef/jabref/issues/1324): Preferences for the BibTeX key generator set in a version prior to 3.2 are now migrated automatically to the new version
-- Fixed [#1264](https://github.com/JabRef/jabref/issues/1264): S with caron does not render correctly
-- Fixed [#1288](https://github.com/JabRef/jabref/issues/1288): Newly opened bib-file is not focused
-- Fixed [#1321](https://github.com/JabRef/jabref/issues/1321): LaTeX commands in fields not displayed in the list of references
-- Fixed [#1324](https://github.com/JabRef/jabref/issues/1324): Save-Dialog for Lookup fulltext document now opens in the specified working directory
-- Fixed [#1499](https://github.com/JabRef/jabref/issues/1499): {} braces are now treated correctly in in author/editor
-- Fixed [#1527](https://github.com/JabRef/jabref/issues/1527): 'Get BibTeX data from DOI' Removes Marking
-- Fixed [#1519](https://github.com/JabRef/jabref/issues/1519): The word "Seiten" is automatically removed when fetching info from ISBN
-- Fixed [#1531](https://github.com/JabRef/jabref/issues/1531): `\relax` can be used for abbreviation of author names
-- Fixed [#1554](https://github.com/JabRef/jabref/issues/1554): Import dialog is no longer hidden behind main window
-- Fixed [#1592](https://github.com/JabRef/jabref/issues/1592): LibreOffice: wrong numbers in citation labels
-- Fixed [#1609](https://github.com/JabRef/jabref/issues/1324): Adding a file to an entry opened dialog in the parent folder of the working directory
-- Fixed [#1632](https://github.com/JabRef/jabref/issues/1632): User comments (`@Comment`) with or without brackets are now kept
-- Fixed [#1639](https://github.com/JabRef/jabref/issues/1639): Google Scholar fetching works again.
-- Fixed [#1643](https://github.com/JabRef/jabref/issues/1643): Searching with double quotes in a specific field ignores the last character
-- Fixed [#1669](https://github.com/JabRef/jabref/issues/1669): Dialog for manual connection to OpenOffice/LibreOffice works again on Linux
-- Fixed [#1682](https://github.com/JabRef/jabref/issues/1682): An entry now must have a BibTeX key to be cited in OpenOffice/LibreOffice
-- Fixed [#1687](https://github.com/JabRef/jabref/issues/1687): "month" field ascending/descending sorting swapped
-- Fixed [#1716](https://github.com/JabRef/jabref/issues/1716): `@`-Symbols stored in BibTeX fields no longer break the database
-- Fixed [#1750](https://github.com/JabRef/jabref/issues/1750): biblatex `date` field is now correctly exported as `year` in MS-Office 2007 xml format
-- Fixed [#1760](https://github.com/JabRef/jabref/issues/1760): Preview updated correctly when selecting a single entry after selecting multiple entries
-- Fixed [#1771](https://github.com/JabRef/jabref/issues/1771): Show all supported import types as default
-- Fixed [#1804](https://github.com/JabRef/jabref/issues/1804): Integrity check no longer removes URL field by mistake
-- Fixed: LaTeX characters in author names are now converted to Unicode before export in MS-Office 2007 xml format
-- Fixed: `volume`, `journaltitle`, `issue` and `number`(for patents) fields are now exported correctly in MS-Office 2007 xml format
-- Fixed NullPointerException when clicking OK without specifying a field name in set/clear/rename fields
-- Fixed IndexOutOfBoundsException when trying to download a full text document without selecting an entry
-- Fixed NullPointerException when trying to set a special field or mark an entry through the menu without having an open database
-- Fixed NullPointerException when trying to synchronize file field with an entry without BibTeX key
-- Fixed NullPointerException when importing PDFs and pressing cancel when selecting entry type
-- Fixed a number of issues related to accessing the GUI from outside the EDT
-- Fixed NullPointerException when using BibTeX key pattern `authFirstFull` and the author does not have a "von"-part
-- Fixed NullPointerException when opening Customize entry type dialog without an open database
-- LaTeX to Unicode converter now handles combining accents
-- Fixed NullPointerException when clicking Browse in Journal abbreviations with empty text field
-- Fixed NullPointerException when opening file in Plain text import
-- Fixed NullPointerException when appending database
-- Fixed NullPointerException when loading a style file that has not got a default style
-- Date fields in the biblatex standard are now always formatted in the correct way, independent of the preferences
-- The merge entry dialog showed wrong heading after merging from DOI
-- Manage content selectors now saves edited existing lists again and only marks database as changed when the content selectors are changed
-- When inserting a duplicate the right entry will be selected
-- Preview panel height is now saved immediately, thus is shown correctly if the panel height is changed, closed and opened again
-
-### Removed
-- [#1610](https://github.com/JabRef/jabref/issues/1610) Removed the possibility to auto show or hide the groups interface
-- It is not longer possible to choose to convert HTML sub- and superscripts to equations
-- Removed option to open right-click menu with ctrl + left-click as it was not working
-- Removed option to disable entry editor when multiple entries are selected as it was not working
-- Removed option to show warning for empty key as it was not working
-- Removed option to show warning for duplicate key as it was not working
-- Removed preview toolbar (since long disabled)
-
-
-## [3.5] – 2016-07-13
-
-### Changed
-- Implemented [#1356](https://github.com/JabRef/jabref/issues/1356): Added a formatter for converting HTML to Unicode
-- Implemented [#661](https://github.com/JabRef/jabref/issues/661): Introducing a "check for updates" mechnism (manually/automatic at startup)
-- Implemented [#1338](https://github.com/JabRef/jabref/issues/1338): clicking on a crossref in the main table selects the parent entry and added a button in the entry editor to select the parent entry.
-- Implemented [#1485](https://github.com/JabRef/jabref/issues/1485): Biblatex field shorttitle is now exported/imported as standard field ShortTitle to Word bibliography
-- Implemented [#1431](https://github.com/JabRef/jabref/issues/1431): Import dialog shows file extensions and filters the view
-- When resolving duplicate BibTeX-keys there is now an "Ignore" button. "Cancel" and close key now quits the resolving.
-- The [online forum](http://discourse.jabref.org/) is now directly accessible via the "Help" menu
-- Updated German translation
-
-### Fixed
-- Fixed [#1530](https://github.com/JabRef/jabref/issues/1530): Unescaped hashes in the url field are ignored by the integrity checker
-- Fixed [#405](https://github.com/JabRef/jabref/issues/405): Added more {} around capital letters in Unicode/HTML to LaTeX conversion to preserve them
-- Fixed [#1476](https://github.com/JabRef/jabref/issues/1476): NPE when importing from SQL DB because of missing DatabaseMode
-- Fixed [#1481](https://github.com/JabRef/jabref/issues/1481): Mac OS X binary seems broken for JabRef 3.4 release
-- Fixed [#1430](https://github.com/JabRef/jabref/issues/1430): "review changes" did misinterpret changes
-- Fixed [#1434](https://github.com/JabRef/jabref/issues/1434): Static groups are now longer displayed as dynamic ones
-- Fixed [#1482](https://github.com/JabRef/jabref/issues/1482): Correct number of matched entries is displayed for refining subgroups
-- Fixed [#1444](https://github.com/JabRef/jabref/issues/1444): Implement getExtension and getDescription for importers.
-- Fixed [#1507](https://github.com/JabRef/jabref/issues/1507): Keywords are now separated by the delimiter specified in the preferences
-- Fixed [#1484](https://github.com/JabRef/jabref/issues/1484): HTML export handles some UTF characters wrong
-- Fixed [#1534](https://github.com/JabRef/jabref/issues/1534): "Mark entries imported into database" does not work correctly
-- Fixed [#1500](https://github.com/JabRef/jabref/issues/1500): Renaming of explicit groups now changes entries accordingly
-- Fixed issue where field changes were not undoable if the time stamp was updated on editing
-- Springer fetcher now fetches the requested number of entries (not one less as before)
-- Alleviate multiuser concurrency issue when near simultaneous saves occur to a shared database file
-
-
-## [3.4] – 2016-06-02
-
-### Changed
-- Implemented [#629](https://github.com/JabRef/jabref/issues/629): Explicit groups are now written in the "groups" field of the entry instead of at the end of the bib file
-- Main table now accepts pasted DOIs and tries to retrieve the entry
-- Added support for several Biblatex-fields through drop-down lists with valid alternatives
-- Added integrity checker for an odd number of unescaped '#'
-- Implemented [feature request #384](https://sourceforge.net/p/jabref/features/384): The merge entries dialog now show all text and colored differences between the fields
-- Implemented [#1233](https://github.com/JabRef/jabref/issues/1233): Group side pane now takes up all the remaining space
-- Added integrity check detecting HTML-encoded characters
-- Added missing help files
-- Implemented [feature request #1294](https://github.com/JabRef/jabref/issues/1294): Added possibility to filter for `*.jstyle` files in OpenOffice/LibreOffice style selection dialog. Open style selection dialog in directory of last selected file
-- Added integrity check for ISSN
-- Add LaTeX to Unicode converter as cleanup operation
-- Added an option in the about dialog to easily copy the version information of JabRef
-- Integrity check table can be sorted by clicking on column headings
-- Added \SOFTWARE\Jabref 'Path' registry entry for installation path inside the installer
-- Added an additional icon to distinguish DOI and URL links ([feature request #696](https://github.com/JabRef/jabref/issues/696))
-- Added nbib fields to Medlineplain importer and to MedlineImporter
-- Implemented [#1342](https://github.com/JabRef/jabref/issues/1342): show description of case converters as tooltip
-- Updated German translation
-
-### Fixed
-- Fixed [#473](https://github.com/JabRef/jabref/issues/473): Values in an entry containing symbols like ' are now properly escaped for exporting to the database
-- Fixed [#1270](https://github.com/JabRef/jabref/issues/1270): Auto save is now working again as expected (without leaving a bunch of temporary files behind)
-- Fixed [#1234](https://github.com/JabRef/jabref/issues/1234): NPE when getting information from retrieved DOI
-- Fixed [#1245](https://github.com/JabRef/jabref/issues/1245): Empty jstyle properties can now be specified as ""
-- Fixed [#1259](https://github.com/JabRef/jabref/issues/1259): NPE when sorting tabs
-- Fixed display bug in the cleanup dialog: field formatters are now correctly displayed using their name
-- Fixed [#1271](https://github.com/JabRef/jabref/issues/1271): Authors with compound first names are displayed properly
-- Fixed: Selecting invalid jstyle causes NPE and prevents opening of style selection dialog
-- Fixed: Move linked files to default directory works again
-- Fixed [#1327](https://github.com/JabRef/jabref/issues/1327): PDF cleanup changes order of linked pdfs
-- Fixed [#1313](https://github.com/JabRef/jabref/issues/1313): Remove UI for a configuration option which was no longer available
-- Fixed [#1340](https://github.com/JabRef/jabref/issues/1340): Edit -> Mark Specific Color Dysfunctional on OSX
-- Fixed [#1245](https://github.com/JabRef/jabref/issues/1245): Empty jstyle properties can now be specified as ""
-- Fixed [#1364](https://github.com/JabRef/jabref/issues/1364): Windows: install to LOCALAPPDATA directory for non-admin users
-- Fixed [#1365](https://github.com/JabRef/jabref/issues/1365): Default label pattern back to `[auth][year]`
-- Fixed [#796](https://github.com/JabRef/jabref/issues/796): Undoing more than one entry at the same time is now working
-- Fixed [#1122](https://github.com/JabRef/jabref/issues/1122): Group view is immediately updated after adding an entry to a group
-- Fixed [#171](https://github.com/JabRef/jabref/issues/171): Dragging an entry to a group preserves scrolling
-- Fixed [#1353](https://github.com/JabRef/jabref/issues/1353): Fetch-Preview did not display updated BibTeX-Key after clicking on `Generate Now`
-- Fixed [#1381](https://github.com/JabRef/jabref/issues/1381): File links containing blanks are broken if non-default viewer is set
-- Fixed sourceforge bug 1000: shorttitleINI can generate the initials of the shorttitle
-- Fixed [#1394](https://github.com/JabRef/jabref/issues/1394): Personal journal abbrevations could not be saved
-- Fixed [#1400](https://github.com/JabRef/jabref/issues/1400): Detect path constructs wrong path for Windows
-- Fixed [#973](https://github.com/JabRef/jabref/issues/973): Add additional DOI field for English version of MS Office 2007 XML
-- Fixed [#1412](https://github.com/JabRef/jabref/issues/1412): Save action *protect terms* protects terms within words unecessarily
-- Fixed [#1420](https://github.com/JabRef/jabref/issues/1420): Auto downloader should respect file pattern and propose correct filename
-- Fixed [#651](https://github.com/JabRef/jabref/issues/651): Improve parsing of author names containing braces
-- Fixed [#1421](https://github.com/JabRef/jabref/issues/1421): Auto downloader should try to retrieve DOI if not present and fetch afterwards
-- Fixed [#1457](https://github.com/JabRef/jabref/issues/1457): Support multiple words inside LaTeX commands to RTF export
-- Entries retain their groupmembership when undoing their cut/deletion
-- Fixed [#1450](https://github.com/JabRef/jabref/issues/1450): EntryEditor is restored in the correct size after preference changes
-- Fixed [#421](https://github.com/JabRef/jabref/issues/421): Remove LaTeX commands from all BibTeX fields when exporting to Word Bibliography
-
-### Removed
-- Removed possibility to export entries/databases to an `.sql` file, as the logic cannot easily use the correct escape logic
-- Removed support of old groups format, which was used prior to JabRef version 1.6. If you happen to have a 10 years old .bib file, then JabRef 3.3 can be used to convert it to the current format.
-- Removed possibility to automatically add braces via Option - Preferences - File - Store the following fields with braces around capital letters. Please use save actions instead for adding braces automatically.
-- Removed button to refresh groups view. This button shouldn't be needed anymore. Please report any cases where the groups view is not updated automatically.
-- Medline and GVK importer no longer try to expand author initials (i.e. `EH Wissler -> E. H. Wissler`).
-- Removed not-working option "Select Matches" under Groups -> Settings.
-
-
-## [3.3] – 2016-04-17
-
-### Changed
-- Migrated JabRef help to markdown at https://github.com/JabRef/help.jabref.org
-- Add possibility to lookup DOI from BibTeX entry contents inside the DOI field
-- PDFs can be automatically fetched from IEEE (given that you have access without logging in)
-- The OpenOffice/LibreOffice style file handling is changed to have only a single list of available style and you need to add your custom styles again
-- OpenOffice/LibreOffice style files are now always read and written with the same default encoding as for the database (found in the preferences)
-- The user journal abbreviation list is now always read and written with the same default encoding as for the database (found in the preferences)
-- The mass edit function "Set/clear/rename fields" is now in the Edit menu
-- Implemented [#455](https://github.com/JabRef/jabref/issues/455): Add button in preference dialog to reset preferences
-- Add ability to run arbitrary formatters as cleanup actions (some old cleanup jobs are replaced by this functionality)
-- Add "Move linked files to default file directory" as cleanup procedure
-- Implemented [#756](https://github.com/JabRef/jabref/issues/756): Add possibility to reformat all entries on save (under Preferences, File)
-- All fields in a bib entry are written without any leading and trailing whitespace
-- Comments and preamble are serialized with capitalized first letter, i.e. `@Comment` instead of `@comment` and `@Preamble` instead of `@PREAMBLE`.
-- Global sorting options and preferences are removed. Databases can still be sorted on save, but this is configured locally and stored in the file
-- OvidImporter now also imports fields: doi, issn, language and keywords
-- Implemented [#647](https://github.com/JabRef/jabref/issues/647): The preview can now be copied
-- [#459](https://github.com/JabRef/jabref/issues/459) Open default directory when trying to add files to an entry
-- 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
-- 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.
-- Moved all quality-related database actions inside a new quality menu
-- [#684](https://github.com/JabRef/jabref/issues/684): ISBNtoBibTex Error Message is now more clear
-- Moved default bibliography mode to general preferences tab
-- Add dialog to show all preferences in their raw form plus some filtering
-- Added Ordinal formatter (1 -> 1st etc)
-- [#492](https://github.com/JabRef/jabref/issues/492): If no text is marked, the whole field is copied. Preview of pasted text in tool tip
-- [#454](https://github.com/JabRef/jabref/issues/454) Add a tab that shows all remaining entry fields that are not displayed in any other tab
-- The LaTeX to Unicode/HTML functionality is much improved by covering many more cases
-- Ability to convert from LaTeX to Unicode in right-click field menu
-- Regex-based search is know only applied entirely and not split up to different regexes on whitespaces
-- [#492](https://github.com/JabRef/jabref/issues/492): If no text is marked, the whole field is copied. Preview of pasted text in tool tip
-- Integrity check now also checks broken file links, abbreviations in `journal` and `booktitle`, and incorrect use of proceedings with page numbers
-- PdfContentImporter does not write the content of the first page into the review field any more
-- Implemented [#462](https://github.com/JabRef/jabref/issues/462): Add new action to open console where opened database file is located. New button, menu entry and shortcut (CTRL+SHIFT+J) for this action have also been added.
-- [#957](https://github.com/JabRef/jabref/issues/957) Improved usability of Export save order selection in Preferences and Database Properties
-- [#958](https://github.com/JabRef/jabref/issues/958) Adjusted size and changed layout of database dialog
-- [#1023](https://github.com/JabRef/jabref/issues/492) ArXiv fetcher now also fetches based on eprint id
-- Moved "Get BibTeX data from DOI" from main table context menu to DOI field in entry editor
-- Added open buttons to DOI and URL field
-- Move Look & Feel settings from advanced to appearance tab in preferences
-- JabRef installer now automatically determines the user rights and installs to home directory/program dir when user is restricted/admin
-- Move PDF file directory configuration from external tab to file tab in preferences
-- Implemented [#672](https://github.com/JabRef/jabref/issues/672): FileList now distributes its space dependent on the width of its columns
-- Added missing German translations
-- Swedish is added as a language option (still not a complete translation)
-- [#969](https://github.com/JabRef/jabref/issues/969) Adding and replacing old event system mechanisms with Google Guava EventBus.
-
-### Fixed
-- Fixed [#318](https://github.com/JabRef/jabref/issues/318): Improve normalization of author names
-- Fixed [#598](https://github.com/JabRef/jabref/issues/598) and [#402](https://github.com/JabRef/jabref/issues/402): No more issues with invalid icons for ExternalFileTypes in global search or after editing the settings
-- Fixed [#883](https://github.com/JabRef/jabref/issues/883): No NPE during cleanup
-- Fixed [#845](https://github.com/JabRef/jabref/issues/845): Add checkboxes for highlighting in groups menu, fixes other toggle highlighting as well for all toggle buttons
-- Fixed [#890](https://github.com/JabRef/jabref/issues/890): No NPE when renaming file
-- Fixed [#466](https://github.com/JabRef/jabref/issues/466): Rename PDF cleanup now also changes case of file name
-- Fixed [#621](https://github.com/JabRef/jabref/issues/621) and [#669](https://github.com/JabRef/jabref/issues/669): Encoding and preamble now end with newline.
-- Make BibTex parser more robust against missing newlines
-- Fix bug that prevented the import of BibTex entries having only a key as content
-- Fixed [#666](https://github.com/JabRef/jabref/issues/666): MS Office 2007 export is working again
-- Fixed [#670](https://github.com/JabRef/jabref/issues/670): Expressions using enclosed quotes (`keywords="one two"`) did not work.
-- Fixed [#667](https://github.com/JabRef/jabref/issues/667): URL field is not sanitized anymore upon opening in browser.
-- Fixed [#687](https://github.com/JabRef/jabref/issues/687): Fixed NPE when closing JabRef with new unsaved database.
-- Fixed [#680](https://github.com/JabRef/jabref/issues/680): Synchronize Files key binding works again.
-- Fixed [#212](https://github.com/JabRef/jabref/issues/212): Added command line option `-g` for autogenerating bibtex keys
-- Fixed [#213](https://github.com/JabRef/jabref/issues/212): Added command line option `-asfl` for autosetting file links
-- Fixed [#671](https://github.com/JabRef/jabref/issues/671): Remember working directory of last import
-- IEEEXplore fetcher replaces keyword separator with the preferred
-- Fixed [#710](https://github.com/JabRef/jabref/issues/710): Fixed quit behavior under OSX
-- "Merge from DOI" now honors removed fields
-- Fixed [#778](https://github.com/JabRef/jabref/issues/778): Fixed NPE when exporting to `.sql` File
-- Fixed [#824](https://github.com/JabRef/jabref/issues/824): MimeTypeDetector can now also handle local file links
-- Fixed [#803](https://github.com/JabRef/jabref/issues/803): Fixed dynamically group, free-form search
-- Fixed [#743](https://github.com/JabRef/jabref/issues/743): Logger not configured when JAR is started
-- Fixed [#822](https://github.com/JabRef/jabref/issues/822): OSX - Exception when adding the icon to the dock
-- Fixed [#609](https://github.com/JabRef/jabref/issues/609): Sort Arrows are shown in the main table if table is sorted
-- Fixed [#685](https://github.com/JabRef/jabref/issues/685): Fixed MySQL exporting for more than one entry
-- Fixed [#815](https://github.com/JabRef/jabref/issues/815): Curly Braces no longer ignored in OpenOffice/LibreOffice citation
-- Fixed [#855](https://github.com/JabRef/jabref/issues/856): Fixed OpenOffice Manual connect - Clicking on browse does now work correctly
-- Fixed [#649](https://github.com/JabRef/jabref/issues/649): Key bindings are now working in the preview panel
-- Fixed [#410](https://github.com/JabRef/jabref/issues/410): Find unlinked files no longer freezes when extracting entry from PDF content
-- Fixed [#936](https://github.com/JabRef/jabref/issues/936): Preview panel is now updated when an entry is cut/deleted
-- Fixed [#1001](https://github.com/JabRef/jabref/issues/1001): No NPE when exporting a complete database
-- Fixed [#991](https://github.com/JabRef/jabref/issues/991): Entry is now correctly removed from the BibDatabase
-- Fixed [#1062](https://github.com/JabRef/jabref/issues/1062): Merge entry with DOI information now also applies changes to entry type
-- Fixed [#535](https://github.com/JabRef/jabref/issues/535): Add merge action to right click menu
-- Fixed [#1115](https://github.com/JabRef/jabref/issues/1115): Wrong warning message when importing duplicate entries
-- Fixed [#935](https://github.com/JabRef/jabref/issues/935): PDFs, which are readable, but carry a protection for editing, are treated by the XMP parser and the importer generating a BibTeX entry based on the content.
-- Fixed: Showing the preview panel with a single-click at startup
-
-### Removed
-- Removed JabRef offline help files which are replaced by the new online documentation at https://github.com/JabRef/help.jabref.org
-- Fixed [#627](https://github.com/JabRef/jabref/issues/627): The `pdf` field is removed from the export formats, use the `file` field
-- Removed configuration option to use database file directory as base directory for attached files and make it default instead
-- Removed save session functionality as it just saved the last opened tabs which is done by default
-- Removed CLI option `-l` to load a session
-- Removed PDF preview functionality
-- Removed Sixpackimporter it is not used in the wild anymore
-- Removed double click listener from `doi` and `url` fields
-
-
-## [3.2] – 2016-01-10
-
-### Changed
-- All import/open database warnings are now shown in a scrolling text area
-- Add an integrity check to ensure that a url has a correct protocol, implements [#358](https://github.com/JabRef/jabref/issues/358)
-
-### Fixed
-- Changes in customized entry types are now directly reflected in the table when clicking "Apply" or "OK"
-- Fixed [#608](https://github.com/JabRef/jabref/issues/608): Export works again
-- Fixed [#417](https://github.com/JabRef/jabref/issues/417): Table now updates when switching groups
-- Fixed [#534](https://github.com/JabRef/jabref/issues/534): No OpenOffice setup panel in preferences
-- Fixed [#545](https://github.com/JabRef/jabref/issues/545): ACM fetcher works again
-- Fixed [#593](https://github.com/JabRef/jabref/issues/593): Reference list generation works for OpenOffice/LibreOffice again
-- Fixed [#598](https://github.com/JabRef/jabref/issues/598): Use default file icon for custom external file types
-- Fixed [#607](https://github.com/JabRef/jabref/issues/607): OpenOffice/LibreOffice works on OSX again
-
-### Removed
-- OpenOffice/LibreOffice is removed from the push-to-application button and only accessed through the side panel
-
-
-## [3.1] – 2015-12-24
-
-### Changed
-- Added new DoiResolution fetcher that tries to download full text PDF from DOI link
-- Add options to close other/all databases in tab right-click menu
-- Implements [#470](https://github.com/JabRef/jabref/issues/470): Show editor (as an alternative to author) and booktitle (as an alternative to journal) in the main table by default
-- Restore focus to last focused tab on start
-- Add ability to format/cleanup the date field
-- Add support for proxy authentication via VM args and GUI settings, this implements [feature request 388](https://sourceforge.net/p/jabref/feature-requests/388/)
-- Move Bibtex and Biblatex mode switcher to File menu
-- Display active edit mode (BibTeX or Biblatex) at window title
-- Implements [#444](https://github.com/JabRef/jabref/issues/444): The search is cleared by either clicking the clear-button or by pressing ESC with having focus in the search field.
-- Icons are shown as Header for icon columns in the entry table ([#315](https://github.com/JabRef/jabref/issues/315))
-- Tooltips are shown for header columns and contents which are too wide to be displayed in the entry table ([#384](https://github.com/JabRef/jabref/issues/384))
-- Default order in entry table: # | all file based icons (file, URL/DOI, ...) | all bibtex field based icons (bibtexkey, entrytype, author, title, ...) | all activated special field icons (ranking, quality, ...)
-- Write all field keys in lower case. No more camel casing of field names. E.g., `title` is written instead of `Title`, `howpublished` instead of `HowPublished`, and `doi` instead of `DOI`. The configuration option `Use camel case for field names (e.g., "HowPublished" instead of "howpublished")` is gone.
-- All field saving options are removed. There is no more customization of field sorting. '=' is now appended to the field key instead of its value. The intendation is aligned for an entry and not for the entire database. Entry names are written in title case format.
-- Entries are only reformatted if they were changed during a session. There is no more mandatory reformatting of the entire database on save.
-- Implements [#565](https://github.com/JabRef/jabref/issues/565): Highlighting matches works now also for regular expressions in preview panel and entry editor
-- IEEEXplore search now downloads the full Bibtex record instead of parsing the fields from the HTML webpage result (fixes [bug 1146](https://sourceforge.net/p/jabref/bugs/1146/) and [bug 1267](https://sourceforge.net/p/jabref/bugs/1267/))
-- Christmas color theme (red and green)
-- Implements #444: The search is cleared by either clicking the clear-button or by pressing ESC with having focus in the search field.
-- Added command line switch --debug to show more detailed logging messages
-
-### Fixed
-- Fixed [bug 482](https://sourceforge.net/p/jabref/bugs/482/) partly: escaped brackets are now parsed properly when opening a bib file
-- Fixed [#479](https://github.com/JabRef/jabref/issues/479): Import works again
-- Fixed [#434](https://github.com/JabRef/jabref/issues/434): Revert to old 'JabRef' installation folder name instead of 'jabref'
-- Fixed [#435](https://github.com/JabRef/jabref/issues/435): Retrieve non open access ScienceDirect PDFs via HTTP DOM
-- Fixed: Cleanup process aborts if linked file does not exists
-- Fixed [#420](https://github.com/JabRef/jabref/issues/420): Reenable preference changes
-- Fixed [#414](https://github.com/JabRef/jabref/issues/414): Rework biblatex entry types with correct required and optional fields
-- Fixed [#413](https://github.com/JabRef/jabref/issues/413): Help links in released jar version are not working
-- Fixes [#412](https://github.com/JabRef/jabref/issues/412): Biblatex preserves capital letters, checking whether letters may be converted to lowercase within the Integrity Check action is obsolete.
-- Fixed [#437](https://github.com/JabRef/jabref/issues/437): The toolbar after the search field is now correctly wrapped when using a small window size for JabRef
-- Fixed [#438](https://github.com/JabRef/jabref/issues/438): Cut, Copy and Paste are now translated correctly in the menu
-- Fixed [#443](https://github.com/JabRef/jabref/issues/443)/[#445](https://github.com/JabRef/jabref/issues/445): Fixed sorting and moving special field columns
-- Fixed [#498](https://github.com/JabRef/jabref/issues/498): non-working legacy PDF/PS column removed
-- Fixed [#473](https://github.com/JabRef/jabref/issues/473): Import/export to external database works again
-- Fixed [#526](https://github.com/JabRef/jabref/issues/526): OpenOffice/LibreOffice connection works again on Linux/OSX
-- Fixed [#533](https://github.com/JabRef/jabref/issues/533): Preview parsed incorrectly when regular expression was enabled
-- Fixed: MedlinePlain Importer made more resistant for malformed entries
-- Fixed [#564](https://github.com/JabRef/jabref/issues/564): Cite command changes are immediately reflected in the push-to-application actions, and not only after restart
-
-### Removed
-- Removed BioMail format importer
-- Removed file history size preference (never available from the UI)
-- Removed jstorImporter because it's hardly ever used, even Jstor.org doesn't support/export said format anymore
-- Removed ScifinderImporter because it's hardly ever used, and we could not get resource files to test against
-- Removed option "Show one letter heading for icon columns" which is obsolete with the fix of [#315](https://github.com/JabRef/jabref/issues/315)/[#384](https://github.com/JabRef/jabref/issues/384)
-- Removed table column "PDF/PS" which refers to legacy fields "ps" resp. "pdf" which are no longer supported (see also fix [#498](https://github.com/JabRef/jabref/issues/498))
-- Removed the ability to export references on the CLI interface based on year ranges
-
+## Older versions
-## [3.0] – 2015-11-29
-
-### Changed
- - Updated to support OpenOffice 4 and LibreOffice 5
- - Add toolbar icon for deleting an entry, and move menu item for this action to BibTeX
- - Better support for IEEEtranBSTCTL entries
- - Quick selection of month in entry editor
- - Unknown entry types will be converted to 'Misc' (was 'Other' before).
- - EntryTypes are now clustered per group on the 'new entry' GUI screen.
- - Tab shows the minimal unique folder name substring if multiple database files share the same name
- - Added a page numbers integrity checker
- - Position and size of certain dialogs are stored and restored.
- - Feature: Search Springer
- - Feature: Search DOAJ, Directory of Open Access Journals
- - Changes the old integrity check by improving the code base (+tests) and converting it to a simple issues table
- - Added combo box in MassSetFieldAction to simplify selecting the correct field name
- - Feature: Merge information from both entries on duplication detection
- - Always use import inspection dialog on import from file
- - All duplicate whitespaces / tabs / newlines are now removed from non-multiline fields
- - Improvements to search:
- - Search bar is now at the top
- - A summary of the search result is shown in textual form in the search bar
- - The search text field changes its color based on the search result (red if nothing is found, green if at least one entry is found)
- - Autocompletion suggestions are shown in a popup
- - Search options are available via a drop-down list, this implements [feature request 853](https://sourceforge.net/p/jabref/feature-requests/853/)
- - "Clear search" button also clears search field, this implements [feature request 601](https://sourceforge.net/p/jabref/feature-requests/601/)
- - Every search is done automatically (live) as soon as the search text is changed
- - Search is local by default. To do a global search, one has to do a local search and then this search can be done globally as well, opening a new window.
- - The local search results can be shown in a new window.
- - Feature: Merge information from a DOI generated BibTex entry to an entry
- - Added more characters to HTML/Unicode converter
- - Feature: Push citations to Texmaker ([bug 318](https://sourceforge.net/p/jabref/bugs/318/), [bug 582](https://sourceforge.net/p/jabref/bugs/582/))
- - Case changers improved to honor words (not yet more than single words) within {}
- - Feature: Added converters from HTML and Unicode to LaTeX on right click in text fields ([#191](https://github.com/JabRef/jabref/issues/191))
- - Feature: Add an option to the FileList context menu to delete an associated file from the file system
- - Feature: Field names "Doi", "Ee", and "Url" are now written as "DOI", "EE", and "URL"
- - The default language is now automatically set to the system's locale.
- - Use correct encoding names ([#155](https://github.com/JabRef/jabref/issues/155)) and replace old encoding names in bibtex files. This changes the file header.
- - No longer write JabRef version to BibTex file header.
- - No longer add blank lines inside a bibtex entry
- - Feature: When pasting a Google search URL, meta data will be automatically stripped before insertion.
- - Feature: PDF auto download from ACS, arXiv, ScienceDirect, SpringerLink, and Google Scholar
- - List of authors is now auto generated `scripts/generate-authors.sh` and inserted into L10N About.html
- - Streamline logging API: Replace usages of java.util.logging with commons.logging
- - Remove support for custom icon themes. The user has to use the default one.
- - Solved [feature request 767](https://sourceforge.net/p/jabref/feature-requests/767/): New subdatabase based on AUX file (biblatex)
- - Feature: DOItoBibTeX fetcher now also handles HTTP URLs
- - Feature: "Normalize to BibTeX name format" also removes newlines
- - Tweak of preference defaults
- - Autolink requires that the filename starts with the given BibTeX key and the default filename patterns is key followed by title
- - Default sorting changed
- - Default label pattern changed from `[auth][year]` to `[authors3][year]`
- - Feature: case changers now leave protected areas (enclosed with curly brackets) alone
- - BREAKING: The BibTeX key generator settings from previous versions are lost
- - BREAKING: LabelPatterns `[auth.etal]`, `[authEtAl]`, `[authors]`, `[authorsN]`, `[authorLast]` and more to omit spaces and commas (and work as described at http://jabref.sourceforge.net/help/LabelPatterns.php)
- - BREAKING: `[keywordN]` returns the Nth keyword (as described in the help) and not the first N keywords
- - BREAKING: If field consists of blanks only or an emtpy string, it is not written at all
- - Feature: new LabelPattern `[authFirstFull]` returning the last name of the first author and also a "van" or "von" if it exists
- - Feature: all new lines when writing an entry are obeying the globally configured new line (File -> newline separator). Affects fields: abstract and review
- - Feature: `[veryShortTitle]` and `[shortTitle]` also skip words like "in", "among", "before", ...
- - Feature: New LabelPattern `[keywordsN]`, where N is optional. Returns the first N keywords. If no N is specified ("`[keywords]`"), all keywords are returned. Spaces are removed.
- - Update supported LookAndFeels
- - Show replaced journal abbreviations on console
- - Integrated [GVK-Plugin](http://www.gbv.de/wikis/cls/Jabref-GVK-Plugin)
- - The three options to manage file references are moved to their own separated group in the Tools menu.
- - Default preferences: Remote server (port 6050) always started on first JabRef instance. This prevents JabRef loaded twice when opening a bib file.
-
-### Fixed
- - Fixed the bug that the file encoding was not correctly determined from the first (or second) line
- - Fixed [#325](https://github.com/JabRef/jabref/issues/325): Deactivating AutoCompletion crashes EntryEditor
- - Fixed bug when having added and then removed a personal journal list, an exception is always shown on startup
- - Fixed a bug in the IEEEXploreFetcher
- - Fixed [bug 1282](https://sourceforge.net/p/jabref/bugs/1282/) related to backslashes duplication.
- - Fixed [bug 1285](https://sourceforge.net/p/jabref/bugs/1285/): Editing position is not lost on saving
- - Fixed [bug 1297](https://sourceforge.net/p/jabref/bugs/1297/): No console message on closing
- - Fixed [#194](https://github.com/JabRef/jabref/issues/194): JabRef starts again on Win XP and Win Vista
- - Fixed: Tooltips are now shown for the #-field when the bibtex entry is incomplete.
- - Fixed [#173](https://github.com/JabRef/jabref/issues/173): Personal journal abbreviation list is not loaded twice
- - Bugfix: Preview of external journal abbreviation list now displays the correct list
- - Fixed [#223](https://github.com/JabRef/jabref/issues/223): Window is displayed in visible area even when having multiple screens
- - Localization tweaks: "can not" -> "cannot" and "file name" -> "filename"
- - Fixed: When reconfiguring the BibTeX key generator, changes are applied instantly without requiring a restart of JabRef
- - Fixed [#250](https://github.com/JabRef/jabref/issues/250): No hard line breaks after 70 chars in serialized JabRef meta data
- - Fixed [bug 1296](https://sourceforge.net/p/jabref/bugs/1296/): External links in the help open in the standard browser
- - Fixed behavior of opening files: If an existing database is opened, it is focused now instead of opening it twice.
-
-### Removed
- - Entry type 'Other' is not selectable anymore as it is no real entry type. Will be converted to 'Misc'.
- - BREAKING: Remove plugin functionality.
- - The key bindings for searching specific databases are removed
- - Remove option to toggle native file dialog on mac by making JabRef always use native file dialogs on mac
- - Remove options to set PDF and PS directories per .bib database as the general options have also been deleted.
- - Remove option to disable renaming in FileChooser dialogs.
- - Remove option to hide the BibTeX Code tab in the entry editor.
- - Remove option to set a custom icon for the external file types. This is not possible anymore with the new icon font.
- - Remove legacy options to sync files in the "pdf" or "ps" field
- - Remove button to merge entries and keep the old ones.
- - Remove non-compact rank symbols in favor of compact rank
- - Remove Mr.DLib support as MR.DLib will be shut down in 2015
- - Remove support for key bindings per external application by allowing only the key binding "push to application" for the currently selected external application.
- - Remove "edit preamble" from toolbar
- - Remove support to the move-to-SysTray action
- - Remove incremental search
- - Remove option to disable autocompleters for search and make this always one
- - Remove option to highlight matches and make this always one when not using regex or grammar-based search
- - Remove non-working web searches: JSTOR and Sciencedirect (planned to be fixed for the next release)
- - Remove option Tools -> Open PDF or PS which is replaced by Tools -> Open File
-
-## 2.80 – never released
-
-Version 2.80 was intended as intermediate step to JabRef 3.0.
-Since much functionality has changed during development, a release of this version was skipped.
-
-## 2.11
-
-The changelog of 2.11 and versions before is maintained as [text file](https://github.com/JabRef/jabref/blob/v2.11.1/CHANGELOG) in the [v2.11.1 tag](https://github.com/JabRef/jabref/tree/v2.11.1).
+The changelog of versions 3.x is available at the [v3.8.2 tag](https://github.com/JabRef/jabref/blob/v3.8.2/CHANGELOG.md).
+The changelog of 2.11 and versions before is available as [text file in the v2.11.1 tag](https://github.com/JabRef/jabref/blob/v2.11.1/CHANGELOG).
[Unreleased]: https://github.com/JabRef/jabref/compare/v4.0...HEAD
[4.0]: https://github.com/JabRef/jabref/compare/v4.0-beta3...v4.0
[4.0-beta3]: https://github.com/JabRef/jabref/compare/v4.0-beta2...v4.0-beta3
[4.0-beta2]: https://github.com/JabRef/jabref/compare/v4.0-beta...v4.0-beta2
[4.0-beta]: https://github.com/JabRef/jabref/compare/v3.8.2...v4.0-beta
-[3.8.2]: https://github.com/JabRef/jabref/compare/v3.8.1...v3.8.2
-[3.8.1]: https://github.com/JabRef/jabref/compare/v3.8...v3.8.1
-[3.8]: https://github.com/JabRef/jabref/compare/v3.7...v3.8
-[3.7]: https://github.com/JabRef/jabref/compare/v3.6...v3.7
-[3.6]: https://github.com/JabRef/jabref/compare/v3.5...v3.6
-[3.5]: https://github.com/JabRef/jabref/compare/v3.4...v3.5
-[3.4]: https://github.com/JabRef/jabref/compare/v3.3...v3.4
-[3.3]: https://github.com/JabRef/jabref/compare/v3.2...v3.3
-[3.2]: https://github.com/JabRef/jabref/compare/v3.1...v3.2
-[3.1]: https://github.com/JabRef/jabref/compare/v3.0...v3.1
-[3.0]: https://github.com/JabRef/jabref/compare/v2.11.1...v3.0
-[dev_2.11]: https://github.com/JabRef/jabref/compare/v2.11.1...dev_2.11
[2.11.1]: https://github.com/JabRef/jabref/compare/v2.11...v2.11.1
[JavaFX]: https://en.wikipedia.org/wiki/JavaFX
diff --git a/README.md b/README.md
index 7bcae080071..b02679d6fe5 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,6 @@
# JabRef Development Version
[](https://travis-ci.org/JabRef/jabref)
-[](https://www.versioneye.com/user/projects/557f2723386664002000009c)
[](https://codecov.io/github/JabRef/jabref?branch=master)
[](https://donations.jabref.org)
diff --git a/build.gradle b/build.gradle
index cbf49a61f77..499d3895215 100644
--- a/build.gradle
+++ b/build.gradle
@@ -3,7 +3,7 @@ import org.gradle.internal.os.OperatingSystem
// to update the gradle wrapper, execute ./gradlew wrapper --gradle-version 4.0
plugins {
- id 'com.gradle.build-scan' version '1.8'
+ id 'com.gradle.build-scan' version '1.9'
id 'com.install4j.gradle' version '6.1.5'
id 'com.github.johnrengelman.shadow' version '2.0.1'
id "de.sebastianboegl.shadow.transformer.log4j" version "2.1.1"
@@ -38,6 +38,10 @@ sourceCompatibility = 1.8
targetCompatibility = 1.8
mainClassName = "org.jabref.JabRefMain"
+// These are the Java version requirements we will check on each start of JabRef
+ext.minRequiredJavaVersion = "1.8.0_144"
+ext.allowJava9 = false
+
install4j {
installDir = file(project.ext.install4jDir)
}
@@ -97,7 +101,7 @@ dependencies {
compile 'net.java.dev.glazedlists:glazedlists_java15:1.9.1'
- compile 'com.google.guava:guava:23.2-jre'
+ compile 'com.google.guava:guava:23.3-jre'
// JavaFX stuff
compile 'com.airhacks:afterburner.fx:1.7.0'
@@ -131,7 +135,7 @@ dependencies {
testCompile 'junit:junit:4.12'
testCompile 'org.mockito:mockito-core:2.11.0'
- testCompile 'com.github.tomakehurst:wiremock:2.8.0'
+ testCompile 'com.github.tomakehurst:wiremock:2.10.1'
testCompile 'org.assertj:assertj-swing-junit:3.8.0'
testCompile 'org.reflections:reflections:0.9.11'
testCompile 'org.xmlunit:xmlunit-core:2.5.0'
@@ -160,7 +164,11 @@ processResources {
"year": String.valueOf(Calendar.getInstance().get(Calendar.YEAR)),
"authors": new File('AUTHORS').readLines().findAll { !it.startsWith("#") }.join(", "),
"developers": new File('DEVELOPERS').readLines().findAll { !it.startsWith("#") }.join(", "),
- "azureInstrumentationKey": System.getenv('AzureInstrumentationKey'))
+ "azureInstrumentationKey": System.getenv('AzureInstrumentationKey'),
+ "minRequiredJavaVersion": minRequiredJavaVersion,
+ "allowJava9": allowJava9
+
+ )
filteringCharset = 'UTF-8'
}
diff --git a/docs/adr/0000-use-architectural-decision-records.md b/docs/adr/0000-use-architectural-decision-records.md
deleted file mode 100644
index edfe41f4e43..00000000000
--- a/docs/adr/0000-use-architectural-decision-records.md
+++ /dev/null
@@ -1,16 +0,0 @@
-# Use Architectural Decision Records
-
-We need to record the architectural decisions made on this project.
-
-## Considered Alternatives
-
-* No record
-* [DecisionRecord](https://github.com/schubmat/DecisionCapture)
-* [Michael Nygard's template](http://thinkrelevance.com/blog/2011/11/15/documenting-architecture-decisions), maintainable by [adr-tools](https://github.com/npryce/adr-tools)
-* [Sustainable Architectural Decisions](https://www.infoq.com/articles/sustainable-architectural-design-decisions)
-* [Other templates](https://github.com/joelparkerhenderson/architecture_decision_record)
-
-## Conclusion
-
-* *Chosen Alternative: Decision Record*
-* That template is lean and fits most the development style
diff --git a/docs/adr/0000-use-markdown-architectural-decision-records.md b/docs/adr/0000-use-markdown-architectural-decision-records.md
new file mode 100644
index 00000000000..3f3f2a283f4
--- /dev/null
+++ b/docs/adr/0000-use-markdown-architectural-decision-records.md
@@ -0,0 +1,23 @@
+# Use Markdown Architectural Decision Records
+
+Should we record the architectural decisions made in this project?
+And if we do, wow to structure these recordings?
+
+## Considered Alternatives
+
+* [MADR](https://adr.github.io/madr/) - Markdown Architectural Decision Records
+* [Michael Nygard's template](http://thinkrelevance.com/blog/2011/11/15/documenting-architecture-decisions) - The first incarnation of the term "ADR". Maintainable by [adr-tools](https://github.com/npryce/adr-tools).
+* [Sustainable Architectural Decisions](https://www.infoq.com/articles/sustainable-architectural-design-decisions) - The Y-Statements
+* [DecisionRecord](https://github.com/schubmat/DecisionCapture) - Agile records by [@schubmat](https://github.com/schubmat/)
+* Other templates listed at
+* No records
+
+## Decision Outcome
+
+* Chosen Alternative: MADR
+* Implicit assumptions should be made explicit.
+ Design documentation is important to enable people understanding the decisions later on.
+ See also [A rational design process: How and why to fake it](https://doi.org/10.1109/TSE.1986.6312940).
+* The MADR template is lean and fits our development style.
+
+
diff --git a/docs/adr/index.md b/docs/adr/index.md
index 59e592a086c..c622674a03b 100644
--- a/docs/adr/index.md
+++ b/docs/adr/index.md
@@ -1,8 +1,13 @@
-# Architectural Decision Records
+# Architectural Decision Log
-This lists the architectural decisions for JabRef.
+This log lists the architectural decisions for JabRef.
-- [0000-use-architectural-decision-records.md](0000-use-architectural-decision-records) - Use Architectural Decision Records
-- [template.md](template/) - the template
+
-More information on architectural decision records is available at .
+- [ADR-0000](0000-use-markdown-architectural-decision-records.md) - Use Markdown Architectural Decision Records
+
+
+
+For new ADRs, please use [template.md](template.md) as basis.
+More information on MADR is available at .
+General information about architectural decision records is available at .
diff --git a/docs/adr/template.md b/docs/adr/template.md
index e473bf5e5c9..e0433876d5d 100644
--- a/docs/adr/template.md
+++ b/docs/adr/template.md
@@ -1,36 +1,42 @@
-#
+# *[short title of solved problem and solution]*
-**UserStory:**
+**User Story:** *[ticket/issue-number]*
-
+*[context and problem statement]*
+*[decision drivers | forces]*
## Considered Alternatives
-*
-*
-*
+* *[alternative 1]*
+* *[alternative 2]*
+* *[alternative 3]*
+* *[...]*
-## Conclusion
+## Decision Outcome
-* *Chosen Alternative: *
-*
+* Chosen Alternative: *[alternative 1]*
+* *[justification. e.g., only alternative, which meets k.o. criterion decision driver | which resolves force force | ... | comes out best (see below)]*
+* *[consequences. e.g., negative impact on quality attribute, follow-up decisions required, ...]*
-## Comparison (Optional)
+## Pros and Cons of the Alternatives
-###
+### *[alternative 1]*
-* +
-* +
-* -
+* `+` *[argument 1 pro]*
+* `+` *[argument 2 pro]*
+* `-` *[argument 1 con]*
+* *[...]*
-###
+### *[alternative 2]*
-* +
-* +
-* -
+* `+` *[argument 1 pro]*
+* `+` *[argument 2 pro]*
+* `-` *[argument 1 con]*
+* *[...]*
-###
+### *[alternative 3]*
-* +
-* +
-* -
+* `+` *[argument 1 pro]*
+* `+` *[argument 2 pro]*
+* `-` *[argument 1 con]*
+* *[...]*
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
index 736fb7d3f94..27768f1bbac 100644
Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 74bb77845e0..0e680f3759f 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-4.2.1-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-4.3.1-bin.zip
diff --git a/scripts/syncLang.py b/scripts/syncLang.py
index 1396908428f..dc1fd6d17c5 100644
--- a/scripts/syncLang.py
+++ b/scripts/syncLang.py
@@ -1,11 +1,12 @@
# coding=utf-8
+from __future__ import division
+import codecs
import datetime
import logging
import os
import subprocess
import sys
-from io import TextIOWrapper
logging.basicConfig(level=logging.INFO)
@@ -14,19 +15,19 @@
class Git:
- def get_current_branch(self) -> str:
+ def get_current_branch(self):
"""
:return: the current git branch
"""
return self.__call_command('git rev-parse --abbrev-ref HEAD')
- def get_current_hash_short(self) -> str:
+ def get_current_hash_short(self):
"""
:return: the current git hash (short)
"""
return self.__call_command('git rev-parse --short HEAD')
- def __call_command(self, command: str) -> str:
+ def __call_command(self, command):
"""
:param command: a shell command
:return: the output of the shell command
@@ -38,7 +39,7 @@ class Keys:
def __init__(self, lines):
self.lines = lines
- def duplicates(self) -> list:
+ def duplicates(self):
"""
return: list of unicode strings
"""
@@ -48,15 +49,15 @@ def duplicates(self) -> list:
key, value = self.__extract_key_and_value(line=line)
if key:
if key in keys_checked:
- duplicates.append("{key}={value}".format(key=key, value=value))
- translation_in_list = "{key}={value}".format(key=key, value=keys_checked[key])
+ duplicates.append(u"{key}={value}".format(key=key, value=value))
+ translation_in_list = "u{key}={value}".format(key=key, value=keys_checked[key])
if translation_in_list not in duplicates:
duplicates.append(translation_in_list)
else:
keys_checked[key] = value
return duplicates
- def fix_duplicates(self) -> tuple:
+ def fix_duplicates(self):
"""
Fixes all unambiguous duplicates
:return: (list of unicode strings, list of unicode strings): not fixed ambiguous duplicates, fixed unambiguous duplicates
@@ -83,7 +84,7 @@ def fix_duplicates(self) -> tuple:
return keys, not_fixed, fixed
- def keys_from_lines(self) -> list:
+ def keys_from_lines(self):
"""
Builds a list of all translation keys in the list of lines.
@@ -97,7 +98,7 @@ def keys_from_lines(self) -> list:
return keys
@staticmethod
- def key_from_line(line) -> str:
+ def key_from_line(line):
"""
Tries to extract the key from the line
@@ -112,7 +113,7 @@ def key_from_line(line) -> str:
return line[0:index_key_end].strip()
return None
- def empty_keys(self) -> list:
+ def empty_keys(self):
"""
:return: list of unicode strings: the keys with empty values
"""
@@ -123,7 +124,7 @@ def empty_keys(self) -> list:
not_translated.append(key)
return not_translated
- def translations_as_dict(self) -> dict:
+ def translations_as_dict(self):
"""
:return: dict of unicode strings:
"""
@@ -135,7 +136,7 @@ def translations_as_dict(self) -> dict:
return translations
@staticmethod
- def __extract_key_and_value(line) -> tuple:
+ def __extract_key_and_value(line):
"""
Tries to extract the key and value from the line
:param line: unicode string
@@ -151,7 +152,7 @@ def __extract_key_and_value(line) -> tuple:
class SyncLang:
- def __init__(self, extended: bool, out_file='status.md'):
+ def __init__(self, extended, out_file='status.md'):
"""
:param extended: boolean: if the keys with problems should be printed
@@ -237,7 +238,7 @@ def __check_properties(self, main_property_file, property_files):
if self.extended and num_keys_duplicate != 0:
logging.info("\t\t{}".format(", ".join(keys_duplicate)))
- def __all_menu_properties(self) -> list:
+ def __all_menu_properties(self):
"""
:return: list of strings: all the Menu_*.preferences files with the english at the beginning
"""
@@ -245,14 +246,14 @@ def __all_menu_properties(self) -> list:
menu_property_files.insert(0, self.main_menu_preferences)
return menu_property_files
- def __other_menu_properties(self) -> list:
+ def __other_menu_properties(self):
"""
:return: list of strings: all the Menu_*.preferences files without the english one
"""
menu_property_files = [s for s in os.listdir(RES_DIR) if (s.startswith('Menu_') and not (s.startswith('Menu_en')))]
return [os.path.join(RES_DIR, file) for file in menu_property_files]
- def __all_jabref_properties(self) -> list:
+ def __all_jabref_properties(self):
"""
:return: list of strings: all the JabRef_*.preferences files with the english at the beginning
"""
@@ -260,7 +261,7 @@ def __all_jabref_properties(self) -> list:
jabref_property_files.insert(0, os.path.join(RES_DIR, "JabRef_en.properties"))
return jabref_property_files
- def __other_jabref_properties(self) -> list:
+ def __other_jabref_properties(self):
"""
:return: list of strings: all the JabRef_*.preferences files without the english one
"""
@@ -313,7 +314,7 @@ def __update_properties(self, main_property_file, other_property_files):
for line in main_lines:
key = main_keys.key_from_line(line)
if key is not None:
- other_lines_to_write.append("{key}={value}\n".format(key=key, value=keys[key]))
+ other_lines_to_write.append(u"{key}={value}\n".format(key=key, value=keys[key]))
else:
other_lines_to_write.append(line)
@@ -345,7 +346,7 @@ def __update_properties(self, main_property_file, other_property_files):
logging.info("\thas been sorted successfully")
@staticmethod
- def __format_filename(filepath) -> str:
+ def __format_filename(filepath):
"""
removes the res_dir path
@@ -361,20 +362,20 @@ def __write_file(filename, content):
:param filename: string
:param content: list of unicode unicode: the lines to write
"""
- with open(filename, 'w', newline='\n', encoding='UTF-8') as f:
+ with codecs.open(filename, 'w', encoding="UTF-8") as f:
f.writelines(content)
@staticmethod
- def __read_file_as_lines(filename, encoding="UTF-8") -> list:
+ def __read_file_as_lines(filename):
"""
:param filename: string
:param encoding: string: the encoding of the file to read (standard: `UTF-8`)
:return: list of unicode strings: the lines of the file
"""
- with open(filename, 'r', newline='', encoding=encoding) as file:
- return ["{}\n".format(line.strip()) for line in file.readlines()]
+ with codecs.open(filename, 'r', encoding="UTF-8") as file:
+ return [u"{}\n".format(line.strip()) for line in file.readlines()]
- def __missing_keys(self, first_list: list, second_list: list) -> list:
+ def __missing_keys(self, first_list, second_list):
"""
Finds all keys in the first list that are not present in the second list
@@ -392,7 +393,8 @@ def status_create_markdown(self):
"""
Creates a markdown file of the current status.
"""
- def _write_properties(output_file: TextIOWrapper, property_files: list):
+
+ def _write_properties(output_file, property_files):
output_file.write("\n| Property file | Keys | Keys translated | Keys not translated | % translated |\n")
output_file.write("| ------------- | ---- | --------------- | ------------------- | ------------ |\n")
@@ -403,26 +405,30 @@ def _write_properties(output_file: TextIOWrapper, property_files: list):
num_keys_missing_value = len(keys.empty_keys())
num_keys_translated = num_keys - num_keys_missing_value
- output_file.write(f"| [{os.path.basename(file)}]({URL_BASE}{os.path.basename(file)}) | "
- f"{num_keys} | "
- f"{num_keys_translated} | "
- f"{num_keys_missing_value} | "
- f"{_percentage(num_keys, num_keys_translated)} |\n")
-
- def _percentage(whole: int, part: int) -> int:
+ output_file.write("| [%s](%s%s) | %d | %d | %d | %d |\n" % (os.path.basename(file),
+ URL_BASE,
+ os.path.basename(file),
+ num_keys,
+ num_keys_translated,
+ num_keys_missing_value,
+ _percentage(num_keys, num_keys_translated)
+ )
+ )
+
+ def _percentage(whole, part):
if whole == 0:
return 0
return int(part / whole * 100.0)
- with open(self.markdown_output, "w", newline="\n", encoding='utf-8') as status_file:
- status_file.write(f'### Localization files status ({datetime.datetime.now().strftime("%Y-%m-%d %H:%M")} - '
- f'Branch `{Git().get_current_branch()}` `{Git().get_current_hash_short()}`)\n\n')
+ with codecs.open(self.markdown_output, "w", encoding="UTF-8") as status_file:
+ status_file.write('### Localization files status (' + datetime.datetime.now().strftime(
+ "%Y-%m-%d %H:%M") + ' - Branch `' + Git().get_current_branch() + '` `' + Git().get_current_hash_short() + '`)\n\n')
status_file.write('Note: To get the current status from your local repository, run `python ./scripts/syncLang.py markdown`\n')
_write_properties(status_file, self.__all_menu_properties())
_write_properties(status_file, self.__all_jabref_properties())
- logging.info(f'Current status written to {self.markdown_output}')
+ logging.info('Current status written to ' + self.markdown_output)
if '__main__' == __name__:
diff --git a/src/main/java/org/jabref/JabRefMain.java b/src/main/java/org/jabref/JabRefMain.java
index be386b1dc8c..428fdd5cdd6 100644
--- a/src/main/java/org/jabref/JabRefMain.java
+++ b/src/main/java/org/jabref/JabRefMain.java
@@ -3,6 +3,8 @@
import java.net.Authenticator;
import java.util.Map;
+import javax.swing.JFrame;
+import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
import javafx.application.Application;
@@ -24,6 +26,8 @@
import org.jabref.logic.protectedterms.ProtectedTermsLoader;
import org.jabref.logic.remote.RemotePreferences;
import org.jabref.logic.remote.client.RemoteListenerClient;
+import org.jabref.logic.util.BuildInfo;
+import org.jabref.logic.util.JavaVersion;
import org.jabref.logic.util.OS;
import org.jabref.migrations.PreferencesMigrations;
import org.jabref.model.EntryTypes;
@@ -53,11 +57,55 @@ public void start(Stage mainStage) throws Exception {
SwingUtilities.invokeLater(() -> start(arguments));
}
+ /**
+ * Tests if we are running an acceptable Java and terminates JabRef when we are sure the version is not supported.
+ * This test uses the requirements for the Java version as specified in gradle.build. It is possible to
+ * define a minimum version including the built number and to indicate whether Java 9 can be use (which it currently
+ * can't). It tries to compare this version number to the version of the currently running JVM. The check is
+ * optimistic and will rather return true even if we could not exactly determine the version.
+ *
+ * Note: Users with an very old version like 1.6 will not profit from this since class versions are incompatible and
+ * JabRef won't even start. Currently, JabRef won't start with Java 9 either, but the warning that it cannot be used
+ * with this version is helpful anyway to prevent users to update from an old 1.8 directly to version 9. Additionally,
+ * we soon might have a JabRef that does start with Java 9 but is not perfectly compatible. Therefore, we should leave
+ * the Java 9 check alive.
+ */
+ private static void ensureCorrectJavaVersion() {
+ // Check if we are running an acceptable version of Java
+ final BuildInfo buildInfo = Globals.BUILD_INFO;
+ JavaVersion checker = new JavaVersion();
+ final boolean java9Fail = !buildInfo.isAllowJava9() && checker.isJava9();
+ final boolean versionFail = !checker.isAtLeast(buildInfo.getMinRequiredJavaVersion());
+
+ if (java9Fail || versionFail) {
+ StringBuilder versionError = new StringBuilder(
+ Localization.lang("Your current Java version (%0) is not supported. Please install version %1 or higher.",
+ checker.getJavaVersion(),
+ buildInfo.getMinRequiredJavaVersion()
+ )
+ );
+ if (!buildInfo.isAllowJava9()) {
+ versionError.append("\n");
+ versionError.append(Localization.lang("Note that currently, JabRef does not run with Java 9."));
+ }
+ final JFrame frame = new JFrame();
+ JOptionPane.showMessageDialog(frame, versionError, Localization.lang("Error"), JOptionPane.ERROR_MESSAGE);
+ frame.dispose();
+
+ // We exit on Java 9 error since this will definitely not work
+ if (java9Fail) {
+ System.exit(0);
+ }
+ }
+ }
+
private static void start(String[] args) {
FallbackExceptionHandler.installExceptionHandler();
JabRefPreferences preferences = JabRefPreferences.getInstance();
+ ensureCorrectJavaVersion();
+
ProxyPreferences proxyPreferences = preferences.getProxyPreferences();
ProxyRegisterer.register(proxyPreferences);
if (proxyPreferences.isUseProxy() && proxyPreferences.isUseAuthentication()) {
diff --git a/src/main/java/org/jabref/gui/EntryTypeDialog.java b/src/main/java/org/jabref/gui/EntryTypeDialog.java
index 7a082facf61..9879ebb75fd 100644
--- a/src/main/java/org/jabref/gui/EntryTypeDialog.java
+++ b/src/main/java/org/jabref/gui/EntryTypeDialog.java
@@ -216,7 +216,7 @@ private JPanel createIdFetcherPanel() {
constraints.fill = GridBagConstraints.NONE;
jPanel.add(generateButton, constraints);
- jPanel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), Localization.lang("ID-based_entry_generator")));
+ jPanel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), Localization.lang("ID-based entry generator")));
SwingUtilities.invokeLater(() -> idTextField.requestFocus());
diff --git a/src/main/java/org/jabref/gui/actions/MassSetFieldAction.java b/src/main/java/org/jabref/gui/actions/MassSetFieldAction.java
index 0c01238ce53..6743657960a 100644
--- a/src/main/java/org/jabref/gui/actions/MassSetFieldAction.java
+++ b/src/main/java/org/jabref/gui/actions/MassSetFieldAction.java
@@ -53,28 +53,32 @@ public class MassSetFieldAction extends MnemonicAwareAction {
private JRadioButton selected;
private JRadioButton clear;
private JRadioButton set;
+ private JRadioButton append;
private JRadioButton rename;
private JComboBox field;
- private JTextField text;
- private JTextField renameTo;
+ private JTextField textFieldSet;
+ private JTextField textFieldAppend;
+ private JTextField textFieldRename;
private boolean canceled = true;
private JCheckBox overwrite;
public MassSetFieldAction(JabRefFrame frame) {
- putValue(Action.NAME, Localization.menuTitle("Set/clear/rename fields") + "...");
+ putValue(Action.NAME, Localization.menuTitle("Set/clear/append/rename fields") + "...");
this.frame = frame;
}
private void createDialog() {
- diag = new JDialog(frame, Localization.lang("Set/clear/rename fields"), true);
+ diag = new JDialog(frame, Localization.lang("Set/clear/append/rename fields"), true);
field = new JComboBox<>();
field.setEditable(true);
- text = new JTextField();
- text.setEnabled(false);
- renameTo = new JTextField();
- renameTo.setEnabled(false);
+ textFieldSet = new JTextField();
+ textFieldSet.setEnabled(false);
+ textFieldAppend = new JTextField();
+ textFieldAppend.setEnabled(false);
+ textFieldRename = new JTextField();
+ textFieldRename.setEnabled(false);
JButton ok = new JButton(Localization.lang("OK"));
JButton cancel = new JButton(Localization.lang("Cancel"));
@@ -83,6 +87,7 @@ private void createDialog() {
selected = new JRadioButton(Localization.lang("Selected entries"));
clear = new JRadioButton(Localization.lang("Clear fields"));
set = new JRadioButton(Localization.lang("Set fields"));
+ append = new JRadioButton(Localization.lang("Append to fields"));
rename = new JRadioButton(Localization.lang("Rename field to") + ":");
rename.setToolTipText(Localization.lang("Move contents of a field into a field with a different name"));
@@ -93,16 +98,23 @@ private void createDialog() {
}
set.addChangeListener(e ->
- // Entering a text is only relevant if we are setting, not clearing:
- text.setEnabled(set.isSelected()));
+ // Entering a setText is only relevant if we are setting, not clearing:
+ textFieldSet.setEnabled(set.isSelected()));
+
+ append.addChangeListener(e -> {
+ // Text to append is only required if we are appending:
+ textFieldAppend.setEnabled(append.isSelected());
+ // Overwrite protection makes no sense if we are appending to a field:
+ overwrite.setEnabled(!clear.isSelected() && !append.isSelected());
+ });
clear.addChangeListener(e ->
- // Overwrite protection makes no sense if we are clearing the field:
- overwrite.setEnabled(!clear.isSelected()));
+ // Overwrite protection makes no sense if we are clearing the field:
+ overwrite.setEnabled(!clear.isSelected() && !append.isSelected()));
rename.addChangeListener(e ->
- // Entering a text is only relevant if we are renaming
- renameTo.setEnabled(rename.isSelected()));
+ // Entering a setText is only relevant if we are renaming
+ textFieldRename.setEnabled(rename.isSelected()));
overwrite = new JCheckBox(Localization.lang("Overwrite existing field values"), true);
ButtonGroup bg = new ButtonGroup();
@@ -111,9 +123,10 @@ private void createDialog() {
bg = new ButtonGroup();
bg.add(clear);
bg.add(set);
+ bg.add(append);
bg.add(rename);
FormBuilder builder = FormBuilder.create().layout(new FormLayout(
- "left:pref, 4dlu, fill:100dlu:grow", "pref, 2dlu, pref, 2dlu, pref, 2dlu, pref, 2dlu, pref, 2dlu, pref, 2dlu, pref, 2dlu, pref, 2dlu, pref, 2dlu, pref"));
+ "left:pref, 4dlu, fill:100dlu:grow", "pref, 2dlu, pref, 2dlu, pref, 2dlu, pref, 2dlu, pref, 2dlu, pref, 2dlu, pref, 2dlu, pref, 2dlu, pref, 2dlu, pref, 2dlu, pref"));
builder.addSeparator(Localization.lang("Field name")).xyw(1, 1, 3);
builder.add(Localization.lang("Field name")).xy(1, 3);
builder.add(field).xy(3, 3);
@@ -122,11 +135,13 @@ private void createDialog() {
builder.add(selected).xyw(1, 9, 3);
builder.addSeparator(Localization.lang("New field value")).xyw(1, 11, 3);
builder.add(set).xy(1, 13);
- builder.add(text).xy(3, 13);
+ builder.add(textFieldSet).xy(3, 13);
builder.add(clear).xyw(1, 15, 3);
- builder.add(rename).xy(1, 17);
- builder.add(renameTo).xy(3, 17);
- builder.add(overwrite).xyw(1, 19, 3);
+ builder.add(append).xy(1, 17);
+ builder.add(textFieldAppend).xy(3, 17);
+ builder.add(rename).xy(1, 19);
+ builder.add(textFieldRename).xy(3, 19);
+ builder.add(overwrite).xyw(1, 21, 3);
ButtonBarBuilder bb = new ButtonBarBuilder();
bb.addGlue();
@@ -219,31 +234,36 @@ public void actionPerformed(ActionEvent e) {
} else {
entryList = entries;
}
- String toSet = text.getText();
+
+ String toSet = textFieldSet.getText();
if (toSet.isEmpty()) {
toSet = null;
}
String[] fields = getFieldNames(((String) field.getSelectedItem()).trim().toLowerCase(Locale.ROOT));
- NamedCompound ce = new NamedCompound(Localization.lang("Set field"));
+ NamedCompound compoundEdit = new NamedCompound(Localization.lang("Set field"));
if (rename.isSelected()) {
if (fields.length > 1) {
JOptionPane.showMessageDialog(diag, Localization.lang("You can only rename one field at a time"), "",
JOptionPane.ERROR_MESSAGE);
return; // Do not close the dialog.
} else {
- ce.addEdit(MassSetFieldAction.massRenameField(entryList, fields[0], renameTo.getText(),
+ compoundEdit.addEdit(MassSetFieldAction.massRenameField(entryList, fields[0], textFieldRename.getText(),
overwrite.isSelected()));
}
+ } else if (append.isSelected()) {
+ for (String field : fields) {
+ compoundEdit.addEdit(MassSetFieldAction.massAppendField(entryList, field, textFieldAppend.getText()));
+ }
} else {
- for (String field1 : fields) {
- ce.addEdit(MassSetFieldAction.massSetField(entryList, field1,
+ for (String field : fields) {
+ compoundEdit.addEdit(MassSetFieldAction.massSetField(entryList, field,
set.isSelected() ? toSet : null,
overwrite.isSelected()));
}
}
- ce.end();
- bp.getUndoManager().addEdit(ce);
+ compoundEdit.end();
+ bp.getUndoManager().addEdit(compoundEdit);
bp.markBaseChanged();
}
@@ -253,31 +273,58 @@ public void actionPerformed(ActionEvent e) {
*
* @param entries The entries to set the field for.
* @param field The name of the field to set.
- * @param text The value to set. This value can be null, indicating that the field should be cleared.
+ * @param textToSet The value to set. This value can be null, indicating that the field should be cleared.
* @param overwriteValues Indicate whether the value should be set even if an entry already has the field set.
* @return A CompoundEdit for the entire operation.
*/
- private static UndoableEdit massSetField(Collection entries, String field, String text,
+ private static UndoableEdit massSetField(Collection entries, String field, String textToSet,
boolean overwriteValues) {
- NamedCompound ce = new NamedCompound(Localization.lang("Set field"));
+ NamedCompound compoundEdit = new NamedCompound(Localization.lang("Set field"));
for (BibEntry entry : entries) {
- Optional oldVal = entry.getField(field);
+ Optional oldValue = entry.getField(field);
// If we are not allowed to overwrite values, check if there is a
// nonempty
// value already for this entry:
- if (!overwriteValues && (oldVal.isPresent()) && !oldVal.get().isEmpty()) {
+ if (!overwriteValues && (oldValue.isPresent()) && !oldValue.get().isEmpty()) {
continue;
}
- if (text == null) {
+ if (textToSet == null) {
entry.clearField(field);
} else {
- entry.setField(field, text);
+ entry.setField(field, textToSet);
}
- ce.addEdit(new UndoableFieldChange(entry, field, oldVal.orElse(null), text));
+ compoundEdit.addEdit(new UndoableFieldChange(entry, field, oldValue.orElse(null), textToSet));
+ }
+ compoundEdit.end();
+ return compoundEdit;
+ }
+
+ /**
+ * Append a given value to a given field for all entries in a Collection. This method DOES NOT update any UndoManager,
+ * but returns a relevant CompoundEdit that should be registered by the caller.
+ *
+ * @param entries The entries to process the operation for.
+ * @param field The name of the field to append to.
+ * @param textToAppend The value to set. A null in this case will simply preserve the current field state.
+ * @return A CompoundEdit for the entire operation.
+ */
+ private static UndoableEdit massAppendField(Collection entries, String field, String textToAppend) {
+
+ String newValue = "";
+
+ if (textToAppend != null) {
+ newValue = textToAppend;
+ }
+
+ NamedCompound compoundEdit = new NamedCompound(Localization.lang("Append field"));
+ for (BibEntry entry : entries) {
+ Optional oldValue = entry.getField(field);
+ entry.setField(field, oldValue.orElse("") + newValue);
+ compoundEdit.addEdit(new UndoableFieldChange(entry, field, oldValue.orElse(null), newValue));
}
- ce.end();
- return ce;
+ compoundEdit.end();
+ return compoundEdit;
}
/**
@@ -292,7 +339,7 @@ private static UndoableEdit massSetField(Collection entries, String fi
*/
private static UndoableEdit massRenameField(Collection entries, String field, String newField,
boolean overwriteValues) {
- NamedCompound ce = new NamedCompound(Localization.lang("Rename field"));
+ NamedCompound compoundEdit = new NamedCompound(Localization.lang("Rename field"));
for (BibEntry entry : entries) {
Optional valToMove = entry.getField(field);
// If there is no value, do nothing:
@@ -307,12 +354,12 @@ private static UndoableEdit massRenameField(Collection entries, String
}
entry.setField(newField, valToMove.get());
- ce.addEdit(new UndoableFieldChange(entry, newField, valInNewField.orElse(null), valToMove.get()));
+ compoundEdit.addEdit(new UndoableFieldChange(entry, newField, valInNewField.orElse(null), valToMove.get()));
entry.clearField(field);
- ce.addEdit(new UndoableFieldChange(entry, field, valToMove.get(), null));
+ compoundEdit.addEdit(new UndoableFieldChange(entry, field, valToMove.get(), null));
}
- ce.end();
- return ce;
+ compoundEdit.end();
+ return compoundEdit;
}
private static String[] getFieldNames(String s) {
diff --git a/src/main/java/org/jabref/gui/customentrytypes/EntryCustomizationDialog.java b/src/main/java/org/jabref/gui/customentrytypes/EntryCustomizationDialog.java
index 5005644c299..ef63583e117 100644
--- a/src/main/java/org/jabref/gui/customentrytypes/EntryCustomizationDialog.java
+++ b/src/main/java/org/jabref/gui/customentrytypes/EntryCustomizationDialog.java
@@ -8,7 +8,7 @@
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
-import java.util.Arrays;
+import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
@@ -54,21 +54,17 @@ public class EntryCustomizationDialog extends JabRefDialog implements ListSelect
protected GridBagLayout gbl = new GridBagLayout();
protected GridBagConstraints con = new GridBagConstraints();
- protected JButton helpButton;
protected JButton delete;
private final JabRefFrame frame;
private FieldSetComponent reqComp;
private FieldSetComponent optComp;
private FieldSetComponent optComp2;
private EntryTypeList typeComp;
- private JButton ok;
- private JButton cancel;
- private JButton apply;
private final List preset = InternalBibtexFields.getAllPublicFieldNames();
private String lastSelected;
- private final Map> reqLists = new HashMap<>();
- private final Map> optLists = new HashMap<>();
- private final Map> opt2Lists = new HashMap<>();
+ private final Map> reqLists = new HashMap<>();
+ private final Map> optLists = new HashMap<>();
+ private final Map> opt2Lists = new HashMap<>();
private final Set defaulted = new HashSet<>();
private final Set changed = new HashSet<>();
@@ -103,9 +99,7 @@ private void initGui() {
right.setLayout(new GridLayout(biblatexMode ? 2 : 1, 2));
List entryTypes = new ArrayList<>();
- for (String s : EntryTypes.getAllTypes(bibDatabaseMode)) {
- entryTypes.add(s);
- }
+ entryTypes.addAll(EntryTypes.getAllTypes(bibDatabaseMode));
typeComp = new EntryTypeList(entryTypes, bibDatabaseMode);
typeComp.addListSelectionListener(this);
@@ -137,9 +131,9 @@ private void initGui() {
//right.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), Globals.lang("Fields")));
right.setBorder(BorderFactory.createEtchedBorder());
- ok = new JButton(Localization.lang("OK"));
- cancel = new JButton(Localization.lang("Cancel"));
- apply = new JButton(Localization.lang("Apply"));
+ JButton ok = new JButton(Localization.lang("OK"));
+ JButton cancel = new JButton(Localization.lang("Cancel"));
+ JButton apply = new JButton(Localization.lang("Apply"));
ok.addActionListener(e -> {
applyChanges();
dispose();
@@ -198,17 +192,17 @@ public void valueChanged(ListSelectionEvent e) {
if (selectedTypeName == null) {
return;
}
- List requiredFieldsSelectedType = reqLists.get(selectedTypeName);
+ Set requiredFieldsSelectedType = reqLists.get(selectedTypeName);
if (requiredFieldsSelectedType == null) {
Optional type = EntryTypes.getType(selectedTypeName, bibDatabaseMode);
if (type.isPresent()) {
- List req = type.get().getRequiredFields();
+ Set req = type.get().getRequiredFields();
- List opt;
+ Set opt;
if (biblatexMode) {
opt = type.get().getPrimaryOptionalFields();
- List opt2 = type.get().getSecondaryOptionalFields();
+ Set opt2 = type.get().getSecondaryOptionalFields();
optComp2.setFields(opt2);
optComp2.setEnabled(true);
@@ -221,12 +215,12 @@ public void valueChanged(ListSelectionEvent e) {
optComp.setEnabled(true);
} else {
// New entry
- reqComp.setFields(new ArrayList<>());
+ reqComp.setFields(new HashSet<>());
reqComp.setEnabled(true);
- optComp.setFields(new ArrayList<>());
+ optComp.setFields(new HashSet<>());
optComp.setEnabled(true);
if (biblatexMode) {
- optComp2.setFields(new ArrayList<>());
+ optComp2.setFields(new HashSet<>());
optComp2.setEnabled(true);
}
reqComp.requestFocus();
@@ -249,18 +243,18 @@ private void applyChanges() {
List actuallyChangedTypes = new ArrayList<>();
// Iterate over our map of required fields, and list those types if necessary:
- List types = typeComp.getFields();
- for (Map.Entry> stringListEntry : reqLists.entrySet()) {
+ Set types = typeComp.getFields();
+ for (Map.Entry> stringListEntry : reqLists.entrySet()) {
if (!types.contains(stringListEntry.getKey())) {
continue;
}
- List requiredFieldsList = stringListEntry.getValue();
- List optionalFieldsList = optLists.get(stringListEntry.getKey());
- List secondaryOptionalFieldsLists = opt2Lists.get(stringListEntry.getKey());
+ Set requiredFieldsList = stringListEntry.getValue();
+ Set optionalFieldsList = optLists.get(stringListEntry.getKey());
+ Set secondaryOptionalFieldsLists = opt2Lists.get(stringListEntry.getKey());
if (secondaryOptionalFieldsLists == null) {
- secondaryOptionalFieldsLists = new ArrayList<>(0);
+ secondaryOptionalFieldsLists = new HashSet<>(0);
}
// If this type is already existing, check if any changes have
@@ -278,16 +272,16 @@ private void applyChanges() {
Optional oldType = EntryTypes.getType(stringListEntry.getKey(), bibDatabaseMode);
if (oldType.isPresent()) {
- List oldRequiredFieldsList = oldType.get().getRequiredFieldsFlat();
- List oldOptionalFieldsList = oldType.get().getOptionalFields();
+ Set oldRequiredFieldsList = oldType.get().getRequiredFieldsFlat();
+ Set oldOptionalFieldsList = oldType.get().getOptionalFields();
if (biblatexMode) {
- List oldPrimaryOptionalFieldsLists = oldType.get().getPrimaryOptionalFields();
- List oldSecondaryOptionalFieldsList = oldType.get().getSecondaryOptionalFields();
- if (equalLists(oldRequiredFieldsList, requiredFieldsList) && equalLists(oldPrimaryOptionalFieldsLists, optionalFieldsList) &&
- equalLists(oldSecondaryOptionalFieldsList, secondaryOptionalFieldsLists)) {
+ Set oldPrimaryOptionalFieldsLists = oldType.get().getPrimaryOptionalFields();
+ Set oldSecondaryOptionalFieldsList = oldType.get().getSecondaryOptionalFields();
+ if (oldRequiredFieldsList.equals(requiredFieldsList) && oldPrimaryOptionalFieldsLists.equals(optionalFieldsList) &&
+ oldSecondaryOptionalFieldsList.equals(secondaryOptionalFieldsLists)) {
changesMade = false;
}
- } else if (equalLists(oldRequiredFieldsList, requiredFieldsList) && equalLists(oldOptionalFieldsList, optionalFieldsList)) {
+ } else if (oldRequiredFieldsList.equals(requiredFieldsList) && oldOptionalFieldsList.equals(optionalFieldsList)) {
changesMade = false;
}
}
@@ -342,7 +336,7 @@ private void deleteType(String name) {
}
}
EntryTypes.removeType(name, bibDatabaseMode);
- updateEntriesForChangedTypes(Arrays.asList(name.toLowerCase(Locale.ENGLISH)));
+ updateEntriesForChangedTypes(Collections.singletonList(name.toLowerCase(Locale.ENGLISH)));
changed.remove(name);
reqLists.remove(name);
optLists.remove(name);
@@ -352,26 +346,6 @@ private void deleteType(String name) {
}
}
- private static boolean equalLists(List one, List two) {
- if ((one == null) && (two == null)) {
- return true; // Both null.
- }
- if ((one == null) || (two == null)) {
- return false; // One of them null, the other not.
- }
- if (one.size() != two.size()) {
- return false; // Different length.
- }
- // If we get here, we know that both are non-null, and that they have the same length.
- for (int i = 0; i < one.size(); i++) {
- if (!one.get(i).equals(two.get(i))) {
- return false;
- }
- }
- // If we get here, all entries have matched.
- return true;
- }
-
private void updateEntriesForChangedTypes(List actuallyChangedTypes) {
for (BasePanel bp : frame.getBasePanelList()) {
// get all affected entries
@@ -403,10 +377,10 @@ public void actionPerformed(ActionEvent e) {
Optional type = EntryTypes.getStandardType(lastSelected, bibDatabaseMode);
if (type.isPresent()) {
- List of = type.get().getOptionalFields();
- List req = type.get().getRequiredFields();
- List opt1 = new ArrayList<>();
- List opt2 = new ArrayList<>();
+ Set of = type.get().getOptionalFields();
+ Set req = type.get().getRequiredFields();
+ Set opt1 = new HashSet<>();
+ Set opt2 = new HashSet<>();
if (!(of.isEmpty())) {
if (biblatexMode) {
diff --git a/src/main/java/org/jabref/gui/customentrytypes/FieldSetComponent.java b/src/main/java/org/jabref/gui/customentrytypes/FieldSetComponent.java
index b65f477db5e..f7d17f4a95b 100644
--- a/src/main/java/org/jabref/gui/customentrytypes/FieldSetComponent.java
+++ b/src/main/java/org/jabref/gui/customentrytypes/FieldSetComponent.java
@@ -9,9 +9,9 @@
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
-import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashSet;
+import java.util.LinkedHashSet;
import java.util.List;
import java.util.Locale;
import java.util.Set;
@@ -217,16 +217,16 @@ public void setEnabled(boolean en) {
remove.setEnabled(en);
}
- public void setFields(List fields) {
- DefaultListModel newListModel = new DefaultListModel<>();
- for (String field : fields) {
- newListModel.addElement(field);
- }
- this.listModel = newListModel;
- for (ListDataListener modelListener : modelListeners) {
- newListModel.addListDataListener(modelListener);
+ /**
+ * Return the current list.
+ */
+ public Set getFields() {
+ Set res = new LinkedHashSet<>(listModel.getSize());
+ Enumeration elements = listModel.elements();
+ while (elements.hasMoreElements()) {
+ res.add(elements.nextElement());
}
- list.setModel(newListModel);
+ return res;
}
/**
@@ -279,16 +279,16 @@ protected void removeSelected() {
}
- /**
- * Return the current list.
- */
- public List getFields() {
- List res = new ArrayList<>(listModel.getSize());
- Enumeration elements = listModel.elements();
- while (elements.hasMoreElements()) {
- res.add(elements.nextElement());
+ public void setFields(Set fields) {
+ DefaultListModel newListModel = new DefaultListModel<>();
+ for (String field : fields) {
+ newListModel.addElement(field);
}
- return res;
+ this.listModel = newListModel;
+ for (ListDataListener modelListener : modelListeners) {
+ newListModel.addListDataListener(modelListener);
+ }
+ list.setModel(newListModel);
}
/**
diff --git a/src/main/java/org/jabref/gui/entryeditor/DeprecatedFieldsTab.java b/src/main/java/org/jabref/gui/entryeditor/DeprecatedFieldsTab.java
index 4be110c1bc6..87279266213 100644
--- a/src/main/java/org/jabref/gui/entryeditor/DeprecatedFieldsTab.java
+++ b/src/main/java/org/jabref/gui/entryeditor/DeprecatedFieldsTab.java
@@ -1,6 +1,6 @@
package org.jabref.gui.entryeditor;
-import java.util.List;
+import java.util.Collection;
import javafx.scene.control.Tooltip;
@@ -21,7 +21,7 @@ public DeprecatedFieldsTab(BibDatabaseContext databaseContext, SuggestionProvide
}
@Override
- protected List determineFieldsToShow(BibEntry entry, EntryType entryType) {
+ protected Collection determineFieldsToShow(BibEntry entry, EntryType entryType) {
return entryType.getDeprecatedFields();
}
}
diff --git a/src/main/java/org/jabref/gui/entryeditor/FieldsEditorTab.java b/src/main/java/org/jabref/gui/entryeditor/FieldsEditorTab.java
index bfedb7a6b5f..e9f89a48cb0 100644
--- a/src/main/java/org/jabref/gui/entryeditor/FieldsEditorTab.java
+++ b/src/main/java/org/jabref/gui/entryeditor/FieldsEditorTab.java
@@ -1,6 +1,7 @@
package org.jabref.gui.entryeditor;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
@@ -69,7 +70,7 @@ private Region setupPanel(BibEntry entry, boolean compressed, SuggestionProvider
List