From 93e12d702e1bc65dc5091ac2447bee85f81b518b Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Tue, 29 Mar 2022 01:07:04 +0200 Subject: [PATCH] Merge GitBook view --- ...ss-reviews (2) (2) (2) (2) (2) (3) (1).svg | 4 + ...ructor (1) (2) (2) (2) (2) (2) (3) (1).svg | 4 + ...onfig (1) (3) (3) (4) (4) (3) (11) (1).png | Bin 0 -> 102768 bytes ...onfig (1) (3) (3) (4) (4) (3) (11) (2).png | Bin 0 -> 102768 bytes ...iguration-command-line (2) (2) (3) (1).png | Bin 0 -> 44930 bytes ...iguration-command-line (2) (2) (3) (2).png | Bin 0 -> 44930 bytes docs/.gitbook/assets/layers-v1.svg | 915 ++++++++++++++++++ docs/README.md | 4 +- docs/adr.md | 14 +- docs/advanced-reading/code-quality.md | 7 +- docs/advanced-reading/custom-svg-icons.md | 9 +- docs/advanced-reading/fetchers.md | 8 +- docs/advanced-reading/jpackage.md | 16 +- docs/advanced-reading/remote-storage.md | 1 - docs/advanced-reading/telemetry.md | 6 +- docs/advanced-reading/ui-recommendations.md | 7 +- docs/contributing.md | 2 +- docs/getting-into-the-code/code-howtos.md | 208 ++-- .../development-strategy.md | 2 +- ...elines-for-setting-up-a-local-workspace.md | 16 +- .../high-level-documentation.md | 11 +- docs/getting-into-the-code/testing.md | 11 +- docs/openoffice/README.md | 3 +- docs/openoffice/code-reorganization.md | 238 ++--- docs/openoffice/order-of-appearance.md | 109 +-- docs/openoffice/overview.md | 389 +++----- docs/openoffice/problems.md | 130 +-- docs/readings-on-coding/javafx.md | 18 +- docs/readings-on-coding/tools.md | 25 +- docs/teaching.md | 10 +- 30 files changed, 1429 insertions(+), 738 deletions(-) create mode 100644 docs/.gitbook/assets/contribution-process-reviews (2) (2) (2) (2) (2) (3) (1).svg create mode 100644 docs/.gitbook/assets/contribution-process-reviews-with-instructor (1) (2) (2) (2) (2) (2) (3) (1).svg create mode 100644 docs/.gitbook/assets/eclipse-create-run-config (1) (3) (3) (4) (4) (3) (11) (1).png create mode 100644 docs/.gitbook/assets/eclipse-create-run-config (1) (3) (3) (4) (4) (3) (11) (2).png create mode 100644 docs/.gitbook/assets/intellij-run-configuration-command-line (2) (2) (3) (1).png create mode 100644 docs/.gitbook/assets/intellij-run-configuration-command-line (2) (2) (3) (2).png create mode 100644 docs/.gitbook/assets/layers-v1.svg diff --git a/docs/.gitbook/assets/contribution-process-reviews (2) (2) (2) (2) (2) (3) (1).svg b/docs/.gitbook/assets/contribution-process-reviews (2) (2) (2) (2) (2) (3) (1).svg new file mode 100644 index 00000000000..39951a21137 --- /dev/null +++ b/docs/.gitbook/assets/contribution-process-reviews (2) (2) (2) (2) (2) (3) (1).svg @@ -0,0 +1,4 @@ + + + +ContributorCreate ContributionSubmit ContributionUpdate CodeComment Pull RequestJabRef TeamFrist DeveloperSecond DeveloperProvide FeedbackReview CodeProvide FeedbackReview CodeRequest ChangesMerge Pull ReuquestQuality OKQuality does not meet JabRef's requirementsQuality does not meet JabRef's requirementsPull Request incomingQuality OK`?Quality OK?Quality OKEverything OKChanges Requested \ No newline at end of file diff --git a/docs/.gitbook/assets/contribution-process-reviews-with-instructor (1) (2) (2) (2) (2) (2) (3) (1).svg b/docs/.gitbook/assets/contribution-process-reviews-with-instructor (1) (2) (2) (2) (2) (2) (3) (1).svg new file mode 100644 index 00000000000..7e196fe5e1a --- /dev/null +++ b/docs/.gitbook/assets/contribution-process-reviews-with-instructor (1) (2) (2) (2) (2) (2) (3) (1).svg @@ -0,0 +1,4 @@ + + + +ContributorPrepare SubmissionSubmit and Refine ContributionJabRef TeamCheck, Support,and MergeInstructorReview and Support Submission \ No newline at end of file diff --git a/docs/.gitbook/assets/eclipse-create-run-config (1) (3) (3) (4) (4) (3) (11) (1).png b/docs/.gitbook/assets/eclipse-create-run-config (1) (3) (3) (4) (4) (3) (11) (1).png new file mode 100644 index 0000000000000000000000000000000000000000..1412291a55af3fab85dd1830d9fe23e88d636372 GIT binary patch literal 102768 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 Lsa$;3Jm`M_YN^F3 literal 0 HcmV?d00001 diff --git a/docs/.gitbook/assets/eclipse-create-run-config (1) (3) (3) (4) (4) (3) (11) (2).png b/docs/.gitbook/assets/eclipse-create-run-config (1) (3) (3) (4) (4) (3) (11) (2).png new file mode 100644 index 0000000000000000000000000000000000000000..1412291a55af3fab85dd1830d9fe23e88d636372 GIT binary patch literal 102768 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 Lsa$;3Jm`M_YN^F3 literal 0 HcmV?d00001 diff --git a/docs/.gitbook/assets/intellij-run-configuration-command-line (2) (2) (3) (1).png b/docs/.gitbook/assets/intellij-run-configuration-command-line (2) (2) (3) (1).png new file mode 100644 index 0000000000000000000000000000000000000000..cc71d5d068e3ecf6d23f981d402819e42bfa3b3f GIT binary patch literal 44930 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 literal 0 HcmV?d00001 diff --git a/docs/.gitbook/assets/intellij-run-configuration-command-line (2) (2) (3) (2).png b/docs/.gitbook/assets/intellij-run-configuration-command-line (2) (2) (3) (2).png new file mode 100644 index 0000000000000000000000000000000000000000..cc71d5d068e3ecf6d23f981d402819e42bfa3b3f GIT binary patch literal 44930 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 literal 0 HcmV?d00001 diff --git a/docs/.gitbook/assets/layers-v1.svg b/docs/.gitbook/assets/layers-v1.svg new file mode 100644 index 00000000000..f9b8239d504 --- /dev/null +++ b/docs/.gitbook/assets/layers-v1.svg @@ -0,0 +1,915 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + document content (UNO) + + frontend + + actions + + OOBibBase2 + + backend + + style + + OOTextIntoOO + + rangesort + data in doc, ranges + order ranges + fill ranges + markup text + XTextDocument + Backend, CitationGroups + + + + GUI: + BibEntry, BibDatabase, OOBibStyle + provides input in terms of these types + + provides connection to doc + Cite, Update, Merge, Separate, Manage, Export + Connect + Load Style + Create OOFrontend instance + Catch exceptions, Undo + Forward requests to actions + Check preconditions + + locations + citation keys + pageInfo + citation type + + + lookup, localOrder, number, + uniqueLetter, sort bibliography, + format citationMarkers, + format bibliography + + + or visually + within XText + + checkRangeOverlaps, checkRangeOverlapsWithCursor + connects the parts below + getVisuallySortedCitationGroups, imposeGlobalOrder + UpdateCitationMarkers, UpdateBibliography + lock screen refresh + GUI-independent part of actions + + + diff --git a/docs/README.md b/docs/README.md index 6ac52b97842..2849ad0d9a3 100644 --- a/docs/README.md +++ b/docs/README.md @@ -17,7 +17,7 @@ For users documentation, please head to [https://docs.jabref.org](https://docs.j ## Teaching Exercises -We are very happy that JabRef is part of [Software Engineering](https://en.wikipedia.org/wiki/Software_engineering) trainings. Please head to [Teaching](teaching.md) for more information on using JabRef as a teaching object and on previous courses where JabRef was used. +We are very happy that JabRef is part of [Software Engineering](https://en.wikipedia.org/wiki/Software\_engineering) trainings. Please head to [Teaching](teaching.md) for more information on using JabRef as a teaching object and on previous courses where JabRef was used. ## Miscellaneous Hints @@ -27,7 +27,7 @@ The package `org.jabref.cli` is responsible for handling the command line option During development, one can configure IntelliJ to pass command line parameters: -![IntelliJ-run-configuration](<.gitbook/assets/intellij-run-configuration-command-line (2) (2) (3).png>) +![IntelliJ-run-configuration](<.gitbook/assets/intellij-run-configuration-command-line (2) (2) (3) (2).png>) Passing command line arguments using gradle is currently not possible as all arguments (such as `-Dfile.encoding=windows-1252`) are passed to the application. diff --git a/docs/adr.md b/docs/adr.md index 254a72256d2..263a652b052 100644 --- a/docs/adr.md +++ b/docs/adr.md @@ -20,12 +20,12 @@ Architectural decisions for JabRef: * [ADR-0015](https://github.com/JabRef/jabref/tree/main/docs/adr/0015-support-an-abstract-query-syntax-for-query-conversion.md) - Query syntax design * [ADR-0016](https://github.com/JabRef/jabref/tree/main/docs/adr/0016-mutable-preferences-objects.md) - Mutable preferences objects * [ADR-0017](https://github.com/JabRef/jabref/tree/main/docs/adr/0017-allow-model-access-logic.md) - Allow org.jabref.model to access org.jabref.logic -* [ADR-0018](adr/0018-use-regular-expression-to-split-multiple-sentence-titles.md) - Use regular expression to split multiple-sentence titles -* [ADR-0019](adr/0019-implement-special-fields-as-seperate-fields.md) - Implement special fields as separate fields -* [ADR-0020](adr/0020-use-Jackson-to-parse-study-yml.md) - Use Jackson to parse study.yml -* [ADR-0021](adr/0021-keep-study-as-a-dto.md) - Keep study as a DTO -* [ADR-0022](adr/0022-remove-stop-words-during-query-transformation.md) - Remove stop words during query transformation -* [ADR-0023](adr/0023-localized-preferences.md) - Localized Preferences -* [ADR-0024](adr/0024-use-/#-as-indicator-for-BibTeX-string-constants.md) - Use `#` as indicator for BibTeX string constants +* [ADR-0018](https://github.com/JabRef/jabref/blob/main/docs/adr/0018-use-regular-expression-to-split-multiple-sentence-titles.md) - Use regular expression to split multiple-sentence titles +* [ADR-0019](https://github.com/JabRef/jabref/blob/main/docs/adr/0019-implement-special-fields-as-seperate-fields.md) - Implement special fields as separate fields +* [ADR-0020](https://github.com/JabRef/jabref/blob/main/docs/adr/0020-use-Jackson-to-parse-study-yml.md) - Use Jackson to parse study.yml +* [ADR-0021](https://github.com/JabRef/jabref/blob/main/docs/adr/0021-keep-study-as-a-dto.md) - Keep study as a DTO +* [ADR-0022](https://github.com/JabRef/jabref/blob/main/docs/adr/0022-remove-stop-words-during-query-transformation.md) - Remove stop words during query transformation +* [ADR-0023](https://github.com/JabRef/jabref/blob/main/docs/adr/0023-localized-preferences.md) - Localized Preferences +* [ADR-0024](https://github.com/JabRef/jabref/blob/main/docs/adr/0024-use-/README.md#-as-indicator-for-BibTeX-string-constants.md) - Use `#` as indicator for BibTeX string constants For new ADRs, please use [template.md](https://github.com/JabRef/jabref/tree/main/docs/adr/template.md) as basis. More information on the used format is available at [https://adr.github.io/madr/](https://adr.github.io/madr/). General information about architectural decision records is available at [https://adr.github.io/](https://adr.github.io). Then add them to the above list. diff --git a/docs/advanced-reading/code-quality.md b/docs/advanced-reading/code-quality.md index 415b8e65372..e9043a05850 100644 --- a/docs/advanced-reading/code-quality.md +++ b/docs/advanced-reading/code-quality.md @@ -2,9 +2,9 @@ We monitor the general source code quality at three places: -* [codacy](https://www.codacy.com/) is a hosted service to monitor code quality. It thereby combines the results of available open source code quality checkers such as [Checkstyle](https://checkstyle.sourceforge.io/) or [PMD](https://pmd.github.io/). The code quality analysis for JabRef is available at [https://app.codacy.com/gh/JabRef/jabref/dashboard](https://app.codacy.com/gh/JabRef/jabref/dashboard), especially the [list of open issues](https://app.codacy.com/gh/JabRef/jabref/issues/index). In case a rule feels wrong, it is most likely a PMD rule. The JabRef team can change the configuration at [https://app.codacy.com/p/306789/patterns/list?engine=9ed24812-b6ee-4a58-9004-0ed183c45b8f](https://app.codacy.com/p/306789/patterns/list?engine=9ed24812-b6ee-4a58-9004-0ed183c45b8f). -* [codecov](https://codecov.io/) is a solution to check code coverage of test cases. The code coverage metrics for JabRef are available at [https://codecov.io/github/JabRef/jabref](https://codecov.io/github/JabRef/jabref). -* [Teamscale](https://www.cqse.eu/de/produkte/teamscale/landing/) is a popular German product analyzing code quality. The analysis results are available at [https://demo.teamscale.com/findings.html\#/jabref/?](https://demo.teamscale.com/findings.html#/jabref/?). +* [codacy](https://www.codacy.com) is a hosted service to monitor code quality. It thereby combines the results of available open source code quality checkers such as [Checkstyle](https://checkstyle.sourceforge.io) or [PMD](https://pmd.github.io). The code quality analysis for JabRef is available at [https://app.codacy.com/gh/JabRef/jabref/dashboard](https://app.codacy.com/gh/JabRef/jabref/dashboard), especially the [list of open issues](https://app.codacy.com/gh/JabRef/jabref/issues/index). In case a rule feels wrong, it is most likely a PMD rule. The JabRef team can change the configuration at [https://app.codacy.com/p/306789/patterns/list?engine=9ed24812-b6ee-4a58-9004-0ed183c45b8f](https://app.codacy.com/p/306789/patterns/list?engine=9ed24812-b6ee-4a58-9004-0ed183c45b8f). +* [codecov](https://codecov.io) is a solution to check code coverage of test cases. The code coverage metrics for JabRef are available at [https://codecov.io/github/JabRef/jabref](https://codecov.io/github/JabRef/jabref). +* [Teamscale](https://www.cqse.eu/de/produkte/teamscale/landing/) is a popular German product analyzing code quality. The analysis results are available at [https://demo.teamscale.com/findings.html#/jabref/?](https://demo.teamscale.com/findings.html#/jabref/?). We strongly recommend to read following two books on code quality: @@ -12,4 +12,3 @@ We strongly recommend to read following two books on code quality: * [Effective Java](https://www.oreilly.com/library/view/effective-java-3rd/9780134686097/) is the standard book for advanced Java programming. Did you know that `enum` is the [recommended way to enforce a singleton instance of a class](https://learning.oreilly.com/library/view/effective-java-3rd/9780134686097/ch2.xhtml#lev3)? Did you know that one should [refer to objects by their interfaces](https://learning.oreilly.com/library/view/effective-java-3rd/9780134686097/ch9.xhtml#lev64)? The principles we follow to ensure high code quality in JabRef is stated at our [Development Strategy](../getting-into-the-code/development-strategy.md). - diff --git a/docs/advanced-reading/custom-svg-icons.md b/docs/advanced-reading/custom-svg-icons.md index 90d0b3214bc..ce2d8ee7f8e 100644 --- a/docs/advanced-reading/custom-svg-icons.md +++ b/docs/advanced-reading/custom-svg-icons.md @@ -1,10 +1,10 @@ # Custom SVG icons -JabRef uses [Material Design Icons](https://materialdesignicons.com/) for most buttons on toolbars and panels. While most required icons are available, some specific ones cannot be found in the standard set, like Vim, Emacs, etc. Although custom icons might not fit the existing icons perfectly in style and level of detail, they will fit much better into JabRef than having a color pixel icon between all Material Design Icons. +JabRef uses [Material Design Icons](https://materialdesignicons.com) for most buttons on toolbars and panels. While most required icons are available, some specific ones cannot be found in the standard set, like Vim, Emacs, etc. Although custom icons might not fit the existing icons perfectly in style and level of detail, they will fit much better into JabRef than having a color pixel icon between all Material Design Icons. ![toolbar](http://i.imgur.com/KlyYrNn.png) -This tutorial aims to describe the process of adding missing icons created in a vector drawing tool like Adobe Illustrator and packing them into a _true type font_ \(TTF\) to fit seamlessly into the JabRef framework. Already existing custom icons will be published \(link is coming soon\) as they need to be repacked as well. +This tutorial aims to describe the process of adding missing icons created in a vector drawing tool like Adobe Illustrator and packing them into a _true type font_ (TTF) to fit seamlessly into the JabRef framework. Already existing custom icons will be published (link is coming soon) as they need to be repacked as well. The process consists of 5 steps: @@ -28,7 +28,7 @@ Unpack the downloaded font-package and copy the `.ttf` file under `fonts` to `sr ## Step 4. Adapt the class `org.jabref.gui.JabRefMaterialDesignIcon` -Inside the font-package will be a CSS file that specifies which icon \(glyph\) is at which code point. If you have ordered them correctly, you newly designed icon\(s\) will be at the end and you can simply append them to `org.jabref.gui.JabRefMaterialDesignIcon`: +Inside the font-package will be a CSS file that specifies which icon (glyph) is at which code point. If you have ordered them correctly, you newly designed icon(s) will be at the end and you can simply append them to `org.jabref.gui.JabRefMaterialDesignIcon`: ```java TEX_STUDIO("\ue900"), @@ -43,9 +43,8 @@ Inside the font-package will be a CSS file that specifies which icon \(glyph\) i ## Step 5. Adapt the class `org.jabref.gui.IconTheme` -If you added an icon that already existed \(but not as flat Material Design Icon\), then you need to change the appropriate line in `org.jabref.gui.IconTheme`, where the icon is assigned. If you created a new one, then you need to add a line. You can specify the icon like this: +If you added an icon that already existed (but not as flat Material Design Icon), then you need to change the appropriate line in `org.jabref.gui.IconTheme`, where the icon is assigned. If you created a new one, then you need to add a line. You can specify the icon like this: ```java APPLICATION_EMACS(JabRefMaterialDesignIcon.EMACS) ``` - diff --git a/docs/advanced-reading/fetchers.md b/docs/advanced-reading/fetchers.md index 0540e391050..76e85eeed32 100644 --- a/docs/advanced-reading/fetchers.md +++ b/docs/advanced-reading/fetchers.md @@ -31,11 +31,11 @@ There are more fetchers supported by JabRef. Investigate the package `org.jabref ### Trust Levels -* `SOURCE `(highest): definitive URL for a particular paper +* `SOURCE` (highest): definitive URL for a particular paper * `PUBLISHER`: any publisher library * `PREPRINT`: any preprint library that might include non final publications of a paper * `META_SEARCH`: meta search engines -* `UNKNOWN `(lowest): anything else not fitting the above categories +* `UNKNOWN` (lowest): anything else not fitting the above categories ### Current trust levels @@ -46,9 +46,9 @@ All fetchers are contained in the package `org.jabref.logic.importer.fetcher`. H * Springer: Publisher * ACS: Publisher * IEEE: Publisher -* Google Scholar: META_SEARCH, because it is a search engine +* Google Scholar: META\_SEARCH, because it is a search engine * Arxiv: PREPRINT, because preprints are published there -* OpenAccessDOI: META_SEARCH +* OpenAccessDOI: META\_SEARCH Reasoning: diff --git a/docs/advanced-reading/jpackage.md b/docs/advanced-reading/jpackage.md index cb12ad25225..85737242d55 100644 --- a/docs/advanced-reading/jpackage.md +++ b/docs/advanced-reading/jpackage.md @@ -4,10 +4,10 @@ JabRef uses [jpackage](https://docs.oracle.com/en/java/javase/14/jpackage/) to b ## Build Windows binaries locally -Preparation: Install [WiX Toolset](https://wixtoolset.org/) +Preparation: Install [WiX Toolset](https://wixtoolset.org) 1. Open administrative shell -2. Use [Chocolatey](https://chocolatey.org/) to install it: `choco install wixtoolset` +2. Use [Chocolatey](https://chocolatey.org) to install it: `choco install wixtoolset` Create the application image: @@ -24,14 +24,12 @@ Sometimes issues with modularity only arise in the installed version and do not ### Debugging on Windows 1. Open `build.gradle`, under jlink options remove `--strip-debug` -2. Build using `jpackageImage` \(or let the CI build a new version\) -3. Modify the `build\image\JabRef\runtime\bin\Jabref.bat` file, replace the last line with - - ```text - pushd %DIR% & %JAVA_EXEC% -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=8000,suspend=n -p "%~dp0/../app" -m org.jabref/org.jabref.gui.JabRefLauncher %* & popd - ``` +2. Build using `jpackageImage` (or let the CI build a new version) +3. Modify the `build\image\JabRef\runtime\bin\Jabref.bat` file, replace the last line with + ``` + pushd %DIR% & %JAVA_EXEC% -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=8000,suspend=n -p "%~dp0/../app" -m org.jabref/org.jabref.gui.JabRefLauncher %* & popd + ``` 4. Open your IDE and add a "Remote Debugging Configuration" for `localhost:8000` 5. Start JabRef by running the above bat file 6. Connect with your IDE using remote debugging - diff --git a/docs/advanced-reading/remote-storage.md b/docs/advanced-reading/remote-storage.md index abc255b36db..fab530ede6e 100644 --- a/docs/advanced-reading/remote-storage.md +++ b/docs/advanced-reading/remote-storage.md @@ -15,4 +15,3 @@ Remaining changes that has not been synchronized yet are saved at closing the da * `pullChanges` synchronizes the database unconditionally. * `pullLastEntryChanges` synchronizes only if there are remaining entry changes. It is invoked when closing the shared database (`closeSharedDatabase`). - diff --git a/docs/advanced-reading/telemetry.md b/docs/advanced-reading/telemetry.md index 123e0fe4495..21b8ec50dac 100644 --- a/docs/advanced-reading/telemetry.md +++ b/docs/advanced-reading/telemetry.md @@ -2,10 +2,8 @@ JabRef aims for improving user experience. For that, it employs telemetry and, for instance, checks for used features. -The pull requests introducing the first version was . -Self-hosted alternative [Matomo Java Tracker](https://github.com/matomo-org/matomo-java-tracker) where neglected, because the JabRef team currently does not have the resources to maintain a server. +The pull requests introducing the first version was [https://github.com/JabRef/jabref/pull/2283](https://github.com/JabRef/jabref/pull/2283). Self-hosted alternative [Matomo Java Tracker](https://github.com/matomo-org/matomo-java-tracker) where neglected, because the JabRef team currently does not have the resources to maintain a server. ## Implementation hints -The ApplicationInsights library that we use supports a special way to submit additional details: . -Especially, one has to send `source` as property. +The ApplicationInsights library that we use supports a special way to submit additional details: [https://docs.microsoft.com/en-us/azure/azure-monitor/app/api-custom-events-metrics#properties](https://docs.microsoft.com/en-us/azure/azure-monitor/app/api-custom-events-metrics#properties). Especially, one has to send `source` as property. diff --git a/docs/advanced-reading/ui-recommendations.md b/docs/advanced-reading/ui-recommendations.md index d37197cc99e..847ddd6d8ee 100644 --- a/docs/advanced-reading/ui-recommendations.md +++ b/docs/advanced-reading/ui-recommendations.md @@ -16,9 +16,8 @@ More information: [http://ux.stackexchange.com/a/768](http://ux.stackexchange.co ## Form validation -* Only validate input after leaving the field \(or after the user stopped typing for some time\) +* Only validate input after leaving the field (or after the user stopped typing for some time) * The user shouldn't be able to submit the form if there are errors * However, disabling the submit button in case there are errors is also not optimal. Instead, clicking the submit button should highlight the errors. -* Empty required files shouldn't be marked as invalid until the user a\) tries to submit the form or b\) focused the field, deleted it contents and then left the field \(see [Example](https://www.w3schools.com/tags/tryit.asp?filename=tryhtml5_input_required) -* Ideally, the error message should be shown below the text field and not as a tooltip \(so that users quickly understand what's the problem\). For example as here [in Boostrap](https://mdbootstrap.com/docs/jquery/forms/validation/?#custom-styles) - +* Empty required files shouldn't be marked as invalid until the user a) tries to submit the form or b) focused the field, deleted it contents and then left the field (see [Example](https://www.w3schools.com/tags/tryit.asp?filename=tryhtml5\_input\_required) +* Ideally, the error message should be shown below the text field and not as a tooltip (so that users quickly understand what's the problem). For example as here [in Boostrap](https://mdbootstrap.com/docs/jquery/forms/validation/?#custom-styles) diff --git a/docs/contributing.md b/docs/contributing.md index f9e028cb94a..224922bee46 100644 --- a/docs/contributing.md +++ b/docs/contributing.md @@ -51,7 +51,7 @@ Your contribution is considered being made under [MIT license](https://tldrlegal #### Write a good commit message -See [good commit message](https://github.com/joelparkerhenderson/git_commit_message) or [commit guidelines section of Pro Git](http://git-scm.com/book/en/Distributed-Git-Contributing-to-a-Project#Commit-Guidelines). The first line of your commit message is automatically taken as the title for the pull-request. All other lines make up the body of the pull request. Add the words `fixes #xxx` to your PR to auto-close the corresponding issue. +See [good commit message](https://github.com/joelparkerhenderson/git\_commit\_message) or [commit guidelines section of Pro Git](http://git-scm.com/book/en/Distributed-Git-Contributing-to-a-Project#Commit-Guidelines). The first line of your commit message is automatically taken as the title for the pull-request. All other lines make up the body of the pull request. Add the words `fixes #xxx` to your PR to auto-close the corresponding issue. #### Test your code diff --git a/docs/getting-into-the-code/code-howtos.md b/docs/getting-into-the-code/code-howtos.md index 6759b6a38d8..6539fc0b9b6 100644 --- a/docs/getting-into-the-code/code-howtos.md +++ b/docs/getting-into-the-code/code-howtos.md @@ -4,13 +4,13 @@ This page provides some development support in the form of howtos. See also [Hig ## Generic code how tos -We really recommend reading the book [Java by Comparison](http://java.by-comparison.com/). +We really recommend reading the book [Java by Comparison](http://java.by-comparison.com). Please read [https://github.com/cxxr/better-java](https://github.com/cxxr/better-java) * try not to abbreviate names of variables, classes or methods * use lowerCamelCase instead of snake\_case -* name enums in singular, e.g. `Weekday` instead of `Weekdays` \(except if they represent flags\) +* name enums in singular, e.g. `Weekday` instead of `Weekdays` (except if they represent flags) ## Error Handling in JabRef @@ -18,34 +18,34 @@ Please read [https://github.com/cxxr/better-java](https://github.com/cxxr/better Principles: -* All exceptions we throw should be or extend `JabRefException`; This is especially important if the message stored in the Exception should be shown to the user. `JabRefException` has already implemented the `getLocalizedMessage()` method which should be used for such cases \(see details below!\). -* Catch and wrap all API exceptions \(such as `IOExceptions`\) and rethrow them - * Example: - - ```java - try { - // ... - } catch (IOException ioe) { - throw new JabRefException("Something went wrong...", - Localization.lang("Something went wrong...", ioe); - } - ``` +* All exceptions we throw should be or extend `JabRefException`; This is especially important if the message stored in the Exception should be shown to the user. `JabRefException` has already implemented the `getLocalizedMessage()` method which should be used for such cases (see details below!). +* Catch and wrap all API exceptions (such as `IOExceptions`) and rethrow them + * Example: + + ```java + try { + // ... + } catch (IOException ioe) { + throw new JabRefException("Something went wrong...", + Localization.lang("Something went wrong...", ioe); + } + ``` * Never, ever throw and catch `Exception` or `Throwable` -* Errors should only be logged when they are finally caught \(i.e., logged only once\). See **Logging** for details. -* If the Exception message is intended to be shown to the User in the UI \(see below\) provide also a localizedMessage \(see `JabRefException`\). +* Errors should only be logged when they are finally caught (i.e., logged only once). See **Logging** for details. +* If the Exception message is intended to be shown to the User in the UI (see below) provide also a localizedMessage (see `JabRefException`). -_\(Rationale and further reading:_ [https://www.baeldung.com/java-exceptions](https://www.baeldung.com/java-exceptions)_\)_ +_(Rationale and further reading:_ [https://www.baeldung.com/java-exceptions](https://www.baeldung.com/java-exceptions)_)_ ### Outputting Errors in the UI -Principle: Error messages shown to the User should not contain technical details \(e.g., underlying exceptions, or even stack traces\). Instead, the message should be concise, understandable for non-programmers and localized. The technical reasons \(and stack traces\) for a failure should only be logged. +Principle: Error messages shown to the User should not contain technical details (e.g., underlying exceptions, or even stack traces). Instead, the message should be concise, understandable for non-programmers and localized. The technical reasons (and stack traces) for a failure should only be logged. To show error message two different ways are usually used in JabRef: * showing an error dialog * updating the status bar at the bottom of the main window -```text +``` TODO: Usage of status bar and Swing Dialogs ``` @@ -61,7 +61,7 @@ Many times there is a need to provide an object on many locations simultaneously ### Register to the `EventBus` -Any listening method has to be annotated with `@Subscribe` keyword and must have only one accepting parameter. Furthermore, the object which contains such listening method\(s\) has to be registered using the `register(Object)` method provided by `EventBus`. The listening methods can be overloaded by using different parameter types. +Any listening method has to be annotated with `@Subscribe` keyword and must have only one accepting parameter. Furthermore, the object which contains such listening method(s) has to be registered using the `register(Object)` method provided by `EventBus`. The listening methods can be overloaded by using different parameter types. ### Posting an object @@ -119,30 +119,23 @@ If you want to catch the event you'll have to register your listener class with ## Logging -JabRef uses the logging facade [SLF4j](https://www.slf4j.org/). -All log messages are passed internally to [tinylog](https://tinylog.org/v2/) which handles any filtering, formatting and writing of log messages. - -* Obtaining a logger for a class: - - ```java - private static final Logger LOGGER = LoggerFactory.getLogger(.class); - ``` +JabRef uses the logging facade [SLF4j](https://www.slf4j.org). All log messages are passed internally to [tinylog](https://tinylog.org/v2/) which handles any filtering, formatting and writing of log messages. -* If the logging event is caused by an exception, please add the exception to the log message as: +* Obtaining a logger for a class: - ```java - catch (SomeException e) { - LOGGER.warn("Warning text.", e); - ... - } - ``` + ```java + private static final Logger LOGGER = LoggerFactory.getLogger(.class); + ``` +* If the logging event is caused by an exception, please add the exception to the log message as: -* SLF4J also support parameterized logging, e.g. if you want to print out multiple arguments in a log statement use a pair of curly braces. [Examples](https://www.slf4j.org/faq.html#logging_performance) -* When running tests, `tinylog-test.properties` is used. It is located under `src/test/resources`. - As default, only `info` is logged. - When developing, it makes sense to use `debug` as log level. - One can change the log level per class using the pattern `level@class=debug` is set to `debug`. - In the `.properties` file, this is done for `org.jabref.model.entry.BibEntry`. + ```java + catch (SomeException e) { + LOGGER.warn("Warning text.", e); + ... + } + ``` +* SLF4J also support parameterized logging, e.g. if you want to print out multiple arguments in a log statement use a pair of curly braces. [Examples](https://www.slf4j.org/faq.html#logging\_performance) +* When running tests, `tinylog-test.properties` is used. It is located under `src/test/resources`. As default, only `info` is logged. When developing, it makes sense to use `debug` as log level. One can change the log level per class using the pattern `level@class=debug` is set to `debug`. In the `.properties` file, this is done for `org.jabref.model.entry.BibEntry`. ## Using Localization correctly @@ -150,7 +143,7 @@ More information about this topic from the translator side is provided at [Trans All labeled UI elements, descriptions and messages shown to the user should be localized, i.e., should be displayed in the chosen language. -JabRef uses ResourceBundles \([see Oracle Tutorial](https://docs.oracle.com/javase/tutorial/i18n/resbundle/concept.html)\) to store `key=value` pairs for each String to be localized. +JabRef uses ResourceBundles ([see Oracle Tutorial](https://docs.oracle.com/javase/tutorial/i18n/resbundle/concept.html)) to store `key=value` pairs for each String to be localized. To show an localized String the following `org.jabref.logic.l10n.Localization` has to be used. The Class currently provides three methods to obtain translated strings: @@ -172,16 +165,15 @@ The actual usage might look like: General hints: -* Use the String you want to localize directly, do not use members or local variables: `Localization.lang("Translate me");` instead of `Localization.lang(someVariable)` \(possibly in the form `someVariable = Localization.lang("Translate me")` +* Use the String you want to localize directly, do not use members or local variables: `Localization.lang("Translate me");` instead of `Localization.lang(someVariable)` (possibly in the form `someVariable = Localization.lang("Translate me")` * Use `%x`-variables where appropriate: `Localization.lang("Exported %0 entries.", number)` instead of `Localization.lang("Exported ") + number + Localization.lang(" entries.");` -* Use a full stop/period \("."\) to end full sentences +* Use a full stop/period (".") to end full sentences The tests check whether translation strings appear correctly in the resource bundles. -1. Add new `Localization.lang("KEY")` to Java file. Run the `LocalizationConsistencyTest`under \(src/test/org.jabref.logic. - - \) +1. Add new `Localization.lang("KEY")` to Java file. Run the `LocalizationConsistencyTest`under (src/test/org.jabref.logic. + ) 2. Tests fail. In the test output a snippet is generated which must be added to the English translation file. 3. Add snippet to English translation file located at `src/main/resources/l10n/JabRef_en.properties` 4. Please do not add translations for other languages directly in the properties. They will be overwritten by [Crowdin](https://crowdin.com/project/jabref) @@ -189,7 +181,7 @@ The tests check whether translation strings appear correctly in the resource bun ## Adding a new Language 1. Add the new Language to the Language enum in [https://github.com/JabRef/jabref/blob/master/src/main/java/org/jabref/logic/l10n/Language.java](https://github.com/JabRef/jabref/blob/master/src/main/java/org/jabref/logic/l10n/Language.java) -2. Create an empty <locale code>.properties file +2. Create an empty \.properties file 3. Configure the new language in [Crowdin](https://crowdin.com/project/jabref) If the language is a variant of a language `zh_CN` or `pt_BR` it is necessary to add a language mapping for Crowdin to the crowdin.yml file in the root. Of course the properties file also has to be named according to the language code and locale. @@ -202,7 +194,7 @@ Example: [NormalizePagesFormatter](https://github.com/JabRef/jabref/blob/master/ ## Drag and Drop -Drag and Drop makes usage of the Dragboard. For JavaFX the following [tutorial](https://docs.oracle.com/javafx/2/drag_drop/jfxpub-drag_drop.htm) is helpful. Note that the data has to be serializable which is put on the dragboard. For drag and drop of Bib-entries between the maintable and the groups panel, a custom Dragboard is used, `CustomLocalDragboard` which is a generic alternative to the system one. +Drag and Drop makes usage of the Dragboard. For JavaFX the following [tutorial](https://docs.oracle.com/javafx/2/drag\_drop/jfxpub-drag\_drop.htm) is helpful. Note that the data has to be serializable which is put on the dragboard. For drag and drop of Bib-entries between the maintable and the groups panel, a custom Dragboard is used, `CustomLocalDragboard` which is a generic alternative to the system one. For accessing or putting data into the Clipboard use the `ClipboardManager`. @@ -221,15 +213,15 @@ Optional file = FileHelper.expandFilename(database, fileText, preferences. ## Setting a Database Directory for a .bib File * `@comment{jabref-meta: fileDirectory:` -* “fileDirectory” is determined by Globals.pref.get\(“userFileDir”\) \(which defaults to “fileDirectory” -* There is also “fileDirectory-<username>”, which is determined by Globals.prefs.get\(“userFileDirIndividual”\) +* “fileDirectory” is determined by Globals.pref.get(“userFileDir”) (which defaults to “fileDirectory” +* There is also “fileDirectory-\”, which is determined by Globals.prefs.get(“userFileDirIndividual”) * Used at DatabasePropertiesDialog ## How to work with Preferences `model` and `logic` must not know `JabRefPreferences`. See `ProxyPreferences` for encapsulated preferences and [https://github.com/JabRef/jabref/pull/658](https://github.com/JabRef/jabref/pull/658) for a detailed discussion. -See [https://github.com/JabRef/jabref/blob/master/src/main/java/org/jabref/logic/preferences/TimestampPreferences.java](https://github.com/JabRef/jabref/blob/master/src/main/java/org/jabref/logic/preferences/TimestampPreferences.java) \(via [https://github.com/JabRef/jabref/pull/3092](https://github.com/JabRef/jabref/pull/3092)\) for the current way how to deal with preferences. +See [https://github.com/JabRef/jabref/blob/master/src/main/java/org/jabref/logic/preferences/TimestampPreferences.java](https://github.com/JabRef/jabref/blob/master/src/main/java/org/jabref/logic/preferences/TimestampPreferences.java) (via [https://github.com/JabRef/jabref/pull/3092](https://github.com/JabRef/jabref/pull/3092)) for the current way how to deal with preferences. Defaults should go into the model package. See [Comments in this Commit](https://github.com/JabRef/jabref/commit/2f553e6557bddf7753b618b0f4edcaa6e873f719#commitcomment-15779484) @@ -240,34 +232,33 @@ Defaults should go into the model package. See [Comments in this Commit](https:/ Imagine you want to test the method `format(String value)` in the class `BracesFormatter` which removes double braces in a given string. * _Placing:_ all tests should be placed in a class named `classTest`, e.g. `BracesFormatterTest`. -* _Naming:_ the name should be descriptive enough to describe the whole test. Use the format `methodUnderTest_ expectedBehavior_context` \(without the dashes\). So for example `formatRemovesDoubleBracesAtBeginning`. Try to avoid naming the tests with a `test` prefix since this information is already contained in the class name. Moreover, starting the name with `test` leads often to inferior test names \(see also the [Stackoverflow discussion about naming](http://stackoverflow.com/questions/155436/unit-test-naming-best-practices)\). -* _Test only one thing per test:_ tests should be short and test only one small part of the method. So instead of - - ```java - testFormat() { - assertEqual("test", format("test")); - assertEqual("{test", format("{test")); - assertEqual("test", format("test}}")); - } - ``` +* _Naming:_ the name should be descriptive enough to describe the whole test. Use the format `methodUnderTest_ expectedBehavior_context` (without the dashes). So for example `formatRemovesDoubleBracesAtBeginning`. Try to avoid naming the tests with a `test` prefix since this information is already contained in the class name. Moreover, starting the name with `test` leads often to inferior test names (see also the [Stackoverflow discussion about naming](http://stackoverflow.com/questions/155436/unit-test-naming-best-practices)). +* _Test only one thing per test:_ tests should be short and test only one small part of the method. So instead of - we would have five tests containing a single `assert` statement and named accordingly \(`formatDoesNotChangeStringWithoutBraces`, `formatDoesNotRemoveSingleBrace`, , etc.\). See [JUnit AntiPattern](https://exubero.com/junit/anti-patterns/#Multiple_Assertions) for background. + ```java + testFormat() { + assertEqual("test", format("test")); + assertEqual("{test", format("{test")); + assertEqual("test", format("test}}")); + } + ``` + we would have five tests containing a single `assert` statement and named accordingly (`formatDoesNotChangeStringWithoutBraces`, `formatDoesNotRemoveSingleBrace`, , etc.). See [JUnit AntiPattern](https://exubero.com/junit/anti-patterns/#Multiple\_Assertions) for background. * Do _not just test happy paths_, but also wrong/weird input. -* It is recommend to write tests _before_ you actually implement the functionality \(test driven development\). +* It is recommend to write tests _before_ you actually implement the functionality (test driven development). * _Bug fixing:_ write a test case covering the bug and then fix it, leaving the test as a security that the bug will never reappear. -* Do not catch exceptions in tests, instead use the `assertThrows(Exception.class, ()->doSomethingThrowsEx())` feature of [junit-jupiter](https://junit.org/junit5/docs/current/user-guide/) to the test method. +* Do not catch exceptions in tests, instead use the `assertThrows(Exception.class, ()->doSomethingThrowsEx())` feature of [junit-jupiter](https://junit.org/junit5/docs/current/user-guide/) to the test method. ### Lists in tests * Use `assertEquals(Collections.emptyList(), actualList);` instead of `assertEquals(0, actualList.size());` to test whether a list is empty. -* Similarly, use `assertEquals(Arrays.asList("a", "b"), actualList);` to compare lists instead of +* Similarly, use `assertEquals(Arrays.asList("a", "b"), actualList);` to compare lists instead of - ```java - assertEquals(2, actualList.size()); - assertEquals("a", actualList.get(0)); - assertEquals("b", actualList.get(1)); - ``` + ```java + assertEquals(2, actualList.size()); + assertEquals("a", actualList.get(0)); + assertEquals("b", actualList.get(1)); + ``` ### BibEntries in tests @@ -275,19 +266,19 @@ Imagine you want to test the method `format(String value)` in the class `BracesF ### Files and folders in tests -* If you need a temporary file in tests, then add the following Annotation before the class: +* If you need a temporary file in tests, then add the following Annotation before the class: - ```java - @ExtendWith(TempDirectory.class) - class TestClass{ + ```java + @ExtendWith(TempDirectory.class) + class TestClass{ - @BeforeEach - void setUp(@TempDirectory.TempDir Path temporaryFolder){ + @BeforeEach + void setUp(@TempDirectory.TempDir Path temporaryFolder){ + } } - } - ``` + ``` - to the test class. A temporary file is now created by `Files.createFile(path)`. Using this pattern automatically ensures that the test folder is deleted after the tests are run. See the [junit-pioneer doc](https://junit-pioneer.org/docs/temp-directory/) for more details. + to the test class. A temporary file is now created by `Files.createFile(path)`. Using this pattern automatically ensures that the test folder is deleted after the tests are run. See the [junit-pioneer doc](https://junit-pioneer.org/docs/temp-directory/) for more details. ### Loading Files from Resources @@ -328,16 +319,16 @@ To test that a preferences migration works successfully, use the mockito method In JabRef, we mainly rely to basic JUnit tests to increase code coverage. There are other ways to test: -| Type | Techniques | Tool \(Java\) | Kind of tests | Used In JabRef | -| :--- | :--- | :--- | :--- | :--- | -| Functional | Dynamics, black box, positive and negative | [JUnit-QuickCheck](https://github.com/pholser/junit-quickcheck) | Random data generation | No, not intended, because other test kinds seem more helpful. | -| Functional | Dynamics, black box, positive and negative | [GraphWalker](https://graphwalker.github.io/) | Model-based | No, because the BibDatabase doesn't need to be tests | -| Functional | Dynamics, black box, positive and negative | [TestFX](https://github.com/TestFX/TestFX) | GUI Tests | Yes | -| Functional | Dynamics, white box, negative | [PIT](https://pitest.org/) | Mutation | No | -| Functional | Dynamics, white box, positive and negative | [Mockito](https://site.mockito.org/) | Mocking | Yes | -| Non-functional | Dynamics, black box, positive and negative | [JETM](http://jetm.void.fm/), [Apache JMeter](https://jmeter.apache.org/) | Performance \(performance testing vs load testing respectively\) | No | -| Structural | Static, white box | [CheckStyle](https://checkstyle.sourceforge.io/) | Constient formatting of the source code | Yes | -| Structural | Dynamics, white box | [SpotBugs](https://spotbugs.github.io/) | Reocurreing bugs \(based on experience of other projects\) | No | +| Type | Techniques | Tool (Java) | Kind of tests | Used In JabRef | +| -------------- | ------------------------------------------ | ----------------------------------------------------------------------- | -------------------------------------------------------------- | ------------------------------------------------------------- | +| Functional | Dynamics, black box, positive and negative | [JUnit-QuickCheck](https://github.com/pholser/junit-quickcheck) | Random data generation | No, not intended, because other test kinds seem more helpful. | +| Functional | Dynamics, black box, positive and negative | [GraphWalker](https://graphwalker.github.io) | Model-based | No, because the BibDatabase doesn't need to be tests | +| Functional | Dynamics, black box, positive and negative | [TestFX](https://github.com/TestFX/TestFX) | GUI Tests | Yes | +| Functional | Dynamics, white box, negative | [PIT](https://pitest.org) | Mutation | No | +| Functional | Dynamics, white box, positive and negative | [Mockito](https://site.mockito.org) | Mocking | Yes | +| Non-functional | Dynamics, black box, positive and negative | [JETM](http://jetm.void.fm), [Apache JMeter](https://jmeter.apache.org) | Performance (performance testing vs load testing respectively) | No | +| Structural | Static, white box | [CheckStyle](https://checkstyle.sourceforge.io) | Constient formatting of the source code | Yes | +| Structural | Dynamics, white box | [SpotBugs](https://spotbugs.github.io) | Reocurreing bugs (based on experience of other projects) | No | ## UI @@ -347,25 +338,25 @@ Global variables should be avoided. Try to pass them as dependency. ### keywords sync -Database.addDatabaseChangeListener does not work as the DatabaseChangedEvent does not provide the field information. Therefore, we have to use BibtexEntry.addPropertyChangeListener\(VetoableChangeListener listener\) +Database.addDatabaseChangeListener does not work as the DatabaseChangedEvent does not provide the field information. Therefore, we have to use BibtexEntry.addPropertyChangeListener(VetoableChangeListener listener) ## Working with BibTeX data ### Working with authors -You can normalize the authors using `org.jabref.model.entry.AuthorList.fixAuthor_firstNameFirst(String)`. Then the authors always look nice. The only alternative containing all data of the names is `org.jabref.model.entry.AuthorList.fixAuthor_lastNameFirst(String)`. The other `fix...` methods omit data \(like the von parts or the junior information\). +You can normalize the authors using `org.jabref.model.entry.AuthorList.fixAuthor_firstNameFirst(String)`. Then the authors always look nice. The only alternative containing all data of the names is `org.jabref.model.entry.AuthorList.fixAuthor_lastNameFirst(String)`. The other `fix...` methods omit data (like the von parts or the junior information). ## Benchmarks -* Benchmarks can be executed by running the `jmh` gradle task \(this functionality uses the [JMH Gradle plugin](https://github.com/melix/jmh-gradle-plugin)\) +* Benchmarks can be executed by running the `jmh` gradle task (this functionality uses the [JMH Gradle plugin](https://github.com/melix/jmh-gradle-plugin)) * Best practices: * Read test input from `@State` objects - * Return result of calculations \(either explicitly or via a `BlackHole` object\) + * Return result of calculations (either explicitly or via a `BlackHole` object) * [List of examples](https://github.com/melix/jmh-gradle-example/tree/master/src/jmh/java/org/openjdk/jmh/samples) ## Measure performance -Try out the [YourKit JAva Profiler](https://www.yourkit.com/). +Try out the [YourKit JAva Profiler](https://www.yourkit.com). ## equals @@ -379,27 +370,27 @@ When creating an `equals` method follow: Also, note: -* Always override `hashCode` when you override equals \(`hashCode` also has very strict rules\) \(Item 9 of[Effective Java](https://www.oreilly.com/library/view/effective-java-3rd/9780134686097/)\) +* Always override `hashCode` when you override equals (`hashCode` also has very strict rules) (Item 9 of[Effective Java](https://www.oreilly.com/library/view/effective-java-3rd/9780134686097/)) * Don’t try to be too clever * Don’t substitute another type for `Object` in the equals declaration ## Files and Paths -Always try to use the methods from the nio-package. For interoperability, they provide methods to convert between file and path. [https://docs.oracle.com/javase/tutorial/essential/io/path.html](https://docs.oracle.com/javase/tutorial/essential/io/path.html) Mapping between old methods and new methods [https://docs.oracle.com/javase/tutorial/essential/io/legacy.html\#mapping](https://docs.oracle.com/javase/tutorial/essential/io/legacy.html#mapping) +Always try to use the methods from the nio-package. For interoperability, they provide methods to convert between file and path. [https://docs.oracle.com/javase/tutorial/essential/io/path.html](https://docs.oracle.com/javase/tutorial/essential/io/path.html) Mapping between old methods and new methods [https://docs.oracle.com/javase/tutorial/essential/io/legacy.html#mapping](https://docs.oracle.com/javase/tutorial/essential/io/legacy.html#mapping) ## JavaFX -The following expressions can be used in FXML attributes, according to the [official documentation](https://docs.oracle.com/javase/8/javafx/api/javafx/fxml/doc-files/introduction_to_fxml.html#attributes) +The following expressions can be used in FXML attributes, according to the [official documentation](https://docs.oracle.com/javase/8/javafx/api/javafx/fxml/doc-files/introduction\_to\_fxml.html#attributes) -| Type | Expression | Value point to | Remark | -| :--- | :--- | :--- | :--- | -| Location | `@image.png` | path relative to the current FXML file | | -| Resource | `%textToBeTranslated` | key in ResourceBundle | | -| Attribute variable | `$idOfControl` or `$variable` | named control or variable in controller \(may be path in the namespace\) | resolved only once at load time | -| Expression binding | `${expression}` | expression, for example `textField.text` | changes to source are propagated | -| Bidirectional expression binding | `#{expression}` | expression | changes are propagated in both directions \(not yet implemented in JavaFX, see [feature request](https://bugs.openjdk.java.net/browse/JDK-8090665)\) | -| Event handler | `#nameOfEventHandler` | name of the event handler method in the controller | | -| Constant | `` | constant \(here `MYSTRING` in the `Strings` class\) | | +| Type | Expression | Value point to | Remark | +| -------------------------------- | ------------------------------------------------ | ---------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- | +| Location | `@image.png` | path relative to the current FXML file | | +| Resource | `%textToBeTranslated` | key in ResourceBundle | | +| Attribute variable | `$idOfControl` or `$variable` | named control or variable in controller (may be path in the namespace) | resolved only once at load time | +| Expression binding | `${expression}` | expression, for example `textField.text` | changes to source are propagated | +| Bidirectional expression binding | `#{expression}` | expression | changes are propagated in both directions (not yet implemented in JavaFX, see [feature request](https://bugs.openjdk.java.net/browse/JDK-8090665)) | +| Event handler | `#nameOfEventHandler` | name of the event handler method in the controller | | +| Constant | `` | constant (here `MYSTRING` in the `Strings` class) | | ### JavaFX Radio Buttons example @@ -423,7 +414,7 @@ All radio buttons that should be grouped together need to have a ToggleGroup def ### JavaFX Dialogs -All dialogs should be displayed to the user via `DialogService` interface methods. `DialogService` provides methods to display various dialogs \(including custom ones\) to the user. It also ensures the displayed dialog opens on the correct window via `initOwner()` \(for cases where the user has multiple screens\). The following code snippet demonstrates how a custom dialog is displayed to the user: +All dialogs should be displayed to the user via `DialogService` interface methods. `DialogService` provides methods to display various dialogs (including custom ones) to the user. It also ensures the displayed dialog opens on the correct window via `initOwner()` (for cases where the user has multiple screens). The following code snippet demonstrates how a custom dialog is displayed to the user: ```java dialogService.showCustomDialog(new DocumentViewerView()); @@ -434,4 +425,3 @@ If an instance of `DialogService` is unavailable within current class/scope in w ```java DialogService dialogService = Injector.instantiateModelOrService(DialogService.class); ``` - diff --git a/docs/getting-into-the-code/development-strategy.md b/docs/getting-into-the-code/development-strategy.md index 88393f7014c..f9b3525a8c8 100644 --- a/docs/getting-into-the-code/development-strategy.md +++ b/docs/getting-into-the-code/development-strategy.md @@ -8,7 +8,7 @@ To ensure high code-quality, * We follow the principles of [Effective Java](https://www.oreilly.com/library/view/effective-java-3rd/9780134686097/). * We use [Design Patterns](https://java-design-patterns.com/patterns/) when applicable. * We document our design decisions using the lightweight architectural decision records [MADR](https://adr.github.io/madr/). -* We review each external pull request by at least two [JabRef Core Developers](../../MAINTAINERS). +* We review each external pull request by at least two [JabRef Core Developers](https://github.com/JabRef/jabref/blob/main/MAINTAINERS/README.md). Read on about our automated quality checks at [Code Quality](../advanced-reading/code-quality.md). diff --git a/docs/getting-into-the-code/guidelines-for-setting-up-a-local-workspace.md b/docs/getting-into-the-code/guidelines-for-setting-up-a-local-workspace.md index b2ca3c5edef..a0ae98e4957 100644 --- a/docs/getting-into-the-code/guidelines-for-setting-up-a-local-workspace.md +++ b/docs/getting-into-the-code/guidelines-for-setting-up-a-local-workspace.md @@ -122,7 +122,7 @@ To prepare IntelliJ's build system two additional steps are required: Note that you need to focus another UI element before pressing OK. Otherwise, the setting will be empty. * Enable annotation processors by navigating to **File | Settings | Build, Execution, Deployment | Compiler | Annotation processors** and check "Enable annotation processing" - ![Enable annotation processing](<../.gitbook/assets/intellij-enable-annotation-processing (1) (1).png>) + ![Enable annotation processing](<../.gitbook/assets/intellij-enable-annotation-processing (1).png>) To have autoformat working properly in the context of line wrapping, "Wrap at right margin" has to be disabled as shown below. Details are found in [IntelliJ issue 240517](https://youtrack.jetbrains.com/issue/IDEA-240517). @@ -171,16 +171,6 @@ To use IntelliJ IDEA's internal build system when you build JabRef through **Bui 9. Click "OK" to save the changes * In case the above step does not work, run with gradle, import gradle project again, and try again. -``` -Error:java: Unable to create Plugin Service Class org.jabref.gui.logging.plugins.Log4jPlugins -``` - -or following error: - -``` -Error:(16, 25) java: package org.jabref.search does not exist -``` - Essentially, you now have the best of both worlds: You can run Gradle tasks using the Gradle Tool Window and unless you haven't made changes to input files that generate sources, you can compile and run with IntelliJ's faster internal build system. In case all steps are followed, and there are still issues with `SearchBaseVisitor` (e.g., `Error:(16, 25) java: package org.jabref.search does not exist`), you have to delete `src\main\generated\org\jabref\gui\logging\plugins\Log4jPlugins.java`. This is independent of having enabled or disabled Annotation Processing (see above at "Enable Annotation Processing"). @@ -211,7 +201,7 @@ Finally, ensure that the checkstyle configuration file is in place: 9. Save settings by clicking "OK" 10. Your configuration should now look like this: - ![checkstyle settings](<../.gitbook/assets/intellij-checkstyle-settings (1) (1).png>) + ![checkstyle settings](<../.gitbook/assets/intellij-checkstyle-settings (1).png>) ### Setup for Eclipse @@ -228,7 +218,7 @@ Make sure your Eclipse installation us up to date. 4. Create a run/debug configuration for the main class `org.jabref.gui.JabRefLauncher` and/or for `org.jabref.gui.JabRefMain` (both can be used equivalently) * Remark: The run/debug configuration needs to be added by right clicking the class (e.g. JabRefLauncher or JabRefMain) otherwise it will not work. - ![Creating the run/debug configuration by right clicking on the class](<../.gitbook/assets/eclipse-create-run-config (1) (3) (3) (4) (4) (3) (11).png>) + ![Creating the run/debug configuration by right clicking on the class](<../.gitbook/assets/eclipse-create-run-config (1) (3) (3) (4) (4) (3) (11) (2).png>) * In the tab "Arguments" of the run/debug configuration, enter the following runtime VM arguments: ``` diff --git a/docs/getting-into-the-code/high-level-documentation.md b/docs/getting-into-the-code/high-level-documentation.md index 84e5295ae70..ad5d63b7930 100644 --- a/docs/getting-into-the-code/high-level-documentation.md +++ b/docs/getting-into-the-code/high-level-documentation.md @@ -2,9 +2,9 @@ This page describes relevant information about the code structure of JabRef precisely and succinctly. Closer-to-code documentation is available at [Code HowTos](code-howtos.md). -We have been successfully transitioning from a spaghetti to a more structured architecture with the `model` in the center, and the `logic` as an intermediate layer towards the `gui` which is the outer shell. There are additional utility packages for `preferences` and the `cli`. The dependencies are only directed towards the center. We have JUnit tests to detect violations of the most crucial dependencies \(between `logic`, `model`, and `gui`\), and the build will fail automatically in these cases. +We have been successfully transitioning from a spaghetti to a more structured architecture with the `model` in the center, and the `logic` as an intermediate layer towards the `gui` which is the outer shell. There are additional utility packages for `preferences` and the `cli`. The dependencies are only directed towards the center. We have JUnit tests to detect violations of the most crucial dependencies (between `logic`, `model`, and `gui`), and the build will fail automatically in these cases. -The `model` represents the most important data structures \(`BibDatases`, `BibEntries`, `Events`, and related aspects\) and has only a little bit of logic attached. The `logic` is responsible for reading/writing/importing/exporting and manipulating the `model`, and it is structured often as an API the `gui` can call and use. Only the `gui` knows the user and his preferences and can interact with him to help him solve tasks. For each layer, we form packages according to their responsibility, i.e., vertical structuring. The `model` should have no dependencies to other classes of JabRef and the `logic` should only depend on `model` classes. The `cli` package bundles classes that are responsible for JabRef's command line interface. The `preferences` represents all information customizable by a user for her personal needs. +The `model` represents the most important data structures (`BibDatases`, `BibEntries`, `Events`, and related aspects) and has only a little bit of logic attached. The `logic` is responsible for reading/writing/importing/exporting and manipulating the `model`, and it is structured often as an API the `gui` can call and use. Only the `gui` knows the user and his preferences and can interact with him to help him solve tasks. For each layer, we form packages according to their responsibility, i.e., vertical structuring. The `model` should have no dependencies to other classes of JabRef and the `logic` should only depend on `model` classes. The `cli` package bundles classes that are responsible for JabRef's command line interface. The `preferences` represents all information customizable by a user for her personal needs. We use an event bus to publish events from the `model` to the other layers. This allows us to keep the architecture but still react upon changes within the core in the outer layers. @@ -14,7 +14,7 @@ You can view up-to-date diagrams for model, gui, and logic packages [at sourcesp Permitted dependencies in our architecture are: -```text +``` gui --> logic --> model gui ------------> model gui ------------> preferences @@ -31,9 +31,8 @@ cli ------------> global classes cli ------------> preferences ``` -All packages and classes which are currently not part of these packages \(we are still in the process of structuring\) are considered as gui classes from a dependency stand of view. +All packages and classes which are currently not part of these packages (we are still in the process of structuring) are considered as gui classes from a dependency stand of view. ## Most Important Classes and their Relation -Both GUI and CLI are started via the `JabRefMain` which will in turn call `JabRef` which then decides whether the GUI \(`JabRefFrame`\) or the CLI \(`JabRefCLI` and a lot of code in `JabRef`\) will be started. The `JabRefFrame` represents the Window which contains a `SidePane` on the left used for the fetchers/groups Each tab is a `BasePanel` which has a `SearchBar` at the top, a `MainTable` at the center and a `PreviewPanel` or an `EntryEditor` at the bottom. Any right click on the `MainTable` is handled by the `RightClickMenu`. Each `BasePanel` holds a `BibDatabaseContext` consisting of a `BibDatabase` and the `MetaData`, which are the only relevant data of the currently shown database. A `BibDatabase` has a list of `BibEntries`. Each `BibEntry` has an ID, a citation key and a key/value store for the fields with their values. Interpreted data \(such as the type or the file field\) is stored in the `TypedBibentry` type. The user can change the `JabRefPreferences` through the `PreferencesDialog`. - +Both GUI and CLI are started via the `JabRefMain` which will in turn call `JabRef` which then decides whether the GUI (`JabRefFrame`) or the CLI (`JabRefCLI` and a lot of code in `JabRef`) will be started. The `JabRefFrame` represents the Window which contains a `SidePane` on the left used for the fetchers/groups Each tab is a `BasePanel` which has a `SearchBar` at the top, a `MainTable` at the center and a `PreviewPanel` or an `EntryEditor` at the bottom. Any right click on the `MainTable` is handled by the `RightClickMenu`. Each `BasePanel` holds a `BibDatabaseContext` consisting of a `BibDatabase` and the `MetaData`, which are the only relevant data of the currently shown database. A `BibDatabase` has a list of `BibEntries`. Each `BibEntry` has an ID, a citation key and a key/value store for the fields with their values. Interpreted data (such as the type or the file field) is stored in the `TypedBibentry` type. The user can change the `JabRefPreferences` through the `PreferencesDialog`. diff --git a/docs/getting-into-the-code/testing.md b/docs/getting-into-the-code/testing.md index 4883c8e7c37..53ca770f604 100644 --- a/docs/getting-into-the-code/testing.md +++ b/docs/getting-into-the-code/testing.md @@ -1,6 +1,6 @@ # How to test -For details on unit testing see [https://devdocs.jabref.org/getting-into-the-code/code-howtos\#test-cases](https://devdocs.jabref.org/getting-into-the-code/code-howtos#test-cases). +For details on unit testing see [https://devdocs.jabref.org/getting-into-the-code/code-howtos#test-cases](https://devdocs.jabref.org/getting-into-the-code/code-howtos#test-cases). ## Database tests @@ -8,21 +8,20 @@ For details on unit testing see [https://devdocs.jabref.org/getting-into-the-cod To quickly host a local PostgreSQL database, execute following statement: -```text +``` docker run -d -e POSTGRES_USER=postgres -e POSTGRES_PASSWORD=postgres -e POSTGRES_DB=postgres -p 5432:5432 --name db postgres:10 postgres -c log_statement=all ``` -Set the environment variable `DBMS` to `postgres` \(or leave it unset\) +Set the environment variable `DBMS` to `postgres` (or leave it unset) -Then, all DBMS Tests \(annotated with `@org.jabref.testutils.category.DatabaseTest`\) run properly. +Then, all DBMS Tests (annotated with `@org.jabref.testutils.category.DatabaseTest`) run properly. ### MySQL A MySQL DBMS can be started using following command: -```text +``` docker run -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=jabref -p 3800:3307 mysql:8.0 --port=3307 ``` Set the environment variable `DBMS` to `mysql`. - diff --git a/docs/openoffice/README.md b/docs/openoffice/README.md index 5587cc8291e..63a2d22e7fd 100644 --- a/docs/openoffice/README.md +++ b/docs/openoffice/README.md @@ -1 +1,2 @@ -# OpenOffice/LibreOffice integration +# The OpenOffice/LibreOffice panel + diff --git a/docs/openoffice/code-reorganization.md b/docs/openoffice/code-reorganization.md index a9d45418690..51be866016c 100644 --- a/docs/openoffice/code-reorganization.md +++ b/docs/openoffice/code-reorganization.md @@ -1,171 +1,123 @@ - # Code reorganization Why -- Separate backend -- Separate GUI code (dialogs) and logic -- Data is now organized around `Citation`, `CitationGroup` instead of arrays for citation group - fields, and arrays of arrays for citation fields. - Also take `citationKey` as the central data unit, this is what we start with: unresolved `citationKeys` - do not stop processing. Although we cannot sort them by author and year, we can still emit a marker - that acts as a placeholder and shows the user the problematic key. +* Separate backend +* Separate GUI code (dialogs) and logic +* Data is now organized around `Citation`, `CitationGroup` instead of arrays for citation group fields, and arrays of arrays for citation fields.\ + Also take `citationKey` as the central data unit, this is what we start with: unresolved `citationKeys` do not stop processing. Although we cannot sort them by author and year, we can still emit a marker that acts as a placeholder and shows the user the problematic key. ## Result ### Layers -![Layers](layers-v1.svg) +![Layers](../.gitbook/assets/layers-v1.svg) ### By directories -- `model` - - `util` : general utilities - - (`OOPair`, `OOTuple3`) collect two or three objects without creating a new class - - `OOResult` : while an Optional.empty can comunicate failure, it cannot provide details. - `OOResult` allows an arbitrary error object to be provided in case of failure. - - `OOVoidResult` : for functions returning no result on success, only diagnostics on failure. - - `OOListUtil`: some utilities working on List - - `uno` : helpers for various tasks via UNO. +* `model` + * `util` : general utilities + * (`OOPair`, `OOTuple3`) collect two or three objects without creating a new class + * `OOResult` : while an Optional.empty can comunicate failure, it cannot provide details.\ + `OOResult` allows an arbitrary error object to be provided in case of failure. + * `OOVoidResult` : for functions returning no result on success, only diagnostics on failure. + * `OOListUtil`: some utilities working on List + * `uno` : helpers for various tasks via UNO.\ These are conceptually independent of JabRef code and logic. - - `ootext` : to separate decisions on the format of references and citation marks from - the actual insertion into the document, the earlier method - [OOUtil.insertOOFormattedTextAtCurrentLocation](https://github.com/JabRef/jabref/blob/475b2989ffa8ec61c3327c62ed8f694149f83220/src/main/java/org/jabref/logic/openoffice/OOUtil.java#L112) - was extended to handle new tags that describe actions earlier done in code. - - This became [OOTextIntoOO.write](https://github.com/antalk2/jabref/blob/122d5133fa6c7b44245c5ba5600d398775718664/src/main/java/org/jabref/model/openoffice/ootext/OOTextIntoOO.java#L149) - - `(change)` Now all output to the document goes through this, not only those from Layout. This allows the citation markers and `jstyle:Title` to use these tags. - - This allows some backward-compatible extensions to jstyle. - `(change)` [Added](https://github.com/antalk2/jabref/blob/122d5133fa6c7b44245c5ba5600d398775718664/src/main/java/org/jabref/logic/openoffice/style/OOBibStyle.java#L92) - some extra keywords, in `{prefix}_MARKUP_BEFORE`, `{prefix}_MARKUP_AFTER` pairs to allow bracketing some parts of citation marks with text and/or open/close tag pairs. - - [OOFormat](https://github.com/antalk2/jabref/blob/improve-reversibility-rebased-03/src/main/java/org/jabref/model/openoffice/ootext/OOFormat.java) - contains helpers to create the appropriate tags - - [OOText](https://github.com/antalk2/jabref/blob/improve-reversibility-rebased-03/src/main/java/org/jabref/model/openoffice/ootext/OOText.java) formalizes - the distinction from `String`. I did not change `String` to `OOText` in old code, (in particular in OOStyle). - - `rangesort` : ordering objects that have an `XTextRange`, optionally with an extra integer to break ties. - - `RangeSort.partitionAndSortRanges` : since `XTextRangeCompare` can only compare `XTextRange` values in - the same `XText`, we partition them accordingly and only sort within each partiion. - - `RangeSortable` (interface), `RangeSortEntry` (implements) : - When we replace `XTextRange` of citation marks in footnotes with the range of the footnote mark, - multiple citation marks may be mapped to the same location. To preserve the order between these, - `RangeSortable` allows this order to be indicated by returning appropriate indices from `getIndexInPosition` - - `RangeSortVisual` : sort in top-to-bottom left-to-right order. - Needs a functional `XTextViewCursor`. - Works on `RangeSortable` values. - - `FunctionalTextViewCursor` : helper to get a functional `XTextViewCursor` (cannot always) - - `RangeOverlapWithin` : check for overlaps within a set of `XTextRange` values. Probably O(n*log(n)). Used for all-to-all check of protected ranges. - - `RangeOverlapBetween` : check for overlaps between two sets of `XTextRange` values. Assumes one set is small. O(n*k). - Used for checking if the cursor is in a protected range. - - `backend` : interfaces to be provided by backends. + * `ootext` : to separate decisions on the format of references and citation marks from the actual insertion into the document, the earlier method [OOUtil.insertOOFormattedTextAtCurrentLocation](https://github.com/JabRef/jabref/blob/475b2989ffa8ec61c3327c62ed8f694149f83220/src/main/java/org/jabref/logic/openoffice/OOUtil.java#L112) was extended to handle new tags that describe actions earlier done in code. + * This became [OOTextIntoOO.write](https://github.com/antalk2/jabref/blob/122d5133fa6c7b44245c5ba5600d398775718664/src/main/java/org/jabref/model/openoffice/ootext/OOTextIntoOO.java#L149) + * `(change)` Now all output to the document goes through this, not only those from Layout. This allows the citation markers and `jstyle:Title` to use these tags. + * This allows some backward-compatible extensions to jstyle.\ + `(change)` [Added](https://github.com/antalk2/jabref/blob/122d5133fa6c7b44245c5ba5600d398775718664/src/main/java/org/jabref/logic/openoffice/style/OOBibStyle.java#L92) some extra keywords, in `{prefix}_MARKUP_BEFORE`, `{prefix}_MARKUP_AFTER` pairs to allow bracketing some parts of citation marks with text and/or open/close tag pairs. + * [OOFormat](https://github.com/antalk2/jabref/blob/improve-reversibility-rebased-03/src/main/java/org/jabref/model/openoffice/ootext/OOFormat.java) contains helpers to create the appropriate tags + * [OOText](https://github.com/antalk2/jabref/blob/improve-reversibility-rebased-03/src/main/java/org/jabref/model/openoffice/ootext/OOText.java) formalizes the distinction from `String`. I did not change `String` to `OOText` in old code, (in particular in OOStyle). + * `rangesort` : ordering objects that have an `XTextRange`, optionally with an extra integer to break ties. + * `RangeSort.partitionAndSortRanges` : since `XTextRangeCompare` can only compare `XTextRange` values in the same `XText`, we partition them accordingly and only sort within each partiion. + * `RangeSortable` (interface), `RangeSortEntry` (implements) :\ + When we replace `XTextRange` of citation marks in footnotes with the range of the footnote mark, multiple citation marks may be mapped to the same location. To preserve the order between these, `RangeSortable` allows this order to be indicated by returning appropriate indices from `getIndexInPosition` + * `RangeSortVisual` : sort in top-to-bottom left-to-right order.\ + Needs a functional `XTextViewCursor`.\ + Works on `RangeSortable` values. + * `FunctionalTextViewCursor` : helper to get a functional `XTextViewCursor` (cannot always) + * `RangeOverlapWithin` : check for overlaps within a set of `XTextRange` values. Probably O(n\*log(n)). Used for all-to-all check of protected ranges. + * `RangeOverlapBetween` : check for overlaps between two sets of `XTextRange` values. Assumes one set is small. O(n\*k). Used for checking if the cursor is in a protected range. + * `backend` : interfaces to be provided by backends.\ May change as new backends may need different APIs. - - `style` : data structures and interfaces used while going from ordered list of citation groups - to formatted citation markers and bibliography. Does not communicate with the document. Too long to fit here, starting a new section. + * `style` : data structures and interfaces used while going from ordered list of citation groups to formatted citation markers and bibliography. Does not communicate with the document. Too long to fit here, starting a new section. ## model/style At the core, -- we have `Citation` values - - represented in the document by their `citationKey` - - each may have a `pageInfo` -- A citation group (`CitationGroup`) has - - a list of citations (`citationsInStorageOrder`) - - an identifier `CitationGroupId cgid` - - this allows to refer to the group - - also used to associate the group to its citation markers location (outside the style part, - in [Backend](https://github.com/antalk2/jabref/blob/fed0952cbdaf7a76bcb09b3db5ac48f34f5ca388/src/main/java/org/jabref/logic/openoffice/backend/Backend52.java#L46)) - - `OODataModel dataModel` is here, in order to handle old (Jabref5.2) structure where pageInfo belonged to - CitationGroup not Citation - - `referenceMarkNameForLinking` is optional: can be used to crosslink to the citation marker - from the bibliography. -- `CitationGroups` represents the collection of citation groups. -Processing starts with creating a `CitationGroups` instance from the data stored in the document. - -- `CitedKey` represents a cited source, with ordered backreferences (using `CitationPath`) to the correponding -citations. - -- `CitedKeys` is just an order-preserving collection of `CitedKeys` that also supports lookup by -`citationKey`. While producing citation markers, we also create a corresponding `CitedKeys` -instance, and store it in `CitationGroups.bibliography`. This is already sorted, its entries have -`uniqueLetter` or `number` assigned, but not converted to markup yet. +* we have `Citation` values + * represented in the document by their `citationKey` + * each may have a `pageInfo` +* A citation group (`CitationGroup`) has + * a list of citations (`citationsInStorageOrder`) + * an identifier `CitationGroupId cgid` + * this allows to refer to the group + * also used to associate the group to its citation markers location (outside the style part, in [Backend](https://github.com/antalk2/jabref/blob/fed0952cbdaf7a76bcb09b3db5ac48f34f5ca388/src/main/java/org/jabref/logic/openoffice/backend/Backend52.java#L46)) + * `OODataModel dataModel` is here, in order to handle old (Jabref5.2) structure where pageInfo belonged to CitationGroup not Citation + * `referenceMarkNameForLinking` is optional: can be used to crosslink to the citation marker from the bibliography. +* `CitationGroups` represents the collection of citation groups.\ + Processing starts with creating a `CitationGroups` instance from the data stored in the document. +* `CitedKey` represents a cited source, with ordered backreferences (using `CitationPath`) to the correponding citations. +* `CitedKeys` is just an order-preserving collection of `CitedKeys` that also supports lookup by `citationKey`. While producing citation markers, we also create a corresponding `CitedKeys` instance, and store it in `CitationGroups.bibliography`. This is already sorted, its entries have `uniqueLetter` or `number` assigned, but not converted to markup yet. Common processing steps: -- We need `globalOrder` for the citation groups (provided externally) -`CitationGroups.setGlobalOrder()` -- We need to look up each citationKey in the bibliography databases: - - `CitationGroups.lookupCitations` collects the cited keys, - looks up each, then distributes the results to the citations. - Uses a temporary `CitedKeys` instance, based on unsorted citations and citation groups. -- `CitationGroups.imposeLocalOrder` fills `localOrder` in each `CitationGroup` - -- Now we have order of appearance for the citations (`globalOrder` and `localOrder`). +* We need `globalOrder` for the citation groups (provided externally) `CitationGroups.setGlobalOrder()` +* We need to look up each citationKey in the bibliography databases: + * `CitationGroups.lookupCitations` collects the cited keys, looks up each, then distributes the results to the citations. Uses a temporary `CitedKeys` instance, based on unsorted citations and citation groups. +* `CitationGroups.imposeLocalOrder` fills `localOrder` in each `CitationGroup` +* Now we have order of appearance for the citations (`globalOrder` and `localOrder`).\ We can create a `CitedKeys` instance (`bibliography`) according to this order. +* For citations numbered in order of first appearance we number the sources and distribute the numbers to the corresponding citations. +* For citations numbered in order of bibliography, we sort the bibliography, number, distribute. +* For author-year citations we have to decide on the letters `uniqueLetter` used to distinguish sources. This needs order of first appearance of the sources and recognizing clashing citation markers. This is done in logic, in [`OOProcessAuthorYearMarkers.createUniqueLetters()`](https://github.com/antalk2/jabref/blob/122d5133fa6c7b44245c5ba5600d398775718664/src/main/java/org/jabref/logic/openoffice/style/OOProcessAuthorYearMarkers.java#L49) +* We also mark first appearance of each source ([`setIsFirstAppearanceOfSourceInCitations`](https://github.com/antalk2/jabref/blob/fed0952cbdaf7a76bcb09b3db5ac48f34f5ca388/src/main/java/org/jabref/logic/openoffice/style/OOProcessAuthorYearMarkers.java#L146)) -- For citations numbered in order of first appearance we number the sources and distribute the numbers -to the corresponding citations. -- For citations numbered in order of bibliography, we sort the bibliography, number, distribute. - -- For author-year citations we have to decide on the letters `uniqueLetter` used to distinguish -sources. This needs order of first appearance of the sources and recognizing clashing citation markers. -This is done in logic, in [`OOProcessAuthorYearMarkers.createUniqueLetters()`](https://github.com/antalk2/jabref/blob/122d5133fa6c7b44245c5ba5600d398775718664/src/main/java/org/jabref/logic/openoffice/style/OOProcessAuthorYearMarkers.java#L49) -- We also mark first appearance of each source ([`setIsFirstAppearanceOfSourceInCitations`](https://github.com/antalk2/jabref/blob/fed0952cbdaf7a76bcb09b3db5ac48f34f5ca388/src/main/java/org/jabref/logic/openoffice/style/OOProcessAuthorYearMarkers.java#L146)) - -The entry point for this processing is: [`OOProcess.produceCitationMarkers`](https://github.com/antalk2/jabref/blob/fed0952cbdaf7a76bcb09b3db5ac48f34f5ca388/src/main/java/org/jabref/logic/openoffice/style/OOProcess.java#L69). +The entry point for this processing is: [`OOProcess.produceCitationMarkers`](https://github.com/antalk2/jabref/blob/fed0952cbdaf7a76bcb09b3db5ac48f34f5ca388/src/main/java/org/jabref/logic/openoffice/style/OOProcess.java#L69).\ It fills -- each `CitationGroup.citationMarker` -- `CitationGroups.bibliography` - - From bibliography `OOFormatBibliography.formatBibliography()` creates an `OOText` - ready to be written to the document. - +* each `CitationGroup.citationMarker` +* `CitationGroups.bibliography` + * From bibliography `OOFormatBibliography.formatBibliography()` creates an `OOText` ready to be written to the document. ## logic/style -- `StyleLoader` : not changed (knows about default styles) Used by GUI -- `OOPreFormatter` : LaTeX code to unicode and OOText tags. (not changed) -- `OOBibStyle` : is mostly concerned by loading/parsing jstyle files and presenting its pieces -to the rest. Originally it also contains code to format numeric and author-year citation markers. - - Details of their new implementations are in - [`OOBibStyleGetNumCitationMarker`](https://github.com/antalk2/jabref/blob/improve-reversibility-rebased-03/src/main/java/org/jabref/logic/openoffice/style/OOBibStyleGetNumCitationMarker.java) and - [`OOBibStyleGetCitationMarker`](https://github.com/antalk2/jabref/blob/improve-reversibility-rebased-03/src/main/java/org/jabref/logic/openoffice/style/OOBibStyleGetCitationMarker.java) - - The new implementations - - support pageInfo for each citation - - support unresolved citations - - instead of `List` and (`List` plus arrays and database) they expect - more self-contained entries `List`, `List`. - - We have distinct methods for `getNormalizedCitationMarker(CitationMarkerNormEntry)` and - `getNumCitationMarkerForBibliography(CitationMarkerNumericBibEntry)`. - - The corresponding interfaces in model/style: - - `CitationMarkerNumericEntry` - - `CitationMarkerEntry` - - `CitationMarkerNumericBibEntry` - - `CitationMarkerNormEntry` - describe their expected input entries. -- [`OOProcess.produceCitationMarkers`](https://github.com/antalk2/jabref/blob/fed0952cbdaf7a76bcb09b3db5ac48f34f5ca388/src/main/java/org/jabref/logic/openoffice/style/OOProcess.java#L69) -is the main entry point for style application. Calls to specific implementations -in `OOProcessCitationKeyMarkers`, `OOProcessNumericMarkers` and `OOProcessAuthorYearMarkers` -according to jstyle flags. +* `StyleLoader` : not changed (knows about default styles) Used by GUI +* `OOPreFormatter` : LaTeX code to unicode and OOText tags. (not changed) +* `OOBibStyle` : is mostly concerned by loading/parsing jstyle files and presenting its pieces to the rest. Originally it also contains code to format numeric and author-year citation markers. + * Details of their new implementations are in [`OOBibStyleGetNumCitationMarker`](https://github.com/antalk2/jabref/blob/improve-reversibility-rebased-03/src/main/java/org/jabref/logic/openoffice/style/OOBibStyleGetNumCitationMarker.java) and [`OOBibStyleGetCitationMarker`](https://github.com/antalk2/jabref/blob/improve-reversibility-rebased-03/src/main/java/org/jabref/logic/openoffice/style/OOBibStyleGetCitationMarker.java) + * The new implementations + * support pageInfo for each citation + * support unresolved citations + * instead of `List` and (`List` plus arrays and database) they expect more self-contained entries `List`, `List`. + * We have distinct methods for `getNormalizedCitationMarker(CitationMarkerNormEntry)` and `getNumCitationMarkerForBibliography(CitationMarkerNumericBibEntry)`. + * The corresponding interfaces in model/style: + * `CitationMarkerNumericEntry` + * `CitationMarkerEntry` + * `CitationMarkerNumericBibEntry` + * `CitationMarkerNormEntry`\ + describe their expected input entries. +* [`OOProcess.produceCitationMarkers`](https://github.com/antalk2/jabref/blob/fed0952cbdaf7a76bcb09b3db5ac48f34f5ca388/src/main/java/org/jabref/logic/openoffice/style/OOProcess.java#L69) is the main entry point for style application. Calls to specific implementations in `OOProcessCitationKeyMarkers`, `OOProcessNumericMarkers` and `OOProcessAuthorYearMarkers` according to jstyle flags. ## logic/backend -Details of encoding and retrieving data stored in a document as well as -the citation maker locations. Also contains dataModel-dependent code -(which could probably be moved out once the datamodel is settled). +Details of encoding and retrieving data stored in a document as well as the citation maker locations. Also contains dataModel-dependent code (which could probably be moved out once the datamodel is settled). -Creating and finding the bibliography (providing a cursor to write at) should be here too. +Creating and finding the bibliography (providing a cursor to write at) should be here too.\ These are currently in `UpdateBibliography` ## logic/frontend -- `OOFrontend` : has a `Backend` and `CitationGroups` - - Its constructor creates a backend, reads data from the document and creates a CitationGroups instance. - - provides functionality that requires both access to the document and the CitationGroups instance -- `RangeForOverlapCheck` used in `OOFrontend` -- `UpdateBibliography` : Create, find and update the bibliography in the document using output from - `produceCitationMarkers()` -- `UpdateCitationMarkers` create `CitationGroup`, update citation markers using output from - `produceCitationMarkers()` - +* `OOFrontend` : has a `Backend` and `CitationGroups` + * Its constructor creates a backend, reads data from the document and creates a CitationGroups instance. + * provides functionality that requires both access to the document and the CitationGroups instance +* `RangeForOverlapCheck` used in `OOFrontend` +* `UpdateBibliography` : Create, find and update the bibliography in the document using output from `produceCitationMarkers()` +* `UpdateCitationMarkers` create `CitationGroup`, update citation markers using output from `produceCitationMarkers()` ## logic/action @@ -173,16 +125,14 @@ GUI-independent part of implementations of GUI actions. ## gui -- `OOError` : common error messages and dialog titles - - adds `title` to `Jabrefexception` - - converts from some common exception types using type-specific message - - contains some dialog messages that do not correspond to exceptions - -- `OOBibBase2` : most activity was moved out from here to parts discussed above. - - connecting / selecting a document moved to `OOBibBaseConnect` - - the rest connects higher parts of the GUI to actions in logic - - does argument and precondition checking - - catches all exceptions - - shows error and warning dialogs - - adds `enterUndoContext`, `leaveUndoContext` around action code - +* `OOError` : common error messages and dialog titles + * adds `title` to `Jabrefexception` + * converts from some common exception types using type-specific message + * contains some dialog messages that do not correspond to exceptions +* `OOBibBase2` : most activity was moved out from here to parts discussed above. + * connecting / selecting a document moved to `OOBibBaseConnect` + * the rest connects higher parts of the GUI to actions in logic + * does argument and precondition checking + * catches all exceptions + * shows error and warning dialogs + * adds `enterUndoContext`, `leaveUndoContext` around action code diff --git a/docs/openoffice/order-of-appearance.md b/docs/openoffice/order-of-appearance.md index e43009b9f93..ce30956def4 100644 --- a/docs/openoffice/order-of-appearance.md +++ b/docs/openoffice/order-of-appearance.md @@ -1,118 +1,73 @@ +# Order of appearance of citation groups -# Order of appearance of citation groups (`globalOrder`) - -The order of appearance of citations is decided on -two levels: +The order of appearance of citations is decided on two levels: 1. their order within each citation group (`localOrder`), and -2. the order of the citation -groups that appear as citation markers in the text (`globalOrder`). +2. the order of the citation groups that appear as citation markers in the text (`globalOrder`). -This page is about the latter: how to decide the order of appearance (numbering sequence) of a set -of citation markers? +This page is about the latter: how to decide the order of appearance (numbering sequence) of a set of citation markers? ## Conceptually In a continuous text it is easy: take the textual order of citation markers. -In the presence of figures, tables, footnotes/endnotes possibly far from the location they are -referred to in the text or wrapped around with text it becomes less obvious what is the correct -order. +In the presence of figures, tables, footnotes/endnotes possibly far from the location they are referred to in the text or wrapped around with text it becomes less obvious what is the correct order. Examples: -- References in footnotes: are they *after* the page content, or number them as if they appeared at - the footnote mark? (JabRef does the latter) -- A figure with references in its caption. Text may flow on either or both sides. +* References in footnotes: are they _after_ the page content, or number them as if they appeared at the footnote mark? (JabRef does the latter) +* A figure with references in its caption. Text may flow on either or both sides.\ Where should we insert these in the sequence? -- In a two-column layout, a text frame or figure mostly, but not fully in the second column: shall - we consider it part of the second column? - +* In a two-column layout, a text frame or figure mostly, but not fully in the second column: shall we consider it part of the second column? ## Technically +In LibreOffice, a document has a main text that supports the [XText](https://api.libreoffice.org/docs/idl/ref/interfacecom\_1\_1sun\_1\_1star\_1\_1text\_1\_1XText.html) interface.\ +This allows several types of [XTextContent](https://api.libreoffice.org/docs/idl/ref/interfacecom\_1\_1sun\_1\_1star\_1\_1text\_1\_1XTextContent.html) to be inserted. -In LibreOffice, a document has a main text that supports the -[XText](https://api.libreoffice.org/docs/idl/ref/interfacecom_1_1sun_1_1star_1_1text_1_1XText.html) -interface. -This allows several types of -[XTextContent](https://api.libreoffice.org/docs/idl/ref/interfacecom_1_1sun_1_1star_1_1text_1_1XTextContent.html) -to be inserted. - -- Some of these allow text inside with further insertions. +* Some of these allow text inside with further insertions. ### Anchors -- Many, but not all XTextContent types support getting a "technical" insertion point or text range - through [getAnchor](https://api.libreoffice.org/docs/idl/ref/interfacecom_1_1sun_1_1star_1_1text_1_1XTextContent.html#ae82a8b42f6b2578549b68b4483a877d3). -- In Libreoffice positioning both a frame and its anchor seems hard: moving the frame tends to also - move the anchor. -- Consequence: producing an order of appearance for the citation groups based solely on `getAnchor` - calls may be impossible. - - - Allowing or requiring the user to insert "logical anchors" for frames and other "floating" parts - might help to alleviate these problems. +* Many, but not all XTextContent types support getting a "technical" insertion point or text range through [getAnchor](https://api.libreoffice.org/docs/idl/ref/interfacecom\_1\_1sun\_1\_1star\_1\_1text\_1\_1XTextContent.html#ae82a8b42f6b2578549b68b4483a877d3). +* In Libreoffice positioning both a frame and its anchor seems hard: moving the frame tends to also move the anchor. +* Consequence: producing an order of appearance for the citation groups based solely on `getAnchor` calls may be impossible. + * Allowing or requiring the user to insert "logical anchors" for frames and other "floating" parts might help to alleviate these problems. ### Sorting within a `Text` -The text ranges occupied by the citation markers support the -[XTextRange](https://api.libreoffice.org/docs/idl/ref/interfacecom_1_1sun_1_1star_1_1text_1_1XTextRange.html) -interface. +The text ranges occupied by the citation markers support the [XTextRange](https://api.libreoffice.org/docs/idl/ref/interfacecom\_1\_1sun\_1\_1star\_1\_1text\_1\_1XTextRange.html) interface. -- These provide access to the XText they are contained in. -- The [Text](https://api.libreoffice.org/docs/idl/ref/servicecom_1_1sun_1_1star_1_1text_1_1Text.html) service -may support (optional) the [XTextRangeCompare](https://api.libreoffice.org/docs/idl/ref/interfacecom_1_1sun_1_1star_1_1text_1_1XTextRangeCompare.html) -interface, that allows two XTextRange values to be compared if both belong to this `Text` +* These provide access to the XText they are contained in. +* The [Text](https://api.libreoffice.org/docs/idl/ref/servicecom\_1\_1sun\_1\_1star\_1\_1text\_1\_1Text.html) service may support (optional) the [XTextRangeCompare](https://api.libreoffice.org/docs/idl/ref/interfacecom\_1\_1sun\_1\_1star\_1\_1text\_1\_1XTextRangeCompare.html) interface, that allows two XTextRange values to be compared if both belong to this `Text` ### Visual ordering -- The cursor used by the user is available as an - [XTextViewCursor](https://api.libreoffice.org/docs/idl/ref/interfacecom_1_1sun_1_1star_1_1text_1_1XTextViewCursor.html) -- If we can get it and can set its position in the document to each XTextRange to be sorted, and ask its - [getPosition](https://api.libreoffice.org/docs/idl/ref/interfacecom_1_1sun_1_1star_1_1text_1_1XTextViewCursor.html#a9b2bafd342ef75b5d504a9313dbb1389) - to provide coordinates "relative to the top left position of the first page of the document.", - then we can sort by these coordinates in top-to-bottom left-to-right order. -- Note: in some cases, for example when the cursor is in a comment (as in - `Libreoffice:[menu:Insert]/[Comment]`), the XTextViewCursor is not available (I know of no way to - get it). -- In some other cases, for example when an image is selected, the XTextViewCursor we normally receive is not 'functional': -we cannot position it for getting coordinates for the citation marks. -The [FunctionalTextViewCursor](https://github.com/antalk2/jabref/blob/improve-reversibility-rebased-03/src/main/java/org/jabref/model/openoffice/rangesort/FunctionalTextViewCursor.java) -class can solve this case by accessing and manipulating the cursor through [XSelectionSupplier](https://api.libreoffice.org/docs/idl/ref/interfacecom_1_1sun_1_1star_1_1view_1_1XSelectionSupplier.html) +* The cursor used by the user is available as an [XTextViewCursor](https://api.libreoffice.org/docs/idl/ref/interfacecom\_1\_1sun\_1\_1star\_1\_1text\_1\_1XTextViewCursor.html) +* If we can get it and can set its position in the document to each XTextRange to be sorted, and ask its [getPosition](https://api.libreoffice.org/docs/idl/ref/interfacecom\_1\_1sun\_1\_1star\_1\_1text\_1\_1XTextViewCursor.html#a9b2bafd342ef75b5d504a9313dbb1389) to provide coordinates "relative to the top left position of the first page of the document.", then we can sort by these coordinates in top-to-bottom left-to-right order. +* Note: in some cases, for example when the cursor is in a comment (as in `Libreoffice:[menu:Insert]/[Comment]`), the XTextViewCursor is not available (I know of no way to get it). +* In some other cases, for example when an image is selected, the XTextViewCursor we normally receive is not 'functional': we cannot position it for getting coordinates for the citation marks. The [FunctionalTextViewCursor](https://github.com/antalk2/jabref/blob/improve-reversibility-rebased-03/src/main/java/org/jabref/model/openoffice/rangesort/FunctionalTextViewCursor.java) class can solve this case by accessing and manipulating the cursor through [XSelectionSupplier](https://api.libreoffice.org/docs/idl/ref/interfacecom\_1\_1sun\_1\_1star\_1\_1view\_1\_1XSelectionSupplier.html) Consequences of getting these visual coordinates and using them to order the citation markers -- allows uniform handling of the markers. Works in footnotes, tables, frames (apparently anywhere) -- requires moving the user visible cursor to each position and with [screen - refresh](https://github.com/antalk2/jabref/blob/improve-reversibility-rebased-03/src/main/java/org/jabref/model/openoffice/uno/UnoScreenRefresh.java) - enabled. +* allows uniform handling of the markers. Works in footnotes, tables, frames (apparently anywhere) +* requires moving the user visible cursor to each position and with [screen refresh](https://github.com/antalk2/jabref/blob/improve-reversibility-rebased-03/src/main/java/org/jabref/model/openoffice/uno/UnoScreenRefresh.java) enabled.\ `(problem)` This results in some user-visible flashing and scrolling around in the document view. -- The expression "relative to the top left position of the first page of the document" is - understood literally, "as on the screen". - `(problem)` Showing pages side by side or using a two-column layout - will result in markers in the top half of the second column or page to be sorted before those on the bottom - of the first column of the first page. - +* The expression "relative to the top left position of the first page of the document" is understood literally, "as on the screen".\ + `(problem)` Showing pages side by side or using a two-column layout will result in markers in the top half of the second column or page to be sorted before those on the bottom of the first column of the first page. ## JabRef Jabref uses the following steps for sorting sorting citation markers (providing `globalOrder`): -1. the textranges of citation marks in footnotes are replaced by the textranges of the footnote - marks. +1. the textranges of citation marks in footnotes are replaced by the textranges of the footnote marks. 2. get the positions (coordinates) of these marks 3. sort in top-to-botton left-to-right order - -`(problem)` In JabRef5.2 the positions of citation marks within the same footnote become -indistinguishable, thus their order after sorting may differ from their order in the footnote text. +`(problem)` In JabRef5.2 the positions of citation marks within the same footnote become indistinguishable, thus their order after sorting may differ from their order in the footnote text.\ This caused problems for -1. numbering order - `(solved)` by keeping track of the order-in-footnote of citation markers during sorting using - [getIndexInPosition](https://github.com/antalk2/jabref/blob/122d5133fa6c7b44245c5ba5600d398775718664/src/main/java/org/jabref/model/openoffice/rangesort/RangeSortable.java#L21)) -2. `click:Merge`: It examines *consecutive* pairs of citation groups if they can be merged. Wrong -order may result in not discovering some mergeable pairs or attempting to merge in wrong order. -`(solved)` by not using visual order, only XTextRangeCompare-based order within each XText -[here](https://github.com/antalk2/jabref/blob/122d5133fa6c7b44245c5ba5600d398775718664/src/main/java/org/jabref/logic/openoffice/action/EditMerge.java#L325)) - +1. numbering order\ + `(solved)` by keeping track of the order-in-footnote of citation markers during sorting using [getIndexInPosition](https://github.com/antalk2/jabref/blob/122d5133fa6c7b44245c5ba5600d398775718664/src/main/java/org/jabref/model/openoffice/rangesort/RangeSortable.java#L21)) +2. `click:Merge`: It examines _consecutive_ pairs of citation groups if they can be merged. Wrong order may result in not discovering some mergeable pairs or attempting to merge in wrong order.\ + `(solved)` by not using visual order, only XTextRangeCompare-based order within each XText [here](https://github.com/antalk2/jabref/blob/122d5133fa6c7b44245c5ba5600d398775718664/src/main/java/org/jabref/logic/openoffice/action/EditMerge.java#L325)) diff --git a/docs/openoffice/overview.md b/docs/openoffice/overview.md index f3a6ed251f6..0cec0ad23b2 100644 --- a/docs/openoffice/overview.md +++ b/docs/openoffice/overview.md @@ -1,297 +1,222 @@ - # Overview -This is a partial overview of the OpenOffice/LibreOffice panel and the -code behind. - -- To access the panel: `JabRef:/[menu:View]/[OpenOffice/LibreOffice]` -- The user documentation is at -[https://docs.jabref.org/cite/openofficeintegration](https://docs.jabref.org/cite/openofficeintegration) - +## Overview -I am going to refer to OpenOffice Writer and LibreOffice Writer as -LibreOffice or LO: their UNO APIs are still mostly identical, but I -only tested with LibreOffice and differences do exist. +This is a partial overview of the OpenOffice/LibreOffice panel and the code behind. -## Subject +* To access the panel: `JabRef:/[menu:View]/[OpenOffice/LibreOffice]` +* The user documentation is at [https://docs.jabref.org/cite/openofficeintegration](https://docs.jabref.org/cite/openofficeintegration) -- What is stored in a document, how. -- Generating citation markers and bibliography - - (excluding the bibliography entries, which is delegated to the layout module) +I am going to refer to OpenOffice Writer and LibreOffice Writer as LibreOffice or LO: their UNO APIs are still mostly identical, but I only tested with LibreOffice and differences do exist. +### Subject -## The purpose of the panel +* What is stored in a document, how. +* Generating citation markers and bibliography + * (excluding the bibliography entries, which is delegated to the layout module) -- Allow the user to insert **citations** in a LibreOffice writer document. -- Automatically format these according to some prescribed style as **citation markers**. -- Generate a **bibliography**, also formatted according to the style. - - The bibliography consists of a title (e.g. "References") and a sorted list - of formatted bibliography entries, possibly prefixed with a marker (e.g. "[1]") -- It also allows some related activities: connect to a document, select a style, group ("Merge") the - citations for nicer output, ungroup ("Separate") them to move or delete them individually, - edit ("Manage") their page-info parts, and collect the database entries of cited sources - to a new database. +### The purpose of the panel -## Citation types +* Allow the user to insert **citations** in a LibreOffice writer document. +* Automatically format these according to some prescribed style as **citation markers**. +* Generate a **bibliography**, also formatted according to the style. + * The bibliography consists of a title (e.g. "References") and a sorted list of formatted bibliography entries, possibly prefixed with a marker (e.g. "\[1]") +* It also allows some related activities: connect to a document, select a style, group ("Merge") the citations for nicer output, ungroup ("Separate") them to move or delete them individually, edit ("Manage") their page-info parts, and collect the database entries of cited sources to a new database. -Citations (actually citation groups, see below) have three types -depending on how the citation marker is intended to appear in the -text: +### Citation types -- **Parenthesized**: "(Smith, 2000)" -- **In-text**: "Smith (2000)" -- **Invisible**: no visible citation mark. - - An invisible citation mark lets the user to use any form for the citation - by taking control (and responsibility) back from the style. - - Like the other two citation types, they have a location in the document. - - In the bibliography these behave as the other two citation types. - - In LibreOffice (`LibreOffice:[Ctrl-F8]` or`LibreOffice:[menu:View]/[Field Shadings]`) - shows reference marks with gray background. Invisible citation marks appear as a thin gray rectangle. +Citations (actually citation groups, see below) have three types depending on how the citation marker is intended to appear in the text: -- These citation types correspond to `\citep{Smith2000}`, - `\citet{Smith2000}` in - [natbib](http://tug.ctan.org/macros/latex/contrib/natbib/natnotes.pdf) - and `\nocite{Smith2000}`. I will use `\citep`, `\citet` and `\citen` in "LaTeX pseudocode" below. +* **Parenthesized**: "(Smith, 2000)" +* **In-text**: "Smith (2000)" +* **Invisible**: no visible citation mark. + * An invisible citation mark lets the user to use any form for the citation by taking control (and responsibility) back from the style. + * Like the other two citation types, they have a location in the document. + * In the bibliography these behave as the other two citation types. + * In LibreOffice (`LibreOffice:[Ctrl-F8]` or`LibreOffice:[menu:View]/[Field Shadings]`) shows reference marks with gray background. Invisible citation marks appear as a thin gray rectangle. +* These citation types correspond to `\citep{Smith2000}`, `\citet{Smith2000}` in [natbib](http://tug.ctan.org/macros/latex/contrib/natbib/natnotes.pdf) and `\nocite{Smith2000}`. I will use `\citep`, `\citet` and `\citen` in "LaTeX pseudocode" below. -## PageInfo +### PageInfo -The citations can be augmented with a string detailing which part -of a document is cited, for example "page 11" or "chapter 2". +The citations can be augmented with a string detailing which part of a document is cited, for example "page 11" or "chapter 2". Sample citation markers (with LaTeX pseudocode): -- `\citep[page 11]{Smith2000}` "(Smith, 2000; page 11)" -- `\citet[page 11]{Smith2000}` "Smith (2000; page 11)" -- `\citen[page 11]{Smith2000}` "" +* `\citep[page 11]{Smith2000}` "(Smith, 2000; page 11)" +* `\citet[page 11]{Smith2000}` "Smith (2000; page 11)" +* `\citen[page 11]{Smith2000}` "" +* This string is referred to as **`pageInfo`** in the code. +* In the GUI the labels "Cite special", "Extra information (e.g. page number)" are used. -- This string is referred to as **`pageInfo`** in the code. -- In the GUI the labels "Cite special", "Extra information - (e.g. page number)" are used. - -## Citation groups +### Citation groups Citations can be grouped. -A group of parenthesized citations share the parentheses around, like this: - "(Smith, 2000; Jones 2001)". +A group of parenthesized citations share the parentheses around, like this:\ +"(Smith, 2000; Jones 2001)". -- Examples with pseudocode: - - `\citep{Smith2000,Jones2001}` "(Smith, 2000; Jones 2001)" - - `\citet{Smith2000,Jones2001}` "Smith (2000); Jones (2001)" - - `\citen{Smith2000,Jones2001}` "" +* Examples with pseudocode: + * `\citep{Smith2000,Jones2001}` "(Smith, 2000; Jones 2001)" + * `\citet{Smith2000,Jones2001}` "Smith (2000); Jones (2001)" + * `\citen{Smith2000,Jones2001}` "" From the user's point of view, citation groups can be created by -1. Selecting multiple entries in a bibliography database, then - - `[click:Cite]` or - - `[click:Cite in-text]` or - - `[click:Cite special]` or - - `[click:Insert empty citation]` in the panel. - - This method allows any of the citation types to be used. - -2. `[click:Merge citations]` finds all sets of consecutive citations in the text and - replaces each with a group. - - `(change)` The new code only merges consecutive [parenthesized](https://github.com/antalk2/jabref/blob/122d5133fa6c7b44245c5ba5600d398775718664/src/main/java/org/jabref/logic/openoffice/action/EditMerge.java#L183) citations. - - This is inconsistent with the solution used in `[click:Cite]` - - My impression is that - - groups of in-text or invisible citations are probably not useful - - mixed groups are even less. However, with a numbered style - there is no visual difference between parenthesized and in-text - citations, the user may be left wondering why did merge not work. - - One way out could be to merge as a "parenthesized" - group. But then users switching between styles get a - surprise, we have unexpectedly overridden their choice. - - I would prefer a visible log-like warning that does not require - a click to close and lets me see multiple warnings. - Could the main window have such an area at the bottom? - - Starting with JabRef 5.3 there is also `[click:Separate citations]` - that breaks all groups to single citations. - - This allows - - deleting individual citations - - moving individual citations around (between citation groups) - - (copy does not work) - - (Moving a citation within a group has no effect on the final output - due to sorting of citations within groups. See [Sorting within a citation group](#localOrder)) - -In order to manage single citations and groups uniformly, we -consider each citation in the document to belong to a citation -group, even if it means a group containing a single citation. - -Citation groups correspond to citation markers in the document. The latter is empty for invisible -citation groups. When creating the citation markers, the citations in the group -are processed together. - -# Citation styles - -The details of how to format the bibliography and the citation markers are described in a text file. - -- These normally use `.jstyle` extension, and I will refer to them as jstyle files. -- See the [User documentation](https://docs.jabref.org/cite/openofficeintegration#the-style-file) - for details. -- I will refer to keywords in jstyle files as `jstyle:keyword` below. +1. Selecting multiple entries in a bibliography database, then + * `[click:Cite]` or + * `[click:Cite in-text]` or + * `[click:Cite special]` or + * `[click:Insert empty citation]` in the panel. -Four major types citation of styles can be described by a jstyle. + This method allows any of the citation types to be used. +2. `[click:Merge citations]` finds all sets of consecutive citations in the text and replaces each with a group. + * `(change)` The new code only merges consecutive [parenthesized](https://github.com/antalk2/jabref/blob/122d5133fa6c7b44245c5ba5600d398775718664/src/main/java/org/jabref/logic/openoffice/action/EditMerge.java#L183) citations. + * This is inconsistent with the solution used in `[click:Cite]` + * My impression is that + * groups of in-text or invisible citations are probably not useful + * mixed groups are even less. However, with a numbered style there is no visual difference between parenthesized and in-text citations, the user may be left wondering why did merge not work. + * One way out could be to merge as a "parenthesized" group. But then users switching between styles get a surprise, we have unexpectedly overridden their choice. + * I would prefer a visible log-like warning that does not require a click to close and lets me see multiple warnings. Could the main window have such an area at the bottom? + * Starting with JabRef 5.3 there is also `[click:Separate citations]` that breaks all groups to single citations. + * This allows + * deleting individual citations + * moving individual citations around (between citation groups) + * (copy does not work) + * (Moving a citation within a group has no effect on the final output due to sorting of citations within groups. See [Sorting within a citation group](overview.md#localOrder)) -- (1) `jstyle:BibTeXKeyCitations` +In order to manage single citations and groups uniformly, we consider each citation in the document to belong to a citation group, even if it means a group containing a single citation. - - The citation markers show the citationKey. - - It is not fully implemented - - does not produce markers before the bibliography entries - - does not show pageInfo - - It is not advertised in the [User documentation](https://docs.jabref.org/cite/openofficeintegration#the-style-file). - - Its intended purpose may be +Citation groups correspond to citation markers in the document. The latter is empty for invisible citation groups. When creating the citation markers, the citations in the group are processed together. - - (likely) a proper style, with "[Smith2000]" style citation markers - - (possibly) a style for "draft mode" that - - can avoid lookup of citation markers in the database when only the - citation markers are updated - - can produce unique citation markers trivially (only needs local information) - - makes the citation keys visible to the user - - can work without knowing the order of appearance of citation groups - - In case we expect to handle larger documents, a "draft mode" - minimizing work during `[click:Cite]` may be useful. +## Citation styles -- There are two types of numbered (`jstyle:IsNumberEntries`) citation styles: - - - (2) Citations numbered in order of first appearance (`jstyle:IsSortByPosition`) - - (3) Citations numbered according to their order in the sorted bibliography +The details of how to format the bibliography and the citation markers are described in a text file. -- (4) Author-year styles +* These normally use `.jstyle` extension, and I will refer to them as jstyle files. +* See the [User documentation](https://docs.jabref.org/cite/openofficeintegration#the-style-file) for details. +* I will refer to keywords in jstyle files as `jstyle:keyword` below. -# Sorting +Four major types citation of styles can be described by a jstyle. -## Sorting te bibliography +* (1) `jstyle:BibTeXKeyCitations` + * The citation markers show the citationKey. + * It is not fully implemented + * does not produce markers before the bibliography entries + * does not show pageInfo + * It is not advertised in the [User documentation](https://docs.jabref.org/cite/openofficeintegration#the-style-file). + * Its intended purpose may be + * (likely) a proper style, with "\[Smith2000]" style citation markers + * (possibly) a style for "draft mode" that + * can avoid lookup of citation markers in the database when only the citation markers are updated + * can produce unique citation markers trivially (only needs local information) + * makes the citation keys visible to the user + * can work without knowing the order of appearance of citation groups + * In case we expect to handle larger documents, a "draft mode" minimizing work during `[click:Cite]` may be useful. +* There are two types of numbered (`jstyle:IsNumberEntries`) citation styles: + * (2) Citations numbered in order of first appearance (`jstyle:IsSortByPosition`) + * (3) Citations numbered according to their order in the sorted bibliography +* (4) Author-year styles + +## Sorting + +### Sorting te bibliography The bibliography is sorted in (author, year, title) order -- except for `jstyle:IsSortByPosition`, that uses the order of first - appearance of the cited sources. +* except for `jstyle:IsSortByPosition`, that uses the order of first appearance of the cited sources. -## Ordering the citations +### Ordering the citations -The order of appearance of citations (as considered during numbering and adding letters after the -year to ensure that citation markers uniquely identify sources in the bibliography) is decided on -two levels. +The order of appearance of citations (as considered during numbering and adding letters after the year to ensure that citation markers uniquely identify sources in the bibliography) is decided on two levels. 1. Their order within each citation group (`localOrder`), and 2. the order of the citation groups (citation markers) in the text (`globalOrder`). -### Sorting within a citation group (`localOrder`) - -The order of citations within a citation group is controlled by -`jstyle:MultiCiteChronological`. +#### Sorting within a citation group (`localOrder`) -- true asks for (year, author, title) ordering, -- false for (author, year, title). -- (There is no option for "in the order provided by the user"). +The order of citations within a citation group is controlled by `jstyle:MultiCiteChronological`. +* true asks for (year, author, title) ordering, +* false for (author, year, title). +* (There is no option for "in the order provided by the user"). For author-year citation styles this ordering is used directly. -- The (author, year, title) order promotes discovering citations - sharing authors and year and emitting them in a shorter form. For - example as "(Smith 2000a,b)". - -For numbered styles, the citations within a group are sorted again -during generation of the citation marker, now by the numbers -themselves. The result of this sorting is not saved, only affects the citation marker. - -- Series of consecutive number are replaced with ranges: for example "[1-5; 11]" - -### Order of the citation groups (`globalOrder`) +* The (author, year, title) order promotes discovering citations sharing authors and year and emitting them in a shorter form. For example as "(Smith 2000a,b)". -The location of each citation group in the document is provided by the -user. In a text with no insets, footnotes, figures etc. this directly -provides the order. In the presence of these, it becomes more -complicated, see [Order of appearance of -citation groups](order-of-appearance.md). +For numbered styles, the citations within a group are sorted again during generation of the citation marker, now by the numbers themselves. The result of this sorting is not saved, only affects the citation marker. -### Order of the citations +* Series of consecutive number are replaced with ranges: for example "\[1-5; 11]" -- `globalOrder` and `localOrder` together provide the order of appearance of - citations -- This also provides the order of first appearance of the cited sources. +#### Order of the citation groups (`globalOrder`) - First appearance order of sources is used - - in `jstyle:IsSortByPosition` numbered styles - - in author-year styles: first appearance of "Smith200a" - should precede that of "Smith200b". - To achieve this, the sources get the letters - according the order of their first appearance. - - This seems to contradict the statement "The bibliography is - sorted in (author, year, title) order" above. - It does not. As of JabRef 5.3 both are true. - Consequence: in the references - Smith2000b may precede Smith2000a. - ([reported](https://github.com/JabRef/jabref/issues/7805)) - - Some author-year citation styles prescribe a higher threshold on - the number of authors for switching to "FirstAuthor et al." form - (`jstyle:MaxAuthors`) at the first citation of a source - (`jstyle:MaxAuthorsFirst`) +The location of each citation group in the document is provided by the user. In a text with no insets, footnotes, figures etc. this directly provides the order. In the presence of these, it becomes more complicated, see [Order of appearance of citation groups](order-of-appearance.md). +#### Order of the citations -# What is stored in a document (JabRef5.2) +* `globalOrder` and `localOrder` together provide the order of appearance of citations +* This also provides the order of first appearance of the cited sources. -- Each group of citations has a reference mark. + First appearance order of sources is used - (Reference marks are shown in LibreOffice in Navigator, under "References". - To show the Navigator: `LibreOffice:[menu:View]/[Navigator]` or `LibreOffice:[key:F5]`) + * in `jstyle:IsSortByPosition` numbered styles + * in author-year styles: first appearance of "Smith200a" should precede that of "Smith200b".\ + To achieve this, the sources get the letters according the order of their first appearance. + * This seems to contradict the statement "The bibliography is sorted in (author, year, title) order" above.\ + It does not. As of JabRef 5.3 both are true.\ + Consequence: in the references Smith2000b may precede Smith2000a. ([reported](https://github.com/JabRef/jabref/issues/7805)) + * Some author-year citation styles prescribe a higher threshold on the number of authors for switching to "FirstAuthor et al." form (`jstyle:MaxAuthors`) at the first citation of a source (`jstyle:MaxAuthorsFirst`) - Its purposes: +## What is stored in a document (JabRef5.2) - 1. The text range of the reference mark tells where to write or update the citation mark. - 2. The name of the reference mark +* Each group of citations has a reference mark. - - Lets us select only those reference marks that belong to us - - Encodes the citation type - - Contains the list of citation keys that belong to this group - - It may contain an extra number, to make the name unique in the document - - Format: `"JR_cite{number}_{type}_{citationKeys}"`, where - - `{number}` is either empty or an unsigned integer (it can be zero) to make the name unique - - `{type}` is 1, 2, or 3 for parenthesized, in-text and invisible - - `{citationKeys}` contains the comma-separated list of citation keys - - Examples: - - `JR_cite_1_Smith2000` (empty number part, parenthesized, single citation) - - `JR_cite0_2_Smith2000,Jones2001` (number part is 0, in-text, two citations) - - `JR_cite1_3_Smith2000,Jones2001` (number part is 1, invisible, two citations) + (Reference marks are shown in LibreOffice in Navigator, under "References".\ + To show the Navigator: `LibreOffice:[menu:View]/[Navigator]` or `LibreOffice:[key:F5]`) -- Each group of citations may have an associated pageInfo. + Its purposes: - - In LibreOffice, these can be found at + 1. The text range of the reference mark tells where to write or update the citation mark. + 2. The name of the reference mark + * Lets us select only those reference marks that belong to us + * Encodes the citation type + * Contains the list of citation keys that belong to this group + * It may contain an extra number, to make the name unique in the document + * Format: `"JR_cite{number}_{type}_{citationKeys}"`, where + * `{number}` is either empty or an unsigned integer (it can be zero) to make the name unique + * `{type}` is 1, 2, or 3 for parenthesized, in-text and invisible + * `{citationKeys}` contains the comma-separated list of citation keys + * Examples: + * `JR_cite_1_Smith2000` (empty number part, parenthesized, single citation) + * `JR_cite0_2_Smith2000,Jones2001` (number part is 0, in-text, two citations) + * `JR_cite1_3_Smith2000,Jones2001` (number part is 1, invisible, two citations) +* Each group of citations may have an associated pageInfo. + * In LibreOffice, these can be found at\ `LibreOffice:/[menu:File]/[Properties]/[Custom Properties]` - - The property names are identical to the name of the reference mark - corresponding to the citation group. - - JabRef 5.2 never cleans up these, they are left around. + * The property names are identical to the name of the reference mark corresponding to the citation group. + * JabRef 5.2 never cleans up these, they are left around.\ `(problem)` New citations may "pick up" these unexpectedly. - -- The bibliography, if not found, is created at the end of the document. - - The location and extent of the bibliography is the content of the Section named `"JR_bib"`. +* The bibliography, if not found, is created at the end of the document. + * The location and extent of the bibliography is the content of the Section named `"JR_bib"`.\ (In LibreOffice Sections are listed in the Navigator panel, under "Sections") - - JabRef 5.2 also creates a bookmark named `"JR_bib_end"`, but does - not use it. During bibliography update it attempts to create it again without - removing the old bookmark. The result is a new bookmark, with a number appended to its name - (by LibreOffice, to ensure unique names of bookmarks). - - [Correction in new code](https://github.com/antalk2/jabref/blob/122d5133fa6c7b44245c5ba5600d398775718664/src/main/java/org/jabref/logic/openoffice/frontend/UpdateBibliography.java#L147): - remove the old before creating the new. - -# How does it interact with the document? - -- "stateless" - JabRef is only loosely coupled to the document. - Between two GUI actions it does not receive any information from LibreOffice. - It cannot distinguish between the user changing a single character in the document or rewriting everything. + * JabRef 5.2 also creates a bookmark named `"JR_bib_end"`, but does not use it. During bibliography update it attempts to create it again without removing the old bookmark. The result is a new bookmark, with a number appended to its name (by LibreOffice, to ensure unique names of bookmarks). + * [Correction in new code](https://github.com/antalk2/jabref/blob/122d5133fa6c7b44245c5ba5600d398775718664/src/main/java/org/jabref/logic/openoffice/frontend/UpdateBibliography.java#L147): remove the old before creating the new. -- Access data - - During a `[click:cite]` or `[click:Update]` we need the reference mark names. - - Get all reference mark names - - Filter (only ours) - - Parse: gives citation type (for the group), citation keys - - Access/store pageInfo: based on reference mark name and property name being equal - - Creating a citation group: (`[click:cite]`) - - Creates a reference mark at the cursor, with a name as described above. -- Update (refreshing citation markers and bibliography): - - citation markers: the content of the reference mark - - bibliography: the content of the Section (in LibreOffice sense) - named `"JR_bib"`. +## How does it interact with the document? + +* "stateless"\ + JabRef is only loosely coupled to the document.\ + Between two GUI actions it does not receive any information from LibreOffice.\ + It cannot distinguish between the user changing a single character in the document or rewriting everything. +* Access data + * During a `[click:cite]` or `[click:Update]` we need the reference mark names. + * Get all reference mark names + * Filter (only ours) + * Parse: gives citation type (for the group), citation keys + * Access/store pageInfo: based on reference mark name and property name being equal + * Creating a citation group: (`[click:cite]`) + * Creates a reference mark at the cursor, with a name as described above. +* Update (refreshing citation markers and bibliography): + * citation markers: the content of the reference mark + * bibliography: the content of the Section (in LibreOffice sense) named `"JR_bib"`. diff --git a/docs/openoffice/problems.md b/docs/openoffice/problems.md index c23b39a7d25..b0bd19e0700 100644 --- a/docs/openoffice/problems.md +++ b/docs/openoffice/problems.md @@ -1,97 +1,65 @@ -# Problems in JabRef 5.2 +# Problems ## pageInfo should belong to citations, not citation groups -- Creating `[click:Separate]` revealed - a `(problem)`: pageInfo strings are conceptually associated with - citations, but the implementation associates them to citation groups. - The number of available - pageInfo slots changes during`[click:Merge]` and `[click:Separate]` while the number of citations - remains fixed. - - The proposed solution was to change the association. - - Not only reference marks (citation groups) need unique identifiers, but also citations. - Possible encoding for reference mark names: - `JR_cite{type}_{number1}_{citationKey1},{number2}_{citationKey2}` - where `{type}` encodes the citation type (for the group), `{citationKey1}` is made unique by choosing an appropriate number for `{number1}` - This would allow - `JR_cite_{number1}_{citationKey1}` to be used as a property name for storing the pageInfo. - - Changes required to - - reference mark search, name generation and parsing - - name generation and parsing for properties storing pageInfo values - - in-memory representation - - JabRef 5.2 does not collect pageInfo values, accesses only when needed. - So it would be change to code accessing them. - - The proposed representation does collect, to allow separation of getting from the document - and processing - - insertion of pageInfo into citation markers: JabRef 5.2 injects a single pageInfo before the closing parenthesis, - now we need to handle several values - - `[click:Manage citations]` should work on citations, not citation groups. - +* Creating `[click:Separate]` revealed\ + a `(problem)`: pageInfo strings are conceptually associated with citations, but the implementation associates them to citation groups.\ + The number of available pageInfo slots changes during`[click:Merge]` and `[click:Separate]` while the number of citations remains fixed. + * The proposed solution was to change the association. + * Not only reference marks (citation groups) need unique identifiers, but also citations.\ + Possible encoding for reference mark names:\ + `JR_cite{type}_{number1}_{citationKey1},{number2}_{citationKey2}`\ + where `{type}` encodes the citation type (for the group), `{citationKey1}` is made unique by choosing an appropriate number for `{number1}`\ + This would allow `JR_cite_{number1}_{citationKey1}` to be used as a property name for storing the pageInfo. + + Changes required to + + * reference mark search, name generation and parsing + * name generation and parsing for properties storing pageInfo values + * in-memory representation + * JabRef 5.2 does not collect pageInfo values, accesses only when needed.\ + So it would be change to code accessing them. + * The proposed representation does collect, to allow separation of getting from the document and processing + * insertion of pageInfo into citation markers: JabRef 5.2 injects a single pageInfo before the closing parenthesis, now we need to handle several values + * `[click:Manage citations]` should work on citations, not citation groups. ## Backend -The choice of how do we represent the data and the citation marks in the document has consequences -on usability. +The choice of how do we represent the data and the citation marks in the document has consequences on usability. Reference marks have some features that make it easy to mess up citations in a document -- They are **not visible** by default, the user is not aware of their boundaries -(`LO:[key:Ctrl-F8]`, `LO:[View]/[Field shadings]` helps) - -- They are **not atomic**: - - the user can edit the content. This will be lost on `[click:Update]` - If an `As character` or `To character` anchor is inserted, the corresponding frame or footnote is deleted. - - by pressing Enter within, the user can break a reference mark into two parts. - The second part is now outside the reference mark: `[click:Update]` will leave it as is, and replace the first part - with the full text for the citation mark. - - If the space separating to citation marks is deleted, the user cannot reliably type between the - marks. - The text typed usually becomes part of one of the marks. No visual clue as to which one. - Note: `[click:Merge]` then `[click:Separate]` adds a single space between. The user can - position the cursor before or after it. In either case the cursor is on a boundary: it is not - clear if it is in or out of a reference mark. +* They are **not visible** by default, the user is not aware of their boundaries\ + (`LO:[key:Ctrl-F8]`, `LO:[View]/[Field shadings]` helps) +* They are **not atomic**: + * the user can edit the content. This will be lost on `[click:Update]`\ + If an `As character` or `To character` anchor is inserted, the corresponding frame or footnote is deleted. + * by pressing Enter within, the user can break a reference mark into two parts.\ + The second part is now outside the reference mark: `[click:Update]` will leave it as is, and replace the first part with the full text for the citation mark. + * If the space separating to citation marks is deleted, the user cannot reliably type between the marks.\ + The text typed usually becomes part of one of the marks. No visual clue as to which one.\ + Note: `[click:Merge]` then `[click:Separate]` adds a single space between. The user can position the cursor before or after it. In either case the cursor is on a boundary: it is not clear if it is in or out of a reference mark.\ Special case: a reference mark at the start or end of a paragraph: the cursor is usually considered to be within at the coresponding edge. -- (good) They can be moved (Ctrl-X,Ctrl-V) -- They cannot be copied. (Ctrl-C, Ctrl-V) copies the text without the reference mark. -- Reference marks are lost if the document is saved as docx. - -- I know of no way to insert text into an empty text range denoted by a reference mark - - JabRef 5.3 recreates the reference mark (using [insertReferenceMark](https://github.com/JabRef/jabref/blob/475b2989ffa8ec61c3327c62ed8f694149f83220/src/main/java/org/jabref/gui/openoffice/OOBibBase.java#L1072)) - [here](https://github.com/JabRef/jabref/blob/475b2989ffa8ec61c3327c62ed8f694149f83220/src/main/java/org/jabref/gui/openoffice/OOBibBase.java#L706) - - `(change)` I preferred to (try to) avoid this: - [NamedRangeReferenceMark.nrGetFillCursor](https://github.com/antalk2/jabref/blob/122d5133fa6c7b44245c5ba5600d398775718664/src/main/java/org/jabref/logic/openoffice/backend/NamedRangeReferenceMark.java#L225) - returns a cursor between two invisible - spaces, to provide the caller a location it can safely write some text. [NamedRangeReferenceMark.nrCleanFillCursor](https://github.com/antalk2/jabref/blob/122d5133fa6c7b44245c5ba5600d398775718664/src/main/java/org/jabref/logic/openoffice/backend/NamedRangeReferenceMark.java#L432) - removes these invisible spaces unless the content would become empty or a single character. By - keeping the content at least two characters, we avoid the ambiguity at the edges: a cursor - positioned between two characters inside is always within the reference mark. (At the edges it - may or may not be inside.) - -- `(change)` `[click:Cite]` at reference mark edges: [safeInsertSpacesBetweenReferenceMarks](https://github.com/antalk2/jabref/blob/122d5133fa6c7b44245c5ba5600d398775718664/src/main/java/org/jabref/logic/openoffice/backend/NamedRangeReferenceMark.java#L67) ensures the we are not inside, by starting two new paragraphs, inserting two spaces between them, then removing the new paragraph marks. -- `(change)` [guiActionInsertEntry](https://github.com/antalk2/jabref/blob/122d5133fa6c7b44245c5ba5600d398775718664/src/main/java/org/jabref/gui/openoffice/OOBibBase2.java#L624) -checks if the cursor is in a citation mark or the bibliography. - -- `(change)` `[click:Update]` does an [exhaustive check](https://github.com/antalk2/jabref/blob/122d5133fa6c7b44245c5ba5600d398775718664/src/main/java/org/jabref/gui/openoffice/OOBibBase2.java#L927) -for overlaps between protected ranges (citation marks and bibliography). This can become slow if there are many citations. - - -It would be nice if we could have a backend with better properties. We probably need multiple -backends for different purposes. This would be made easier if the backend were separated from the -rest of the code. This would be the purpose of -[logic/openoffice/backend](https://github.com/antalk2/jabref/tree/improve-reversibility-rebased-03/src/main/java/org/jabref/logic/openoffice/backend). +* (good) They can be moved (Ctrl-X,Ctrl-V) +* They cannot be copied. (Ctrl-C, Ctrl-V) copies the text without the reference mark. +* Reference marks are lost if the document is saved as docx. +* I know of no way to insert text into an empty text range denoted by a reference mark + * JabRef 5.3 recreates the reference mark (using [insertReferenceMark](https://github.com/JabRef/jabref/blob/475b2989ffa8ec61c3327c62ed8f694149f83220/src/main/java/org/jabref/gui/openoffice/OOBibBase.java#L1072)) [here](https://github.com/JabRef/jabref/blob/475b2989ffa8ec61c3327c62ed8f694149f83220/src/main/java/org/jabref/gui/openoffice/OOBibBase.java#L706) + * `(change)` I preferred to (try to) avoid this: [NamedRangeReferenceMark.nrGetFillCursor](https://github.com/antalk2/jabref/blob/122d5133fa6c7b44245c5ba5600d398775718664/src/main/java/org/jabref/logic/openoffice/backend/NamedRangeReferenceMark.java#L225) returns a cursor between two invisible spaces, to provide the caller a location it can safely write some text. [NamedRangeReferenceMark.nrCleanFillCursor](https://github.com/antalk2/jabref/blob/122d5133fa6c7b44245c5ba5600d398775718664/src/main/java/org/jabref/logic/openoffice/backend/NamedRangeReferenceMark.java#L432) removes these invisible spaces unless the content would become empty or a single character. By keeping the content at least two characters, we avoid the ambiguity at the edges: a cursor positioned between two characters inside is always within the reference mark. (At the edges it may or may not be inside.) +* `(change)` `[click:Cite]` at reference mark edges: [safeInsertSpacesBetweenReferenceMarks](https://github.com/antalk2/jabref/blob/122d5133fa6c7b44245c5ba5600d398775718664/src/main/java/org/jabref/logic/openoffice/backend/NamedRangeReferenceMark.java#L67) ensures the we are not inside, by starting two new paragraphs, inserting two spaces between them, then removing the new paragraph marks. +* `(change)` [guiActionInsertEntry](https://github.com/antalk2/jabref/blob/122d5133fa6c7b44245c5ba5600d398775718664/src/main/java/org/jabref/gui/openoffice/OOBibBase2.java#L624) checks if the cursor is in a citation mark or the bibliography. +* `(change)` `[click:Update]` does an [exhaustive check](https://github.com/antalk2/jabref/blob/122d5133fa6c7b44245c5ba5600d398775718664/src/main/java/org/jabref/gui/openoffice/OOBibBase2.java#L927) for overlaps between protected ranges (citation marks and bibliography). This can become slow if there are many citations. + +It would be nice if we could have a backend with better properties. We probably need multiple backends for different purposes. This would be made easier if the backend were separated from the rest of the code. This would be the purpose of [logic/openoffice/backend](https://github.com/antalk2/jabref/tree/improve-reversibility-rebased-03/src/main/java/org/jabref/logic/openoffice/backend). ## Undo -- JabRef 5.3 does not collect the effects of GUI actions on the document into larger Undo actions. -This makes the Undo functionality of LO impractial. -- `(change)` collect the effects of GUI actions into large chunks: now a GUI action can be undone -with a single click. - - except the effect on pageInfo: that is stored at the document level and is not restored by Undo. +* JabRef 5.3 does not collect the effects of GUI actions on the document into larger Undo actions.\ + This makes the Undo functionality of LO impractial. +* `(change)` collect the effects of GUI actions into large chunks: now a GUI action can be undone with a single click. + * except the effect on pageInfo: that is stored at the document level and is not restored by Undo. ## Block screen refresh -- LibreOffice has support in [XModel](https://api.libreoffice.org/docs/idl/ref/interfacecom_1_1sun_1_1star_1_1frame_1_1XModel.html#a7b7d36374033ee9210ec0ac5c1a90d9f) -to "suspend some notifications to the controllers which are used for display updates." - -- `(change)` Now we are using this facility. +* LibreOffice has support in [XModel](https://api.libreoffice.org/docs/idl/ref/interfacecom\_1\_1sun\_1\_1star\_1\_1frame\_1\_1XModel.html#a7b7d36374033ee9210ec0ac5c1a90d9f) to "suspend some notifications to the controllers which are used for display updates." +* `(change)` Now we are using this facility. diff --git a/docs/readings-on-coding/javafx.md b/docs/readings-on-coding/javafx.md index 5b34441e8ee..e9fd96a8fdf 100644 --- a/docs/readings-on-coding/javafx.md +++ b/docs/readings-on-coding/javafx.md @@ -2,7 +2,7 @@ JabRef's recommendations about JavaFX -## Architecture: Model - View - \(Controller\) - ViewModel \(MV\(C\)VM\) +## Architecture: Model - View - (Controller) - ViewModel (MV(C)VM) The goal of the MVVM architecture is to separate the state/behavior from the appearance of the ui. This is archived by dividing JabRef into different layers, each having a clear responsibility. @@ -26,7 +26,7 @@ public class MyDialogViewModel extends AbstractViewModel { } ``` -* Add a \(readonly\) property as a private field and generate the getters according to the [JavaFX bean conventions](https://docs.oracle.com/javafx/2/binding/jfxpub-binding.htm): +* Add a (readonly) property as a private field and generate the getters according to the [JavaFX bean conventions](https://docs.oracle.com/javafx/2/binding/jfxpub-binding.htm): ```java private final ReadOnlyStringWrapper heading = new ReadOnlyStringWrapper(); @@ -79,13 +79,13 @@ public class AboutDialogView extends BaseDialog @Inject private DialogService dialogService; ``` -* It is convenient to load the FXML-view directly from the controller class. +* It is convenient to load the FXML-view directly from the controller class. - The FXML file is loaded using `ViewLoader` based on the name of the class passed to `view`. To make this convention-over-configuration approach work, both the FXML file and the View class should have the same name and should be located in the same package. + The FXML file is loaded using `ViewLoader` based on the name of the class passed to `view`. To make this convention-over-configuration approach work, both the FXML file and the View class should have the same name and should be located in the same package. - Note that fields annotated with `@FXML` or `@Inject` only become accessible after `ViewLoader.load()` is called. + Note that fields annotated with `@FXML` or `@Inject` only become accessible after `ViewLoader.load()` is called. - a `View` class that loads the FXML file. + a `View` class that loads the FXML file. ```java private Dependency dependency; @@ -143,14 +143,14 @@ The view consists a FXML file `MyDialog.fxml` which defines the structure and th * [Undo manager](https://github.com/FXMisc/UndoFX) * [Docking manager](https://github.com/alexbodogit/AnchorFX) [or](https://github.com/RobertBColton/DockFX) * [additional bindings](https://github.com/lestard/advanced-bindings) or [EasyBind](https://github.com/TomasMikula/EasyBind) -* [Kubed](https://github.com/hudsonb/kubed): data visualization \(inspired by d3\) +* [Kubed](https://github.com/hudsonb/kubed): data visualization (inspired by d3) * [Validation framework](https://github.com/sialcasa/mvvmFX/wiki/Validation) * [mvvm framework](https://github.com/sialcasa/mvvmFX/wiki) * [CSS Reference](http://docs.oracle.com/javafx/2/api/javafx/scene/doc-files/cssref.html) * [JFoenix](https://github.com/jfoenixadmin/JFoenix) Material Designs look & feel * [JavaFX Documentation project](https://fxdocs.github.io/docs/html5/index.html): Collected information on JavaFX in a central place -* [FXExperience](http://fxexperience.com/) JavaFX Links of the week -* [Foojay](https://foojay.io/) Java and JavaFX tutorials +* [FXExperience](http://fxexperience.com) JavaFX Links of the week +* [Foojay](https://foojay.io) Java and JavaFX tutorials * [FXTutorials](https://github.com/AlmasB/FXTutorials) A wide range of practical tutorials focusing on Java, JavaFX and FXGL ## Features missing in JavaFX diff --git a/docs/readings-on-coding/tools.md b/docs/readings-on-coding/tools.md index ecd7545fbb0..965c22ba5c4 100644 --- a/docs/readings-on-coding/tools.md +++ b/docs/readings-on-coding/tools.md @@ -7,7 +7,7 @@ This page lists some software we consider useful. * [Refined GitHub](https://github.com/sindresorhus/refined-github) - GitHub on steroids * [GitHub Issue Link Status](https://github.com/fregante/github-issue-link-status) - proper coloring of linked issues and PRs. * [Codecov Browser Extension](https://github.com/codecov/browser-extension) - displaying code coverage directly when browsing GitHub -* [Sourcegraph Browser Extension](https://docs.sourcegraph.com/integration/browser_extension) - Navigate through source on github +* [Sourcegraph Browser Extension](https://docs.sourcegraph.com/integration/browser\_extension) - Navigate through source on github ## git hints @@ -31,9 +31,9 @@ See also: [https://help.github.com/articles/syncing-a-fork/](https://help.github ## Tooling for Windows -\(As Administrator - one time\) +(As Administrator - one time) -1. Install [chocolatey](https://chocolatey.org/) +1. Install [chocolatey](https://chocolatey.org) 2. `choco install git` 3. `choco install conemu clink` 4. `choco install notepadplusplus` @@ -43,7 +43,7 @@ Then, each weak do `choco upgrade all` to ensure all tooling is uptodate. ### General git tooling on Windows -* Use [git for windows](https://git-for-windows.github.io/), no additional git tooling required +* Use [git for windows](https://git-for-windows.github.io), no additional git tooling required * [Git Credential Manager for Windows](https://github.com/Microsoft/Git-Credential-Manager-for-Windows) is included. Ensure that you include that in the installation. Aim: Store password for GitHub permanently for https repository locations * [Use notepad++ as editor](http://stackoverflow.com/a/2486342/873282) for `git rebase -i` @@ -51,18 +51,18 @@ Then, each weak do `choco upgrade all` to ensure all tooling is uptodate. #### ConEmu plus clink -* [ConEmu](http://conemu.github.io/) -> Preview Version - Aim: Colorful console with tabs +* [ConEmu](http://conemu.github.io) -> Preview Version - Aim: Colorful console with tabs * At first start: - * "Choose your startup task ...": \`{Bash::Git bash}} + * "Choose your startup task ...": \`{Bash::Git bash\}} * `OK` - * Upper right corner: "Settings..." \(third entrry Eintrag\) - * Startup/Tasks: Choose task no. 7 \("Bash::Git bash"\). At "Task parameters" `/dir C:\git-repositories\jabref\jabref` + * Upper right corner: "Settings..." (third entrry Eintrag) + * Startup/Tasks: Choose task no. 7 ("Bash::Git bash"). At "Task parameters" `/dir C:\git-repositories\jabref\jabref` * `Save Settings` -* [clink](http://mridgers.github.io/clink/) - Aim: Unix keys \(Alt+B, Ctrl+S, etc.\) also available at the prompt of `cmd.exe` +* [clink](http://mridgers.github.io/clink/) - Aim: Unix keys (Alt+B, Ctrl+S, etc.) also available at the prompt of `cmd.exe` #### Other bundles -* [Cmder](http://cmder.net/) - bundles ConEmu plus clink +* [Cmder](http://cmder.net) - bundles ConEmu plus clink ### Tools for working with XMP @@ -70,8 +70,7 @@ Then, each weak do `choco upgrade all` to ensure all tooling is uptodate. ### Some useful keyboard shortcuts -* [AutoHotkey](http://autohotkey.com/) - Preparation for the next step +* [AutoHotkey](http://autohotkey.com) - Preparation for the next step * [https://github.com/koppor/autohotkey-scripts](https://github.com/koppor/autohotkey-scripts) - Aim: Have Win+C opening ConEmu 1. Clone the repository locally. - 2. Then link `ConEmu.ahk` and `WindowsExplorer.ahk` at the startup menu \(Link creation works with drag'n'drop using the right mouse key and then choosing "Create link" when dropping\). Hint: Startup is in the folder `Startup` \(German: `Autostart`\) at `%APPDATA%\Microsoft\Windows\Start Menu\Programs\` - accessible via `Win+r`: `shell:startup` - + 2. Then link `ConEmu.ahk` and `WindowsExplorer.ahk` at the startup menu (Link creation works with drag'n'drop using the right mouse key and then choosing "Create link" when dropping). Hint: Startup is in the folder `Startup` (German: `Autostart`) at `%APPDATA%\Microsoft\Windows\Start Menu\Programs\` - accessible via `Win+r`: `shell:startup` diff --git a/docs/teaching.md b/docs/teaching.md index a346e23ef56..4a5a43fd242 100644 --- a/docs/teaching.md +++ b/docs/teaching.md @@ -4,11 +4,11 @@ By using JabRef as training object in exercises and labs, students can level-up ## Why university instructors should cooperate with us? -* No need to think about software engineering excesses anymore: JabRef has them. -* No need to provision infra structure * High-quality student education due to real-world tooling and real-world code base * Sustainability of student works: No more thrown-away solved exercises: They now are incorporated in a real-world product +* No need to provision infra structure * Visibility of your research groups +* No need to think about basic software engineering exercises anymore: JabRef cooperation partners have them. ## How to integrate JabRef in your class @@ -32,13 +32,13 @@ For a near-to-perfect preparation and effect of the course, we ask you to get in It is also possible to just direct students to our [Contribution Guide](https://github.com/JabRef/jabref/blob/master/CONTRIBUTING.md#contributing-guide). The learning effect may be lower as the time of the students has to be spent to a) learn about JabRef and b) select an appropriate issue. -Since a huge fraction of software costs is spent on [software maintenance](https://en.wikipedia.org/wiki/Software_maintenance), adding new features also educates in that aspect: perfective maintenance[1](teaching.md#LientzSwanson) is trained. When fixing bugs, corrective maintenance[2](teaching.md#LientzSwanson) is trained. +Since a huge fraction of software costs is spent on [software maintenance](https://en.wikipedia.org/wiki/Software\_maintenance), adding new features also educates in that aspect: perfective maintenance[1](teaching.md#LientzSwanson) is trained. When fixing bugs, corrective maintenance[2](teaching.md#LientzSwanson) is trained. ## Process for contributions There is no special process for student contributions. We want to discuss it nevertheless to increase awareness of the time required from starting the contribution until the inclusion in a release of JabRef. -The process for accepting contributions is as below. The syntax is [BPMN](https://en.wikipedia.org/wiki/Business_Process_Model_and_Notation) modeled using [bpmn.io](https://bpmn.io). +The process for accepting contributions is as below. The syntax is [BPMN](https://en.wikipedia.org/wiki/Business\_Process\_Model\_and\_Notation) modeled using [bpmn.io](https://bpmn.io). [![process](<.gitbook/assets/contribution-process-reviews (2) (2) (2) (2) (2) (3).svg>)](https://github.com/JabRef/jabref/tree/ed275b62fe7dac57a086e43802e36deb93c63e31/docs/images/contribution-process-reviews.svg) @@ -46,7 +46,7 @@ In short, the contribution is **reviewed by two JabRef developers**. Typically, GitHub describes that in their page [Understanding the GitHub flow](https://guides.github.com/introduction/flow/): -[![GitHub flow](images/github-flow.png)](https://github.com/JabRef/jabref/tree/ed275b62fe7dac57a086e43802e36deb93c63e31/docs/images/github-flow.png) +[![GitHub flow](.gitbook/assets/github-flow.png)](https://github.com/JabRef/jabref/tree/ed275b62fe7dac57a086e43802e36deb93c63e31/docs/images/github-flow.png) ## Process for Java newcomers