diff --git a/.github/ghprcomment.yml b/.github/ghprcomment.yml
index 96ed0801b1f..c41d97510ac 100644
--- a/.github/ghprcomment.yml
+++ b/.github/ghprcomment.yml
@@ -4,6 +4,9 @@
We use [Checkstyle](https://checkstyle.sourceforge.io/) to identify issues.
Please carefully follow [the setup guide for the codestyle](https://devdocs.jabref.org/getting-into-the-code/guidelines-for-setting-up-a-local-workspace/intellij-13-code-style.html).
Afterwards, please [run checkstyle locally](https://devdocs.jabref.org/getting-into-the-code/guidelines-for-setting-up-a-local-workspace/intellij-13-code-style.html#run-checkstyle) and fix the issues.
+
+ In case of issues with the import order, double check that you [activated Auto Import](https://devdocs.jabref.org/getting-into-the-code/guidelines-for-setting-up-a-local-workspace/intellij-13-code-style.html#enable-proper-import-cleanup).
+ You can trigger fixing imports by pressing Ctrl+Alt+O to trigger [Optimize Imports](https://www.jetbrains.com/guide/tips/optimize-imports/).
- jobName: OpenRewrite
message: |
Your code currently does not meet JabRef's code guidelines.
diff --git a/.moderne/moderne.yml b/.moderne/moderne.yml
new file mode 100644
index 00000000000..e90c2b39622
--- /dev/null
+++ b/.moderne/moderne.yml
@@ -0,0 +1,3 @@
+specs: specs.moderne.ai/v1/cli
+java:
+ selectedJdk: '23'
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 342df6c1314..48482f765e9 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -38,6 +38,7 @@ Note that this project **does not** adhere to [Semantic Versioning](https://semv
- We added a different background color to the search bar to indicate when the search syntax is wrong. [#11658](https://github.com/JabRef/jabref/pull/11658)
- We added a setting which always adds the literal "Cited on pages" text before each JStyle citation. [#11691](https://github.com/JabRef/jabref/pull/11732)
- We added a new plain citation parser that uses LLMs. [#11825](https://github.com/JabRef/jabref/issues/11825)
+- We added support for `langid` field for biblatex libraries. [#10868](https://github.com/JabRef/jabref/issues/10868)
- We added support for modifier keys when dropping a file on an entry in the main table. [#12001](https://github.com/JabRef/jabref/pull/12001)
- We added an importer for SSRN URLs. [#12021](https://github.com/JabRef/jabref/pull/12021)
- We added a compare button to the duplicates in the citation relations tab to open the "Possible duplicate entries" window. [#11192](https://github.com/JabRef/jabref/issues/11192)
@@ -123,6 +124,8 @@ Note that this project **does not** adhere to [Semantic Versioning](https://semv
- We fixed an issue where trying to open a library from a failed mounted directory on Mac would cause an error. [#10548](https://github.com/JabRef/jabref/issues/10548)
- We fixed an issue when the preview was out of sync. [#9172](https://github.com/JabRef/jabref/issues/9172)
- We fixed an issue where identifier paste couldn't work with Unicode REPLACEMENT CHARACTER. [#11986](https://github.com/JabRef/jabref/issues/11986)
+- We fixed an issue when click on entry at "Check Integrity" wasn't properly focusing the entry and field. [#11997](https://github.com/JabRef/jabref/issues/11997)
+- We fixed an issue with the ui not scaling when changing the font size [#11219](https://github.com/JabRef/jabref/issues/11219)
### Removed
diff --git a/README.md b/README.md
index 3ca468f400f..c4a5808600f 100644
--- a/README.md
+++ b/README.md
@@ -95,6 +95,33 @@ We will discuss improvements with you and agree to merge them once the [develope
Please also remember to discuss bigger changes early with the core developers to ensure properly spend time and work.
Some fundamental design decisions can be found within our list of [Architectural Decision Records](https://devdocs.jabref.org/decisions/).
+## Research and Education
+
+JabRef welcomes research applied to it.
+The current list of papers where JabRef helped to enhance science is maintained at .
+
+The JabRef team also fosters to use JabRef in Software Engineering training.
+We offer guidelines for this at .
+
+When citing JabRef, please use following citation:
+
+```bibtex
+@Article{jabref,
+ author = {Oliver Kopp and Carl Christian Snethlage and Christoph Schwentker},
+ title = {JabRef: BibTeX-based literature management software},
+ journal = {TUGboat},
+ volume = {44},
+ number = {3},
+ pages = {441--447},
+ doi = {10.47397/tb/44-3/tb138kopp-jabref},
+ issn = {0896-3207},
+ issue = {138},
+ year = {2023},
+}
+```
+
+DOI (also includes [full text](https://tug.org/TUGboat/tb44-3/tb138kopp-jabref.pdf)): [10.47397/tb/44-3/tb138kopp-jabref](https://doi.org/10.47397/tb/44-3/tb138kopp-jabref).
+
## Sponsoring
JabRef development is powered by YourKit Java Profiler
diff --git a/build.gradle b/build.gradle
index 6d798bb3bf3..dee976fee1a 100644
--- a/build.gradle
+++ b/build.gradle
@@ -54,13 +54,14 @@ java {
toolchain {
// If this is updated, also update
- // - .gitpod.Dockerfile
+ // - build.gradle -> jacoco -> toolVersion (because JaCoCo does not support newest JDK out of the box. Check versions at https://www.jacoco.org/jacoco/trunk/doc/changes.html)
// - .devcontainer/devcontainer.json#L34 and
+ // - .gitpod.Dockerfile
+ // - .moderne/moderne.yml
// - .github/workflows/deployment*.yml
// - .github/workflows/tests*.yml
// - .github/workflows/update-gradle-wrapper.yml
// - docs/getting-into-the-code/guidelines-for-setting-up-a-local-workspace/intellij-12-build.md
- // - build.gradle -> jacoco -> toolVersion (because JaCoCo does not support newest JDK out of the box. Check versions at https://www.jacoco.org/jacoco/trunk/doc/changes.html)
languageVersion = JavaLanguageVersion.of(23)
// See https://docs.gradle.org/current/javadoc/org/gradle/jvm/toolchain/JvmVendorSpec.html for a full list
// vendor = JvmVendorSpec.AMAZON
@@ -196,7 +197,7 @@ dependencies {
implementation 'io.github.thibaultmeyer:cuid:2.0.3'
// endregion
- implementation 'io.github.java-diff-utils:java-diff-utils:4.12'
+ implementation 'io.github.java-diff-utils:java-diff-utils:4.15'
implementation 'info.debatty:java-string-similarity:2.0.0'
implementation 'com.github.javakeyring:java-keyring:1.0.4'
@@ -255,7 +256,7 @@ dependencies {
exclude group: 'tech.units'
}
// Required by gemsfx
- implementation 'tech.units:indriya:2.2'
+ implementation 'tech.units:indriya:2.2.1'
// Required by gemsfx and langchain4j
implementation ('com.squareup.retrofit2:retrofit:2.11.0') {
exclude group: 'com.squareup.okhttp3'
@@ -267,7 +268,7 @@ dependencies {
implementation 'org.jsoup:jsoup:1.18.1'
implementation 'com.konghq:unirest-java-core:4.4.5'
implementation 'com.konghq:unirest-modules-gson:4.4.5'
- implementation 'org.apache.httpcomponents.client5:httpclient5:5.4'
+ implementation 'org.apache.httpcomponents.client5:httpclient5:5.4.1'
// endregion
implementation 'org.slf4j:slf4j-api:2.0.16'
@@ -336,7 +337,7 @@ dependencies {
// region AI
implementation 'dev.langchain4j:langchain4j:0.36.0'
// Even though we use jvm-openai for LLM connection, we still need this package for tokenization.
- implementation('dev.langchain4j:langchain4j-open-ai:0.36.0') {
+ implementation('dev.langchain4j:langchain4j-open-ai:0.36.2') {
exclude group: 'com.squareup.okhttp3'
exclude group: 'com.squareup.retrofit2', module: 'retrofit'
exclude group: 'org.jetbrains.kotlin'
@@ -346,11 +347,11 @@ dependencies {
exclude group: 'com.squareup.retrofit2', module: 'retrofit'
exclude group: 'org.jetbrains.kotlin'
}
- implementation('dev.langchain4j:langchain4j-google-ai-gemini:0.36.0') {
+ implementation('dev.langchain4j:langchain4j-google-ai-gemini:0.36.2') {
exclude group: 'com.squareup.okhttp3'
exclude group: 'com.squareup.retrofit2', module: 'retrofit'
}
- implementation('dev.langchain4j:langchain4j-hugging-face:0.36.0') {
+ implementation('dev.langchain4j:langchain4j-hugging-face:0.36.2') {
exclude group: 'com.squareup.okhttp3'
exclude group: 'com.squareup.retrofit2', module: 'retrofit'
exclude group: 'org.jetbrains.kotlin'
@@ -367,7 +368,7 @@ dependencies {
exclude group: 'org.jetbrains.kotlin', module: 'kotlin-stdlib-jdk8'
}
// GemxFX also (transitively) depends on kotlin
- implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.21'
+ implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.1.0'
// endregion
implementation 'commons-io:commons-io:2.18.0'
@@ -376,9 +377,9 @@ dependencies {
implementation 'io.github.adr:e-adr:2.0.0-SNAPSHOT'
implementation 'io.zonky.test:embedded-postgres:2.1.0'
- implementation enforcedPlatform('io.zonky.test.postgres:embedded-postgres-binaries-bom:17.0.0')
+ implementation enforcedPlatform('io.zonky.test.postgres:embedded-postgres-binaries-bom:17.2.0')
- testImplementation 'io.github.classgraph:classgraph:4.8.177'
+ testImplementation 'io.github.classgraph:classgraph:4.8.179'
testImplementation 'org.junit.jupiter:junit-jupiter:5.11.3'
testImplementation 'org.junit.platform:junit-platform-launcher:1.11.3'
diff --git a/buildres/linux/jabref.spec b/buildres/linux/jabref.spec
index 9ff20288404..266d754cc7d 100644
--- a/buildres/linux/jabref.spec
+++ b/buildres/linux/jabref.spec
@@ -4,8 +4,17 @@ Version: APPLICATION_VERSION
Release: APPLICATION_RELEASE
License: APPLICATION_LICENSE_TYPE
Vendor: APPLICATION_VENDOR
-Prefix: %{dirname:APPLICATION_DIRECTORY}
+
+%if "xAPPLICATION_URL" != "x"
+URL: APPLICATION_URL
+%endif
+
+%if "xAPPLICATION_PREFIX" != "x"
+Prefix: APPLICATION_PREFIX
+%endif
+
Provides: APPLICATION_PACKAGE
+
%if "xAPPLICATION_GROUP" != "x"
Group: APPLICATION_GROUP
%endif
@@ -16,14 +25,20 @@ Autoreq: 0
Requires: PACKAGE_DEFAULT_DEPENDENCIES PACKAGE_CUSTOM_DEPENDENCIES
%endif
-#avoid ARCH subfolder
-%define _rpmfilename %%{NAME}-%%{VERSION}-%%{RELEASE}.%%{ARCH}.rpm
-
#comment line below to enable effective jar compression
#it could easily get your package size from 40 to 15Mb but
#build time will substantially increase and it may require unpack200/system java to install
%define __jar_repack %{nil}
+# on RHEL we got unwanted improved debugging enhancements
+%define _build_id_links none
+
+%define package_filelist %{_builddir}/%{name}.files
+%define app_filelist %{_builddir}/%{name}.app.files
+%define filesystem_filelist %{_builddir}/%{name}.filesystem.files
+
+%define default_filesystem / /opt /usr /usr/bin /usr/lib /usr/local /usr/local/bin /usr/local/lib
+
%description
APPLICATION_DESCRIPTION
@@ -37,23 +52,34 @@ APPLICATION_DESCRIPTION
rm -rf %{buildroot}
install -d -m 755 %{buildroot}APPLICATION_DIRECTORY
cp -r %{_sourcedir}APPLICATION_DIRECTORY/* %{buildroot}APPLICATION_DIRECTORY
+if [ "$(echo %{_sourcedir}/lib/systemd/system/*.service)" != '%{_sourcedir}/lib/systemd/system/*.service' ]; then
+ install -d -m 755 %{buildroot}/lib/systemd/system
+ cp %{_sourcedir}/lib/systemd/system/*.service %{buildroot}/lib/systemd/system
+fi
%if "xAPPLICATION_LICENSE_FILE" != "x"
%define license_install_file %{_defaultlicensedir}/%{name}-%{version}/%{basename:APPLICATION_LICENSE_FILE}
- install -d -m 755 %{buildroot}%{dirname:%{license_install_file}}
- install -m 644 APPLICATION_LICENSE_FILE %{buildroot}%{license_install_file}
+ install -d -m 755 "%{buildroot}%{dirname:%{license_install_file}}"
+ install -m 644 "APPLICATION_LICENSE_FILE" "%{buildroot}%{license_install_file}"
+%endif
+(cd %{buildroot} && find . -path ./lib/systemd -prune -o -type d -print) | sed -e 's/^\.//' -e '/^$/d' | sort > %{app_filelist}
+{ rpm -ql filesystem || echo %{default_filesystem}; } | sort > %{filesystem_filelist}
+comm -23 %{app_filelist} %{filesystem_filelist} > %{package_filelist}
+sed -i -e 's/.*/%dir "&"/' %{package_filelist}
+(cd %{buildroot} && find . -not -type d) | sed -e 's/^\.//' -e 's/.*/"&"/' >> %{package_filelist}
+%if "xAPPLICATION_LICENSE_FILE" != "x"
+ sed -i -e 's|"%{license_install_file}"||' -e '/^$/d' %{package_filelist}
%endif
-%files
+%files -f %{package_filelist}
%if "xAPPLICATION_LICENSE_FILE" != "x"
- %license %{license_install_file}
- %{dirname:%{license_install_file}}
+ %license "%{license_install_file}"
%endif
-# If installation directory for the application is /a/b/c, we want only root
-# component of the path (/a) in the spec file to make sure all subdirectories
-# are owned by the package.
-%(echo APPLICATION_DIRECTORY | sed -e "s|\(^/[^/]\{1,\}\).*$|\1|")
%post
+package_type=rpm
+LAUNCHER_AS_SERVICE_SCRIPTS
+DESKTOP_COMMANDS_INSTALL
+LAUNCHER_AS_SERVICE_COMMANDS_INSTALL
# Install the native-messaging host script for firefox/chrome/chromium
install -D -m0755 /opt/jabref/lib/native-messaging-host/firefox/org.jabref.jabref.json /usr/lib/mozilla/native-messaging-hosts/org.jabref.jabref.json
install -D -m0755 /opt/jabref/lib/native-messaging-host/chromium/org.jabref.jabref.json /etc/chromium/native-messaging-hosts/org.jabref.jabref.json
@@ -61,9 +87,23 @@ install -D -m0755 /opt/jabref/lib/native-messaging-host/chromium/org.jabref.jabr
# Trigger an auto-install of the browser addon for chrome/chromium browsers
install -D -m0644 /opt/jabref/lib/native-messaging-host/chromium/bifehkofibaamoeaopjglfkddgkijdlh.json /opt/google/chrome/extensions/bifehkofibaamoeaopjglfkddgkijdlh.json
install -D -m0644 /opt/jabref/lib/native-messaging-host/chromium/bifehkofibaamoeaopjglfkddgkijdlh.json /usr/share/google-chrome/extensions/bifehkofibaamoeaopjglfkddgkijdlh.json
-DESKTOP_COMMANDS_INSTALL
+
+
+%pre
+package_type=rpm
+COMMON_SCRIPTS
+LAUNCHER_AS_SERVICE_SCRIPTS
+if [ "$1" -gt 1 ]; then
+ :; LAUNCHER_AS_SERVICE_COMMANDS_UNINSTALL
+fi
%preun
+package_type=rpm
+COMMON_SCRIPTS
+DESKTOP_SCRIPTS
+LAUNCHER_AS_SERVICE_SCRIPTS
+DESKTOP_COMMANDS_UNINSTALL
+LAUNCHER_AS_SERVICE_COMMANDS_UNINSTALL
# Remove the native-messaging hosts script only if relative to the deb package
for NATIVE_MESSAGING_JSON in "/usr/lib/mozilla/native-messaging-hosts/org.jabref.jabref.json"\
"/etc/chromium/native-messaging-hosts/org.jabref.jabref.json"\
@@ -75,7 +115,6 @@ done
# Remove the auto-install triggers of the browser addon for chrom/chromium
rm -f /opt/google/chrome/extensions/bifehkofibaamoeaopjglfkddgkijdlh.json || true
rm -f /usr/share/google-chrome/extensions/bifehkofibaamoeaopjglfkddgkijdlh.json || true
-DESKTOP_SCRIPTS
-DESKTOP_COMMANDS_UNINSTALL
+
%clean
diff --git a/docs/decisions/0034-use-citation-key-for-grouping-chat-messages.md b/docs/decisions/0034-use-citation-key-for-grouping-chat-messages.md
index f6ef24dc69f..e807bd758f8 100644
--- a/docs/decisions/0034-use-citation-key-for-grouping-chat-messages.md
+++ b/docs/decisions/0034-use-citation-key-for-grouping-chat-messages.md
@@ -7,25 +7,25 @@ parent: Decision Records
## Context and Problem Statement
-Because we store chat messages not inside a BIB entry in `.bib` filecc, the chats file is represented as a map to
-BIB entry and a list of messages. We need to specify the key of this map. Turns out, it is not that easy.
+As we store chat messages not inside a BibTeX entry in `.bib` file, the chats file is represented as a map to
+BibTeX entry and a list of messages. We need to specify the key of this map. Turns out, it is not that easy.
## Decision Drivers
-* The key should exist for every BIB entry
-* The key should be unique along other BIB entries in one library file
-* The key should not change at run-time, between launches of JabRef, and should be cross-platform (most important)
+* The key should exist for every BibTeX entry
+* The key should be unique along other BibTeX entries in one library file
+* It is assumed that the key does not change at run-time, between launches of JabRef, and should be cross-platform (most important)
## Considered Options
* `BibEntry` Java object
* `BibEntry`'s `id`
-* `BibEntry`'s Citation key
+* `BibEntry`'s citation key
* `BibEntry`'s `ShareId`
## Decision Outcome
-Chosen option: "`BibEntry`'s Citation key", because this is the only choice that complains to the third point in Decision Drivers.
+Chosen option: "`BibEntry`'s citation key", because this is the only choice that complies to the third point in Decision Drivers.
### Positive Consequences
@@ -50,11 +50,11 @@ This identifier is created on each load of a library (and not stored permanently
Very bad, for the same reasons as `BibEntry` Java object.
-### `BibEntry`'s Citation key
+### `BibEntry`'s citation key
* Good, because it is cross-platform, stable (meaning stays the same across launches of JabRef)
* Bad, because it is not guaranteed that citation key exists on `BibEntry`, and that it is unique across other
-`BibEntriy`'s' in the library
+BibTeX entries in the library
### `BibEntry`'s `ShareId`
@@ -67,3 +67,5 @@ This approach cannot be used here, because there is no server running which we c
## More Information
Refer to [issue #160](https://github.com/JabRef/jabref/issues/160) in JabRef main repository
+
+[ADR-038](0038-use-entryId-for-bibentries.md) takes another option, because it re-generates the index at each start of JabRef.
diff --git a/docs/decisions/0036-use-textarea-for-chat-content.md b/docs/decisions/0036-use-textarea-for-chat-content.md
index 5f01bebf35f..f54b7fe56f8 100644
--- a/docs/decisions/0036-use-textarea-for-chat-content.md
+++ b/docs/decisions/0036-use-textarea-for-chat-content.md
@@ -3,7 +3,7 @@ nav_order: 0036
parent: Decision Records
---
-# Use TextArea for Chat Message Content
+# Use `TextArea` for Chat Message Content
## Context and Problem Statement
@@ -41,7 +41,7 @@ which for now we value more than Markdown rendering.
### Use a third-party package
-There seems to be only one package for JavaFX that provides a ready-to-use UI node for Markdown rendering.
+There seems to be [only one package](https://github.com/JPro-one/markdown-javafx-renderer) for JavaFX that provides a ready-to-use UI node for Markdown rendering.
* Good, because it is easy to implement
* Good, because it renders Markdown
@@ -77,8 +77,10 @@ There seems to be only one package for JavaFX that provides a ready-to-use UI no
## More Information
+This ADR is highly linked to [ADR-0042](./0042-use-webview-for-summarization-content.md).
+
Actually we used an `ExpandingTextArea` from `GemsFX` package so the content can occupy
as much space as it needs in the `ScrollPane`.
About the selection and copying, this goes down to fundamental issue from JavaFX.
-`Text` and `Label` cannot be selected by any means.
+`Text` and `Label` as a whole or a part [cannot be selected and/or copied](https://bugs.openjdk.org/browse/JDK-8091644).
diff --git a/docs/decisions/0042-use-webview-for-summarization-content.md b/docs/decisions/0042-use-webview-for-summarization-content.md
new file mode 100644
index 00000000000..0eaa0e40058
--- /dev/null
+++ b/docs/decisions/0042-use-webview-for-summarization-content.md
@@ -0,0 +1,37 @@
+---
+nav_order: 0042
+parent: Decision Records
+---
+
+# Use `WebView` for Chat Message Content
+
+## Context and Problem Statement
+
+This decision record concerns the UI component that is used for rendering the content of AI summaries.
+
+## Decision Drivers
+
+Same as in [ADR-0036](./0036-use-textarea-for-chat-content.md).
+
+## Considered Options
+
+Same as in [ADR-0036](./0036-use-textarea-for-chat-content.md).
+
+## Decision Outcome
+
+Chosen option: "Use `WebView`".
+
+Some of the options does not support selecting and copying of text. Some options do not render Markdown.
+
+However, in contrary to [ADR-0036](./0036-use-textarea-for-chat-content.md), we chose here a `WebView`, instead of `TextArea`, because there is only one summary content in UI (when user switches entries, no new components are added, rather old ones are *rebinding* to new entry). It would hurt the performance if we used `WebView` for messages, as there could be a lot of messages in one chat.
+
+## Pros and Cons of the Options
+
+Same as in [ADR-0036](./0036-use-textarea-for-chat-content.md).
+
+## More Information
+
+This ADR is highly linked to [ADR-0036](./0036-use-textarea-for-chat-content.md).
+
+About the selection and copying, this goes down to fundamental issue from JavaFX.
+`Text` and `Label` as a whole or a part [cannot be selected and/or copied](https://bugs.openjdk.org/browse/JDK-8091644).
diff --git a/rewrite.yml b/rewrite.yml
index ecaf9b7b001..e3842701b47 100644
--- a/rewrite.yml
+++ b/rewrite.yml
@@ -209,7 +209,8 @@ recipeList:
- org.openrewrite.java.testing.junit5.RemoveDuplicateTestTemplates
- org.openrewrite.java.testing.junit5.RemoveTryCatchFailBlocks
- org.openrewrite.java.testing.junit5.LifecycleNonPrivate
- - org.openrewrite.java.testing.junit5.StaticImports
+ # Does not work on some JDK releases. See https://github.com/openrewrite/rewrite-logging-frameworks/issues/177.
+ # - org.openrewrite.java.testing.junit5.StaticImports
# Logging
- org.openrewrite.java.logging.slf4j.Slf4jBestPractices
diff --git a/src/main/java/org/jabref/gui/Base.css b/src/main/java/org/jabref/gui/Base.css
index 635c295af1c..af7759a1453 100644
--- a/src/main/java/org/jabref/gui/Base.css
+++ b/src/main/java/org/jabref/gui/Base.css
@@ -341,6 +341,10 @@ TextFlow > .hyperlink:visited,
-fx-underline: true;
}
+.TextFlow > .embeddedHyperlink {
+ -fx-padding: 0.166667em 0.25em 0.166667em 0.25em;
+}
+
.glyph-icon {
/* This adjusts text alignment within the bounds of text nodes so that
the text is always vertically centered within the bounds. Based on
@@ -395,7 +399,7 @@ TextFlow > .tooltip-text-monospaced {
.combo-box-base:editable > .arrow-button {
-fx-background-color: transparent;
-fx-background-insets: 0;
- -fx-background-radius: 4px;
+ -fx-background-radius: 0.25em;
-fx-text-fill: -fx-text-base-color;
}
@@ -403,8 +407,8 @@ TextFlow > .tooltip-text-monospaced {
.button {
-fx-background-color: transparent;
-fx-border-color: -fx-outer-border; /* rgba(0, 0, 0, 0.23); */
- -fx-border-width: 1px;
- -fx-border-radius: 4px;
+ -fx-border-width: 0.062em;
+ -fx-border-radius: 0.25em;
-fx-padding: 0.5em 1em 0.5em 1em;
}
@@ -435,7 +439,7 @@ TextFlow > .tooltip-text-monospaced {
}
.text-button {
- -fx-border-width: 0px;
+ -fx-border-width: 0;
}
.contained-button {
@@ -446,7 +450,7 @@ TextFlow > .tooltip-text-monospaced {
.icon-buttonNoSpaceBottom,
.icon-buttonNoSpaceTop,
.icon-button {
- -fx-border-width: 0px;
+ -fx-border-width: 0;
-fx-background-color: -jr-icon-background;
-fx-padding: 0.5em;
}
@@ -491,7 +495,7 @@ TextFlow > .tooltip-text-monospaced {
.progress-indicator {
-fx-progress-color: -jr-theme;
- -fx-border-width: 0px;
+ -fx-border-width: 0;
-fx-background-color: -jr-icon-background;
}
@@ -514,13 +518,13 @@ TextFlow > .tooltip-text-monospaced {
.check-box > .box {
-fx-border-color: -fx-outer-border; /* rgba(0, 0, 0, 0.54); */
- -fx-border-width: 2px;
- -fx-border-radius: 1px;
+ -fx-border-width: 0.125em;
+ -fx-border-radius: 0.062em;
-fx-padding: 0.1em 0.1em 0.2em 0.2em;
}
.check-box:selected > .box {
- -fx-background-insets: 2px;
+ -fx-background-insets: 0.125em;
-fx-border-color: -jr-checked;
-fx-background-color: -jr-checked;
}
@@ -539,7 +543,7 @@ TextFlow > .tooltip-text-monospaced {
-fx-background-radius: 1.0em; /* large value to make sure this remains circular */
-fx-padding: 0.35em; /* padding from outside edge to the inner dot */
-fx-background-color: rgba(0, 0, 0, 0.54), -fx-control-inner-background;
- -fx-background-insets: 0, 2px;
+ -fx-background-insets: 0, 0.125em;
}
.radio-button:selected > .radio {
@@ -646,7 +650,7 @@ TextFlow > .tooltip-text-monospaced {
}
.tab-pane > .tab-header-area > .headers-region > .tab .glyph-icon {
- -glyph-size: 13px;
+ -glyph-size: 0.812em;
-fx-fill: -fx-mid-text-color;
-fx-text-fill: -fx-mid-text-color;
}
@@ -1001,7 +1005,7 @@ TextFlow > .tooltip-text-monospaced {
.sidePaneComponentHeader .ikonli-font-icon {
-fx-fill: -jr-sidepane-header-color;
-fx-text-fill: -jr-sidepane-header-color;
- -fx-font-size: 16px;
+ -fx-font-size: 1.0em;
-fx-icon-color: -jr-theme-text;
}
@@ -1242,7 +1246,7 @@ We want to have a look that matches our icons in the tool-bar */
.notification-bar > .pane {
-fx-background-color: -jr-gray-3;
- -fx-background-radius: 4px;
+ -fx-background-radius: 0.25em;
}
.notification-bar > .pane > .title,
@@ -1254,17 +1258,17 @@ We want to have a look that matches our icons in the tool-bar */
.notification-bar > .pane {
-fx-effect: dropshadow(three-pass-box, rgba(0, 0, 0, 0.3), 9, 0, 0, 2);
- -fx-padding: 6px 7px 6px 32px;
- -fx-background-radius: 0px;
- -fx-border-radius: 0px;
+ -fx-padding: 0.375em 0.438em 0.375em 2.0em;
+ -fx-background-radius: 0;
+ -fx-border-radius: 0;
}
.notification-bar > .pane > .button-bar > .container {
- -fx-padding: 0px 24px 0px 0px;
+ -fx-padding: 0.0em 1.5em 0.0em 0.0em;
}
.notification-bar > .pane > .label {
- -fx-graphic-text-gap: 8px;
+ -fx-graphic-text-gap: 0.5em;
}
.notification-pane .notification-bar > .pane .close-button > .graphic {
@@ -1272,7 +1276,7 @@ We want to have a look that matches our icons in the tool-bar */
}
.notification-bar > .pane > .label > .ikonli-font-icon {
- -fx-icon-size: 16px;
+ -fx-icon-size: 1.0em;
-fx-icon-color: -jr-base;
}
@@ -1293,19 +1297,19 @@ We want to have a look that matches our icons in the tool-bar */
.color-picker:focused,
.color-picker {
-fx-background-color: transparent, transparent, transparent, transparent;
- -fx-background-radius: 0px;
- -fx-background-insets: 0px;
+ -fx-background-radius: 0;
+ -fx-background-insets: 0;
-fx-effect: null;
}
.color-palette {
-fx-background-color: -fx-background;
- -fx-background-radius: 0px;
- -fx-background-insets: 0px;
+ -fx-background-radius: 0;
+ -fx-background-insets: 0;
}
.color-palette-region .button {
- -fx-border-width: 0px;
+ -fx-border-width: 0;
}
.bibEntry {
@@ -1428,8 +1432,8 @@ We want to have a look that matches our icons in the tool-bar */
}
.tags-field {
- -fx-pref-height: 30px;
- -fx-margin: 0em;
+ -fx-pref-height: 1.875em;
+ -fx-margin: 0;
-fx-border-style: none;
-fx-background-color: -fx-outer-border, -fx-control-inner-background;
}
@@ -1478,7 +1482,7 @@ We want to have a look that matches our icons in the tool-bar */
.rating {
-fx-skin: "org.jabref.gui.util.CustomRatingSkin";
- -fx-padding: 0.5em 0px 0px 0px;
+ -fx-padding: 0.5em 0.0em 0.0em 0.0em;
}
.rating > .container > .button {
@@ -1503,8 +1507,6 @@ We want to have a look that matches our icons in the tool-bar */
-fx-background-radius: 10;
}
-/* region: fix for making text area round corners (source: https://stackoverflow.com/a/49617953) */
-
.chat-message-text-area .scroll-pane {
-fx-background-color: transparent;
}
@@ -1517,10 +1519,7 @@ We want to have a look that matches our icons in the tool-bar */
-fx-background-color: transparent;
}
-/* endregion */
-
-/* region: maintable css */
-
+/* MainTable */
.main-table .column-icon {
-fx-alignment: baseline-center;
@@ -1731,5 +1730,696 @@ We want to have a look that matches our icons in the tool-bar */
-fx-effect: dropshadow(three-pass-box, rgba(0, 0, 0, 0.6), 8, 0.0, 0, 0);
}
+/* AboutDialog */
+#aboutDialog .about-heading {
+ -fx-font-size: 30;
+ -fx-text-fill: -jr-theme;
+}
+
+#aboutDialog .about-heading:pressed {
+ -fx-text-fill: -jr-selected;
+}
+
+#aboutDialog .top-padding {
+ -fx-padding: 5 0 0 0;
+}
+
+#aboutDialog .dev-heading {
+ -fx-font-size: 18;
+ -fx-padding: -10 0 0 0;
+}
+
+#aboutDialog .sub-heading {
+ -fx-font-size: 18;
+ -fx-padding: 0.312em;
+}
+
+#aboutDialog .about-top {
+ -fx-padding: 0 5 15 5;
+}
+
+#aboutDialog .space {
+ -fx-padding: 0 5 0 5;
+}
+
+#aboutDialog .space-after {
+ -fx-padding: 0 5 0 0;
+}
+
+#aboutDialog .info-sections {
+ -fx-padding: 0.312em;
+}
+
+#aboutDialog .contrib-section {
+ -fx-padding: 5 5 10 5;
+}
+
+#aboutDialog .logo-pane {
+ -fx-fill: transparent;
+}
+
+#aboutDialog .logo-pane SVGPath {
+ -fx-fill: #4f5f8f;
+}
+
+/* DocumentViewer */
+#documentViewerDialog #mainPane {
+ -fx-background-color: -fx-accented-background;
+ -fx-padding: 0;
+}
+
+#documentViewerDialog .document-viewer .page {
+ -fx-padding: 0em 0em 1em 0em;
+ -fx-background-insets: 0;
+}
+
+/* EntryEditor */
+#entryEditor .editorPane {
+ -fx-hgap: 10;
+ -fx-vgap: 6;
+ -fx-background-color: -fx-control-inner-background;
+ -fx-padding: 5 5 5 15;
+}
+
+#entryEditor Text {
+ -fx-text-fill: -fx-text-base-color;
+ -fx-fill: -fx-text-base-color;
+}
+
+#entryEditor .date-picker > .date-picker-display-node {
+ -fx-text-origin: baseline;
+}
+
+#entryEditor .date-picker > .date-picker-display-node *.text {
+ -fx-text-origin: bottom;
+}
+
+#entryEditor .combo-box > *.text {
+ -fx-text-origin: baseline;
+}
+
+#entryEditor #typeLabel {
+ -fx-padding: 0.1em;
+ -fx-font-size: 1.166667em;
+ -fx-font-weight: bold;
+ -fx-text-fill: -jr-theme-text;
+}
+
+#entryEditor #typeLabel:hover {
+ -fx-padding: 0.1em;
+ -fx-font-size: 1.166667em;
+ -fx-font-weight: bold;
+ -fx-background-color: -jr-icon-background-active;
+}
+
+#entryEditor #typeLabel .context-menu {
+ -fx-font-size: 0.92em;
+ -fx-font-weight: normal;
+}
+
+#entryEditor #typeLabel .tooltip {
+ -fx-font-size: 1em;
+ -fx-font-weight: normal;
+}
+
+#entryEditor .icon-button.narrow {
+ -fx-padding: 0.1em;
+}
+
+#entryEditor .icon-buttonNoSpaceBottom.narrow {
+ -fx-padding: 0.1em 0.1em -0.2em 0.1em;
+}
+
+#entryEditor .icon-buttonNoSpaceTop.narrow {
+ -fx-padding: -0.2em 0.1em 0.1em 0.1em;
+}
+
+#entryEditor .tool-bar {
+ -fx-background-color: -jr-background-alt;
+ -fx-background-insets: 0;
+}
+
+#entryEditor .tool-bar .glyph-icon {
+ -glyph-size: 1.0em;
+ -fx-font-size: 2em;
+ -fx-fill: -jr-theme-text;
+ -fx-text-fill: -jr-theme-text;
+}
+
+#entryEditor .warning-icon {
+ -fx-fill: -jr-warn;
+}
+
+#entryEditor .error-icon {
+ -fx-text-fill: -jr-error;
+ -fx-fill: -jr-error;
+}
+
+#entryEditor .tooltip-warning {
+ -fx-background-color: -jr-warn;
+}
+
+#entryEditor .tooltip-error {
+ -fx-background-color: -jr-error;
+}
+
+#entryEditor .code-area .context-menu {
+ -fx-font-family: sans-serif;
+}
+
+#entryEditor #related-articles-tab {
+ -fx-padding: 20 20 20 20;
+ -fx-background-color: -fx-control-inner-background;
+}
+
+#entryEditor .ai-tab {
+ -fx-padding: 20 20 20 20;
+ -fx-background-color: -fx-control-inner-background;
+}
+
+#entryEditor .gdpr-notice {
+ -fx-border-color: -jr-warn;
+ -fx-border-insets: 5;
+ -fx-border-style: dashed;
+ -fx-border-width: 2;
+ -fx-padding: 12;
+ -fx-font-size: 1.3em;
+}
+
+#entryEditor .recommendation-item {
+ -fx-padding: 0 0 0 20;
+}
+
+#entryEditor #bibtexSourceCodeArea {
+ -fx-padding: 4 4 4 4;
+ -fx-background-color: -fx-control-inner-background;
+}
+
+#entryEditor #bibtexSourceCodeArea .search {
+ -rtfx-background-color: #ffff00;
+ -fx-fill: #7800A9 ;
+ -fx-font-size: 1.2em;
+ -fx-font-weight: bolder;
+}
+
+#entryEditor #citationsPane {
+ -fx-padding: 0;
+ -fx-background-color: -fx-control-inner-background;
+}
+
+#entryEditor #citationsPane *,
+#entryEditor #scitePane Label,
+#entryEditor #scitePane Text {
+ -fx-fill: -fx-text-background-color;
+}
+
+#entryEditor .heading {
+ -fx-font-size: 1.5em;
+ -fx-font-weight: bold;
+}
+
+#entryEditor .description {
+ -fx-font-style: italic;
+}
+
+#entryEditor .scite-tallies-label {
+ -fx-font-size: 1.5em;
+ -fx-font-weight: bold;
+}
+
+#entryEditor .scite-error-box {
+ -fx-padding: 30 0 0 30;
+}
+
+#entryEditor .scite-message-box {
+ -fx-padding: 30 0 0 30;
+}
+
+#entryEditor #scite-error-label {
+ -fx-font-size: 1.5em;
+ -fx-font-weight: bold;
+ -fx-text-fill: -jr-error;
+}
+
+/* ErrorConsole */
+
+#errorConsole .list-content {
+ -fx-padding: 0.625em;
+}
+
+#errorConsole .info-section {
+ -fx-padding: 0.625em;
+ -fx-background-color: -fx-background;
+}
+
+#errorConsole .info-section .glyph-icon {
+ -fx-font-size: 24.0;
+}
+
+#errorConsole .exception .glyph-icon {
+ -fx-font-size: 18.0;
+ -fx-fill: -jr-error;
+}
+
+#errorConsole .output .glyph-icon {
+ -fx-font-size: 18.0;
+ -fx-fill: -jr-warn;
+}
+
+#errorConsole .log .glyph-icon {
+ -fx-font-size: 18.0;
+ -fx-fill: -jr-info;
+}
+
+#errorConsole .custom-buttons {
+ -fx-padding: 0.312em;
+}
+
+#errorConsole .exception {
+ -fx-text-fill: -fx-text-base-color;
+}
+
+#errorConsole .output {
+ -fx-text-fill: -fx-text-base-color;
+}
+
+#errorConsole .log {
+ -fx-text-fill: -fx-text-base-color;
+}
+
+/* GroupTree */
+
+#groupTree:focused,
+#groupTree:filled:selected {
+ -fx-background-color: -jr-sidepane-background;
+ -fx-table-cell-border-color: transparent;
+}
+
+#groupTree, .tree-table-row-cell {
+ -fx-background-color: -jr-sidepane-background;
+}
+
+#groupTree .tree-table-cell {
+ -fx-padding: 0.35em 0em 0.25em 0em;
+}
+
+#groupTree .numberColumn {
+ -fx-alignment: top-right;
+ -fx-padding: 0.35em 0.2em 0.25em 0em;
+}
+
+#groupTree .numberColumn > .hits {
+ -fx-font-size: 0.75em;
+ -fx-background-color: -jr-group-hits-bg;
+ -fx-padding: 0.4em 0.4em 0.4em 0.4em;
+ -fx-background-insets: 0;
+ -fx-background-radius: 0.7em;
+}
+
+#groupTree .numberColumn > .hits .text {
+ -fx-fill: -jr-group-hits-fg;
+}
+
+#groupTree .expansionNodeColumn {
+ -fx-alignment: top-right;
+}
+
+#groupTree .tree-table-row-cell:dragOver-bottom {
+ -fx-border-color: -jr-drag-target;
+ -fx-border-width: 0 0 2 0;
+ -fx-padding: 0 0 -2 0;
+}
+
+#groupTree .tree-table-row-cell:dragOver-center {
+ -fx-border-color: -jr-drag-target;
+ -fx-border-width: 1 1 1 1;
+ -fx-padding: -1 -1 -1 -1;
+ -fx-background-color: -jr-drag-target-hover;
+}
+
+#groupTree .tree-table-row-cell:dragOver-top {
+ -fx-border-color: -jr-drag-target;
+ -fx-border-width: 2 0 0 0;
+ -fx-padding: -2 0 0 0;
+}
+
+#groupTree .tree-table-row-cell:sub > .tree-table-cell {
+ -fx-padding: 0.20em 0em 0.20em 0em;
+}
+
+#groupTree .tree-table-row-cell:sub > .numberColumn {
+ -fx-padding: 0.20em 0.2em 0.20em 0em;
+}
+
+#groupTree .tree-table-row-cell:root {
+ -fx-border-width: 0 0 1 0;
+ -fx-border-color: -jr-separator;
+}
+
+#groupTree .tree-table-row-cell:root > .tree-table-cell {
+ -fx-padding: 0.65em 0em 0.65em 1em;
+}
+
+#groupTree .tree-table-row-cell:root > .numberColumn {
+ -fx-padding: 0.40em 0.2em 0.40em 0em;
+}
+
+#groupTree .tree-table-row-cell:root > .expansionNodeColumn {
+ -fx-padding: 0.45em 0.2em 0.45em 0.2em;
+}
+
+#groupTree .tree-table-row-cell:empty {
+ -fx-background-color: transparent; /* hide cells which are not bound to a group */
+}
+
+#groupTree .column-header-background {
+ visibility: hidden; /* hide column header */
+ -fx-padding: -0.8em;
+}
+
+#groupTree .tree-table-row-cell > .tree-table-cell > .tree-disclosure-node > .arrow {
+ -fx-background-color: -fx-mid-text-color;
+ -fx-max-height: 0.5em;
+ -fx-max-width: 0.5em;
+ -fx-padding: 0.333333em 0.229em 0.333333em 0.229em; /* 4 */
+ -fx-shape: "m64,416l96,96l256,-256l-256,-256l-96,96l160,160l-160,160z";
+}
+
+#groupTree .tree-table-row-cell:expanded > .tree-table-cell > .tree-disclosure-node > .arrow {
+ -fx-rotate: 90;
+}
+
+#groupTree .tree-table-row-cell > .tree-table-cell > .icon {
+ -fx-translate-x: -0.4em;
+}
+
+#groupFilterBar {
+ -fx-background-color: -jr-sidepane-header-background;
+ -fx-border-color: -jr-separator;
+ -fx-border-width: 1 0 0 0;
+ -fx-padding: 0em 1em 0em 1em;
+}
+
+#groupFilterBar .glyph-icon {
+ -fx-font-size: 2em;
+}
+
+#groupBar .glyph-icon {
+ -fx-font-size: 2em;
+}
+
+/* ImportEntriesDialog */
+
+#importEntriesDialog .addEntryButton {
+ -fx-font-size: 2em;
+}
+
+#importEntriesDialog .addEntryButton:selected {
+ -fx-background-color: transparent;
+ -fx-fill: -jr-selected;
+}
+
+#importEntriesDialog .entry-container {
+ -fx-padding: 0.5em 0em 0.5em 0em;
+}
+
+/* ManageStudyDefinition */
+
+.slr-tab {
+ -fx-padding: 1em;
+}
+
+/* MultiMergeEntries */
+
+#multiMergeEntries .text-changed {
+ -fx-fill: -jr-orange;
+}
+
+#multiMergeEntries .text-added {
+ -fx-fill: -jr-green;
+}
+
+#multiMergeEntries .text-removed {
+ -fx-fill: -jr-red;
+}
+
+#multiMergeEntries .grid-pane {
+ -fx-hgap: 10;
+ -fx-vgap: 10;
+}
+
+#multiMergeEntries .toggle-button {
+ -fx-border-insets: 0;
+ -fx-background-insets: 0;
+ -fx-border-image-insets: 0;
+ -fx-padding: 0.5em;
+ -fx-background-radius: 0;
+}
+
+#multiMergeEntries .box {
+ -fx-spacing: 10;
+}
+
+/* ParseLatexResult */
+
+#referenceListView {
+ -fx-background-color: -jr-sidepane-background;
+}
+
+#referenceListView > .virtual-flow > .clipped-container > .sheet > .list-cell {
+ -fx-padding: 4 4 4 4;
+ -fx-background: transparent;
+ -fx-text-fill: -fx-text-base-color;
+}
+
+#referenceListView > .virtual-flow > .clipped-container > .sheet > .list-cell * {
+ -fx-text-fill: -fx-text-base-color;
+}
+
+#parseLatexResultDialog > .split-pane > .split-pane-divider {
+ -fx-padding: 0 4 0 4;
+ -fx-background-color: transparent;
+}
+
+#parseLatexResultDialog .button-bar > .container {
+ -fx-border-width: 1 0 0 0;
+ -fx-border-color: -jr-sidepane-background;
+}
+
+/* PreferenceDialog */
+#preferencesDialog #sidepane {
+ -fx-background-color: -jr-sidepane-background;
+}
+
+#preferencesDialog #preferenceTabList {
+ -fx-background-color: transparent;
+}
+
+#preferencesDialog #preferenceTabList > .virtual-flow > .clipped-container > .sheet > .list-cell {
+ -fx-padding: 8 8 8 8;
+ -fx-background: transparent;
+ -fx-text-fill: -fx-text-base-color;
+}
+
+#preferencesDialog .button-bar > .container {
+ -fx-border-width: 1 0 0 0;
+ -fx-border-color: -jr-sidepane-background;
+}
+
+#preferencesDialog #preferenceTabList > .virtual-flow > .clipped-container > .sheet > .list-cell:filled:selected {
+ -fx-background: -fx-control-inner-background;
+}
+
+#preferencesDialog > .split-pane > .split-pane-divider {
+ -fx-padding: 0 4 0 4;
+ -fx-background-color: transparent;
+}
+
+#preferencesDialog .preferencesTab {
+ -fx-padding: 0.5em;
+}
+
+#preferencesDialog *:search-highlight {
+ -fx-background-color: -jr-light-red;
+}
-/* endregion */
+#preferencesDialog .code-area {
+ -fx-padding: 0;
+ -fx-border-width: 1;
+ -fx-background-color: transparent;
+}
+
+#preferencesDialog .code-area .text {
+ -fx-fill: -fx-text-background-color;
+}
+
+#preferencesDialog .code-area .tagmark {
+ -fx-fill: gray;
+}
+
+#preferencesDialog .code-area .anytag {
+ -fx-fill: crimson;
+}
+
+#preferencesDialog .code-area .paren {
+ -fx-fill: firebrick;
+ -fx-font-weight: bold;
+}
+
+#preferencesDialog .code-area .attribute {
+ -fx-fill: darkviolet;
+}
+
+#preferencesDialog .code-area .avalue {
+ -fx-fill: green;
+}
+
+#preferencesDialog .code-area .comment {
+ -fx-fill: teal;
+}
+
+#preferencesDialog .code-area .highlight-keyword {
+ -fx-text-fill: -jr-purple;
+}
+
+#preferencesDialog .code-area .context-menu .menu-item .label {
+ -fx-padding: 2;
+}
+
+/* CitationRelationsTab */
+
+#citationRelationsTab .addEntryButton {
+ -fx-font-size: 2em;
+}
+
+#citationRelationsTab .addEntryButton:selected {
+ -fx-background-color: transparent;
+ -fx-fill: -jr-selected;
+}
+
+#citationRelationsTab .entry-container {
+ -fx-padding: 0.5em 0em 0.5em 0em;
+}
+
+/* JournalInfo */
+.journalInfo {
+ -fx-background-color: -jr-background-alt;
+}
+
+.journalInfo .info-heading {
+ -fx-font-size: 2.5em;
+ -fx-text-fill: -jr-theme;
+}
+
+.journalInfo .info-label {
+ -fx-font-size: 1.25em;
+ -fx-text-fill: -jr-theme;
+}
+
+.journalInfo .hIndex {
+ -fx-font-size: 2em;
+}
+
+.journalInfo .grid-cell {
+ -fx-border-color: transparent -fx-outer-border -fx-outer-border transparent;
+ -fx-border-width: 0 0.062em 0.062em 0;
+}
+
+.journalInfo .grid-cell-r {
+ -fx-border-color: transparent -fx-outer-border transparent transparent;
+ -fx-border-width: 0 0.062em 0 0;
+}
+
+journalInfo .grid-cell-b {
+ -fx-border-color: transparent transparent -fx-outer-border transparent;
+ -fx-border-width: 0 0 0.062em 0;
+}
+
+/* KeyBindingsTab */
+
+.keybinding-table {
+ -fx-table-cell-border-color: transparent;
+ -fx-background-color: transparent;
+}
+
+.keybinding-table .tree-table-row-cell {
+ -fx-background-color: transparent;
+ /* visibility: hidden; */
+}
+
+.keybinding-table .tree-table-row-cell:selected > .tree-table-cell > .icon,
+.keybinding-table .tree-table-row-cell:pressed > .tree-table-cell > .icon {
+ -fx-fill: white;
+}
+
+/* ThreeWayMergeView */
+.three-way-merge .merged-field .styled-text-area {
+ -fx-background-color: -fx-outer-border, -fx-control-inner-background;
+ -fx-background-insets: 0, 1;
+ -fx-prompt-text-fill: -fx-mid-text-color;
+}
+
+.three-way-merge .merged-field .styled-text-area:focused {
+ -fx-highlight-fill: derive(-jr-accent, 20%);
+ -fx-background-color: -jr-accent, -fx-control-inner-background;
+ -fx-background-insets: 0, 2;
+ -fx-highlight-text-fill: -fx-text-inner-color;
+}
+
+.three-way-merge .merge-field-value:selected .selection-box {
+ -fx-background-color: -jr-accent-alt;
+ -fx-border-color: -jr-accent;
+}
+
+.three-way-merge .merge-field-value .selection-box {
+ -fx-background-color: #0000;
+ -fx-border-color: #0000;
+ -fx-border-radius: 8;
+ -fx-background-radius: 8;
+ -fx-border-width: 2.5;
+}
+
+.three-way-merge .styled-text-area .text{
+ -fx-fill: -fx-text-background-color;
+}
+
+.three-way-merge .field-cell:odd {
+ -fx-background-color: -jr-row-odd-background;
+}
+
+.three-way-merge .field-cell:even {
+ -fx-background-color: -jr-row-even-background;
+}
+
+.three-way-merge .field-cell {
+ -fx-padding: 8;
+}
+
+.three-way-merge .merge-toolbox {
+ -fx-background-color: -jr-menu-background;
+}
+
+.three-way-merge .merge-header-cell .label{
+ -fx-font-weight: bold;
+ -fx-padding: 1, 0, 1, 0;
+}
+
+.three-way-merge .field-name .glyph-icon,
+.three-way-merge .field-name .ikonli-font-icon {
+ -fx-icon-size: 17;
+ -fx-icon-color: -jr-theme-text;
+}
+
+/* Miscellaneous */
+
+.chatHistory {
+ -fx-border-color: black;
+}
+
+#styleSelectDialog .currentStyleLabel {
+ -fx-font-size: 1em;
+}
+
+#styleSelectDialog .currentStyleNameLabel {
+ -fx-font-size: 1em; -fx-font-weight: bold; -fx-text-fill: -jr-theme;
+}
diff --git a/src/main/java/org/jabref/gui/JabRefGUI.java b/src/main/java/org/jabref/gui/JabRefGUI.java
index aecad6e3994..e17855652dc 100644
--- a/src/main/java/org/jabref/gui/JabRefGUI.java
+++ b/src/main/java/org/jabref/gui/JabRefGUI.java
@@ -30,6 +30,7 @@
import org.jabref.logic.ai.AiService;
import org.jabref.logic.l10n.Localization;
import org.jabref.logic.net.ProxyRegisterer;
+import org.jabref.logic.os.OS;
import org.jabref.logic.remote.RemotePreferences;
import org.jabref.logic.remote.server.RemoteListenerServerManager;
import org.jabref.logic.search.PostgreServer;
@@ -290,13 +291,19 @@ public void onHiding(WindowEvent event) {
private void saveWindowState() {
CoreGuiPreferences preferences = JabRefGUI.preferences.getGuiPreferences();
- if (!mainStage.isMaximized()) {
+ // workaround for mac, maximize will always report true
+ if (!mainStage.isMaximized() || OS.OS_X) {
preferences.setPositionX(mainStage.getX());
preferences.setPositionY(mainStage.getY());
preferences.setSizeX(mainStage.getWidth());
preferences.setSizeY(mainStage.getHeight());
}
- preferences.setWindowMaximised(mainStage.isMaximized());
+ // maximize does not correctly work on OSX, reports true, although the window was resized!
+ if (OS.OS_X) {
+ preferences.setWindowMaximised(false);
+ } else {
+ preferences.setWindowMaximised(mainStage.isMaximized());
+ }
debugLogWindowState(mainStage);
}
diff --git a/src/main/java/org/jabref/gui/ai/components/aichat/AiChatComponent.fxml b/src/main/java/org/jabref/gui/ai/components/aichat/AiChatComponent.fxml
index a479ace35e6..bd222d360f9 100644
--- a/src/main/java/org/jabref/gui/ai/components/aichat/AiChatComponent.fxml
+++ b/src/main/java/org/jabref/gui/ai/components/aichat/AiChatComponent.fxml
@@ -11,56 +11,43 @@
-
+
-
+
-
-
-
-
+
+
+
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
diff --git a/src/main/java/org/jabref/gui/ai/components/aichat/chathistory/ChatHistoryComponent.fxml b/src/main/java/org/jabref/gui/ai/components/aichat/chathistory/ChatHistoryComponent.fxml
index 20836e0e3bb..0c6adb56cb9 100644
--- a/src/main/java/org/jabref/gui/ai/components/aichat/chathistory/ChatHistoryComponent.fxml
+++ b/src/main/java/org/jabref/gui/ai/components/aichat/chathistory/ChatHistoryComponent.fxml
@@ -3,19 +3,14 @@
-
-
+
+
-
+
diff --git a/src/main/java/org/jabref/gui/ai/components/aichat/chatmessage/ChatMessageComponent.fxml b/src/main/java/org/jabref/gui/ai/components/aichat/chatmessage/ChatMessageComponent.fxml
index 92f428872d1..cf56ad0d56b 100644
--- a/src/main/java/org/jabref/gui/ai/components/aichat/chatmessage/ChatMessageComponent.fxml
+++ b/src/main/java/org/jabref/gui/ai/components/aichat/chatmessage/ChatMessageComponent.fxml
@@ -10,35 +10,31 @@
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
diff --git a/src/main/java/org/jabref/gui/ai/components/privacynotice/PrivacyNoticeComponent.fxml b/src/main/java/org/jabref/gui/ai/components/privacynotice/PrivacyNoticeComponent.fxml
index a4f4da47cc2..543571673f4 100644
--- a/src/main/java/org/jabref/gui/ai/components/privacynotice/PrivacyNoticeComponent.fxml
+++ b/src/main/java/org/jabref/gui/ai/components/privacynotice/PrivacyNoticeComponent.fxml
@@ -1,97 +1,22 @@
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
diff --git a/src/main/java/org/jabref/gui/ai/components/privacynotice/PrivacyNoticeComponent.java b/src/main/java/org/jabref/gui/ai/components/privacynotice/PrivacyNoticeComponent.java
index 4ef78da8c36..925c786080e 100644
--- a/src/main/java/org/jabref/gui/ai/components/privacynotice/PrivacyNoticeComponent.java
+++ b/src/main/java/org/jabref/gui/ai/components/privacynotice/PrivacyNoticeComponent.java
@@ -2,11 +2,15 @@
import java.io.IOException;
+import javafx.beans.binding.Bindings;
+import javafx.beans.binding.DoubleBinding;
import javafx.fxml.FXML;
import javafx.scene.control.Hyperlink;
+import javafx.scene.control.Label;
import javafx.scene.control.ScrollPane;
+import javafx.scene.layout.GridPane;
+import javafx.scene.layout.VBox;
import javafx.scene.text.Text;
-import javafx.scene.text.TextFlow;
import org.jabref.gui.DialogService;
import org.jabref.gui.desktop.os.NativeDesktop;
@@ -21,11 +25,8 @@
public class PrivacyNoticeComponent extends ScrollPane {
private final Logger LOGGER = LoggerFactory.getLogger(PrivacyNoticeComponent.class);
- @FXML private TextFlow openAiPrivacyTextFlow;
- @FXML private TextFlow mistralAiPrivacyTextFlow;
- @FXML private TextFlow geminiPrivacyTextFlow;
- @FXML private TextFlow huggingFacePrivacyTextFlow;
- @FXML private TextFlow gpt4AllTextFlow;
+ @FXML private VBox text;
+ @FXML private GridPane aiPolicies;
@FXML private Text embeddingModelText;
private final AiPreferences aiPreferences;
@@ -46,11 +47,11 @@ public PrivacyNoticeComponent(AiPreferences aiPreferences, Runnable onIAgreeButt
@FXML
private void initialize() {
- initPrivacyHyperlink(openAiPrivacyTextFlow, AiProvider.OPEN_AI);
- initPrivacyHyperlink(mistralAiPrivacyTextFlow, AiProvider.MISTRAL_AI);
- initPrivacyHyperlink(geminiPrivacyTextFlow, AiProvider.GEMINI);
- initPrivacyHyperlink(huggingFacePrivacyTextFlow, AiProvider.HUGGING_FACE);
- initPrivacyHyperlink(gpt4AllTextFlow, AiProvider.GPT4ALL);
+ addPrivacyHyperlink(aiPolicies, AiProvider.OPEN_AI);
+ addPrivacyHyperlink(aiPolicies, AiProvider.MISTRAL_AI);
+ addPrivacyHyperlink(aiPolicies, AiProvider.GEMINI);
+ addPrivacyHyperlink(aiPolicies, AiProvider.HUGGING_FACE);
+ addPrivacyHyperlink(aiPolicies, AiProvider.GPT4ALL);
String newEmbeddingModelText = embeddingModelText.getText().replaceAll("%0", aiPreferences.getEmbeddingModel().sizeInfo());
embeddingModelText.setText(newEmbeddingModelText);
@@ -58,35 +59,26 @@ private void initialize() {
// Because of the https://bugs.openjdk.org/browse/JDK-8090400 bug, the text in the privacy policy cannot be
// fully wrapped.
- embeddingModelText.wrappingWidthProperty().bind(this.widthProperty());
+ DoubleBinding textWidth = Bindings.subtract(this.widthProperty(), 88d);
+ text.getChildren().forEach(child -> {
+ if (child instanceof Text line) {
+ line.wrappingWidthProperty().bind(textWidth);
+ }
+ });
+ aiPolicies.prefWidthProperty().bind(textWidth);
+ embeddingModelText.wrappingWidthProperty().bind(textWidth);
}
- private void initPrivacyHyperlink(TextFlow textFlow, AiProvider aiProvider) {
- if (textFlow.getChildren().isEmpty() || !(textFlow.getChildren().getFirst() instanceof Text text)) {
- return;
- }
-
- String replacedText = text.getText().replaceAll("%0", aiProvider.getLabel()).replace("%1", "");
-
- replacedText = replacedText.endsWith(".") ? replacedText.substring(0, replacedText.length() - 1) : replacedText;
-
- text.setText(replacedText);
- text.wrappingWidthProperty().bind(this.widthProperty());
+ private void addPrivacyHyperlink(GridPane gridPane, AiProvider aiProvider) {
+ int row = gridPane.getRowCount();
+ Label aiName = new Label(aiProvider.getLabel());
+ gridPane.add(aiName, 0, row);
Hyperlink hyperlink = new Hyperlink(aiProvider.getApiUrl());
hyperlink.setWrapText(true);
- hyperlink.setFont(text.getFont());
- hyperlink.setOnAction(event -> {
- openBrowser(aiProvider.getApiUrl());
- });
-
- textFlow.getChildren().add(hyperlink);
-
- Text dot = new Text(".");
- dot.setFont(text.getFont());
- dot.wrappingWidthProperty().bind(this.widthProperty());
-
- textFlow.getChildren().add(dot);
+ // hyperlink.setFont(aiName.getFont());
+ hyperlink.setOnAction(event -> openBrowser(aiProvider.getApiUrl()));
+ gridPane.add(hyperlink, 1, row);
}
@FXML
diff --git a/src/main/java/org/jabref/gui/documentviewer/DocumentViewer.css b/src/main/java/org/jabref/gui/documentviewer/DocumentViewer.css
deleted file mode 100644
index 61291c1b2b0..00000000000
--- a/src/main/java/org/jabref/gui/documentviewer/DocumentViewer.css
+++ /dev/null
@@ -1,10 +0,0 @@
-#mainPane {
- -fx-background-color: -fx-accented-background;
- -fx-padding: 0;
-}
-
-.document-viewer .page {
- -fx-padding: 0em 0em 1em 0em;
- -fx-background-insets: 0;
-}
-
diff --git a/src/main/java/org/jabref/gui/documentviewer/DocumentViewer.fxml b/src/main/java/org/jabref/gui/documentviewer/DocumentViewer.fxml
index 0fca11e3873..3a1361d2b7a 100644
--- a/src/main/java/org/jabref/gui/documentviewer/DocumentViewer.fxml
+++ b/src/main/java/org/jabref/gui/documentviewer/DocumentViewer.fxml
@@ -15,7 +15,8 @@
+ fx:controller="org.jabref.gui.documentviewer.DocumentViewerView"
+ id="documentViewerDialog">
diff --git a/src/main/java/org/jabref/gui/entryeditor/EntryEditor.css b/src/main/java/org/jabref/gui/entryeditor/EntryEditor.css
deleted file mode 100644
index 48dbb5785b7..00000000000
--- a/src/main/java/org/jabref/gui/entryeditor/EntryEditor.css
+++ /dev/null
@@ -1,167 +0,0 @@
-.editorPane {
- -fx-hgap: 10;
- -fx-vgap: 6;
- -fx-background-color: -fx-control-inner-background;
- -fx-padding: 5 5 5 15;
-}
-
-.date-picker > .date-picker-display-node {
- -fx-text-origin: baseline;
-}
-
-.date-picker > .date-picker-display-node *.text {
- -fx-text-origin: bottom;
-}
-
-.combo-box > *.text {
- -fx-text-origin: baseline;
-}
-
-#typeLabel {
- -fx-padding: 0.1em;
- -fx-font-size: 1.166667em;
- -fx-font-weight: bold;
- -fx-text-fill: -jr-theme-text;
-}
-
-#typeLabel:hover {
- -fx-padding: 0.1em;
- -fx-font-size: 1.166667em;
- -fx-font-weight: bold;
- -fx-background-color: -jr-icon-background-active;
-}
-
-#typeLabel .context-menu {
- -fx-font-size: 0.92em;
- -fx-font-weight: normal;
-}
-
-#typeLabel .tooltip {
- -fx-font-size: 1em;
- -fx-font-weight: normal;
-}
-
-.icon-button.narrow {
- -fx-padding: 0.1em;
-}
-
-.icon-buttonNoSpaceBottom.narrow {
- -fx-padding: 0.1em 0.1em -0.2em 0.1em;
-}
-
-.icon-buttonNoSpaceTop.narrow {
- -fx-padding: -0.2em 0.1em 0.1em 0.1em;
-}
-
-.tool-bar {
- -fx-background-color: -jr-background-alt;
- -fx-background-insets: 0;
-}
-
-.tool-bar > .container > .separator {
- -fx-background-color: -jr-separator;
-}
-
-.tool-bar .glyph-icon {
- -glyph-size: 16px;
- -fx-font-size: 2em;
- -fx-fill: -jr-theme-text;
- -fx-text-fill: -jr-theme-text;
-}
-
-.warning-icon {
- -fx-fill: -jr-warn;
-}
-
-.error-icon {
- -fx-text-fill: -jr-error;
- -fx-fill: -jr-error;
-}
-
-.tooltip-warning {
- -fx-background-color: -jr-warn;
-}
-
-.tooltip-error {
- -fx-background-color: -jr-error;
-}
-
-.code-area .context-menu {
- -fx-font-family: sans-serif;
-}
-
-#related-articles-tab {
- -fx-padding: 20 20 20 20;
- -fx-background-color: -fx-control-inner-background;
-}
-
-#related-articles-tab * {
- -fx-fill: -fx-text-background-color;
-}
-
-#gdpr-dialog {
- -fx-border-color: -jr-warn;
- -fx-border-insets: 5;
- -fx-border-style: dashed;
- -fx-border-width: 2;
- -fx-padding: 12;
- -fx-font-size: 1.3em;
-}
-
-#gdpr-dialog * {
- -fx-fill: -fx-text-background-color;
-}
-
-.recommendation-item {
- -fx-padding: 0 0 0 20;
-}
-
-#bibtexSourceCodeArea {
- -fx-padding: 4 4 4 4;
- -fx-background-color: -fx-control-inner-background;
-}
-
-#bibtexSourceCodeArea .search {
- -rtfx-background-color: #ffff00;
- -fx-fill: #7800A9 ;
- -fx-font-size: 1.2em;
- -fx-font-weight: bolder;
-}
-
-#citationsPane {
- -fx-padding: 0;
- -fx-background-color: -fx-control-inner-background;
-}
-
-#citationsPane *,
-#scitePane Label, #scitePane Text {
- -fx-fill: -fx-text-background-color;
-}
-
-.heading {
- -fx-font-size: 1.5em;
- -fx-font-weight: bold;
-}
-
-.description {
- -fx-font-style: italic;
-}
-
-.scite-tallies-label {
- -fx-font-size: 1.5em;
- -fx-font-weight: bold;
-}
-
-.scite-error-box {
- -fx-padding: 30 0 0 30;
-}
-
-.scite-message-box {
- -fx-padding: 30 0 0 30;
-}
-
-#scite-error-label {
- -fx-font-size: 1.5em;
- -fx-font-weight: bold;
- -fx-text-fill: -jr-error;
-}
diff --git a/src/main/java/org/jabref/gui/entryeditor/EntryEditor.fxml b/src/main/java/org/jabref/gui/entryeditor/EntryEditor.fxml
index f709db8aed1..bc5add45b73 100644
--- a/src/main/java/org/jabref/gui/entryeditor/EntryEditor.fxml
+++ b/src/main/java/org/jabref/gui/entryeditor/EntryEditor.fxml
@@ -11,8 +11,10 @@
-
+
-
+
.hits {
- -fx-font-size: 0.75em;
- -fx-background-color: -jr-group-hits-bg;
- -fx-padding: 0.4em 0.4em 0.4em 0.4em;
- -fx-background-insets: 0;
- -fx-background-radius: 0.7em;
-}
-
-.numberColumn > .hits .text {
- -fx-fill: -jr-group-hits-fg;
-}
-
-.expansionNodeColumn {
- -fx-alignment: top-right;
-}
-
-.tree-table-row-cell:dragOver-bottom {
- -fx-border-color: -jr-drag-target;
- -fx-border-width: 0 0 2 0;
- -fx-padding: 0 0 -2 0;
-}
-
-.tree-table-row-cell:dragOver-center {
- -fx-border-color: -jr-drag-target;
- -fx-border-width: 1 1 1 1;
- -fx-padding: -1 -1 -1 -1;
- -fx-background-color: -jr-drag-target-hover;
-}
-
-.tree-table-row-cell:dragOver-top {
- -fx-border-color: -jr-drag-target;
- -fx-border-width: 2 0 0 0;
- -fx-padding: -2 0 0 0;
-}
-
-.tree-table-row-cell:sub > .tree-table-cell {
- -fx-padding: 0.20em 0em 0.20em 0em;
-}
-
-.tree-table-row-cell:sub > .numberColumn {
- -fx-padding: 0.20em 0.2em 0.20em 0em;
-}
-
-.tree-table-row-cell:root {
- -fx-border-width: 0 0 1 0;
- -fx-border-color: -jr-separator;
-}
-
-.tree-table-row-cell:root > .tree-table-cell {
- -fx-padding: 0.65em 0em 0.65em 1em;
-}
-
-.tree-table-row-cell:root > .numberColumn {
- -fx-padding: 0.40em 0.2em 0.40em 0em;
-}
-
-.tree-table-row-cell:root > .expansionNodeColumn {
- -fx-padding: 0.45em 0.2em 0.45em 0.2em;
-}
-
-.tree-table-row-cell:empty {
- -fx-background-color: transparent; /* hide cells which are not bound to a group */
-}
-
-.column-header-background {
- visibility: hidden; /* hide column header */
- -fx-padding: -0.8em;
-}
-
-.tree-table-row-cell > .tree-table-cell > .tree-disclosure-node > .arrow {
- -fx-background-color: -fx-mid-text-color;
- -fx-max-height: 0.5em;
- -fx-max-width: 0.5em;
- -fx-padding: 0.333333em 0.229em 0.333333em 0.229em; /* 4 */
- -fx-shape: "m64,416l96,96l256,-256l-256,-256l-96,96l160,160l-160,160z";
-}
-
-.tree-table-row-cell:expanded > .tree-table-cell > .tree-disclosure-node > .arrow {
- -fx-rotate: 90;
-}
-
-.tree-table-row-cell > .tree-table-cell > .icon {
- -fx-translate-x: -0.4em;
-}
-
-#groupFilterBar {
- -fx-background-color: -jr-sidepane-header-background;
- -fx-border-color: -jr-separator;
- -fx-border-width: 1 0 0 0;
- -fx-padding: 0em 1em 0em 1em;
-}
-
-#groupFilterBar .glyph-icon {
- -fx-font-size: 2em;
-}
-
-#groupBar .glyph-icon {
- -fx-font-size: 2em;
-}
diff --git a/src/main/java/org/jabref/gui/groups/GroupTreeView.java b/src/main/java/org/jabref/gui/groups/GroupTreeView.java
index 7b6efa2ecdd..27ac6216706 100644
--- a/src/main/java/org/jabref/gui/groups/GroupTreeView.java
+++ b/src/main/java/org/jabref/gui/groups/GroupTreeView.java
@@ -7,7 +7,6 @@
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
-import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;
@@ -43,7 +42,6 @@
import javafx.scene.layout.StackPane;
import javafx.scene.text.Text;
-import org.jabref.architecture.AllowedToUseClassGetResource;
import org.jabref.gui.DialogService;
import org.jabref.gui.DragAndDropDataFormats;
import org.jabref.gui.StateManager;
@@ -71,7 +69,6 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-@AllowedToUseClassGetResource("JavaFX internally handles the passed URLs properly.")
public class GroupTreeView extends BorderPane {
private static final Logger LOGGER = LoggerFactory.getLogger(GroupTreeView.class);
@@ -108,8 +105,7 @@ public GroupTreeView(TaskExecutor taskExecutor,
StateManager stateManager,
GuiPreferences preferences,
DialogService dialogService,
- AiService aiService
- ) {
+ AiService aiService) {
this.taskExecutor = taskExecutor;
this.stateManager = stateManager;
this.preferences = preferences;
@@ -117,13 +113,13 @@ public GroupTreeView(TaskExecutor taskExecutor,
this.aiService = aiService;
createNodes();
- this.getStylesheets().add(Objects.requireNonNull(GroupTreeView.class.getResource("GroupTree.css")).toExternalForm());
initialize();
}
private void createNodes() {
searchField = SearchTextField.create(preferences.getKeyBindingRepository());
searchField.setPromptText(Localization.lang("Filter groups..."));
+ searchField.setId("groupFilterBar");
this.setTop(searchField);
mainColumn = new TreeTableColumn<>();
@@ -151,7 +147,6 @@ private void createNodes() {
mainColumn.prefWidthProperty().bind(groupTree.widthProperty().subtract(80d).subtract(15d));
Button addNewGroup = new Button(Localization.lang("Add group"));
- addNewGroup.setId("addNewGroup");
addNewGroup.setMaxWidth(Double.MAX_VALUE);
HBox.setHgrow(addNewGroup, Priority.ALWAYS);
addNewGroup.setTooltip(new Tooltip(Localization.lang("New group")));
diff --git a/src/main/java/org/jabref/gui/help/AboutDialog.css b/src/main/java/org/jabref/gui/help/AboutDialog.css
deleted file mode 100644
index 50d86c04a8d..00000000000
--- a/src/main/java/org/jabref/gui/help/AboutDialog.css
+++ /dev/null
@@ -1,50 +0,0 @@
-.about-heading {
- -fx-font-size: 30;
- -fx-text-fill: -jr-theme;
-}
-
-.about-heading:pressed {
- -fx-text-fill: -jr-selected;
-}
-
-.top-padding {
- -fx-padding: 5 0 0 0;
-}
-
-.dev-heading {
- -fx-font-size: 18;
- -fx-padding: -10 0 0 0;
-}
-
-.sub-heading {
- -fx-font-size: 18;
- -fx-padding: 5px;
-}
-
-.about-top {
- -fx-padding: 0 5 15 5;
-}
-
-.space {
- -fx-padding: 0 5 0 5;
-}
-
-.space-after {
- -fx-padding: 0 5 0 0;
-}
-
-.info-sections {
- -fx-padding: 5px;
-}
-
-.contrib-section {
- -fx-padding: 5 5 10 5;
-}
-
-.logo-pane {
- -fx-fill: transparent;
-}
-
-.logo-pane SVGPath {
- -fx-fill: #4f5f8f;
-}
diff --git a/src/main/java/org/jabref/gui/help/AboutDialog.fxml b/src/main/java/org/jabref/gui/help/AboutDialog.fxml
index bda361a6046..da779d3be1f 100644
--- a/src/main/java/org/jabref/gui/help/AboutDialog.fxml
+++ b/src/main/java/org/jabref/gui/help/AboutDialog.fxml
@@ -15,7 +15,10 @@
-
+
diff --git a/src/main/java/org/jabref/gui/importer/ImportEntriesDialog.css b/src/main/java/org/jabref/gui/importer/ImportEntriesDialog.css
deleted file mode 100644
index 8c196804bc3..00000000000
--- a/src/main/java/org/jabref/gui/importer/ImportEntriesDialog.css
+++ /dev/null
@@ -1,12 +0,0 @@
-.addEntryButton {
- -fx-font-size: 2em;
-}
-
-.addEntryButton:selected {
- -fx-background-color: transparent;
- -fx-fill: -jr-selected;
-}
-
-.entry-container {
- -fx-padding: 0.5em 0em 0.5em 0em;
-}
diff --git a/src/main/java/org/jabref/gui/importer/ImportEntriesDialog.fxml b/src/main/java/org/jabref/gui/importer/ImportEntriesDialog.fxml
index 4be2fabb5c4..8dbec6a69fa 100644
--- a/src/main/java/org/jabref/gui/importer/ImportEntriesDialog.fxml
+++ b/src/main/java/org/jabref/gui/importer/ImportEntriesDialog.fxml
@@ -14,7 +14,8 @@
+ xmlns:fx="http://javafx.com/fxml/1" fx:controller="org.jabref.gui.importer.ImportEntriesDialog"
+ id="importEntriesDialog">
diff --git a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.css b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.css
deleted file mode 100644
index 99dffba7da4..00000000000
--- a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.css
+++ /dev/null
@@ -1,28 +0,0 @@
-.text-changed {
- -fx-fill: -jr-orange;
-}
-
-.text-added {
- -fx-fill: -jr-green;
-}
-
-.text-removed {
- -fx-fill: -jr-red;
-}
-
-.grid-pane {
- -fx-hgap: 10;
- -fx-vgap: 10;
-}
-
-.toggle-button {
- -fx-border-insets: 0;
- -fx-background-insets: 0;
- -fx-border-image-insets: 0;
- -fx-padding: 0;
- -fx-background-radius: 0;
-}
-
-.box {
- -fx-spacing: 10;
-}
diff --git a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.fxml b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.fxml
index d0a7c0de7a4..813ccd470bb 100644
--- a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.fxml
+++ b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.fxml
@@ -12,7 +12,8 @@
+ prefHeight="500.0" prefWidth="800.0"
+ id="multiMergeEntries">
diff --git a/src/main/java/org/jabref/gui/mergeentries/newmergedialog/ThreeWayMergeView.css b/src/main/java/org/jabref/gui/mergeentries/newmergedialog/ThreeWayMergeView.css
deleted file mode 100644
index 52b87f36949..00000000000
--- a/src/main/java/org/jabref/gui/mergeentries/newmergedialog/ThreeWayMergeView.css
+++ /dev/null
@@ -1,55 +0,0 @@
-.merged-field .styled-text-area {
- -fx-background-color: -fx-outer-border, -fx-control-inner-background;
- -fx-background-insets: 0, 1;
- -fx-prompt-text-fill: -fx-mid-text-color;
-}
-.merged-field .styled-text-area:focused {
- -fx-highlight-fill: derive(-jr-accent, 20%);
- -fx-background-color: -jr-accent, -fx-control-inner-background;
- -fx-background-insets: 0, 2;
- -fx-highlight-text-fill: -fx-text-inner-color;
-}
-
-.merge-field-value:selected .selection-box {
- -fx-background-color: -jr-accent-alt;
- -fx-border-color: -jr-accent;
-}
-
-.merge-field-value .selection-box {
- -fx-background-color: #0000;
- -fx-border-color: #0000;
- -fx-border-radius: 8;
- -fx-background-radius: 8;
- -fx-border-width: 2.5;
-}
-
-.styled-text-area .text{
- -fx-fill: -fx-text-background-color;
-}
-
-.field-cell:odd {
- -fx-background-color: -jr-row-odd-background;
-}
-
-.field-cell:even {
- -fx-background-color: -jr-row-even-background;
-}
-
-.field-cell {
- -fx-padding: 8;
-}
-
-.merge-toolbox {
- -fx-background-color: -jr-menu-background;
-}
-
-.merge-header-cell .label{
- -fx-font-weight: bold;
- -fx-padding: 1, 0, 1, 0;
-}
-
-.field-name .glyph-icon,
-.field-name .ikonli-font-icon {
- -fx-icon-size: 17;
- -fx-icon-color: -jr-theme-text;
-}
diff --git a/src/main/java/org/jabref/gui/mergeentries/newmergedialog/ThreeWayMergeView.java b/src/main/java/org/jabref/gui/mergeentries/newmergedialog/ThreeWayMergeView.java
index b4d36e34e60..e70d8ff8807 100644
--- a/src/main/java/org/jabref/gui/mergeentries/newmergedialog/ThreeWayMergeView.java
+++ b/src/main/java/org/jabref/gui/mergeentries/newmergedialog/ThreeWayMergeView.java
@@ -11,7 +11,6 @@
import javafx.scene.layout.VBox;
import javafx.stage.Screen;
-import org.jabref.architecture.AllowedToUseClassGetResource;
import org.jabref.gui.mergeentries.newmergedialog.fieldsmerger.FieldMergerFactory;
import org.jabref.gui.mergeentries.newmergedialog.toolbar.ThreeWayMergeToolbar;
import org.jabref.gui.preferences.GuiPreferences;
@@ -20,7 +19,6 @@
import org.jabref.model.entry.field.Field;
import org.jabref.model.entry.field.FieldProperty;
-@AllowedToUseClassGetResource("JavaFX internally handles the passed URLs properly.")
public class ThreeWayMergeView extends VBox {
public static final int GRID_COLUMN_MIN_WIDTH = 250;
@@ -47,7 +45,6 @@ public class ThreeWayMergeView extends VBox {
public ThreeWayMergeView(BibEntry leftEntry, BibEntry rightEntry, String leftHeader, String rightHeader, GuiPreferences preferences) {
this.preferences = preferences;
- getStylesheets().add(ThreeWayMergeView.class.getResource("ThreeWayMergeView.css").toExternalForm());
viewModel = new ThreeWayMergeViewModel((BibEntry) leftEntry.clone(), (BibEntry) rightEntry.clone(), leftHeader, rightHeader);
this.fieldMergerFactory = new FieldMergerFactory(preferences.getBibEntryPreferences());
this.keywordSeparator = preferences.getBibEntryPreferences().getKeywordSeparator().toString();
@@ -67,6 +64,8 @@ public ThreeWayMergeView(BibEntry leftEntry, BibEntry rightEntry, String leftHea
this.setPrefWidth(Screen.getPrimary().getBounds().getWidth() * 0.97);
getChildren().addAll(toolbar, headerView, scrollPane);
+
+ getStyleClass().add("three-way-merge");
}
public ThreeWayMergeView(BibEntry leftEntry, BibEntry rightEntry, GuiPreferences preferences) {
diff --git a/src/main/java/org/jabref/gui/openoffice/StyleSelectDialog.fxml b/src/main/java/org/jabref/gui/openoffice/StyleSelectDialog.fxml
index beb8516bf90..9eada3a1bdf 100644
--- a/src/main/java/org/jabref/gui/openoffice/StyleSelectDialog.fxml
+++ b/src/main/java/org/jabref/gui/openoffice/StyleSelectDialog.fxml
@@ -16,70 +16,61 @@
+ fx:controller="org.jabref.gui.openoffice.StyleSelectDialogView"
+ id="styleSelectDialog">
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
-
-
-
-
+
+
diff --git a/src/main/java/org/jabref/gui/preferences/PreferencesDialog.css b/src/main/java/org/jabref/gui/preferences/PreferencesDialog.css
deleted file mode 100644
index 1b1e95c675b..00000000000
--- a/src/main/java/org/jabref/gui/preferences/PreferencesDialog.css
+++ /dev/null
@@ -1,78 +0,0 @@
-#sidepane {
- -fx-background-color: -jr-sidepane-background;
-}
-
-#preferenceTabList {
- -fx-background-color: transparent;
-}
-
-#preferenceTabList > .virtual-flow > .clipped-container > .sheet > .list-cell {
- -fx-padding: 8 8 8 8;
- -fx-background: transparent;
- -fx-text-fill: -fx-text-base-color;
-}
-
-.button-bar > .container {
- -fx-border-width: 1 0 0 0;
- -fx-border-color: -jr-sidepane-background;
-}
-
-#preferenceTabList > .virtual-flow > .clipped-container > .sheet > .list-cell:filled:selected {
- -fx-background: -fx-control-inner-background;
-}
-
-.split-pane > .split-pane-divider {
- -fx-padding: 0 4 0 4;
- -fx-background-color: transparent;
-}
-
-.preferencesTab {
- -fx-padding: 0.5em;
-}
-
-*:search-highlight {
- -fx-background-color: -jr-light-red;
-}
-
-.code-area {
- -fx-padding: 0;
- -fx-border-width: 1;
- -fx-background-color: transparent;
-}
-
-.code-area .text {
- -fx-fill: -fx-text-background-color;
-}
-
-.code-area .tagmark {
- -fx-fill: gray;
-}
-
-.code-area .anytag {
- -fx-fill: crimson;
-}
-
-.code-area .paren {
- -fx-fill: firebrick;
- -fx-font-weight: bold;
-}
-
-.code-area .attribute {
- -fx-fill: darkviolet;
-}
-
-.code-area .avalue {
- -fx-fill: green;
-}
-
-.code-area .comment {
- -fx-fill: teal;
-}
-
-.code-area .highlight-keyword {
- -fx-text-fill: -jr-purple;
-}
-
-.code-area .context-menu .menu-item .label {
- -fx-padding: 2;
-}
diff --git a/src/main/java/org/jabref/gui/preferences/PreferencesDialog.fxml b/src/main/java/org/jabref/gui/preferences/PreferencesDialog.fxml
index de98129187b..53603ade391 100644
--- a/src/main/java/org/jabref/gui/preferences/PreferencesDialog.fxml
+++ b/src/main/java/org/jabref/gui/preferences/PreferencesDialog.fxml
@@ -15,7 +15,8 @@
+ fx:controller="org.jabref.gui.preferences.PreferencesDialogView"
+ id="preferencesDialog">
diff --git a/src/main/java/org/jabref/gui/preferences/keybindings/KeyBindingsTab.css b/src/main/java/org/jabref/gui/preferences/keybindings/KeyBindingsTab.css
deleted file mode 100644
index 65ecab8c829..00000000000
--- a/src/main/java/org/jabref/gui/preferences/keybindings/KeyBindingsTab.css
+++ /dev/null
@@ -1,12 +0,0 @@
-.keybinding-table {
- -fx-table-cell-border-color: transparent;
-}
-
-.tree-table-row-cell:empty {
- visibility: hidden;
-}
-
-.tree-table-row-cell:selected > .tree-table-cell > .icon,
-.tree-table-row-cell:pressed > .tree-table-cell > .icon {
- -fx-fill: white;
-}
diff --git a/src/main/java/org/jabref/gui/slr/ManageStudyDefinition.css b/src/main/java/org/jabref/gui/slr/ManageStudyDefinition.css
deleted file mode 100644
index e4f5540d22e..00000000000
--- a/src/main/java/org/jabref/gui/slr/ManageStudyDefinition.css
+++ /dev/null
@@ -1,3 +0,0 @@
-.slr-tab {
- -fx-padding: 1em;
-}
diff --git a/src/main/java/org/jabref/gui/texparser/ParseLatexResult.css b/src/main/java/org/jabref/gui/texparser/ParseLatexResult.css
deleted file mode 100644
index 38bdb760e13..00000000000
--- a/src/main/java/org/jabref/gui/texparser/ParseLatexResult.css
+++ /dev/null
@@ -1,25 +0,0 @@
-#referenceListView {
- -fx-background-color: -jr-sidepane-background;
-}
-
-#referenceListView > .virtual-flow > .clipped-container > .sheet > .list-cell {
- -fx-padding: 4 4 4 4;
- -fx-background: transparent;
- -fx-text-fill: -fx-text-base-color;
-}
-
-#referenceListView > .virtual-flow > .clipped-container > .sheet > .list-cell * {
- -fx-text-fill: -fx-text-base-color;
-}
-
-.split-pane > .split-pane-divider {
- -fx-padding: 0 4 0 4;
- -fx-background-color: transparent;
-}
-
-.button-bar > .container {
- -fx-border-width: 1 0 0 0;
- -fx-border-color: -jr-sidepane-background;
-}
-
-
diff --git a/src/main/java/org/jabref/gui/texparser/ParseLatexResult.fxml b/src/main/java/org/jabref/gui/texparser/ParseLatexResult.fxml
index 1e4d10c9c07..bcdf3818af4 100644
--- a/src/main/java/org/jabref/gui/texparser/ParseLatexResult.fxml
+++ b/src/main/java/org/jabref/gui/texparser/ParseLatexResult.fxml
@@ -9,7 +9,8 @@
+ prefWidth="900.0" prefHeight="600.0"
+ id="parseLatexResultDialog">
diff --git a/src/main/java/org/jabref/model/entry/BibEntry.java b/src/main/java/org/jabref/model/entry/BibEntry.java
index 6f2a38aca7c..45745f9bbde 100644
--- a/src/main/java/org/jabref/model/entry/BibEntry.java
+++ b/src/main/java/org/jabref/model/entry/BibEntry.java
@@ -172,6 +172,10 @@ public Optional setMonth(Month parsedMonth) {
return setField(StandardField.MONTH, parsedMonth.getJabRefFormat());
}
+ public Optional setLangid(Langid parsedLangid) {
+ return setField(StandardField.LANGUAGEID, parsedLangid.getJabRefFormat());
+ }
+
public Optional getResolvedFieldOrAlias(OrFields fields, BibDatabase database) {
for (Field field : fields.getFields()) {
Optional value = getResolvedFieldOrAlias(field, database);
diff --git a/src/main/java/org/jabref/model/entry/Langid.java b/src/main/java/org/jabref/model/entry/Langid.java
new file mode 100644
index 00000000000..eb94b1352e0
--- /dev/null
+++ b/src/main/java/org/jabref/model/entry/Langid.java
@@ -0,0 +1,95 @@
+package org.jabref.model.entry;
+
+import java.util.Optional;
+
+import org.jabref.logic.bibtex.FieldWriter;
+/**
+ * Language identifiers based on BibLaTeX manual specifications.
+ * See the BibLaTeX documentation for full details:
+ * BibLaTeX manual
+ */
+
+public enum Langid {
+ BASQUE("Basque", "basque"),
+ BULGARIAN("Bulgarian", "bulgarian"),
+ CATALAN("Catalan", "catalan"),
+ CROATIAN("Croatian", "croatian"),
+ CZECH("Czech", "czech"),
+ DANISH("Danish", "danish"),
+ AMERICAN("American", "american"),
+ USENGLISH("US English", "USenglish"),
+ ENGLISH("English", "english"),
+ BRITISH("British", "british"),
+ UKENGLISH("UK English", "UKenglish"),
+ CANADIAN("Canadian", "canadian"),
+ AUSTRALIAN("Australian", "australian"),
+ NEWZEALAND("New Zealand", "newzealand"),
+ ESTONIAN("Estonian", "estonian"),
+ FINNISH("Finnish", "finnish"),
+ FRENCH("French", "french"),
+ GERMAN("German", "german"),
+ AUSTRIAN("Austrian", "austrian"),
+ SWISSGERMAN("Swiss German", "swissgerman"),
+ NGERMAN("German (New)", "ngerman"),
+ NAUSTRIAN("Austrian (New)", "naustrian"),
+ NSWISSGERMAN("Swiss German (New)", "nswissgerman"),
+ GREEK("Greek", "greek"),
+ MAGYAR("Hungarian", "hungarian"),
+ HUNGARIAN("Hungarian", "hungarian"),
+ ICELANDIC("Icelandic", "icelandic"),
+ ITALIAN("Italian", "italian"),
+ LATVIAN("Latvian", "latvian"),
+ LITHUANIAN("Lithuanian", "lithuanian"),
+ MARATHI("Marathi", "marathi"),
+ NORSK("Norwegian (Bokmål)", "norsk"),
+ NYNORSK("Norwegian (Nynorsk)", "nynorsk"),
+ POLISH("Polish", "polish"),
+ BRAZIL("Portuguese (Brazilian)", "brazil"),
+ PORTUGUESE("Portuguese", "portuguese"),
+ PORTUGES("Portuguese (alt)", "portuges"),
+ ROMANIAN("Romanian", "romanian"),
+ RUSSIAN("Russian", "russian"),
+ SERBIAN("Serbian (Latin)", "serbian"),
+ SERBIANC("Serbian (Cyrillic)", "serbianc"),
+ SLOVAK("Slovak", "slovak"),
+ SLOVENE("Slovene", "slovene"),
+ SLOVENIAN("Slovenian", "slovenian"),
+ SPANISH("Spanish", "spanish"),
+ SWEDISH("Swedish", "swedish"),
+ TURKISH("Turkish", "turkish"),
+ UKRAINIAN("Ukrainian", "ukrainian");
+
+
+ private final String name;
+ private final String langid;
+
+ Langid(String name, String langid) {
+ this.name = name;
+ this.langid = langid;
+ }
+
+ public String getLangid() {
+ return langid;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public static Optional getByLangid(String id) {
+ for (Langid lang : Langid.values()) {
+ if (lang.langid.equalsIgnoreCase(id)) {
+ return Optional.of(lang);
+ }
+ }
+ return Optional.empty();
+ }
+
+ public static Optional parse(String value) {
+ return Langid.getByLangid(value.trim().toLowerCase());
+ }
+
+ public String getJabRefFormat() {
+ return (FieldWriter.BIBTEX_STRING_START_END_SYMBOL + "%s" + FieldWriter.BIBTEX_STRING_START_END_SYMBOL).formatted(langid);
+ }
+}
diff --git a/src/main/java/org/jabref/model/entry/field/FieldFactory.java b/src/main/java/org/jabref/model/entry/field/FieldFactory.java
index a2d6f969749..aaf8337e3df 100644
--- a/src/main/java/org/jabref/model/entry/field/FieldFactory.java
+++ b/src/main/java/org/jabref/model/entry/field/FieldFactory.java
@@ -69,6 +69,7 @@ public static Collection getNotTextFields() {
// These fields are not marked as verbatim, because they could include LaTeX code
result.add(StandardField.MONTH);
result.add(StandardField.DATE);
+ result.add(StandardField.LANGUAGEID);
return result;
}
diff --git a/src/main/java/org/jabref/model/entry/types/BiblatexEntryTypeDefinitions.java b/src/main/java/org/jabref/model/entry/types/BiblatexEntryTypeDefinitions.java
index 40c79b8b31d..69712ec07bf 100644
--- a/src/main/java/org/jabref/model/entry/types/BiblatexEntryTypeDefinitions.java
+++ b/src/main/java/org/jabref/model/entry/types/BiblatexEntryTypeDefinitions.java
@@ -23,7 +23,7 @@ public class BiblatexEntryTypeDefinitions {
.withImportantFields(
StandardField.SUBTITLE, StandardField.EDITOR, StandardField.SERIES, StandardField.VOLUME, StandardField.NUMBER,
StandardField.EID, StandardField.ISSUE, StandardField.PAGES, StandardField.NOTE, StandardField.ISSN, StandardField.DOI,
- StandardField.EPRINT, StandardField.EPRINTCLASS, StandardField.EPRINTTYPE, StandardField.URL, StandardField.URLDATE)
+ StandardField.EPRINT, StandardField.EPRINTCLASS, StandardField.EPRINTTYPE, StandardField.URL, StandardField.URLDATE, StandardField.LANGUAGEID)
.withDetailFields(
StandardField.TRANSLATOR, StandardField.ANNOTATOR, StandardField.COMMENTATOR,
StandardField.TITLEADDON, StandardField.EDITORA, StandardField.EDITORB, StandardField.EDITORC,
@@ -39,7 +39,7 @@ public class BiblatexEntryTypeDefinitions {
StandardField.SUBTITLE, StandardField.TITLEADDON, StandardField.MAINTITLE, StandardField.MAINSUBTITLE,
StandardField.MAINTITLEADDON, StandardField.VOLUME, StandardField.EDITION, StandardField.PUBLISHER, StandardField.ISBN,
StandardField.CHAPTER, StandardField.PAGES, StandardField.PAGETOTAL, StandardField.DOI, StandardField.EPRINT,
- StandardField.EPRINTCLASS, StandardField.EPRINTTYPE, StandardField.URL, StandardField.URLDATE)
+ StandardField.EPRINTCLASS, StandardField.EPRINTTYPE, StandardField.URL, StandardField.URLDATE, StandardField.LANGUAGEID)
.withDetailFields(StandardField.EDITORA, StandardField.EDITORB, StandardField.EDITORC,
StandardField.TRANSLATOR, StandardField.ANNOTATOR, StandardField.COMMENTATOR, StandardField.INTRODUCTION,
StandardField.FOREWORD, StandardField.AFTERWORD,
@@ -55,7 +55,7 @@ public class BiblatexEntryTypeDefinitions {
.withRequiredFields(StandardField.AUTHOR, StandardField.TITLE, StandardField.DATE)
.withImportantFields(StandardField.EDITOR, StandardField.SUBTITLE, StandardField.TITLEADDON, StandardField.EDITION,
StandardField.PUBLISHER, StandardField.ISBN, StandardField.PAGETOTAL, StandardField.DOI, StandardField.EPRINT,
- StandardField.EPRINTCLASS, StandardField.EPRINTTYPE, StandardField.URL, StandardField.URLDATE)
+ StandardField.EPRINTCLASS, StandardField.EPRINTTYPE, StandardField.URL, StandardField.URLDATE, StandardField.LANGUAGEID)
.withDetailFields(StandardField.EDITORA, StandardField.EDITORB, StandardField.EDITORC,
StandardField.TRANSLATOR, StandardField.ANNOTATOR, StandardField.COMMENTATOR, StandardField.INTRODUCTION,
StandardField.FOREWORD, StandardField.AFTERWORD,
@@ -72,7 +72,7 @@ public class BiblatexEntryTypeDefinitions {
StandardField.MAINTITLE, StandardField.MAINSUBTITLE, StandardField.MAINTITLEADDON, StandardField.BOOKSUBTITLE,
StandardField.BOOKTITLEADDON, StandardField.VOLUME, StandardField.EDITION, StandardField.PUBLISHER,
StandardField.ISBN, StandardField.CHAPTER, StandardField.PAGES, StandardField.DOI, StandardField.EPRINT,
- StandardField.EPRINTCLASS, StandardField.EPRINTTYPE, StandardField.URL, StandardField.URLDATE)
+ StandardField.EPRINTCLASS, StandardField.EPRINTTYPE, StandardField.URL, StandardField.URLDATE, StandardField.LANGUAGEID)
.withDetailFields(StandardField.EDITORA, StandardField.EDITORB,
StandardField.EDITORC, StandardField.TRANSLATOR, StandardField.ANNOTATOR, StandardField.COMMENTATOR,
StandardField.INTRODUCTION, StandardField.FOREWORD, StandardField.AFTERWORD,
@@ -101,7 +101,7 @@ public class BiblatexEntryTypeDefinitions {
.withRequiredFields(new OrFields(StandardField.AUTHOR, StandardField.EDITOR), StandardField.TITLE, StandardField.DATE)
.withImportantFields(StandardField.SUBTITLE, StandardField.TITLEADDON, StandardField.HOWPUBLISHED,
StandardField.CHAPTER, StandardField.PAGES, StandardField.DOI, StandardField.EPRINT, StandardField.EPRINTCLASS,
- StandardField.EPRINTTYPE, StandardField.URL, StandardField.URLDATE)
+ StandardField.EPRINTTYPE, StandardField.URL, StandardField.URLDATE, StandardField.LANGUAGEID)
.withDetailFields(StandardField.LANGUAGE,
StandardField.TYPE, StandardField.NOTE, StandardField.LOCATION,
StandardField.PAGETOTAL, StandardField.ADDENDUM, StandardField.PUBSTATE)
diff --git a/src/main/resources/csl-styles b/src/main/resources/csl-styles
index b90b81a58b1..6b7b611908b 160000
--- a/src/main/resources/csl-styles
+++ b/src/main/resources/csl-styles
@@ -1 +1 @@
-Subproject commit b90b81a58b1a260423608f3868a6613cc6efe431
+Subproject commit 6b7b611908b20c91f34110d1c9489fb3278e0ef5
diff --git a/src/main/resources/l10n/JabRef_de.properties b/src/main/resources/l10n/JabRef_de.properties
index 8041c1a4c80..f0733cdf0c4 100644
--- a/src/main/resources/l10n/JabRef_de.properties
+++ b/src/main/resources/l10n/JabRef_de.properties
@@ -2603,9 +2603,7 @@ No\ summary\ can\ be\ generated\ for\ entry\ '%0'.\ Could\ not\ find\ attached\
Rebuild=Neu aufbauen
API\ base\ URL\ setting\ appears\ to\ be\ incorrect.\ Please\ check\ it\ in\ AI\ expert\ settings.=Die API-Basis-URL-Einstellung scheint falsch zu sein. Bitte überprüfen Sie diese in den KI-Experteneinstellungen.
AI-generated\ summary\ of\ attached\ file(s)=KI-generierte Zusammenfassung der angehängten Datei(en)
-As\ soon\ as\ you\ ask\ a\ question,\ the\ text\ content\ of\ all\ PDFs\ attached\ to\ the\ entry\ are\ sent\ to\ external\ service.=Sobald Sie eine Frage stellen, wird der Textinhalt aller an den Eintrag angehängten PDFs an einen externen Dienst gesendet.
Downloading\ embedding\ model...\ Afterward,\ you\ will\ be\ able\ to\ chat\ with\ your\ files.=Embedded-Modell wird heruntergeladen... Danach können Sie mit Ihren Dateien chatten.
-JabRef\ uses\ AI\ providers\ to\ enable\ AI\ functionality\ (chatting\ with\ attached\ file(s)\ and\ summarization).\ AI\ provider\ is\ an\ external\ service.\ To\ enable\ processing\ of\ attached\ file(s),\ their\ contents\ need\ to\ be\ shared\ with\ the\ currently\ selected\ AI\ provider.=JabRef verwendet KI-Provider, um die KI-Funktionalität zu aktivieren (chatten mit angehängten Datei(en) und Zusammenfassung). Um die Verarbeitung der angehängten Datei(en) zu ermöglichen, müssen deren Inhalte mit dem aktuell ausgewählten KI-Anbieter geteilt werden.
Please\ attach\ at\ least\ one\ PDF\ file\ to\ enable\ chatting\ with\ PDF\ file(s).=Bitte fügen Sie mindestens eine PDF-Datei an, um das Chatten mit PDF-Datei(en) zu ermöglichen.
The\ attached\ file(s)\ are\ currently\ being\ processed\ by\ %0.\ Once\ completed,\ you\ will\ be\ able\ to\ see\ the\ summary.=Die angehängte(n) Datei(en) wird/werden derzeit von %0 verarbeitet. Sobald der Vorgang abgeschlossen ist, können Sie die Zusammenfassung sehen.
Waiting\ summary\ for\ %0...=Warte auf Zusammenfassung für %0...
@@ -2651,7 +2649,6 @@ Generating\ embeddings\ for\ %0=Erstelle Einbettungen für %0
RAG\ minimum\ score\ must\ be\ a\ number=RAG Mindestpunktzahl muss numerisch sein
RAG\ minimum\ score\ must\ be\ greater\ than\ 0\ and\ less\ than\ 1=RAG-Mindestpunktzahl muss größer als 0 und kleiner als 1 sein
Temperature\ must\ be\ a\ number=Temperatur muss numerisch sein
-If\ you\ have\ chosen\ %0\ as\ an\ AI\ provider,\ the\ privacy\ policy\ of\ %0\ applies.\ You\ find\ it\ at\ %1.=Wenn Sie %0 als KI-Anbieter gewählt haben, gilt die Datenschutzrichtlinie von %0. Sie finden sie unter %1.
Automatically\ generate\ embeddings\ for\ new\ entries=Einbettungen für neue Einträge automatisch erstellen
Automatically\ generate\ summaries\ for\ new\ entries=Zusammenfassungen für neue Einträge automatisch erstellen
Connection=Verbindung
diff --git a/src/main/resources/l10n/JabRef_en.properties b/src/main/resources/l10n/JabRef_en.properties
index f0842f5bab4..32bc777fcc6 100644
--- a/src/main/resources/l10n/JabRef_en.properties
+++ b/src/main/resources/l10n/JabRef_en.properties
@@ -2603,9 +2603,8 @@ No\ summary\ can\ be\ generated\ for\ entry\ '%0'.\ Could\ not\ find\ attached\
Rebuild=Rebuild
API\ base\ URL\ setting\ appears\ to\ be\ incorrect.\ Please\ check\ it\ in\ AI\ expert\ settings.=API base URL setting appears to be incorrect. Please check it in AI expert settings.
AI-generated\ summary\ of\ attached\ file(s)=AI-generated summary of attached file(s)
-As\ soon\ as\ you\ ask\ a\ question,\ the\ text\ content\ of\ all\ PDFs\ attached\ to\ the\ entry\ are\ sent\ to\ external\ service.=As soon as you ask a question, the text content of all PDFs attached to the entry are sent to external service.
Downloading\ embedding\ model...\ Afterward,\ you\ will\ be\ able\ to\ chat\ with\ your\ files.=Downloading embedding model... Afterward, you will be able to chat with your files.
-JabRef\ uses\ AI\ providers\ to\ enable\ AI\ functionality\ (chatting\ with\ attached\ file(s)\ and\ summarization).\ AI\ provider\ is\ an\ external\ service.\ To\ enable\ processing\ of\ attached\ file(s),\ their\ contents\ need\ to\ be\ shared\ with\ the\ currently\ selected\ AI\ provider.=JabRef uses AI providers to enable AI functionality (chatting with attached file(s) and summarization). AI provider is an external service. To enable processing of attached file(s), their contents need to be shared with the currently selected AI provider.
+JabRef\ uses\ AI\ providers\ to\ enable\ AI\ functionality\ (chatting\ with\ attached\ file(s)\ and\ summarization).\ AI\ provider\ is\ an\ external\ service.\ To\ enable\ processing\ of\ attached\ file(s),\ their\ contents\ need\ to\ be\ shared\ with\ the\ currently\ selected\ AI\ provider.\ As\ soon\ as\ you\ ask\ a\ question,\ the\ text\ content\ of\ all\ PDFs\ attached\ to\ the\ entry\ are\ sent\ to\ external\ service.\ By\ using\ this\ service\ you\ agree\ to\ the\ privacy\ police\ of\ the\ selected\ AI\ provider.=JabRef uses AI providers to enable AI functionality (chatting with attached file(s) and summarization). AI provider is an external service. To enable processing of attached file(s), their contents need to be shared with the currently selected AI provider. As soon as you ask a question, the text content of all PDFs attached to the entry are sent to external service. By using this service you agree to the privacy police of the selected AI provider.
Please\ attach\ at\ least\ one\ PDF\ file\ to\ enable\ chatting\ with\ PDF\ file(s).=Please attach at least one PDF file to enable chatting with PDF file(s).
The\ attached\ file(s)\ are\ currently\ being\ processed\ by\ %0.\ Once\ completed,\ you\ will\ be\ able\ to\ see\ the\ summary.=The attached file(s) are currently being processed by %0. Once completed, you will be able to see the summary.
Waiting\ summary\ for\ %0...=Waiting summary for %0...
@@ -2651,7 +2650,6 @@ Generating\ embeddings\ for\ %0=Generating embeddings for %0
RAG\ minimum\ score\ must\ be\ a\ number=RAG minimum score must be a number
RAG\ minimum\ score\ must\ be\ greater\ than\ 0\ and\ less\ than\ 1=RAG minimum score must be greater than 0 and less than 1
Temperature\ must\ be\ a\ number=Temperature must be a number
-If\ you\ have\ chosen\ %0\ as\ an\ AI\ provider,\ the\ privacy\ policy\ of\ %0\ applies.\ You\ find\ it\ at\ %1.=If you have chosen %0 as an AI provider, the privacy policy of %0 applies. You find it at %1.
Automatically\ generate\ embeddings\ for\ new\ entries=Automatically generate embeddings for new entries
Automatically\ generate\ summaries\ for\ new\ entries=Automatically generate summaries for new entries
Connection=Connection
diff --git a/src/main/resources/l10n/JabRef_fr.properties b/src/main/resources/l10n/JabRef_fr.properties
index 5aa3e510fd9..f7cd4304f07 100644
--- a/src/main/resources/l10n/JabRef_fr.properties
+++ b/src/main/resources/l10n/JabRef_fr.properties
@@ -2603,9 +2603,8 @@ No\ summary\ can\ be\ generated\ for\ entry\ '%0'.\ Could\ not\ find\ attached\
Rebuild=Reconstruire
API\ base\ URL\ setting\ appears\ to\ be\ incorrect.\ Please\ check\ it\ in\ AI\ expert\ settings.=Le paramètre d'URL de base de l'API semble incorrect. Veuillez le vérifier dans les paramètres experts de l'IA.
AI-generated\ summary\ of\ attached\ file(s)=Résumé de(s) fichier(s) joint(s) généré par l'IA
-As\ soon\ as\ you\ ask\ a\ question,\ the\ text\ content\ of\ all\ PDFs\ attached\ to\ the\ entry\ are\ sent\ to\ external\ service.=Dès que vous posez une question, le contenu du texte de tous les PDFs joints à l'entrée est envoyé au service externe.
Downloading\ embedding\ model...\ Afterward,\ you\ will\ be\ able\ to\ chat\ with\ your\ files.=Téléchargement du modèle d'intégration... Après cela, vous pourrez tchatter avec vos fichiers.
-JabRef\ uses\ AI\ providers\ to\ enable\ AI\ functionality\ (chatting\ with\ attached\ file(s)\ and\ summarization).\ AI\ provider\ is\ an\ external\ service.\ To\ enable\ processing\ of\ attached\ file(s),\ their\ contents\ need\ to\ be\ shared\ with\ the\ currently\ selected\ AI\ provider.=JabRef utilise des fournisseurs d'IA pour activer la fonctionnalité d'IA (tchatter avec le(s) fichier(s) attaché(s) et les résumer). Le fournisseur d'IA est un service externe. Pour activer le traitement de(s) fichier(s) attaché(s), leur contenu doit être partagé avec le fournisseur d'IA actuellement sélectionné.
+JabRef\ uses\ AI\ providers\ to\ enable\ AI\ functionality\ (chatting\ with\ attached\ file(s)\ and\ summarization).\ AI\ provider\ is\ an\ external\ service.\ To\ enable\ processing\ of\ attached\ file(s),\ their\ contents\ need\ to\ be\ shared\ with\ the\ currently\ selected\ AI\ provider.\ As\ soon\ as\ you\ ask\ a\ question,\ the\ text\ content\ of\ all\ PDFs\ attached\ to\ the\ entry\ are\ sent\ to\ external\ service.\ By\ using\ this\ service\ you\ agree\ to\ the\ privacy\ police\ of\ the\ selected\ AI\ provider.=JabRef utilise les fournisseurs d'IA pour activer les fonctionnalités de l'IA (tchat avec les fichiers joints et résumé). Pour activer le traitement du ou des fichier(s) attaché(s), leur contenu doit être partagé avec le fournisseur d'IA sélectionné. Dès que vous formulez une question, le contenu du texte de tous les PDFs joints à l'entrée est envoyé au service externe. En utilisant ce service, vous acceptez la politique de confidentialité du fournisseur d’IA.
Please\ attach\ at\ least\ one\ PDF\ file\ to\ enable\ chatting\ with\ PDF\ file(s).=Veuillez joindre au moins un fichier PDF pour permettre de tchatter avec le(s) fichier(s) PDF.
The\ attached\ file(s)\ are\ currently\ being\ processed\ by\ %0.\ Once\ completed,\ you\ will\ be\ able\ to\ see\ the\ summary.=Le(s) fichier(s) joint(s) est/sont actuellement en cours de traitement par %0. Une fois terminé, vous pourrez voir le résumé.
Waiting\ summary\ for\ %0...=Résumé en attente pour %0...
@@ -2651,7 +2650,6 @@ Generating\ embeddings\ for\ %0=Générer des intégrations pour %0
RAG\ minimum\ score\ must\ be\ a\ number=Le score minimum de RAG doit être un nombre
RAG\ minimum\ score\ must\ be\ greater\ than\ 0\ and\ less\ than\ 1=Le score minimum de RAG doit être compris entre 0 et 1
Temperature\ must\ be\ a\ number=La température doit être un nombre
-If\ you\ have\ chosen\ %0\ as\ an\ AI\ provider,\ the\ privacy\ policy\ of\ %0\ applies.\ You\ find\ it\ at\ %1.=Si vous avez choisi %0 comme fournisseur d'IA, la politique de confidentialité de %0 s'applique. Vous la trouverez sur %1.
Automatically\ generate\ embeddings\ for\ new\ entries=Générer automatiquement les intégrations pour les nouvelles entrées
Automatically\ generate\ summaries\ for\ new\ entries=Générer automatiquement des résumés pour les nouvelles entrées
Connection=Connexion
diff --git a/src/main/resources/l10n/JabRef_it.properties b/src/main/resources/l10n/JabRef_it.properties
index 21107c8ac9d..f4008f93703 100644
--- a/src/main/resources/l10n/JabRef_it.properties
+++ b/src/main/resources/l10n/JabRef_it.properties
@@ -2593,6 +2593,7 @@ The\ path\ of\ the\ current\ library\ is\ not\ set,\ but\ it\ is\ required\ for\
Enable\ AI\ functionality\ (summary\ generation\ and\ chatting)\ in\ JabRef=Abilita la funzionalità AI (generazione di riassunti e chat) in JabRef
Customize\ expert\ settings=Personalizza le impostazioni avanzate
These\ parameters\ affect\ how\ the\ AI\ will\ answer\ your\ questions.=Questi parametri influenzano come l'IA risponderà alle tue domande.
+JabRef\ uses\ AI\ providers\ to\ enable\ AI\ functionality\ (chatting\ with\ attached\ file(s)\ and\ summarization).\ AI\ provider\ is\ an\ external\ service.\ To\ enable\ processing\ of\ attached\ file(s),\ their\ contents\ need\ to\ be\ shared\ with\ the\ currently\ selected\ AI\ provider.\ As\ soon\ as\ you\ ask\ a\ question,\ the\ text\ content\ of\ all\ PDFs\ attached\ to\ the\ entry\ are\ sent\ to\ external\ service.\ By\ using\ this\ service\ you\ agree\ to\ the\ privacy\ police\ of\ the\ selected\ AI\ provider.=JabRef utilizza i provider AI per abilitare la funzionalità AI (chattare con file allegati e riepilogazione). Il provider AI è un servizio esterno. Per consentire l'elaborazione di file allegati, il loro contenuto deve essere condiviso con il provider AI attualmente selezionato. Non appena si fa una domanda, il contenuto del testo di tutti i PDF allegati alla voce viene inviato al servizio esterno. Utilizzando questo servizio, accetti la polizia sulla privacy del provider AI selezionato.
Embedding\ model\ has\ to\ be\ provided=Il modello di incorporazione deve essere fornito
After\ the\ file\ will\ be\ ingested,\ you\ will\ be\ able\ to\ chat\ with\ it.=Dopo che il file sarà ingerito, sarai in grado di chattare con esso.
Could\ not\ find\ path\ for\ a\ linked\ file\ '%0'\ while\ generating\ embeddings.=Impossibile trovare il percorso per un file collegato '%0' durante la generazione di incorporazioni.
@@ -2620,7 +2621,6 @@ Generating\ embeddings\ for\ %0=Generazione di incorporamenti per %0
RAG\ minimum\ score\ must\ be\ a\ number=Il punteggio minimo di RAG deve essere un numero
RAG\ minimum\ score\ must\ be\ greater\ than\ 0\ and\ less\ than\ 1=Il punteggio minimo di RAG deve essere maggiore di 0 e minore di 1
Temperature\ must\ be\ a\ number=La temperatura deve essere un numero
-If\ you\ have\ chosen\ %0\ as\ an\ AI\ provider,\ the\ privacy\ policy\ of\ %0\ applies.\ You\ find\ it\ at\ %1.=Se hai scelto %0 come fornitore di Intelligenza Artificiale, si applica la politica sulla privacy di %0. Puoi trovarla su %1.
Automatically\ generate\ embeddings\ for\ new\ entries=Genera automaticamente incorporazioni per nuove voci
Automatically\ generate\ summaries\ for\ new\ entries=Genera automaticamente sommari per le nuove voci
Connection=Connessione
diff --git a/src/main/resources/l10n/JabRef_pl.properties b/src/main/resources/l10n/JabRef_pl.properties
index ec569378375..5b2630625d1 100644
--- a/src/main/resources/l10n/JabRef_pl.properties
+++ b/src/main/resources/l10n/JabRef_pl.properties
@@ -1770,6 +1770,7 @@ Chat\ with\ AI\ about\ content\ of\ attached\ file(s)=Czat z AI na temat zawarto
API\ key=Klucz API
Downloading...=Pobieranie...
No\ summary\ can\ be\ generated\ for\ entry\ '%0'.\ Could\ not\ find\ attached\ linked\ files.=Nie można wygenerować podsumowania dla wpisu '%0'. Nie można znaleźć załączonych plików.
+JabRef\ uses\ AI\ providers\ to\ enable\ AI\ functionality\ (chatting\ with\ attached\ file(s)\ and\ summarization).\ AI\ provider\ is\ an\ external\ service.\ To\ enable\ processing\ of\ attached\ file(s),\ their\ contents\ need\ to\ be\ shared\ with\ the\ currently\ selected\ AI\ provider.\ As\ soon\ as\ you\ ask\ a\ question,\ the\ text\ content\ of\ all\ PDFs\ attached\ to\ the\ entry\ are\ sent\ to\ external\ service.\ By\ using\ this\ service\ you\ agree\ to\ the\ privacy\ police\ of\ the\ selected\ AI\ provider.=JabRef używa dostawców AI, aby włączyć funkcję AI (czatowanie z załączonymi plikami i podsumowywanie plików). Dostawca AI jest usługą zewnętrzną. Aby umożliwić przetwarzanie załączonych plików, ich zawartość musi być udostępniona obecnie wybranemu dostawcy AI. Gdy tylko zadasz pytanie, treść tekstu wszystkich plików PDF dołączonych do wpisu jest wysyłana do zewnętrznej usługi AI. Korzystając z tej usługi, zgadzasz się z polityką prywatności wybranego dostawcy AI.
An\ API\ key\ has\ to\ be\ provided=Klucz API musi być podany
Generated\ at\ %0\ by\ %1=Wygenerowane w %0 przez %1
Retry=Ponów próbę
@@ -1799,7 +1800,6 @@ Generating\ embeddings\ for\ %0=Generowanie osadzeń dla %0
RAG\ minimum\ score\ must\ be\ a\ number=Minimalny wynik RAG musi być liczbą
RAG\ minimum\ score\ must\ be\ greater\ than\ 0\ and\ less\ than\ 1=Minimalny wynik RAG musi być większy niż 0 i mniejszy niż 1
Temperature\ must\ be\ a\ number=Temperatura musi być liczbą
-If\ you\ have\ chosen\ %0\ as\ an\ AI\ provider,\ the\ privacy\ policy\ of\ %0\ applies.\ You\ find\ it\ at\ %1.=Jeśli wybrałeś %0 jako dostawcę AI, zastosowanie ma polityka prywatności %0. Znajdziesz ją pod adresem %1.
Automatically\ generate\ embeddings\ for\ new\ entries=Automatycznie generuj osadzenia dla nowych wpisów
Automatically\ generate\ summaries\ for\ new\ entries=Automatycznie generuj podsumowania dla nowych wpisów
Connection=Połączenie
diff --git a/src/main/resources/l10n/JabRef_pt_BR.properties b/src/main/resources/l10n/JabRef_pt_BR.properties
index 42f2473b5af..8cd709d5038 100644
--- a/src/main/resources/l10n/JabRef_pt_BR.properties
+++ b/src/main/resources/l10n/JabRef_pt_BR.properties
@@ -2600,9 +2600,8 @@ No\ summary\ can\ be\ generated\ for\ entry\ '%0'.\ Could\ not\ find\ attached\
Rebuild=Reconstruir
API\ base\ URL\ setting\ appears\ to\ be\ incorrect.\ Please\ check\ it\ in\ AI\ expert\ settings.=A configuração de URL base da API parece estar incorreta. Verifique nas configurações de IA especialista.
AI-generated\ summary\ of\ attached\ file(s)=Resumo gerado pela IA do(s) arquivo(s) anexo(s)
-As\ soon\ as\ you\ ask\ a\ question,\ the\ text\ content\ of\ all\ PDFs\ attached\ to\ the\ entry\ are\ sent\ to\ external\ service.=Assim que você fizer uma pergunta, o conteúdo de todos os PDFs anexados à entrada é enviado para o serviço externo.
Downloading\ embedding\ model...\ Afterward,\ you\ will\ be\ able\ to\ chat\ with\ your\ files.=Baixando modelo de incorporação... Depois, você será capaz de conversar com seus arquivos.
-JabRef\ uses\ AI\ providers\ to\ enable\ AI\ functionality\ (chatting\ with\ attached\ file(s)\ and\ summarization).\ AI\ provider\ is\ an\ external\ service.\ To\ enable\ processing\ of\ attached\ file(s),\ their\ contents\ need\ to\ be\ shared\ with\ the\ currently\ selected\ AI\ provider.=O JabRef usa provedores de IA para permitir a funcionalidade de IA (chat com o(s) arquivo(s) anexado(s) e resumo). O provedor de IA é um serviço externo. Para habilitar o processamento de o(s) arquivo(s) anexado(s), seu conteúdo precisa ser compartilhado com o provedor de IA atualmente selecionado.
+JabRef\ uses\ AI\ providers\ to\ enable\ AI\ functionality\ (chatting\ with\ attached\ file(s)\ and\ summarization).\ AI\ provider\ is\ an\ external\ service.\ To\ enable\ processing\ of\ attached\ file(s),\ their\ contents\ need\ to\ be\ shared\ with\ the\ currently\ selected\ AI\ provider.\ As\ soon\ as\ you\ ask\ a\ question,\ the\ text\ content\ of\ all\ PDFs\ attached\ to\ the\ entry\ are\ sent\ to\ external\ service.\ By\ using\ this\ service\ you\ agree\ to\ the\ privacy\ police\ of\ the\ selected\ AI\ provider.=O JabRef usa provedores de IA para permitir a funcionalidade de IA (chat com o(s) arquivo(s) anexado(s) e resumo). O provedor de IA é um serviço externo. Para habilitar o processamento de o(s) arquivo(s) anexado(s), seu conteúdo precisa ser compartilhado com o provedor AI atualmente selecionado. Assim que você fizer uma pergunta, o conteúdo de todos os PDFs anexados à entrada é enviado para o serviço externo. Ao utilizar este serviço, você concorda com a polícia de privacidade do provedor I. A.
Please\ attach\ at\ least\ one\ PDF\ file\ to\ enable\ chatting\ with\ PDF\ file(s).=Por favor, anexe pelo menos um arquivo PDF para habilitar a conversa com PDF(s).
The\ attached\ file(s)\ are\ currently\ being\ processed\ by\ %0.\ Once\ completed,\ you\ will\ be\ able\ to\ see\ the\ summary.=O(s) arquivo(s) anexado(s) está(ão) sendo processado por %0. Uma vez concluído, você será capaz de ver o resumo.
Waiting\ summary\ for\ %0...=Aguardando resumo de %0...
@@ -2648,7 +2647,6 @@ Generating\ embeddings\ for\ %0=Gerando incorporações para %0
RAG\ minimum\ score\ must\ be\ a\ number=A pontuação mínima de RAG deve ser um número
RAG\ minimum\ score\ must\ be\ greater\ than\ 0\ and\ less\ than\ 1=Pontuação mínima de RAG deve ser maior que 0 e menor que 1
Temperature\ must\ be\ a\ number=A temperatura deve ser um número
-If\ you\ have\ chosen\ %0\ as\ an\ AI\ provider,\ the\ privacy\ policy\ of\ %0\ applies.\ You\ find\ it\ at\ %1.=Se você escolheu %0 como fornecedor de IA, a política de privacidade de %0 se aplica. Você encontra-o na %1.
Automatically\ generate\ embeddings\ for\ new\ entries=Gerar automaticamente incorporações para novas entradas
Automatically\ generate\ summaries\ for\ new\ entries=Gerar automaticamente resumos para novas entradas
Connection=Conexão
diff --git a/src/test/java/org/jabref/gui/externalfiles/UnlinkedFilesDialogViewModelTest.java b/src/test/java/org/jabref/gui/externalfiles/UnlinkedFilesDialogViewModelTest.java
new file mode 100644
index 00000000000..deb3c32e43e
--- /dev/null
+++ b/src/test/java/org/jabref/gui/externalfiles/UnlinkedFilesDialogViewModelTest.java
@@ -0,0 +1,116 @@
+package org.jabref.gui.externalfiles;
+
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+import javafx.beans.property.SimpleListProperty;
+import javafx.collections.FXCollections;
+import javafx.scene.control.TreeItem;
+
+import org.jabref.gui.StateManager;
+import org.jabref.gui.preferences.GuiPreferences;
+import org.jabref.gui.util.FileNodeViewModel;
+import org.jabref.logic.FilePreferences;
+import org.jabref.logic.util.TaskExecutor;
+import org.jabref.model.database.BibDatabaseContext;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.io.TempDir;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+public class UnlinkedFilesDialogViewModelTest {
+ @TempDir
+ Path tempDir;
+ @TempDir
+ Path subDir;
+ @TempDir
+ Path file1;
+ @TempDir
+ Path file2;
+ @Mock
+ private TaskExecutor taskExecutor;
+ @Mock
+ private GuiPreferences guiPreferences;
+ @Mock
+ private StateManager stateManager;
+ @Mock
+ private BibDatabaseContext bibDatabaseContext;
+
+
+ private UnlinkedFilesDialogViewModel viewModel;
+ @BeforeEach
+ public void setUp() throws Exception {
+ MockitoAnnotations.openMocks(this);
+
+ // Mock a base directory
+ FilePreferences filePreferences = mock(FilePreferences.class);
+ when(guiPreferences.getFilePreferences()).thenReturn(filePreferences);
+ when(filePreferences.getWorkingDirectory()).thenReturn(Paths.get("C:/test/base"));
+
+ // Mock the state manager to provide an active database
+ when(stateManager.getActiveDatabase()).thenReturn(Optional.of(bibDatabaseContext));
+
+ viewModel = new UnlinkedFilesDialogViewModel(
+ null,
+ null,
+ null,
+ guiPreferences,
+ stateManager,
+ taskExecutor
+ );
+ }
+
+ @Test
+ public void startImportWithValidFilesTest() throws Exception {
+ // Create temporary test files
+ tempDir = Files.createTempDirectory("testDir");
+ subDir = tempDir.resolve("subdir");
+ Files.createDirectories(subDir);
+
+ // Create test files: one in the main directory and one in the subdirectory
+ file1 = Files.createTempFile(tempDir, "file1", ".pdf");
+ file2 = Files.createTempFile(subDir, "file2", ".txt");
+
+ // Mock file nodes with the absolute paths of the temporary files
+ FileNodeViewModel fileNode1 = mock(FileNodeViewModel.class);
+ FileNodeViewModel fileNode2 = mock(FileNodeViewModel.class);
+
+ when(fileNode1.getPath()).thenReturn(file1);
+ when(fileNode2.getPath()).thenReturn(file2);
+
+ // Create TreeItem for each FileNodeViewModel
+ TreeItem treeItem1 = new TreeItem<>(fileNode1);
+ TreeItem treeItem2 = new TreeItem<>(fileNode2);
+
+ SimpleListProperty> checkedFileListProperty =
+ new SimpleListProperty<>(FXCollections.observableArrayList(treeItem1, treeItem2));
+
+ assertEquals(2, checkedFileListProperty.get().size());
+ assertEquals(file1, checkedFileListProperty.get().getFirst().getValue().getPath());
+ assertEquals(file2, checkedFileListProperty.get().getLast().getValue().getPath());
+
+ Path directory = tempDir; // Base directory for relativization
+
+ // Create list of relative paths
+ List fileList = checkedFileListProperty.stream()
+ .map(item -> item.getValue().getPath())
+ .filter(path -> path.toFile().isFile())
+ .map(path -> directory.relativize(path))
+ .collect(Collectors.toList());
+ assertEquals(
+ List.of(directory.relativize(file1), directory.relativize(file2)),
+ fileList,
+ "fileList should contain exactly the relative paths of file1.pdf and file2.txt"
+ );
+ }
+}
diff --git a/src/test/java/org/jabref/gui/fieldeditors/optioneditors/LanguageEditorViewModelTest.java b/src/test/java/org/jabref/gui/fieldeditors/optioneditors/LanguageEditorViewModelTest.java
new file mode 100644
index 00000000000..ec78198e2b5
--- /dev/null
+++ b/src/test/java/org/jabref/gui/fieldeditors/optioneditors/LanguageEditorViewModelTest.java
@@ -0,0 +1,88 @@
+package org.jabref.gui.fieldeditors.optioneditors;
+
+import java.util.Collection;
+import java.util.EnumSet;
+import java.util.HashSet;
+
+import javax.swing.undo.UndoManager;
+
+import org.jabref.gui.autocompleter.SuggestionProvider;
+import org.jabref.logic.FilePreferences;
+import org.jabref.logic.integrity.FieldCheckers;
+import org.jabref.logic.journals.JournalAbbreviationRepository;
+import org.jabref.model.database.BibDatabaseContext;
+import org.jabref.model.database.BibDatabaseMode;
+import org.jabref.model.entry.Langid;
+import org.jabref.model.entry.field.StandardField;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.mockito.Mockito.mock;
+
+public class LanguageEditorViewModelTest {
+
+ private LanguageEditorViewModel languageEditorViewModel;
+
+ @BeforeEach
+ void setUp() {
+ BibDatabaseContext databaseContext = mock(BibDatabaseContext.class);
+ FilePreferences filePreferences = mock(FilePreferences.class);
+ JournalAbbreviationRepository abbreviationRepository = mock(JournalAbbreviationRepository.class);
+ FieldCheckers fieldCheckers = new FieldCheckers(databaseContext, filePreferences, abbreviationRepository, false);
+ SuggestionProvider> suggestionProvider = mock(SuggestionProvider.class);
+
+ languageEditorViewModel = new LanguageEditorViewModel(
+ StandardField.LANGUAGEID,
+ suggestionProvider,
+ BibDatabaseMode.BIBLATEX,
+ fieldCheckers,
+ new UndoManager()
+ );
+ }
+
+ @Test
+ void getItemsShouldReturnAllLangidValues() {
+ Collection items = new HashSet<>(languageEditorViewModel.getItems());
+ assertEquals(EnumSet.allOf(Langid.class), items);
+ }
+
+ @Test
+ void stringConversion() {
+ String langidString = "bulgarian";
+ Langid langid = languageEditorViewModel.getStringConverter().fromString(langidString);
+ assertEquals(Langid.BULGARIAN, langid, "String should convert to the corresponding Langid");
+
+ String convertedString = languageEditorViewModel.getStringConverter().toString(Langid.BULGARIAN);
+ assertEquals(langidString, convertedString, "Langid should convert back to its string representation");
+ }
+
+ @Test
+ void stringConversionWithHumanReadableName() {
+ // Test conversion from human-readable name to Langid
+ String langidString = "Basque";
+ Langid langid = languageEditorViewModel.getStringConverter().fromString(langidString);
+ assertEquals(Langid.BASQUE, langid, "Human-readable name should convert to the corresponding Langid");
+
+ // Test conversion from Langid to human-readable name
+ String convertedString = languageEditorViewModel.getStringConverter().toString(Langid.BASQUE);
+ assertEquals("basque", convertedString, "Langid should convert back to its lowercase string representation");
+ }
+
+ @Test
+ void handlingNullValue() {
+ // Test the handling of a null value
+ Langid result = languageEditorViewModel.getStringConverter().fromString(null);
+ assertNull(result, "Null input should return null Langid");
+ }
+
+ @Test
+ void handlingBlankValue() {
+ // Test the handling of a blank string
+ Langid result = languageEditorViewModel.getStringConverter().fromString(" ");
+ assertNull(result, "Blank input should return null Langid");
+ }
+}
+
diff --git a/src/test/java/org/jabref/model/entry/BibEntryTypesManagerTest.java b/src/test/java/org/jabref/model/entry/BibEntryTypesManagerTest.java
index d9fb4eb1a9c..2c6f252f351 100644
--- a/src/test/java/org/jabref/model/entry/BibEntryTypesManagerTest.java
+++ b/src/test/java/org/jabref/model/entry/BibEntryTypesManagerTest.java
@@ -13,7 +13,6 @@
import org.jabref.model.entry.field.BibField;
import org.jabref.model.entry.field.FieldPriority;
import org.jabref.model.entry.field.StandardField;
-import org.jabref.model.entry.field.UnknownField;
import org.jabref.model.entry.types.BiblatexAPAEntryTypeDefinitions;
import org.jabref.model.entry.types.BiblatexEntryTypeDefinitions;
import org.jabref.model.entry.types.BiblatexSoftwareEntryTypeDefinitions;
@@ -176,7 +175,7 @@ void modifyingArticle(BibDatabaseMode mode) {
StandardEntryType.Article,
List.of(new BibField(StandardField.TITLE, FieldPriority.IMPORTANT),
new BibField(StandardField.NUMBER, FieldPriority.IMPORTANT),
- new BibField(new UnknownField("langid"), FieldPriority.IMPORTANT),
+ new BibField(StandardField.LANGUAGEID, FieldPriority.IMPORTANT),
new BibField(StandardField.COMMENT, FieldPriority.IMPORTANT)),
Collections.emptySet());
@@ -191,7 +190,7 @@ void modifyingArticleWithParsing(BibDatabaseMode mode) {
StandardEntryType.Article,
List.of(new BibField(StandardField.TITLE, FieldPriority.IMPORTANT),
new BibField(StandardField.NUMBER, FieldPriority.IMPORTANT),
- new BibField(new UnknownField("langid"), FieldPriority.IMPORTANT),
+ new BibField(StandardField.LANGUAGEID, FieldPriority.IMPORTANT),
new BibField(StandardField.COMMENT, FieldPriority.IMPORTANT)),
Collections.emptySet());
@@ -209,7 +208,7 @@ void modifyingArticleWithParsingKeepsListOrder(BibDatabaseMode mode) {
StandardEntryType.Article,
List.of(new BibField(StandardField.TITLE, FieldPriority.IMPORTANT),
new BibField(StandardField.NUMBER, FieldPriority.IMPORTANT),
- new BibField(new UnknownField("langid"), FieldPriority.IMPORTANT),
+ new BibField(StandardField.LANGUAGEID, FieldPriority.IMPORTANT),
new BibField(StandardField.COMMENT, FieldPriority.IMPORTANT)),
Collections.emptySet());
diff --git a/src/test/java/org/jabref/model/entry/LangidTest.java b/src/test/java/org/jabref/model/entry/LangidTest.java
new file mode 100644
index 00000000000..a89f1e78947
--- /dev/null
+++ b/src/test/java/org/jabref/model/entry/LangidTest.java
@@ -0,0 +1,80 @@
+package org.jabref.model.entry;
+
+import java.util.Optional;
+import java.util.stream.Stream;
+
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.Arguments;
+import org.junit.jupiter.params.provider.MethodSource;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.params.provider.Arguments.arguments;
+
+class LangidTest {
+
+ @ParameterizedTest
+ @MethodSource({"parseLangidTest", "getByLangidTest", "invalidLangidTest"})
+ void parseCorrectly(Optional expectedLangid, String input) {
+ Optional parsedLangid = Langid.parse(input);
+
+ if (expectedLangid.isPresent()) {
+ // If the expected langid is present, check that the parsed Langid is present and matches the expected value
+ assertTrue(parsedLangid.isPresent(), "Langid should be present for input: " + input);
+ assertEquals(expectedLangid.get(), parsedLangid.get().getLangid(), "Langid value mismatch for input: " + input);
+ } else {
+ // If the expected langid is empty, check that the parsed Langid is empty as well
+ assertFalse(parsedLangid.isPresent(), "Langid should not be present for input: " + input);
+ }
+ }
+
+ private static Stream parseLangidTest() {
+ return Stream.of(
+ arguments(Optional.of("basque"), "basque"),
+ arguments(Optional.of("bulgarian"), "bulgarian"),
+ arguments(Optional.of("american"), "american"), // USENGLISH and AMERICAN have the same langid
+ arguments(Optional.of("british"), "british"), // UKENGLISH and BRITISH have the same langid
+ arguments(Optional.of("hungarian"), "hungarian") // MAGYAR and HUNGARIAN have the same langid
+ );
+ }
+
+ private static Stream getByLangidTest() {
+ return Stream.of(
+ arguments(Optional.of("basque"), "Basque"), // Testing the name-based constructor
+ arguments(Optional.of("bulgarian"), "Bulgarian"),
+ arguments(Optional.of("american"), "american"), // Case-insensitive check for langid
+ arguments(Optional.of("british"), "british"),
+ arguments(Optional.of("hungarian"), "hungarian")
+ );
+ }
+
+ private static Stream invalidLangidTest() {
+ return Stream.of(
+ arguments(Optional.empty(), "invalidlangid"), // Invalid langid should return empty
+ arguments(Optional.empty(), "12345"), // Non-langid input should return empty
+ arguments(Optional.empty(), "") // Empty string should return empty
+ );
+ }
+
+ @ParameterizedTest
+ @MethodSource("getLangidByStringTest")
+ void getLangidByStringTest(Optional expectedLangid, String input) {
+ Optional parsedLangid = Langid.getByLangid(input);
+
+ if (expectedLangid.isPresent()) {
+ assertTrue(parsedLangid.isPresent(), "Langid should be present for input: " + input);
+ assertEquals(expectedLangid.get(), parsedLangid.get().getLangid(), "Langid value mismatch for input: " + input);
+ } else {
+ assertFalse(parsedLangid.isPresent(), "Langid should not be present for input: " + input);
+ }
+ }
+
+ private static Stream getLangidByStringTest() {
+ return Stream.of(
+ arguments(Optional.of("basque"), "basque"),
+ arguments(Optional.of("bulgarian"), "bulgarian"),
+ arguments(Optional.empty(), "unknown")
+ );
+ }
+}