From eee93f3996e9af1223a312edef8f1ff502e8e7d8 Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Thu, 26 Oct 2023 16:27:25 +0200 Subject: [PATCH 1/3] Switch to plantir-java-format --- build.gradle | 15 +- config/IntelliJ Code Style.xml | 296 ------------------ ...es-intellij-codestyle-import-as-jabref.png | Bin 5742 -> 0 bytes ...ellij-codestyle-import-select-xml-file.png | Bin 19148 -> 0 bytes .../guidelines-intellij-codestyle-import.png | Bin 52736 -> 0 bytes ...es-intellij-editor-javadoc-do-not-wrap.png | Bin 101894 -> 0 bytes ...delines-intellij-plantir-plugin-enable.png | Bin 0 -> 41236 bytes ...elines-intellij-plantir-plugin-restart.png | Bin 0 -> 54802 bytes .../guidelines-intellij-plantir-plugin.png | Bin 0 -> 46697 bytes .../intellij-13-code-style.md | 54 +--- 10 files changed, 23 insertions(+), 342 deletions(-) delete mode 100644 config/IntelliJ Code Style.xml delete mode 100644 docs/getting-into-the-code/guidelines-for-setting-up-a-local-workspace/guidelines-intellij-codestyle-import-as-jabref.png delete mode 100644 docs/getting-into-the-code/guidelines-for-setting-up-a-local-workspace/guidelines-intellij-codestyle-import-select-xml-file.png delete mode 100644 docs/getting-into-the-code/guidelines-for-setting-up-a-local-workspace/guidelines-intellij-codestyle-import.png delete mode 100644 docs/getting-into-the-code/guidelines-for-setting-up-a-local-workspace/guidelines-intellij-editor-javadoc-do-not-wrap.png create mode 100644 docs/getting-into-the-code/guidelines-for-setting-up-a-local-workspace/guidelines-intellij-plantir-plugin-enable.png create mode 100644 docs/getting-into-the-code/guidelines-for-setting-up-a-local-workspace/guidelines-intellij-plantir-plugin-restart.png create mode 100644 docs/getting-into-the-code/guidelines-for-setting-up-a-local-workspace/guidelines-intellij-plantir-plugin.png diff --git a/build.gradle b/build.gradle index c72f3c74bd0..5a7f1229a28 100644 --- a/build.gradle +++ b/build.gradle @@ -2,6 +2,16 @@ import org.gradle.internal.os.OperatingSystem import org.jabref.build.xjc.XjcPlugin import org.jabref.build.xjc.XjcTask +buildscript { + repositories { + gradlePluginPortal() + mavenCentral() + } + dependencies { + classpath 'com.palantir.javaformat:gradle-palantir-java-format:2.38.0' + } +} + plugins { id 'application' @@ -22,17 +32,18 @@ plugins { id 'jacoco' id 'checkstyle' + id 'org.openrewrite.rewrite' version '6.4.0' id 'project-report' id 'idea' - - id 'org.openrewrite.rewrite' version '6.4.0' } // Enable following for debugging // gradle.startParameter.showStacktrace = org.gradle.api.logging.configuration.ShowStacktrace. +apply plugin: 'com.palantir.java-format' + apply plugin: XjcPlugin apply from: 'eclipse.gradle' diff --git a/config/IntelliJ Code Style.xml b/config/IntelliJ Code Style.xml deleted file mode 100644 index 6a03e104d9d..00000000000 --- a/config/IntelliJ Code Style.xml +++ /dev/null @@ -1,296 +0,0 @@ - - \ No newline at end of file diff --git a/docs/getting-into-the-code/guidelines-for-setting-up-a-local-workspace/guidelines-intellij-codestyle-import-as-jabref.png b/docs/getting-into-the-code/guidelines-for-setting-up-a-local-workspace/guidelines-intellij-codestyle-import-as-jabref.png deleted file mode 100644 index 59ce0514d7fef3f02ec00ada0367b51f3aabb120..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5742 zcma)A2T)YYwmsyL9F!a->jjjYBq%v2L9*mLLq-^~h=7u#5(UYUa~hB!l0_KukdZJ9 zNY29_-~ad5tylHyzf;wx>-6s3XZNnPdavqe9W7-NLV7{~07z6-6!b9tF{X`zurcq* zFU{7N?vA^Pu@?Z4_Wo&DsSimRFoP7{iZ8tNA@<&WR-Sf%KG@0K%FEl%oMsdO0Mt0D z3i1Z8vQP-9fxZ!p;P;XiKr$uwl(L95JoW9%dPBbFUH9Xr)XHCcX^_;}v=Epg^|{Pw z*!{RuaWX5i2={f}e$n6yA9rr3m@*o74q7cRlu}Gc0v@o=NrUe2=yuiZvvAAjBqk6H z{5mt{C*i)zs*6Wvjx27j?>2QFO}LMTVD6bC z_G-L^20V8U)dd9w>FKLWl}PDwuWcPwRIWBYv9YZs=kA``quQc`oPK`RFV@ohAh@yE z0Yxlw#uq$u5TMhmKg`6QHY?lm?i{2WD(VM-!ZHLCD*KO7^@rPny8&`4#;0$gh=JEDN!W(1GntSGeJbvf zbF!%^e!e3TAdZ`1m&8v+1$28>sGeS1R|j|YQBxZn$rNKM4J(XB6vU~j>yYbRBg)ol zFNl)XfxM9`SA>UKCieBy<;;~YxOi-U4#vv#CPLtjb5xvjyDBp&r|tLaKGm`(L!B_! zS!4N{2W}<-gOF?LFZXmb%pO6q7HYFmcmR+`d#h&H-?nxobdgtYjyf$DU&L~8b#=Wc z2tDuprUait1g%^+$lk8DiMpL)l5v{v{#s;dOydJFK;TIxk>Oe`w(ypW1wV9Q!OYTf ziGp3}i+NjPWhMA)I3B4Xwp?0DiAAU9$%xgMKqlD*D2btlRS!9`?n_9ypm9-=?DRl_s!yh2U09zNz8Vxg~qsoHl+A zJ_Nf&O)4DD!P%*Qo{bbWVC%@2WttotudmNZ&pZ)7R1T9UK6z&1ycSEjyeEmpT2cBy zs0QIqJ2rrQM&k^~RjnHBM}#`YSBC6IVWLE$jH?6ML`9W~Mz0KTD$vjNr~CB?5>(|y zZPBY903i3gkF3&{pj=#bAvQMl()pQUpAYZ@c|uf6b2KD-W1IT=%2O7W8^n4>eyq~; zx!=QpEnU(|3L6z|UR+=q_k1o{?4~=Rl z^9^e1ZL!QcTrYpX4~MPHRPQB=-T^~4YQ=taCb<>J?YB_%4_z*NN47FPDJft1wtwl5 zJ+CR~T%eAioMiuvZ$;ogG)oz=8~Kk@?a@M%F)g_FFJdukYKu?DW*wUm_3vH|#b&(u zKPE*oJSOV-kIfP*%xZC@*&ViX_LW`P{Rkz2@-`bd0W2B?&y7?F!g1E9zY6JyK!4rp7 z4UFEGUEc|wKq=YYHs_Cx+`0uZ+qxH%y{|tYSC(IC8Y04~o>e04k`c2`L-rs>2$V)& zZEmc;%+e;7=-TkYGhykU*~Vd~@T3S_rn06!ZK0_9XFmS1RnKn4tV_w{H3s<-l3O$u zDfp{|5s&&XnS`Ab=pbLAiE#JB=tOI5BgN40#yvos?BX6seUn$WHJwp|ffirZcx#{B{sP-M0+TBy2} z9Q4Vc<(2O683sq;jOzB60Bv!!D6dwC1*g0L_rH;yMY|1CxM zZM%2}s?C6+$gu&lh$++L9SHEL_teb@P_m z>>YU7+|j*@sz=j-SqdQnuo5T!!cMv@7?NEAFq^5pc0^uifOr@DIks86xU(#Lyy5iz zqxlzYT*luDwi(O~TzcFtGK%#0ZMNp|+XD=P}3x z0ZF7&b)(KpsM(CVz;~>v|AD^0CCDES=2vHJeF-IBpP1uK;>4&AW;O7Rk%$2)Yb1Le z8m}CqsG1@Xl>g1=e_KIf#bCMmLx^^~lSst}(fvA~esjS$EQRCSkhpOOB2aBQcxRe) zF<)5nW@M5F=_JVoaPStJx`vi&yFfvI(Rl~t+ zkp(8&>X9qEX(Pqn5#Kb-QzZE+UqN&UyzVO(7n3$Buq2PfEKc(A8m5MGsEp6f<9B?; zK$U;9>|x5EI`~jt9t7MCX>wL(TS@s}&Z}zLEYwfu#&Q61>SWhT77cc#!Uvr~t9B7v zA#;ZpPC@1OB6}4K(|X1;K6+B4Q7;J%n6j8 z`f{c&z?^O6?!c_^5x1ilqsOU5%qhC=`y8B^+bDYyJJfra>USRji}StcBSF3XQn4eV zetVci+AZ<5DM^G5eRd9oaqUUZm=9)$*o4hPrMXo1bTkwCy;O(z zFtP-aV&~A&;Vt>eAic@sS(s1&`&h?800-@;8={;YH)bpcdVj4GeToZDPcsywc|3_* z$R8jC0@O$YbtZkaY<(6l9*5*4y=cEUuB@o_r=xq9Q~h3fde@`f_xqZ-6`>6c9i<3u z=NMu>;%%h(f&H6B?;M5`!M{t>|3G&yDj>Y$CM~w0CCwQTz`dKs`Y(C@H=F(x zvVQ~qAN4MMb_ivW?F2kR!n&sVJKtUxA{@@{$cpU!wz|(CjEL@;u`w)GT{+?NA zfK!>EXqe9V5`AT2vl;3`RbvVjx<8TPw@V9=Z^Yvh1J}sR0xb6A zRp+rlpZo<%@vu^$XL`Px4h&+X<$?uo)5{^Hn_TTOEpM%fwLb{mt$a2UI+tu|NPL-` z6cXfYx(M%DaVqr)i_kIg$9z2pVJ1y_xA|F8N%+QAZT>F(<4;TEb!ILYc0!{y|0Jh{IgOk~MWt^Wb%9l?pNe(8 zC}mc-VAE>xByQXtN6xKcAnvDi&Gzz?K35zu^~Zt$sgcaIVgj^tW*nht!wD7cx$^yXuUs{}qP9 z3+pMi9lcW`-f{CHUDg&cXOsCn0WXs~8n5?QedQ!9x-PkgPsqv>t4Aq9A4o1WWb7IP zGg467Lmw*X^AXdc9rI9njiTyNB&^-txc}cQ4L%Zr;CcEZEBUinthy~dby(plt5mp13IX7&3d{rKB#siR8ZOj zY)uRNfk39N+;@SiG5p~g*Bx|dttqs=L(PjRVRQ8G0U4p-)ar)cWKhn$=kyd@6}#8` zVl`#HETaA0X5-+@f=xE9Lw`# z^A0}??&ckcicAZ`Q}pYY^vO=`ha*jSm^ci2{h>vf6xhqt@#iN;_sE)y`C1*C=O#oB zu`y&hCb|1yH7Ydf`uaLBC_41bd;K_3VbPBa^bs-Qm9WUg8h9`f==-{7NJwI6^q82k zQ&5L-)r7}nT*C};Q@n6E`PO{@*mQrtjy|;C_1EsD<$*Ld*7ie6RgN3pFe$&iOBHr{ z$hC7py9WOmO*9xGDkdV*Qjt`-wzhVZ(5b?e?$Xd&S=IL|H0fL&$cwLvuPJIo`*t*O zGXUaoQ%jX%Q>2~AnuE37Vw8{HO(-{H)M3FJ#7tqQ- zYAd?LrT|Rg)XTGy3yTUSxmwuRB%_RV=WT=*Sji7>1%KE#dEdH!A&7E)DZBu}*KOq?d0-~nu?=M_d22Q z0eiLAl)r}Gr(?hq`EI`P=Chy04R36qC^W^Y-^iid932wA(#ViImv7^5X~A}!m;vWy zH&Tm9zn^QH*lidFJwKJB6Jg5L;q1Fm{KAnKwdYOkDaN63(*DJEr_Wn;N~Cq>U3@0fzG zq!}qbvwq$xgI&}de*73fIWEB8eM{gnUy(&ir5trCTh@aQdH2Tk_saqJ5$6bjpXKoc zQ4uj0AU8xB;$1!Yv#r_jJ_*Xq@;*)rIm?TMr7kQuKLW!0$5q`TU}9KgO+3zG}m#n2%=il7s?)1Zn=3=F{Y7 z!k&jN+OcsmemZ!y5fVZKmKOmiU-WA&p4dR&sk~YyWTPP!y@Z6GzLPy+ z_kkY_NUUqDP`#UIOT{&e=*fDlv*yMG27qV=e@SNioM`eSYgKNhQw zp5f_a2`e2y%=}kN06GheE;ivx4dpoO>+C&Z;C<-T&-TKq8P(G?QS;i?z3(T{owRfP z0Mq%^hXHf%%GN02W7CPVMAXJ|RSxJcYimD#(ACWYKMDUVfAB$D9z5Di#6y{3@O$?HZEHW1`8W`ZezCIt8?U0P2uS|h^ z!}v>O>QGU_&|fYEnFJ|?SAHr&4#sIeYI|I~5Z4*0ZGSvq0Um8qnM~Is{X*b~)9(R;X=L;LJ~>$t zAFX^&OX3$q0xY<>5~f7mTwMtL2qwbq?aU3yQwVITxr1?d7Sz#_tFpehF6^aAJI(IzFBsX4W@HNOGM4BODr#PX8a49i`gSU5!j!CniT71J&#Ie zXSQmcPA=QeJ5e++2BHwl)^0^;eYzYE?iO5Zpzh@26xioOvL2TxziiGXJ3_HNTHp`6 zIK`y}8+{Et6DMvWvVuXWBj+0)Ej zf8V|H-ZwM-!J%c-ea^1hRjbyj-2tCuL{SjmAc8<36mc=IJO~7n2mG!fzyi;(V2&gM ze_mROsX;)XSDjD4FwwNH@PQ}MZG=^A6f6vE?7vv+gA~k-EWbc(^fhsY7eOErkT_UC z(IM$z(a}axshRz5xg?7OQ;6mR$?1}A%4xnYr zF=ue^e(fD-6(49`@=8hD&(Fn*roGIprkD8T-S^rXIg93HFB+2)6}Fg|Qa5CYPbOPl zA)+9wAR_7Xo-US_({_02c7ob%_I6+4wuhwxiVpHf@%?lQ*Gk)A&2Aa8Auu2Wcx^-5#2VyNs}cXZsb;q4AQCL5 z33$-#3FGmsDVqS=GXVr7B+Qz|<94Lt;_WpU{!bfUM+n*Nil7%(dOcfTM-Cum4?L}R zSL%F8x)pD#~Q+N9MSp$WqlA7B224L?zog&dbM-*3Zv}wxivTx`WJrd&f|F z)ObCh*Pvl~<{MG#)J+%X1-jg0CebziRd*;M?Ze~m&4In?Qua3?r&~h}5U7l{F+)Dn z27@N^QU67I2}h?%#WXbA1P}8?OKg&zy>q@dv(_&LjT$z|4*zY5HqvTSBMd!pMvGon z0yk%OwUOxD;+rl+9&)laONVh@48M-GvcwB?^l&!lWTOqeUQWg`cMY13rLl<#_Fwad$>JfXJac-uPH&rrd6F?qTlk_n=&8#itShJrqS;}s&A{6@#V7mfU-NcM1xP( zekaS-u#}Nrqej_crou6ohvp=^2)eopcRF^SRQ5B*U#{;#JK84H5@*-$U{O$}CkHM6 z{rh0<8q zU^rfQcy4_-Mh~BKO7-Umg_znuIEq;&4p}DdZ70Gwd&J8QrIcd(`{PtnJ5|k^=6oI& z42VCq(Ym;B$-fBn+%te`ac(KujGyoFRuSp^IN_Qg{9xUgCzsioT4U;_dB<3Ju**2Y zsnMh1Hx0dY+0YIffh4y#qt;1sNI$6K$GiHj9tcKy#a|pMmyW16Fjtt&31sQ$n=>{w zwd{9>k|(&_#smtf^D)rVvNLF|4s3|@O$+0hOy9EzG2tU8HM#VZg-XEqqSf@FXnkvO zYogTPY+UJuep&7K&E5>XD;Tn4tSsJZ@b-2X8BWH%#lTp*UD(lUrsH`GD;l}GDPed` z4MLz9dDT;L@VNPU@uS)7-OWI0$m0|A(+*Z+l zd)ZSX*@u~pk;>0s=JjjcbAJKBd}Ip~lS}=~7F@kZO6iA(TN6a#neV7M(y|irh3o#? z%0mYQ{RLy?W6iG5eNl;d^}2(_BPqM`6~T&zWg0DR_iJ52^z`)irc53}t+1)``7XvM zYxxSf7^8qWLkanorlz(mNco)CL$ofh4;qdx(kmM-4?T^Y=$jQpdA>g#m>dV*C&U#A)-Pizw!3z!cBdTiR;7BUzelgk9>t1pn zA0PeA&3h9j56zj*K7||Ye*d_*TooQ3w>yWE>6w`sYK2^l2B)g3$rjd)9mv*Meb~{X zMzUm(zyCKAi_-l3lR}=1sJ=+x zj1SDrCh*QDjBUSu{p#q*IdXXxn+ARUUIY&h@8slUbaeFj_mk2Ws3|+g`ZeU4=#WAD5Sxw-9|))zox7-<_0{e8_(%t zS4#u}p(`VrmmiMx+SFZ3Kfb7XLj3$|^-fvaLM;@CQ{Uc$fU$2F?6384)Rgpbck_pbINQzYzjtIi z1IdstiQK|{>)GlHuqU$Rumh=R(^lO@W-05!fiw1f@%EDWswt zkDRRDZQV&!v}YZOI4l4U9rOL#iBFiljg3Z&m1fa5b7i}<1QhG3QljNxy!Tt18%$GX z3raN61F@SabaaglC%W!5Uc8ukskp!W-+9Q%qJ3L#z7N%&=hiTgJX~tHeQ>{HprNVf zQ{uQ;2QK^MIso&Y8d0#jPP9AB&1f(}sRP%fsd41w+R_xu`@OBZTW&maEL_kq_-mlw zUExkcAs8zhBE=Jq9&WkL&Mq6_H1rs(8yw@tves>3p7NF~VOImnsvSr`O0A#7do9}2+vvzIc>5vCWDAo%8S#K5LwvkxDdo{C*YH zz0vuoL~s3g6@4Iv;U!Xyd*zbr5s!9?33Fl{rgoAl;4pcknMB&P$ETQ7c87C|kFN!p z7L7T^Y%`^ir5H+kWDr|wmaU`x<@UNBO(dO%o5QNPvVEy>AN)ST7S5B}RQ1MOFZ@(BZr;4r#}uJ&~_Ef62$6L~JTM>9jWFYYg=UlH?^yUZdIKOENA zx?Ed}Iy=kA$Vf=^U!APC0MWBE026F;Glja2af!e2YdfI36kxn((Td|TeH+ff zF#PuLyRdQs8`tF!f0d5q`4yA*N&odV@A9pyMD`ejt-~?pvgPvd0NQ!DIS@N0KaR1s z9!sYtud4cvw+9FFJsAb(Pr4J~77LCI@k9T_PxG&pT8uSGN^_a@hgM*_}s*%%X6 z({4yOIAl%a^M^54?>#17-QShIMb6Lb=B2uCwMy0;bgs%4pp_;#~w8TFa9Y zc%(b}itOyo{n-k`krZ1~fiMey`JaL%?;yHURB~z)PL8P|TQlrL$*cx_?!oTAc(vse zRJUz@6<>^6glfO{^e@t8G&Tq>d9c@;a}Rdh!CO7Vo9A&Zn@W6CIQUq%$`=#QQ|fMr zBbNTs1xPz6P*TTU-}*O`-zvKN=1~{7=XshRT=a)}p8NUu@SOb;8js8=oV4=dH>jv< z|73OjJ3I81+wTqP=~C^zkxN;oI#Oa7NB$Af?}a@$<)~*QEl7C$T5uYVEqQxInVIWA z+{R(hICj~&Jt~F&N#?7o>svoIHIi<=jZ*gGOzP|YH4m~Xv=E(Rt1l%Gx%q|W;KEr`lO1ENS=J_V7t8dD- zece5eV3L*5yc39x=efD=Oz}Y;_L1Eo#d$@C^JT$hqnV;SY2#WgJEE_IAARf5JN%{> zoBZ-#fWCW^Ae^6H-VyrV;9TMA5&AoUm}(JtvOb<7M&kb`Hu-`{C41s(VVks@Qgipq zD=p=AY+!^wE|S?$#>p$=cLTn1x4#$~hDu|235OojrNf@wudGs6eJ!bTd-fs$Z4*8c zrCWz6=+32O8p+!d2fecH<(Tc*ySwZz$lByO&bH6elA(K$wCpEb3uy;)O;i*+9`0p^ zn#(ubvX4%YOAkUezUxi9heJDu-=UJiO&Z+y5veVe9D2h^XR`?nO>Q2yHV01FS-LOM zN6AGkV{RUz(n1xkl>|XCDLAYd&y(9oF;SQQz^sO0L>b1~ws z&xn_}rQf|x`VC;Y@O1=j+F$7#Y^)OB?FB(?X>T@QuI zz!RF^T^nl|x^5s=&aS0SS1ad{Y2w-q{-O65i`Lzpx;}xQ+*wHTZt$<33GiI@shy`b zQazB9k{R$G+^xRjhPYi2@ZbgC7k%?beArRvkYu7M$CE>JH8Rd#!*o*eC1HK z5=K09Cuc2D0KNEKKIZOn8|L4+$mjhVFM#?qB$ zOBbh3z6s;*S_pL4uP886J~5A7GUf?kaEA zkBF$p4g7r&1Se1I!=l37y6`LNWD77}2T-_Q`RNYVF_2+2F#WMS5@h0n{snEL%E3Wv z$#a6+V$vPMibAf*%6y0$7s^V|#9 z&2@X(eltTaM)rj5A1565sjJf$m{W?G6zM-#z8(Mei1jicw3|=)da`bY?wr%P6`K$0 zeuoKFYkE*O!J{kqnd4=*auB8-k<7Ot#MN-(;F^pU9pj|81GKx5960= zHQgNeSlntmkdznMKA4>aG9MN~&P^~sXeV;>2{8^9JZ?1c;l@$w4ao)&#Kux1zgW&D zdVy6iQy=CA@x~NuS@XH-4_mtZ9{=)&!sPu2ePM7`!aeT&&f=xiTyPa5T|bK(V2-0a z$)^RfnoT$GLOXwJu=%#H^pWoQo2@EisE8fmH)~^%q!iiiN5bhCONPychJs<3l2XkZ*)-?iO|5>%HaBJju%D z)4mhguS0deXP|1<>l4;`!0inrLCBTG0qWOaLV)71zP&gY&kgc^*f2W8@^8h#$tAVE zMPTU|UB>nA_4ljhLP{oF2tZeRh=?y5Oqqvz}OEm3dJeakOQtloD2s_JwTRB&#W)|U^% z;9Otbxh>axy2G8C=GHfY(}NjKGGTkTYlS!*?Zjt7#c%}C71TJNMIGG8tGtcma_;8u z%xnKt_029xd13p2=fr8Xp0hzK@Zem-W%b}Y^q#d(eZ8qNeUH2i_wqc|{W6-;^#G}q zG57M7GKZ4fm%PtevagZ#v!=s%wG~&D8!lP!-V@z{A5T;1OFllBt4x=l1}gZZTg%Z= zX>F%4dM6!!)K+!)9guqWRt8(eFrSw0W8bL@zr>;a%6mN8J+1BQSL}Ks9gD*8;$83$ zE{)trX7fQLm+!P)_iJSIFePjnNf35xN1Lz;`&3W2@U5bImTj;3FT*7zaq*G|7@3$# zbB}6WwL}u?80oEP%Wf66FN*R@k05;KnPVx#+4j6H$9ERrxea(-&s^?g&z-Dql9&wW zxcHpKbGoG}^a}Zy8{9dZsWI=ymX&;v$$v>|` zHl1#}fS9Z1B=C#zTH9poLvr$1`Fp6|xf2-~rV24T?fU?Ku|!VpW{awXTBigyZiV%F zrRX1dq~*)^%!)Ji<5aWiADll|rJt^wFg%47!9G4Moq~hpsym?Pv2IMwMo7W!L9h0BW;XJLf+l|&zRLt;fUh~mJi%#@#js%^z zhZi@ALGdIL$@kmet-F(+$0_wJf8aj+Qm1s_m?j!qkr;z}#;_UWehp+r+8(~e!1sp4 z&a0{J7jdmhN|T)Z5I%UQL<8sE;gaD=PK2xBZ3xY>Ou_tRV*?V@(QYwn<>b|+0|OZR z_V{MAlrfNMU^XnYHY5i~I9$sVvEyGivQJWu45vj)ycAkaZW4@m)gmS2(Q8NE?3Xq*aTi$Tjnp z(N)@F+bQn(O(x&oNk9Zf4v@x4DA`>)kVPL?oVY3Vhl^_KPk9CrBm?fxBDXrHC(pmY zjvobj^_{l+q>Tv(|H>L6GE1fROn+zNDZ6oJ8Bd}(3q9B8Ps$2CW&4Vc@zr^C!T+dZ zp98pj-XBnI5|niOU09F<_Dy<;dquq$iMNl>_3T@aN1E;f@8rJriix>V06q^5K^ZFO z`HOB<)BU`ynAeY?zfJOj<ieGtYRMzM7cKU$UED&(eTA+TdxK;GQrZ0Q9a{C#u+% zknFfYAXqZv&OEKllXId}Mtv9%G99tA5$-PRKL-98?d=rqMf&ArypWKOT|JSeG-|PS zs+17}wl$6Hp6CfjtI%n`#>Sql=^)R@7&jOWOijU*m-FU zO0&pXUa$CUc6)h5o}pBjvIA*h{E3yLFkf>hq5+5dZVc6h^_?Cu2$^ID)mB)!@Bk=c zOtf6A+V0>*!w8XdrRS1VPRFW(;{)AVntpA3G`GFm$6ZayJKzePHYlwjR;8mn$GD^- z-@&AZSAV53w&~A};FYd3;3=7nY-h9>$SO&a|_HK2O-}Ydhn0LtrW73|y|?i=?Fwh{I8{r#CtgsUoW;)$y!BO`13B(RypX}?p* zxpm;vtAMaVyz`NvrR;%D-h5LmB7v{n{|7r`K?18@dxYD*yIIWChsS60G zDr{^ENJ1TP9Uu5T^lyKK`iL>$!^Yfd=D*X3&=r4Uc5=-8i{ZrA%r^w=Zb{sFu z$zBw4`I8PCgzU!qoE9)R3~1qxi~i3CvByMwSC1ro&=}=C5wW#7$OC`p^2*m{7=_n1 zdmP8QA;tj4 z)tVo4OKo9I6R2_6AWauf;$N69QTqymc|h8Ix_R9Eoa|gUS{FVt#cMJ+F=*(EoQ`v4 zTKQh_%?sCsAq{~_brw8{H2zAs{U!nXK_79F&zSRHfNa9uRwDU_QG9kL+H__3cs}S* z!1gAd!7cw9s%y(N7@0-{cOuPUHO-l_H4s^MwL12-!+@G19(bBblOUPi;~Oni;j@vZ zjhf%c#yALdxysi4DVI}x;DG9@S!fsq^yAgW0tj^c>c1-t|E?HCZlr%2Lo**llk?M_0?;;GymHec& zMyJgyoLrQPafqx$e)89^PoF+9{WODgBT*MZFbR=Rt|G$WKsQorLW?83xA>gdbCyLz zROZBAIVz0O5hZEp3{>&;_-v`WgAxw$!7+7RkLw+|ma48+h=5i7rymXbLw zyX&`(Z8U65)BJh3JoS;2-OzjrcR)p-vfHHMakC1FW5{iWE}t@>or9EEzU8yY38{#{ z_C1}ZEFIQP=**xRN}_$Z(Rg4 zJn7;JqHv&%`0X`C|I!yiiK3O*#Cx=PP05Vp$E5&qI*n=holncYX~1LiyLE|vBT7eQ zTrDjYOaS`jjzPQ|*g2!3riQm*8^;r=vpqqBG5v*dnvOtYG+&-9BLWdFpLLNwV?mni z6=<6ZaC5M7A$_eH1&q%258*II@W)7<3G0|)eBVYk?)Rfhx2JXdi~$^=w8xFHbtD)I zai;!10*156ItwMjR>oq31TJ~oC2SML8py*>1jVB8XZz>{`mRW3%1p~+DT->%#Jz+QrbP(Ejc#k?M?s|=8onEf^L>aPg3{BrO zO2K-7NsnzMBY^CQAhejGR$RT_6IKe?2L2T1nFXN&^k_qwV6I+8qe3?E)L5%NhFM|s zs0JsYx0zoOc<`6b+8%cackq2G+i5*q`gSmsump=hcOZt6Ip*xQZ*U-E(E659U`>Gd z;?+cSB10*#5S^9Tg5ZV>LJla(wlH9~;7?5aWGG)xFYg{M5Ng|o( zLecFu#YC6=Gm#u2O z%SbWId3Dra_1ao;d-a?jKOQILpS=LXpMDm4#55;l9?X^fBl&1`C0mp4R9K&VeOGGh z*jB*+G7<u4AfRQwdDYU?BK3t!>FafuHP`R5z3_G}$8x)$Q-qI?yMtJ~(iuR#p`|>{a;W#}pXOmeD?!!H(-{r%3;wTKzR+Ix#tQyg z|7T}G+lI(bsj<=X&;4${^e^ox96FdhF|M+y|@N+{~^rfwziX~l5>h_mkmu-YEi z_~*|^@A7kfsSsW9V37o`6l8_7dJr`EI^Su#(2((nSh`KFzY}({J2R2g)l$beJ(`uM zLRGR?iMln{^P3MkUk!Gl8`l<~dHweJpzBT_$}I5h_Uv0ldV^s7-q#R>M7E53jgVNP^vthh1vk|v zs)p{L7E}#Q^Dk!I#ZR21dmfnvG@bC(Fa8dT`%)kQ@H5@7-03|Z zx8EK;Q8Zp@y}bcR7vB$r;24R1$F?iKr;eq2S);KXchUQkqr0Hl>?1eXZ=X)f6GF_w z=iAu8gr6UIM*kEQt-L$@7Q|$CWfJ!89D7JKEQ0*UOTnv%q@TO(x5P_^?K7(;5$(v> z57WP9sUegItCH5fliIb9t7ep)@1{4vIqWlm_|c&u#;%=w=xY1U^_6WicqX_ed`?j# zy#X%t;YzOa4*PZulIuM*TKI)o^9SH8Vtg%4$5cIu+_|QxK3r{$nT*dFQbpThF5bL6 zbN#ci0k51{)7KeAj}m)?8+jq%qS2d%%%L^z7}eFyFc=T2XU!hh+QrT;%h&83Q%>^> zC(^?B=$TJ*)jmny`)m7b4dJ!qmy=VGK>%j1%7|)z<`hgPTU%f+S1rGMHhW(U;X{@r z5C_v$mz|HlArsjOyx8?VHlO=7*{2)K=UR}@AyP+4wMAX;UfG==_~(5weAwWqF*DUi zrfMe-o20tu!n6>aU5&t#H6faslDk)1^U9&j1v`08-fG5N^{zeq89>Xx=m-Yd73|2| zlGU!keWbz!_-y9`gR`KiqJyeOzxm^a|M>RU^1$?r+#&~^6#?Guhs4#X=l1(<^SRMq z9$A&eWky5FE-Io|Whs5s-hI4yA-X&?%>qLZm6>zag7$G3Lr3Xc`UP^;N#_2`-gQx7 zBBlxDNp|?OZISepc4EojoW7w*iBmIQY<6LoyKz*idqxOOCRCj#&~>AB^x(@jI;}3~ z!$OSMr_eqio|F3y5s8Ac#1T`c)bYK``iFbIVFl>5(}f(?%nyDbWEJ6bMpl}xy-?!m zw{ep)>?1$x3pa3jn_(e)2XgQs()Mt*3vm{C^q_Q#yE5^jaXPcyQ-$y z@mmezqGAtyUH*YHyp)244C9dX@euz=G{95ujjfBqOn;qS=FCCN<(sPyoXn*|U%_u# zEAO&@;9^RKI+{^pdS6%|nu&DdRuMO$UEB9~FTR)eESo)^>E z*v(ag@6hc4?XI{rgC=C8X2s~0U^1rY2SOqI+mwovGeMWGLh)?K+ z@fhtK^qdpf7H)7kFSdFYCw_}(9!Yww6v)lep-)v459%NQU{A+~8th$-c5O#=un*5QZkBagp5?3JW&qw@RNh!w z-Z*i2}FkXk}o{-W70hw4oU!Ace99t6-))g^J)t7ehL{UrjP@YtVnvn~ofytZj7 ztiTDQvE9+EdcN+M!e4-?6?nfvGqy~7%HgEMD9Wf9CICJ61$6&*1sfTo^aPZB`oeXd z9dP1hxBA;=VAYH`cJ8}REf0y=E92EHTfW#q94or+VN0 zAFWk+SLGb$DLFGlme>CPNJA-A&Y_p*zJI2al-nL_DScw{dS|Oc#MQh$rVQwxL7HSN z9hg81&)>e(v>*qe15S|Cf?D)0E`PAK_|u-h)EY;uKlQ)#O@&$tCErsTK7B6ZqP4^P zg*<@gr=d+Bmn-+cW(9hg3{*$hWEHL>|5})rbaE0rE4B=SP|r8`5D01V+Aiemg%}!TBxx5>J)!w|D0-0so;9wQ41NU<~EYG(5ej=zxf$9*abe}pg9<#O$8qNo8R z8ZHe1`|AKN_1fFID1h>n|I#ZhfhoZ#XI#E(^Cdw2U}-?{Pu0!#$WpWROF1_m<1dzh zCO@xNDSp5tptBiLF9LNmCow^A@iaU@Yko+-53rITyD7?{H<5BsR1IUVHZH||$4(J) z_VuIc9?O#A|L)U@<_Ph>9R^ypEFuf4+UOc1$Ll!EzUupQ?a*%RNJW*f5R}-Cbd5^J zgIvEu0XMHtUtc+|He$YDxBDEt2Hf5CO<~EP28_wCHo($rDeU6q{a^dGl$pi@boIu{ zQATp+;NVJ!Qc`I?(HoN9p1%K6(5Pw&Dh{Yk>~I=^!Kj0h(?KsLtY1qECgq;ad8}X` zIx?7ZFHo~b@Y0IP`dUwG#f!!_{`kG`+j#xi6GvVdI@V_YO5t$asJ9E|K`4x|mA7T_ z;w)=*SIn7;!cB2z`%56)w0cg+z7hHs_oj$~?-gSzI(oEa!d(qp;599>-}37tv*-ug zOloJ>C3XB*PNFJuc-r{}b$WBGXOPiDO^RUZJkz7qtf2umQwijPw!I0_@}nRm%w7J&n{Twp&0y1Bjc{G8EPcDn(U^{@dH~MVt!Q~ z+%y<)c~yYVHEc;(vEIHW>Vqyf*%Vq~O9+|xV(vL|O+=hkd?Wljy2Q^2bTina^OS3( z@$oMBE7$gj=ek-|TvN4~#b*b2cpZT_6Hjw%`jY<}$y30^#WZB|?>&KYz)0;KP=p9K z*q`5=b9jK-KjDC~I)Hal(**q>e8&5qhmXT+KBoyzLsL2ZwEFBNN~k){Ad;T|y@$_f zy%D%M08n4Ib`D@go4G-?lW_&uc^VKdKR~DaUEy6EEgM$N-6;F>ZVI^ee@_8s))f_x z2=x3tQ0NvZ&p+JX`hR<>1Q(9rK-2&gLf**>vZT0AFX=U|BII*(846-#h-+EdF4Gez z$cBE!+DNKyr;gPF7(Qo7o8cDSWDJkA2+5V8z(9>g2dm_+-(9iV&+-wW$k-))?>>$z zZ+F^oCfWy@_5^1XwY`!7#o4|Z`^CqnO8$Ukwi|7e5zV^XBq z`qQV7%U%XBe>L_gH|e)Z&mBlNXHgtat5ls4by|T7mlK1STN)@Z1-bCSxGAN15U%v#>uDM@hQ_EoS>!uU` zQxVW{tOl(1Pl)-ur|`dFLnX8BkpK0uRD$bhoPOfKdXe7epVc*?=I~A9!u4iDGb=Mx zXv;)Wc4j(n8fc=8dS&5^pYIR45q<4xp`(&&UnE0=U{Db|U6h;6S&@I&)RuT;g_)@4?zay8tWSrbaOJ;v)D5# zcEMOk2W|1^4l7EG_l1s&LdCLE;jSfFAA@ z9gQDbvYoU*vPPExc*`5I0*=ZmZ{`sp0)~V6OtqQ|_dVI81v%BAMgowlPZB=dOIb>| zXRiU;6Xf96`T|r=e(&t^J>DzYwXrG~VO_)HhhW%$*XvPHuSEiV?olb;(&Gm(cq<|| zJk6iB7Pe7)rl(~la@L$pK>`$jCm>8Gzwk&GxbX}_y9KpIpZV2i=s*|HPUiN{9d$2) zbtOeI^cEyU#;86cRuiNdE?GnUmei>o5N73(;$m${!Ft5}v4J zbK*(Z))n&mbo1Whr@&sN_D19neDp&80s4;RTMr^31T>j{nD6_O4gclPqt*xzz96GW zw=h&rc2H}`nX?P&KwaAt%At636HY6nQ7OTMbF|>;mkQ%023YV%F?T6b@?5j6{c>i? zzbsP02{;6rofo`sBskeQ-Zw8Jp}G7!f9e46rzXb6TZ1V)#uM){M`uol0c_0sT3t?t@5H07XTx<)+cuJmg>bs$3*V z|F|ArnSG?Fhd(H&X!`}4B_Jiip`CxUHhK47i7C82g$EQ60`iWmxi4m9G8s>Zc3wH2A%P@fJ^*w`2jf0S9T~A6hGi03Ewk-TKs+()KH7{z?O#?S& zxAWSZ*Q27(;;?EK&^*+8M`OP(j42%$CB1-ohV_~Z1y@T9`G*& zc(rG|WaXdDdcugq6!KpWYNPGf|1+W|n}{1hv=)zpfb7+jkcnb930gq{)G{>af@Q|= zVA^-}YM@V53a?Ic6b6C=lF5?3;o*JKHP`{Pfub{vQpAhO#PN5`^9*~MG!1e0 zJX#EhdC^}aF#(SqU7jsxccXR!F5@?x67|IFFJMKhZ+ku2!GB7!X@EfY^`d{lAh)}F zX9FptpjD6s1N%fQ7+J3^qlV4=(o)bpI(sROQN)H(nB8_zoY{_8(b3V@eWE5E1AG_f zs}pfk>#grUE@nr9vxX;*W^D!F`m`c%18lh1Cn2!X zr{c$63{fbSw<{5G`pR382=wq2-~PXpr+@YLav*^*DFV*T4rD9n zKa>DOxJ5Kje1zLdrU2e8NC)I2o%At#I(hE1dQ=Cw;ID)gBNG##zdruG^98VXAXr3i zgqw;o_gd9d-!cERw2|#rTg%za>S7_OPEC(aJ31bhG3#S&iRDDiq{22vVRMT&1q0*&z%TJfqSSZKINAT~=c(U3u0FU};Ab3RKj4zvYsS~pcdlU) zWy>J>@Ep)ngVN3Yl~bpI`j3v0lnf9ivGFF~nEfn({i9jpy8s@n;{iYr9|ouhz2QzH zPp?VEd(5t-)Y(B>yZf<-vo$2BQ1A1(e|{n5}|`BmZjPT|jtF1JmSMYyM(vMH?_&-p#Baf_bTLlzwH z!T)y)ZD5zqP2k^i)c5z$=YQhZx7G+35S##znA++N8~*^|#YJJBx0}FzmZxk~^wi-H zcov(D;RApXV67G1)_joVqFS(=m6uNhB)9Sj=JzTLsq*%LLx4K>-bLM&@4W6#zy1cD zukVj_zWS`*RrM8~#&ShiC(-GdcU{~AMG6-XSkS$a@S|e>DZ-=wwFm64omAorf?%+5 zwByM9t@KAps|1Gss`Y=lE@@KFqoo#|lYr`epL76mhIf5p2N#a~1Ko3Bnr;7Ch>_;A zz8pezq7S5NfryAEc&91(9mT4kZFWGI|FO9MY;rPNzA5}3)xi8%Y^ZR{!q|rNIfUl8 z3l>nRUo`*PTp%IK_$TBK1q$!l&Ot{m;#cxdBK?I-MqF<3ye>@Ia+Z5oX?psqPFp&f zV&}h5Q1XR3f3_dp{Snrc08MLJ9ZXI}Hk{G77*~pJPy0nmK!3A4n-$FTnO=|(riN}c`Vnh(!GsJ&Gk4b;fBQokXj5o&LB-+2Fp18?#*#C&G!%wTw1E?Z8 z>QA5Wrq?&{u9}-AcQaLBZUrM-TS?e2F zMx|1VYPuo7cRUF+gUwt6Uov^wH3#DK*g*(HKi{5<`*dEzGB*E>N z=3N$X-$Jva5n|k2eFmnl+gym#4y7mnc}cz&TJ-D#HkEZ^C(}@n0rLG1iA-{`HQ+x7 z-AzszA?L#l=TCkQ3#3GgPn!!XK(ERlDvrJR^pr)Nj-?)+-o0N!s_d zSj%#7xJ&^4hKq&>=`WpLxM9iyCCt?BpOnPegb0EY0%iwhuZc$K zNGt%DXc$oKKl1z@Au&!WvvbUqw!FsAsVM0B8V}NCeVN5XKv)jn>&MpGO1yP4=XY$@ z8gs!`u1PS!fLj;SNBHBW-?7ldt%bP5H?L=&Uqaja&|p(#i`XRtM^YYdq{PRsNV=O> zR^g+$%D2{L`?)_*;Fvfi%vC$id*UdH2NVz?9<5HMXYd)Wo=YRurl`NG7I-sF_AKj> zLlQ(CcTitOsfOLv6OxE0iY3X;phm^Z$`HuhX1BLy|3Mn-!_MkNKzPxxZhC!xAeRW( zWn(5DmFpl=CJq>mk1u}ST@g(gE3}V&BA9h5!ppFvwHU81_kN60ghk*d?uc^2#LGVP zsos-yvi$3<%>i~Zt%3?>5%A~x%384;r#Oa%;DkY%0qzm8|FAM_dz8YD2gDEJ7h z7Bg96D~>rt!)WEzWM1|us>$^bSj1ixX13v&V=%A5EB)TLx-6adp6Y#xTF1)Y$S_R7 zU9d;f$v@7`r-{SxnKfCZ?Y03OhflLsKlxWxSSI4JcPq4}cU#Ojr&nyRtKtJ&_wMi_ zWk#=+QRKvjY4Wv9i)6+Uz1>dH$>dvF(;7yu0|lA2vS`+aHgRL)-*#eW4woUiwydjd z0UAbDAt7Nwshqt16H+uEG(S2wizol!Bt6U-T~pH(CPWYK`&8`4v36tsLD|-89SqFe zOX=(`5oe<$lho|O@Hgt$_LHMd1x%mGsIu~t-?UE7U=7+eohku#x}K2Q$iDlggk^ty zCyh_8iv^u>t6}eV<3K;z^?nke_Zp;!+6H#dN``yqr-N%v9 zJ?xVW2fnVh>0R%y2J4;ARmuGe?O%zHuCGrrOxq-7qLEoAt$dXZS*LMu zW%u{zOok`jJxA~yk(HC1P?QC;l`M7RGUi1X$_4?J-=(4EN=TpsgLCSgdiYRlT#@Yg1_^@{=s zdBZC!6Hr~)k%r8W`n7b8@dWCKMDCliu&o8Rni!LHvIARNg(zq|SM1i*L{6e@R$w6I z8r{@4C0VM&bAl!wCN;0Lp+Qe8!NHR=bpS);6-nM@prDO<1#Ia_#a#YjD#-7@_ z*>VNx8E;`&1n`{!h~iJ*3&3~mMZ?J((O{bW?lxxoq#$PiN^437tmwBHIh69E=(A$@ zID5D?^#|+Sd!$DH8=IGJ|2>fJik(J z_L?=5|fWR9U$x}1@dmm;&U z$LXXM-s}I4EOA~5!W!pKr=%2hweoCzb8qcv%1IP1X)VRsR&(g^LH=U3-4p*AZ>qn$ z4t$$IOY{`pRYJl}xF1oX7#M6DJz-PmYcSF;repg$XkE3&b-{tJb6$kZxL&D?CnarnOI@Kl5ZQP}k6J1v+ zrENF`M3I^r@y%5bFRz@o##N?TwVzg=E%f_6yINxfug&9c)UJ!m+@amh%HG5a&Ud(~ zfZ~S%MC#}?poLN1)=BK%**6U%*PLpmK$d(L<<<7n{-hNcga2fe|4&Twzdc7M53=sW z3jBg;h(e54h!EMn?AH9iUe$%*}V)uR$>EE^Bm~VoDuNTh-OCzHC#3 zS-0U*M}Hv~$)D*|8(L01uywBz!NkUMZ0Va?S|ak=f>(ENaF9~W`kcueKj=mWosi{y; zb1@LG)wkM?m5nuw0DFGF<3TPQU79Tb%tK~uVPR1|n?X)~$5n9T$tZ)(O-9*0w=gz0 zwbhsmbxg@?%Iuh0V3Eq7Fq#OtJepQ>Qp+JAiNZn@PJEk@BBXBOC%8KPQ#1WjWtI5b z-2k9qz#e^AEZ^2!Nn~=PW41ebxKHtWS!`xzc3{RlDkq_Tg<9oi1BUT3%L}ty6x+A) zDrU5|TURXWR9$y1WIU=O`2_s6p83h4WJ(MWSqL00&Mx8M;lNJWH;3$;7Qvx`Dd*dn zdPKj_M^WvKN8C@PBPaF!awyep6tgC$f^S_xOe=SAc4>{j&=NT!({k2ksBB1aN)I8oVLu*^Bw9(d5 zKl6?MK6&K9yaQ_jr?Q=wryO>j#;j)pR#bHPyuXHxo$7WNZ`c`P&gDSLMT6*xnk5nZ zZIdeK!8-b-!uk9bPdP<3*<%nF)YUuxCjHI%nnBamKKZ%(@`D>Trn|H(Nr`b<;v|*Z z<<;kpu**wfe0C2XSjZy$8;6T(s%nBQFUfNUWMPZSnz4-Td);!6ML1Y{kX!pijv4K&Mx*NBqJw> z4#rD^fdcZQ_NF5#9kO-=oRO1`by7^(Zxe!W9)gJ}_1TT>jXt^1*4X+_se^Gl8LNe|^X~UUXzdjzjL6L0SBEXgxR{ttSAD|F%*@!&JA8t0cd%3^6N58~||5)8IaR;2a({6T z;5dKxwPp9a%+3n;_dmD*8;+M8y1SQNiF&*gyi*vF$$xOT6}5dD)irA@bfjH_g!>4q zE&8JL)4Td0*RUZcI!el%@`By7`1e}&pWa~+5;nO9yy1UCgi9z6UeKhK!$N-vYrosj zn}oNkL`yaGstVr)3@$69Asg1KKzr;ok(Ht#6ZmN((tTsmoc~r=QBCuHJ>JTgEP;*w zV(z*^L#0!tP?wtRq0T*?;8gEXtBZ{igeKG7u6<138VV=R$cdf!>`YFa@EtO^>gxJc z2?=C$oy`#9X1(}h`t(2lkAc+b&oA_|&}*Om=iiK7e*oeG(NLfGH}Gt3Zc&DJ8!JEj z%U|~V@sIWOce~p`86J))U63kv)v)h-fhJ9OTqRKF?5+7bx7&HvzZc##34-Qfy|~*@ z!C2ktZ?45Z@h^+x?adbAX3dEgC^l9l4uRFvruFdUEUvn`e#)%bYNsuhdUD+oLjLvm znyl8Cm}px!!E5b5|1%No`QsnEJ3LImnygm8Y6KWUE`4#j_K}DGb$MnE5jj1_=Zsly z7G9t5%;f0oWl5$z6_l z-S_?dez>Hr{;p1=Zf|erJ#OUn(AQHiHhfq(SBJ%^0AS$x{cwrRW^25EKRP|gF#=Os;jfqx3#v8h>7y$?gV2LF?<*aJk}zGL1pONTl0y;PAAy<_&D(o zwPtIRH6|)@m{QrpZo`zyn5f9M)>f=S3WEyI^U7gi1Ko;1QVt92;mZZic%D}(CG`a= zr83;db9dU!Us$ZEAkM@8KiB$9R`JUl!)GScej<05{~>UwfySyP57!otImWeo;D zUJxQCKNc}6PBQ5woA1>%e}B%GjFAH0q0?%kVxpy!Uh;lZt;xg`estjj5cmLw9KNGN z;3bu8h=`aXOcB=mKYlr%yMv^L`T#ysgoW`$g1}28Ne^R;DSZ5wFXwZ2K;Q$JQiO#O zNosz>cXB>=krZxl008&}fe!#=2Z0X&WCwu{0AvS&4*+Bbfe!#=2Z0X&WCwu{0A%O? Y2WvpK(KP1h4*&oF07*qoM6N<$g6|ZrGXMYp diff --git a/docs/getting-into-the-code/guidelines-for-setting-up-a-local-workspace/guidelines-intellij-codestyle-import.png b/docs/getting-into-the-code/guidelines-for-setting-up-a-local-workspace/guidelines-intellij-codestyle-import.png deleted file mode 100644 index c1a32877c007f94d6370039828f190029270e78a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52736 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

JFNh#$O*h7+TZVA~td?{4r9r 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 literal 0 HcmV?d00001 diff --git a/docs/getting-into-the-code/guidelines-for-setting-up-a-local-workspace/guidelines-intellij-plantir-plugin-restart.png b/docs/getting-into-the-code/guidelines-for-setting-up-a-local-workspace/guidelines-intellij-plantir-plugin-restart.png new file mode 100644 index 0000000000000000000000000000000000000000..26752e210fe843f379e5884a680517766e0d795e GIT binary patch literal 54802 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 P`Z+ImzoWIT#Pojv(p-e1 literal 0 HcmV?d00001 diff --git a/docs/getting-into-the-code/guidelines-for-setting-up-a-local-workspace/intellij-13-code-style.md b/docs/getting-into-the-code/guidelines-for-setting-up-a-local-workspace/intellij-13-code-style.md index 0fbfce3f54e..5fbc831b6a8 100644 --- a/docs/getting-into-the-code/guidelines-for-setting-up-a-local-workspace/intellij-13-code-style.md +++ b/docs/getting-into-the-code/guidelines-for-setting-up-a-local-workspace/intellij-13-code-style.md @@ -6,7 +6,15 @@ nav_order: 13 # Step 3: Using JabRef's code style -Contributions to JabRef's source code need to have a code formatting that is consistent with existing source code. For that purpose, JabRef provides code-style and check-style definitions. +Contributions to JabRef's source code need to have a code formatting that is consistent with existing source code. +For that purpose, JabRef relies on both the [palantir-java-format](https://github.com/palantir/palantir-java-format#palantir-java-format) and [checkstyle](https://checkstyle.sourceforge.io/). + +palantir-java-format is automatically configured by the [Gradle plugin](https://github.com/palantir/palantir-java-format#compalantirjava-format-gradle-plugin). +Thus, "just" checkstyle needs to be configured. + +## Checkstyle + +## Install checkstyle plugin Install the [CheckStyle-IDEA plugin](http://plugins.jetbrains.com/plugin/1065?pr=idea), it can be found via the plug-in repository: Navigate to **File > Settings... > Plugins"**. @@ -34,37 +42,7 @@ Afterwards, use the "Restart IDE" button to restart IntelliJ. Click on "Restart" to finally restart. -Wait for IntelliJ coming up again. - -Go to **File > Settings... > Editor > Code Style** - -Click on the settings wheel (next to the scheme chooser), -then click "Import Scheme >", -then click "IntelliJ IDEA code style XML" - -{% figure caption:"Location of “Import Scheme > IntelliJ IDEA code style XML”" %} -![Location of IntelliJ IDEA code style XML](guidelines-intellij-codestyle-import.png) -{% endfigure %} - -You have to browse for the directory `config` in JabRef's code. -There is an `IntelliJ Code Style.xml`. - -{% figure caption:"Browsing for `config/IntelliJ Code Style.xml`" %} -![Browsing for config/IntelliJ Code Style.xml](guidelines-intellij-codestyle-import-select-xml-file.png) -{% endfigure %} - -Click "OK". - -At following dialog is "Import Scheme". -Click there "OK", too. - -{% figure caption:"Import to JabRef" %} -![Import to JabRef](guidelines-intellij-codestyle-import-as-jabref.png) -{% endfigure %} - -Click on "Apply" to store the preferences. - -## Put JabRef's checkstyle configuration in place +### Put JabRef's checkstyle configuration in place Now, put the checkstyle configuration file is in place: @@ -112,18 +90,6 @@ Then, you can run a check on all modified files. ![JabRef's style is active - and we are ready to run a check on all modified files](guidelines-intellij-checkstyle-window.png) {% endfigure %} -## Have auto format working properly in JavaDoc - -To have auto format working properly in the context of JavaDoc and line wrapping, "Wrap at right margin" has to be disabled. Details are found in [IntelliJ issue 240517](https://youtrack.jetbrains.com/issue/IDEA-240517). - -Go to **File > Settings... > Editor > Code Style > Java > JavaDoc**. - -At "Other", disable "Wrap at right margin" - -{% figure caption:"”Wrap at right margin” disabled" %} -!["Wrap at right margin" disabled](guidelines-intellij-editor-javadoc-do-not-wrap.png) -{% endfigure %} - ## Enable proper import cleanup To enable "magic" creation and auto cleanup of imports, go to **File > Settings... > Editor > General > Auto Import**. From b0d63e42ce18147fab10243dd79ce5f49a27d7f0 Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Thu, 16 Nov 2023 10:19:24 +0100 Subject: [PATCH 2/3] Reformat code --- .../org/jabref/benchmarks/Benchmarks.java | 13 +- src/main/java/module-info.java | 38 +- .../org/jabref/cli/ArgumentProcessor.java | 223 +- src/main/java/org/jabref/cli/JabRefCLI.java | 110 +- .../jabref/cli/JournalListMvGenerator.java | 17 +- src/main/java/org/jabref/cli/Launcher.java | 30 +- .../java/org/jabref/gui/BasePanelMode.java | 1 - .../java/org/jabref/gui/ClipBoardManager.java | 26 +- .../java/org/jabref/gui/DialogService.java | 27 +- .../jabref/gui/DragAndDropDataFormats.java | 5 +- .../org/jabref/gui/DragAndDropHelper.java | 5 +- src/main/java/org/jabref/gui/EntryType.fxml | 102 +- .../java/org/jabref/gui/EntryTypeView.java | 156 +- .../org/jabref/gui/EntryTypeViewModel.java | 69 +- .../jabref/gui/FallbackExceptionHandler.java | 4 +- src/main/java/org/jabref/gui/Globals.java | 13 +- .../org/jabref/gui/JabRefDialogService.java | 111 +- .../org/jabref/gui/JabRefExecutorService.java | 7 +- src/main/java/org/jabref/gui/JabRefFrame.java | 285 +- src/main/java/org/jabref/gui/JabRefGUI.java | 96 +- src/main/java/org/jabref/gui/LibraryTab.java | 188 +- .../java/org/jabref/gui/MainApplication.java | 11 +- src/main/java/org/jabref/gui/MainMenu.java | 748 +++-- src/main/java/org/jabref/gui/MainToolBar.java | 157 +- .../org/jabref/gui/OpenConsoleAction.java | 26 +- .../org/jabref/gui/SendAsEMailAction.java | 34 +- .../jabref/gui/SendAsKindleEmailAction.java | 9 +- .../jabref/gui/SendAsStandardEmailAction.java | 14 +- .../java/org/jabref/gui/StateManager.java | 44 +- src/main/java/org/jabref/gui/Telemetry.java | 9 +- .../java/org/jabref/gui/TelemetryClient.java | 6 +- .../jabref/gui/UpdateTimestampListener.java | 12 +- .../jabref/gui/WaitForSaveFinishedDialog.java | 3 +- .../org/jabref/gui/actions/ActionFactory.java | 44 +- .../org/jabref/gui/actions/ActionHelper.java | 65 +- .../org/jabref/gui/actions/JabRefAction.java | 18 +- .../jabref/gui/actions/StandardActions.java | 168 +- .../AutoCompletePreferences.java | 13 +- .../AutoCompletionTextInputBinding.java | 46 +- .../BibEntrySuggestionProvider.java | 4 +- .../ContentSelectorSuggestionProvider.java | 4 +- .../PersonNameStringConverter.java | 3 +- .../PersonNameSuggestionProvider.java | 16 +- .../gui/autocompleter/SuggestionProvider.java | 26 +- .../autocompleter/SuggestionProviders.java | 8 +- .../autocompleter/WordSuggestionProvider.java | 4 +- .../autosaveandbackup/AutosaveManager.java | 16 +- .../gui/autosaveandbackup/BackupManager.java | 145 +- .../auximport/AuxParserResultViewModel.java | 38 +- .../jabref/gui/auximport/FromAuxDialog.fxml | 57 +- .../jabref/gui/auximport/FromAuxDialog.java | 52 +- .../gui/auximport/FromAuxDialogViewModel.java | 24 +- .../gui/backup/BackupResolverDialog.java | 31 +- .../gui/bibtexextractor/BibtexExtractor.java | 35 +- .../BibtexExtractorViewModel.java | 58 +- .../bibtexextractor/ExtractBibtexAction.java | 3 +- .../bibtexextractor/ExtractBibtexDialog.fxml | 28 +- .../bibtexextractor/ExtractBibtexDialog.java | 46 +- .../GenerateCitationKeyAction.java | 72 +- .../GenerateCitationKeySingleAction.java | 10 +- .../org/jabref/gui/cleanup/CleanupAction.java | 42 +- .../org/jabref/gui/cleanup/CleanupDialog.java | 3 +- .../gui/cleanup/CleanupPresetPanel.fxml | 99 +- .../gui/cleanup/CleanupPresetPanel.java | 166 +- .../gui/cleanup/CleanupSingleAction.java | 37 +- .../org/jabref/gui/collab/ChangeScanner.java | 11 +- .../org/jabref/gui/collab/DatabaseChange.java | 18 +- .../gui/collab/DatabaseChangeDetailsView.java | 12 +- .../DatabaseChangeDetailsViewFactory.java | 39 +- .../jabref/gui/collab/DatabaseChangeList.java | 48 +- .../gui/collab/DatabaseChangeMonitor.java | 36 +- .../gui/collab/DatabaseChangeResolver.java | 2 +- .../collab/DatabaseChangeResolverFactory.java | 6 +- .../collab/DatabaseChangesResolverDialog.fxml | 59 +- .../collab/DatabaseChangesResolverDialog.java | 73 +- .../ExternalChangesResolverViewModel.java | 7 +- .../jabref/gui/collab/entryadd/EntryAdd.java | 12 +- .../gui/collab/entrychange/EntryChange.java | 11 +- .../entrychange/EntryChangeDetailsView.java | 40 +- .../entrychange/EntryChangeResolver.java | 21 +- .../EntryWithPreviewAndSourceDetailsView.java | 10 +- .../entrychange/PreviewWithSourceTab.java | 31 +- .../gui/collab/entrydelete/EntryDelete.java | 12 +- .../gui/collab/groupchange/GroupChange.java | 17 +- .../groupchange/GroupChangeDetailsView.java | 4 +- .../collab/metedatachange/MetadataChange.java | 10 +- .../MetadataChangeDetailsView.java | 36 +- .../collab/preamblechange/PreambleChange.java | 8 +- .../PreambleChangeDetailsView.java | 8 +- .../gui/collab/stringadd/BibTexStringAdd.java | 5 +- .../stringadd/BibTexStringAddDetailsView.java | 13 +- .../stringchange/BibTexStringChange.java | 6 +- .../BibTexStringChangeDetailsView.java | 18 +- .../stringdelete/BibTexStringDelete.java | 5 +- .../BibTexStringDeleteDetailsView.java | 13 +- .../stringrename/BibTexStringRename.java | 11 +- .../BibTexStringRenameDetailsView.java | 3 +- .../CitationKeyPatternPanel.fxml | 35 +- .../CitationKeyPatternPanel.java | 33 +- .../CitationKeyPatternPanelViewModel.java | 23 +- .../FieldFormatterCleanupsPanel.fxml | 106 +- .../FieldFormatterCleanupsPanel.java | 50 +- .../FieldFormatterCleanupsPanelViewModel.java | 21 +- .../SaveOrderConfigPanel.fxml | 70 +- .../SaveOrderConfigPanel.java | 67 +- .../SaveOrderConfigPanelViewModel.java | 9 +- .../jabref/gui/copyfiles/CopyFilesAction.java | 19 +- .../jabref/gui/copyfiles/CopyFilesDialog.fxml | 32 +- .../gui/copyfiles/CopyFilesDialogView.java | 43 +- .../copyfiles/CopyFilesDialogViewModel.java | 4 +- .../jabref/gui/copyfiles/CopyFilesTask.java | 24 +- .../gui/copyfiles/CopySingleFileAction.java | 26 +- .../org/jabref/gui/desktop/JabRefDesktop.java | 80 +- .../java/org/jabref/gui/desktop/os/Linux.java | 43 +- .../jabref/gui/desktop/os/NativeDesktop.java | 44 +- .../java/org/jabref/gui/desktop/os/OSX.java | 7 +- .../jabref/gui/dialogs/AutosaveUiManager.java | 9 +- .../jabref/gui/dialogs/BackupUIManager.java | 56 +- .../gui/documentviewer/DocumentViewer.fxml | 122 +- .../documentviewer/DocumentViewerControl.java | 21 +- .../documentviewer/DocumentViewerView.java | 62 +- .../DocumentViewerViewModel.java | 9 +- .../ShowDocumentViewerAction.java | 3 +- .../DuplicateResolverDialog.java | 37 +- .../duplicationFinder/DuplicateSearch.java | 61 +- .../org/jabref/gui/edit/CopyMoreAction.java | 121 +- .../java/org/jabref/gui/edit/EditAction.java | 5 +- .../jabref/gui/edit/ManageKeywordsAction.java | 3 +- .../jabref/gui/edit/ManageKeywordsDialog.fxml | 56 +- .../jabref/gui/edit/ManageKeywordsDialog.java | 48 +- .../gui/edit/ManageKeywordsViewModel.java | 7 +- .../org/jabref/gui/edit/ReplaceString.fxml | 140 +- .../jabref/gui/edit/ReplaceStringView.java | 27 +- .../AutomaticFieldEditorDialog.fxml | 21 +- .../AutomaticFieldEditorDialog.java | 11 +- .../AutomaticFieldEditorViewModel.java | 6 +- .../MoveFieldValueAction.java | 7 +- .../CopyOrMoveFieldContentTab.fxml | 188 +- .../CopyOrMoveFieldContentTabView.java | 17 +- .../CopyOrMoveFieldContentTabViewModel.java | 56 +- .../editfieldcontent/EditFieldContentTab.fxml | 201 +- .../EditFieldContentTabView.java | 17 +- .../EditFieldContentViewModel.java | 26 +- .../renamefield/RenameFieldTab.fxml | 157 +- .../renamefield/RenameFieldTabView.java | 7 +- .../renamefield/RenameFieldViewModel.java | 25 +- .../jabref/gui/entryeditor/CommentsTab.java | 31 +- .../gui/entryeditor/DeprecatedFieldsTab.java | 45 +- .../jabref/gui/entryeditor/EntryEditor.fxml | 99 +- .../jabref/gui/entryeditor/EntryEditor.java | 243 +- .../entryeditor/EntryEditorPreferences.java | 28 +- .../gui/entryeditor/FieldsEditorTab.java | 46 +- .../gui/entryeditor/LatexCitationsTab.java | 10 +- .../LatexCitationsTabViewModel.java | 63 +- .../jabref/gui/entryeditor/MathSciNetTab.java | 4 +- .../entryeditor/OpenEntryEditorAction.java | 3 +- .../gui/entryeditor/OptionalFields2Tab.java | 26 +- .../gui/entryeditor/OptionalFieldsTab.java | 26 +- .../entryeditor/OptionalFieldsTabBase.java | 30 +- .../gui/entryeditor/OtherFieldsTab.java | 42 +- .../gui/entryeditor/PreviewSwitchAction.java | 5 +- .../jabref/gui/entryeditor/PreviewTab.java | 25 +- .../gui/entryeditor/RelatedArticlesTab.java | 65 +- .../gui/entryeditor/RequiredFieldsTab.java | 37 +- .../org/jabref/gui/entryeditor/SciteTab.java | 35 +- .../gui/entryeditor/SciteTabViewModel.java | 20 +- .../gui/entryeditor/SciteTallyModel.java | 3 +- .../org/jabref/gui/entryeditor/SourceTab.java | 56 +- .../gui/entryeditor/UserDefinedFieldsTab.java | 38 +- .../citationrelationtab/BibEntryView.java | 22 +- .../CitationRelationsTab.java | 150 +- .../semanticscholar/PaperDetails.java | 17 +- .../SemanticScholarFetcher.java | 37 +- .../fileannotationtab/FileAnnotationTab.fxml | 47 +- .../fileannotationtab/FileAnnotationTab.java | 4 +- .../FileAnnotationTabView.java | 57 +- .../FileAnnotationTabViewModel.java | 22 +- .../FulltextSearchResultsTab.java | 91 +- .../jabref/gui/errorconsole/ErrorConsole.fxml | 36 +- .../gui/errorconsole/ErrorConsoleView.java | 51 +- .../errorconsole/ErrorConsoleViewModel.java | 34 +- .../gui/errorconsole/LogEventViewModel.java | 3 +- .../exporter/CreateModifyExporterDialog.fxml | 100 +- .../CreateModifyExporterDialogView.java | 29 +- .../CreateModifyExporterDialogViewModel.java | 17 +- .../jabref/gui/exporter/ExportCommand.java | 79 +- .../gui/exporter/ExportToClipboardAction.java | 64 +- .../gui/exporter/ExporterViewModel.java | 1 - .../org/jabref/gui/exporter/SaveAction.java | 22 +- .../jabref/gui/exporter/SaveAllAction.java | 3 +- .../gui/exporter/SaveDatabaseAction.java | 125 +- .../WriteMetadataToLinkedPdfsAction.java | 76 +- .../externalfiles/AutoLinkFilesAction.java | 24 +- .../externalfiles/AutoSetFileLinksUtil.java | 37 +- .../jabref/gui/externalfiles/DateRange.java | 8 +- .../externalfiles/DownloadFullTextAction.java | 35 +- .../DuplicateDecisionResult.java | 7 +- .../ExternalFilesEntryLinker.java | 29 +- .../externalfiles/FileExtensionViewModel.java | 4 +- .../gui/externalfiles/FileFilterUtils.java | 33 +- .../externalfiles/GitIgnoreFileFilter.java | 34 +- .../gui/externalfiles/ImportHandler.java | 112 +- .../externalfiles/UnlinkedFilesCrawler.java | 26 +- .../externalfiles/UnlinkedFilesDialog.fxml | 178 +- .../UnlinkedFilesDialogView.java | 182 +- .../UnlinkedFilesDialogViewModel.java | 94 +- .../externalfiles/UnlinkedPDFFileFilter.java | 9 +- .../CustomExternalFileType.java | 22 +- .../externalfiletype/ExternalFileType.java | 8 +- .../externalfiletype/ExternalFileTypes.java | 38 +- .../StandardExternalFileType.java | 61 +- .../fieldeditors/AbstractEditorViewModel.java | 46 +- .../gui/fieldeditors/CitationKeyEditor.fxml | 14 +- .../gui/fieldeditors/CitationKeyEditor.java | 38 +- .../CitationKeyEditorViewModel.java | 18 +- .../jabref/gui/fieldeditors/DateEditor.fxml | 15 +- .../jabref/gui/fieldeditors/DateEditor.java | 27 +- .../gui/fieldeditors/DateEditorViewModel.java | 7 +- .../EditorTypeEditorViewModel.java | 6 +- .../gui/fieldeditors/FieldEditorFX.java | 9 +- .../jabref/gui/fieldeditors/FieldEditors.java | 69 +- .../gui/fieldeditors/FieldNameLabel.java | 96 +- .../fieldeditors/GenderEditorViewModel.java | 6 +- .../jabref/gui/fieldeditors/GroupEditor.java | 26 +- .../jabref/gui/fieldeditors/ISSNEditor.fxml | 47 +- .../jabref/gui/fieldeditors/ISSNEditor.java | 51 +- .../gui/fieldeditors/ISSNEditorViewModel.java | 12 +- .../gui/fieldeditors/JournalEditor.fxml | 24 +- .../gui/fieldeditors/JournalEditor.java | 44 +- .../JournalInfoOptInDialogHelper.java | 26 +- .../gui/fieldeditors/KeywordsEditor.java | 11 +- .../gui/fieldeditors/LinkedEntriesEditor.fxml | 11 +- .../gui/fieldeditors/LinkedEntriesEditor.java | 82 +- .../LinkedEntriesEditorViewModel.java | 10 +- .../gui/fieldeditors/LinkedFileViewModel.java | 273 +- .../gui/fieldeditors/LinkedFilesEditor.fxml | 48 +- .../gui/fieldeditors/LinkedFilesEditor.java | 180 +- .../LinkedFilesEditorViewModel.java | 131 +- .../fieldeditors/MapBasedEditorViewModel.java | 18 +- .../fieldeditors/MonthEditorViewModel.java | 7 +- .../jabref/gui/fieldeditors/OptionEditor.fxml | 16 +- .../jabref/gui/fieldeditors/OptionEditor.java | 16 +- .../fieldeditors/OptionEditorViewModel.java | 6 +- .../jabref/gui/fieldeditors/OwnerEditor.fxml | 18 +- .../jabref/gui/fieldeditors/OwnerEditor.java | 28 +- .../fieldeditors/OwnerEditorViewModel.java | 11 +- .../PaginationEditorViewModel.java | 6 +- .../PatentTypeEditorViewModel.java | 6 +- .../gui/fieldeditors/PersonsEditor.java | 25 +- .../fieldeditors/PersonsEditorViewModel.java | 7 +- .../jabref/gui/fieldeditors/PopOverUtil.java | 11 +- .../jabref/gui/fieldeditors/SimpleEditor.java | 33 +- .../fieldeditors/SimpleEditorViewModel.java | 6 +- .../TextInputControlBehavior.java | 8 +- .../gui/fieldeditors/TypeEditorViewModel.java | 6 +- .../org/jabref/gui/fieldeditors/URLUtil.java | 3 +- .../jabref/gui/fieldeditors/UrlEditor.fxml | 21 +- .../jabref/gui/fieldeditors/UrlEditor.java | 35 +- .../gui/fieldeditors/UrlEditorViewModel.java | 16 +- .../WriteMetadataToSinglePdfAction.java | 83 +- .../fieldeditors/YesNoEditorViewModel.java | 6 +- .../fieldeditors/contextmenu/DefaultMenu.java | 16 +- .../contextmenu/EditorContextAction.java | 35 +- .../fieldeditors/contextmenu/EditorMenus.java | 16 +- .../contextmenu/ProtectedTermsMenu.java | 22 +- .../BaseIdentifierEditorViewModel.java | 43 +- .../DoiIdentifierEditorViewModel.java | 59 +- .../EprintIdentifierEditorViewModel.java | 28 +- .../ISBNIdentifierEditorViewModel.java | 36 +- .../identifier/IdentifierEditor.fxml | 42 +- .../fieldeditors/journalinfo/JournalInfo.fxml | 256 +- .../journalinfo/JournalInfoView.java | 52 +- .../journalinfo/JournalInfoViewModel.java | 26 +- .../jabref/gui/groups/GroupDescriptions.java | 15 +- .../org/jabref/gui/groups/GroupDialog.fxml | 206 +- .../jabref/gui/groups/GroupDialogHeader.java | 3 +- .../jabref/gui/groups/GroupDialogView.java | 171 +- .../gui/groups/GroupDialogViewModel.java | 135 +- .../jabref/gui/groups/GroupNodeViewModel.java | 158 +- .../gui/groups/GroupTreeNodeViewModel.java | 28 +- .../org/jabref/gui/groups/GroupTreeView.java | 332 +- .../jabref/gui/groups/GroupTreeViewModel.java | 211 +- .../org/jabref/gui/groups/GroupViewMode.java | 6 +- .../jabref/gui/groups/GroupsPreferences.java | 9 +- .../gui/groups/UndoableAddOrRemoveGroup.java | 15 +- .../groups/UndoableChangeEntriesOfGroup.java | 3 +- .../gui/groups/UndoableModifySubtree.java | 9 +- .../java/org/jabref/gui/help/AboutDialog.fxml | 135 +- .../org/jabref/gui/help/AboutDialogView.java | 26 +- .../jabref/gui/help/AboutDialogViewModel.java | 26 +- .../org/jabref/gui/help/NewVersionDialog.java | 18 +- .../gui/help/SearchForUpdateAction.java | 12 +- .../org/jabref/gui/help/VersionWorker.java | 33 +- .../java/org/jabref/gui/icon/IconTheme.java | 51 +- .../gui/icon/InternalMaterialDesignIcon.java | 8 +- .../org/jabref/gui/icon/JabRefIconView.java | 1 + .../gui/icon/JabRefMaterialDesignIcon.java | 1 - .../BibEntryTypePrefsAndFileViewModel.java | 7 +- .../importer/GenerateEntryFromIdAction.java | 40 +- .../importer/GenerateEntryFromIdDialog.fxml | 56 +- .../importer/GenerateEntryFromIdDialog.java | 27 +- .../gui/importer/GrobidOptInDialogHelper.java | 3 +- .../jabref/gui/importer/ImportCommand.java | 109 +- .../ImportCustomEntryTypesDialog.fxml | 21 +- .../ImportCustomEntryTypesDialog.java | 36 +- ...ImportCustomEntryTypesDialogViewModel.java | 12 +- .../gui/importer/ImportEntriesDialog.fxml | 79 +- .../gui/importer/ImportEntriesDialog.java | 110 +- .../gui/importer/ImportEntriesViewModel.java | 164 +- .../jabref/gui/importer/NewEntryAction.java | 19 +- .../importer/ParserResultWarningDialog.java | 10 +- .../actions/CheckForNewEntryTypesAction.java | 15 +- .../actions/MergeReviewIntoCommentAction.java | 5 +- ...geReviewIntoCommentConfirmationDialog.java | 18 +- .../importer/actions/OpenDatabaseAction.java | 119 +- .../fetcher/LookupIdentifierAction.java | 38 +- .../importer/fetcher/WebSearchPaneView.java | 27 +- .../fetcher/WebSearchPaneViewModel.java | 81 +- .../gui/integrity/IntegrityCheckAction.java | 23 +- .../gui/integrity/IntegrityCheckDialog.fxml | 56 +- .../gui/integrity/IntegrityCheckDialog.java | 51 +- .../jabref/gui/journals/AbbreviateAction.java | 69 +- .../gui/journals/UndoableAbbreviator.java | 5 +- .../gui/journals/UndoableUnabbreviator.java | 3 +- .../gui/keyboard/CodeAreaKeyBindings.java | 1 - .../org/jabref/gui/keyboard/KeyBinding.java | 237 +- .../gui/keyboard/KeyBindingCategory.java | 1 - .../gui/keyboard/KeyBindingRepository.java | 9 +- .../gui/keyboard/TextInputKeyBindings.java | 18 +- .../AbstractPropertiesTabView.java | 6 +- .../libraryproperties/LibraryProperties.fxml | 21 +- .../LibraryPropertiesAction.java | 3 +- .../LibraryPropertiesView.java | 18 +- .../LibraryPropertiesViewModel.java | 3 +- .../constants/ConstantsItemModel.java | 5 +- .../constants/ConstantsProperties.fxml | 64 +- .../constants/ConstantsPropertiesView.java | 50 +- .../ConstantsPropertiesViewModel.java | 24 +- .../contentselectors/ContentSelector.fxml | 65 +- .../contentselectors/ContentSelectorView.java | 38 +- .../ContentSelectorViewModel.java | 40 +- .../general/GeneralProperties.fxml | 116 +- .../general/GeneralPropertiesView.java | 30 +- .../general/GeneralPropertiesViewModel.java | 61 +- .../keypattern/KeyPatternProperties.fxml | 33 +- .../keypattern/KeyPatternPropertiesView.java | 39 +- .../KeyPatternPropertiesViewModel.java | 11 +- .../preamble/PreambleProperties.fxml | 18 +- .../preamble/PreamblePropertiesView.java | 10 +- .../preamble/PreamblePropertiesViewModel.java | 5 +- .../saving/SavingProperties.fxml | 29 +- .../saving/SavingPropertiesView.java | 21 +- .../saving/SavingPropertiesViewModel.java | 61 +- .../gui/linkedfile/AttachFileAction.java | 34 +- .../linkedfile/AttachFileFromURLAction.java | 16 +- .../gui/linkedfile/DeleteFileAction.java | 51 +- .../gui/linkedfile/LinkedFileEditDialog.fxml | 67 +- .../linkedfile/LinkedFileEditDialogView.java | 28 +- .../LinkedFilesEditDialogViewModel.java | 24 +- .../org/jabref/gui/logging/GuiWriter.java | 6 +- .../gui/maintable/BibEntryTableViewModel.java | 48 +- .../org/jabref/gui/maintable/CellFactory.java | 18 +- .../gui/maintable/ColumnPreferences.java | 3 +- .../org/jabref/gui/maintable/MainTable.java | 157 +- .../gui/maintable/MainTableColumnFactory.java | 57 +- .../gui/maintable/MainTableColumnModel.java | 7 +- .../gui/maintable/MainTableDataModel.java | 25 +- .../MainTableFieldValueFormatter.java | 16 +- .../maintable/MainTableHeaderContextMenu.java | 15 +- .../gui/maintable/MainTablePreferences.java | 5 +- .../gui/maintable/NameDisplayPreferences.java | 12 +- .../gui/maintable/OpenExternalFileAction.java | 48 +- .../gui/maintable/OpenFolderAction.java | 65 +- .../jabref/gui/maintable/OpenUrlAction.java | 9 +- .../PersistenceVisualStateTable.java | 13 +- .../jabref/gui/maintable/RightClickMenu.java | 355 ++- .../maintable/SearchShortScienceAction.java | 11 +- .../SmartConstrainedResizePolicy.java | 32 +- .../gui/maintable/columns/FileColumn.java | 59 +- .../gui/maintable/columns/LibraryColumn.java | 5 +- .../columns/LinkedIdentifierColumn.java | 30 +- .../maintable/columns/SpecialFieldColumn.java | 34 +- .../gui/menus/ChangeEntryTypeAction.java | 3 +- .../jabref/gui/menus/ChangeEntryTypeMenu.java | 60 +- .../org/jabref/gui/menus/FileHistoryMenu.java | 11 +- .../gui/mergeentries/DiffHighlighting.java | 26 +- .../DiffHighlightingEllipsingTextFlow.java | 40 +- .../org/jabref/gui/mergeentries/DiffMode.java | 1 - .../gui/mergeentries/EntriesMergeResult.java | 8 +- .../gui/mergeentries/FetchAndMergeEntry.java | 114 +- .../gui/mergeentries/MergeEntriesAction.java | 13 +- .../gui/mergeentries/MergeEntriesDialog.java | 7 +- .../jabref/gui/mergeentries/MergeResult.java | 5 +- .../mergeentries/MergeTwoEntriesAction.java | 6 +- .../MergeWithFetchedEntryAction.java | 25 +- .../gui/mergeentries/MultiMergeEntries.fxml | 102 +- .../mergeentries/MultiMergeEntriesView.java | 129 +- .../MultiMergeEntriesViewModel.java | 10 +- .../newmergedialog/FieldRowView.java | 17 +- .../newmergedialog/FieldRowViewModel.java | 10 +- .../newmergedialog/GroupDiffMode.java | 2 +- .../PersonsNameFieldRowView.java | 13 +- .../newmergedialog/ShowDiffConfig.java | 5 +- .../ThreeWayMergeHeaderView.java | 10 +- .../newmergedialog/ThreeWayMergeView.java | 70 +- .../ThreeWayMergeViewModel.java | 5 +- .../newmergedialog/cell/FieldValueCell.java | 19 +- .../newmergedialog/cell/HeaderCell.java | 3 +- .../newmergedialog/cell/MergedFieldCell.java | 6 +- .../cell/OpenExternalLinkAction.java | 9 +- .../cell/sidebuttons/InfoButton.java | 15 +- .../sidebuttons/ToggleMergeUnmergeButton.java | 3 +- .../diffhighlighter/DiffHighlighter.java | 17 +- .../diffhighlighter/SplitDiffHighlighter.java | 32 +- .../UnifiedDiffHighlighter.java | 16 +- .../fieldsmerger/FieldMergerFactory.java | 8 +- .../fieldsmerger/GroupMerger.java | 4 +- .../toolbar/ThreeWayMergeToolbar.fxml | 128 +- .../toolbar/ThreeWayMergeToolbar.java | 36 +- .../gui/openoffice/AdvancedCiteDialog.fxml | 39 +- .../openoffice/AdvancedCiteDialogView.java | 20 +- .../org/jabref/gui/openoffice/Bootstrap.java | 60 +- .../openoffice/CitationEntryViewModel.java | 5 +- .../DetectOpenOfficeInstallation.java | 6 +- .../gui/openoffice/ManageCitationsDialog.fxml | 32 +- .../openoffice/ManageCitationsDialogView.java | 25 +- .../ManageCitationsDialogViewModel.java | 7 +- .../org/jabref/gui/openoffice/OOBibBase.java | 199 +- .../gui/openoffice/OOBibBaseConnect.java | 57 +- .../org/jabref/gui/openoffice/OOError.java | 20 +- .../gui/openoffice/OpenOfficePanel.java | 193 +- .../gui/openoffice/StyleSelectDialog.fxml | 62 +- .../gui/openoffice/StyleSelectDialogView.java | 64 +- .../StyleSelectDialogViewModel.java | 30 +- .../openoffice/StyleSelectItemViewModel.java | 3 +- .../AbstractPreferenceTabView.java | 14 +- .../gui/preferences/PreferencesDialog.fxml | 106 +- .../preferences/PreferencesDialogView.java | 38 +- .../PreferencesDialogViewModel.java | 64 +- .../preferences/PreferencesFilterDialog.fxml | 40 +- .../preferences/PreferencesFilterDialog.java | 47 +- .../preferences/PreferencesSearchHandler.java | 6 +- .../autocompletion/AutoCompletionTab.fxml | 78 +- .../autocompletion/AutoCompletionTab.java | 35 +- .../AutoCompletionTabViewModel.java | 4 +- .../CitationKeyPatternTab.fxml | 81 +- .../CitationKeyPatternTab.java | 60 +- .../CitationKeyPatternTabViewModel.java | 18 +- .../customentrytypes/CustomEntryTypesTab.fxml | 126 +- .../customentrytypes/CustomEntryTypesTab.java | 128 +- .../CustomEntryTypesTabViewModel.java | 55 +- .../customentrytypes/EntryTypeViewModel.java | 13 +- .../customentrytypes/FieldViewModel.java | 5 +- .../customexporter/CustomExporterTab.fxml | 54 +- .../customexporter/CustomExporterTab.java | 23 +- .../CustomExporterTabViewModel.java | 14 +- .../customimporter/CustomImporterTab.fxml | 48 +- .../customimporter/CustomImporterTab.java | 32 +- .../CustomImporterTabViewModel.java | 55 +- .../gui/preferences/entry/EntryTab.fxml | 79 +- .../gui/preferences/entry/EntryTab.java | 46 +- .../preferences/entry/EntryTabViewModel.java | 16 +- .../entryeditor/EntryEditorTab.fxml | 78 +- .../entryeditor/EntryEditorTab.java | 62 +- .../entryeditor/EntryEditorTabViewModel.java | 13 +- .../gui/preferences/export/ExportTab.fxml | 18 +- .../gui/preferences/export/ExportTab.java | 7 +- .../export/ExportTabViewModel.java | 17 +- .../gui/preferences/external/ExternalTab.fxml | 196 +- .../gui/preferences/external/ExternalTab.java | 76 +- .../external/ExternalTabViewModel.java | 59 +- .../EditExternalFileTypeEntryDialog.fxml | 129 +- .../EditExternalFileTypeEntryDialog.java | 51 +- .../EditExternalFileTypeViewModel.java | 7 +- .../ExternalFileTypesTab.fxml | 68 +- .../ExternalFileTypesTab.java | 53 +- .../ExternalFileTypesTabViewModel.java | 18 +- .../gui/preferences/general/GeneralTab.fxml | 209 +- .../gui/preferences/general/GeneralTab.java | 123 +- .../general/GeneralTabViewModel.java | 65 +- .../gui/preferences/groups/GroupsTab.fxml | 38 +- .../gui/preferences/groups/GroupsTab.java | 19 +- .../groups/GroupsTabViewModel.java | 3 +- .../journals/AbbreviationViewModel.java | 12 +- .../journals/AbbreviationsFileViewModel.java | 15 +- .../journals/JournalAbbreviationsTab.fxml | 130 +- .../journals/JournalAbbreviationsTab.java | 120 +- .../JournalAbbreviationsTabViewModel.java | 66 +- .../keybindings/KeyBindingViewModel.java | 12 +- .../keybindings/KeyBindingsTab.fxml | 56 +- .../keybindings/KeyBindingsTab.java | 63 +- .../keybindings/KeyBindingsTabViewModel.java | 25 +- .../linkedfiles/LinkedFilesTab.fxml | 128 +- .../linkedfiles/LinkedFilesTab.java | 61 +- .../linkedfiles/LinkedFilesTabViewModel.java | 49 +- .../nameformatter/NameFormatterTab.fxml | 74 +- .../nameformatter/NameFormatterTab.java | 50 +- .../NameFormatterTabViewModel.java | 7 +- .../network/CustomCertificateViewModel.java | 9 +- .../gui/preferences/network/NetworkTab.fxml | 154 +- .../gui/preferences/network/NetworkTab.java | 113 +- .../network/NetworkTabViewModel.java | 67 +- .../gui/preferences/preview/PreviewTab.fxml | 128 +- .../gui/preferences/preview/PreviewTab.java | 215 +- .../preview/PreviewTabViewModel.java | 145 +- .../NewProtectedTermsFileDialog.java | 24 +- .../protectedterms/ProtectedTermsTab.fxml | 61 +- .../protectedterms/ProtectedTermsTab.java | 68 +- .../ProtectedTermsTabViewModel.java | 47 +- .../gui/preferences/table/TableTab.fxml | 171 +- .../gui/preferences/table/TableTab.java | 84 +- .../preferences/table/TableTabViewModel.java | 58 +- .../preferences/websearch/WebSearchTab.fxml | 107 +- .../preferences/websearch/WebSearchTab.java | 83 +- .../websearch/WebSearchTabViewModel.java | 54 +- .../gui/preferences/xmp/XmpPrivacyTab.fxml | 62 +- .../gui/preferences/xmp/XmpPrivacyTab.java | 34 +- .../xmp/XmpPrivacyTabViewModel.java | 19 +- .../gui/preview/CopyCitationAction.java | 56 +- .../org/jabref/gui/preview/PreviewPanel.java | 41 +- .../org/jabref/gui/preview/PreviewViewer.java | 85 +- .../gui/push/AbstractPushToApplication.java | 34 +- .../jabref/gui/push/PushToApplication.java | 3 +- .../gui/push/PushToApplicationCommand.java | 39 +- .../gui/push/PushToApplicationSettings.java | 17 +- .../jabref/gui/push/PushToApplications.java | 13 +- .../java/org/jabref/gui/push/PushToEmacs.java | 42 +- .../jabref/gui/push/PushToEmacsSettings.java | 9 +- .../java/org/jabref/gui/push/PushToLyx.java | 18 +- .../jabref/gui/push/PushToLyxSettings.java | 9 +- .../jabref/gui/push/PushToSublimeText.java | 19 +- .../org/jabref/gui/push/PushToTeXstudio.java | 4 +- .../org/jabref/gui/push/PushToTexShop.java | 19 +- .../java/org/jabref/gui/push/PushToVim.java | 31 +- .../jabref/gui/push/PushToVimSettings.java | 9 +- .../org/jabref/gui/push/PushToWinEdt.java | 5 +- .../jabref/gui/remote/CLIMessageHandler.java | 8 +- .../jabref/gui/search/GlobalSearchBar.java | 85 +- .../gui/search/GlobalSearchResultDialog.fxml | 33 +- .../gui/search/GlobalSearchResultDialog.java | 66 +- .../RebuildFulltextSearchIndexAction.java | 24 +- .../jabref/gui/search/SearchDisplayMode.java | 1 - .../gui/search/SearchFieldRightClickMenu.java | 61 +- .../jabref/gui/search/SearchResultsTable.java | 45 +- .../search/SearchResultsTableDataModel.java | 17 +- ...tainsAndRegexBasedSearchRuleDescriber.java | 17 +- .../GrammarBasedSearchRuleDescriber.java | 41 +- .../rules/describer/SearchDescribers.java | 15 +- .../shared/PullChangesFromSharedAction.java | 3 +- .../gui/shared/SharedDatabaseLoginDialog.fxml | 238 +- .../shared/SharedDatabaseLoginDialogView.java | 116 +- .../SharedDatabaseLoginDialogViewModel.java | 93 +- .../gui/shared/SharedDatabaseUIManager.java | 71 +- .../gui/sidepane/GroupsSidePaneComponent.java | 13 +- .../org/jabref/gui/sidepane/SidePane.java | 31 +- .../gui/sidepane/SidePaneComponent.java | 11 +- .../gui/sidepane/SidePaneContentFactory.java | 51 +- .../gui/sidepane/SidePaneViewModel.java | 42 +- .../jabref/gui/sidepane/TogglePaneAction.java | 4 +- .../gui/slr/EditExistingStudyAction.java | 6 +- .../gui/slr/ExistingStudySearchAction.java | 33 +- .../gui/slr/ManageStudyDefinitionView.java | 137 +- .../slr/ManageStudyDefinitionViewModel.java | 82 +- .../jabref/gui/slr/StartNewStudyAction.java | 22 +- .../org/jabref/gui/slr/StudyCatalogItem.java | 5 +- .../gui/specialfields/SpecialFieldAction.java | 22 +- .../SpecialFieldMenuItemFactory.java | 61 +- .../specialfields/SpecialFieldViewModel.java | 16 +- .../gui/texparser/CitationsDisplay.java | 10 +- .../gui/texparser/ParseLatexDialog.fxml | 47 +- .../gui/texparser/ParseLatexDialogView.java | 75 +- .../texparser/ParseLatexDialogViewModel.java | 99 +- .../gui/texparser/ParseLatexResult.fxml | 29 +- .../gui/texparser/ParseLatexResultView.java | 24 +- .../texparser/ParseLatexResultViewModel.java | 13 +- .../gui/texparser/ReferenceViewModel.java | 7 +- .../java/org/jabref/gui/theme/StyleSheet.java | 17 +- .../jabref/gui/theme/StyleSheetDataUrl.java | 3 +- .../org/jabref/gui/theme/StyleSheetFile.java | 3 +- src/main/java/org/jabref/gui/theme/Theme.java | 11 +- .../org/jabref/gui/theme/ThemeManager.java | 84 +- .../java/org/jabref/gui/theme/ThemeTypes.java | 21 +- .../jabref/gui/undo/CountingUndoManager.java | 14 +- .../org/jabref/gui/undo/UndoRedoAction.java | 3 +- .../jabref/gui/undo/UndoableChangeType.java | 8 +- .../jabref/gui/undo/UndoableFieldChange.java | 4 +- .../gui/undo/UndoableInsertEntries.java | 6 +- .../jabref/gui/undo/UndoableKeyChange.java | 3 +- .../gui/undo/UndoablePreambleChange.java | 3 +- .../gui/undo/UndoableRemoveEntries.java | 6 +- .../jabref/gui/undo/UndoableStringChange.java | 9 +- .../org/jabref/gui/util/BackgroundTask.java | 11 +- .../java/org/jabref/gui/util/BaseDialog.java | 6 +- .../org/jabref/gui/util/BindingsHelper.java | 75 +- .../java/org/jabref/gui/util/ColorUtil.java | 15 +- .../org/jabref/gui/util/ControlHelper.java | 28 +- .../jabref/gui/util/CustomLocalDragboard.java | 3 +- .../jabref/gui/util/CustomTitledPaneSkin.java | 79 +- .../gui/util/DefaultFileUpdateMonitor.java | 13 +- .../jabref/gui/util/DefaultTaskExecutor.java | 7 +- .../java/org/jabref/gui/util/FieldsUtil.java | 4 +- .../gui/util/FileDialogConfiguration.java | 21 +- .../jabref/gui/util/FileFilterConverter.java | 42 +- .../jabref/gui/util/FileNodeViewModel.java | 30 +- .../org/jabref/gui/util/NoSelectionModel.java | 33 +- .../jabref/gui/util/OnlyIntegerFormatter.java | 2 +- .../jabref/gui/util/RecursiveTreeItem.java | 20 +- .../org/jabref/gui/util/TextFlowLimited.java | 3 +- .../org/jabref/gui/util/TooltipTextUtil.java | 9 +- .../gui/util/ValueTableCellFactory.java | 11 +- .../gui/util/ViewModelListCellFactory.java | 31 +- .../gui/util/ViewModelTableRowFactory.java | 9 +- ...extFieldTableCellVisualizationFactory.java | 30 +- .../gui/util/ViewModelTreeCellFactory.java | 21 +- .../util/ViewModelTreeTableRowFactory.java | 41 +- .../org/jabref/gui/util/ZipFileChooser.java | 19 +- .../component/TemporalAccessorPicker.java | 12 +- .../java/org/jabref/http/dto/BibEntryDTO.java | 34 +- .../java/org/jabref/http/dto/GsonFactory.java | 7 +- .../jabref/http/server/LibrariesResource.java | 6 +- .../jabref/http/server/LibraryResource.java | 28 +- .../java/org/jabref/http/server/Server.java | 46 +- .../WatchServiceUnavailableException.java | 3 +- .../logic/auxparser/DefaultAuxParser.java | 10 +- .../jabref/logic/bibtex/BibEntryWriter.java | 51 +- .../jabref/logic/bibtex/FieldPreferences.java | 4 +- .../org/jabref/logic/bibtex/FieldWriter.java | 34 +- .../jabref/logic/bibtex/FileFieldWriter.java | 11 +- .../bibtex/comparator/BibDatabaseDiff.java | 13 +- .../bibtex/comparator/BibStringDiff.java | 10 +- .../bibtex/comparator/FieldComparator.java | 6 +- .../logic/bibtex/comparator/MetaDataDiff.java | 52 +- .../org/jabref/logic/bst/BstFunctions.java | 113 +- .../jabref/logic/bst/BstPreviewLayout.java | 6 +- src/main/java/org/jabref/logic/bst/BstVM.java | 9 +- .../org/jabref/logic/bst/BstVMContext.java | 24 +- .../org/jabref/logic/bst/BstVMVisitor.java | 81 +- .../jabref/logic/bst/util/BstCaseChanger.java | 21 +- .../logic/bst/util/BstNameFormatter.java | 53 +- .../jabref/logic/bst/util/BstPurifier.java | 3 +- .../logic/bst/util/BstTextPrefixer.java | 3 +- .../logic/bst/util/BstWidthCalculator.java | 6 +- .../citationkeypattern/BracketedPattern.java | 313 +- .../CitationKeyGenerator.java | 35 +- .../CitationKeyPatternPreferences.java | 53 +- .../logic/citationstyle/CSLAdapter.java | 12 +- .../logic/citationstyle/CitationStyle.java | 13 +- .../citationstyle/CitationStyleCache.java | 22 +- .../citationstyle/CitationStyleGenerator.java | 50 +- .../CitationStyleOutputFormat.java | 1 - .../CitationStylePreviewLayout.java | 7 +- .../citationstyle/JabRefItemDataProvider.java | 35 +- .../jabref/logic/cleanup/CleanupWorker.java | 50 +- .../cleanup/ConvertToBiblatexCleanup.java | 6 +- .../logic/cleanup/ConvertToBibtexCleanup.java | 8 +- .../org/jabref/logic/cleanup/DoiCleanup.java | 25 +- .../jabref/logic/cleanup/EprintCleanup.java | 21 +- .../logic/cleanup/FieldFormatterCleanups.java | 23 +- .../logic/cleanup/MoveFieldCleanup.java | 4 +- .../logic/cleanup/RelativePathsCleanup.java | 7 +- .../logic/cleanup/RenamePdfCleanup.java | 3 +- .../cleanup/TimeStampToCreationDate.java | 12 +- .../cleanup/TimeStampToModificationDate.java | 15 +- .../org/jabref/logic/cleanup/URLCleanup.java | 9 +- .../org/jabref/logic/crawler/Crawler.java | 21 +- .../StudyCatalogToFetcherConverter.java | 22 +- .../jabref/logic/crawler/StudyFetcher.java | 13 +- .../jabref/logic/crawler/StudyRepository.java | 91 +- .../jabref/logic/crawler/StudyYamlParser.java | 5 +- .../jabref/logic/database/DatabaseMerger.java | 33 +- .../jabref/logic/database/DuplicateCheck.java | 68 +- .../exporter/AtomicFileOutputStream.java | 35 +- .../logic/exporter/BibDatabaseWriter.java | 58 +- .../logic/exporter/BibtexDatabaseWriter.java | 46 +- .../exporter/EmbeddedBibFilePdfExporter.java | 11 +- .../org/jabref/logic/exporter/Exporter.java | 51 +- .../logic/exporter/ExporterFactory.java | 134 +- .../logic/exporter/GroupSerializer.java | 78 +- .../jabref/logic/exporter/MSBibExporter.java | 4 +- .../logic/exporter/MetaDataSerializer.java | 70 +- .../jabref/logic/exporter/ModsExporter.java | 18 +- .../jabref/logic/exporter/OOCalcDatabase.java | 14 +- .../exporter/OpenDocumentRepresentation.java | 26 +- .../OpenDocumentSpreadsheetCreator.java | 4 +- .../exporter/OpenOfficeDocumentCreator.java | 8 +- .../logic/exporter/SaveConfiguration.java | 11 +- .../jabref/logic/exporter/SaveException.java | 4 +- .../logic/exporter/TemplateExporter.java | 86 +- .../jabref/logic/exporter/XmpExporter.java | 3 +- .../jabref/logic/exporter/XmpPdfExporter.java | 3 +- .../ExternalFilesContentImporter.java | 2 +- .../externalfiles/LinkedFileHandler.java | 35 +- .../jabref/logic/formatter/Formatters.java | 12 +- .../bibtexfields/CleanupUrlFormatter.java | 14 +- .../EscapeAmpersandsFormatter.java | 4 +- .../bibtexfields/HtmlToLatexFormatter.java | 12 +- .../bibtexfields/LatexCleanupFormatter.java | 22 +- .../OrdinalsToSuperscriptFormatter.java | 4 +- .../bibtexfields/RegexFormatter.java | 4 +- .../bibtexfields/RemoveBracesFormatter.java | 5 +- .../bibtexfields/ShortenDOIFormatter.java | 24 +- .../bibtexfields/UnicodeToLatexFormatter.java | 10 +- .../bibtexfields/UnitsToLatexFormatter.java | 18 +- .../casechanger/ProtectTermsFormatter.java | 9 +- .../casechanger/SentenceCaseFormatter.java | 6 +- .../casechanger/TitleCaseFormatter.java | 3 +- .../casechanger/UnprotectTermsFormatter.java | 6 +- .../casechanger/UpperCaseFormatter.java | 3 +- .../logic/formatter/casechanger/Word.java | 47 +- .../java/org/jabref/logic/git/GitHandler.java | 68 +- .../org/jabref/logic/git/SlrGitHandler.java | 3 +- .../logic/groups/DefaultGroupsFactory.java | 3 +- .../logic/importer/AuthorListParser.java | 55 +- .../logic/importer/CompositeIdFetcher.java | 6 +- .../logic/importer/FulltextFetchers.java | 31 +- .../logic/importer/IdBasedParserFetcher.java | 8 +- .../logic/importer/ImportCleanupBiblatex.java | 4 +- .../importer/ImportFormatPreferences.java | 3 +- .../logic/importer/ImportFormatReader.java | 27 +- .../org/jabref/logic/importer/Importer.java | 7 +- .../logic/importer/ImporterPreferences.java | 28 +- .../jabref/logic/importer/OpenDatabase.java | 15 +- .../PagedSearchBasedParserFetcher.java | 6 +- .../jabref/logic/importer/ParserResult.java | 8 +- .../jabref/logic/importer/QueryParser.java | 6 +- .../logic/importer/fetcher/ArXivFetcher.java | 205 +- .../fetcher/AstrophysicsDataSystem.java | 48 +- .../importer/fetcher/BibsonomyScraper.java | 11 +- .../importer/fetcher/BiodiversityLibrary.java | 24 +- .../logic/importer/fetcher/BvbFetcher.java | 4 +- .../logic/importer/fetcher/CiteSeer.java | 24 +- ...fComputerScienceBibliographiesFetcher.java | 55 +- ...OfComputerScienceBibliographiesParser.java | 15 +- .../importer/fetcher/ComplexSearchQuery.java | 88 +- .../fetcher/CompositeSearchBasedFetcher.java | 37 +- .../logic/importer/fetcher/CrossRef.java | 79 +- .../logic/importer/fetcher/DBLPFetcher.java | 15 +- .../logic/importer/fetcher/DOABFetcher.java | 48 +- .../logic/importer/fetcher/DOAJFetcher.java | 31 +- .../jabref/logic/importer/fetcher/DiVA.java | 3 +- .../logic/importer/fetcher/DoiFetcher.java | 24 +- .../logic/importer/fetcher/DoiResolution.java | 16 +- .../logic/importer/fetcher/GoogleScholar.java | 29 +- .../fetcher/GrobidCitationFetcher.java | 13 +- .../importer/fetcher/GrobidPreferences.java | 4 +- .../logic/importer/fetcher/GvkFetcher.java | 17 +- .../jabref/logic/importer/fetcher/IEEE.java | 77 +- .../importer/fetcher/INSPIREFetcher.java | 9 +- .../importer/fetcher/IacrEprintFetcher.java | 9 +- .../logic/importer/fetcher/IssnFetcher.java | 15 +- .../fetcher/JournalInformationFetcher.java | 21 +- .../logic/importer/fetcher/JstorFetcher.java | 12 +- .../logic/importer/fetcher/LOBIDFetcher.java | 48 +- .../importer/fetcher/LibraryOfCongress.java | 3 +- .../logic/importer/fetcher/MathSciNet.java | 27 +- .../importer/fetcher/MedlineFetcher.java | 25 +- .../jabref/logic/importer/fetcher/Medra.java | 22 +- .../logic/importer/fetcher/MrDLibFetcher.java | 6 +- .../logic/importer/fetcher/OpenAccessDoi.java | 37 +- .../logic/importer/fetcher/ResearchGate.java | 51 +- .../logic/importer/fetcher/RfcFetcher.java | 5 +- .../fetcher/ScholarArchiveFetcher.java | 22 +- .../logic/importer/fetcher/ScienceDirect.java | 31 +- .../importer/fetcher/SemanticScholar.java | 41 +- .../importer/fetcher/SpringerFetcher.java | 43 +- .../logic/importer/fetcher/SpringerLink.java | 12 +- .../jabref/logic/importer/fetcher/ZbMATH.java | 30 +- .../DoiToBibtexConverterComIsbnFetcher.java | 20 +- .../isbntobibtex/EbookDeIsbnFetcher.java | 12 +- .../fetcher/isbntobibtex/IsbnFetcher.java | 3 +- .../isbntobibtex/OpenLibraryIsbnFetcher.java | 55 +- .../AbstractQueryTransformer.java | 6 +- .../CiteSeerQueryTransformer.java | 18 +- .../ScholarArchiveQueryTransformer.java | 4 - .../transformers/ScholarQueryTransformer.java | 3 +- .../importer/fileformat/ACMPortalParser.java | 27 +- .../fileformat/BiblioscapeImporter.java | 126 +- .../importer/fileformat/BibtexImporter.java | 5 +- .../importer/fileformat/BibtexParser.java | 73 +- .../importer/fileformat/CffImporter.java | 45 +- .../fileformat/CitaviXmlImporter.java | 96 +- .../importer/fileformat/CiteSeerParser.java | 4 +- .../importer/fileformat/CoinsParser.java | 3 +- .../importer/fileformat/CopacImporter.java | 53 +- .../importer/fileformat/CustomImporter.java | 5 +- .../importer/fileformat/EndnoteImporter.java | 46 +- .../fileformat/EndnoteXmlImporter.java | 53 +- .../importer/fileformat/InspecImporter.java | 22 +- .../importer/fileformat/IsiImporter.java | 56 +- .../importer/fileformat/MarcXmlParser.java | 74 +- .../importer/fileformat/MedlineImporter.java | 27 +- .../fileformat/MedlinePlainImporter.java | 34 +- .../importer/fileformat/ModsImporter.java | 34 +- .../importer/fileformat/MrDLibImporter.java | 22 +- .../importer/fileformat/MsBibImporter.java | 16 +- .../importer/fileformat/OvidImporter.java | 19 +- .../fileformat/PdfContentImporter.java | 24 +- .../PdfEmbeddedBibFileImporter.java | 17 +- .../fileformat/PdfGrobidImporter.java | 5 +- .../fileformat/PdfMergeMetadataImporter.java | 36 +- .../PdfVerbatimBibTextImporter.java | 10 +- .../importer/fileformat/PdfXmpImporter.java | 10 +- .../importer/fileformat/PicaXmlParser.java | 30 +- .../importer/fileformat/RepecNepImporter.java | 51 +- .../importer/fileformat/RisImporter.java | 46 +- .../fileformat/SilverPlatterImporter.java | 33 +- .../fileformat/medline/ArticleId.java | 6 +- .../fileformat/medline/Investigator.java | 7 +- .../fileformat/medline/MeshHeading.java | 6 +- .../importer/fileformat/medline/OtherId.java | 6 +- .../medline/PersonalNameSubject.java | 6 +- .../importer/fileformat/mods/Identifier.java | 5 +- .../logic/importer/fileformat/mods/Name.java | 5 +- .../importer/fileformat/mods/RecordInfo.java | 7 +- .../fileformat/mods/package-info.java | 7 +- .../logic/importer/util/FileFieldParser.java | 11 +- .../logic/importer/util/GrobidService.java | 21 +- .../logic/importer/util/GroupsParser.java | 110 +- .../logic/importer/util/MathMLParser.java | 5 +- .../logic/importer/util/MetaDataParser.java | 30 +- .../logic/importer/util/StaxParser.java | 12 +- .../integrity/ASCIICharacterChecker.java | 4 +- .../logic/integrity/AbbreviationChecker.java | 3 +- .../logic/integrity/AmpersandChecker.java | 24 +- .../logic/integrity/BibStringChecker.java | 10 +- .../integrity/BibTeXEntryTypeChecker.java | 9 +- .../logic/integrity/BracesCorrector.java | 3 +- .../CitationKeyDeviationChecker.java | 6 +- .../integrity/DoiDuplicationChecker.java | 14 +- .../logic/integrity/EditionChecker.java | 10 +- .../logic/integrity/EntryLinkChecker.java | 10 +- .../jabref/logic/integrity/FieldChecker.java | 3 +- .../jabref/logic/integrity/FieldCheckers.java | 20 +- .../jabref/logic/integrity/FileChecker.java | 3 +- .../logic/integrity/HTMLCharacterChecker.java | 10 +- .../logic/integrity/HowPublishedChecker.java | 3 +- .../logic/integrity/IntegrityCheck.java | 30 +- .../logic/integrity/IntegrityMessage.java | 6 +- .../JournalInAbbreviationListChecker.java | 3 +- .../integrity/LatexIntegrityChecker.java | 25 +- .../jabref/logic/integrity/MonthChecker.java | 8 +- .../logic/integrity/NoBibtexFieldChecker.java | 27 +- .../jabref/logic/integrity/NoteChecker.java | 3 +- .../jabref/logic/integrity/PagesChecker.java | 21 +- .../logic/integrity/PersonNamesChecker.java | 3 +- .../jabref/logic/integrity/TitleChecker.java | 6 +- .../jabref/logic/integrity/UTF8Checker.java | 4 +- .../jabref/logic/integrity/YearChecker.java | 7 +- .../jabref/logic/journals/Abbreviation.java | 25 +- .../logic/journals/AbbreviationFormat.java | 6 +- .../logic/journals/AbbreviationParser.java | 10 +- .../logic/journals/AbbreviationWriter.java | 8 +- .../journals/JournalAbbreviationLoader.java | 6 +- .../JournalAbbreviationPreferences.java | 3 +- .../JournalAbbreviationRepository.java | 24 +- .../logic/journals/JournalInformation.java | 4 +- .../java/org/jabref/logic/l10n/Encodings.java | 11 +- .../java/org/jabref/logic/l10n/Language.java | 3 +- .../org/jabref/logic/l10n/Localization.java | 23 +- .../jabref/logic/l10n/LocalizationKey.java | 3 +- .../layout/AbstractParamLayoutFormatter.java | 3 +- .../java/org/jabref/logic/layout/Layout.java | 19 +- .../org/jabref/logic/layout/LayoutEntry.java | 82 +- .../layout/LayoutFormatterPreferences.java | 4 +- .../org/jabref/logic/layout/LayoutHelper.java | 28 +- .../logic/layout/TextBasedPreviewLayout.java | 5 +- .../layout/format/AuthorAndsReplacer.java | 29 +- .../jabref/logic/layout/format/Authors.java | 11 +- .../layout/format/CreateBibORDFAuthors.java | 4 +- .../layout/format/DocBookAuthorFormatter.java | 10 +- .../jabref/logic/layout/format/FileLink.java | 4 +- .../jabref/logic/layout/format/HTMLChars.java | 32 +- .../logic/layout/format/Iso690FormatDate.java | 6 +- .../layout/format/Iso690NamesAuthors.java | 8 +- .../logic/layout/format/NameFormatter.java | 3 +- .../jabref/logic/layout/format/Ordinal.java | 13 +- .../jabref/logic/layout/format/RTFChars.java | 14 +- .../format/RemoveLatexCommandsFormatter.java | 6 +- .../logic/layout/format/WrapFileLinks.java | 6 +- .../org/jabref/logic/logging/LogMessages.java | 3 +- .../jabref/logic/msbib/BibTeXConverter.java | 6 +- .../jabref/logic/msbib/MSBibConverter.java | 47 +- .../org/jabref/logic/msbib/MSBibDatabase.java | 4 +- .../org/jabref/logic/msbib/MSBibEntry.java | 14 +- .../org/jabref/logic/msbib/MSBibMapping.java | 3 +- .../org/jabref/logic/msbib/MsBibAuthor.java | 1 - .../jabref/logic/net/ProxyPreferences.java | 15 +- .../org/jabref/logic/net/ProxyRegisterer.java | 3 +- .../org/jabref/logic/net/URLDownload.java | 73 +- .../jabref/logic/net/ssl/SSLCertificate.java | 16 +- .../logic/net/ssl/TrustStoreManager.java | 34 +- .../openoffice/OpenOfficeFileSearch.java | 37 +- .../openoffice/OpenOfficePreferences.java | 11 +- .../logic/openoffice/action/EditInsert.java | 37 +- .../logic/openoffice/action/EditMerge.java | 52 +- .../logic/openoffice/action/EditSeparate.java | 26 +- .../logic/openoffice/action/ExportCited.java | 28 +- .../openoffice/action/ManageCitations.java | 15 +- .../logic/openoffice/action/Update.java | 68 +- .../logic/openoffice/backend/Backend52.java | 161 +- .../logic/openoffice/backend/Codec52.java | 12 +- .../logic/openoffice/backend/GetContext.java | 13 +- .../NamedRangeManagerReferenceMark.java | 27 +- .../backend/NamedRangeReferenceMark.java | 99 +- .../logic/openoffice/frontend/OOFrontend.java | 196 +- .../frontend/RangeForOverlapCheck.java | 8 +- .../frontend/UpdateBibliography.java | 61 +- .../frontend/UpdateCitationMarkers.java | 60 +- .../logic/openoffice/style/OOBibStyle.java | 47 +- .../style/OOBibStyleGetCitationMarker.java | 168 +- .../style/OOBibStyleGetNumCitationMarker.java | 47 +- .../style/OOFormatBibliography.java | 47 +- .../openoffice/style/OOPreFormatter.java | 41 +- .../logic/openoffice/style/OOProcess.java | 20 +- .../style/OOProcessAuthorYearMarkers.java | 10 +- .../style/OOProcessCitationKeyMarkers.java | 10 +- .../style/OOProcessNumericMarkers.java | 3 +- .../logic/openoffice/style/StyleLoader.java | 14 +- .../logic/pdf/EntryAnnotationImporter.java | 13 +- .../jabref/logic/pdf/FileAnnotationCache.java | 25 +- .../logic/pdf/PdfAnnotationImporter.java | 21 +- .../org/jabref/logic/pdf/TextExtractor.java | 4 +- .../pdf/search/indexing/DocumentReader.java | 43 +- .../search/indexing/IndexingTaskManager.java | 10 +- .../logic/pdf/search/indexing/PdfIndexer.java | 27 +- .../pdf/search/retrieval/PdfSearcher.java | 3 +- .../logic/preferences/OwnerPreferences.java | 4 +- .../preferences/TimestampPreferences.java | 7 +- .../protectedterms/ProtectedTermsList.java | 4 +- .../protectedterms/ProtectedTermsLoader.java | 23 +- .../protectedterms/ProtectedTermsParser.java | 7 +- .../ProtectedTermsPreferences.java | 9 +- .../org/jabref/logic/remote/RemoteUtil.java | 3 +- .../logic/remote/client/RemoteClient.java | 4 +- .../remote/server/RemoteListenerServer.java | 3 +- .../server/RemoteListenerServerManager.java | 6 +- .../jabref/logic/search/DatabaseSearcher.java | 3 +- .../org/jabref/logic/search/SearchQuery.java | 16 +- .../jabref/logic/shared/DBMSConnection.java | 6 +- .../shared/DBMSConnectionProperties.java | 18 +- .../DBMSConnectionPropertiesBuilder.java | 3 +- .../jabref/logic/shared/DBMSProcessor.java | 263 +- .../jabref/logic/shared/DBMSSynchronizer.java | 71 +- .../org/jabref/logic/shared/DBMSType.java | 4 +- .../jabref/logic/shared/MySQLProcessor.java | 43 +- .../jabref/logic/shared/OracleProcessor.java | 102 +- .../logic/shared/PostgreSQLProcessor.java | 58 +- .../prefs/SharedDatabasePreferences.java | 3 +- .../logic/texparser/DefaultLatexParser.java | 27 +- .../texparser/TexBibEntriesResolver.java | 51 +- .../java/org/jabref/logic/util/BuildInfo.java | 25 +- .../jabref/logic/util/CoarseChangeFilter.java | 8 +- .../java/org/jabref/logic/util/FileType.java | 4 +- .../MetadataSerializationConfiguration.java | 3 +- src/main/java/org/jabref/logic/util/OS.java | 6 +- .../jabref/logic/util/StandardFileType.java | 13 +- .../java/org/jabref/logic/util/TestEntry.java | 16 +- .../org/jabref/logic/util/UpdateField.java | 15 +- .../java/org/jabref/logic/util/Version.java | 27 +- .../org/jabref/logic/util/WebViewStore.java | 6 +- .../logic/util/io/AutoLinkPreferences.java | 18 +- .../jabref/logic/util/io/BackupFileUtil.java | 18 +- .../util/io/CitationKeyBasedFileFinder.java | 14 +- .../logic/util/io/DatabaseFileLookup.java | 12 +- .../org/jabref/logic/util/io/FileFinders.java | 10 +- .../jabref/logic/util/io/FileNameCleaner.java | 3 +- .../logic/util/io/FileNameUniqueness.java | 18 +- .../org/jabref/logic/util/io/FileUtil.java | 72 +- .../logic/util/io/RegExpBasedFileFinder.java | 31 +- .../org/jabref/logic/util/io/XMLUtil.java | 6 +- .../strings/HTMLUnicodeConversionMaps.java | 1641 +++++----- .../logic/util/strings/StringManipulator.java | 23 +- .../jabref/logic/xmp/DublinCoreExtractor.java | 55 +- .../org/jabref/logic/xmp/XmpPreferences.java | 3 +- .../org/jabref/logic/xmp/XmpUtilReader.java | 20 +- .../org/jabref/logic/xmp/XmpUtilShared.java | 6 +- .../org/jabref/logic/xmp/XmpUtilWriter.java | 41 +- .../ConvertLegacyExplicitGroups.java | 3 +- .../migrations/ConvertMarkingToGroups.java | 14 +- .../CustomEntryTypePreferenceMigration.java | 23 +- .../MergeReviewIntoCommentMigration.java | 33 +- .../migrations/PreferencesMigrations.java | 160 +- .../SpecialFieldsToSeparateFields.java | 8 +- src/main/java/org/jabref/model/ChainNode.java | 4 +- .../java/org/jabref/model/FieldChange.java | 4 +- src/main/java/org/jabref/model/TreeNode.java | 6 +- .../jabref/model/database/BibDatabase.java | 19 +- .../model/database/BibDatabaseContext.java | 24 +- .../database/BibDatabaseModeDetection.java | 3 +- .../jabref/model/database/BibDatabases.java | 7 +- .../model/database/KeyChangeListener.java | 6 +- .../database/event/ChangePropagation.java | 3 +- .../database/event/EntriesAddedEvent.java | 1 - .../database/event/EntriesRemovedEvent.java | 1 - .../java/org/jabref/model/entry/Author.java | 11 +- .../org/jabref/model/entry/AuthorList.java | 29 +- .../java/org/jabref/model/entry/BibEntry.java | 133 +- .../org/jabref/model/entry/BibEntryType.java | 34 +- .../model/entry/BibEntryTypeBuilder.java | 27 +- .../model/entry/BibEntryTypesManager.java | 36 +- .../org/jabref/model/entry/BibtexString.java | 10 +- .../jabref/model/entry/CanonicalBibEntry.java | 11 +- .../java/org/jabref/model/entry/Date.java | 199 +- .../jabref/model/entry/EntryConverter.java | 9 +- .../org/jabref/model/entry/EntryLinkList.java | 3 +- .../org/jabref/model/entry/IdGenerator.java | 3 +- .../java/org/jabref/model/entry/Keyword.java | 25 +- .../org/jabref/model/entry/KeywordList.java | 4 +- .../org/jabref/model/entry/LinkedFile.java | 14 +- .../java/org/jabref/model/entry/Month.java | 5 +- .../model/entry/SharedBibEntryData.java | 6 +- .../model/entry/event/EntryChangedEvent.java | 1 - .../model/entry/event/FieldChangedEvent.java | 4 +- .../jabref/model/entry/field/AMSField.java | 5 +- .../jabref/model/entry/field/BibField.java | 5 +- .../model/entry/field/BiblatexApaField.java | 5 +- .../entry/field/BiblatexSoftwareField.java | 5 +- .../model/entry/field/FieldFactory.java | 116 +- .../jabref/model/entry/field/IEEEField.java | 4 +- .../model/entry/field/InternalField.java | 4 +- .../jabref/model/entry/field/OrFields.java | 4 +- .../model/entry/field/SpecialField.java | 35 +- .../model/entry/field/SpecialFieldValue.java | 1 - .../model/entry/field/StandardField.java | 5 +- .../model/entry/field/UnknownField.java | 4 +- .../entry/field/UserSpecificCommentField.java | 7 +- .../entry/identifier/ArXivIdentifier.java | 16 +- .../jabref/model/entry/identifier/DOI.java | 126 +- .../jabref/model/entry/identifier/ISBN.java | 6 +- .../jabref/model/entry/identifier/ISSN.java | 3 +- .../model/entry/identifier/IacrEprint.java | 4 +- .../model/entry/identifier/MathSciNetId.java | 3 +- .../BiblatexAPAEntryTypeDefinitions.java | 40 +- .../entry/types/BiblatexApaEntryType.java | 5 +- .../types/BiblatexEntryTypeDefinitions.java | 1227 +++++-- .../types/BiblatexSoftwareEntryType.java | 5 +- .../BiblatexSoftwareEntryTypeDefinitions.java | 149 +- .../types/BibtexEntryTypeDefinitions.java | 161 +- .../model/entry/types/EntryTypeFactory.java | 14 +- .../model/entry/types/IEEETranEntryType.java | 4 +- .../types/IEEETranEntryTypeDefinitions.java | 87 +- ...tematicLiteratureReviewStudyEntryType.java | 4 +- ...ratureReviewStudyEntryTypeDefinitions.java | 9 +- .../model/entry/types/UnknownEntryType.java | 4 +- .../jabref/model/groups/AbstractGroup.java | 19 +- .../jabref/model/groups/AutomaticGroup.java | 4 +- .../model/groups/AutomaticKeywordGroup.java | 23 +- .../model/groups/AutomaticPersonsGroup.java | 9 +- .../jabref/model/groups/GroupTreeNode.java | 36 +- .../org/jabref/model/groups/KeywordGroup.java | 11 +- .../jabref/model/groups/LastNameGroup.java | 17 +- .../model/groups/RegexKeywordGroup.java | 22 +- .../org/jabref/model/groups/SearchGroup.java | 19 +- .../org/jabref/model/groups/TexGroup.java | 62 +- .../jabref/model/groups/WordKeywordGroup.java | 34 +- .../model/metadata/ContentSelector.java | 3 +- .../model/metadata/ContentSelectors.java | 7 +- .../org/jabref/model/metadata/MetaData.java | 28 +- .../org/jabref/model/metadata/SaveOrder.java | 14 +- .../metadata/SelfContainedSaveOrder.java | 3 +- .../model/openoffice/backend/NamedRange.java | 26 +- .../openoffice/backend/NamedRangeManager.java | 18 +- .../model/openoffice/ootext/OOFormat.java | 8 +- .../model/openoffice/ootext/OOTextIntoOO.java | 118 +- .../rangesort/FunctionalTextViewCursor.java | 14 +- .../rangesort/RangeOverlapBetween.java | 21 +- .../rangesort/RangeOverlapKind.java | 1 - .../rangesort/RangeOverlapWithin.java | 35 +- .../model/openoffice/rangesort/RangeSort.java | 6 +- .../openoffice/rangesort/RangeSortVisual.java | 12 +- .../model/openoffice/style/Citation.java | 12 +- .../model/openoffice/style/CitationGroup.java | 14 +- .../openoffice/style/CitationGroups.java | 11 +- .../model/openoffice/style/CitationType.java | 3 - .../model/openoffice/style/CitedKey.java | 7 +- .../openoffice/style/ComparableCitedKey.java | 1 - .../openoffice/style/CompareCitation.java | 2 - .../style/NonUniqueCitationMarker.java | 1 - .../model/openoffice/style/PageInfo.java | 3 +- .../model/openoffice/uno/UnoBookmark.java | 21 +- .../jabref/model/openoffice/uno/UnoCast.java | 3 +- .../model/openoffice/uno/UnoCrossRef.java | 23 +- .../model/openoffice/uno/UnoCursor.java | 7 +- .../model/openoffice/uno/UnoNameAccess.java | 6 +- .../jabref/model/openoffice/uno/UnoNamed.java | 16 +- .../model/openoffice/uno/UnoProperties.java | 16 +- .../model/openoffice/uno/UnoRedlines.java | 4 +- .../openoffice/uno/UnoReferenceMark.java | 31 +- .../openoffice/uno/UnoScreenRefresh.java | 3 +- .../model/openoffice/uno/UnoSelection.java | 3 +- .../jabref/model/openoffice/uno/UnoStyle.java | 36 +- .../model/openoffice/uno/UnoTextDocument.java | 8 +- .../model/openoffice/uno/UnoTextRange.java | 12 +- .../model/openoffice/uno/UnoTextSection.java | 19 +- .../jabref/model/openoffice/uno/UnoUndo.java | 6 +- .../uno/UnoUserDefinedProperty.java | 35 +- .../jabref/model/openoffice/util/OOPair.java | 1 - .../model/openoffice/util/OOResult.java | 1 - .../model/openoffice/util/OOTuple3.java | 1 - .../model/openoffice/util/OOVoidResult.java | 1 - .../org/jabref/model/pdf/FileAnnotation.java | 35 +- .../jabref/model/pdf/FileAnnotationType.java | 5 +- .../model/pdf/search/EnglishStemAnalyzer.java | 1 - .../pdf/search/SearchFieldConstants.java | 2 +- .../jabref/model/pdf/search/SearchResult.java | 6 +- .../model/schema/DublinCoreSchemaCustom.java | 13 +- .../jabref/model/search/GroupSearchQuery.java | 4 +- .../model/search/matchers/AndMatcher.java | 3 +- .../search/rules/ContainsBasedSearchRule.java | 3 +- .../search/rules/FullTextSearchRule.java | 4 +- .../search/rules/GrammarBasedSearchRule.java | 32 +- .../search/rules/RegexBasedSearchRule.java | 10 +- .../model/search/rules/SearchRules.java | 8 +- .../org/jabref/model/strings/StringUtil.java | 35 +- .../java/org/jabref/model/study/Study.java | 34 +- .../org/jabref/model/study/StudyDatabase.java | 5 +- .../org/jabref/model/study/StudyQuery.java | 7 +- .../org/jabref/model/texparser/Citation.java | 20 +- .../LatexBibEntriesResolverResult.java | 9 +- .../model/texparser/LatexParserResult.java | 8 +- .../org/jabref/model/util/OptionalUtil.java | 9 +- .../org/jabref/model/util/TreeCollector.java | 11 +- .../jabref/preferences/ExportPreferences.java | 9 +- .../ExternalApplicationsPreferences.java | 19 +- .../jabref/preferences/FilePreferences.java | 26 +- .../jabref/preferences/GuiPreferences.java | 33 +- .../preferences/InternalPreferences.java | 11 +- .../jabref/preferences/JabRefPreferences.java | 1162 ++++--- .../preferences/LibraryPreferences.java | 4 +- .../jabref/preferences/MrDlibPreferences.java | 6 +- .../preferences/PreferenceServiceFactory.java | 3 +- .../jabref/preferences/PreferencesFilter.java | 14 +- .../preferences/PreviewPreferences.java | 11 +- .../PushToApplicationPreferences.java | 6 +- .../jabref/preferences/SearchPreferences.java | 13 +- .../preferences/SidePanePreferences.java | 7 +- .../preferences/TelemetryPreferences.java | 4 +- .../preferences/WorkspacePreferences.java | 21 +- src/main/resources/csl-styles | 2 +- src/main/resources/icons/jabref.svg | 201 +- src/main/resources/l10n/JabRef_ar.properties | 591 ---- src/main/resources/l10n/JabRef_da.properties | 533 ---- src/main/resources/l10n/JabRef_de.properties | 616 +--- src/main/resources/l10n/JabRef_el.properties | 601 +--- src/main/resources/l10n/JabRef_en.properties | 621 +--- src/main/resources/l10n/JabRef_es.properties | 615 +--- src/main/resources/l10n/JabRef_fa.properties | 545 ---- src/main/resources/l10n/JabRef_fi.properties | 15 - src/main/resources/l10n/JabRef_fr.properties | 616 +--- src/main/resources/l10n/JabRef_id.properties | 598 ---- src/main/resources/l10n/JabRef_it.properties | 616 +--- src/main/resources/l10n/JabRef_ja.properties | 611 +--- src/main/resources/l10n/JabRef_ko.properties | 600 +--- src/main/resources/l10n/JabRef_nl.properties | 613 +--- src/main/resources/l10n/JabRef_no.properties | 533 ---- src/main/resources/l10n/JabRef_pl.properties | 613 +--- src/main/resources/l10n/JabRef_pt.properties | 596 +--- .../resources/l10n/JabRef_pt_BR.properties | 616 +--- src/main/resources/l10n/JabRef_ru.properties | 602 +--- src/main/resources/l10n/JabRef_sv.properties | 617 +--- src/main/resources/l10n/JabRef_tl.properties | 594 ---- src/main/resources/l10n/JabRef_tr.properties | 610 +--- src/main/resources/l10n/JabRef_uk.properties | 34 - src/main/resources/l10n/JabRef_vi.properties | 598 ---- .../resources/l10n/JabRef_zh_CN.properties | 613 +--- .../resources/l10n/JabRef_zh_TW.properties | 582 ---- src/main/resources/resource/ods/manifest.xml | 25 +- src/main/resources/resource/ods/meta.xml | 33 +- src/main/resources/resource/ods/settings.xml | 4 +- .../resource/openoffice/manifest.xml | 21 +- .../resources/resource/openoffice/meta.xml | 19 +- src/main/resources/tinylog.properties | 15 +- src/main/resources/xjc/citavi/citavi.xsd | 1143 ++++--- .../resources/xjc/medline/bookdoc_160101.xsd | 682 ++-- .../medline/nlmmedlinecitationset_160101.xsd | 2282 ++++++++----- .../resources/xslt/mathml_latex/cmarkup.xsl | 2836 +++++++++++------ .../resources/xslt/mathml_latex/entities.xsl | 2777 ++++++++++++++-- .../resources/xslt/mathml_latex/glayout.xsl | 451 +-- .../resources/xslt/mathml_latex/mmltex.xsl | 102 +- .../resources/xslt/mathml_latex/scripts.xsl | 664 ++-- .../resources/xslt/mathml_latex/tables.xsl | 276 +- .../resources/xslt/mathml_latex/tokens.xsl | 715 +++-- .../java/org/jabref/IconsPropertiesTest.java | 11 +- .../architecture/MainArchitectureTest.java | 186 +- .../architecture/TestArchitectureTest.java | 98 +- .../org/jabref/cli/ArgumentProcessorTest.java | 45 +- .../org/jabref/cli/AuxCommandLineTest.java | 3 +- .../java/org/jabref/cli/JabRefCLITest.java | 69 +- .../gui/UpdateTimestampListenerTest.java | 20 +- .../AppendPersonNamesStrategyTest.java | 4 +- .../FieldValueSuggestionProviderTest.java | 9 +- .../PersonNameStringConverterTest.java | 71 +- .../PersonNameSuggestionProviderTest.java | 3 +- .../SuggestionProvidersTest.java | 20 +- .../BackupManagerDiscardedTest.java | 19 +- .../autosaveandbackup/BackupManagerTest.java | 56 +- .../SaveOrderPanelViewModelTest.java | 30 +- .../PdfDocumentViewModelTest.java | 18 +- .../jabref/gui/edit/CopyMoreActionTest.java | 117 +- ...opyOrMoveFieldContentTabViewModelTest.java | 20 +- .../gui/edit/ManageKeywordsViewModelTest.java | 56 +- .../gui/edit/ReplaceStringViewModelTest.java | 58 +- .../gui/entryeditor/CommentsTabTest.java | 19 +- .../jabref/gui/entryeditor/SciteTabTest.java | 5 +- .../entryeditor/SciteTabViewModelTest.java | 1 + .../jabref/gui/entryeditor/SourceTabTest.java | 15 +- .../FileAnnotationViewModelTest.java | 31 +- .../exporter/ExportToClipboardActionTest.java | 47 +- .../gui/exporter/SaveDatabaseActionTest.java | 23 +- .../AutoSetFileLinksUtilTest.java | 10 +- .../externalfiles/FileFilterUtilsTest.java | 32 +- .../GitIgnoreFileFilterTest.java | 3 +- .../gui/externalfiles/ImportHandlerTest.java | 71 +- .../UnlinkedFilesCrawlerTest.java | 22 +- .../ExternalFileTypesTest.java | 68 +- .../fieldeditors/LinkedFileViewModelTest.java | 120 +- .../LinkedFilesEditorViewModelTest.java | 21 +- .../gui/groups/GroupDialogViewModelTest.java | 21 +- .../gui/groups/GroupNodeViewModelTest.java | 102 +- .../gui/groups/GroupTreeViewModelTest.java | 63 +- .../fetcher/WebSearchPaneViewModelTest.java | 4 +- .../gui/keyboard/KeyBindingsTabModelTest.java | 42 +- .../ContentSelectorViewModelTest.java | 31 +- .../gui/maintable/MainTableDataModelTest.java | 22 +- .../jabref/gui/menus/FileHistoryMenuTest.java | 3 + .../mergeentries/DiffHighlightingTest.java | 43 +- .../mergeentries/FieldRowViewModelTest.java | 27 +- .../gui/mergeentries/GroupMergerTest.java | 5 +- .../ThreeWayMergeCellViewModelTest.java | 12 +- .../ThreeWayMergeViewModelTest.java | 18 +- .../fieldsmerger/FileMergerTest.java | 4 +- .../journals/AbbreviationViewModelTest.java | 9 +- .../JournalAbbreviationsViewModelTabTest.java | 174 +- .../keybindings/KeyBindingViewModelTest.java | 38 +- .../gui/preview/CopyCitationActionTest.java | 198 +- .../org/jabref/gui/push/PushToEmacsTest.java | 3 +- ...sAndRegexBasedSearchRuleDescriberTest.java | 25 +- .../gui/search/GlobalSearchBarTest.java | 9 +- .../GrammarBasedSearchRuleDescriberTest.java | 135 +- .../gui/sidepane/SidePaneViewModelTest.java | 3 +- .../ManageStudyDefinitionViewModelTest.java | 114 +- .../jabref/gui/theme/ThemeManagerTest.java | 63 +- .../java/org/jabref/gui/theme/ThemeTest.java | 32 +- .../org/jabref/gui/util/ColorUtilTest.java | 3 +- .../jabref/gui/util/ControlHelperTest.java | 17 +- .../gui/util/FileDialogConfigurationTest.java | 28 +- .../gui/util/RecursiveTreeItemTest.java | 16 +- .../jabref/gui/util/TooltipTextUtilTest.java | 21 +- .../http/server/LibrariesResourceTest.java | 13 +- .../http/server/LibraryResourceTest.java | 16 +- .../org/jabref/http/server/ServerTest.java | 11 +- .../jabref/logic/auxparser/AuxParserTest.java | 21 +- .../logic/auxparser/DefaultAuxParserTest.java | 3 +- .../jabref/logic/bibtex/BibEntryAssert.java | 22 +- .../logic/bibtex/BibEntryWriterTest.java | 290 +- .../bibtex/FieldContentFormatterTest.java | 6 +- .../jabref/logic/bibtex/FieldWriterTest.java | 14 +- .../logic/bibtex/FileFieldWriterTest.java | 9 +- .../comparator/BibDatabaseDiffTest.java | 18 +- .../bibtex/comparator/BibStringDiffTest.java | 12 +- .../BibtexStringComparatorTest.java | 5 +- .../comparator/EntryComparatorTest.java | 80 +- .../comparator/FieldComparatorTest.java | 93 +- .../bibtex/comparator/GroupDiffTest.java | 10 +- .../jabref/logic/bst/BstFunctionsTest.java | 98 +- .../logic/bst/BstPreviewLayoutTest.java | 44 +- .../java/org/jabref/logic/bst/BstVMTest.java | 33 +- .../jabref/logic/bst/BstVMVisitorTest.java | 39 +- .../logic/bst/util/BstCaseChangersTest.java | 61 +- .../logic/bst/util/BstNameFormatterTest.java | 13 +- .../logic/bst/util/BstPurifierTest.java | 9 +- .../bst/util/BstWidthCalculatorTest.java | 6 +- .../AbstractCitationKeyPatternTest.java | 48 +- .../BracketedPatternTest.java | 184 +- .../CitationKeyGeneratorTest.java | 501 +-- .../MakeLabelWithoutDatabaseTest.java | 4 +- .../citationstyle/CitationStyleCacheTest.java | 32 +- .../CitationStyleGeneratorTest.java | 199 +- .../citationstyle/CitationStyleTest.java | 10 +- .../JabRefItemDataProviderTest.java | 22 +- .../cleanup/BibtexBiblatexRoundtripTest.java | 8 +- .../logic/cleanup/CleanupWorkerTest.java | 83 +- .../cleanup/ConvertToBibtexCleanupTest.java | 3 +- .../jabref/logic/cleanup/DoiCleanupTest.java | 47 +- .../logic/cleanup/DoiDecodeCleanupTest.java | 49 +- .../cleanup/FieldFormatterCleanupTest.java | 81 +- .../cleanup/FieldFormatterCleanupsTest.java | 111 +- .../jabref/logic/cleanup/ISSNCleanupTest.java | 4 +- .../logic/cleanup/MoveFilesCleanupTest.java | 24 +- .../logic/cleanup/RenamePdfCleanupTest.java | 23 +- .../cleanup/TimeStampToCreationDateTest.java | 59 +- .../TimeStampToModificationDateTest.java | 20 +- .../jabref/logic/cleanup/URLCleanupTest.java | 284 +- .../org/jabref/logic/crawler/CrawlerTest.java | 33 +- .../StudyCatalogToFetcherConverterTest.java | 4 +- .../logic/crawler/StudyRepositoryTest.java | 134 +- .../logic/crawler/StudyYamlParserTest.java | 25 +- .../logic/database/DatabaseMergerTest.java | 58 +- .../logic/database/DuplicateCheckTest.java | 16 +- .../exporter/AtomicFileOutputStreamTest.java | 18 +- .../exporter/BibtexDatabaseWriterTest.java | 424 ++- .../logic/exporter/CsvExportFormatTest.java | 3 +- .../logic/exporter/DocBook5ExporterTest.java | 13 +- .../logic/exporter/DocbookExporterTest.java | 15 +- .../EmbeddedBibFilePdfExporterTest.java | 39 +- .../jabref/logic/exporter/ExporterTest.java | 15 +- .../logic/exporter/GroupSerializerTest.java | 58 +- .../logic/exporter/HtmlExportFormatTest.java | 3 +- .../exporter/MSBibExportFormatFilesTest.java | 32 +- .../exporter/MetaDataSerializerTest.java | 35 +- .../exporter/ModsExportFormatFilesTest.java | 46 +- .../logic/exporter/ModsExportFormatTest.java | 7 +- .../OpenOfficeDocumentCreatorTest.java | 22 +- .../logic/exporter/XmpExporterTest.java | 51 +- .../logic/exporter/XmpPdfExporterTest.java | 42 +- .../logic/exporter/YamlExporterTest.java | 20 +- .../jabref/logic/formatter/FormatterTest.java | 25 +- .../bibtexfields/CleanupUrlFormatterTest.java | 20 +- .../EscapeDollarSignFormatterTest.java | 7 +- .../HtmlToUnicodeFormatterTest.java | 20 +- .../LatexCleanupFormatterTest.java | 3 +- .../NormalizeEnDashesFormatterTest.java | 4 +- .../NormalizeNamesFormatterTest.java | 101 +- .../OrdinalsToSuperscriptFormatterTest.java | 6 +- .../bibtexfields/RegexFormatterTest.java | 16 +- .../RemoveNewlinesFormatterTest.java | 1 - .../ReplaceTabsBySpaceFormaterTest.java | 1 - .../ReplaceWithEscapedDoubleQuotesTest.java | 2 +- .../TrimWhitespaceFormatterTest.java | 1 - .../UnicodeToLatexFormatterTest.java | 12 +- .../casechanger/CapitalizeFormatterTest.java | 55 +- .../casechanger/LowerCaseFormatterTest.java | 3 +- .../ProtectTermsFormatterTest.java | 11 +- .../SentenceCaseFormatterTest.java | 20 +- .../casechanger/TitleCaseFormatterTest.java | 51 +- .../UnprotectTermsFormatterTest.java | 9 +- .../casechanger/UpperCaseFormatterTest.java | 3 +- .../minifier/MinifyNameListFormatterTest.java | 3 +- .../org/jabref/logic/git/GitHandlerTest.java | 5 +- .../jabref/logic/git/SlrGitHandlerTest.java | 35 +- .../logic/importer/AuthorListParserTest.java | 26 +- .../logic/importer/BibDatabaseFilesTest.java | 2 +- .../importer/DatabaseFileLookupTest.java | 3 +- .../jabref/logic/importer/ImportDataTest.java | 18 +- .../ImportFormatReaderIntegrationTest.java | 40 +- .../ImportFormatReaderParameterlessTest.java | 7 +- .../jabref/logic/importer/ImporterTest.java | 9 +- .../logic/importer/OpenDatabaseTest.java | 21 +- .../logic/importer/QueryParserTest.java | 60 +- .../logic/importer/WebFetchersTest.java | 32 +- .../fetcher/ACMPortalFetcherTest.java | 43 +- .../logic/importer/fetcher/ACSTest.java | 3 +- .../importer/fetcher/ApsFetcherTest.java | 8 +- .../importer/fetcher/ArXivFetcherTest.java | 193 +- .../fetcher/AstrophysicsDataSystemTest.java | 62 +- .../fetcher/BiodiversityLibraryTest.java | 52 +- .../importer/fetcher/BvbFetcherTest.java | 28 +- .../logic/importer/fetcher/CiteSeerTest.java | 31 +- ...puterScienceBibliographiesFetcherTest.java | 87 +- ...mputerScienceBibliographiesParserTest.java | 25 +- .../fetcher/CompositeIdFetcherTest.java | 43 +- .../CompositeSearchBasedFetcherTest.java | 21 +- .../logic/importer/fetcher/CrossRefTest.java | 41 +- .../importer/fetcher/DBLPFetcherTest.java | 13 +- .../importer/fetcher/DOABFetcherTest.java | 55 +- .../importer/fetcher/DOAJFetcherTest.java | 46 +- .../logic/importer/fetcher/DiVATest.java | 7 +- .../importer/fetcher/DoiFetcherTest.java | 14 +- .../importer/fetcher/DoiResolutionTest.java | 15 +- .../importer/fetcher/GoogleScholarTest.java | 20 +- .../fetcher/GrobidCitationFetcherTest.java | 136 +- .../importer/fetcher/GvkFetcherTest.java | 12 +- .../logic/importer/fetcher/IEEETest.java | 60 +- .../importer/fetcher/INSPIREFetcherTest.java | 7 +- .../fetcher/IacrEprintFetcherTest.java | 40 +- .../importer/fetcher/JstorFetcherTest.java | 34 +- .../importer/fetcher/LOBIDFetcherTest.java | 23 +- .../fetcher/LibraryOfCongressTest.java | 3 +- .../importer/fetcher/MathSciNetTest.java | 17 +- .../importer/fetcher/MedlineFetcherTest.java | 52 +- .../logic/importer/fetcher/MedraTest.java | 92 +- .../importer/fetcher/MrDLibFetcherTest.java | 17 +- .../importer/fetcher/OpenAccessDoiTest.java | 5 +- .../importer/fetcher/ResearchGateTest.java | 59 +- .../importer/fetcher/RfcFetcherTest.java | 22 +- .../fetcher/ScholarArchiveFetcherTest.java | 15 +- .../importer/fetcher/ScienceDirectTest.java | 21 +- .../SearchBasedFetcherCapabilityTest.java | 24 +- .../importer/fetcher/SemanticScholarTest.java | 57 +- .../importer/fetcher/SpringerFetcherTest.java | 176 +- .../importer/fetcher/TitleFetcherTest.java | 13 +- .../logic/importer/fetcher/ZbMATHTest.java | 6 +- ...oiToBibtexConverterComIsbnFetcherTest.java | 7 +- .../isbntobibtex/EbookDeIsbnFetcherTest.java | 11 +- .../isbntobibtex/GVKIsbnFetcherTest.java | 10 +- .../fetcher/isbntobibtex/IsbnFetcherTest.java | 4 +- .../OpenLibraryIsbnFetcherTest.java | 4 +- .../ArXivQueryTransformerTest.java | 3 +- .../CiteSeerQueryTransformerTest.java | 35 +- ...nceBibliographiesQueryTransformerTest.java | 9 +- .../DBLPQueryTransformerTest.java | 6 +- .../transformers/GVKQueryTransformerTest.java | 6 +- .../IEEEQueryTransformerTest.java | 23 +- .../transformers/InfixTransformerTest.java | 36 +- .../JstorQueryTransformerTest.java | 6 +- .../SpringerQueryTransformerTest.java | 6 +- .../transformers/SuffixTransformerTest.java | 36 +- ...rRangeByFilteringQueryTransformerTest.java | 7 +- ...rRangeByFilteringQueryTransformerTest.java | 6 +- .../ZbMathQueryTransformerTest.java | 6 +- .../fileformat/ACMPortalParserTest.java | 77 +- .../BiblioscapeImporterFilesTest.java | 4 +- .../fileformat/BiblioscapeImporterTest.java | 13 +- .../BiblioscapeImporterTypesTest.java | 9 +- .../fileformat/BibtexImporterTest.java | 78 +- .../importer/fileformat/BibtexParserTest.java | 570 ++-- .../importer/fileformat/CffImporterTest.java | 38 +- .../fileformat/CopacImporterFilesTest.java | 3 +- .../fileformat/CustomImporterTest.java | 10 +- .../fileformat/EndnoteImporterTest.java | 34 +- .../EndnoteXmlImporterFilesTest.java | 3 +- .../fileformat/ImporterTestEngine.java | 13 +- .../fileformat/InspecImporterTest.java | 30 +- .../importer/fileformat/IsiImporterTest.java | 58 +- .../fileformat/MedlineImporterFilesTest.java | 7 +- .../fileformat/MedlinePlainImporterTest.java | 46 +- .../fileformat/ModsImporterFilesTest.java | 3 +- .../fileformat/MrDLibImporterTest.java | 14 +- .../fileformat/MsBibImporterFilesTest.java | 3 +- .../fileformat/MsBibImporterTest.java | 14 +- .../importer/fileformat/OvidImporterTest.java | 19 +- .../PdfContentImporterFilesTest.java | 3 +- .../fileformat/PdfContentImporterTest.java | 78 +- .../PdfEmbeddedBibFileImporterTest.java | 18 +- .../fileformat/PdfGrobidImporterTest.java | 16 +- .../PdfMergeMetadataImporterTest.java | 22 +- .../PdfVerbatimBibTextImporterTest.java | 22 +- .../fileformat/PdfXmpImporterTest.java | 9 +- .../importer/fileformat/RISImporterTest.java | 3 +- .../fileformat/RepecNepImporterTest.java | 13 +- .../importer/util/FileFieldParserTest.java | 114 +- .../importer/util/GrobidServiceTest.java | 39 +- .../logic/importer/util/GroupsParserTest.java | 63 +- .../logic/importer/util/MathMLParserTest.java | 18 +- .../importer/util/MetaDataParserTest.java | 27 +- .../logic/importer/util/StaxParserTest.java | 21 +- .../integrity/ASCIICharacterCheckerTest.java | 12 +- .../integrity/AbbreviationCheckerTest.java | 8 +- .../logic/integrity/AmpersandCheckerTest.java | 14 +- .../logic/integrity/BibStringCheckerTest.java | 11 +- .../logic/integrity/BooktitleCheckerTest.java | 10 +- .../integrity/CitationKeyCheckerTest.java | 33 +- .../CitationKeyDeviationCheckerTest.java | 16 +- .../CitationKeyDuplicationCheckerTest.java | 21 +- .../logic/integrity/DateCheckerTest.java | 26 +- .../integrity/DoiDuplicationCheckerTest.java | 20 +- .../integrity/DoiValidityCheckerTest.java | 6 +- .../logic/integrity/EditionCheckerTest.java | 18 +- .../integrity/HTMLCharacterCheckerTest.java | 20 +- .../logic/integrity/ISBNCheckerTest.java | 3 +- .../logic/integrity/ISSNCheckerTest.java | 6 +- .../logic/integrity/IntegrityCheckTest.java | 59 +- .../JournalInAbbreviationListCheckerTest.java | 13 +- .../integrity/LatexIntegrityCheckerTest.java | 249 +- .../integrity/NoBibTexFieldCheckerTest.java | 9 +- .../integrity/PagesCheckerBiblatexTest.java | 9 +- .../integrity/PagesCheckerBibtexTest.java | 9 +- .../integrity/PersonNamesCheckerTest.java | 29 +- .../logic/integrity/TitleCheckerTest.java | 63 +- .../logic/integrity/TypeCheckerTest.java | 5 +- .../logic/integrity/UTF8CheckerTest.java | 8 +- .../logic/integrity/UrlCheckerTest.java | 4 +- .../ValidCitationKeyCheckerTest.java | 3 +- .../logic/journals/AbbreviationTest.java | 8 +- .../journals/AbbreviationWriterTest.java | 8 +- .../JournalAbbreviationRepositoryTest.java | 117 +- .../JournalInformationFetcherTest.java | 216 +- .../l10n/JavaLocalizationEntryParser.java | 25 +- .../l10n/JavaLocalizationEntryParserTest.java | 39 +- .../org/jabref/logic/l10n/LanguageTest.java | 3 +- .../logic/l10n/LocalizationBundleForTest.java | 3 +- .../l10n/LocalizationConsistencyTest.java | 124 +- .../logic/l10n/LocalizationKeyParamsTest.java | 8 +- .../logic/l10n/LocalizationKeyTest.java | 10 +- .../jabref/logic/l10n/LocalizationParser.java | 58 +- .../jabref/logic/l10n/LocalizationTest.java | 5 +- .../jabref/logic/layout/LayoutEntryTest.java | 52 +- .../org/jabref/logic/layout/LayoutTest.java | 27 +- .../layout/format/AuthorAbbreviatorTest.java | 5 +- .../AuthorAndToSemicolonReplacerTest.java | 8 +- .../format/AuthorAndsCommaReplacerTest.java | 6 +- .../layout/format/AuthorAndsReplacerTest.java | 13 +- .../format/AuthorFirstAbbrLastCommasTest.java | 13 +- .../AuthorFirstAbbrLastOxfordCommasTest.java | 13 +- .../format/AuthorFirstFirstCommasTest.java | 6 +- .../layout/format/AuthorFirstFirstTest.java | 6 +- .../format/AuthorFirstLastCommasTest.java | 11 +- .../AuthorFirstLastOxfordCommasTest.java | 13 +- .../layout/format/AuthorLF_FFAbbrTest.java | 6 +- .../logic/layout/format/AuthorLF_FFTest.java | 6 +- .../format/AuthorLastFirstAbbrCommasTest.java | 13 +- .../AuthorLastFirstAbbrOxfordCommasTest.java | 13 +- .../AuthorLastFirstAbbreviatorTest.java | 3 +- .../format/AuthorLastFirstCommasTest.java | 13 +- .../AuthorLastFirstOxfordCommasTest.java | 13 +- .../layout/format/AuthorLastFirstTest.java | 13 +- .../logic/layout/format/AuthorNatBibTest.java | 3 +- .../logic/layout/format/AuthorOrgSciTest.java | 13 +- .../logic/layout/format/AuthorsTest.java | 128 +- .../layout/format/CompositeFormatTest.java | 11 +- .../logic/layout/format/DOICheckTest.java | 10 +- .../logic/layout/format/DOIStripTest.java | 39 +- .../layout/format/DateFormatterTest.java | 10 +- .../logic/layout/format/DefaultTest.java | 3 +- .../layout/format/EntryTypeFormatterTest.java | 3 +- .../logic/layout/format/FileLinkTest.java | 3 +- .../logic/layout/format/FirstPageTest.java | 3 +- .../logic/layout/format/HTMLCharsTest.java | 10 +- .../layout/format/HTMLParagraphsTest.java | 9 +- .../logic/layout/format/LastPageTest.java | 3 +- .../format/LatexToUnicodeFormatterTest.java | 3 +- .../layout/format/MarkdownFormatterTest.java | 4 +- .../layout/format/NameFormatterTest.java | 41 +- .../NoSpaceBetweenAbbreviationsTest.java | 3 +- .../logic/layout/format/RTFCharsTest.java | 135 +- .../format/RemoveBracketsAddCommaTest.java | 3 +- .../RemoveLatexCommandsFormatterTest.java | 5 +- .../logic/layout/format/RemoveTildeTest.java | 3 +- .../logic/layout/format/RisKeywordsTest.java | 5 +- .../logic/layout/format/RisMonthTest.java | 24 +- .../format/ShortMonthFormatterTest.java | 3 +- .../logic/layout/format/ToLowerCaseTest.java | 3 +- .../logic/layout/format/ToUpperCaseTest.java | 3 +- .../logic/layout/format/WrapContentTest.java | 3 +- .../layout/format/WrapFileLinksTest.java | 6 +- .../logic/msbib/MSBibConverterTest.java | 12 +- .../java/org/jabref/logic/net/ProxyTest.java | 58 +- .../org/jabref/logic/net/URLDownloadTest.java | 4 +- .../org/jabref/logic/net/URLUtilTest.java | 34 +- .../openoffice/style/OOBibStyleTest.java | 496 ++- .../style/OOBibStyleTestHelper.java | 297 +- .../openoffice/style/StyleLoaderTest.java | 47 +- .../pdf/EntryAnnotationImporterTest.java | 6 +- .../logic/pdf/PdfAnnotationImporterTest.java | 198 +- .../search/indexing/DocumentReaderTest.java | 9 +- .../pdf/search/indexing/PdfIndexerTest.java | 30 +- .../pdf/search/retrieval/PdfSearcherTest.java | 12 +- .../ProtectedTermsLoaderTest.java | 150 +- .../logic/remote/RemoteCommunicationTest.java | 8 +- .../jabref/logic/remote/RemoteSetupTest.java | 20 +- .../logic/search/DatabaseSearcherTest.java | 59 +- .../jabref/logic/search/SearchQueryTest.java | 106 +- .../jabref/logic/shared/ConnectorTest.java | 34 +- .../shared/DBMSConnectionPropertiesTest.java | 23 +- .../logic/shared/DBMSConnectionTest.java | 24 +- .../logic/shared/DBMSProcessorTest.java | 69 +- .../logic/shared/DBMSSynchronizerTest.java | 16 +- .../shared/SynchronizationSimulatorTest.java | 37 +- .../org/jabref/logic/shared/TestManager.java | 43 +- .../logic/texparser/DefaultTexParserTest.java | 158 +- .../logic/texparser/LatexParserTest.java | 79 +- .../texparser/TexBibEntriesResolverTest.java | 57 +- .../logic/util/DevelopmentStageTest.java | 5 +- .../logic/util/FileNameCleanerTest.java | 5 +- .../jabref/logic/util/UpdateFieldTest.java | 16 +- .../logic/util/io/BackupFileUtilTest.java | 12 +- .../io/CitationKeyBasedFileFinderTest.java | 12 +- .../jabref/logic/util/io/FileHistoryTest.java | 2 - .../jabref/logic/util/io/FileUtilTest.java | 82 +- .../util/io/RegExpBasedFileFinderTest.java | 32 +- .../util/strings/StringManipulatorTest.java | 3 +- .../util/strings/StringSimilarityTest.java | 24 +- .../jabref/logic/xmp/XmpUtilReaderTest.java | 67 +- .../jabref/logic/xmp/XmpUtilWriterTest.java | 16 +- .../ConvertMarkingToGroupsTest.java | 6 +- ...eReviewIntoCommentActionMigrationTest.java | 23 +- .../migrations/PreferencesMigrationsTest.java | 61 +- .../SpecialFieldsToSeparateFieldsTest.java | 70 +- .../org/jabref/model/FieldChangeTest.java | 3 +- .../java/org/jabref/model/TreeNodeTest.java | 6 +- .../org/jabref/model/TreeNodeTestData.java | 4 +- .../database/BibDatabaseContextTest.java | 31 +- .../jabref/model/entry/AuthorListTest.java | 636 ++-- .../org/jabref/model/entry/AuthorTest.java | 24 +- .../org/jabref/model/entry/BibEntryTest.java | 43 +- .../model/entry/BibEntryTypesManagerTest.java | 49 +- .../jabref/model/entry/BibtexStringTest.java | 3 +- .../model/entry/CanonicalBibEntryTest.java | 14 +- .../org/jabref/model/entry/CrossrefTest.java | 84 +- .../java/org/jabref/model/entry/DateTest.java | 61 +- .../jabref/model/entry/EntryLinkListTest.java | 7 +- .../jabref/model/entry/KeywordListTest.java | 31 +- .../org/jabref/model/entry/MonthTest.java | 63 +- .../model/entry/field/BibFieldTest.java | 8 +- .../model/entry/field/FieldFactoryTest.java | 8 +- .../model/entry/field/SpecialFieldTest.java | 3 +- .../entry/identifier/ArXivIdentifierTest.java | 4 +- .../model/entry/identifier/DOITest.java | 197 +- .../entry/identifier/IacrEprintTest.java | 31 +- .../groups/AutomaticKeywordGroupTest.java | 12 +- .../groups/AutomaticPersonsGroupTest.java | 22 +- .../model/groups/ExplicitGroupTest.java | 10 +- .../model/groups/GroupTreeNodeTest.java | 84 +- .../jabref/model/groups/SearchGroupTest.java | 32 +- .../org/jabref/model/groups/TexGroupTest.java | 25 +- .../model/groups/WordKeywordGroupTest.java | 9 +- .../jabref/model/pdf/FileAnnotationTest.java | 9 +- .../rules/ContainsBasedSearchRuleTest.java | 12 +- .../rules/GrammarBasedSearchRuleTest.java | 42 +- .../search/rules/SentenceAnalyzerTest.java | 3 +- .../jabref/model/strings/StringUtilTest.java | 41 +- .../jabref/model/texparser/CitationTest.java | 13 +- .../performance/BibtexEntryGenerator.java | 20 +- .../org/jabref/support/CIServerCondition.java | 4 +- .../testutils/category/DatabaseTest.java | 3 +- .../interactive/styletester/StyleTester.fxml | 717 +++-- .../styletester/StyleTesterMain.java | 4 +- .../styletester/StyleTesterView.java | 40 +- 1618 files changed, 46255 insertions(+), 41501 deletions(-) diff --git a/src/jmh/java/org/jabref/benchmarks/Benchmarks.java b/src/jmh/java/org/jabref/benchmarks/Benchmarks.java index 8eae854642c..aece8161760 100644 --- a/src/jmh/java/org/jabref/benchmarks/Benchmarks.java +++ b/src/jmh/java/org/jabref/benchmarks/Benchmarks.java @@ -62,7 +62,8 @@ public void init() throws Exception { BibEntry entry = new BibEntry(); entry.setCitationKey("id" + i); entry.setField(StandardField.TITLE, "This is my title " + i); - entry.setField(StandardField.AUTHOR, "Firstname Lastname and FirstnameA LastnameA and FirstnameB LastnameB" + i); + entry.setField( + StandardField.AUTHOR, "Firstname Lastname and FirstnameA LastnameA and FirstnameB LastnameB" + i); entry.setField(StandardField.JOURNAL, "Journal Title " + i); entry.setField(StandardField.KEYWORDS, "testkeyword"); entry.setField(StandardField.YEAR, "1" + i); @@ -72,7 +73,8 @@ public void init() throws Exception { bibtexString = getOutputWriter().toString(); - latexConversionString = "{A} \\textbf{bold} approach {\\it to} ${{\\Sigma}}{\\Delta}$ modulator \\textsuperscript{2} \\$"; + latexConversionString = + "{A} \\textbf{bold} approach {\\it to} ${{\\Sigma}}{\\Delta}$ modulator \\textsuperscript{2} \\$"; htmlConversionString = "Österreich – & characters ⪢ italic"; } @@ -112,7 +114,9 @@ public List search() { public List parallelSearch() { // FIXME: Reuse SearchWorker here SearchQuery searchQuery = new SearchQuery("Journal Title 500", EnumSet.noneOf(SearchFlags.class)); - return database.getEntries().parallelStream().filter(searchQuery::isMatch).collect(Collectors.toList()); + return database.getEntries().parallelStream() + .filter(searchQuery::isMatch) + .collect(Collectors.toList()); } @Benchmark @@ -140,7 +144,8 @@ public String htmlToLatexConversion() { @Benchmark public boolean keywordGroupContains() { - KeywordGroup group = new WordKeywordGroup("testGroup", GroupHierarchyType.INDEPENDENT, StandardField.KEYWORDS, "testkeyword", false, ',', false); + KeywordGroup group = new WordKeywordGroup( + "testGroup", GroupHierarchyType.INDEPENDENT, StandardField.KEYWORDS, "testkeyword", false, ',', false); return group.containsAll(database.getEntries()); } diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java index 70eb10b2914..43fded3c2c3 100644 --- a/src/main/java/module-info.java +++ b/src/main/java/module-info.java @@ -14,30 +14,32 @@ requires javafx.fxml; requires afterburner.fx; requires com.dlsc.gemsfx; + uses com.dlsc.gemsfx.TagsField; + requires de.saxsys.mvvmfx; requires reactfx; requires org.fxmisc.flowless; - requires org.kordamp.ikonli.core; requires org.kordamp.ikonli.javafx; requires org.kordamp.ikonli.materialdesign2; + uses org.kordamp.ikonli.IkonHandler; uses org.kordamp.ikonli.IkonProvider; - provides org.kordamp.ikonli.IkonHandler - with org.jabref.gui.icon.JabRefIkonHandler; - provides org.kordamp.ikonli.IkonProvider - with org.jabref.gui.icon.JabrefIconProvider; + provides org.kordamp.ikonli.IkonHandler with + org.jabref.gui.icon.JabRefIkonHandler; + provides org.kordamp.ikonli.IkonProvider with + org.jabref.gui.icon.JabrefIconProvider; requires org.controlsfx.controls; requires org.fxmisc.richtext; requires com.tobiasdiez.easybind; - provides com.airhacks.afterburner.views.ResourceLocator - with org.jabref.gui.util.JabRefResourceLocator; - provides com.airhacks.afterburner.injection.PresenterFactory - with org.jabref.gui.DefaultInjector; + provides com.airhacks.afterburner.views.ResourceLocator with + org.jabref.gui.util.JabRefResourceLocator; + provides com.airhacks.afterburner.injection.PresenterFactory with + org.jabref.gui.DefaultInjector; // Logging requires org.slf4j; @@ -47,8 +49,8 @@ requires org.tinylog.api.slf4j; requires org.tinylog.impl; - provides org.tinylog.writers.Writer - with org.jabref.gui.logging.GuiWriter; + provides org.tinylog.writers.Writer with + org.jabref.gui.logging.GuiWriter; // Preferences and XML requires java.prefs; @@ -85,6 +87,7 @@ requires ojdbc10; requires org.postgresql.jdbc; requires org.mariadb.jdbc; + uses org.mariadb.jdbc.credential.CredentialPlugin; // Apache Commons and other (similar) helper libraries @@ -94,28 +97,20 @@ requires com.google.common; requires io.github.javadiffutils; requires java.string.similarity; - requires com.github.tomtung.latex2unicode; requires fastparse; - requires jbibtex; requires citeproc.java; - requires snuggletex.core; - requires org.apache.pdfbox; requires org.apache.xmpbox; requires com.ibm.icu; - requires flexmark; requires flexmark.util.ast; requires flexmark.util.data; - requires com.h2database.mvstore; - requires java.keyring; requires org.freedesktop.dbus; - requires org.jooq.jool; // fulltext search @@ -124,15 +119,16 @@ uses org.apache.lucene.codecs.lucene95.Lucene95Codec; requires org.apache.lucene.queryparser; + uses org.apache.lucene.queryparser.classic.MultiFieldQueryParser; + requires org.apache.lucene.analysis.common; requires org.apache.lucene.highlighter; - requires net.harawata.appdirs; requires com.sun.jna; requires com.sun.jna.platform; - requires org.eclipse.jgit; + uses org.eclipse.jgit.transport.SshSessionFactory; uses org.eclipse.jgit.lib.GpgSigner; diff --git a/src/main/java/org/jabref/cli/ArgumentProcessor.java b/src/main/java/org/jabref/cli/ArgumentProcessor.java index 1f436070319..31d01ccd901 100644 --- a/src/main/java/org/jabref/cli/ArgumentProcessor.java +++ b/src/main/java/org/jabref/cli/ArgumentProcessor.java @@ -81,11 +81,13 @@ public class ArgumentProcessor { * First call the constructor, then call {@link #processArguments()}. * Afterward, you can access the {@link #getParserResults()} and other getters. */ - public ArgumentProcessor(String[] args, - Mode startupMode, - PreferencesService preferencesService, - FileUpdateMonitor fileUpdateMonitor, - BibEntryTypesManager entryTypesManager) throws org.apache.commons.cli.ParseException { + public ArgumentProcessor( + String[] args, + Mode startupMode, + PreferencesService preferencesService, + FileUpdateMonitor fileUpdateMonitor, + BibEntryTypesManager entryTypesManager) + throws org.apache.commons.cli.ParseException { this.cli = new JabRefCLI(args); this.startupMode = startupMode; this.preferencesService = preferencesService; @@ -107,7 +109,8 @@ private Optional importToOpenBase(String argument) { return result; } - private Optional importBibtexToOpenBase(String argument, ImportFormatPreferences importFormatPreferences) { + private Optional importBibtexToOpenBase( + String argument, ImportFormatPreferences importFormatPreferences) { BibtexParser parser = new BibtexParser(importFormatPreferences); try { List entries = parser.parseEntries(argument); @@ -237,13 +240,15 @@ public void processArguments() { automaticallySetFileLinks(loaded); } - if ((cli.isWriteXMPtoPdf() && cli.isEmbeddBibfileInPdf()) || (cli.isWriteMetadatatoPdf() && (cli.isWriteXMPtoPdf() || cli.isEmbeddBibfileInPdf()))) { + if ((cli.isWriteXMPtoPdf() && cli.isEmbeddBibfileInPdf()) + || (cli.isWriteMetadatatoPdf() && (cli.isWriteXMPtoPdf() || cli.isEmbeddBibfileInPdf()))) { System.err.println("Give only one of [writeXMPtoPdf, embeddBibfileInPdf, writeMetadatatoPdf]"); } if (cli.isWriteMetadatatoPdf() || cli.isWriteXMPtoPdf() || cli.isEmbeddBibfileInPdf()) { if (!loaded.isEmpty()) { - writeMetadataToPdf(loaded, + writeMetadataToPdf( + loaded, cli.getWriteMetadatatoPdf(), preferencesService.getXmpPreferences(), preferencesService.getFilePreferences(), @@ -280,16 +285,17 @@ public void processArguments() { this.parserResults = loaded; } - private void writeMetadataToPdf(List loaded, - String filesAndCitekeys, - XmpPreferences xmpPreferences, - FilePreferences filePreferences, - BibDatabaseMode databaseMode, - BibEntryTypesManager entryTypesManager, - FieldPreferences fieldPreferences, - JournalAbbreviationRepository abbreviationRepository, - boolean writeXMP, - boolean embeddBibfile) { + private void writeMetadataToPdf( + List loaded, + String filesAndCitekeys, + XmpPreferences xmpPreferences, + FilePreferences filePreferences, + BibDatabaseMode databaseMode, + BibEntryTypesManager entryTypesManager, + FieldPreferences fieldPreferences, + JournalAbbreviationRepository abbreviationRepository, + boolean writeXMP, + boolean embeddBibfile) { if (loaded.isEmpty()) { LOGGER.error("The write xmp option depends on a valid import option."); return; @@ -298,7 +304,8 @@ private void writeMetadataToPdf(List loaded, BibDatabaseContext databaseContext = pr.getDatabaseContext(); XmpPdfExporter xmpPdfExporter = new XmpPdfExporter(xmpPreferences); - EmbeddedBibFilePdfExporter embeddedBibFilePdfExporter = new EmbeddedBibFilePdfExporter(databaseMode, entryTypesManager, fieldPreferences); + EmbeddedBibFilePdfExporter embeddedBibFilePdfExporter = + new EmbeddedBibFilePdfExporter(databaseMode, entryTypesManager, fieldPreferences); if ("all".equals(filesAndCitekeys)) { for (BibEntry entry : databaseContext.getEntries()) { @@ -346,28 +353,35 @@ private void writeMetadataToPdf(List loaded, embeddBibfile); } - private void writeMetadataToPDFsOfEntry(BibDatabaseContext databaseContext, - String citeKey, - BibEntry entry, - FilePreferences filePreferences, - XmpPdfExporter xmpPdfExporter, - EmbeddedBibFilePdfExporter embeddedBibFilePdfExporter, - JournalAbbreviationRepository abbreviationRepository, - boolean writeXMP, - boolean embeddBibfile) { + private void writeMetadataToPDFsOfEntry( + BibDatabaseContext databaseContext, + String citeKey, + BibEntry entry, + FilePreferences filePreferences, + XmpPdfExporter xmpPdfExporter, + EmbeddedBibFilePdfExporter embeddedBibFilePdfExporter, + JournalAbbreviationRepository abbreviationRepository, + boolean writeXMP, + boolean embeddBibfile) { try { if (writeXMP) { - if (xmpPdfExporter.exportToAllFilesOfEntry(databaseContext, filePreferences, entry, List.of(entry), abbreviationRepository)) { + if (xmpPdfExporter.exportToAllFilesOfEntry( + databaseContext, filePreferences, entry, List.of(entry), abbreviationRepository)) { System.out.printf("Successfully written XMP metadata on at least one linked file of %s%n", citeKey); } else { - System.err.printf("Cannot write XMP metadata on any linked files of %s. Make sure there is at least one linked file and the path is correct.%n", citeKey); + System.err.printf( + "Cannot write XMP metadata on any linked files of %s. Make sure there is at least one linked file and the path is correct.%n", + citeKey); } } if (embeddBibfile) { - if (embeddedBibFilePdfExporter.exportToAllFilesOfEntry(databaseContext, filePreferences, entry, List.of(entry), abbreviationRepository)) { + if (embeddedBibFilePdfExporter.exportToAllFilesOfEntry( + databaseContext, filePreferences, entry, List.of(entry), abbreviationRepository)) { System.out.printf("Successfully embedded metadata on at least one linked file of %s%n", citeKey); } else { - System.out.printf("Cannot embedd metadata on any linked files of %s. Make sure there is at least one linked file and the path is correct.%n", citeKey); + System.out.printf( + "Cannot embedd metadata on any linked files of %s. Make sure there is at least one linked file and the path is correct.%n", + citeKey); } } } catch (Exception e) { @@ -375,14 +389,15 @@ private void writeMetadataToPDFsOfEntry(BibDatabaseContext databaseContext, } } - private void writeMetadataToPdfByCitekey(BibDatabaseContext databaseContext, - List citeKeys, - FilePreferences filePreferences, - XmpPdfExporter xmpPdfExporter, - EmbeddedBibFilePdfExporter embeddedBibFilePdfExporter, - JournalAbbreviationRepository abbreviationRepository, - boolean writeXMP, - boolean embeddBibfile) { + private void writeMetadataToPdfByCitekey( + BibDatabaseContext databaseContext, + List citeKeys, + FilePreferences filePreferences, + XmpPdfExporter xmpPdfExporter, + EmbeddedBibFilePdfExporter embeddedBibFilePdfExporter, + JournalAbbreviationRepository abbreviationRepository, + boolean writeXMP, + boolean embeddBibfile) { for (String citeKey : citeKeys) { List bibEntryList = databaseContext.getDatabase().getEntriesByCitationKey(citeKey); if (bibEntryList.isEmpty()) { @@ -390,36 +405,52 @@ private void writeMetadataToPdfByCitekey(BibDatabaseContext databaseContext, continue; } for (BibEntry entry : bibEntryList) { - writeMetadataToPDFsOfEntry(databaseContext, citeKey, entry, filePreferences, xmpPdfExporter, embeddedBibFilePdfExporter, abbreviationRepository, writeXMP, embeddBibfile); + writeMetadataToPDFsOfEntry( + databaseContext, + citeKey, + entry, + filePreferences, + xmpPdfExporter, + embeddedBibFilePdfExporter, + abbreviationRepository, + writeXMP, + embeddBibfile); } } } - private void writeMetadataToPdfByFileNames(BibDatabaseContext databaseContext, - List pdfs, - FilePreferences filePreferences, - XmpPdfExporter xmpPdfExporter, - EmbeddedBibFilePdfExporter embeddedBibFilePdfExporter, - JournalAbbreviationRepository abbreviationRepository, - boolean writeXMP, - boolean embeddBibfile) { + private void writeMetadataToPdfByFileNames( + BibDatabaseContext databaseContext, + List pdfs, + FilePreferences filePreferences, + XmpPdfExporter xmpPdfExporter, + EmbeddedBibFilePdfExporter embeddedBibFilePdfExporter, + JournalAbbreviationRepository abbreviationRepository, + boolean writeXMP, + boolean embeddBibfile) { for (String fileName : pdfs) { Path filePath = Path.of(fileName); if (!filePath.isAbsolute()) { - filePath = FileUtil.find(fileName, databaseContext.getFileDirectories(filePreferences)).orElse(FileUtil.find(fileName, List.of(Path.of("").toAbsolutePath())).orElse(filePath)); + filePath = FileUtil.find(fileName, databaseContext.getFileDirectories(filePreferences)) + .orElse(FileUtil.find(fileName, List.of(Path.of("").toAbsolutePath())) + .orElse(filePath)); } if (Files.exists(filePath)) { try { if (writeXMP) { - if (xmpPdfExporter.exportToFileByPath(databaseContext, filePreferences, filePath, abbreviationRepository)) { - System.out.printf("Successfully written XMP metadata of at least one entry to %s%n", fileName); + if (xmpPdfExporter.exportToFileByPath( + databaseContext, filePreferences, filePath, abbreviationRepository)) { + System.out.printf( + "Successfully written XMP metadata of at least one entry to %s%n", fileName); } else { System.out.printf("File %s is not linked to any entry in database.%n", fileName); } } if (embeddBibfile) { - if (embeddedBibFilePdfExporter.exportToFileByPath(databaseContext, filePreferences, filePath, abbreviationRepository)) { - System.out.printf("Successfully embedded XMP metadata of at least one entry to %s%n", fileName); + if (embeddedBibFilePdfExporter.exportToFileByPath( + databaseContext, filePreferences, filePath, abbreviationRepository)) { + System.out.printf( + "Successfully embedded XMP metadata of at least one entry to %s%n", fileName); } else { System.out.printf("File %s is not linked to any entry in database.%n", fileName); } @@ -455,11 +486,14 @@ private boolean exportMatches(List loaded) { switch (data.length) { case 3 -> formatName = data[2]; case 2 -> - // default exporter: bib file - formatName = "bib"; + // default exporter: bib file + formatName = "bib"; default -> { - System.err.println(Localization.lang("Output file missing").concat(". \n \t ") - .concat(Localization.lang("Usage")).concat(": ") + JabRefCLI.getExportMatchesSyntax()); + System.err.println(Localization.lang("Output file missing") + .concat(". \n \t ") + .concat(Localization.lang("Usage")) + .concat(": ") + + JabRefCLI.getExportMatchesSyntax()); noGUINeeded = true; return false; } @@ -472,9 +506,7 @@ private boolean exportMatches(List loaded) { LOGGER.debug("Finished export"); } else { // export new database - ExporterFactory exporterFactory = ExporterFactory.create( - preferencesService, - Globals.entryTypesManager); + ExporterFactory exporterFactory = ExporterFactory.create(preferencesService, Globals.entryTypesManager); Optional exporter = exporterFactory.getExporterByName(formatName); if (exporter.isEmpty()) { System.err.println(Localization.lang("Unknown export format %0", formatName)); @@ -482,9 +514,17 @@ private boolean exportMatches(List loaded) { // We have an TemplateExporter instance: try { System.out.println(Localization.lang("Exporting %0", data[1])); - exporter.get().export(databaseContext, Path.of(data[1]), matches, Collections.emptyList(), Globals.journalAbbreviationRepository); + exporter.get() + .export( + databaseContext, + Path.of(data[1]), + matches, + Collections.emptyList(), + Globals.journalAbbreviationRepository); } catch (Exception ex) { - System.err.println(Localization.lang("Could not export file '%0' (reason: %1)", data[1], Throwables.getStackTraceAsString(ex))); + System.err.println(Localization.lang( + "Could not export file '%0' (reason: %1)", + data[1], Throwables.getStackTraceAsString(ex))); } } } @@ -524,9 +564,7 @@ private List importAndOpenFiles() { if (bibExtension) { try { pr = OpenDatabase.loadDatabase( - Path.of(aLeftOver), - preferencesService.getImportFormatPreferences(), - fileUpdateMonitor); + Path.of(aLeftOver), preferencesService.getImportFormatPreferences(), fileUpdateMonitor); } catch (IOException ex) { pr = ParserResult.fromError(ex); LOGGER.error("Error opening file '{}'", aLeftOver, ex); @@ -564,7 +602,8 @@ private List importAndOpenFiles() { } if (!cli.isBlank() && cli.isBibtexImport()) { - importBibtexToOpenBase(cli.getBibtexImport(), preferencesService.getImportFormatPreferences()).ifPresent(loaded::add); + importBibtexToOpenBase(cli.getBibtexImport(), preferencesService.getImportFormatPreferences()) + .ifPresent(loaded::add); } return loaded; @@ -599,8 +638,11 @@ private void saveDatabase(BibDatabase newBase, String subName) { System.out.println(Localization.lang("Saving") + ": " + subName); try (AtomicFileWriter fileWriter = new AtomicFileWriter(Path.of(subName), StandardCharsets.UTF_8)) { BibWriter bibWriter = new BibWriter(fileWriter, OS.NEWLINE); - SelfContainedSaveConfiguration saveConfiguration = (SelfContainedSaveConfiguration) new SelfContainedSaveConfiguration() - .withReformatOnSave(preferencesService.getLibraryPreferences().shouldAlwaysReformatOnSave()); + SelfContainedSaveConfiguration saveConfiguration = + (SelfContainedSaveConfiguration) new SelfContainedSaveConfiguration() + .withReformatOnSave(preferencesService + .getLibraryPreferences() + .shouldAlwaysReformatOnSave()); BibDatabaseWriter databaseWriter = new BibtexDatabaseWriter( bibWriter, saveConfiguration, @@ -612,7 +654,9 @@ private void saveDatabase(BibDatabase newBase, String subName) { // Show just a warning message if encoding did not work for all characters: if (fileWriter.hasEncodingProblems()) { System.err.println(Localization.lang("Warning") + ": " - + Localization.lang("UTF-8 could not be used to encode the following characters: %0", fileWriter.getEncodingProblems())); + + Localization.lang( + "UTF-8 could not be used to encode the following characters: %0", + fileWriter.getEncodingProblems())); } } } catch (IOException ex) { @@ -640,26 +684,28 @@ private void exportFile(List loaded, String[] data) { Path path = parserResult.getPath().get().toAbsolutePath(); BibDatabaseContext databaseContext = parserResult.getDatabaseContext(); databaseContext.setDatabasePath(path); - List fileDirForDatabase = databaseContext - .getFileDirectories(preferencesService.getFilePreferences()); + List fileDirForDatabase = databaseContext.getFileDirectories(preferencesService.getFilePreferences()); System.out.println(Localization.lang("Exporting %0", data[0])); - ExporterFactory exporterFactory = ExporterFactory.create( - preferencesService, - Globals.entryTypesManager); + ExporterFactory exporterFactory = ExporterFactory.create(preferencesService, Globals.entryTypesManager); Optional exporter = exporterFactory.getExporterByName(data[1]); if (exporter.isEmpty()) { System.err.println(Localization.lang("Unknown export format %0", data[1])); } else { // We have an exporter: try { - exporter.get().export( - parserResult.getDatabaseContext(), - Path.of(data[0]), - parserResult.getDatabaseContext().getDatabase().getEntries(), - fileDirForDatabase, - Globals.journalAbbreviationRepository); + exporter.get() + .export( + parserResult.getDatabaseContext(), + Path.of(data[0]), + parserResult + .getDatabaseContext() + .getDatabase() + .getEntries(), + fileDirForDatabase, + Globals.journalAbbreviationRepository); } catch (Exception ex) { - System.err.println(Localization.lang("Could not export file '%0' (reason: %1)", data[0], Throwables.getStackTraceAsString(ex))); + System.err.println(Localization.lang( + "Could not export file '%0' (reason: %1)", data[0], Throwables.getStackTraceAsString(ex))); } } } @@ -716,8 +762,7 @@ private void regenerateCitationKeys(List loaded) { LOGGER.info(Localization.lang("Regenerating citation keys according to metadata")); CitationKeyGenerator keyGenerator = new CitationKeyGenerator( - parserResult.getDatabaseContext(), - preferencesService.getCitationKeyPatternPreferences()); + parserResult.getDatabaseContext(), preferencesService.getCitationKeyPatternPreferences()); for (BibEntry entry : database.getEntries()) { keyGenerator.generateAndSetKey(entry); } @@ -742,11 +787,10 @@ private Optional fetch(String fetchCommand) { String query = split[1]; Set fetchers = WebFetchers.getSearchBasedFetchers( - preferencesService.getImportFormatPreferences(), - preferencesService.getImporterPreferences()); + preferencesService.getImportFormatPreferences(), preferencesService.getImporterPreferences()); Optional selectedFetcher = fetchers.stream() - .filter(fetcher -> fetcher.getName().equalsIgnoreCase(engine)) - .findFirst(); + .filter(fetcher -> fetcher.getName().equalsIgnoreCase(engine)) + .findFirst(); if (selectedFetcher.isEmpty()) { System.out.println(Localization.lang("Could not find fetcher '%0'", engine)); @@ -782,6 +826,7 @@ public boolean shouldShutDown() { } public enum Mode { - INITIAL_START, REMOTE_START + INITIAL_START, + REMOTE_START } } diff --git a/src/main/java/org/jabref/cli/JabRefCLI.java b/src/main/java/org/jabref/cli/JabRefCLI.java index 484201b63ff..449f9df981c 100644 --- a/src/main/java/org/jabref/cli/JabRefCLI.java +++ b/src/main/java/org/jabref/cli/JabRefCLI.java @@ -23,7 +23,8 @@ public class JabRefCLI { private static final int WIDTH = 100; // Number of characters per line before a line break must be added. - private static final String WRAPPED_LINE_PREFIX = ""; // If a line break is added, this prefix will be inserted at the beginning of the next line + private static final String WRAPPED_LINE_PREFIX = + ""; // If a line break is added, this prefix will be inserted at the beginning of the next line private static final String STRING_TABLE_DELIMITER = " : "; private final CommandLine cl; @@ -37,10 +38,9 @@ public JabRefCLI(String[] args) throws ParseException { } public static String getExportMatchesSyntax() { - return String.format("[%s]searchTerm,outputFile:%s[,%s]", - Localization.lang("field"), - Localization.lang("file"), - Localization.lang("exportFormat")); + return String.format( + "[%s]searchTerm,outputFile:%s[,%s]", + Localization.lang("field"), Localization.lang("file"), Localization.lang("exportFormat")); } public boolean isHelp() { @@ -164,9 +164,11 @@ public boolean isWriteMetadatatoPdf() { } public String getWriteMetadatatoPdf() { - return cl.hasOption("writeMetadatatoPdf") ? cl.getOptionValue("writeMetadatatoPdf") : - cl.hasOption("writeXMPtoPdf") ? cl.getOptionValue("writeXMPtoPdf") : - cl.hasOption("embeddBibfileInPdf") ? cl.getOptionValue("embeddBibfileInPdf") : null; + return cl.hasOption("writeMetadatatoPdf") + ? cl.getOptionValue("writeMetadatatoPdf") + : cl.hasOption("writeXMPtoPdf") + ? cl.getOptionValue("writeXMPtoPdf") + : cl.hasOption("embeddBibfileInPdf") ? cl.getOptionValue("embeddBibfileInPdf") : null; } private static Options getOptions() { @@ -175,115 +177,117 @@ private static Options getOptions() { // boolean options options.addOption("h", "help", false, Localization.lang("Display help on command line options")); options.addOption("n", "nogui", false, Localization.lang("No GUI. Only process command line options")); - options.addOption("asfl", "automaticallySetFileLinks", false, Localization.lang("Automatically set file links")); - options.addOption("g", "generateCitationKeys", false, Localization.lang("Regenerate all keys for the entries in a BibTeX file")); + options.addOption( + "asfl", "automaticallySetFileLinks", false, Localization.lang("Automatically set file links")); + options.addOption( + "g", + "generateCitationKeys", + false, + Localization.lang("Regenerate all keys for the entries in a BibTeX file")); options.addOption("b", "blank", false, Localization.lang("Do not open any files at startup")); options.addOption("v", "version", false, Localization.lang("Display version")); options.addOption(null, "debug", false, Localization.lang("Show debug level messages")); // The "-console" option is handled by the install4j launcher - options.addOption(null, "console", false, Localization.lang("Show console output (only when the launcher is used)")); + options.addOption( + null, "console", false, Localization.lang("Show console output (only when the launcher is used)")); - options.addOption(Option - .builder("i") + options.addOption(Option.builder("i") .longOpt("import") .desc(String.format("%s: '%s'", Localization.lang("Import file"), "-i library.bib")) .hasArg() .argName("FILE[,FORMAT]") .build()); - options.addOption(Option - .builder() + options.addOption(Option.builder() .longOpt("importToOpen") .desc(Localization.lang("Same as --import, but will be imported to the opened tab")) .hasArg() .argName("FILE[,FORMAT]") .build()); - options.addOption(Option - .builder("ib") + options.addOption(Option.builder("ib") .longOpt("importBibtex") .desc(String.format("%s: '%s'", Localization.lang("Import BibTeX"), "-ib @article{entry}")) .hasArg() .argName("BIBTEXT_STRING") .build()); - options.addOption(Option - .builder("o") + options.addOption(Option.builder("o") .longOpt("output") - .desc(String.format("%s: '%s'", Localization.lang("Export an input to a file"), "-i db.bib -o db.htm,html")) + .desc(String.format( + "%s: '%s'", Localization.lang("Export an input to a file"), "-i db.bib -o db.htm,html")) .hasArg() .argName("FILE[,FORMAT]") .build()); - options.addOption(Option - .builder("m") + options.addOption(Option.builder("m") .longOpt("exportMatches") - .desc(String.format("%s: '%s'", Localization.lang("Matching"), "-i db.bib -m author=Newton,search.htm,html")) + .desc(String.format( + "%s: '%s'", Localization.lang("Matching"), "-i db.bib -m author=Newton,search.htm,html")) .hasArg() .argName("QUERY,FILE[,FORMAT]") .build()); - options.addOption(Option - .builder("f") + options.addOption(Option.builder("f") .longOpt("fetch") .desc(String.format("%s: '%s'", Localization.lang("Run fetcher"), "-f Medline/PubMed:cancer")) .hasArg() .argName("FETCHER:QUERY") .build()); - options.addOption(Option - .builder("a") + options.addOption(Option.builder("a") .longOpt("aux") - .desc(String.format("%s: '%s'", Localization.lang("Sublibrary from AUX to BibTeX"), "-a thesis.aux,new.bib")) + .desc(String.format( + "%s: '%s'", Localization.lang("Sublibrary from AUX to BibTeX"), "-a thesis.aux,new.bib")) .hasArg() .argName("FILE[.aux],FILE[.bib] FILE") .build()); - options.addOption(Option - .builder("x") + options.addOption(Option.builder("x") .longOpt("prexp") .desc(String.format("%s: '%s'", Localization.lang("Export preferences to a file"), "-x prefs.xml")) .hasArg() .argName("[FILE]") .build()); - options.addOption(Option - .builder("p") + options.addOption(Option.builder("p") .longOpt("primp") .desc(String.format("%s: '%s'", Localization.lang("Import preferences from a file"), "-p prefs.xml")) .hasArg() .argName("[FILE]") .build()); - options.addOption(Option - .builder("d") + options.addOption(Option.builder("d") .longOpt("prdef") - .desc(String.format("%s: '%s'", Localization.lang("Reset preferences"), "-d mainFontSize,newline' or '-d all")) + .desc(String.format( + "%s: '%s'", Localization.lang("Reset preferences"), "-d mainFontSize,newline' or '-d all")) .hasArg() .argName("KEY1[,KEY2][,KEYn] | all") .build()); - options.addOption(Option - .builder() + options.addOption(Option.builder() .longOpt("writeXMPtoPdf") - .desc(String.format("%s: '%s'", Localization.lang("Write BibTeXEntry as XMP metadata to PDF."), "-w pathToMyOwnPaper.pdf")) + .desc(String.format( + "%s: '%s'", + Localization.lang("Write BibTeXEntry as XMP metadata to PDF."), "-w pathToMyOwnPaper.pdf")) .hasArg() .argName("CITEKEY1[,CITEKEY2][,CITEKEYn] | PDF1[,PDF2][,PDFn] | all") .build()); - options.addOption(Option - .builder() + options.addOption(Option.builder() .longOpt("embeddBibfileInPdf") - .desc(String.format("%s: '%s'", Localization.lang("Embed BibTeXEntry in PDF."), "-w pathToMyOwnPaper.pdf")) + .desc(String.format( + "%s: '%s'", Localization.lang("Embed BibTeXEntry in PDF."), "-w pathToMyOwnPaper.pdf")) .hasArg() .argName("CITEKEY1[,CITEKEY2][,CITEKEYn] | PDF1[,PDF2][,PDFn] | all") .build()); - options.addOption(Option - .builder("w") + options.addOption(Option.builder("w") .longOpt("writeMetadatatoPdf") - .desc(String.format("%s: '%s'", Localization.lang("Write BibTeXEntry as metadata to PDF."), "-w pathToMyOwnPaper.pdf")) + .desc(String.format( + "%s: '%s'", + Localization.lang("Write BibTeXEntry as metadata to PDF."), "-w pathToMyOwnPaper.pdf")) .hasArg() .argName("CITEKEY1[,CITEKEY2][,CITEKEYn] | PDF1[,PDF2][,PDFn] | all") .build()); @@ -302,24 +306,21 @@ public static void printUsage(PreferencesService preferencesService) { preferencesService.getImporterPreferences(), preferencesService.getImportFormatPreferences(), new DummyFileUpdateMonitor()); - List> importFormats = importFormatReader - .getImportFormats().stream() + List> importFormats = importFormatReader.getImportFormats().stream() .map(format -> new Pair<>(format.getName(), format.getId())) .toList(); String importFormatsIntro = Localization.lang("Available import formats"); String importFormatsList = String.format("%s:%n%s%n", importFormatsIntro, alignStringTable(importFormats)); - ExporterFactory exporterFactory = ExporterFactory.create( - preferencesService, - Globals.entryTypesManager); - List> exportFormats = exporterFactory - .getExporters().stream() + ExporterFactory exporterFactory = ExporterFactory.create(preferencesService, Globals.entryTypesManager); + List> exportFormats = exporterFactory.getExporters().stream() .map(format -> new Pair<>(format.getName(), format.getId())) .toList(); String outFormatsIntro = Localization.lang("Available export formats"); String outFormatsList = String.format("%s:%n%s%n", outFormatsIntro, alignStringTable(exportFormats)); - String footer = '\n' + importFormatsList + outFormatsList + "\nPlease report issues at https://github.com/JabRef/jabref/issues."; + String footer = '\n' + importFormatsList + outFormatsList + + "\nPlease report issues at https://github.com/JabRef/jabref/issues."; HelpFormatter formatter = new HelpFormatter(); formatter.printHelp(WIDTH, "jabref [OPTIONS] [BIBTEX_FILE]\n\nOptions:", header, getOptions(), footer, true); @@ -337,8 +338,9 @@ protected static String alignStringTable(List> table) { StringBuilder sb = new StringBuilder(); int maxLength = table.stream() - .mapToInt(pair -> Objects.requireNonNullElse(pair.getKey(), "").length()) - .max().orElse(0); + .mapToInt(pair -> Objects.requireNonNullElse(pair.getKey(), "").length()) + .max() + .orElse(0); for (Pair pair : table) { int padding = Math.max(0, maxLength - pair.getKey().length()); diff --git a/src/main/java/org/jabref/cli/JournalListMvGenerator.java b/src/main/java/org/jabref/cli/JournalListMvGenerator.java index 9a4fd3d67c6..97dc740cb96 100644 --- a/src/main/java/org/jabref/cli/JournalListMvGenerator.java +++ b/src/main/java/org/jabref/cli/JournalListMvGenerator.java @@ -36,16 +36,15 @@ public static void main(String[] args) throws IOException { "journal_abbreviations_webofscience-dotless.csv", // we currently do not have good support for BibTeX strings - "journal_abbreviations_ieee_strings.csv" - ); + "journal_abbreviations_ieee_strings.csv"); Files.createDirectories(journalListMvFile.getParent()); try (DirectoryStream stream = Files.newDirectoryStream(abbreviationsDirectory, "*.csv"); - MVStore store = new MVStore.Builder(). - fileName(journalListMvFile.toString()). - compressHigh(). - open()) { + MVStore store = new MVStore.Builder() + .fileName(journalListMvFile.toString()) + .compressHigh() + .open()) { MVMap fullToAbbreviation = store.openMap("FullToAbbreviation"); stream.forEach(Unchecked.consumer(path -> { String fileName = path.getFileName().toString(); @@ -55,9 +54,9 @@ public static void main(String[] args) throws IOException { System.out.println(" ignored"); } else { System.out.println("..."); - Collection abbreviations = JournalAbbreviationLoader.readAbbreviationsFromCsvFile(path); - Map abbreviationMap = abbreviations - .stream() + Collection abbreviations = + JournalAbbreviationLoader.readAbbreviationsFromCsvFile(path); + Map abbreviationMap = abbreviations.stream() .collect(Collectors.toMap( Abbreviation::getName, abbreviation -> abbreviation, diff --git a/src/main/java/org/jabref/cli/Launcher.java b/src/main/java/org/jabref/cli/Launcher.java index a49ea92e865..b0454018840 100644 --- a/src/main/java/org/jabref/cli/Launcher.java +++ b/src/main/java/org/jabref/cli/Launcher.java @@ -100,7 +100,12 @@ public static void main(String[] args) { System.exit(0); } - MainApplication.main(argumentProcessor.getParserResults(), argumentProcessor.isBlank(), preferences, fileUpdateMonitor, ARGUMENTS); + MainApplication.main( + argumentProcessor.getParserResults(), + argumentProcessor.isBlank(), + preferences, + fileUpdateMonitor, + ARGUMENTS); } catch (ParseException e) { LOGGER.error("Problem parsing arguments", e); JabRefCLI.printUsage(preferences); @@ -132,11 +137,16 @@ private static void addLogToDisk() { // The "Shared File Writer" is explained at // https://tinylog.org/v2/configuration/#shared-file-writer Map configuration = Map.of( - "writerFile", "shared file", - "writerFile.level", isDebugEnabled ? "debug" : "info", - "level", isDebugEnabled ? "debug" : "info", - "writerFile.file", directory.resolve("log.txt").toString(), - "writerFile.charset", "UTF-8"); + "writerFile", + "shared file", + "writerFile.level", + isDebugEnabled ? "debug" : "info", + "level", + isDebugEnabled ? "debug" : "info", + "writerFile.file", + directory.resolve("log.txt").toString(), + "writerFile.charset", + "UTF-8"); configuration.entrySet().forEach(config -> Configuration.set(config.getKey(), config.getValue())); initializeLogger(); @@ -167,8 +177,8 @@ private static boolean handleMultipleAppInstances(String[] args, RemotePreferenc private static void initGlobals(PreferencesService preferences) { // Read list(s) of journal names and abbreviations - Globals.journalAbbreviationRepository = JournalAbbreviationLoader - .loadRepository(preferences.getJournalAbbreviationPreferences()); + Globals.journalAbbreviationRepository = + JournalAbbreviationLoader.loadRepository(preferences.getJournalAbbreviationPreferences()); Globals.entryTypesManager = preferences.getCustomEntryTypesRepository(); Globals.protectedTermsLoader = new ProtectedTermsLoader(preferences.getProtectedTermsPreferences()); @@ -197,7 +207,9 @@ private static void clearOldSearchIndices() { try (DirectoryStream stream = Files.newDirectoryStream(appData)) { for (Path path : stream) { - if (Files.isDirectory(path) && !path.toString().endsWith("ssl") && path.toString().contains("lucene") + if (Files.isDirectory(path) + && !path.toString().endsWith("ssl") + && path.toString().contains("lucene") && !path.equals(currentIndexPath)) { LOGGER.info("Deleting out-of-date fulltext search index at {}.", path); Files.walk(path) diff --git a/src/main/java/org/jabref/gui/BasePanelMode.java b/src/main/java/org/jabref/gui/BasePanelMode.java index 9305439ad2b..63b478c5709 100644 --- a/src/main/java/org/jabref/gui/BasePanelMode.java +++ b/src/main/java/org/jabref/gui/BasePanelMode.java @@ -3,7 +3,6 @@ /** * Defines the different modes that the BasePanel can operate in */ - public enum BasePanelMode { SHOWING_NOTHING, SHOWING_EDITOR, diff --git a/src/main/java/org/jabref/gui/ClipBoardManager.java b/src/main/java/org/jabref/gui/ClipBoardManager.java index 8ff63a59374..ed35818427b 100644 --- a/src/main/java/org/jabref/gui/ClipBoardManager.java +++ b/src/main/java/org/jabref/gui/ClipBoardManager.java @@ -42,7 +42,8 @@ public ClipBoardManager(PreferencesService preferencesService) { this(Clipboard.getSystemClipboard(), Toolkit.getDefaultToolkit().getSystemSelection(), preferencesService); } - public ClipBoardManager(Clipboard clipboard, java.awt.datatransfer.Clipboard primary, PreferencesService preferencesService) { + public ClipBoardManager( + Clipboard clipboard, java.awt.datatransfer.Clipboard primary, PreferencesService preferencesService) { ClipBoardManager.clipboard = clipboard; ClipBoardManager.primary = primary; this.preferencesService = preferencesService; @@ -59,14 +60,15 @@ public ClipBoardManager(Clipboard clipboard, java.awt.datatransfer.Clipboard pri * text over clipboards */ public static void addX11Support(TextInputControl input) { - input.selectedTextProperty().addListener( - // using InvalidationListener because of https://bugs.openjdk.java.net/browse/JDK-8176270 - observable -> Platform.runLater(() -> { - String newValue = input.getSelectedText(); - if (!newValue.isEmpty() && (primary != null)) { - primary.setContents(new StringSelection(newValue), null); - } - })); + input.selectedTextProperty() + .addListener( + // using InvalidationListener because of https://bugs.openjdk.java.net/browse/JDK-8176270 + observable -> Platform.runLater(() -> { + String newValue = input.getSelectedText(); + if (!newValue.isEmpty() && (primary != null)) { + primary.setContents(new StringSelection(newValue), null); + } + })); input.setOnMouseClicked(event -> { if (event.getButton() == MouseButton.MIDDLE) { input.insertText(input.getCaretPosition(), getContentsPrimary()); @@ -144,10 +146,12 @@ public void setContent(String string) { public void setContent(List entries, BibEntryTypesManager entryTypesManager) throws IOException { final ClipboardContent content = new ClipboardContent(); - BibEntryWriter writer = new BibEntryWriter(new FieldWriter(preferencesService.getFieldPreferences()), entryTypesManager); + BibEntryWriter writer = + new BibEntryWriter(new FieldWriter(preferencesService.getFieldPreferences()), entryTypesManager); String serializedEntries = writer.serializeAll(entries, BibDatabaseMode.BIBTEX); // BibEntry is not Java serializable. Thus, we need to do the serialization manually - // At reading of the clipboard in JabRef, we parse the plain string in all cases, so we don't need to flag we put BibEntries here + // At reading of the clipboard in JabRef, we parse the plain string in all cases, so we don't need to flag we + // put BibEntries here // Furthermore, storing a string also enables other applications to work with the data content.putString(serializedEntries); clipboard.setContent(content); diff --git a/src/main/java/org/jabref/gui/DialogService.java b/src/main/java/org/jabref/gui/DialogService.java index c152bdcb343..b03363a5a22 100644 --- a/src/main/java/org/jabref/gui/DialogService.java +++ b/src/main/java/org/jabref/gui/DialogService.java @@ -33,12 +33,14 @@ public interface DialogService { * * @implNote The implementation should accept {@code null} for {@code defaultChoice}, but callers should use {@link #showChoiceDialogAndWait(String, String, String, Collection)}. */ - Optional showChoiceDialogAndWait(String title, String content, String okButtonLabel, T defaultChoice, Collection choices); + Optional showChoiceDialogAndWait( + String title, String content, String okButtonLabel, T defaultChoice, Collection choices); /** * This will create and display new {@link ChoiceDialog} of type T with a collection of possible choices */ - default Optional showChoiceDialogAndWait(String title, String content, String okButtonLabel, Collection choices) { + default Optional showChoiceDialogAndWait( + String title, String content, String okButtonLabel, Collection choices) { return showChoiceDialogAndWait(title, content, okButtonLabel, null, choices); } @@ -146,8 +148,8 @@ default void showErrorDialogAndWait(Exception exception) { * * @return true if the use clicked "YES" otherwise false */ - boolean showConfirmationDialogWithOptOutAndWait(String title, String content, - String optOutMessage, Consumer optOutAction); + boolean showConfirmationDialogWithOptOutAndWait( + String title, String content, String optOutMessage, Consumer optOutAction); /** * Create and display a new confirmation dialog. @@ -158,9 +160,13 @@ boolean showConfirmationDialogWithOptOutAndWait(String title, String content, * * @return true if the use clicked "YES" otherwise false */ - boolean showConfirmationDialogWithOptOutAndWait(String title, String content, - String okButtonLabel, String cancelButtonLabel, - String optOutMessage, Consumer optOutAction); + boolean showConfirmationDialogWithOptOutAndWait( + String title, + String content, + String okButtonLabel, + String cancelButtonLabel, + String optOutMessage, + Consumer optOutAction); /** * This will create and display new {@link CustomPasswordField} that doesn't show the text, and two buttons @@ -184,8 +190,8 @@ boolean showConfirmationDialogWithOptOutAndWait(String title, String content, * * @return Optional with the pressed Button as ButtonType */ - Optional showCustomButtonDialogAndWait(Alert.AlertType type, String title, String content, - ButtonType... buttonTypes); + Optional showCustomButtonDialogAndWait( + Alert.AlertType type, String title, String content, ButtonType... buttonTypes); /** * This will create and display a new dialog showing a custom {@link DialogPane} @@ -221,7 +227,8 @@ Optional showCustomButtonDialogAndWait(Alert.AlertType type, String * @param content message to show below the list of background tasks * @param stateManager The {@link StateManager} which contains the background tasks */ - Optional showBackgroundProgressDialogAndWait(String title, String content, StateManager stateManager); + Optional showBackgroundProgressDialogAndWait( + String title, String content, StateManager stateManager); /** * Notify the user in a non-blocking way (i.e., in form of toast in a snackbar). diff --git a/src/main/java/org/jabref/gui/DragAndDropDataFormats.java b/src/main/java/org/jabref/gui/DragAndDropDataFormats.java index 4ab27396efa..deec9300e41 100644 --- a/src/main/java/org/jabref/gui/DragAndDropDataFormats.java +++ b/src/main/java/org/jabref/gui/DragAndDropDataFormats.java @@ -16,5 +16,8 @@ public class DragAndDropDataFormats { public static final DataFormat LINKED_FILE = new DataFormat("dnd/org.jabref.model.entry.LinkedFile"); public static final DataFormat ENTRIES = new DataFormat("dnd/org.jabref.model.entry.BibEntries"); public static final DataFormat PREVIEWLAYOUTS = new DataFormat("dnd/org.jabref.logic.citationstyle.PreviewLayouts"); - @SuppressWarnings("unchecked") public static final Class> PREVIEWLAYOUT_LIST_CLASS = (Class>) (Class) List.class; + + @SuppressWarnings("unchecked") + public static final Class> PREVIEWLAYOUT_LIST_CLASS = + (Class>) (Class) List.class; } diff --git a/src/main/java/org/jabref/gui/DragAndDropHelper.java b/src/main/java/org/jabref/gui/DragAndDropHelper.java index 92e229a5c7f..3702af568d5 100644 --- a/src/main/java/org/jabref/gui/DragAndDropHelper.java +++ b/src/main/java/org/jabref/gui/DragAndDropHelper.java @@ -20,7 +20,10 @@ public static List getBibFiles(Dragboard dragboard) { if (!dragboard.hasFiles()) { return Collections.emptyList(); } else { - return dragboard.getFiles().stream().map(File::toPath).filter(FileUtil::isBibFile).collect(Collectors.toList()); + return dragboard.getFiles().stream() + .map(File::toPath) + .filter(FileUtil::isBibFile) + .collect(Collectors.toList()); } } diff --git a/src/main/java/org/jabref/gui/EntryType.fxml b/src/main/java/org/jabref/gui/EntryType.fxml index ac4e7f922ec..cfd81fc6dce 100644 --- a/src/main/java/org/jabref/gui/EntryType.fxml +++ b/src/main/java/org/jabref/gui/EntryType.fxml @@ -12,49 +12,107 @@ - + - - + + - + - + - + - + - + - + - + - + - - + + - + - - + + diff --git a/src/main/java/org/jabref/gui/EntryTypeView.java b/src/main/java/org/jabref/gui/EntryTypeView.java index 238d80d7d17..79c99a0ee6d 100644 --- a/src/main/java/org/jabref/gui/EntryTypeView.java +++ b/src/main/java/org/jabref/gui/EntryTypeView.java @@ -48,19 +48,41 @@ */ public class EntryTypeView extends BaseDialog { - @Inject private StateManager stateManager; - @Inject private TaskExecutor taskExecutor; - @Inject private FileUpdateMonitor fileUpdateMonitor; - - @FXML private ButtonType generateButton; - @FXML private TextField idTextField; - @FXML private ComboBox idBasedFetchers; - @FXML private FlowPane recommendedEntriesPane; - @FXML private FlowPane otherEntriesPane; - @FXML private FlowPane customPane; - @FXML private TitledPane recommendedEntriesTitlePane; - @FXML private TitledPane otherEntriesTitlePane; - @FXML private TitledPane customTitlePane; + @Inject + private StateManager stateManager; + + @Inject + private TaskExecutor taskExecutor; + + @Inject + private FileUpdateMonitor fileUpdateMonitor; + + @FXML + private ButtonType generateButton; + + @FXML + private TextField idTextField; + + @FXML + private ComboBox idBasedFetchers; + + @FXML + private FlowPane recommendedEntriesPane; + + @FXML + private FlowPane otherEntriesPane; + + @FXML + private FlowPane customPane; + + @FXML + private TitledPane recommendedEntriesTitlePane; + + @FXML + private TitledPane otherEntriesTitlePane; + + @FXML + private TitledPane customTitlePane; private final LibraryTab libraryTab; private final DialogService dialogService; @@ -76,9 +98,7 @@ public EntryTypeView(LibraryTab libraryTab, DialogService dialogService, Prefere this.preferencesService = preferences; this.setTitle(Localization.lang("Select entry type")); - ViewLoader.view(this) - .load() - .setAsDialogPane(this); + ViewLoader.view(this).load().setAsDialogPane(this); ControlHelper.setAction(generateButton, this.getDialogPane(), event -> viewModel.runFetcherWorker()); @@ -90,8 +110,14 @@ public EntryTypeView(LibraryTab libraryTab, DialogService dialogService, Prefere Button btnGenerate = (Button) this.getDialogPane().lookupButton(generateButton); btnGenerate.getStyleClass().add("customGenerateButton"); - btnGenerate.textProperty().bind(EasyBind.map(viewModel.searchingProperty(), searching -> searching ? Localization.lang("Searching...") : Localization.lang("Generate"))); - btnGenerate.disableProperty().bind(viewModel.idFieldValidationStatus().validProperty().not().or(viewModel.searchingProperty())); + btnGenerate + .textProperty() + .bind(EasyBind.map( + viewModel.searchingProperty(), + searching -> searching ? Localization.lang("Searching...") : Localization.lang("Generate"))); + btnGenerate + .disableProperty() + .bind(viewModel.idFieldValidationStatus().validProperty().not().or(viewModel.searchingProperty())); EasyBind.subscribe(viewModel.searchSuccesfulProperty(), isSuccessful -> { if (isSuccessful) { @@ -124,12 +150,7 @@ private void addEntriesToPane(FlowPane pane, Collection public void initialize() { visualizer.setDecoration(new IconValidationDecorator()); viewModel = new EntryTypeViewModel( - preferencesService, - libraryTab, - dialogService, - stateManager, - taskExecutor, - fileUpdateMonitor); + preferencesService, libraryTab, dialogService, stateManager, taskExecutor, fileUpdateMonitor); idBasedFetchers.itemsProperty().bind(viewModel.fetcherItemsProperty()); idTextField.textProperty().bindBidirectional(viewModel.idTextProperty()); @@ -142,9 +163,12 @@ public void initialize() { } }); - new ViewModelListCellFactory().withText(WebFetcher::getName).install(idBasedFetchers); + new ViewModelListCellFactory() + .withText(WebFetcher::getName) + .install(idBasedFetchers); - // we set the managed property so that they will only be rendered when they are visble so that the Nodes only take the space when visible + // we set the managed property so that they will only be rendered when they are visble so that the Nodes only + // take the space when visible // avoids removing and adding from the scence graph recommendedEntriesTitlePane.managedProperty().bind(recommendedEntriesTitlePane.visibleProperty()); otherEntriesTitlePane.managedProperty().bind(otherEntriesTitlePane.visibleProperty()); @@ -163,18 +187,16 @@ public void initialize() { List otherEntries; if (isBiblatexMode) { recommendedEntries = BiblatexEntryTypeDefinitions.RECOMMENDED; - otherEntries = BiblatexEntryTypeDefinitions.ALL - .stream() - .filter(e -> !recommendedEntries.contains(e)) - .collect(Collectors.toList()); + otherEntries = BiblatexEntryTypeDefinitions.ALL.stream() + .filter(e -> !recommendedEntries.contains(e)) + .collect(Collectors.toList()); otherEntries.addAll(BiblatexSoftwareEntryTypeDefinitions.ALL); otherEntries.addAll(BiblatexAPAEntryTypeDefinitions.ALL); } else { recommendedEntries = BibtexEntryTypeDefinitions.RECOMMENDED; - otherEntries = BibtexEntryTypeDefinitions.ALL - .stream() - .filter(e -> !recommendedEntries.contains(e)) - .collect(Collectors.toList()); + otherEntries = BibtexEntryTypeDefinitions.ALL.stream() + .filter(e -> !recommendedEntries.contains(e)) + .collect(Collectors.toList()); otherEntries.addAll(IEEETranEntryTypeDefinitions.ALL); } addEntriesToPane(recommendedEntriesPane, recommendedEntries); @@ -188,8 +210,10 @@ public void initialize() { addEntriesToPane(customPane, customTypes); } - viewModel.idTextProperty().addListener((obs, oldValue, newValue) -> - visualizer.initVisualization(viewModel.idFieldValidationStatus(), idTextField, true)); + viewModel + .idTextProperty() + .addListener((obs, oldValue, newValue) -> + visualizer.initVisualization(viewModel.idFieldValidationStatus(), idTextField, true)); Platform.runLater(() -> idTextField.requestFocus()); } @@ -223,16 +247,19 @@ public static String getDescription(EntryType selectedType) { if (selectedType instanceof StandardEntryType entryType) { switch (entryType) { case Article -> { - return Localization.lang("An article in a journal, magazine, newspaper, or other periodical which forms a self-contained unit with its own title."); + return Localization.lang( + "An article in a journal, magazine, newspaper, or other periodical which forms a self-contained unit with its own title."); } case Book -> { - return Localization.lang("A single-volume book with one or more authors where the authors share credit for the work as a whole."); + return Localization.lang( + "A single-volume book with one or more authors where the authors share credit for the work as a whole."); } case Booklet -> { return Localization.lang("A book-like work without a formal publisher or sponsoring institution."); } case Collection -> { - return Localization.lang("A single-volume collection with multiple, self-contained contributions by distinct authors which have their own title. The work as a whole has no overall author but it will usually have an editor."); + return Localization.lang( + "A single-volume collection with multiple, self-contained contributions by distinct authors which have their own title. The work as a whole has no overall author but it will usually have an editor."); } case Conference -> { return Localization.lang("A legacy alias for \"InProceedings\"."); @@ -241,7 +268,8 @@ public static String getDescription(EntryType selectedType) { return Localization.lang("A part of a book which forms a self-contained unit with its own title."); } case InCollection -> { - return Localization.lang("A contribution to a collection which forms a self-contained unit with a distinct author and title."); + return Localization.lang( + "A contribution to a collection which forms a self-contained unit with a distinct author and title."); } case InProceedings -> { return Localization.lang("An article in a conference proceedings."); @@ -250,28 +278,35 @@ public static String getDescription(EntryType selectedType) { return Localization.lang("Technical or other documentation, not necessarily in printed form."); } case MastersThesis -> { - return Localization.lang("Similar to \"Thesis\" except that the type field is optional and defaults to the localised term Master's thesis."); + return Localization.lang( + "Similar to \"Thesis\" except that the type field is optional and defaults to the localised term Master's thesis."); } case Misc -> { return Localization.lang("A fallback type for entries which do not fit into any other category."); } case PhdThesis -> { - return Localization.lang("Similar to \"Thesis\" except that the type field is optional and defaults to the localised term PhD thesis."); + return Localization.lang( + "Similar to \"Thesis\" except that the type field is optional and defaults to the localised term PhD thesis."); } case Proceedings -> { - return Localization.lang("A single-volume conference proceedings. This type is very similar to \"Collection\"."); + return Localization.lang( + "A single-volume conference proceedings. This type is very similar to \"Collection\"."); } case TechReport -> { - return Localization.lang("Similar to \"Report\" except that the type field is optional and defaults to the localised term technical report."); + return Localization.lang( + "Similar to \"Report\" except that the type field is optional and defaults to the localised term technical report."); } case Unpublished -> { - return Localization.lang("A work with an author and a title which has not been formally published, such as a manuscript or the script of a talk."); + return Localization.lang( + "A work with an author and a title which has not been formally published, such as a manuscript or the script of a talk."); } case BookInBook -> { - return Localization.lang("This type is similar to \"InBook\" but intended for works originally published as a stand-alone book."); + return Localization.lang( + "This type is similar to \"InBook\" but intended for works originally published as a stand-alone book."); } case InReference -> { - return Localization.lang("An article in a work of reference. This is a more specific variant of the generic \"InCollection\" entry type."); + return Localization.lang( + "An article in a work of reference. This is a more specific variant of the generic \"InCollection\" entry type."); } case MvBook -> { return Localization.lang("A multi-volume \"Book\"."); @@ -283,37 +318,46 @@ public static String getDescription(EntryType selectedType) { return Localization.lang("A multi-volume \"Proceedings\" entry."); } case MvReference -> { - return Localization.lang("A multi-volume \"Reference\" entry. The standard styles will treat this entry type as an alias for \"MvCollection\"."); + return Localization.lang( + "A multi-volume \"Reference\" entry. The standard styles will treat this entry type as an alias for \"MvCollection\"."); } case Online -> { - return Localization.lang("This entry type is intended for sources such as web sites which are intrinsically online resources."); + return Localization.lang( + "This entry type is intended for sources such as web sites which are intrinsically online resources."); } case Reference -> { - return Localization.lang("A single-volume work of reference such as an encyclopedia or a dictionary."); + return Localization.lang( + "A single-volume work of reference such as an encyclopedia or a dictionary."); } case Report -> { - return Localization.lang("A technical report, research report, or white paper published by a university or some other institution."); + return Localization.lang( + "A technical report, research report, or white paper published by a university or some other institution."); } case Set -> { - return Localization.lang("An entry set is a group of entries which are cited as a single reference and listed as a single item in the bibliography."); + return Localization.lang( + "An entry set is a group of entries which are cited as a single reference and listed as a single item in the bibliography."); } case SuppBook -> { - return Localization.lang("Supplemental material in a \"Book\". This type is provided for elements such as prefaces, introductions, forewords, afterwords, etc. which often have a generic title only."); + return Localization.lang( + "Supplemental material in a \"Book\". This type is provided for elements such as prefaces, introductions, forewords, afterwords, etc. which often have a generic title only."); } case SuppCollection -> { return Localization.lang("Supplemental material in a \"Collection\"."); } case SuppPeriodical -> { - return Localization.lang("Supplemental material in a \"Periodical\". This type may be useful when referring to items such as regular columns, obituaries, letters to the editor, etc. which only have a generic title."); + return Localization.lang( + "Supplemental material in a \"Periodical\". This type may be useful when referring to items such as regular columns, obituaries, letters to the editor, etc. which only have a generic title."); } case Thesis -> { - return Localization.lang("A thesis written for an educational institution to satisfy the requirements for a degree."); + return Localization.lang( + "A thesis written for an educational institution to satisfy the requirements for a degree."); } case WWW -> { return Localization.lang("An alias for \"Online\", provided for jurabib compatibility."); } case Software -> { - return Localization.lang("Computer software. The standard styles will treat this entry type as an alias for \"Misc\"."); + return Localization.lang( + "Computer software. The standard styles will treat this entry type as an alias for \"Misc\"."); } case Dataset -> { return Localization.lang("A data set or a similar collection of (mostly) raw data."); diff --git a/src/main/java/org/jabref/gui/EntryTypeViewModel.java b/src/main/java/org/jabref/gui/EntryTypeViewModel.java index a197348997a..5f88b028544 100644 --- a/src/main/java/org/jabref/gui/EntryTypeViewModel.java +++ b/src/main/java/org/jabref/gui/EntryTypeViewModel.java @@ -56,12 +56,13 @@ public class EntryTypeViewModel { private final TaskExecutor taskExecutor; private final FileUpdateMonitor fileUpdateMonitor; - public EntryTypeViewModel(PreferencesService preferences, - LibraryTab libraryTab, - DialogService dialogService, - StateManager stateManager, - TaskExecutor taskExecutor, - FileUpdateMonitor fileUpdateMonitor) { + public EntryTypeViewModel( + PreferencesService preferences, + LibraryTab libraryTab, + DialogService dialogService, + StateManager stateManager, + TaskExecutor taskExecutor, + FileUpdateMonitor fileUpdateMonitor) { this.libraryTab = libraryTab; this.preferencesService = preferences; this.dialogService = dialogService; @@ -70,8 +71,7 @@ public EntryTypeViewModel(PreferencesService preferences, this.fileUpdateMonitor = fileUpdateMonitor; fetchers.addAll(WebFetchers.getIdBasedFetchers( - preferences.getImportFormatPreferences(), - preferences.getImporterPreferences())); + preferences.getImportFormatPreferences(), preferences.getImporterPreferences())); selectedItemProperty.setValue(getLastSelectedFetcher()); idFieldValidator = new FunctionBasedValidator<>( idText, @@ -104,15 +104,17 @@ public BooleanProperty getFocusAndSelectAllProperty() { } public void storeSelectedFetcher() { - preferencesService.getGuiPreferences().setLastSelectedIdBasedFetcher(selectedItemProperty.getValue().getName()); + preferencesService + .getGuiPreferences() + .setLastSelectedIdBasedFetcher(selectedItemProperty.getValue().getName()); } private IdBasedFetcher getLastSelectedFetcher() { - return fetchers.stream().filter(fetcher -> fetcher.getName() - .equals(preferencesService.getGuiPreferences() - .getLastSelectedIdBasedFetcher())) - .findFirst() - .orElse(new DoiFetcher(preferencesService.getImportFormatPreferences())); + return fetchers.stream() + .filter(fetcher -> fetcher.getName() + .equals(preferencesService.getGuiPreferences().getLastSelectedIdBasedFetcher())) + .findFirst() + .orElse(new DoiFetcher(preferencesService.getImportFormatPreferences())); } public ListProperty fetcherItemsProperty() { @@ -152,14 +154,28 @@ public void runFetcherWorker() { String searchId = idText.getValue(); if (exception instanceof FetcherClientException) { - dialogService.showInformationDialogAndWait(Localization.lang("Failed to import by ID"), Localization.lang("Bibliographic data not found. Cause is likely the client side. Please check connection and identifier for correctness.") + "\n" + fetcherExceptionMessage); + dialogService.showInformationDialogAndWait( + Localization.lang("Failed to import by ID"), + Localization.lang( + "Bibliographic data not found. Cause is likely the client side. Please check connection and identifier for correctness.") + + "\n" + fetcherExceptionMessage); } else if (exception instanceof FetcherServerException) { - dialogService.showInformationDialogAndWait(Localization.lang("Failed to import by ID"), Localization.lang("Bibliographic data not found. Cause is likely the server side. Please try again later.") + "\n" + fetcherExceptionMessage); + dialogService.showInformationDialogAndWait( + Localization.lang("Failed to import by ID"), + Localization.lang( + "Bibliographic data not found. Cause is likely the server side. Please try again later.") + + "\n" + fetcherExceptionMessage); } else { - dialogService.showInformationDialogAndWait(Localization.lang("Failed to import by ID"), Localization.lang("Error message %0", fetcherExceptionMessage)); + dialogService.showInformationDialogAndWait( + Localization.lang("Failed to import by ID"), + Localization.lang("Error message %0", fetcherExceptionMessage)); } - LOGGER.error("Exception during fetching when using fetcher '{}' with entry id '{}'.", fetcher, searchId, exception); + LOGGER.error( + "Exception during fetching when using fetcher '{}' with entry id '{}'.", + fetcher, + searchId, + exception); searchingProperty.set(false); fetcherWorker = new FetcherWorker(); @@ -182,7 +198,8 @@ public void runFetcherWorker() { searchSuccesfulProperty.set(true); } else if (StringUtil.isBlank(idText.getValue())) { - dialogService.showWarningDialogAndWait(Localization.lang("Empty search ID"), Localization.lang("The given search ID was empty.")); + dialogService.showWarningDialogAndWait( + Localization.lang("Empty search ID"), Localization.lang("The given search ID was empty.")); } else { // result is empty @@ -190,17 +207,19 @@ public void runFetcherWorker() { String searchId = idText.getValue(); // When DOI ID is not found, allow the user to either return to the dialog or add entry manually - boolean addEntryFlag = dialogService.showConfirmationDialogAndWait(Localization.lang("Identifier not found"), + boolean addEntryFlag = dialogService.showConfirmationDialogAndWait( + Localization.lang("Identifier not found"), Localization.lang("Fetcher '%0' did not find an entry for id '%1'.", fetcher, searchId), Localization.lang("Add entry manually"), Localization.lang("Return to dialog")); if (addEntryFlag) { new NewEntryAction( - libraryTab.frame(), - StandardEntryType.Article, - dialogService, - preferencesService, - stateManager).execute(); + libraryTab.frame(), + StandardEntryType.Article, + dialogService, + preferencesService, + stateManager) + .execute(); searchSuccesfulProperty.set(true); } } diff --git a/src/main/java/org/jabref/gui/FallbackExceptionHandler.java b/src/main/java/org/jabref/gui/FallbackExceptionHandler.java index 73eaa39e849..91527cb24fd 100644 --- a/src/main/java/org/jabref/gui/FallbackExceptionHandler.java +++ b/src/main/java/org/jabref/gui/FallbackExceptionHandler.java @@ -21,8 +21,8 @@ public static void installExceptionHandler() { public void uncaughtException(Thread thread, Throwable exception) { LOGGER.error("Uncaught exception occurred in " + thread, exception); DefaultTaskExecutor.runInJavaFXThread(() -> { - DialogService dialogService = Injector.instantiateModelOrService(DialogService.class); - dialogService.showErrorDialogAndWait("Uncaught exception occurred in " + thread, exception); + DialogService dialogService = Injector.instantiateModelOrService(DialogService.class); + dialogService.showErrorDialogAndWait("Uncaught exception occurred in " + thread, exception); }); } } diff --git a/src/main/java/org/jabref/gui/Globals.java b/src/main/java/org/jabref/gui/Globals.java index 04ead50bf63..3165d1408a3 100644 --- a/src/main/java/org/jabref/gui/Globals.java +++ b/src/main/java/org/jabref/gui/Globals.java @@ -68,8 +68,7 @@ public class Globals { private static DefaultFileUpdateMonitor fileUpdateMonitor; - private Globals() { - } + private Globals() {} // Key binding preferences public static synchronized KeyBindingRepository getKeyPrefs() { @@ -88,10 +87,7 @@ public static synchronized ClipBoardManager getClipboardManager() { public static synchronized ThemeManager getThemeManager() { if (themeManager == null) { - themeManager = new ThemeManager( - prefs.getWorkspacePreferences(), - getFileUpdateMonitor(), - Runnable::run); + themeManager = new ThemeManager(prefs.getWorkspacePreferences(), getFileUpdateMonitor(), Runnable::run); } return themeManager; } @@ -107,12 +103,13 @@ public static synchronized FileUpdateMonitor getFileUpdateMonitor() { // Background tasks public static void startBackgroundTasks() { // TODO Currently deactivated due to incompatibilities in XML - /* if (Globals.prefs.getTelemetryPreferences().shouldCollectTelemetry() && !GraphicsEnvironment.isHeadless()) { + /* if (Globals.prefs.getTelemetryPreferences().shouldCollectTelemetry() && !GraphicsEnvironment.isHeadless()) { Telemetry.start(prefs.getTelemetryPreferences()); } */ RemotePreferences remotePreferences = prefs.getRemotePreferences(); if (remotePreferences.useRemoteServer()) { - Globals.REMOTE_LISTENER.openAndStart(new CLIMessageHandler(prefs, fileUpdateMonitor, entryTypesManager), remotePreferences.getPort()); + Globals.REMOTE_LISTENER.openAndStart( + new CLIMessageHandler(prefs, fileUpdateMonitor, entryTypesManager), remotePreferences.getPort()); } } diff --git a/src/main/java/org/jabref/gui/JabRefDialogService.java b/src/main/java/org/jabref/gui/JabRefDialogService.java index 6f3c333db13..9385d3e69a5 100644 --- a/src/main/java/org/jabref/gui/JabRefDialogService.java +++ b/src/main/java/org/jabref/gui/JabRefDialogService.java @@ -85,10 +85,11 @@ private FXDialog createDialog(AlertType type, String title, String content) { return alert; } - private FXDialog createDialogWithOptOut(AlertType type, String title, String content, - String optOutMessage, Consumer optOutAction) { + private FXDialog createDialogWithOptOut( + AlertType type, String title, String content, String optOutMessage, Consumer optOutAction) { FXDialog alert = new FXDialog(type, title, true); - // Need to force the alert to layout in order to grab the graphic as we are replacing the dialog pane with a custom pane + // Need to force the alert to layout in order to grab the graphic as we are replacing the dialog pane with a + // custom pane alert.getDialogPane().applyCss(); Node graphic = alert.getDialogPane().getGraphic(); @@ -104,7 +105,8 @@ protected Node createDetailsButton() { } }); - // Fool the dialog into thinking there is some expandable content; a group won't take up any space if it has no children + // Fool the dialog into thinking there is some expandable content; a group won't take up any space if it has no + // children alert.getDialogPane().setExpandableContent(new Group()); alert.getDialogPane().setExpanded(true); @@ -121,11 +123,14 @@ public static String shortenDialogMessage(String dialogMessage) { if (dialogMessage.length() < JabRefDialogService.DIALOG_SIZE_LIMIT) { return dialogMessage.trim(); } - return (dialogMessage.substring(0, Math.min(dialogMessage.length(), JabRefDialogService.DIALOG_SIZE_LIMIT)) + "...").trim(); + return (dialogMessage.substring(0, Math.min(dialogMessage.length(), JabRefDialogService.DIALOG_SIZE_LIMIT)) + + "...") + .trim(); } @Override - public Optional showChoiceDialogAndWait(String title, String content, String okButtonLabel, T defaultChoice, Collection choices) { + public Optional showChoiceDialogAndWait( + String title, String content, String okButtonLabel, T defaultChoice, Collection choices) { ChoiceDialog choiceDialog = new ChoiceDialog<>(defaultChoice, choices); ((Stage) choiceDialog.getDialogPane().getScene().getWindow()).getIcons().add(IconTheme.getJabRefImage()); ButtonType okButtonType = new ButtonType(okButtonLabel, ButtonBar.ButtonData.OK_DONE); @@ -200,7 +205,9 @@ public void showErrorDialogAndWait(String message) { @Override public boolean showConfirmationDialogAndWait(String title, String content) { FXDialog alert = createDialog(AlertType.CONFIRMATION, title, content); - return alert.showAndWait().filter(buttonType -> buttonType == ButtonType.OK).isPresent(); + return alert.showAndWait() + .filter(buttonType -> buttonType == ButtonType.OK) + .isPresent(); } @Override @@ -208,49 +215,61 @@ public boolean showConfirmationDialogAndWait(String title, String content, Strin FXDialog alert = createDialog(AlertType.CONFIRMATION, title, content); ButtonType okButtonType = new ButtonType(okButtonLabel, ButtonBar.ButtonData.OK_DONE); alert.getButtonTypes().setAll(ButtonType.CANCEL, okButtonType); - return alert.showAndWait().filter(buttonType -> buttonType == okButtonType).isPresent(); + return alert.showAndWait() + .filter(buttonType -> buttonType == okButtonType) + .isPresent(); } @Override - public boolean showConfirmationDialogAndWait(String title, String content, - String okButtonLabel, String cancelButtonLabel) { + public boolean showConfirmationDialogAndWait( + String title, String content, String okButtonLabel, String cancelButtonLabel) { FXDialog alert = createDialog(AlertType.CONFIRMATION, title, content); ButtonType okButtonType = new ButtonType(okButtonLabel, ButtonBar.ButtonData.OK_DONE); ButtonType cancelButtonType = new ButtonType(cancelButtonLabel, ButtonBar.ButtonData.NO); alert.getButtonTypes().setAll(okButtonType, cancelButtonType); - return alert.showAndWait().filter(buttonType -> buttonType == okButtonType).isPresent(); + return alert.showAndWait() + .filter(buttonType -> buttonType == okButtonType) + .isPresent(); } @Override - public boolean showConfirmationDialogWithOptOutAndWait(String title, String content, - String optOutMessage, Consumer optOutAction) { + public boolean showConfirmationDialogWithOptOutAndWait( + String title, String content, String optOutMessage, Consumer optOutAction) { FXDialog alert = createDialogWithOptOut(AlertType.CONFIRMATION, title, content, optOutMessage, optOutAction); alert.getButtonTypes().setAll(ButtonType.YES, ButtonType.NO); - return alert.showAndWait().filter(buttonType -> buttonType == ButtonType.YES).isPresent(); + return alert.showAndWait() + .filter(buttonType -> buttonType == ButtonType.YES) + .isPresent(); } @Override - public boolean showConfirmationDialogWithOptOutAndWait(String title, String content, - String okButtonLabel, String cancelButtonLabel, - String optOutMessage, Consumer optOutAction) { + public boolean showConfirmationDialogWithOptOutAndWait( + String title, + String content, + String okButtonLabel, + String cancelButtonLabel, + String optOutMessage, + Consumer optOutAction) { FXDialog alert = createDialogWithOptOut(AlertType.CONFIRMATION, title, content, optOutMessage, optOutAction); ButtonType okButtonType = new ButtonType(okButtonLabel, ButtonBar.ButtonData.YES); ButtonType cancelButtonType = new ButtonType(cancelButtonLabel, ButtonBar.ButtonData.NO); alert.getButtonTypes().setAll(okButtonType, cancelButtonType); - return alert.showAndWait().filter(buttonType -> buttonType == okButtonType).isPresent(); + return alert.showAndWait() + .filter(buttonType -> buttonType == okButtonType) + .isPresent(); } @Override - public Optional showCustomButtonDialogAndWait(AlertType type, String title, String content, - ButtonType... buttonTypes) { + public Optional showCustomButtonDialogAndWait( + AlertType type, String title, String content, ButtonType... buttonTypes) { FXDialog alert = createDialog(type, title, content); alert.getButtonTypes().setAll(buttonTypes); return alert.showAndWait(); } @Override - public Optional showCustomDialogAndWait(String title, DialogPane contentPane, - ButtonType... buttonTypes) { + public Optional showCustomDialogAndWait( + String title, DialogPane contentPane, ButtonType... buttonTypes) { FXDialog alert = new FXDialog(AlertType.NONE, title); alert.setDialogPane(contentPane); alert.getButtonTypes().setAll(buttonTypes); @@ -299,7 +318,9 @@ public void showProgressDialog(String title, String content, Task task) { progressDialog.setTitle(title); progressDialog.setContentText(content); progressDialog.setGraphic(null); - ((Stage) progressDialog.getDialogPane().getScene().getWindow()).getIcons().add(IconTheme.getJabRefImage()); + ((Stage) progressDialog.getDialogPane().getScene().getWindow()) + .getIcons() + .add(IconTheme.getJabRefImage()); progressDialog.setOnCloseRequest(evt -> task.cancel()); DialogPane dialogPane = progressDialog.getDialogPane(); dialogPane.getButtonTypes().add(ButtonType.CANCEL); @@ -313,7 +334,8 @@ public void showProgressDialog(String title, String content, Task task) { } @Override - public Optional showBackgroundProgressDialogAndWait(String title, String content, StateManager stateManager) { + public Optional showBackgroundProgressDialogAndWait( + String title, String content, StateManager stateManager) { TaskProgressView> taskProgressView = new TaskProgressView<>(); EasyBind.bindContent(taskProgressView.getTasks(), stateManager.getBackgroundTasks()); taskProgressView.setRetainTasks(false); @@ -349,23 +371,24 @@ public void notify(String message) { DefaultTaskExecutor.runInJavaFXThread(() -> { Notifications.create() - .text(message) - .position(Pos.BOTTOM_CENTER) - .hideAfter(TOAST_MESSAGE_DISPLAY_TIME) - .owner(mainWindow) - .threshold(5, - Notifications.create() - .title(Localization.lang("Last notification")) - // TODO: Change to a notification overview instead of event log when that is available. The event log is not that user friendly (different purpose). - .text( - "(" + Localization.lang("Check the event log to see all notifications") + ")" - + "\n\n" + message) - .onAction(e -> { - ErrorConsoleAction ec = new ErrorConsoleAction(); - ec.execute(); - })) - .hideCloseButton() - .show(); + .text(message) + .position(Pos.BOTTOM_CENTER) + .hideAfter(TOAST_MESSAGE_DISPLAY_TIME) + .owner(mainWindow) + .threshold( + 5, + Notifications.create() + .title(Localization.lang("Last notification")) + // TODO: Change to a notification overview instead of event log when that is + // available. The event log is not that user friendly (different purpose). + .text("(" + Localization.lang("Check the event log to see all notifications") + ")" + + "\n\n" + message) + .onAction(e -> { + ErrorConsoleAction ec = new ErrorConsoleAction(); + ec.execute(); + })) + .hideCloseButton() + .show(); }); } @@ -373,7 +396,8 @@ public void notify(String message) { public Optional showFileSaveDialog(FileDialogConfiguration fileDialogConfiguration) { FileChooser chooser = getConfiguredFileChooser(fileDialogConfiguration); File file = chooser.showSaveDialog(mainWindow); - Optional.ofNullable(chooser.getSelectedExtensionFilter()).ifPresent(fileDialogConfiguration::setSelectedExtensionFilter); + Optional.ofNullable(chooser.getSelectedExtensionFilter()) + .ifPresent(fileDialogConfiguration::setSelectedExtensionFilter); return Optional.ofNullable(file).map(File::toPath); } @@ -381,7 +405,8 @@ public Optional showFileSaveDialog(FileDialogConfiguration fileDialogConfi public Optional showFileOpenDialog(FileDialogConfiguration fileDialogConfiguration) { FileChooser chooser = getConfiguredFileChooser(fileDialogConfiguration); File file = chooser.showOpenDialog(mainWindow); - Optional.ofNullable(chooser.getSelectedExtensionFilter()).ifPresent(fileDialogConfiguration::setSelectedExtensionFilter); + Optional.ofNullable(chooser.getSelectedExtensionFilter()) + .ifPresent(fileDialogConfiguration::setSelectedExtensionFilter); return Optional.ofNullable(file).map(File::toPath); } diff --git a/src/main/java/org/jabref/gui/JabRefExecutorService.java b/src/main/java/org/jabref/gui/JabRefExecutorService.java index b23beeb8d2c..b0d227660b3 100644 --- a/src/main/java/org/jabref/gui/JabRefExecutorService.java +++ b/src/main/java/org/jabref/gui/JabRefExecutorService.java @@ -43,8 +43,7 @@ public class JabRefExecutorService { private Thread remoteThread; - private JabRefExecutorService() { - } + private JabRefExecutorService() {} public void execute(Runnable command) { Objects.requireNonNull(command); @@ -181,7 +180,9 @@ public static void gracefullyShutdown(ExecutorService executorService) { // This is non-blocking. See https://stackoverflow.com/a/57383461/873282. executorService.shutdown(); if (!executorService.awaitTermination(60, TimeUnit.SECONDS)) { - LOGGER.debug("One minute passed, {} still not completed. Trying forced shutdown.", executorService.toString()); + LOGGER.debug( + "One minute passed, {} still not completed. Trying forced shutdown.", + executorService.toString()); // those threads will be interrupted in their current task executorService.shutdownNow(); if (executorService.awaitTermination(60, TimeUnit.SECONDS)) { diff --git a/src/main/java/org/jabref/gui/JabRefFrame.java b/src/main/java/org/jabref/gui/JabRefFrame.java index 8a829134b96..70b58d88fb3 100644 --- a/src/main/java/org/jabref/gui/JabRefFrame.java +++ b/src/main/java/org/jabref/gui/JabRefFrame.java @@ -99,7 +99,8 @@ public class JabRefFrame extends BorderPane implements LibraryTabContainer { private final FileHistoryMenu fileHistory; - @SuppressWarnings({"FieldCanBeLocal"}) private EasyObservableList openDatabaseList; + @SuppressWarnings({"FieldCanBeLocal"}) + private EasyObservableList openDatabaseList; private final Stage mainStage; private final StateManager stateManager; @@ -125,7 +126,8 @@ public JabRefFrame(Stage mainStage) { this.globalSearchBar = new GlobalSearchBar(this, stateManager, prefs, undoManager, dialogService); this.taskExecutor = Globals.TASK_EXECUTOR; this.pushToApplicationCommand = new PushToApplicationCommand(stateManager, dialogService, prefs, taskExecutor); - this.fileHistory = new FileHistoryMenu(prefs.getGuiPreferences().getFileHistory(), dialogService, getOpenDatabaseAction()); + this.fileHistory = + new FileHistoryMenu(prefs.getGuiPreferences().getFileHistory(), dialogService, getOpenDatabaseAction()); this.setOnKeyTyped(key -> { if (this.fileHistory.isShowing()) { if (this.fileHistory.openFileByKey(key)) { @@ -166,7 +168,8 @@ private void initDragAndDrop() { // drag'n'drop on tabs covered dnd on tabbedPane, so dnd on tabs should contain all dnds on tabbedPane tabbedPane.lookupAll(".tab").forEach(destinationTabNode -> { destinationTabNode.setOnDragOver(tabDragEvent -> { - if (DragAndDropHelper.hasBibFiles(tabDragEvent.getDragboard()) || DragAndDropHelper.hasGroups(tabDragEvent.getDragboard())) { + if (DragAndDropHelper.hasBibFiles(tabDragEvent.getDragboard()) + || DragAndDropHelper.hasGroups(tabDragEvent.getDragboard())) { tabDragEvent.acceptTransferModes(TransferMode.ANY); if (!tabbedPane.getTabs().contains(dndIndicator)) { tabbedPane.getTabs().add(dndIndicator); @@ -181,9 +184,9 @@ private void initDragAndDrop() { tabDragEvent.consume(); } }); - destinationTabNode.setOnDragExited(event1 -> tabbedPane.getTabs().remove(dndIndicator)); + destinationTabNode.setOnDragExited( + event1 -> tabbedPane.getTabs().remove(dndIndicator)); destinationTabNode.setOnDragDropped(tabDragEvent -> { - Dragboard dragboard = tabDragEvent.getDragboard(); if (DragAndDropHelper.hasBibFiles(dragboard)) { @@ -195,8 +198,11 @@ private void initDragAndDrop() { tabDragEvent.consume(); } else { for (Tab libraryTab : tabbedPane.getTabs()) { - if (libraryTab.getId().equals(destinationTabNode.getId()) && - !tabbedPane.getSelectionModel().getSelectedItem().equals(libraryTab)) { + if (libraryTab.getId().equals(destinationTabNode.getId()) + && !tabbedPane + .getSelectionModel() + .getSelectedItem() + .equals(libraryTab)) { LibraryTab destinationLibraryTab = (LibraryTab) libraryTab; if (DragAndDropHelper.hasGroups(dragboard)) { List groupPathToSources = DragAndDropHelper.getGroups(dragboard); @@ -206,7 +212,8 @@ private void initDragAndDrop() { GroupTreeNode destinationLibraryGroupRoot = destinationLibraryTab .getBibDatabaseContext() .getMetaData() - .getGroups().get(); + .getGroups() + .get(); for (String pathToSource : groupPathToSources) { GroupTreeNode groupTreeNodeToCopy = getCurrentLibraryTab() @@ -216,11 +223,15 @@ private void initDragAndDrop() { .get() .getChildByPath(pathToSource) .get(); - copyGroupTreeNode((LibraryTab) libraryTab, destinationLibraryGroupRoot, groupTreeNodeToCopy); + copyGroupTreeNode( + (LibraryTab) libraryTab, + destinationLibraryGroupRoot, + groupTreeNodeToCopy); } return; } - destinationLibraryTab.dropEntry(stateManager.getLocalDragboard().getBibEntries()); + destinationLibraryTab.dropEntry( + stateManager.getLocalDragboard().getBibEntries()); } } tabDragEvent.consume(); @@ -254,7 +265,7 @@ private void initKeyBindings() { case FOCUS_GROUP_LIST: sidePane.getSidePaneComponent(SidePaneType.GROUPS).requestFocus(); event.consume(); - break; + break; case NEXT_LIBRARY: tabbedPane.getSelectionModel().selectNext(); event.consume(); @@ -267,36 +278,46 @@ private void initKeyBindings() { getGlobalSearchBar().focus(); break; case NEW_ARTICLE: - new NewEntryAction(this, StandardEntryType.Article, dialogService, prefs, stateManager).execute(); + new NewEntryAction(this, StandardEntryType.Article, dialogService, prefs, stateManager) + .execute(); break; case NEW_BOOK: new NewEntryAction(this, StandardEntryType.Book, dialogService, prefs, stateManager).execute(); break; case NEW_INBOOK: - new NewEntryAction(this, StandardEntryType.InBook, dialogService, prefs, stateManager).execute(); + new NewEntryAction(this, StandardEntryType.InBook, dialogService, prefs, stateManager) + .execute(); break; case NEW_MASTERSTHESIS: - new NewEntryAction(this, StandardEntryType.MastersThesis, dialogService, prefs, stateManager).execute(); + new NewEntryAction(this, StandardEntryType.MastersThesis, dialogService, prefs, stateManager) + .execute(); break; case NEW_PHDTHESIS: - new NewEntryAction(this, StandardEntryType.PhdThesis, dialogService, prefs, stateManager).execute(); + new NewEntryAction(this, StandardEntryType.PhdThesis, dialogService, prefs, stateManager) + .execute(); break; case NEW_PROCEEDINGS: - new NewEntryAction(this, StandardEntryType.Proceedings, dialogService, prefs, stateManager).execute(); + new NewEntryAction(this, StandardEntryType.Proceedings, dialogService, prefs, stateManager) + .execute(); break; case NEW_TECHREPORT: - new NewEntryAction(this, StandardEntryType.TechReport, dialogService, prefs, stateManager).execute(); + new NewEntryAction(this, StandardEntryType.TechReport, dialogService, prefs, stateManager) + .execute(); break; case NEW_UNPUBLISHED: - new NewEntryAction(this, StandardEntryType.Unpublished, dialogService, prefs, stateManager).execute(); + new NewEntryAction(this, StandardEntryType.Unpublished, dialogService, prefs, stateManager) + .execute(); break; case NEW_INPROCEEDINGS: - new NewEntryAction(this, StandardEntryType.InProceedings, dialogService, prefs, stateManager).execute(); + new NewEntryAction(this, StandardEntryType.InProceedings, dialogService, prefs, stateManager) + .execute(); break; case PASTE: - if (OS.OS_X) { // Workaround for a jdk issue that executes paste twice when using cmd+v in a TextField + if (OS.OS_X) { // Workaround for a jdk issue that executes paste twice when using cmd+v in a + // TextField // Extra workaround for CodeArea, which does not inherit from TextInputControl - if (!(stateManager.getFocusOwner().isPresent() && (stateManager.getFocusOwner().get() instanceof CodeArea))) { + if (!(stateManager.getFocusOwner().isPresent() + && (stateManager.getFocusOwner().get() instanceof CodeArea))) { event.consume(); break; } @@ -311,12 +332,14 @@ private void initKeyBindings() { private void initShowTrackingNotification() { if (prefs.getTelemetryPreferences().shouldAskToCollectTelemetry()) { - JabRefExecutorService.INSTANCE.submit(new TimerTask() { - @Override - public void run() { - DefaultTaskExecutor.runInJavaFXThread(JabRefFrame.this::showTrackingNotification); - } - }, 60000); // run in one minute + JabRefExecutorService.INSTANCE.submit( + new TimerTask() { + @Override + public void run() { + DefaultTaskExecutor.runInJavaFXThread(JabRefFrame.this::showTrackingNotification); + } + }, + 60000); // run in one minute } } @@ -327,7 +350,8 @@ private void showTrackingNotification() { if (!telemetryPreferences.shouldCollectTelemetry()) { shouldCollect = dialogService.showConfirmationDialogAndWait( Localization.lang("Telemetry: Help make JabRef better"), - Localization.lang("To improve the user experience, we would like to collect anonymous statistics on the features you use. We will only record what features you access and how often you do it. We will neither collect any personal data nor the content of bibliographic items. If you choose to allow data collection, you can later disable it via File -> Preferences -> General."), + Localization.lang( + "To improve the user experience, we would like to collect anonymous statistics on the features you use. We will only record what features you access and how often you do it. We will neither collect any personal data nor the content of bibliographic items. If you choose to allow data collection, you can later disable it via File -> Preferences -> General."), Localization.lang("Share anonymous statistics"), Localization.lang("Don't share")); } @@ -366,9 +390,10 @@ private void tearDownJabRef(List filenames) { if (filenames.isEmpty()) { prefs.getGuiPreferences().getLastFilesOpened().clear(); } else { - Path focusedDatabase = getCurrentLibraryTab().getBibDatabaseContext() - .getDatabasePath() - .orElse(null); + Path focusedDatabase = getCurrentLibraryTab() + .getBibDatabaseContext() + .getDatabasePath() + .orElse(null); prefs.getGuiPreferences().setLastFilesOpened(filenames); prefs.getGuiPreferences().setLastFocusedFile(focusedDatabase); } @@ -420,14 +445,21 @@ public boolean quit() { context.clearDBMSSynchronizer(); } AutosaveManager.shutdown(context); - BackupManager.shutdown(context, prefs.getFilePreferences().getBackupDirectory(), prefs.getFilePreferences().shouldCreateBackup()); - context.getDatabasePath().map(Path::toAbsolutePath).map(Path::toString).ifPresent(filenames::add); + BackupManager.shutdown( + context, + prefs.getFilePreferences().getBackupDirectory(), + prefs.getFilePreferences().shouldCreateBackup()); + context.getDatabasePath() + .map(Path::toAbsolutePath) + .map(Path::toString) + .ifPresent(filenames::add); } WaitForSaveFinishedDialog waitForSaveFinishedDialog = new WaitForSaveFinishedDialog(dialogService); waitForSaveFinishedDialog.showAndWait(getLibraryTabs()); - // We call saveWindow state here again because under Mac the windowClose listener on the stage isn't triggered when using cmd + q + // We call saveWindow state here again because under Mac the windowClose listener on the stage isn't triggered + // when using cmd + q saveWindowState(); // Good bye! tearDownJabRef(filenames); @@ -453,12 +485,12 @@ public void saveWindowState() { */ private void debugLogWindowState(Stage mainStage) { if (LOGGER.isDebugEnabled()) { - String debugLogString = "SCREEN DATA:" + - "mainStage.WINDOW_MAXIMISED: " + mainStage.isMaximized() + "\n" + - "mainStage.POS_X: " + mainStage.getX() + "\n" + - "mainStage.POS_Y: " + mainStage.getY() + "\n" + - "mainStage.SIZE_X: " + mainStage.getWidth() + "\n" + - "mainStages.SIZE_Y: " + mainStage.getHeight() + "\n"; + String debugLogString = "SCREEN DATA:" + "mainStage.WINDOW_MAXIMISED: " + + mainStage.isMaximized() + "\n" + "mainStage.POS_X: " + + mainStage.getX() + "\n" + "mainStage.POS_Y: " + + mainStage.getY() + "\n" + "mainStage.SIZE_X: " + + mainStage.getWidth() + "\n" + "mainStages.SIZE_Y: " + + mainStage.getHeight() + "\n"; LOGGER.debug(debugLogString); } } @@ -535,7 +567,8 @@ private void updateSidePane() { private void setDividerPosition() { if (mainStage.isShowing() && !sidePane.getChildren().isEmpty()) { splitPane.setDividerPositions(prefs.getGuiPreferences().getSidePaneWidth() / splitPane.getWidth()); - dividerSubscription = EasyBind.subscribe(sidePane.widthProperty(), width -> prefs.getGuiPreferences().setSidePaneWidth(width.doubleValue())); + dividerSubscription = EasyBind.subscribe( + sidePane.widthProperty(), width -> prefs.getGuiPreferences().setSidePaneWidth(width.doubleValue())); } } @@ -553,9 +586,9 @@ public LibraryTab getLibraryTabAt(int i) { */ public List getLibraryTabs() { return tabbedPane.getTabs().stream() - .filter(LibraryTab.class::isInstance) - .map(LibraryTab.class::cast) - .collect(Collectors.toList()); + .filter(LibraryTab.class::isInstance) + .map(LibraryTab.class::cast) + .collect(Collectors.toList()); } public void showLibraryTabAt(int i) { @@ -592,25 +625,26 @@ public void init() { openDatabaseList = EasyBind.map(filteredTabs, tab -> ((LibraryTab) tab).getBibDatabaseContext()); EasyBind.bindContent(stateManager.getOpenDatabases(), openDatabaseList); - // the binding for stateManager.activeDatabaseProperty() is at org.jabref.gui.LibraryTab.onDatabaseLoadingSucceed + // the binding for stateManager.activeDatabaseProperty() is at + // org.jabref.gui.LibraryTab.onDatabaseLoadingSucceed // Subscribe to the search - EasyBind.subscribe(stateManager.activeSearchQueryProperty(), - query -> { - if (prefs.getSearchPreferences().shouldKeepSearchString()) { - for (LibraryTab tab : getLibraryTabs()) { - tab.setCurrentSearchQuery(query); - } - } else { - if (getCurrentLibraryTab() != null) { - getCurrentLibraryTab().setCurrentSearchQuery(query); - } - } - }); + EasyBind.subscribe(stateManager.activeSearchQueryProperty(), query -> { + if (prefs.getSearchPreferences().shouldKeepSearchString()) { + for (LibraryTab tab : getLibraryTabs()) { + tab.setCurrentSearchQuery(query); + } + } else { + if (getCurrentLibraryTab() != null) { + getCurrentLibraryTab().setCurrentSearchQuery(query); + } + } + }); // Wait for the scene to be created, otherwise focusOwnerProperty is not provided - Platform.runLater(() -> stateManager.focusOwnerProperty().bind( - EasyBind.map(mainStage.getScene().focusOwnerProperty(), Optional::ofNullable))); + Platform.runLater(() -> stateManager + .focusOwnerProperty() + .bind(EasyBind.map(mainStage.getScene().focusOwnerProperty(), Optional::ofNullable))); EasyBind.subscribe(tabbedPane.getSelectionModel().selectedItemProperty(), selectedTab -> { if (selectedTab instanceof LibraryTab libraryTab) { @@ -638,9 +672,12 @@ public void init() { stateManager.setSelectedEntries(libraryTab.getSelectedEntries()); // Update active search query when switching between databases - if (prefs.getSearchPreferences().shouldKeepSearchString() && libraryTab.getCurrentSearchQuery().isEmpty() && stateManager.activeSearchQueryProperty().get().isPresent()) { + if (prefs.getSearchPreferences().shouldKeepSearchString() + && libraryTab.getCurrentSearchQuery().isEmpty() + && stateManager.activeSearchQueryProperty().get().isPresent()) { // apply search query also when opening a new library and keep search string is activated - libraryTab.setCurrentSearchQuery(stateManager.activeSearchQueryProperty().get()); + libraryTab.setCurrentSearchQuery( + stateManager.activeSearchQueryProperty().get()); } else { stateManager.activeSearchQueryProperty().set(libraryTab.getCurrentSearchQuery()); } @@ -653,8 +690,7 @@ public void init() { // Set window title - copy tab title StringBinding windowTitle = Bindings.createStringBinding( - () -> libraryTab.textProperty().getValue() + " \u2013 " + FRAME_TITLE, - libraryTab.textProperty()); + () -> libraryTab.textProperty().getValue() + " \u2013 " + FRAME_TITLE, libraryTab.textProperty()); mainStage.titleProperty().bind(windowTitle); }); initShowTrackingNotification(); @@ -702,14 +738,23 @@ private ContextMenu createTabContextMenuFor(LibraryTab tab, KeyBindingRepository ContextMenu contextMenu = new ContextMenu(); ActionFactory factory = new ActionFactory(keyBindingRepository); - contextMenu.getItems().addAll( - factory.createMenuItem(StandardActions.LIBRARY_PROPERTIES, new LibraryPropertiesAction(tab::getBibDatabaseContext, stateManager)), - factory.createMenuItem(StandardActions.OPEN_DATABASE_FOLDER, new OpenDatabaseFolder(tab::getBibDatabaseContext)), - factory.createMenuItem(StandardActions.OPEN_CONSOLE, new OpenConsoleAction(tab::getBibDatabaseContext, stateManager, prefs, dialogService)), - new SeparatorMenuItem(), - factory.createMenuItem(StandardActions.CLOSE_LIBRARY, new CloseDatabaseAction(this, tab)), - factory.createMenuItem(StandardActions.CLOSE_OTHER_LIBRARIES, new CloseOthersDatabaseAction(tab)), - factory.createMenuItem(StandardActions.CLOSE_ALL_LIBRARIES, new CloseAllDatabaseAction())); + contextMenu + .getItems() + .addAll( + factory.createMenuItem( + StandardActions.LIBRARY_PROPERTIES, + new LibraryPropertiesAction(tab::getBibDatabaseContext, stateManager)), + factory.createMenuItem( + StandardActions.OPEN_DATABASE_FOLDER, + new OpenDatabaseFolder(tab::getBibDatabaseContext)), + factory.createMenuItem( + StandardActions.OPEN_CONSOLE, + new OpenConsoleAction(tab::getBibDatabaseContext, stateManager, prefs, dialogService)), + new SeparatorMenuItem(), + factory.createMenuItem(StandardActions.CLOSE_LIBRARY, new CloseDatabaseAction(this, tab)), + factory.createMenuItem( + StandardActions.CLOSE_OTHER_LIBRARIES, new CloseOthersDatabaseAction(tab)), + factory.createMenuItem(StandardActions.CLOSE_ALL_LIBRARIES, new CloseAllDatabaseAction())); return contextMenu; } @@ -771,10 +816,8 @@ public void addTab(ParserResult parserResult, boolean raisePanel) { } else { // only add tab if library is not already open Optional libraryTab = getLibraryTabs().stream() - .filter(p -> p.getBibDatabaseContext() - .getDatabasePath() - .equals(parserResult.getPath())) - .findFirst(); + .filter(p -> p.getBibDatabaseContext().getDatabasePath().equals(parserResult.getPath())) + .findFirst(); if (libraryTab.isPresent()) { tabbedPane.getSelectionModel().select(libraryTab.get()); @@ -792,7 +835,8 @@ public void addTab(ParserResult parserResult, boolean raisePanel) { */ private void addImportedEntries(final LibraryTab panel, final ParserResult parserResult) { BackgroundTask task = BackgroundTask.wrap(() -> parserResult); - ImportCleanup cleanup = ImportCleanup.targeting(panel.getBibDatabaseContext().getMode()); + ImportCleanup cleanup = + ImportCleanup.targeting(panel.getBibDatabaseContext().getMode()); cleanup.doPostCleanup(parserResult.getDatabase().getEntries()); ImportEntriesDialog dialog = new ImportEntriesDialog(panel.getBibDatabaseContext(), task); dialog.setTitle(Localization.lang("Import")); @@ -810,20 +854,25 @@ public FileHistoryMenu getFileHistory() { * @return true if the user choose to close the database */ private boolean confirmClose(LibraryTab libraryTab) { - String filename = libraryTab.getBibDatabaseContext() - .getDatabasePath() - .map(Path::toAbsolutePath) - .map(Path::toString) - .orElse(Localization.lang("untitled")); + String filename = libraryTab + .getBibDatabaseContext() + .getDatabasePath() + .map(Path::toAbsolutePath) + .map(Path::toString) + .orElse(Localization.lang("untitled")); ButtonType saveChanges = new ButtonType(Localization.lang("Save changes"), ButtonBar.ButtonData.YES); ButtonType discardChanges = new ButtonType(Localization.lang("Discard changes"), ButtonBar.ButtonData.NO); - ButtonType returnToLibrary = new ButtonType(Localization.lang("Return to library"), ButtonBar.ButtonData.CANCEL_CLOSE); + ButtonType returnToLibrary = + new ButtonType(Localization.lang("Return to library"), ButtonBar.ButtonData.CANCEL_CLOSE); - Optional response = dialogService.showCustomButtonDialogAndWait(Alert.AlertType.CONFIRMATION, + Optional response = dialogService.showCustomButtonDialogAndWait( + Alert.AlertType.CONFIRMATION, Localization.lang("Save before closing"), Localization.lang("Library '%0' has changed.", filename), - saveChanges, discardChanges, returnToLibrary); + saveChanges, + discardChanges, + returnToLibrary); if (response.isEmpty()) { return true; @@ -837,7 +886,8 @@ private boolean confirmClose(LibraryTab libraryTab) { if (buttonType.equals(saveChanges)) { try { - SaveDatabaseAction saveAction = new SaveDatabaseAction(libraryTab, dialogService, prefs, Globals.entryTypesManager); + SaveDatabaseAction saveAction = + new SaveDatabaseAction(libraryTab, dialogService, prefs, Globals.entryTypesManager); if (saveAction.save()) { return true; } @@ -845,14 +895,17 @@ private boolean confirmClose(LibraryTab libraryTab) { dialogService.notify(Localization.lang("Unable to save library")); } catch (Throwable ex) { LOGGER.error("A problem occurred when trying to save the file", ex); - dialogService.showErrorDialogAndWait(Localization.lang("Save library"), Localization.lang("Could not save file."), ex); + dialogService.showErrorDialogAndWait( + Localization.lang("Save library"), Localization.lang("Could not save file."), ex); } // Save was cancelled or an error occurred. return false; } if (buttonType.equals(discardChanges)) { - BackupManager.discardBackup(libraryTab.getBibDatabaseContext(), prefs.getFilePreferences().getBackupDirectory()); + BackupManager.discardBackup( + libraryTab.getBibDatabaseContext(), + prefs.getFilePreferences().getBackupDirectory()); return true; } @@ -882,7 +935,10 @@ public void closeTab(LibraryTab libraryTab) { removeTab(libraryTab); } AutosaveManager.shutdown(context); - BackupManager.shutdown(context, prefs.getFilePreferences().getBackupDirectory(), prefs.getFilePreferences().shouldCreateBackup()); + BackupManager.shutdown( + context, + prefs.getFilePreferences().getBackupDirectory(), + prefs.getFilePreferences().shouldCreateBackup()); } private void removeTab(LibraryTab libraryTab) { @@ -920,12 +976,13 @@ public DialogService getDialogService() { return dialogService; } - private void copyGroupTreeNode(LibraryTab destinationLibraryTab, GroupTreeNode parent, GroupTreeNode groupTreeNodeToCopy) { - List allEntries = getCurrentLibraryTab() - .getBibDatabaseContext() - .getEntries(); + private void copyGroupTreeNode( + LibraryTab destinationLibraryTab, GroupTreeNode parent, GroupTreeNode groupTreeNodeToCopy) { + List allEntries = + getCurrentLibraryTab().getBibDatabaseContext().getEntries(); // add groupTreeNodeToCopy to the parent-- in the first run that will the source/main GroupTreeNode - GroupTreeNode copiedNode = parent.addSubgroup(groupTreeNodeToCopy.copyNode().getGroup()); + GroupTreeNode copiedNode = + parent.addSubgroup(groupTreeNodeToCopy.copyNode().getGroup()); // add all entries of a groupTreeNode to the new library. destinationLibraryTab.dropEntry(groupTreeNodeToCopy.getEntriesInGroup(allEntries)); // List of all children of groupTreeNodeToCopy @@ -940,20 +997,23 @@ private void copyGroupTreeNode(LibraryTab destinationLibraryTab, GroupTreeNode p } private void copyRootNode(LibraryTab destinationLibraryTab) { - if (!destinationLibraryTab.getBibDatabaseContext().getMetaData().getGroups().isEmpty()) { + if (!destinationLibraryTab + .getBibDatabaseContext() + .getMetaData() + .getGroups() + .isEmpty()) { return; } // a root (all entries) GroupTreeNode - GroupTreeNode currentLibraryGroupRoot = getCurrentLibraryTab().getBibDatabaseContext() - .getMetaData() - .getGroups() - .get() - .copyNode(); + GroupTreeNode currentLibraryGroupRoot = getCurrentLibraryTab() + .getBibDatabaseContext() + .getMetaData() + .getGroups() + .get() + .copyNode(); // add currentLibraryGroupRoot to the Library if it does not have a root. - destinationLibraryTab.getBibDatabaseContext() - .getMetaData() - .setGroups(currentLibraryGroupRoot); + destinationLibraryTab.getBibDatabaseContext().getMetaData().setGroups(currentLibraryGroupRoot); } public Stage getMainStage() { @@ -963,7 +1023,7 @@ public Stage getMainStage() { /** * The action concerned with closing the window. */ - static protected class CloseAction extends SimpleCommand { + protected static class CloseAction extends SimpleCommand { private final JabRefFrame frame; @@ -977,7 +1037,7 @@ public void execute() { } } - static protected class CloseDatabaseAction extends SimpleCommand { + protected static class CloseDatabaseAction extends SimpleCommand { private final LibraryTabContainer tabContainer; private final LibraryTab libraryTab; @@ -1041,13 +1101,16 @@ public OpenDatabaseFolder(Supplier databaseContext) { @Override public void execute() { - Optional.of(databaseContext.get()).flatMap(BibDatabaseContext::getDatabasePath).ifPresent(path -> { - try { - JabRefDesktop.openFolderAndSelectFile(path, prefs.getExternalApplicationsPreferences(), dialogService); - } catch (IOException e) { - LOGGER.info("Could not open folder", e); - } - }); + Optional.of(databaseContext.get()) + .flatMap(BibDatabaseContext::getDatabasePath) + .ifPresent(path -> { + try { + JabRefDesktop.openFolderAndSelectFile( + path, prefs.getExternalApplicationsPreferences(), dialogService); + } catch (IOException e) { + LOGGER.info("Could not open folder", e); + } + }); } } diff --git a/src/main/java/org/jabref/gui/JabRefGUI.java b/src/main/java/org/jabref/gui/JabRefGUI.java index 9a402703619..683a40ef239 100644 --- a/src/main/java/org/jabref/gui/JabRefGUI.java +++ b/src/main/java/org/jabref/gui/JabRefGUI.java @@ -50,11 +50,12 @@ public class JabRefGUI { private final List failed = new ArrayList<>(); private final List toOpenTab = new ArrayList<>(); - public JabRefGUI(Stage mainStage, - List databases, - boolean isBlank, - PreferencesService preferencesService, - FileUpdateMonitor fileUpdateMonitor) { + public JabRefGUI( + Stage mainStage, + List databases, + boolean isBlank, + PreferencesService preferencesService, + FileUpdateMonitor fileUpdateMonitor) { this.parserResults = databases; this.isBlank = isBlank; this.preferencesService = preferencesService; @@ -69,10 +70,11 @@ public JabRefGUI(Stage mainStage, EasyBind.subscribe(preferencesService.getInternalPreferences().versionCheckEnabledProperty(), enabled -> { if (enabled) { - new VersionWorker(Globals.BUILD_INFO.version, - mainFrame.getDialogService(), - Globals.TASK_EXECUTOR, - preferencesService) + new VersionWorker( + Globals.BUILD_INFO.version, + mainFrame.getDialogService(), + Globals.TASK_EXECUTOR, + preferencesService) .checkForNewVersionDelayed(); } }); @@ -87,7 +89,8 @@ private void setupProxy() { } if (preferencesService.getProxyPreferences().shouldPersistPassword() - && StringUtil.isNotBlank(preferencesService.getProxyPreferences().getPassword())) { + && StringUtil.isNotBlank( + preferencesService.getProxyPreferences().getPassword())) { ProxyRegisterer.register(preferencesService.getProxyPreferences()); return; } @@ -169,10 +172,11 @@ private void openWindow(Stage mainStage) { Platform.runLater(this::openDatabases); if (!(fileUpdateMonitor.isActive())) { - getMainFrame().getDialogService() - .showErrorDialogAndWait(Localization.lang("Unable to monitor file changes. Please close files " + - "and processes and restart. You may encounter errors if you continue " + - "with this session.")); + getMainFrame() + .getDialogService() + .showErrorDialogAndWait(Localization.lang("Unable to monitor file changes. Please close files " + + "and processes and restart. You may encounter errors if you continue " + + "with this session.")); } } @@ -188,25 +192,26 @@ private void openDatabases() { // From here on, the libraries provided by command line arguments are treated // Remove invalid databases - List invalidDatabases = parserResults.stream() - .filter(ParserResult::isInvalid) - .toList(); + List invalidDatabases = + parserResults.stream().filter(ParserResult::isInvalid).toList(); failed.addAll(invalidDatabases); parserResults.removeAll(invalidDatabases); // passed file (we take the first one) should be focused Path focusedFile = parserResults.stream() - .findFirst() - .flatMap(ParserResult::getPath) - .orElse(preferencesService.getGuiPreferences() - .getLastFocusedFile()) - .toAbsolutePath(); + .findFirst() + .flatMap(ParserResult::getPath) + .orElse(preferencesService.getGuiPreferences().getLastFocusedFile()) + .toAbsolutePath(); // Add all bibDatabases databases to the frame: boolean first = false; for (ParserResult parserResult : parserResults) { // Define focused tab - if (parserResult.getPath().filter(path -> path.toAbsolutePath().equals(focusedFile)).isPresent()) { + if (parserResult + .getPath() + .filter(path -> path.toAbsolutePath().equals(focusedFile)) + .isPresent()) { first = true; } @@ -222,16 +227,18 @@ private void openDatabases() { fileUpdateMonitor, mainFrame.getUndoManager(), Globals.TASK_EXECUTOR); - } catch (SQLException | - DatabaseNotSupportedException | - InvalidDBMSConnectionPropertiesException | - NotASharedDatabaseException e) { + } catch (SQLException + | DatabaseNotSupportedException + | InvalidDBMSConnectionPropertiesException + | NotASharedDatabaseException e) { LOGGER.error("Connection error", e); - mainFrame.getDialogService().showErrorDialogAndWait( - Localization.lang("Connection error"), - Localization.lang("A local copy will be opened."), - e); + mainFrame + .getDialogService() + .showErrorDialogAndWait( + Localization.lang("Connection error"), + Localization.lang("A local copy will be opened."), + e); toOpenTab.add(parserResult); } } else if (parserResult.toOpenTab()) { @@ -251,9 +258,10 @@ private void openDatabases() { } for (ParserResult pr : failed) { - String message = Localization.lang("Error opening file '%0'", - pr.getPath().map(Path::toString).orElse("(File name unknown)")) + "\n" + - pr.getErrorMessage(); + String message = Localization.lang( + "Error opening file '%0'", + pr.getPath().map(Path::toString).orElse("(File name unknown)")) + + "\n" + pr.getErrorMessage(); mainFrame.getDialogService().showErrorDialogAndWait(Localization.lang("Error opening file"), message); } @@ -301,12 +309,12 @@ private void saveWindowState(Stage mainStage) { */ private void debugLogWindowState(Stage mainStage) { if (LOGGER.isDebugEnabled()) { - String debugLogString = "SCREEN DATA:" + - "mainStage.WINDOW_MAXIMISED: " + mainStage.isMaximized() + "\n" + - "mainStage.POS_X: " + mainStage.getX() + "\n" + - "mainStage.POS_Y: " + mainStage.getY() + "\n" + - "mainStage.SIZE_X: " + mainStage.getWidth() + "\n" + - "mainStages.SIZE_Y: " + mainStage.getHeight() + "\n"; + String debugLogString = "SCREEN DATA:" + "mainStage.WINDOW_MAXIMISED: " + + mainStage.isMaximized() + "\n" + "mainStage.POS_X: " + + mainStage.getX() + "\n" + "mainStage.POS_Y: " + + mainStage.getY() + "\n" + "mainStage.SIZE_X: " + + mainStage.getWidth() + "\n" + "mainStages.SIZE_Y: " + + mainStage.getHeight() + "\n"; LOGGER.debug(debugLogString); } } @@ -317,9 +325,11 @@ private void debugLogWindowState(Stage mainStage) { * @return outbounds */ private boolean isWindowPositionOutOfBounds() { - return !Screen.getPrimary().getBounds().contains( - preferencesService.getGuiPreferences().getPositionX(), - preferencesService.getGuiPreferences().getPositionY()); + return !Screen.getPrimary() + .getBounds() + .contains( + preferencesService.getGuiPreferences().getPositionX(), + preferencesService.getGuiPreferences().getPositionY()); } private void openLastEditedDatabases() { diff --git a/src/main/java/org/jabref/gui/LibraryTab.java b/src/main/java/org/jabref/gui/LibraryTab.java index 137a9548678..228f449d0ac 100644 --- a/src/main/java/org/jabref/gui/LibraryTab.java +++ b/src/main/java/org/jabref/gui/LibraryTab.java @@ -124,15 +124,16 @@ public class LibraryTab extends Tab { private final IndexingTaskManager indexingTaskManager; private final TaskExecutor taskExecutor; - public LibraryTab(BibDatabaseContext bibDatabaseContext, - JabRefFrame frame, - DialogService dialogService, - PreferencesService preferencesService, - StateManager stateManager, - FileUpdateMonitor fileUpdateMonitor, - BibEntryTypesManager entryTypesManager, - CountingUndoManager undoManager, - TaskExecutor taskExecutor) { + public LibraryTab( + BibDatabaseContext bibDatabaseContext, + JabRefFrame frame, + DialogService dialogService, + PreferencesService preferencesService, + StateManager stateManager, + FileUpdateMonitor fileUpdateMonitor, + BibEntryTypesManager entryTypesManager, + CountingUndoManager undoManager, + TaskExecutor taskExecutor) { this.frame = Objects.requireNonNull(frame); this.bibDatabaseContext = Objects.requireNonNull(bibDatabaseContext); this.undoManager = undoManager; @@ -173,8 +174,8 @@ public LibraryTab(BibDatabaseContext bibDatabaseContext, Platform.runLater(() -> { EasyBind.subscribe(changedProperty, this::updateTabTitle); - stateManager.getOpenDatabases().addListener((ListChangeListener) c -> - updateTabTitle(changedProperty.getValue())); + stateManager.getOpenDatabases().addListener((ListChangeListener) + c -> updateTabTitle(changedProperty.getValue())); }); } @@ -231,7 +232,8 @@ public void onDatabaseLoadingSucceed(ParserResult result) { if (preferencesService.getFilePreferences().shouldFulltextIndexLinkedFiles()) { try { - indexingTaskManager.updateIndex(PdfIndexer.of(bibDatabaseContext, preferencesService.getFilePreferences()), bibDatabaseContext); + indexingTaskManager.updateIndex( + PdfIndexer.of(bibDatabaseContext, preferencesService.getFilePreferences()), bibDatabaseContext); } catch (IOException e) { LOGGER.error("Cannot access lucene index", e); } @@ -251,15 +253,20 @@ public void feedData(BibDatabaseContext bibDatabaseContextFromParserResult) { if (this.getTabPane().getSelectionModel().selectedItemProperty().get().equals(this)) { // If you open an existing library, a library tab with a loading animation is added immediately. // At that point, the library tab is given a temporary bibDatabaseContext with no entries. - // This line is necessary because, while there is already a binding that updates the active database when a new tab is added, + // This line is necessary because, while there is already a binding that updates the active database when a + // new tab is added, // it doesn't handle the case when a library is loaded asynchronously. // See org.jabref.gui.LibraryTab.createLibraryTab for the asynchronous loading. stateManager.setActiveDatabase(bibDatabaseContextFromParserResult); } - // Remove existing dummy BibDatabaseContext and add correct BibDatabaseContext from ParserResult to trigger changes in the openDatabases list in the stateManager - Optional foundExistingBibDatabase = stateManager.getOpenDatabases().stream().filter(databaseContext -> databaseContext.equals(this.bibDatabaseContext)).findFirst(); - foundExistingBibDatabase.ifPresent(databaseContext -> stateManager.getOpenDatabases().remove(databaseContext)); + // Remove existing dummy BibDatabaseContext and add correct BibDatabaseContext from ParserResult to trigger + // changes in the openDatabases list in the stateManager + Optional foundExistingBibDatabase = stateManager.getOpenDatabases().stream() + .filter(databaseContext -> databaseContext.equals(this.bibDatabaseContext)) + .findFirst(); + foundExistingBibDatabase.ifPresent( + databaseContext -> stateManager.getOpenDatabases().remove(databaseContext)); this.bibDatabaseContext = Objects.requireNonNull(bibDatabaseContextFromParserResult); @@ -270,7 +277,8 @@ public void feedData(BibDatabaseContext bibDatabaseContextFromParserResult) { this.tableModel = new MainTableDataModel(getBibDatabaseContext(), preferencesService, stateManager); citationStyleCache = new CitationStyleCache(bibDatabaseContextFromParserResult); - annotationCache = new FileAnnotationCache(bibDatabaseContextFromParserResult, preferencesService.getFilePreferences()); + annotationCache = + new FileAnnotationCache(bibDatabaseContextFromParserResult, preferencesService.getFilePreferences()); setupMainPanel(); setupAutoCompletion(); @@ -288,8 +296,8 @@ public void feedData(BibDatabaseContext bibDatabaseContextFromParserResult) { Platform.runLater(() -> { EasyBind.subscribe(changedProperty, this::updateTabTitle); - stateManager.getOpenDatabases().addListener((ListChangeListener) c -> - updateTabTitle(changedProperty.getValue())); + stateManager.getOpenDatabases().addListener((ListChangeListener) + c -> updateTabTitle(changedProperty.getValue())); }); installAutosaveManagerAndBackupManager(); @@ -298,22 +306,25 @@ public void feedData(BibDatabaseContext bibDatabaseContextFromParserResult) { public void installAutosaveManagerAndBackupManager() { if (isDatabaseReadyForAutoSave(bibDatabaseContext)) { AutosaveManager autosaveManager = AutosaveManager.start(bibDatabaseContext); - autosaveManager.registerListener(new AutosaveUiManager(this, dialogService, preferencesService, entryTypesManager)); + autosaveManager.registerListener( + new AutosaveUiManager(this, dialogService, preferencesService, entryTypesManager)); } - if (isDatabaseReadyForBackup(bibDatabaseContext) && preferencesService.getFilePreferences().shouldCreateBackup()) { + if (isDatabaseReadyForBackup(bibDatabaseContext) + && preferencesService.getFilePreferences().shouldCreateBackup()) { BackupManager.start(this, bibDatabaseContext, Globals.entryTypesManager, preferencesService); } } private boolean isDatabaseReadyForAutoSave(BibDatabaseContext context) { return ((context.getLocation() == DatabaseLocation.SHARED) - || ((context.getLocation() == DatabaseLocation.LOCAL) - && preferencesService.getLibraryPreferences().shouldAutoSave())) + || ((context.getLocation() == DatabaseLocation.LOCAL) + && preferencesService.getLibraryPreferences().shouldAutoSave())) && context.getDatabasePath().isPresent(); } private boolean isDatabaseReadyForBackup(BibDatabaseContext context) { - return (context.getLocation() == DatabaseLocation.LOCAL) && context.getDatabasePath().isPresent(); + return (context.getLocation() == DatabaseLocation.LOCAL) + && context.getDatabasePath().isPresent(); } /** @@ -360,7 +371,8 @@ public void updateTabTitle(boolean isChanged) { } // Unique path fragment - Optional uniquePathPart = FileUtil.getUniquePathDirectory(stateManager.collectAllDatabasePaths(), databasePath); + Optional uniquePathPart = + FileUtil.getUniquePathDirectory(stateManager.collectAllDatabasePaths(), databasePath); uniquePathPart.ifPresent(part -> tabTitle.append(" \u2013 ").append(part)); } else { if (databaseLocation == DatabaseLocation.LOCAL) { @@ -376,7 +388,8 @@ public void updateTabTitle(boolean isChanged) { addSharedDbInformation(toolTipText, bibDatabaseContext); } addModeInfo(toolTipText, bibDatabaseContext); - if ((databaseLocation == DatabaseLocation.LOCAL) && bibDatabaseContext.getDatabase().hasEntries()) { + if ((databaseLocation == DatabaseLocation.LOCAL) + && bibDatabaseContext.getDatabase().hasEntries()) { addChangedInformation(toolTipText, Localization.lang("untitled")); } } @@ -442,7 +455,8 @@ private void delete(boolean cut, List entries) { ensureNotShowingBottomPanel(entries); this.changedProperty.setValue(true); - dialogService.notify(formatOutputMessage(cut ? Localization.lang("Cut") : Localization.lang("Deleted"), entries.size())); + dialogService.notify( + formatOutputMessage(cut ? Localization.lang("Cut") : Localization.lang("Deleted"), entries.size())); // prevent the main table from loosing focus mainTable.requestFocus(); @@ -474,15 +488,13 @@ public void insertEntry(final BibEntry bibEntry) { * * @param entries The new entries. */ - public void insertEntries(final List entries) { if (!entries.isEmpty()) { bibDatabaseContext.getDatabase().insertEntries(entries); // Set owner and timestamp - UpdateField.setAutomaticFields(entries, - preferencesService.getOwnerPreferences(), - preferencesService.getTimestampPreferences()); + UpdateField.setAutomaticFields( + entries, preferencesService.getOwnerPreferences(), preferencesService.getTimestampPreferences()); // Create an UndoableInsertEntries object. getUndoManager().addEdit(new UndoableInsertEntries(bibDatabaseContext.getDatabase(), entries)); @@ -504,7 +516,8 @@ public void editEntryAndFocusField(BibEntry entry, Field field) { } private void createMainTable() { - mainTable = new MainTable(tableModel, + mainTable = new MainTable( + tableModel, this, bibDatabaseContext, preferencesService, @@ -515,10 +528,14 @@ private void createMainTable() { entryTypesManager, taskExecutor, fileUpdateMonitor); - // Add the listener that binds selection to state manager (TODO: should be replaced by proper JavaFX binding as soon as table is implemented in JavaFX) - // content binding between StateManager#getselectedEntries and mainTable#getSelectedEntries does not work here as it does not trigger the ActionHelper#needsEntriesSelected checker for the menubar + // Add the listener that binds selection to state manager (TODO: should be replaced by proper JavaFX binding as + // soon as table is implemented in JavaFX) + // content binding between StateManager#getselectedEntries and mainTable#getSelectedEntries does not work here + // as it does not trigger the ActionHelper#needsEntriesSelected checker for the menubar mainTable.addSelectionListener(event -> { - List entries = event.getList().stream().map(BibEntryTableViewModel::getEntry).toList(); + List entries = event.getList().stream() + .map(BibEntryTableViewModel::getEntry) + .toList(); stateManager.setSelectedEntries(entries); if (!entries.isEmpty()) { // Update entry editor and preview according to selected entries @@ -540,8 +557,8 @@ public void setupMainPanel() { // Saves the divider position as soon as it changes // We need to keep a reference to the subscription, otherwise the binding gets garbage collected dividerPositionSubscription = EasyBind.valueAt(splitPane.getDividers(), 0) - .mapObservable(SplitPane.Divider::positionProperty) - .subscribeToValues(this::saveDividerLocation); + .mapObservable(SplitPane.Divider::positionProperty) + .subscribeToValues(this::saveDividerLocation); // Add changePane in case a file is present - otherwise just add the splitPane to the panel Optional file = bibDatabaseContext.getDatabasePath(); @@ -563,7 +580,8 @@ public void setupMainPanel() { private void setupAutoCompletion() { AutoCompletePreferences autoCompletePreferences = preferencesService.getAutoCompletePreferences(); if (autoCompletePreferences.shouldAutoComplete()) { - suggestionProviders = new SuggestionProviders(getDatabase(), Globals.journalAbbreviationRepository, autoCompletePreferences); + suggestionProviders = new SuggestionProviders( + getDatabase(), Globals.journalAbbreviationRepository, autoCompletePreferences); } else { // Create empty suggestion providers if auto completion is deactivated suggestionProviders = new SuggestionProviders(); @@ -608,7 +626,8 @@ private void showBottomPane(BasePanelMode newMode) { } mode = newMode; - splitPane.setDividerPositions(preferencesService.getEntryEditorPreferences().getDividerPosition()); + splitPane.setDividerPositions( + preferencesService.getEntryEditorPreferences().getDividerPosition()); } /** @@ -627,11 +646,15 @@ public void clearAndSelect(final BibEntry bibEntry) { } public void selectPreviousEntry() { - mainTable.getSelectionModel().clearAndSelect(mainTable.getSelectionModel().getSelectedIndex() - 1); + mainTable + .getSelectionModel() + .clearAndSelect(mainTable.getSelectionModel().getSelectedIndex() - 1); } public void selectNextEntry() { - mainTable.getSelectionModel().clearAndSelect(mainTable.getSelectionModel().getSelectedIndex() + 1); + mainTable + .getSelectionModel() + .clearAndSelect(mainTable.getSelectionModel().getSelectedIndex() + 1); } /** @@ -663,7 +686,6 @@ public void updateEntryEditorIfShowing() { /** * Put an asterisk behind the filename to indicate the database has changed. */ - public synchronized void markChangedOrUnChanged() { if (undoManager.hasChanged()) { this.changedProperty.setValue(true); @@ -684,12 +706,14 @@ private boolean showDeleteConfirmationDialog(int numberOfEntries) { String cancelButton = Localization.lang("Keep entry"); if (numberOfEntries > 1) { title = Localization.lang("Delete multiple entries"); - message = Localization.lang("Really delete the %0 selected entries?", Integer.toString(numberOfEntries)); + message = + Localization.lang("Really delete the %0 selected entries?", Integer.toString(numberOfEntries)); okButton = Localization.lang("Delete entries"); cancelButton = Localization.lang("Keep entries"); } - return dialogService.showConfirmationDialogWithOptOutAndWait(title, + return dialogService.showConfirmationDialogWithOptOutAndWait( + title, message, okButton, cancelButton, @@ -715,7 +739,10 @@ private void saveDividerLocation(Number position) { public void cleanUp() { changeMonitor.ifPresent(DatabaseChangeMonitor::unregister); AutosaveManager.shutdown(bibDatabaseContext); - BackupManager.shutdown(bibDatabaseContext, preferencesService.getFilePreferences().getBackupDirectory(), preferencesService.getFilePreferences().shouldCreateBackup()); + BackupManager.shutdown( + bibDatabaseContext, + preferencesService.getFilePreferences().getBackupDirectory(), + preferencesService.getFilePreferences().shouldCreateBackup()); } /** @@ -744,7 +771,8 @@ private BibEntry getShowing() { } public String formatOutputMessage(String start, int count) { - return String.format("%s %d %s.", start, count, (count > 1 ? Localization.lang("entries") : Localization.lang("entry"))); + return String.format( + "%s %d %s.", start, count, (count > 1 ? Localization.lang("entries") : Localization.lang("entry"))); } public CountingUndoManager getUndoManager() { @@ -776,7 +804,8 @@ public FileAnnotationCache getAnnotationCache() { public void resetChangeMonitor() { changeMonitor.ifPresent(DatabaseChangeMonitor::unregister); - changeMonitor = Optional.of(new DatabaseChangeMonitor(bibDatabaseContext, + changeMonitor = Optional.of(new DatabaseChangeMonitor( + bibDatabaseContext, fileUpdateMonitor, taskExecutor, dialogService, @@ -832,16 +861,17 @@ public void resetChangedProperties() { * @param dataLoadingTask The task to execute to load the data asynchronously. * @param file the path to the file (loaded by the dataLoadingTask) */ - public static LibraryTab createLibraryTab(BackgroundTask dataLoadingTask, - Path file, - DialogService dialogService, - PreferencesService preferencesService, - StateManager stateManager, - JabRefFrame frame, - FileUpdateMonitor fileUpdateMonitor, - BibEntryTypesManager entryTypesManager, - CountingUndoManager undoManager, - TaskExecutor taskExecutor) { + public static LibraryTab createLibraryTab( + BackgroundTask dataLoadingTask, + Path file, + DialogService dialogService, + PreferencesService preferencesService, + StateManager stateManager, + JabRefFrame frame, + FileUpdateMonitor fileUpdateMonitor, + BibEntryTypesManager entryTypesManager, + CountingUndoManager undoManager, + TaskExecutor taskExecutor) { BibDatabaseContext context = new BibDatabaseContext(); context.setDatabasePath(file); @@ -857,23 +887,25 @@ public static LibraryTab createLibraryTab(BackgroundTask dataLoadi taskExecutor); newTab.setDataLoadingTask(dataLoadingTask); - dataLoadingTask.onRunning(newTab::onDatabaseLoadingStarted) - .onSuccess(newTab::onDatabaseLoadingSucceed) - .onFailure(newTab::onDatabaseLoadingFailed) - .executeWith(taskExecutor); + dataLoadingTask + .onRunning(newTab::onDatabaseLoadingStarted) + .onSuccess(newTab::onDatabaseLoadingSucceed) + .onFailure(newTab::onDatabaseLoadingFailed) + .executeWith(taskExecutor); return newTab; } - public static LibraryTab createLibraryTab(BibDatabaseContext databaseContext, - JabRefFrame frame, - DialogService dialogService, - PreferencesService preferencesService, - StateManager stateManager, - FileUpdateMonitor fileUpdateMonitor, - BibEntryTypesManager entryTypesManager, - UndoManager undoManager, - TaskExecutor taskExecutor) { + public static LibraryTab createLibraryTab( + BibDatabaseContext databaseContext, + JabRefFrame frame, + DialogService dialogService, + PreferencesService preferencesService, + StateManager stateManager, + FileUpdateMonitor fileUpdateMonitor, + BibEntryTypesManager entryTypesManager, + UndoManager undoManager, + TaskExecutor taskExecutor) { Objects.requireNonNull(databaseContext); LibraryTab libraryTab = new LibraryTab( @@ -901,8 +933,9 @@ public void listen(EntriesAddedEvent addedEntriesEvent) { // Automatically add new entries to the selected group (or set of groups) if (preferencesService.getGroupsPreferences().shouldAutoAssignGroup()) { - stateManager.getSelectedGroup(bibDatabaseContext).forEach( - selectedGroup -> selectedGroup.addEntriesToGroup(addedEntriesEvent.getBibEntries())); + stateManager + .getSelectedGroup(bibDatabaseContext) + .forEach(selectedGroup -> selectedGroup.addEntriesToGroup(addedEntriesEvent.getBibEntries())); } } } @@ -958,8 +991,15 @@ public void listen(FieldChangedEvent fieldChangedEvent) { removedFiles.remove(newFileList); try { - indexingTaskManager.addToIndex(PdfIndexer.of(bibDatabaseContext, preferencesService.getFilePreferences()), fieldChangedEvent.getBibEntry(), addedFiles, bibDatabaseContext); - indexingTaskManager.removeFromIndex(PdfIndexer.of(bibDatabaseContext, preferencesService.getFilePreferences()), fieldChangedEvent.getBibEntry(), removedFiles); + indexingTaskManager.addToIndex( + PdfIndexer.of(bibDatabaseContext, preferencesService.getFilePreferences()), + fieldChangedEvent.getBibEntry(), + addedFiles, + bibDatabaseContext); + indexingTaskManager.removeFromIndex( + PdfIndexer.of(bibDatabaseContext, preferencesService.getFilePreferences()), + fieldChangedEvent.getBibEntry(), + removedFiles); } catch (IOException e) { LOGGER.warn("I/O error when writing lucene index", e); } diff --git a/src/main/java/org/jabref/gui/MainApplication.java b/src/main/java/org/jabref/gui/MainApplication.java index a187843977d..8fab7cea141 100644 --- a/src/main/java/org/jabref/gui/MainApplication.java +++ b/src/main/java/org/jabref/gui/MainApplication.java @@ -19,11 +19,12 @@ public class MainApplication extends Application { private static JabRefPreferences preferences; private static FileUpdateMonitor fileUpdateMonitor; - public static void main(List parserResults, - boolean blank, - JabRefPreferences preferences, - FileUpdateMonitor fileUpdateMonitor, - String[] args) { + public static void main( + List parserResults, + boolean blank, + JabRefPreferences preferences, + FileUpdateMonitor fileUpdateMonitor, + String[] args) { MainApplication.parserResults = parserResults; MainApplication.isBlank = blank; MainApplication.preferences = preferences; diff --git a/src/main/java/org/jabref/gui/MainMenu.java b/src/main/java/org/jabref/gui/MainMenu.java index 28a08a31a0d..de0b053c328 100644 --- a/src/main/java/org/jabref/gui/MainMenu.java +++ b/src/main/java/org/jabref/gui/MainMenu.java @@ -86,18 +86,19 @@ public class MainMenu extends MenuBar { private final UndoManager undoManager; private final ClipBoardManager clipBoardManager; - public MainMenu(JabRefFrame frame, - SidePane sidePane, - PushToApplicationCommand pushToApplicationCommand, - PreferencesService preferencesService, - StateManager stateManager, - FileUpdateMonitor fileUpdateMonitor, - TaskExecutor taskExecutor, - DialogService dialogService, - JournalAbbreviationRepository abbreviationRepository, - BibEntryTypesManager entryTypesManager, - UndoManager undoManager, - ClipBoardManager clipBoardManager) { + public MainMenu( + JabRefFrame frame, + SidePane sidePane, + PushToApplicationCommand pushToApplicationCommand, + PreferencesService preferencesService, + StateManager stateManager, + FileUpdateMonitor fileUpdateMonitor, + TaskExecutor taskExecutor, + DialogService dialogService, + JournalAbbreviationRepository abbreviationRepository, + BibEntryTypesManager entryTypesManager, + UndoManager undoManager, + ClipBoardManager clipBoardManager) { this.frame = frame; this.sidePane = sidePane; this.pushToApplicationCommand = pushToApplicationCommand; @@ -125,85 +126,254 @@ private void createMenu() { Menu tools = new Menu(Localization.lang("Tools")); Menu help = new Menu(Localization.lang("Help")); - file.getItems().addAll( - factory.createMenuItem(StandardActions.NEW_LIBRARY, new NewDatabaseAction(frame, preferencesService)), - factory.createMenuItem(StandardActions.OPEN_LIBRARY, frame.getOpenDatabaseAction()), - frame.getFileHistory(), - factory.createMenuItem(StandardActions.SAVE_LIBRARY, new SaveAction(SaveAction.SaveMethod.SAVE, frame, dialogService, preferencesService, stateManager)), - factory.createMenuItem(StandardActions.SAVE_LIBRARY_AS, new SaveAction(SaveAction.SaveMethod.SAVE_AS, frame, dialogService, preferencesService, stateManager)), - factory.createMenuItem(StandardActions.SAVE_ALL, new SaveAllAction(frame, preferencesService)), - factory.createMenuItem(StandardActions.CLOSE_LIBRARY, new JabRefFrame.CloseDatabaseAction(frame)), - - new SeparatorMenuItem(), - - factory.createSubMenu(StandardActions.IMPORT, - factory.createMenuItem(StandardActions.IMPORT_INTO_CURRENT_LIBRARY, new ImportCommand(frame, ImportCommand.ImportMethod.TO_EXISTING, preferencesService, stateManager, fileUpdateMonitor, taskExecutor, dialogService)), - factory.createMenuItem(StandardActions.IMPORT_INTO_NEW_LIBRARY, new ImportCommand(frame, ImportCommand.ImportMethod.AS_NEW, preferencesService, stateManager, fileUpdateMonitor, taskExecutor, dialogService))), - - factory.createSubMenu(StandardActions.EXPORT, - factory.createMenuItem(StandardActions.EXPORT_ALL, new ExportCommand(ExportCommand.ExportMethod.EXPORT_ALL, frame, stateManager, dialogService, preferencesService, entryTypesManager, abbreviationRepository, taskExecutor)), - factory.createMenuItem(StandardActions.EXPORT_SELECTED, new ExportCommand(ExportCommand.ExportMethod.EXPORT_SELECTED, frame, stateManager, dialogService, preferencesService, entryTypesManager, abbreviationRepository, taskExecutor)), - factory.createMenuItem(StandardActions.SAVE_SELECTED_AS_PLAIN_BIBTEX, new SaveAction(SaveAction.SaveMethod.SAVE_SELECTED, frame, dialogService, preferencesService, stateManager))), - - new SeparatorMenuItem(), - - factory.createSubMenu(StandardActions.REMOTE_DB, - factory.createMenuItem(StandardActions.CONNECT_TO_SHARED_DB, new ConnectToSharedDatabaseCommand(frame)), - factory.createMenuItem(StandardActions.PULL_CHANGES_FROM_SHARED_DB, new PullChangesFromSharedAction(stateManager))), - - new SeparatorMenuItem(), - - factory.createMenuItem(StandardActions.SHOW_PREFS, new ShowPreferencesAction(frame, taskExecutor)), - - new SeparatorMenuItem(), - - factory.createMenuItem(StandardActions.QUIT, new JabRefFrame.CloseAction(frame)) - ); - - edit.getItems().addAll( - factory.createMenuItem(StandardActions.UNDO, new UndoRedoAction(StandardActions.UNDO, frame, dialogService, stateManager)), - factory.createMenuItem(StandardActions.REDO, new UndoRedoAction(StandardActions.REDO, frame, dialogService, stateManager)), - - new SeparatorMenuItem(), - - factory.createMenuItem(StandardActions.CUT, new EditAction(StandardActions.CUT, frame, stateManager)), - - factory.createMenuItem(StandardActions.COPY, new EditAction(StandardActions.COPY, frame, stateManager)), - factory.createSubMenu(StandardActions.COPY_MORE, - factory.createMenuItem(StandardActions.COPY_TITLE, new CopyMoreAction(StandardActions.COPY_TITLE, dialogService, stateManager, clipBoardManager, preferencesService, abbreviationRepository)), - factory.createMenuItem(StandardActions.COPY_KEY, new CopyMoreAction(StandardActions.COPY_KEY, dialogService, stateManager, clipBoardManager, preferencesService, abbreviationRepository)), - factory.createMenuItem(StandardActions.COPY_CITE_KEY, new CopyMoreAction(StandardActions.COPY_CITE_KEY, dialogService, stateManager, clipBoardManager, preferencesService, abbreviationRepository)), - factory.createMenuItem(StandardActions.COPY_KEY_AND_TITLE, new CopyMoreAction(StandardActions.COPY_KEY_AND_TITLE, dialogService, stateManager, clipBoardManager, preferencesService, abbreviationRepository)), - factory.createMenuItem(StandardActions.COPY_KEY_AND_LINK, new CopyMoreAction(StandardActions.COPY_KEY_AND_LINK, dialogService, stateManager, clipBoardManager, preferencesService, abbreviationRepository)), - factory.createMenuItem(StandardActions.COPY_CITATION_PREVIEW, new CopyCitationAction(CitationStyleOutputFormat.HTML, dialogService, stateManager, clipBoardManager, taskExecutor, preferencesService, abbreviationRepository)), - factory.createMenuItem(StandardActions.EXPORT_SELECTED_TO_CLIPBOARD, new ExportToClipboardAction(dialogService, stateManager, clipBoardManager, taskExecutor, preferencesService))), - - factory.createMenuItem(StandardActions.PASTE, new EditAction(StandardActions.PASTE, frame, stateManager)), - - new SeparatorMenuItem(), - - factory.createMenuItem(StandardActions.REPLACE_ALL, new ReplaceStringAction(frame, stateManager)), - factory.createMenuItem(StandardActions.GENERATE_CITE_KEYS, new GenerateCitationKeyAction(frame, dialogService, stateManager, taskExecutor, preferencesService)), - - new SeparatorMenuItem(), - - factory.createMenuItem(StandardActions.MANAGE_KEYWORDS, new ManageKeywordsAction(stateManager)), - factory.createMenuItem(StandardActions.AUTOMATIC_FIELD_EDITOR, new AutomaticFieldEditorAction(stateManager, dialogService))); + file.getItems() + .addAll( + factory.createMenuItem( + StandardActions.NEW_LIBRARY, new NewDatabaseAction(frame, preferencesService)), + factory.createMenuItem(StandardActions.OPEN_LIBRARY, frame.getOpenDatabaseAction()), + frame.getFileHistory(), + factory.createMenuItem( + StandardActions.SAVE_LIBRARY, + new SaveAction( + SaveAction.SaveMethod.SAVE, + frame, + dialogService, + preferencesService, + stateManager)), + factory.createMenuItem( + StandardActions.SAVE_LIBRARY_AS, + new SaveAction( + SaveAction.SaveMethod.SAVE_AS, + frame, + dialogService, + preferencesService, + stateManager)), + factory.createMenuItem(StandardActions.SAVE_ALL, new SaveAllAction(frame, preferencesService)), + factory.createMenuItem( + StandardActions.CLOSE_LIBRARY, new JabRefFrame.CloseDatabaseAction(frame)), + new SeparatorMenuItem(), + factory.createSubMenu( + StandardActions.IMPORT, + factory.createMenuItem( + StandardActions.IMPORT_INTO_CURRENT_LIBRARY, + new ImportCommand( + frame, + ImportCommand.ImportMethod.TO_EXISTING, + preferencesService, + stateManager, + fileUpdateMonitor, + taskExecutor, + dialogService)), + factory.createMenuItem( + StandardActions.IMPORT_INTO_NEW_LIBRARY, + new ImportCommand( + frame, + ImportCommand.ImportMethod.AS_NEW, + preferencesService, + stateManager, + fileUpdateMonitor, + taskExecutor, + dialogService))), + factory.createSubMenu( + StandardActions.EXPORT, + factory.createMenuItem( + StandardActions.EXPORT_ALL, + new ExportCommand( + ExportCommand.ExportMethod.EXPORT_ALL, + frame, + stateManager, + dialogService, + preferencesService, + entryTypesManager, + abbreviationRepository, + taskExecutor)), + factory.createMenuItem( + StandardActions.EXPORT_SELECTED, + new ExportCommand( + ExportCommand.ExportMethod.EXPORT_SELECTED, + frame, + stateManager, + dialogService, + preferencesService, + entryTypesManager, + abbreviationRepository, + taskExecutor)), + factory.createMenuItem( + StandardActions.SAVE_SELECTED_AS_PLAIN_BIBTEX, + new SaveAction( + SaveAction.SaveMethod.SAVE_SELECTED, + frame, + dialogService, + preferencesService, + stateManager))), + new SeparatorMenuItem(), + factory.createSubMenu( + StandardActions.REMOTE_DB, + factory.createMenuItem( + StandardActions.CONNECT_TO_SHARED_DB, + new ConnectToSharedDatabaseCommand(frame)), + factory.createMenuItem( + StandardActions.PULL_CHANGES_FROM_SHARED_DB, + new PullChangesFromSharedAction(stateManager))), + new SeparatorMenuItem(), + factory.createMenuItem( + StandardActions.SHOW_PREFS, new ShowPreferencesAction(frame, taskExecutor)), + new SeparatorMenuItem(), + factory.createMenuItem(StandardActions.QUIT, new JabRefFrame.CloseAction(frame))); + + edit.getItems() + .addAll( + factory.createMenuItem( + StandardActions.UNDO, + new UndoRedoAction(StandardActions.UNDO, frame, dialogService, stateManager)), + factory.createMenuItem( + StandardActions.REDO, + new UndoRedoAction(StandardActions.REDO, frame, dialogService, stateManager)), + new SeparatorMenuItem(), + factory.createMenuItem( + StandardActions.CUT, new EditAction(StandardActions.CUT, frame, stateManager)), + factory.createMenuItem( + StandardActions.COPY, new EditAction(StandardActions.COPY, frame, stateManager)), + factory.createSubMenu( + StandardActions.COPY_MORE, + factory.createMenuItem( + StandardActions.COPY_TITLE, + new CopyMoreAction( + StandardActions.COPY_TITLE, + dialogService, + stateManager, + clipBoardManager, + preferencesService, + abbreviationRepository)), + factory.createMenuItem( + StandardActions.COPY_KEY, + new CopyMoreAction( + StandardActions.COPY_KEY, + dialogService, + stateManager, + clipBoardManager, + preferencesService, + abbreviationRepository)), + factory.createMenuItem( + StandardActions.COPY_CITE_KEY, + new CopyMoreAction( + StandardActions.COPY_CITE_KEY, + dialogService, + stateManager, + clipBoardManager, + preferencesService, + abbreviationRepository)), + factory.createMenuItem( + StandardActions.COPY_KEY_AND_TITLE, + new CopyMoreAction( + StandardActions.COPY_KEY_AND_TITLE, + dialogService, + stateManager, + clipBoardManager, + preferencesService, + abbreviationRepository)), + factory.createMenuItem( + StandardActions.COPY_KEY_AND_LINK, + new CopyMoreAction( + StandardActions.COPY_KEY_AND_LINK, + dialogService, + stateManager, + clipBoardManager, + preferencesService, + abbreviationRepository)), + factory.createMenuItem( + StandardActions.COPY_CITATION_PREVIEW, + new CopyCitationAction( + CitationStyleOutputFormat.HTML, + dialogService, + stateManager, + clipBoardManager, + taskExecutor, + preferencesService, + abbreviationRepository)), + factory.createMenuItem( + StandardActions.EXPORT_SELECTED_TO_CLIPBOARD, + new ExportToClipboardAction( + dialogService, + stateManager, + clipBoardManager, + taskExecutor, + preferencesService))), + factory.createMenuItem( + StandardActions.PASTE, new EditAction(StandardActions.PASTE, frame, stateManager)), + new SeparatorMenuItem(), + factory.createMenuItem( + StandardActions.REPLACE_ALL, new ReplaceStringAction(frame, stateManager)), + factory.createMenuItem( + StandardActions.GENERATE_CITE_KEYS, + new GenerateCitationKeyAction( + frame, dialogService, stateManager, taskExecutor, preferencesService)), + new SeparatorMenuItem(), + factory.createMenuItem(StandardActions.MANAGE_KEYWORDS, new ManageKeywordsAction(stateManager)), + factory.createMenuItem( + StandardActions.AUTOMATIC_FIELD_EDITOR, + new AutomaticFieldEditorAction(stateManager, dialogService))); SeparatorMenuItem specialFieldsSeparator = new SeparatorMenuItem(); - specialFieldsSeparator.visibleProperty().bind(preferencesService.getSpecialFieldsPreferences().specialFieldsEnabledProperty()); - - edit.getItems().addAll( - specialFieldsSeparator, - // ToDo: SpecialField needs the active BasePanel to mark it as changed. - // Refactor BasePanel, should mark the BibDatabaseContext or the UndoManager as dirty instead! - SpecialFieldMenuItemFactory.createSpecialFieldMenu(SpecialField.RANKING, factory, frame, dialogService, preferencesService, undoManager, stateManager), - SpecialFieldMenuItemFactory.getSpecialFieldSingleItem(SpecialField.RELEVANCE, factory, frame, dialogService, preferencesService, undoManager, stateManager), - SpecialFieldMenuItemFactory.getSpecialFieldSingleItem(SpecialField.QUALITY, factory, frame, dialogService, preferencesService, undoManager, stateManager), - SpecialFieldMenuItemFactory.getSpecialFieldSingleItem(SpecialField.PRINTED, factory, frame, dialogService, preferencesService, undoManager, stateManager), - SpecialFieldMenuItemFactory.createSpecialFieldMenu(SpecialField.PRIORITY, factory, frame, dialogService, preferencesService, undoManager, stateManager), - SpecialFieldMenuItemFactory.createSpecialFieldMenu(SpecialField.READ_STATUS, factory, frame, dialogService, preferencesService, undoManager, stateManager)); + specialFieldsSeparator + .visibleProperty() + .bind(preferencesService.getSpecialFieldsPreferences().specialFieldsEnabledProperty()); + + edit.getItems() + .addAll( + specialFieldsSeparator, + // ToDo: SpecialField needs the active BasePanel to mark it as changed. + // Refactor BasePanel, should mark the BibDatabaseContext or the UndoManager as dirty instead! + SpecialFieldMenuItemFactory.createSpecialFieldMenu( + SpecialField.RANKING, + factory, + frame, + dialogService, + preferencesService, + undoManager, + stateManager), + SpecialFieldMenuItemFactory.getSpecialFieldSingleItem( + SpecialField.RELEVANCE, + factory, + frame, + dialogService, + preferencesService, + undoManager, + stateManager), + SpecialFieldMenuItemFactory.getSpecialFieldSingleItem( + SpecialField.QUALITY, + factory, + frame, + dialogService, + preferencesService, + undoManager, + stateManager), + SpecialFieldMenuItemFactory.getSpecialFieldSingleItem( + SpecialField.PRINTED, + factory, + frame, + dialogService, + preferencesService, + undoManager, + stateManager), + SpecialFieldMenuItemFactory.createSpecialFieldMenu( + SpecialField.PRIORITY, + factory, + frame, + dialogService, + preferencesService, + undoManager, + stateManager), + SpecialFieldMenuItemFactory.createSpecialFieldMenu( + SpecialField.READ_STATUS, + factory, + frame, + dialogService, + preferencesService, + undoManager, + stateManager)); edit.addEventHandler(ActionEvent.ACTION, event -> { - // Work around for mac only issue, where cmd+v on a dialogue triggers the paste action of menu item, resulting in addition of the pasted content in the MainTable. + // Work around for mac only issue, where cmd+v on a dialogue triggers the paste action of menu item, + // resulting in addition of the pasted content in the MainTable. // If the mainscreen is not focused, the actions captured by menu are consumed. if (OS.OS_X && !frame.getMainStage().focusedProperty().get()) { event.consume(); @@ -211,150 +381,304 @@ private void createMenu() { }); // @formatter:off - library.getItems().addAll( - factory.createMenuItem(StandardActions.NEW_ENTRY, new NewEntryAction(frame, dialogService, preferencesService, stateManager)), - factory.createMenuItem(StandardActions.NEW_ENTRY_FROM_PLAIN_TEXT, new ExtractBibtexAction(dialogService, preferencesService, stateManager)), - factory.createMenuItem(StandardActions.DELETE_ENTRY, new EditAction(StandardActions.DELETE_ENTRY, frame, stateManager)), - - new SeparatorMenuItem(), - - factory.createMenuItem(StandardActions.LIBRARY_PROPERTIES, new LibraryPropertiesAction(stateManager)) - ); - - quality.getItems().addAll( - factory.createMenuItem(StandardActions.FIND_DUPLICATES, new DuplicateSearch(frame, dialogService, stateManager, preferencesService, entryTypesManager, taskExecutor)), - factory.createMenuItem(StandardActions.MERGE_ENTRIES, new MergeEntriesAction(dialogService, stateManager, preferencesService)), - factory.createMenuItem(StandardActions.CHECK_INTEGRITY, new IntegrityCheckAction(frame, preferencesService, dialogService, stateManager, taskExecutor, abbreviationRepository)), - factory.createMenuItem(StandardActions.CLEANUP_ENTRIES, new CleanupAction(frame, preferencesService, dialogService, stateManager, taskExecutor)), - - new SeparatorMenuItem(), - - factory.createMenuItem(StandardActions.SET_FILE_LINKS, new AutoLinkFilesAction(dialogService, preferencesService, stateManager, undoManager, taskExecutor)), - - new SeparatorMenuItem(), - - factory.createSubMenu(StandardActions.ABBREVIATE, - factory.createMenuItem(StandardActions.ABBREVIATE_DEFAULT, new AbbreviateAction(StandardActions.ABBREVIATE_DEFAULT, frame, dialogService, stateManager, preferencesService.getJournalAbbreviationPreferences(), abbreviationRepository, taskExecutor)), - factory.createMenuItem(StandardActions.ABBREVIATE_DOTLESS, new AbbreviateAction(StandardActions.ABBREVIATE_DOTLESS, frame, dialogService, stateManager, preferencesService.getJournalAbbreviationPreferences(), abbreviationRepository, taskExecutor)), - factory.createMenuItem(StandardActions.ABBREVIATE_SHORTEST_UNIQUE, new AbbreviateAction(StandardActions.ABBREVIATE_SHORTEST_UNIQUE, frame, dialogService, stateManager, preferencesService.getJournalAbbreviationPreferences(), abbreviationRepository, taskExecutor))), - - factory.createMenuItem(StandardActions.UNABBREVIATE, new AbbreviateAction(StandardActions.UNABBREVIATE, frame, dialogService, stateManager, preferencesService.getJournalAbbreviationPreferences(), abbreviationRepository, taskExecutor)) - ); + library.getItems() + .addAll( + factory.createMenuItem( + StandardActions.NEW_ENTRY, + new NewEntryAction(frame, dialogService, preferencesService, stateManager)), + factory.createMenuItem( + StandardActions.NEW_ENTRY_FROM_PLAIN_TEXT, + new ExtractBibtexAction(dialogService, preferencesService, stateManager)), + factory.createMenuItem( + StandardActions.DELETE_ENTRY, + new EditAction(StandardActions.DELETE_ENTRY, frame, stateManager)), + new SeparatorMenuItem(), + factory.createMenuItem( + StandardActions.LIBRARY_PROPERTIES, new LibraryPropertiesAction(stateManager))); + + quality.getItems() + .addAll( + factory.createMenuItem( + StandardActions.FIND_DUPLICATES, + new DuplicateSearch( + frame, + dialogService, + stateManager, + preferencesService, + entryTypesManager, + taskExecutor)), + factory.createMenuItem( + StandardActions.MERGE_ENTRIES, + new MergeEntriesAction(dialogService, stateManager, preferencesService)), + factory.createMenuItem( + StandardActions.CHECK_INTEGRITY, + new IntegrityCheckAction( + frame, + preferencesService, + dialogService, + stateManager, + taskExecutor, + abbreviationRepository)), + factory.createMenuItem( + StandardActions.CLEANUP_ENTRIES, + new CleanupAction( + frame, preferencesService, dialogService, stateManager, taskExecutor)), + new SeparatorMenuItem(), + factory.createMenuItem( + StandardActions.SET_FILE_LINKS, + new AutoLinkFilesAction( + dialogService, preferencesService, stateManager, undoManager, taskExecutor)), + new SeparatorMenuItem(), + factory.createSubMenu( + StandardActions.ABBREVIATE, + factory.createMenuItem( + StandardActions.ABBREVIATE_DEFAULT, + new AbbreviateAction( + StandardActions.ABBREVIATE_DEFAULT, + frame, + dialogService, + stateManager, + preferencesService.getJournalAbbreviationPreferences(), + abbreviationRepository, + taskExecutor)), + factory.createMenuItem( + StandardActions.ABBREVIATE_DOTLESS, + new AbbreviateAction( + StandardActions.ABBREVIATE_DOTLESS, + frame, + dialogService, + stateManager, + preferencesService.getJournalAbbreviationPreferences(), + abbreviationRepository, + taskExecutor)), + factory.createMenuItem( + StandardActions.ABBREVIATE_SHORTEST_UNIQUE, + new AbbreviateAction( + StandardActions.ABBREVIATE_SHORTEST_UNIQUE, + frame, + dialogService, + stateManager, + preferencesService.getJournalAbbreviationPreferences(), + abbreviationRepository, + taskExecutor))), + factory.createMenuItem( + StandardActions.UNABBREVIATE, + new AbbreviateAction( + StandardActions.UNABBREVIATE, + frame, + dialogService, + stateManager, + preferencesService.getJournalAbbreviationPreferences(), + abbreviationRepository, + taskExecutor))); Menu lookupIdentifiers = factory.createSubMenu(StandardActions.LOOKUP_DOC_IDENTIFIER); for (IdFetcher fetcher : WebFetchers.getIdFetchers(preferencesService.getImportFormatPreferences())) { - LookupIdentifierAction identifierAction = new LookupIdentifierAction<>(frame, fetcher, stateManager, undoManager, taskExecutor); + LookupIdentifierAction identifierAction = + new LookupIdentifierAction<>(frame, fetcher, stateManager, undoManager, taskExecutor); lookupIdentifiers.getItems().add(factory.createMenuItem(identifierAction.getAction(), identifierAction)); } - lookup.getItems().addAll( - lookupIdentifiers, - factory.createMenuItem(StandardActions.DOWNLOAD_FULL_TEXT, new DownloadFullTextAction(dialogService, stateManager, preferencesService, taskExecutor)), - - new SeparatorMenuItem(), - - factory.createMenuItem(StandardActions.FIND_UNLINKED_FILES, new FindUnlinkedFilesAction(dialogService, stateManager)) - ); + lookup.getItems() + .addAll( + lookupIdentifiers, + factory.createMenuItem( + StandardActions.DOWNLOAD_FULL_TEXT, + new DownloadFullTextAction( + dialogService, stateManager, preferencesService, taskExecutor)), + new SeparatorMenuItem(), + factory.createMenuItem( + StandardActions.FIND_UNLINKED_FILES, + new FindUnlinkedFilesAction(dialogService, stateManager))); - final MenuItem pushToApplicationMenuItem = factory.createMenuItem(pushToApplicationCommand.getAction(), pushToApplicationCommand); + final MenuItem pushToApplicationMenuItem = + factory.createMenuItem(pushToApplicationCommand.getAction(), pushToApplicationCommand); pushToApplicationCommand.registerReconfigurable(pushToApplicationMenuItem); - tools.getItems().addAll( - factory.createMenuItem(StandardActions.PARSE_LATEX, new ParseLatexAction(stateManager)), - factory.createMenuItem(StandardActions.NEW_SUB_LIBRARY_FROM_AUX, new NewSubLibraryAction(frame, stateManager)), - - new SeparatorMenuItem(), - - factory.createMenuItem(StandardActions.WRITE_METADATA_TO_PDF, - new WriteMetadataToLinkedPdfsAction(dialogService, preferencesService.getFieldPreferences(), preferencesService.getFilePreferences(), preferencesService.getXmpPreferences(), entryTypesManager, abbreviationRepository, taskExecutor, stateManager)), - factory.createMenuItem(StandardActions.COPY_LINKED_FILES, new CopyFilesAction(dialogService, preferencesService, stateManager, taskExecutor)), - - new SeparatorMenuItem(), - - createSendSubMenu(factory, dialogService, stateManager, preferencesService), - pushToApplicationMenuItem, - - new SeparatorMenuItem(), - - // Systematic Literature Review (SLR) - factory.createMenuItem(StandardActions.START_NEW_STUDY, new StartNewStudyAction(frame, fileUpdateMonitor, taskExecutor, preferencesService, stateManager)), - factory.createMenuItem(StandardActions.EDIT_EXISTING_STUDY, new EditExistingStudyAction(dialogService, stateManager)), - factory.createMenuItem(StandardActions.UPDATE_SEARCH_RESULTS_OF_STUDY, new ExistingStudySearchAction(frame, frame.getOpenDatabaseAction(), dialogService, fileUpdateMonitor, taskExecutor, preferencesService, stateManager)), - - new SeparatorMenuItem(), + tools.getItems() + .addAll( + factory.createMenuItem(StandardActions.PARSE_LATEX, new ParseLatexAction(stateManager)), + factory.createMenuItem( + StandardActions.NEW_SUB_LIBRARY_FROM_AUX, new NewSubLibraryAction(frame, stateManager)), + new SeparatorMenuItem(), + factory.createMenuItem( + StandardActions.WRITE_METADATA_TO_PDF, + new WriteMetadataToLinkedPdfsAction( + dialogService, + preferencesService.getFieldPreferences(), + preferencesService.getFilePreferences(), + preferencesService.getXmpPreferences(), + entryTypesManager, + abbreviationRepository, + taskExecutor, + stateManager)), + factory.createMenuItem( + StandardActions.COPY_LINKED_FILES, + new CopyFilesAction(dialogService, preferencesService, stateManager, taskExecutor)), + new SeparatorMenuItem(), + createSendSubMenu(factory, dialogService, stateManager, preferencesService), + pushToApplicationMenuItem, + new SeparatorMenuItem(), - factory.createMenuItem(StandardActions.REBUILD_FULLTEXT_SEARCH_INDEX, new RebuildFulltextSearchIndexAction(stateManager, frame::getCurrentLibraryTab, dialogService, preferencesService.getFilePreferences(), taskExecutor)) - ); + // Systematic Literature Review (SLR) + factory.createMenuItem( + StandardActions.START_NEW_STUDY, + new StartNewStudyAction( + frame, fileUpdateMonitor, taskExecutor, preferencesService, stateManager)), + factory.createMenuItem( + StandardActions.EDIT_EXISTING_STUDY, + new EditExistingStudyAction(dialogService, stateManager)), + factory.createMenuItem( + StandardActions.UPDATE_SEARCH_RESULTS_OF_STUDY, + new ExistingStudySearchAction( + frame, + frame.getOpenDatabaseAction(), + dialogService, + fileUpdateMonitor, + taskExecutor, + preferencesService, + stateManager)), + new SeparatorMenuItem(), + factory.createMenuItem( + StandardActions.REBUILD_FULLTEXT_SEARCH_INDEX, + new RebuildFulltextSearchIndexAction( + stateManager, + frame::getCurrentLibraryTab, + dialogService, + preferencesService.getFilePreferences(), + taskExecutor))); SidePaneType webSearchPane = SidePaneType.WEB_SEARCH; SidePaneType groupsPane = SidePaneType.GROUPS; SidePaneType openOfficePane = SidePaneType.OPEN_OFFICE; - view.getItems().addAll( - factory.createCheckMenuItem(webSearchPane.getToggleAction(), sidePane.getToggleCommandFor(webSearchPane), sidePane.paneVisibleBinding(webSearchPane)), - factory.createCheckMenuItem(groupsPane.getToggleAction(), sidePane.getToggleCommandFor(groupsPane), sidePane.paneVisibleBinding(groupsPane)), - factory.createCheckMenuItem(openOfficePane.getToggleAction(), sidePane.getToggleCommandFor(openOfficePane), sidePane.paneVisibleBinding(openOfficePane)), - - new SeparatorMenuItem(), - - factory.createMenuItem(StandardActions.NEXT_PREVIEW_STYLE, new PreviewSwitchAction(PreviewSwitchAction.Direction.NEXT, frame, stateManager)), - factory.createMenuItem(StandardActions.PREVIOUS_PREVIEW_STYLE, new PreviewSwitchAction(PreviewSwitchAction.Direction.PREVIOUS, frame, stateManager)), - - new SeparatorMenuItem(), - - factory.createMenuItem(StandardActions.SHOW_PDF_VIEWER, new ShowDocumentViewerAction(stateManager, preferencesService)), - factory.createMenuItem(StandardActions.EDIT_ENTRY, new OpenEntryEditorAction(frame, stateManager)), - factory.createMenuItem(StandardActions.OPEN_CONSOLE, new OpenConsoleAction(stateManager, preferencesService, dialogService)) - ); - - help.getItems().addAll( - factory.createMenuItem(StandardActions.HELP, new HelpAction(HelpFile.CONTENTS, dialogService, preferencesService.getFilePreferences())), - factory.createMenuItem(StandardActions.OPEN_FORUM, new OpenBrowserAction("http://discourse.jabref.org/", dialogService, preferencesService.getFilePreferences())), - - new SeparatorMenuItem(), - - factory.createMenuItem(StandardActions.ERROR_CONSOLE, new ErrorConsoleAction()), - - new SeparatorMenuItem(), - - factory.createMenuItem(StandardActions.DONATE, new OpenBrowserAction("https://donations.jabref.org", dialogService, preferencesService.getFilePreferences())), - factory.createMenuItem(StandardActions.SEARCH_FOR_UPDATES, new SearchForUpdateAction(Globals.BUILD_INFO, preferencesService, dialogService, taskExecutor)), - factory.createSubMenu(StandardActions.WEB_MENU, - factory.createMenuItem(StandardActions.OPEN_WEBPAGE, new OpenBrowserAction("https://jabref.org/", dialogService, preferencesService.getFilePreferences())), - factory.createMenuItem(StandardActions.OPEN_BLOG, new OpenBrowserAction("https://blog.jabref.org/", dialogService, preferencesService.getFilePreferences())), - factory.createMenuItem(StandardActions.OPEN_FACEBOOK, new OpenBrowserAction("https://www.facebook.com/JabRef/", dialogService, preferencesService.getFilePreferences())), - factory.createMenuItem(StandardActions.OPEN_TWITTER, new OpenBrowserAction("https://twitter.com/jabref_org", dialogService, preferencesService.getFilePreferences())), - factory.createMenuItem(StandardActions.OPEN_GITHUB, new OpenBrowserAction("https://github.com/JabRef/jabref", dialogService, preferencesService.getFilePreferences())), - + view.getItems() + .addAll( + factory.createCheckMenuItem( + webSearchPane.getToggleAction(), + sidePane.getToggleCommandFor(webSearchPane), + sidePane.paneVisibleBinding(webSearchPane)), + factory.createCheckMenuItem( + groupsPane.getToggleAction(), + sidePane.getToggleCommandFor(groupsPane), + sidePane.paneVisibleBinding(groupsPane)), + factory.createCheckMenuItem( + openOfficePane.getToggleAction(), + sidePane.getToggleCommandFor(openOfficePane), + sidePane.paneVisibleBinding(openOfficePane)), new SeparatorMenuItem(), - - factory.createMenuItem(StandardActions.OPEN_DEV_VERSION_LINK, new OpenBrowserAction("https://builds.jabref.org/master/", dialogService, preferencesService.getFilePreferences())), - factory.createMenuItem(StandardActions.OPEN_CHANGELOG, new OpenBrowserAction("https://github.com/JabRef/jabref/blob/main/CHANGELOG.md", dialogService, preferencesService.getFilePreferences())) - ), - factory.createMenuItem(StandardActions.ABOUT, new AboutAction()) - ); + factory.createMenuItem( + StandardActions.NEXT_PREVIEW_STYLE, + new PreviewSwitchAction(PreviewSwitchAction.Direction.NEXT, frame, stateManager)), + factory.createMenuItem( + StandardActions.PREVIOUS_PREVIEW_STYLE, + new PreviewSwitchAction(PreviewSwitchAction.Direction.PREVIOUS, frame, stateManager)), + new SeparatorMenuItem(), + factory.createMenuItem( + StandardActions.SHOW_PDF_VIEWER, + new ShowDocumentViewerAction(stateManager, preferencesService)), + factory.createMenuItem( + StandardActions.EDIT_ENTRY, new OpenEntryEditorAction(frame, stateManager)), + factory.createMenuItem( + StandardActions.OPEN_CONSOLE, + new OpenConsoleAction(stateManager, preferencesService, dialogService))); + + help.getItems() + .addAll( + factory.createMenuItem( + StandardActions.HELP, + new HelpAction( + HelpFile.CONTENTS, dialogService, preferencesService.getFilePreferences())), + factory.createMenuItem( + StandardActions.OPEN_FORUM, + new OpenBrowserAction( + "http://discourse.jabref.org/", + dialogService, + preferencesService.getFilePreferences())), + new SeparatorMenuItem(), + factory.createMenuItem(StandardActions.ERROR_CONSOLE, new ErrorConsoleAction()), + new SeparatorMenuItem(), + factory.createMenuItem( + StandardActions.DONATE, + new OpenBrowserAction( + "https://donations.jabref.org", + dialogService, + preferencesService.getFilePreferences())), + factory.createMenuItem( + StandardActions.SEARCH_FOR_UPDATES, + new SearchForUpdateAction( + Globals.BUILD_INFO, preferencesService, dialogService, taskExecutor)), + factory.createSubMenu( + StandardActions.WEB_MENU, + factory.createMenuItem( + StandardActions.OPEN_WEBPAGE, + new OpenBrowserAction( + "https://jabref.org/", + dialogService, + preferencesService.getFilePreferences())), + factory.createMenuItem( + StandardActions.OPEN_BLOG, + new OpenBrowserAction( + "https://blog.jabref.org/", + dialogService, + preferencesService.getFilePreferences())), + factory.createMenuItem( + StandardActions.OPEN_FACEBOOK, + new OpenBrowserAction( + "https://www.facebook.com/JabRef/", + dialogService, + preferencesService.getFilePreferences())), + factory.createMenuItem( + StandardActions.OPEN_TWITTER, + new OpenBrowserAction( + "https://twitter.com/jabref_org", + dialogService, + preferencesService.getFilePreferences())), + factory.createMenuItem( + StandardActions.OPEN_GITHUB, + new OpenBrowserAction( + "https://github.com/JabRef/jabref", + dialogService, + preferencesService.getFilePreferences())), + new SeparatorMenuItem(), + factory.createMenuItem( + StandardActions.OPEN_DEV_VERSION_LINK, + new OpenBrowserAction( + "https://builds.jabref.org/master/", + dialogService, + preferencesService.getFilePreferences())), + factory.createMenuItem( + StandardActions.OPEN_CHANGELOG, + new OpenBrowserAction( + "https://github.com/JabRef/jabref/blob/main/CHANGELOG.md", + dialogService, + preferencesService.getFilePreferences()))), + factory.createMenuItem(StandardActions.ABOUT, new AboutAction())); // @formatter:on getStyleClass().add("mainMenu"); - getMenus().addAll( - file, - edit, - library, - quality, - lookup, - tools, - view, - help); + getMenus().addAll(file, edit, library, quality, lookup, tools, view, help); setUseSystemMenuBar(true); } - private Menu createSendSubMenu(ActionFactory factory, - DialogService dialogService, - StateManager stateManager, - PreferencesService preferencesService) { + private Menu createSendSubMenu( + ActionFactory factory, + DialogService dialogService, + StateManager stateManager, + PreferencesService preferencesService) { Menu sendMenu = factory.createMenu(StandardActions.SEND); - sendMenu.getItems().addAll( - factory.createMenuItem(StandardActions.SEND_AS_EMAIL, new SendAsStandardEmailAction(dialogService, preferencesService, stateManager, entryTypesManager, taskExecutor)), - factory.createMenuItem(StandardActions.SEND_TO_KINDLE, new SendAsKindleEmailAction(dialogService, preferencesService, stateManager, taskExecutor)) - ); + sendMenu.getItems() + .addAll( + factory.createMenuItem( + StandardActions.SEND_AS_EMAIL, + new SendAsStandardEmailAction( + dialogService, + preferencesService, + stateManager, + entryTypesManager, + taskExecutor)), + factory.createMenuItem( + StandardActions.SEND_TO_KINDLE, + new SendAsKindleEmailAction( + dialogService, preferencesService, stateManager, taskExecutor))); return sendMenu; } diff --git a/src/main/java/org/jabref/gui/MainToolBar.java b/src/main/java/org/jabref/gui/MainToolBar.java index 1e89db1b724..87be2fa147e 100644 --- a/src/main/java/org/jabref/gui/MainToolBar.java +++ b/src/main/java/org/jabref/gui/MainToolBar.java @@ -58,16 +58,17 @@ public class MainToolBar extends ToolBar { private PopOver entryFromIdPopOver; private PopOver progressViewPopOver; - public MainToolBar(JabRefFrame frame, - PushToApplicationCommand pushToApplicationCommand, - GlobalSearchBar globalSearchBar, - DialogService dialogService, - StateManager stateManager, - PreferencesService preferencesService, - FileUpdateMonitor fileUpdateMonitor, - TaskExecutor taskExecutor, - BibEntryTypesManager entryTypesManager, - CountingUndoManager undoManager) { + public MainToolBar( + JabRefFrame frame, + PushToApplicationCommand pushToApplicationCommand, + GlobalSearchBar globalSearchBar, + DialogService dialogService, + StateManager stateManager, + PreferencesService preferencesService, + FileUpdateMonitor fileUpdateMonitor, + TaskExecutor taskExecutor, + BibEntryTypesManager entryTypesManager, + CountingUndoManager undoManager) { this.frame = frame; this.pushToApplicationCommand = pushToApplicationCommand; this.globalSearchBar = globalSearchBar; @@ -88,55 +89,94 @@ private void createToolBar() { final Region leftSpacer = new Region(); final Region rightSpacer = new Region(); - final Button pushToApplicationButton = factory.createIconButton(pushToApplicationCommand.getAction(), pushToApplicationCommand); + final Button pushToApplicationButton = + factory.createIconButton(pushToApplicationCommand.getAction(), pushToApplicationCommand); pushToApplicationCommand.registerReconfigurable(pushToApplicationButton); // Setup Toolbar - getItems().addAll( - new HBox( - factory.createIconButton(StandardActions.NEW_LIBRARY, new NewDatabaseAction(frame, preferencesService)), - factory.createIconButton(StandardActions.OPEN_LIBRARY, new OpenDatabaseAction(frame, preferencesService, dialogService, stateManager, fileUpdateMonitor, entryTypesManager, undoManager, taskExecutor)), - factory.createIconButton(StandardActions.SAVE_LIBRARY, new SaveAction(SaveAction.SaveMethod.SAVE, frame, dialogService, preferencesService, stateManager))), - - leftSpacer, - - globalSearchBar, - - rightSpacer, - - new HBox( - factory.createIconButton(StandardActions.NEW_ARTICLE, new NewEntryAction(frame, StandardEntryType.Article, dialogService, preferencesService, stateManager)), - factory.createIconButton(StandardActions.NEW_ENTRY, new NewEntryAction(frame, dialogService, preferencesService, stateManager)), - createNewEntryFromIdButton(), - factory.createIconButton(StandardActions.NEW_ENTRY_FROM_PLAIN_TEXT, new ExtractBibtexAction(dialogService, preferencesService, stateManager)), - factory.createIconButton(StandardActions.DELETE_ENTRY, new EditAction(StandardActions.DELETE_ENTRY, frame, stateManager))), - - new Separator(Orientation.VERTICAL), - - new HBox( - factory.createIconButton(StandardActions.UNDO, new UndoRedoAction(StandardActions.UNDO, frame, dialogService, stateManager)), - factory.createIconButton(StandardActions.REDO, new UndoRedoAction(StandardActions.REDO, frame, dialogService, stateManager)), - factory.createIconButton(StandardActions.CUT, new EditAction(StandardActions.CUT, frame, stateManager)), - factory.createIconButton(StandardActions.COPY, new EditAction(StandardActions.COPY, frame, stateManager)), - factory.createIconButton(StandardActions.PASTE, new EditAction(StandardActions.PASTE, frame, stateManager))), - - new Separator(Orientation.VERTICAL), - - new HBox( - pushToApplicationButton, - factory.createIconButton(StandardActions.GENERATE_CITE_KEYS, new GenerateCitationKeyAction(frame, dialogService, stateManager, taskExecutor, preferencesService)), - factory.createIconButton(StandardActions.CLEANUP_ENTRIES, new CleanupAction(frame, preferencesService, dialogService, stateManager, taskExecutor))), - - new Separator(Orientation.VERTICAL), - - new HBox( - createTaskIndicator()), - - new Separator(Orientation.VERTICAL), - - new HBox( - factory.createIconButton(StandardActions.OPEN_GITHUB, new OpenBrowserAction("https://github.com/JabRef/jabref", dialogService, preferencesService.getFilePreferences())))); + getItems() + .addAll( + new HBox( + factory.createIconButton( + StandardActions.NEW_LIBRARY, new NewDatabaseAction(frame, preferencesService)), + factory.createIconButton( + StandardActions.OPEN_LIBRARY, + new OpenDatabaseAction( + frame, + preferencesService, + dialogService, + stateManager, + fileUpdateMonitor, + entryTypesManager, + undoManager, + taskExecutor)), + factory.createIconButton( + StandardActions.SAVE_LIBRARY, + new SaveAction( + SaveAction.SaveMethod.SAVE, + frame, + dialogService, + preferencesService, + stateManager))), + leftSpacer, + globalSearchBar, + rightSpacer, + new HBox( + factory.createIconButton( + StandardActions.NEW_ARTICLE, + new NewEntryAction( + frame, + StandardEntryType.Article, + dialogService, + preferencesService, + stateManager)), + factory.createIconButton( + StandardActions.NEW_ENTRY, + new NewEntryAction(frame, dialogService, preferencesService, stateManager)), + createNewEntryFromIdButton(), + factory.createIconButton( + StandardActions.NEW_ENTRY_FROM_PLAIN_TEXT, + new ExtractBibtexAction(dialogService, preferencesService, stateManager)), + factory.createIconButton( + StandardActions.DELETE_ENTRY, + new EditAction(StandardActions.DELETE_ENTRY, frame, stateManager))), + new Separator(Orientation.VERTICAL), + new HBox( + factory.createIconButton( + StandardActions.UNDO, + new UndoRedoAction(StandardActions.UNDO, frame, dialogService, stateManager)), + factory.createIconButton( + StandardActions.REDO, + new UndoRedoAction(StandardActions.REDO, frame, dialogService, stateManager)), + factory.createIconButton( + StandardActions.CUT, new EditAction(StandardActions.CUT, frame, stateManager)), + factory.createIconButton( + StandardActions.COPY, + new EditAction(StandardActions.COPY, frame, stateManager)), + factory.createIconButton( + StandardActions.PASTE, + new EditAction(StandardActions.PASTE, frame, stateManager))), + new Separator(Orientation.VERTICAL), + new HBox( + pushToApplicationButton, + factory.createIconButton( + StandardActions.GENERATE_CITE_KEYS, + new GenerateCitationKeyAction( + frame, dialogService, stateManager, taskExecutor, preferencesService)), + factory.createIconButton( + StandardActions.CLEANUP_ENTRIES, + new CleanupAction( + frame, preferencesService, dialogService, stateManager, taskExecutor))), + new Separator(Orientation.VERTICAL), + new HBox(createTaskIndicator()), + new Separator(Orientation.VERTICAL), + new HBox(factory.createIconButton( + StandardActions.OPEN_GITHUB, + new OpenBrowserAction( + "https://github.com/JabRef/jabref", + dialogService, + preferencesService.getFilePreferences())))); leftSpacer.setPrefWidth(50); leftSpacer.setMinWidth(Region.USE_PREF_SIZE); @@ -153,9 +193,12 @@ Button createNewEntryFromIdButton() { newEntryFromIdButton.setGraphic(IconTheme.JabRefIcons.IMPORT.getGraphicNode()); newEntryFromIdButton.getStyleClass().setAll("icon-button"); newEntryFromIdButton.setFocusTraversable(false); - newEntryFromIdButton.disableProperty().bind(ActionHelper.needsDatabase(stateManager).not()); + newEntryFromIdButton + .disableProperty() + .bind(ActionHelper.needsDatabase(stateManager).not()); newEntryFromIdButton.setOnMouseClicked(event -> { - GenerateEntryFromIdDialog entryFromId = new GenerateEntryFromIdDialog(frame.getCurrentLibraryTab(), dialogService, preferencesService, taskExecutor, stateManager); + GenerateEntryFromIdDialog entryFromId = new GenerateEntryFromIdDialog( + frame.getCurrentLibraryTab(), dialogService, preferencesService, taskExecutor, stateManager); if (entryFromIdPopOver == null) { entryFromIdPopOver = new PopOver(entryFromId.getDialogPane()); diff --git a/src/main/java/org/jabref/gui/OpenConsoleAction.java b/src/main/java/org/jabref/gui/OpenConsoleAction.java index acada1d5629..c19af20a8a3 100644 --- a/src/main/java/org/jabref/gui/OpenConsoleAction.java +++ b/src/main/java/org/jabref/gui/OpenConsoleAction.java @@ -27,7 +27,11 @@ public class OpenConsoleAction extends SimpleCommand { * {@link #OpenConsoleAction(StateManager, PreferencesService)} if not supplying * another database. */ - public OpenConsoleAction(Supplier databaseContext, StateManager stateManager, PreferencesService preferencesService, DialogService dialogService) { + public OpenConsoleAction( + Supplier databaseContext, + StateManager stateManager, + PreferencesService preferencesService, + DialogService dialogService) { this.databaseContext = databaseContext; this.stateManager = stateManager; this.preferencesService = preferencesService; @@ -39,18 +43,22 @@ public OpenConsoleAction(Supplier databaseContext, StateMana /** * Using this constructor will result in executing the command on the active database. */ - public OpenConsoleAction(StateManager stateManager, PreferencesService preferencesService, DialogService dialogService) { + public OpenConsoleAction( + StateManager stateManager, PreferencesService preferencesService, DialogService dialogService) { this(() -> null, stateManager, preferencesService, dialogService); } @Override public void execute() { - Optional.ofNullable(databaseContext.get()).or(stateManager::getActiveDatabase).flatMap(BibDatabaseContext::getDatabasePath).ifPresent(path -> { - try { - JabRefDesktop.openConsole(path, preferencesService, dialogService); - } catch (IOException e) { - LOGGER.info("Could not open console", e); - } - }); + Optional.ofNullable(databaseContext.get()) + .or(stateManager::getActiveDatabase) + .flatMap(BibDatabaseContext::getDatabasePath) + .ifPresent(path -> { + try { + JabRefDesktop.openConsole(path, preferencesService, dialogService); + } catch (IOException e) { + LOGGER.info("Could not open console", e); + } + }); } } diff --git a/src/main/java/org/jabref/gui/SendAsEMailAction.java b/src/main/java/org/jabref/gui/SendAsEMailAction.java index fad6fe8aa7c..7d64c68fae1 100644 --- a/src/main/java/org/jabref/gui/SendAsEMailAction.java +++ b/src/main/java/org/jabref/gui/SendAsEMailAction.java @@ -41,10 +41,11 @@ public abstract class SendAsEMailAction extends SimpleCommand { private final StateManager stateManager; private final TaskExecutor taskExecutor; - public SendAsEMailAction(DialogService dialogService, - PreferencesService preferencesService, - StateManager stateManager, - TaskExecutor taskExecutor) { + public SendAsEMailAction( + DialogService dialogService, + PreferencesService preferencesService, + StateManager stateManager, + TaskExecutor taskExecutor) { this.dialogService = dialogService; this.preferencesService = preferencesService; this.stateManager = stateManager; @@ -54,13 +55,13 @@ public SendAsEMailAction(DialogService dialogService, @Override public void execute() { BackgroundTask.wrap(this::sendEmail) - .onSuccess(dialogService::notify) - .onFailure(e -> { - String message = Localization.lang("Error creating email"); - LOGGER.warn(message, e); - dialogService.notify(message); - }) - .executeWith(taskExecutor); + .onSuccess(dialogService::notify) + .onFailure(e -> { + String message = Localization.lang("Error creating email"); + LOGGER.warn(message, e); + dialogService.notify(message); + }) + .executeWith(taskExecutor); } private String sendEmail() throws Exception { @@ -100,17 +101,22 @@ private URI getUriMailTo(List entries) throws URISyntaxException { private List getAttachments(List entries) { // open folders is needed to indirectly support email programs, which cannot handle // the unofficial "mailto:attachment" property - boolean openFolders = preferencesService.getExternalApplicationsPreferences().shouldAutoOpenEmailAttachmentsFolder(); + boolean openFolders = + preferencesService.getExternalApplicationsPreferences().shouldAutoOpenEmailAttachmentsFolder(); BibDatabaseContext databaseContext = stateManager.getActiveDatabase().get(); - List fileList = FileUtil.getListOfLinkedFiles(entries, databaseContext.getFileDirectories(preferencesService.getFilePreferences())); + List fileList = FileUtil.getListOfLinkedFiles( + entries, databaseContext.getFileDirectories(preferencesService.getFilePreferences())); List attachments = new ArrayList<>(); for (Path path : fileList) { attachments.add(path.toAbsolutePath().toString()); if (openFolders) { try { - JabRefDesktop.openFolderAndSelectFile(path.toAbsolutePath(), preferencesService.getExternalApplicationsPreferences(), dialogService); + JabRefDesktop.openFolderAndSelectFile( + path.toAbsolutePath(), + preferencesService.getExternalApplicationsPreferences(), + dialogService); } catch (IOException e) { LOGGER.debug("Cannot open file", e); } diff --git a/src/main/java/org/jabref/gui/SendAsKindleEmailAction.java b/src/main/java/org/jabref/gui/SendAsKindleEmailAction.java index f96944a4fa2..f16931c2c0d 100644 --- a/src/main/java/org/jabref/gui/SendAsKindleEmailAction.java +++ b/src/main/java/org/jabref/gui/SendAsKindleEmailAction.java @@ -12,10 +12,15 @@ public class SendAsKindleEmailAction extends SendAsEMailAction { private final PreferencesService preferencesService; - public SendAsKindleEmailAction(DialogService dialogService, PreferencesService preferencesService, StateManager stateManager, TaskExecutor taskExecutor) { + public SendAsKindleEmailAction( + DialogService dialogService, + PreferencesService preferencesService, + StateManager stateManager, + TaskExecutor taskExecutor) { super(dialogService, preferencesService, stateManager, taskExecutor); this.preferencesService = preferencesService; - this.executable.bind(ActionHelper.needsEntriesSelected(stateManager).and(ActionHelper.hasLinkedFileForSelectedEntries(stateManager))); + this.executable.bind(ActionHelper.needsEntriesSelected(stateManager) + .and(ActionHelper.hasLinkedFileForSelectedEntries(stateManager))); } @Override diff --git a/src/main/java/org/jabref/gui/SendAsStandardEmailAction.java b/src/main/java/org/jabref/gui/SendAsStandardEmailAction.java index a60fb256820..c6637fa94ae 100644 --- a/src/main/java/org/jabref/gui/SendAsStandardEmailAction.java +++ b/src/main/java/org/jabref/gui/SendAsStandardEmailAction.java @@ -28,11 +28,12 @@ public class SendAsStandardEmailAction extends SendAsEMailAction { private final StateManager stateManager; private final BibEntryTypesManager entryTypesManager; - public SendAsStandardEmailAction(DialogService dialogService, - PreferencesService preferencesService, - StateManager stateManager, - BibEntryTypesManager entryTypesManager, - TaskExecutor taskExecutor) { + public SendAsStandardEmailAction( + DialogService dialogService, + PreferencesService preferencesService, + StateManager stateManager, + BibEntryTypesManager entryTypesManager, + TaskExecutor taskExecutor) { super(dialogService, preferencesService, stateManager, taskExecutor); this.preferencesService = preferencesService; this.stateManager = stateManager; @@ -57,7 +58,8 @@ protected String getBody() { StringWriter rawEntries = new StringWriter(); BibWriter bibWriter = new BibWriter(rawEntries, OS.NEWLINE); - BibEntryWriter bibtexEntryWriter = new BibEntryWriter(new FieldWriter(preferencesService.getFieldPreferences()), entryTypesManager); + BibEntryWriter bibtexEntryWriter = + new BibEntryWriter(new FieldWriter(preferencesService.getFieldPreferences()), entryTypesManager); for (BibEntry entry : entries) { try { diff --git a/src/main/java/org/jabref/gui/StateManager.java b/src/main/java/org/jabref/gui/StateManager.java index f1ff42c5785..2c0694b8f21 100644 --- a/src/main/java/org/jabref/gui/StateManager.java +++ b/src/main/java/org/jabref/gui/StateManager.java @@ -56,20 +56,36 @@ public class StateManager { private final CustomLocalDragboard localDragboard = new CustomLocalDragboard(); private final ObservableList openDatabases = FXCollections.observableArrayList(); private final OptionalObjectProperty activeDatabase = OptionalObjectProperty.empty(); - private final ReadOnlyListWrapper activeGroups = new ReadOnlyListWrapper<>(FXCollections.observableArrayList()); + private final ReadOnlyListWrapper activeGroups = + new ReadOnlyListWrapper<>(FXCollections.observableArrayList()); private final ObservableList selectedEntries = FXCollections.observableArrayList(); - private final ObservableMap> selectedGroups = FXCollections.observableHashMap(); + private final ObservableMap> selectedGroups = + FXCollections.observableHashMap(); private final OptionalObjectProperty activeSearchQuery = OptionalObjectProperty.empty(); - private final ObservableMap searchResultMap = FXCollections.observableHashMap(); + private final ObservableMap searchResultMap = + FXCollections.observableHashMap(); private final OptionalObjectProperty focusOwner = OptionalObjectProperty.empty(); - private final ObservableList, Task>> backgroundTasks = FXCollections.observableArrayList(task -> new Observable[]{task.getValue().progressProperty(), task.getValue().runningProperty()}); - private final EasyBinding anyTaskRunning = EasyBind.reduce(backgroundTasks, tasks -> tasks.map(Pair::getValue).anyMatch(Task::isRunning)); - private final EasyBinding anyTasksThatWillNotBeRecoveredRunning = EasyBind.reduce(backgroundTasks, tasks -> tasks.anyMatch(task -> !task.getKey().willBeRecoveredAutomatically() && task.getValue().isRunning())); - private final EasyBinding tasksProgress = EasyBind.reduce(backgroundTasks, tasks -> tasks.map(Pair::getValue).filter(Task::isRunning).mapToDouble(Task::getProgress).average().orElse(1)); + private final ObservableList, Task>> backgroundTasks = + FXCollections.observableArrayList(task -> new Observable[] { + task.getValue().progressProperty(), task.getValue().runningProperty() + }); + private final EasyBinding anyTaskRunning = + EasyBind.reduce(backgroundTasks, tasks -> tasks.map(Pair::getValue).anyMatch(Task::isRunning)); + private final EasyBinding anyTasksThatWillNotBeRecoveredRunning = EasyBind.reduce( + backgroundTasks, + tasks -> tasks.anyMatch(task -> !task.getKey().willBeRecoveredAutomatically() + && task.getValue().isRunning())); + private final EasyBinding tasksProgress = + EasyBind.reduce(backgroundTasks, tasks -> tasks.map(Pair::getValue) + .filter(Task::isRunning) + .mapToDouble(Task::getProgress) + .average() + .orElse(1)); private final ObservableMap dialogWindowStates = FXCollections.observableHashMap(); private final ObservableList visibleSidePanes = FXCollections.observableArrayList(); - private final ObjectProperty lastAutomaticFieldEditorEdit = new SimpleObjectProperty<>(); + private final ObjectProperty lastAutomaticFieldEditorEdit = + new SimpleObjectProperty<>(); private final ObservableList searchHistory = FXCollections.observableArrayList(); @@ -102,7 +118,8 @@ public void setActiveSearchResultSize(BibDatabaseContext database, IntegerProper } public IntegerProperty getSearchResultSize() { - return searchResultMap.getOrDefault(activeDatabase.getValue().orElse(new BibDatabaseContext()), new SimpleIntegerProperty(0)); + return searchResultMap.getOrDefault( + activeDatabase.getValue().orElse(new BibDatabaseContext()), new SimpleIntegerProperty(0)); } public ReadOnlyListProperty activeGroupProperty() { @@ -146,7 +163,7 @@ public void setActiveDatabase(BibDatabaseContext database) { public List getEntriesInCurrentDatabase() { return OptionalUtil.flatMap(activeDatabase.get(), BibDatabaseContext::getEntries) - .collect(Collectors.toList()); + .collect(Collectors.toList()); } public void clearSearchQuery() { @@ -208,10 +225,9 @@ public void setLastAutomaticFieldEditorEdit(LastAutomaticFieldEditorEdit automat public List collectAllDatabasePaths() { List list = new ArrayList<>(); getOpenDatabases().stream() - .map(BibDatabaseContext::getDatabasePath) - .forEachOrdered(pathOptional -> pathOptional.ifPresentOrElse( - path -> list.add(path.toAbsolutePath().toString()), - () -> list.add(""))); + .map(BibDatabaseContext::getDatabasePath) + .forEachOrdered(pathOptional -> pathOptional.ifPresentOrElse( + path -> list.add(path.toAbsolutePath().toString()), () -> list.add(""))); return list; } diff --git a/src/main/java/org/jabref/gui/Telemetry.java b/src/main/java/org/jabref/gui/Telemetry.java index 6bb0a10195b..94bbc27c02d 100644 --- a/src/main/java/org/jabref/gui/Telemetry.java +++ b/src/main/java/org/jabref/gui/Telemetry.java @@ -6,18 +6,15 @@ import org.jabref.preferences.TelemetryPreferences; public class Telemetry { - private Telemetry() { - } + private Telemetry() {} public static Optional getTelemetryClient() { return Optional.empty(); } - private static void start(TelemetryPreferences telemetryPreferences, BuildInfo buildInfo) { - } + private static void start(TelemetryPreferences telemetryPreferences, BuildInfo buildInfo) {} public static void shutdown() { - getTelemetryClient().ifPresent(client -> { - }); + getTelemetryClient().ifPresent(client -> {}); } } diff --git a/src/main/java/org/jabref/gui/TelemetryClient.java b/src/main/java/org/jabref/gui/TelemetryClient.java index 077010f5ef6..7a9457a190f 100644 --- a/src/main/java/org/jabref/gui/TelemetryClient.java +++ b/src/main/java/org/jabref/gui/TelemetryClient.java @@ -3,9 +3,7 @@ import java.util.Map; public class TelemetryClient { - public void trackEvent(String actionName) { - } + public void trackEvent(String actionName) {} - public void trackEvent(String actionName, Map source, Map of) { - } + public void trackEvent(String actionName, Map source, Map of) {} } diff --git a/src/main/java/org/jabref/gui/UpdateTimestampListener.java b/src/main/java/org/jabref/gui/UpdateTimestampListener.java index 2ccc4a72d3c..fa06315d0dd 100644 --- a/src/main/java/org/jabref/gui/UpdateTimestampListener.java +++ b/src/main/java/org/jabref/gui/UpdateTimestampListener.java @@ -19,11 +19,15 @@ class UpdateTimestampListener { @Subscribe public void listen(EntryChangedEvent event) { - // The event source needs to be checked, since the timestamp is always updated on every change. The cleanup formatter is an exception to that behaviour, + // The event source needs to be checked, since the timestamp is always updated on every change. The cleanup + // formatter is an exception to that behaviour, // since it just should move the contents from the timestamp field to modificationdate or creationdate. - if (preferencesService.getTimestampPreferences().shouldAddModificationDate() && event.getEntriesEventSource() != EntriesEventSource.CLEANUP_TIMESTAMP) { - event.getBibEntry().setField(StandardField.MODIFICATIONDATE, - preferencesService.getTimestampPreferences().now()); + if (preferencesService.getTimestampPreferences().shouldAddModificationDate() + && event.getEntriesEventSource() != EntriesEventSource.CLEANUP_TIMESTAMP) { + event.getBibEntry() + .setField( + StandardField.MODIFICATIONDATE, + preferencesService.getTimestampPreferences().now()); } } } diff --git a/src/main/java/org/jabref/gui/WaitForSaveFinishedDialog.java b/src/main/java/org/jabref/gui/WaitForSaveFinishedDialog.java index 43f784669de..c8cd7a9e863 100644 --- a/src/main/java/org/jabref/gui/WaitForSaveFinishedDialog.java +++ b/src/main/java/org/jabref/gui/WaitForSaveFinishedDialog.java @@ -36,8 +36,7 @@ protected Void call() throws Exception { dialogService.showProgressDialog( Localization.lang("Please wait..."), Localization.lang("Waiting for save operation to finish") + "...", - waitForSaveFinished - ); + waitForSaveFinished); } } } diff --git a/src/main/java/org/jabref/gui/actions/ActionFactory.java b/src/main/java/org/jabref/gui/actions/ActionFactory.java index 3deb6d068ef..e270b0d346c 100644 --- a/src/main/java/org/jabref/gui/actions/ActionFactory.java +++ b/src/main/java/org/jabref/gui/actions/ActionFactory.java @@ -58,7 +58,8 @@ private static void setGraphic(MenuItem node, Action action) { * should not be used since it's marked as deprecated. */ private static Label getAssociatedNode(MenuItem menuItem) { - ContextMenuContent.MenuItemContainer container = (ContextMenuContent.MenuItemContainer) menuItem.getStyleableNode(); + ContextMenuContent.MenuItemContainer container = + (ContextMenuContent.MenuItemContainer) menuItem.getStyleableNode(); if (container == null) { return null; @@ -68,7 +69,10 @@ private static Label getAssociatedNode(MenuItem menuItem) { Method getLabel = ContextMenuContent.MenuItemContainer.class.getDeclaredMethod("getLabel"); getLabel.setAccessible(true); return (Label) getLabel.invoke(container); - } catch (InaccessibleObjectException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) { + } catch (InaccessibleObjectException + | IllegalAccessException + | InvocationTargetException + | NoSuchMethodException e) { LOGGER.warn("Could not get label of menu item", e); } } @@ -76,25 +80,23 @@ private static Label getAssociatedNode(MenuItem menuItem) { } public MenuItem configureMenuItem(Action action, Command command, MenuItem menuItem) { - ActionUtils.configureMenuItem(new JabRefAction(action, command, keyBindingRepository, Sources.FromMenu), menuItem); + ActionUtils.configureMenuItem( + new JabRefAction(action, command, keyBindingRepository, Sources.FromMenu), menuItem); setGraphic(menuItem, action); // Show tooltips if (command instanceof SimpleCommand simpleCommand) { - EasyBind.subscribe( - simpleCommand.statusMessageProperty(), - message -> { - Label label = getAssociatedNode(menuItem); - if (label != null) { - label.setMouseTransparent(false); - if (StringUtil.isBlank(message)) { - label.setTooltip(null); - } else { - label.setTooltip(new Tooltip(message)); - } - } + EasyBind.subscribe(simpleCommand.statusMessageProperty(), message -> { + Label label = getAssociatedNode(menuItem); + if (label != null) { + label.setMouseTransparent(false); + if (StringUtil.isBlank(message)) { + label.setTooltip(null); + } else { + label.setTooltip(new Tooltip(message)); } - ); + } + }); } return menuItem; @@ -107,7 +109,8 @@ public MenuItem createMenuItem(Action action, Command command) { } public CheckMenuItem createCheckMenuItem(Action action, Command command, boolean selected) { - CheckMenuItem checkMenuItem = ActionUtils.createCheckMenuItem(new JabRefAction(action, command, keyBindingRepository, Sources.FromMenu)); + CheckMenuItem checkMenuItem = ActionUtils.createCheckMenuItem( + new JabRefAction(action, command, keyBindingRepository, Sources.FromMenu)); checkMenuItem.setSelected(selected); setGraphic(checkMenuItem, action); @@ -115,7 +118,8 @@ public CheckMenuItem createCheckMenuItem(Action action, Command command, boolean } public CheckMenuItem createCheckMenuItem(Action action, Command command, BooleanExpression selectedBinding) { - CheckMenuItem checkMenuItem = ActionUtils.createCheckMenuItem(new JabRefAction(action, command, keyBindingRepository, Sources.FromMenu)); + CheckMenuItem checkMenuItem = ActionUtils.createCheckMenuItem( + new JabRefAction(action, command, keyBindingRepository, Sources.FromMenu)); EasyBind.subscribe(selectedBinding, checkMenuItem::setSelected); setGraphic(checkMenuItem, action); @@ -137,7 +141,9 @@ public Menu createSubMenu(Action action, MenuItem... children) { } public Button createIconButton(Action action, Command command) { - Button button = ActionUtils.createButton(new JabRefAction(action, command, keyBindingRepository, Sources.FromButton), ActionUtils.ActionTextBehavior.HIDE); + Button button = ActionUtils.createButton( + new JabRefAction(action, command, keyBindingRepository, Sources.FromButton), + ActionUtils.ActionTextBehavior.HIDE); button.getStyleClass().setAll("icon-button"); diff --git a/src/main/java/org/jabref/gui/actions/ActionHelper.java b/src/main/java/org/jabref/gui/actions/ActionHelper.java index e82784a4782..dd4fe511705 100644 --- a/src/main/java/org/jabref/gui/actions/ActionHelper.java +++ b/src/main/java/org/jabref/gui/actions/ActionHelper.java @@ -30,12 +30,16 @@ public static BooleanExpression needsDatabase(StateManager stateManager) { } public static BooleanExpression needsSharedDatabase(StateManager stateManager) { - EasyBinding binding = EasyBind.map(stateManager.activeDatabaseProperty(), context -> context.filter(c -> c.getLocation() == DatabaseLocation.SHARED).isPresent()); + EasyBinding binding = EasyBind.map(stateManager.activeDatabaseProperty(), context -> context.filter( + c -> c.getLocation() == DatabaseLocation.SHARED) + .isPresent()); return BooleanExpression.booleanExpression(binding); } public static BooleanExpression needsStudyDatabase(StateManager stateManager) { - EasyBinding binding = EasyBind.map(stateManager.activeDatabaseProperty(), context -> context.filter(BibDatabaseContext::isStudy).isPresent()); + EasyBinding binding = EasyBind.map( + stateManager.activeDatabaseProperty(), + context -> context.filter(BibDatabaseContext::isStudy).isPresent()); return BooleanExpression.booleanExpression(binding); } @@ -44,8 +48,8 @@ public static BooleanExpression needsEntriesSelected(StateManager stateManager) } public static BooleanExpression needsEntriesSelected(int numberOfEntries, StateManager stateManager) { - return Bindings.createBooleanBinding(() -> stateManager.getSelectedEntries().size() == numberOfEntries, - stateManager.getSelectedEntries()); + return Bindings.createBooleanBinding( + () -> stateManager.getSelectedEntries().size() == numberOfEntries, stateManager.getSelectedEntries()); } public static BooleanExpression isFieldSetForSelectedEntry(Field field, StateManager stateManager) { @@ -55,32 +59,38 @@ public static BooleanExpression isFieldSetForSelectedEntry(Field field, StateMan public static BooleanExpression isAnyFieldSetForSelectedEntry(List fields, StateManager stateManager) { ObservableList selectedEntries = stateManager.getSelectedEntries(); Binding fieldsAreSet = EasyBind.valueAt(selectedEntries, 0) - .mapObservable(entry -> Bindings.createBooleanBinding(() -> { - return entry.getFields().stream().anyMatch(fields::contains); - }, entry.getFieldsObservable())) - .orElseOpt(false); + .mapObservable(entry -> Bindings.createBooleanBinding( + () -> { + return entry.getFields().stream().anyMatch(fields::contains); + }, + entry.getFieldsObservable())) + .orElseOpt(false); return BooleanExpression.booleanExpression(fieldsAreSet); } - public static BooleanExpression isFilePresentForSelectedEntry(StateManager stateManager, PreferencesService preferencesService) { + public static BooleanExpression isFilePresentForSelectedEntry( + StateManager stateManager, PreferencesService preferencesService) { ObservableList selectedEntries = stateManager.getSelectedEntries(); - Binding fileIsPresent = EasyBind.valueAt(selectedEntries, 0).mapOpt(entry -> { - List files = entry.getFiles(); - - if ((!entry.getFiles().isEmpty()) && stateManager.getActiveDatabase().isPresent()) { - if (files.get(0).isOnlineLink()) { - return true; - } - - Optional filename = FileUtil.find( - stateManager.getActiveDatabase().get(), - files.get(0).getLink(), - preferencesService.getFilePreferences()); - return filename.isPresent(); - } else { - return false; - } - }).orElseOpt(false); + Binding fileIsPresent = EasyBind.valueAt(selectedEntries, 0) + .mapOpt(entry -> { + List files = entry.getFiles(); + + if ((!entry.getFiles().isEmpty()) + && stateManager.getActiveDatabase().isPresent()) { + if (files.get(0).isOnlineLink()) { + return true; + } + + Optional filename = FileUtil.find( + stateManager.getActiveDatabase().get(), + files.get(0).getLink(), + preferencesService.getFilePreferences()); + return filename.isPresent(); + } else { + return false; + } + }) + .orElseOpt(false); return BooleanExpression.booleanExpression(fileIsPresent); } @@ -94,7 +104,8 @@ public static BooleanExpression isFilePresentForSelectedEntry(StateManager state * @return a boolean binding */ public static BooleanExpression hasLinkedFileForSelectedEntries(StateManager stateManager) { - return BooleanExpression.booleanExpression(EasyBind.reduce(stateManager.getSelectedEntries(), + return BooleanExpression.booleanExpression(EasyBind.reduce( + stateManager.getSelectedEntries(), entries -> entries.anyMatch(entry -> !entry.getFiles().isEmpty()))); } diff --git a/src/main/java/org/jabref/gui/actions/JabRefAction.java b/src/main/java/org/jabref/gui/actions/JabRefAction.java index e20b7650d90..df3cde5ee10 100644 --- a/src/main/java/org/jabref/gui/actions/JabRefAction.java +++ b/src/main/java/org/jabref/gui/actions/JabRefAction.java @@ -16,10 +16,10 @@ class JabRefAction extends org.controlsfx.control.action.Action { public JabRefAction(Action action, KeyBindingRepository keyBindingRepository) { super(action.getText()); - action.getIcon() - .ifPresent(icon -> setGraphic(icon.getGraphicNode())); - action.getKeyBinding() - .ifPresent(keyBinding -> keyBindingRepository.getKeyCombination(keyBinding).ifPresent(combination -> setAccelerator(combination))); + action.getIcon().ifPresent(icon -> setGraphic(icon.getGraphicNode())); + action.getKeyBinding().ifPresent(keyBinding -> keyBindingRepository + .getKeyCombination(keyBinding) + .ifPresent(combination -> setAccelerator(combination))); setLongText(action.getDescription()); } @@ -70,14 +70,12 @@ private String getActionName(Action action, Command command) { } private void trackExecute(String actionName) { - Telemetry.getTelemetryClient() - .ifPresent(telemetryClient -> telemetryClient.trackEvent(actionName)); + Telemetry.getTelemetryClient().ifPresent(telemetryClient -> telemetryClient.trackEvent(actionName)); } private void trackUserActionSource(String actionName, Sources source) { - Telemetry.getTelemetryClient().ifPresent(telemetryClient -> telemetryClient.trackEvent( - actionName, - Map.of("Source", source.toString()), - Map.of())); + Telemetry.getTelemetryClient() + .ifPresent(telemetryClient -> + telemetryClient.trackEvent(actionName, Map.of("Source", source.toString()), Map.of())); } } diff --git a/src/main/java/org/jabref/gui/actions/StandardActions.java b/src/main/java/org/jabref/gui/actions/StandardActions.java index 4053cdc7ea1..cd2bdaf53c0 100644 --- a/src/main/java/org/jabref/gui/actions/StandardActions.java +++ b/src/main/java/org/jabref/gui/actions/StandardActions.java @@ -8,7 +8,6 @@ import org.jabref.logic.l10n.Localization; public enum StandardActions implements Action { - COPY_MORE(Localization.lang("Copy") + "..."), COPY_TITLE(Localization.lang("Copy title"), KeyBinding.COPY_TITLE), COPY_KEY(Localization.lang("Copy citation key"), KeyBinding.COPY_CITATION_KEY), @@ -19,7 +18,8 @@ public enum StandardActions implements Action { COPY_CITATION_TEXT(Localization.lang("Copy citation (text)")), COPY_CITATION_PREVIEW(Localization.lang("Copy preview"), KeyBinding.COPY_PREVIEW), EXPORT_TO_CLIPBOARD(Localization.lang("Export to clipboard"), IconTheme.JabRefIcons.EXPORT_TO_CLIPBOARD), - EXPORT_SELECTED_TO_CLIPBOARD(Localization.lang("Export selected entries to clipboard"), IconTheme.JabRefIcons.EXPORT_TO_CLIPBOARD), + EXPORT_SELECTED_TO_CLIPBOARD( + Localization.lang("Export selected entries to clipboard"), IconTheme.JabRefIcons.EXPORT_TO_CLIPBOARD), COPY(Localization.lang("Copy"), IconTheme.JabRefIcons.COPY, KeyBinding.COPY), PASTE(Localization.lang("Paste"), IconTheme.JabRefIcons.PASTE, KeyBinding.PASTE), CUT(Localization.lang("Cut"), IconTheme.JabRefIcons.CUT, KeyBinding.CUT), @@ -54,7 +54,10 @@ public enum StandardActions implements Action { READ_STATUS(Localization.lang("Read status"), IconTheme.JabRefIcons.READ_STATUS), CLEAR_READ_STATUS(Localization.lang("Clear read status"), KeyBinding.CLEAR_READ_STATUS), READ(Localization.lang("Set read status to read"), IconTheme.JabRefIcons.READ_STATUS_READ, KeyBinding.READ), - SKIMMED(Localization.lang("Set read status to skimmed"), IconTheme.JabRefIcons.READ_STATUS_SKIMMED, KeyBinding.SKIMMED), + SKIMMED( + Localization.lang("Set read status to skimmed"), + IconTheme.JabRefIcons.READ_STATUS_SKIMMED, + KeyBinding.SKIMMED), RELEVANCE(Localization.lang("Relevance"), IconTheme.JabRefIcons.RELEVANCE), RELEVANT(Localization.lang("Toggle relevance"), IconTheme.JabRefIcons.RELEVANCE), NEW_LIBRARY(Localization.lang("New library"), IconTheme.JabRefIcons.NEW), @@ -64,18 +67,34 @@ public enum StandardActions implements Action { SAVE_LIBRARY(Localization.lang("Save library"), IconTheme.JabRefIcons.SAVE, KeyBinding.SAVE_DATABASE), SAVE_LIBRARY_AS(Localization.lang("Save library as..."), KeyBinding.SAVE_DATABASE_AS), SAVE_SELECTED_AS_PLAIN_BIBTEX(Localization.lang("Save selected as plain BibTeX...")), - SAVE_ALL(Localization.lang("Save all"), Localization.lang("Save all open libraries"), IconTheme.JabRefIcons.SAVE_ALL, KeyBinding.SAVE_ALL), + SAVE_ALL( + Localization.lang("Save all"), + Localization.lang("Save all open libraries"), + IconTheme.JabRefIcons.SAVE_ALL, + KeyBinding.SAVE_ALL), IMPORT_INTO_NEW_LIBRARY(Localization.lang("Import into new library"), KeyBinding.IMPORT_INTO_NEW_DATABASE), - IMPORT_INTO_CURRENT_LIBRARY(Localization.lang("Import into current library"), KeyBinding.IMPORT_INTO_CURRENT_DATABASE), + IMPORT_INTO_CURRENT_LIBRARY( + Localization.lang("Import into current library"), KeyBinding.IMPORT_INTO_CURRENT_DATABASE), EXPORT_ALL(Localization.lang("Export all entries")), REMOTE_DB(Localization.lang("Shared database"), IconTheme.JabRefIcons.REMOTE_DATABASE), EXPORT_SELECTED(Localization.lang("Export selected entries"), KeyBinding.EXPORT_SELECTED), CONNECT_TO_SHARED_DB(Localization.lang("Connect to shared database"), IconTheme.JabRefIcons.CONNECT_DB), - PULL_CHANGES_FROM_SHARED_DB(Localization.lang("Pull changes from shared database"), KeyBinding.PULL_CHANGES_FROM_SHARED_DATABASE), - CLOSE_LIBRARY(Localization.lang("Close library"), Localization.lang("Close the current library"), IconTheme.JabRefIcons.CLOSE, KeyBinding.CLOSE_DATABASE), - CLOSE_OTHER_LIBRARIES(Localization.lang("Close others"), Localization.lang("Close other libraries"), IconTheme.JabRefIcons.CLOSE), - CLOSE_ALL_LIBRARIES(Localization.lang("Close all"), Localization.lang("Close all libraries"), IconTheme.JabRefIcons.CLOSE), - QUIT(Localization.lang("Quit"), Localization.lang("Quit JabRef"), IconTheme.JabRefIcons.CLOSE_JABREF, KeyBinding.QUIT_JABREF), + PULL_CHANGES_FROM_SHARED_DB( + Localization.lang("Pull changes from shared database"), KeyBinding.PULL_CHANGES_FROM_SHARED_DATABASE), + CLOSE_LIBRARY( + Localization.lang("Close library"), + Localization.lang("Close the current library"), + IconTheme.JabRefIcons.CLOSE, + KeyBinding.CLOSE_DATABASE), + CLOSE_OTHER_LIBRARIES( + Localization.lang("Close others"), Localization.lang("Close other libraries"), IconTheme.JabRefIcons.CLOSE), + CLOSE_ALL_LIBRARIES( + Localization.lang("Close all"), Localization.lang("Close all libraries"), IconTheme.JabRefIcons.CLOSE), + QUIT( + Localization.lang("Quit"), + Localization.lang("Quit JabRef"), + IconTheme.JabRefIcons.CLOSE_JABREF, + KeyBinding.QUIT_JABREF), UNDO(Localization.lang("Undo"), IconTheme.JabRefIcons.UNDO, KeyBinding.UNDO), REDO(Localization.lang("Redo"), IconTheme.JabRefIcons.REDO, KeyBinding.REDO), REPLACE_ALL(Localization.lang("Find and replace"), KeyBinding.REPLACE_STRING), @@ -84,29 +103,66 @@ public enum StandardActions implements Action { AUTOMATIC_FIELD_EDITOR(Localization.lang("Automatic field editor")), TOGGLE_GROUPS(Localization.lang("Groups"), IconTheme.JabRefIcons.TOGGLE_GROUPS, KeyBinding.TOGGLE_GROUPS_INTERFACE), - TOOGLE_OO(Localization.lang("OpenOffice/LibreOffice"), IconTheme.JabRefIcons.FILE_OPENOFFICE, KeyBinding.OPEN_OPEN_OFFICE_LIBRE_OFFICE_CONNECTION), - TOGGLE_WEB_SEARCH(Localization.lang("Web search"), Localization.lang("Toggle web search interface"), IconTheme.JabRefIcons.WWW, KeyBinding.WEB_SEARCH), + TOOGLE_OO( + Localization.lang("OpenOffice/LibreOffice"), + IconTheme.JabRefIcons.FILE_OPENOFFICE, + KeyBinding.OPEN_OPEN_OFFICE_LIBRE_OFFICE_CONNECTION), + TOGGLE_WEB_SEARCH( + Localization.lang("Web search"), + Localization.lang("Toggle web search interface"), + IconTheme.JabRefIcons.WWW, + KeyBinding.WEB_SEARCH), PARSE_LATEX(Localization.lang("Search for citations in LaTeX files..."), IconTheme.JabRefIcons.LATEX_CITATIONS), - NEW_SUB_LIBRARY_FROM_AUX(Localization.lang("New sublibrary based on AUX file") + "...", Localization.lang("New BibTeX sublibrary") + Localization.lang("This feature generates a new library based on which entries are needed in an existing LaTeX document."), IconTheme.JabRefIcons.NEW), - WRITE_METADATA_TO_PDF(Localization.lang("Write metadata to PDF files"), Localization.lang("Will write metadata to the PDFs linked from selected entries."), KeyBinding.WRITE_METADATA_TO_PDF), + NEW_SUB_LIBRARY_FROM_AUX( + Localization.lang("New sublibrary based on AUX file") + "...", + Localization.lang("New BibTeX sublibrary") + + Localization.lang( + "This feature generates a new library based on which entries are needed in an existing LaTeX document."), + IconTheme.JabRefIcons.NEW), + WRITE_METADATA_TO_PDF( + Localization.lang("Write metadata to PDF files"), + Localization.lang("Will write metadata to the PDFs linked from selected entries."), + KeyBinding.WRITE_METADATA_TO_PDF), START_NEW_STUDY(Localization.lang("Start new systematic literature review")), UPDATE_SEARCH_RESULTS_OF_STUDY(Localization.lang("Update study search results")), EDIT_EXISTING_STUDY(Localization.lang("Manage study definition")), OPEN_DATABASE_FOLDER(Localization.lang("Reveal in file explorer")), - OPEN_FOLDER(Localization.lang("Open folder"), Localization.lang("Open folder"), IconTheme.JabRefIcons.FOLDER, KeyBinding.OPEN_FOLDER), - OPEN_FILE(Localization.lang("Open file"), Localization.lang("Open file"), IconTheme.JabRefIcons.FILE, KeyBinding.OPEN_FILE), - OPEN_CONSOLE(Localization.lang("Open terminal here"), Localization.lang("Open terminal here"), IconTheme.JabRefIcons.CONSOLE, KeyBinding.OPEN_CONSOLE), + OPEN_FOLDER( + Localization.lang("Open folder"), + Localization.lang("Open folder"), + IconTheme.JabRefIcons.FOLDER, + KeyBinding.OPEN_FOLDER), + OPEN_FILE( + Localization.lang("Open file"), + Localization.lang("Open file"), + IconTheme.JabRefIcons.FILE, + KeyBinding.OPEN_FILE), + OPEN_CONSOLE( + Localization.lang("Open terminal here"), + Localization.lang("Open terminal here"), + IconTheme.JabRefIcons.CONSOLE, + KeyBinding.OPEN_CONSOLE), COPY_LINKED_FILES(Localization.lang("Copy linked files to folder...")), COPY_DOI(Localization.lang("Copy DOI")), COPY_DOI_URL(Localization.lang("Copy DOI url")), ABBREVIATE(Localization.lang("Abbreviate journal names")), - ABBREVIATE_DEFAULT(Localization.lang("default"), Localization.lang("Abbreviate journal names of the selected entries (DEFAULT abbreviation)"), KeyBinding.ABBREVIATE), - ABBREVIATE_DOTLESS(Localization.lang("dotless"), Localization.lang("Abbreviate journal names of the selected entries (DOTLESS abbreviation)")), - ABBREVIATE_SHORTEST_UNIQUE(Localization.lang("shortest unique"), Localization.lang("Abbreviate journal names of the selected entries (SHORTEST UNIQUE abbreviation)")), - UNABBREVIATE(Localization.lang("Unabbreviate journal names"), Localization.lang("Unabbreviate journal names of the selected entries"), KeyBinding.UNABBREVIATE), + ABBREVIATE_DEFAULT( + Localization.lang("default"), + Localization.lang("Abbreviate journal names of the selected entries (DEFAULT abbreviation)"), + KeyBinding.ABBREVIATE), + ABBREVIATE_DOTLESS( + Localization.lang("dotless"), + Localization.lang("Abbreviate journal names of the selected entries (DOTLESS abbreviation)")), + ABBREVIATE_SHORTEST_UNIQUE( + Localization.lang("shortest unique"), + Localization.lang("Abbreviate journal names of the selected entries (SHORTEST UNIQUE abbreviation)")), + UNABBREVIATE( + Localization.lang("Unabbreviate journal names"), + Localization.lang("Unabbreviate journal names of the selected entries"), + KeyBinding.UNABBREVIATE), MANAGE_CUSTOM_EXPORTS(Localization.lang("Manage custom exports")), MANAGE_CUSTOM_IMPORTS(Localization.lang("Manage custom imports")), @@ -130,48 +186,86 @@ public enum StandardActions implements Action { NEW_ENTRY(Localization.lang("New entry"), IconTheme.JabRefIcons.ADD_ENTRY, KeyBinding.NEW_ENTRY), NEW_ARTICLE(Localization.lang("New article"), IconTheme.JabRefIcons.ADD_ARTICLE), - NEW_ENTRY_FROM_PLAIN_TEXT(Localization.lang("New entry from plain text"), IconTheme.JabRefIcons.NEW_ENTRY_FROM_PLAIN_TEXT, KeyBinding.NEW_ENTRY_FROM_PLAIN_TEXT), + NEW_ENTRY_FROM_PLAIN_TEXT( + Localization.lang("New entry from plain text"), + IconTheme.JabRefIcons.NEW_ENTRY_FROM_PLAIN_TEXT, + KeyBinding.NEW_ENTRY_FROM_PLAIN_TEXT), LIBRARY_PROPERTIES(Localization.lang("Library properties")), FIND_DUPLICATES(Localization.lang("Find duplicates"), IconTheme.JabRefIcons.FIND_DUPLICATES), MERGE_ENTRIES(Localization.lang("Merge entries"), IconTheme.JabRefIcons.MERGE_ENTRIES, KeyBinding.MERGE_ENTRIES), - RESOLVE_DUPLICATE_KEYS(Localization.lang("Resolve duplicate citation keys"), Localization.lang("Find and remove duplicate citation keys"), KeyBinding.RESOLVE_DUPLICATE_CITATION_KEYS), + RESOLVE_DUPLICATE_KEYS( + Localization.lang("Resolve duplicate citation keys"), + Localization.lang("Find and remove duplicate citation keys"), + KeyBinding.RESOLVE_DUPLICATE_CITATION_KEYS), CHECK_INTEGRITY(Localization.lang("Check integrity"), KeyBinding.CHECK_INTEGRITY), - FIND_UNLINKED_FILES(Localization.lang("Search for unlinked local files"), IconTheme.JabRefIcons.SEARCH, KeyBinding.FIND_UNLINKED_FILES), - AUTO_LINK_FILES(Localization.lang("Automatically set file links"), IconTheme.JabRefIcons.AUTO_FILE_LINK, KeyBinding.AUTOMATICALLY_LINK_FILES), + FIND_UNLINKED_FILES( + Localization.lang("Search for unlinked local files"), + IconTheme.JabRefIcons.SEARCH, + KeyBinding.FIND_UNLINKED_FILES), + AUTO_LINK_FILES( + Localization.lang("Automatically set file links"), + IconTheme.JabRefIcons.AUTO_FILE_LINK, + KeyBinding.AUTOMATICALLY_LINK_FILES), LOOKUP_DOC_IDENTIFIER(Localization.lang("Search document identifier online")), - LOOKUP_FULLTEXT(Localization.lang("Search full text documents online"), IconTheme.JabRefIcons.FILE_SEARCH, KeyBinding.DOWNLOAD_FULL_TEXT), - GENERATE_CITE_KEY(Localization.lang("Generate citation key"), IconTheme.JabRefIcons.MAKE_KEY, KeyBinding.AUTOGENERATE_CITATION_KEYS), - GENERATE_CITE_KEYS(Localization.lang("Generate citation keys"), IconTheme.JabRefIcons.MAKE_KEY, KeyBinding.AUTOGENERATE_CITATION_KEYS), - DOWNLOAD_FULL_TEXT(Localization.lang("Search full text documents online"), IconTheme.JabRefIcons.FILE_SEARCH, KeyBinding.DOWNLOAD_FULL_TEXT), + LOOKUP_FULLTEXT( + Localization.lang("Search full text documents online"), + IconTheme.JabRefIcons.FILE_SEARCH, + KeyBinding.DOWNLOAD_FULL_TEXT), + GENERATE_CITE_KEY( + Localization.lang("Generate citation key"), + IconTheme.JabRefIcons.MAKE_KEY, + KeyBinding.AUTOGENERATE_CITATION_KEYS), + GENERATE_CITE_KEYS( + Localization.lang("Generate citation keys"), + IconTheme.JabRefIcons.MAKE_KEY, + KeyBinding.AUTOGENERATE_CITATION_KEYS), + DOWNLOAD_FULL_TEXT( + Localization.lang("Search full text documents online"), + IconTheme.JabRefIcons.FILE_SEARCH, + KeyBinding.DOWNLOAD_FULL_TEXT), CLEANUP_ENTRIES(Localization.lang("Cleanup entries"), IconTheme.JabRefIcons.CLEANUP_ENTRIES, KeyBinding.CLEANUP), SET_FILE_LINKS(Localization.lang("Automatically set file links"), KeyBinding.AUTOMATICALLY_LINK_FILES), EDIT_FILE_LINK(Localization.lang("Edit"), IconTheme.JabRefIcons.EDIT, KeyBinding.EDIT_ENTRY), DOWNLOAD_FILE(Localization.lang("Download file"), IconTheme.JabRefIcons.DOWNLOAD_FILE), RENAME_FILE_TO_PATTERN(Localization.lang("Rename file to defined pattern"), IconTheme.JabRefIcons.AUTO_RENAME), - RENAME_FILE_TO_NAME(Localization.lang("Rename file to a given name"), IconTheme.JabRefIcons.RENAME, KeyBinding.REPLACE_STRING), + RENAME_FILE_TO_NAME( + Localization.lang("Rename file to a given name"), IconTheme.JabRefIcons.RENAME, KeyBinding.REPLACE_STRING), MOVE_FILE_TO_FOLDER(Localization.lang("Move file to file directory"), IconTheme.JabRefIcons.MOVE_TO_FOLDER), MOVE_FILE_TO_FOLDER_AND_RENAME(Localization.lang("Move file to file directory and rename file")), - COPY_FILE_TO_FOLDER(Localization.lang("Copy linked file to folder..."), IconTheme.JabRefIcons.COPY_TO_FOLDER, KeyBinding.COPY), + COPY_FILE_TO_FOLDER( + Localization.lang("Copy linked file to folder..."), IconTheme.JabRefIcons.COPY_TO_FOLDER, KeyBinding.COPY), REMOVE_LINK(Localization.lang("Remove link"), IconTheme.JabRefIcons.REMOVE_LINK), - DELETE_FILE(Localization.lang("Permanently delete local file"), IconTheme.JabRefIcons.DELETE_FILE, KeyBinding.DELETE_ENTRY), + DELETE_FILE( + Localization.lang("Permanently delete local file"), + IconTheme.JabRefIcons.DELETE_FILE, + KeyBinding.DELETE_ENTRY), HELP(Localization.lang("Online help"), IconTheme.JabRefIcons.HELP, KeyBinding.HELP), HELP_KEY_PATTERNS(Localization.lang("Help on key patterns"), IconTheme.JabRefIcons.HELP, KeyBinding.HELP), - HELP_REGEX_SEARCH(Localization.lang("Help on regular expression search"), IconTheme.JabRefIcons.HELP, KeyBinding.HELP), + HELP_REGEX_SEARCH( + Localization.lang("Help on regular expression search"), IconTheme.JabRefIcons.HELP, KeyBinding.HELP), HELP_NAME_FORMATTER(Localization.lang("Help on Name Formatting"), IconTheme.JabRefIcons.HELP, KeyBinding.HELP), HELP_SPECIAL_FIELDS(Localization.lang("Help on special fields"), IconTheme.JabRefIcons.HELP, KeyBinding.HELP), - HELP_PUSH_TO_APPLICATION(Localization.lang("Help on external applications"), IconTheme.JabRefIcons.HELP, KeyBinding.HELP), + HELP_PUSH_TO_APPLICATION( + Localization.lang("Help on external applications"), IconTheme.JabRefIcons.HELP, KeyBinding.HELP), WEB_MENU(Localization.lang("JabRef resources")), OPEN_WEBPAGE(Localization.lang("Website"), Localization.lang("Opens JabRef's website"), IconTheme.JabRefIcons.HOME), OPEN_FACEBOOK("Facebook", Localization.lang("Opens JabRef's Facebook page"), IconTheme.JabRefIcons.FACEBOOK), OPEN_TWITTER("Twitter", Localization.lang("Opens JabRef's Twitter page"), IconTheme.JabRefIcons.TWITTER), OPEN_BLOG(Localization.lang("Blog"), Localization.lang("Opens JabRef's blog"), IconTheme.JabRefIcons.BLOG), - OPEN_DEV_VERSION_LINK(Localization.lang("Development version"), Localization.lang("Opens a link where the current development version can be downloaded")), - OPEN_CHANGELOG(Localization.lang("View change log"), Localization.lang("See what has been changed in the JabRef versions")), + OPEN_DEV_VERSION_LINK( + Localization.lang("Development version"), + Localization.lang("Opens a link where the current development version can be downloaded")), + OPEN_CHANGELOG( + Localization.lang("View change log"), + Localization.lang("See what has been changed in the JabRef versions")), OPEN_GITHUB("GitHub", Localization.lang("Opens JabRef's GitHub page"), IconTheme.JabRefIcons.GITHUB), DONATE(Localization.lang("Donate to JabRef"), Localization.lang("Donate to JabRef"), IconTheme.JabRefIcons.DONATE), - OPEN_FORUM(Localization.lang("Online help forum"), Localization.lang("Online help forum"), IconTheme.JabRefIcons.FORUM), + OPEN_FORUM( + Localization.lang("Online help forum"), + Localization.lang("Online help forum"), + IconTheme.JabRefIcons.FORUM), ERROR_CONSOLE(Localization.lang("View event log"), Localization.lang("Display all error messages")), SEARCH_FOR_UPDATES(Localization.lang("Check for updates")), ABOUT(Localization.lang("About JabRef"), Localization.lang("About JabRef")), diff --git a/src/main/java/org/jabref/gui/autocompleter/AutoCompletePreferences.java b/src/main/java/org/jabref/gui/autocompleter/AutoCompletePreferences.java index 160abb9ecb3..ee6dea8fdea 100644 --- a/src/main/java/org/jabref/gui/autocompleter/AutoCompletePreferences.java +++ b/src/main/java/org/jabref/gui/autocompleter/AutoCompletePreferences.java @@ -15,7 +15,9 @@ public class AutoCompletePreferences { public enum NameFormat { - LAST_FIRST, FIRST_LAST, BOTH + LAST_FIRST, + FIRST_LAST, + BOTH } private final BooleanProperty shouldAutoComplete; @@ -23,10 +25,11 @@ public enum NameFormat { private final ObjectProperty nameFormat; private final ObservableSet completeFields; - public AutoCompletePreferences(boolean shouldAutoComplete, - AutoCompleteFirstNameMode firstNameMode, - NameFormat nameFormat, - Set completeFields) { + public AutoCompletePreferences( + boolean shouldAutoComplete, + AutoCompleteFirstNameMode firstNameMode, + NameFormat nameFormat, + Set completeFields) { this.shouldAutoComplete = new SimpleBooleanProperty(shouldAutoComplete); this.firstNameMode = new SimpleObjectProperty<>(firstNameMode); this.nameFormat = new SimpleObjectProperty<>(nameFormat); diff --git a/src/main/java/org/jabref/gui/autocompleter/AutoCompletionTextInputBinding.java b/src/main/java/org/jabref/gui/autocompleter/AutoCompletionTextInputBinding.java index 0bb48bb7275..eb62c26bf3c 100644 --- a/src/main/java/org/jabref/gui/autocompleter/AutoCompletionTextInputBinding.java +++ b/src/main/java/org/jabref/gui/autocompleter/AutoCompletionTextInputBinding.java @@ -48,6 +48,7 @@ public class AutoCompletionTextInputBinding extends AutoCompletionBinding * String converter to be used to convert suggestions to strings. */ private StringConverter converter; + private AutoCompletionStrategy inputAnalyzer; private final ChangeListener textChangeListener = (obs, oldText, newText) -> { if (getCompletionTarget().isFocused()) { @@ -69,25 +70,28 @@ public class AutoCompletionTextInputBinding extends AutoCompletionBinding * Creates a new auto-completion binding between the given textInputControl * and the given suggestion provider. */ - private AutoCompletionTextInputBinding(final TextInputControl textInputControl, - Callback> suggestionProvider) { + private AutoCompletionTextInputBinding( + final TextInputControl textInputControl, Callback> suggestionProvider) { - this(textInputControl, + this( + textInputControl, suggestionProvider, AutoCompletionTextInputBinding.defaultStringConverter(), new ReplaceStrategy()); } - private AutoCompletionTextInputBinding(final TextInputControl textInputControl, - final Callback> suggestionProvider, - final StringConverter converter) { + private AutoCompletionTextInputBinding( + final TextInputControl textInputControl, + final Callback> suggestionProvider, + final StringConverter converter) { this(textInputControl, suggestionProvider, converter, new ReplaceStrategy()); } - private AutoCompletionTextInputBinding(final TextInputControl textInputControl, - final Callback> suggestionProvider, - final StringConverter converter, - final AutoCompletionStrategy inputAnalyzer) { + private AutoCompletionTextInputBinding( + final TextInputControl textInputControl, + final Callback> suggestionProvider, + final StringConverter converter, + final AutoCompletionStrategy inputAnalyzer) { super(textInputControl, suggestionProvider, converter); this.converter = converter; @@ -112,20 +116,32 @@ public T fromString(String string) { }; } - public static void autoComplete(TextInputControl textArea, Callback> suggestionProvider) { + public static void autoComplete( + TextInputControl textArea, Callback> suggestionProvider) { new AutoCompletionTextInputBinding<>(textArea, suggestionProvider); } - public static void autoComplete(TextInputControl textArea, Callback> suggestionProvider, StringConverter converter) { + public static void autoComplete( + TextInputControl textArea, + Callback> suggestionProvider, + StringConverter converter) { new AutoCompletionTextInputBinding<>(textArea, suggestionProvider, converter); } - public static AutoCompletionTextInputBinding autoComplete(TextInputControl textArea, Callback> suggestionProvider, StringConverter converter, AutoCompletionStrategy inputAnalyzer) { + public static AutoCompletionTextInputBinding autoComplete( + TextInputControl textArea, + Callback> suggestionProvider, + StringConverter converter, + AutoCompletionStrategy inputAnalyzer) { return new AutoCompletionTextInputBinding<>(textArea, suggestionProvider, converter, inputAnalyzer); } - public static AutoCompletionTextInputBinding autoComplete(TextInputControl textArea, Callback> suggestionProvider, AutoCompletionStrategy inputAnalyzer) { - return autoComplete(textArea, suggestionProvider, AutoCompletionTextInputBinding.defaultStringConverter(), inputAnalyzer); + public static AutoCompletionTextInputBinding autoComplete( + TextInputControl textArea, + Callback> suggestionProvider, + AutoCompletionStrategy inputAnalyzer) { + return autoComplete( + textArea, suggestionProvider, AutoCompletionTextInputBinding.defaultStringConverter(), inputAnalyzer); } private void setUserInputText(String newText) { diff --git a/src/main/java/org/jabref/gui/autocompleter/BibEntrySuggestionProvider.java b/src/main/java/org/jabref/gui/autocompleter/BibEntrySuggestionProvider.java index a69b8a3b1c1..633f9fd0fce 100644 --- a/src/main/java/org/jabref/gui/autocompleter/BibEntrySuggestionProvider.java +++ b/src/main/java/org/jabref/gui/autocompleter/BibEntrySuggestionProvider.java @@ -37,8 +37,8 @@ protected Comparator getComparator() { protected boolean isMatch(BibEntry entry, AutoCompletionBinding.ISuggestionRequest request) { String userText = request.getUserText(); return entry.getCitationKey() - .map(key -> StringUtil.containsIgnoreCase(key, userText)) - .orElse(false); + .map(key -> StringUtil.containsIgnoreCase(key, userText)) + .orElse(false); } @Override diff --git a/src/main/java/org/jabref/gui/autocompleter/ContentSelectorSuggestionProvider.java b/src/main/java/org/jabref/gui/autocompleter/ContentSelectorSuggestionProvider.java index 01e56ff5350..ea919e400d5 100644 --- a/src/main/java/org/jabref/gui/autocompleter/ContentSelectorSuggestionProvider.java +++ b/src/main/java/org/jabref/gui/autocompleter/ContentSelectorSuggestionProvider.java @@ -13,8 +13,8 @@ public class ContentSelectorSuggestionProvider extends StringSuggestionProvider private final SuggestionProvider suggestionProvider; private final List contentSelectorValues; - public ContentSelectorSuggestionProvider(SuggestionProvider suggestionProvider, - List contentSelectorValues) { + public ContentSelectorSuggestionProvider( + SuggestionProvider suggestionProvider, List contentSelectorValues) { this.suggestionProvider = suggestionProvider; this.contentSelectorValues = contentSelectorValues; diff --git a/src/main/java/org/jabref/gui/autocompleter/PersonNameStringConverter.java b/src/main/java/org/jabref/gui/autocompleter/PersonNameStringConverter.java index c78312638af..8e2ae19fbc0 100644 --- a/src/main/java/org/jabref/gui/autocompleter/PersonNameStringConverter.java +++ b/src/main/java/org/jabref/gui/autocompleter/PersonNameStringConverter.java @@ -11,7 +11,8 @@ public class PersonNameStringConverter extends StringConverter { private final boolean autoCompLF; private final AutoCompleteFirstNameMode autoCompleteFirstNameMode; - public PersonNameStringConverter(boolean autoCompFF, boolean autoCompLF, AutoCompleteFirstNameMode autoCompleteFirstNameMode) { + public PersonNameStringConverter( + boolean autoCompFF, boolean autoCompLF, AutoCompleteFirstNameMode autoCompleteFirstNameMode) { this.autoCompFF = autoCompFF; this.autoCompLF = autoCompLF; this.autoCompleteFirstNameMode = autoCompleteFirstNameMode; diff --git a/src/main/java/org/jabref/gui/autocompleter/PersonNameSuggestionProvider.java b/src/main/java/org/jabref/gui/autocompleter/PersonNameSuggestionProvider.java index 2ff7d4a4ed1..ef39faa0ebb 100644 --- a/src/main/java/org/jabref/gui/autocompleter/PersonNameSuggestionProvider.java +++ b/src/main/java/org/jabref/gui/autocompleter/PersonNameSuggestionProvider.java @@ -37,13 +37,11 @@ public PersonNameSuggestionProvider(Collection fields, BibDatabase databa } public Stream getAuthors(BibEntry entry) { - return entry.getFieldMap() - .entrySet() - .stream() - .filter(fieldValuePair -> fields.contains(fieldValuePair.getKey())) - .map(Map.Entry::getValue) - .map(AuthorList::parse) - .flatMap(authors -> authors.getAuthors().stream()); + return entry.getFieldMap().entrySet().stream() + .filter(fieldValuePair -> fields.contains(fieldValuePair.getKey())) + .map(Map.Entry::getValue) + .map(AuthorList::parse) + .flatMap(authors -> authors.getAuthors().stream()); } @Override @@ -63,8 +61,6 @@ protected boolean isMatch(Author candidate, AutoCompletionBinding.ISuggestionReq @Override public Stream getSource() { - return database.getEntries() - .parallelStream() - .flatMap(this::getAuthors); + return database.getEntries().parallelStream().flatMap(this::getAuthors); } } diff --git a/src/main/java/org/jabref/gui/autocompleter/SuggestionProvider.java b/src/main/java/org/jabref/gui/autocompleter/SuggestionProvider.java index 341c9ef8f5e..d54268685d0 100644 --- a/src/main/java/org/jabref/gui/autocompleter/SuggestionProvider.java +++ b/src/main/java/org/jabref/gui/autocompleter/SuggestionProvider.java @@ -46,13 +46,14 @@ public final Collection provideSuggestions(ISuggestionRequest request) { if (!request.getUserText().isEmpty()) { Comparator comparator = getComparator(); Equivalence equivalence = getEquivalence(); - return getSource().filter(candidate -> isMatch(candidate, request)) - .map(equivalence::wrap) // Need to do a bit of acrobatic as there is no distinctBy method - .distinct() - .limit(10) - .map(Equivalence.Wrapper::get) - .sorted(comparator) - .collect(Collectors.toList()); + return getSource() + .filter(candidate -> isMatch(candidate, request)) + .map(equivalence::wrap) // Need to do a bit of acrobatic as there is no distinctBy method + .distinct() + .limit(10) + .map(Equivalence.Wrapper::get) + .sorted(comparator) + .collect(Collectors.toList()); } else { return Collections.emptyList(); } @@ -63,11 +64,12 @@ public final Collection provideSuggestions(ISuggestionRequest request) { public Collection getPossibleSuggestions() { Comparator comparator = getComparator().reversed(); Equivalence equivalence = getEquivalence(); - return getSource().map(equivalence::wrap) // Need to do a bit of acrobatic as there is no distinctBy method - .distinct() - .map(Equivalence.Wrapper::get) - .sorted(comparator) - .collect(Collectors.toList()); + return getSource() + .map(equivalence::wrap) // Need to do a bit of acrobatic as there is no distinctBy method + .distinct() + .map(Equivalence.Wrapper::get) + .sorted(comparator) + .collect(Collectors.toList()); } /** diff --git a/src/main/java/org/jabref/gui/autocompleter/SuggestionProviders.java b/src/main/java/org/jabref/gui/autocompleter/SuggestionProviders.java index 06d2abef8a8..4f71c6b0dda 100644 --- a/src/main/java/org/jabref/gui/autocompleter/SuggestionProviders.java +++ b/src/main/java/org/jabref/gui/autocompleter/SuggestionProviders.java @@ -15,7 +15,10 @@ public class SuggestionProviders { private JournalAbbreviationRepository abbreviationRepository; private AutoCompletePreferences autoCompletePreferences; - public SuggestionProviders(BibDatabase database, JournalAbbreviationRepository abbreviationRepository, AutoCompletePreferences autoCompletePreferences) { + public SuggestionProviders( + BibDatabase database, + JournalAbbreviationRepository abbreviationRepository, + AutoCompletePreferences autoCompletePreferences) { this.database = database; this.abbreviationRepository = abbreviationRepository; this.autoCompletePreferences = autoCompletePreferences; @@ -34,7 +37,8 @@ public SuggestionProvider getForField(Field field) { Set fieldProperties = field.getProperties(); if (fieldProperties.contains(FieldProperty.PERSON_NAMES)) { return new PersonNameSuggestionProvider(field, database); - } else if (fieldProperties.contains(FieldProperty.SINGLE_ENTRY_LINK) || fieldProperties.contains(FieldProperty.MULTIPLE_ENTRY_LINK)) { + } else if (fieldProperties.contains(FieldProperty.SINGLE_ENTRY_LINK) + || fieldProperties.contains(FieldProperty.MULTIPLE_ENTRY_LINK)) { return new BibEntrySuggestionProvider(database); } else if (fieldProperties.contains(FieldProperty.JOURNAL_NAME) || StandardField.PUBLISHER == field) { return new JournalsSuggestionProvider(field, database, abbreviationRepository); diff --git a/src/main/java/org/jabref/gui/autocompleter/WordSuggestionProvider.java b/src/main/java/org/jabref/gui/autocompleter/WordSuggestionProvider.java index f83d047b0f7..d6715dcd961 100644 --- a/src/main/java/org/jabref/gui/autocompleter/WordSuggestionProvider.java +++ b/src/main/java/org/jabref/gui/autocompleter/WordSuggestionProvider.java @@ -21,8 +21,6 @@ public WordSuggestionProvider(Field field, BibDatabase database) { @Override public Stream getSource() { - return database.getEntries() - .parallelStream() - .flatMap(entry -> entry.getFieldAsWords(field).stream()); + return database.getEntries().parallelStream().flatMap(entry -> entry.getFieldAsWords(field).stream()); } } diff --git a/src/main/java/org/jabref/gui/autosaveandbackup/AutosaveManager.java b/src/main/java/org/jabref/gui/autosaveandbackup/AutosaveManager.java index 72402b18dd5..4b82b83d32c 100644 --- a/src/main/java/org/jabref/gui/autosaveandbackup/AutosaveManager.java +++ b/src/main/java/org/jabref/gui/autosaveandbackup/AutosaveManager.java @@ -45,8 +45,8 @@ private AutosaveManager(BibDatabaseContext bibDatabaseContext) { this.executor.scheduleAtFixedRate( () -> { if (needsSave) { - eventBus.post(new AutosaveEvent()); - needsSave = false; + eventBus.post(new AutosaveEvent()); + needsSave = false; } }, DELAY_BETWEEN_AUTOSAVE_ATTEMPTS_IN_SECONDS, @@ -84,11 +84,13 @@ public static AutosaveManager start(BibDatabaseContext bibDatabaseContext) { * @param bibDatabaseContext Associated {@link BibDatabaseContext} */ public static void shutdown(BibDatabaseContext bibDatabaseContext) { - runningInstances.stream().filter(instance -> instance.bibDatabaseContext == bibDatabaseContext).findAny() - .ifPresent(instance -> { - instance.shutdown(); - runningInstances.remove(instance); - }); + runningInstances.stream() + .filter(instance -> instance.bibDatabaseContext == bibDatabaseContext) + .findAny() + .ifPresent(instance -> { + instance.shutdown(); + runningInstances.remove(instance); + }); } public void registerListener(Object listener) { diff --git a/src/main/java/org/jabref/gui/autosaveandbackup/BackupManager.java b/src/main/java/org/jabref/gui/autosaveandbackup/BackupManager.java index 1b9017f192f..7c0b0e1d7d3 100644 --- a/src/main/java/org/jabref/gui/autosaveandbackup/BackupManager.java +++ b/src/main/java/org/jabref/gui/autosaveandbackup/BackupManager.java @@ -71,7 +71,11 @@ public class BackupManager { private final Queue backupFilesQueue = new LinkedBlockingQueue<>(); private boolean needsBackup = false; - BackupManager(LibraryTab libraryTab, BibDatabaseContext bibDatabaseContext, BibEntryTypesManager entryTypesManager, PreferencesService preferences) { + BackupManager( + LibraryTab libraryTab, + BibDatabaseContext bibDatabaseContext, + BibEntryTypesManager entryTypesManager, + PreferencesService preferences) { this.bibDatabaseContext = bibDatabaseContext; this.entryTypesManager = entryTypesManager; this.preferences = preferences; @@ -104,7 +108,11 @@ static Optional getLatestBackupPath(Path originalPath, Path backupDir) { * * @param bibDatabaseContext Associated {@link BibDatabaseContext} */ - public static BackupManager start(LibraryTab libraryTab, BibDatabaseContext bibDatabaseContext, BibEntryTypesManager entryTypesManager, PreferencesService preferences) { + public static BackupManager start( + LibraryTab libraryTab, + BibDatabaseContext bibDatabaseContext, + BibEntryTypesManager entryTypesManager, + PreferencesService preferences) { BackupManager backupManager = new BackupManager(libraryTab, bibDatabaseContext, entryTypesManager, preferences); backupManager.startBackupTask(preferences.getFilePreferences().getBackupDirectory()); runningInstances.add(backupManager); @@ -117,7 +125,9 @@ public static BackupManager start(LibraryTab libraryTab, BibDatabaseContext bibD * @param bibDatabaseContext Associated {@link BibDatabaseContext} */ public static void discardBackup(BibDatabaseContext bibDatabaseContext, Path backupDir) { - runningInstances.stream().filter(instance -> instance.bibDatabaseContext == bibDatabaseContext).forEach(backupManager -> backupManager.discardBackup(backupDir)); + runningInstances.stream() + .filter(instance -> instance.bibDatabaseContext == bibDatabaseContext) + .forEach(backupManager -> backupManager.discardBackup(backupDir)); } /** @@ -128,7 +138,9 @@ public static void discardBackup(BibDatabaseContext bibDatabaseContext, Path bac * @param backupDir The path to the backup directory */ public static void shutdown(BibDatabaseContext bibDatabaseContext, Path backupDir, boolean createBackup) { - runningInstances.stream().filter(instance -> instance.bibDatabaseContext == bibDatabaseContext).forEach(backupManager -> backupManager.shutdown(backupDir, createBackup)); + runningInstances.stream() + .filter(instance -> instance.bibDatabaseContext == bibDatabaseContext) + .forEach(backupManager -> backupManager.shutdown(backupDir, createBackup)); runningInstances.removeIf(instance -> instance.bibDatabaseContext == bibDatabaseContext); } @@ -155,36 +167,38 @@ public static boolean backupFileDiffers(Path originalPath, Path backupDir) { } return false; } - return getLatestBackupPath(originalPath, backupDir).map(latestBackupPath -> { - FileTime latestBackupFileLastModifiedTime; - try { - latestBackupFileLastModifiedTime = Files.getLastModifiedTime(latestBackupPath); - } catch (IOException e) { - LOGGER.debug("Could not get timestamp of backup file {}", latestBackupPath, e); - // If we cannot get the timestamp, we do show any warning - return false; - } - FileTime currentFileLastModifiedTime; - try { - currentFileLastModifiedTime = Files.getLastModifiedTime(originalPath); - } catch (IOException e) { - LOGGER.debug("Could not get timestamp of current file file {}", originalPath, e); - // If we cannot get the timestamp, we do show any warning - return false; - } - if (latestBackupFileLastModifiedTime.compareTo(currentFileLastModifiedTime) <= 0) { - // Backup is older than current file - // We treat the backup as non-different (even if it could differ) - return false; - } - try { - return Files.mismatch(originalPath, latestBackupPath) != -1L; - } catch (IOException e) { - LOGGER.debug("Could not compare original file and backup file.", e); - // User has to investigate in this case - return true; - } - }).orElse(false); + return getLatestBackupPath(originalPath, backupDir) + .map(latestBackupPath -> { + FileTime latestBackupFileLastModifiedTime; + try { + latestBackupFileLastModifiedTime = Files.getLastModifiedTime(latestBackupPath); + } catch (IOException e) { + LOGGER.debug("Could not get timestamp of backup file {}", latestBackupPath, e); + // If we cannot get the timestamp, we do show any warning + return false; + } + FileTime currentFileLastModifiedTime; + try { + currentFileLastModifiedTime = Files.getLastModifiedTime(originalPath); + } catch (IOException e) { + LOGGER.debug("Could not get timestamp of current file file {}", originalPath, e); + // If we cannot get the timestamp, we do show any warning + return false; + } + if (latestBackupFileLastModifiedTime.compareTo(currentFileLastModifiedTime) <= 0) { + // Backup is older than current file + // We treat the backup as non-different (even if it could differ) + return false; + } + try { + return Files.mismatch(originalPath, latestBackupPath) != -1L; + } catch (IOException e) { + LOGGER.debug("Could not compare original file and backup file.", e); + // User has to investigate in this case + return true; + } + }) + .orElse(false); } /** @@ -206,7 +220,9 @@ public static void restoreBackup(Path originalPath, Path backupDir) { } Optional determineBackupPathForNewBackup(Path backupDir) { - return bibDatabaseContext.getDatabasePath().map(path -> BackupManager.getBackupPathForNewBackup(path, backupDir)); + return bibDatabaseContext + .getDatabasePath() + .map(path -> BackupManager.getBackupPathForNewBackup(path, backupDir)); } /** @@ -233,41 +249,47 @@ void performBackup(Path backupPath) { // code similar to org.jabref.gui.exporter.SaveDatabaseAction.saveDatabase SelfContainedSaveOrder saveOrder = bibDatabaseContext - .getMetaData().getSaveOrder() + .getMetaData() + .getSaveOrder() .map(so -> { if (so.getOrderType() == SaveOrder.OrderType.TABLE) { - // We need to "flatten out" SaveOrder.OrderType.TABLE as BibWriter does not have access to preferences - List> sortOrder = libraryTab.getMainTable().getSortOrder(); + // We need to "flatten out" SaveOrder.OrderType.TABLE as BibWriter does not have access to + // preferences + List> sortOrder = + libraryTab.getMainTable().getSortOrder(); return new SelfContainedSaveOrder( SaveOrder.OrderType.SPECIFIED, sortOrder.stream() - .filter(col -> col instanceof MainTableColumn) - .map(column -> ((MainTableColumn) column).getModel()) - .flatMap(model -> model.getSortCriteria().stream()) - .toList()); + .filter(col -> col instanceof MainTableColumn) + .map(column -> ((MainTableColumn) column).getModel()) + .flatMap(model -> model.getSortCriteria().stream()) + .toList()); } else { return SelfContainedSaveOrder.of(so); } }) .orElse(SaveOrder.getDefaultSaveOrder()); - SelfContainedSaveConfiguration saveConfiguration = (SelfContainedSaveConfiguration) new SelfContainedSaveConfiguration() - .withMakeBackup(false) - .withSaveOrder(saveOrder) - .withReformatOnSave(preferences.getLibraryPreferences().shouldAlwaysReformatOnSave()); + SelfContainedSaveConfiguration saveConfiguration = + (SelfContainedSaveConfiguration) new SelfContainedSaveConfiguration() + .withMakeBackup(false) + .withSaveOrder(saveOrder) + .withReformatOnSave(preferences.getLibraryPreferences().shouldAlwaysReformatOnSave()); Charset encoding = bibDatabaseContext.getMetaData().getEncoding().orElse(StandardCharsets.UTF_8); // We want to have successful backups only // Thus, we do not use a plain "FileWriter", but the "AtomicFileWriter" - // Example: What happens if one hard powers off the machine (or kills the jabref process) during the write of the backup? + // Example: What happens if one hard powers off the machine (or kills the jabref process) during the write of + // the backup? // This MUST NOT create a broken backup file that then jabref wants to "restore" from? try (Writer writer = new AtomicFileWriter(backupPath, encoding, false)) { - BibWriter bibWriter = new BibWriter(writer, bibDatabaseContext.getDatabase().getNewLineSeparator()); + BibWriter bibWriter = + new BibWriter(writer, bibDatabaseContext.getDatabase().getNewLineSeparator()); new BibtexDatabaseWriter( - bibWriter, - saveConfiguration, - preferences.getFieldPreferences(), - preferences.getCitationKeyPatternPreferences(), - entryTypesManager) + bibWriter, + saveConfiguration, + preferences.getFieldPreferences(), + preferences.getCitationKeyPatternPreferences(), + entryTypesManager) .saveDatabase(bibDatabaseContext); backupFilesQueue.add(backupPath); @@ -322,11 +344,11 @@ private void startBackupTask(Path backupDir) { fillQueue(backupDir); executor.scheduleAtFixedRate( - // We need to determine the backup path on each action, because we use the timestamp in the filename - () -> determineBackupPathForNewBackup(backupDir).ifPresent(path -> this.performBackup(path)), - DELAY_BETWEEN_BACKUP_ATTEMPTS_IN_SECONDS, - DELAY_BETWEEN_BACKUP_ATTEMPTS_IN_SECONDS, - TimeUnit.SECONDS); + // We need to determine the backup path on each action, because we use the timestamp in the filename + () -> determineBackupPathForNewBackup(backupDir).ifPresent(path -> this.performBackup(path)), + DELAY_BETWEEN_BACKUP_ATTEMPTS_IN_SECONDS, + DELAY_BETWEEN_BACKUP_ATTEMPTS_IN_SECONDS, + TimeUnit.SECONDS); } private void fillQueue(Path backupDir) { @@ -338,9 +360,10 @@ private void fillQueue(Path backupDir) { final String prefix = BackupFileUtil.getUniqueFilePrefix(databasePath) + "--" + databasePath.getFileName(); try { List allSavFiles = Files.list(backupDir) - // just list the .sav belonging to the given targetFile - .filter(p -> p.getFileName().toString().startsWith(prefix)) - .sorted().toList(); + // just list the .sav belonging to the given targetFile + .filter(p -> p.getFileName().toString().startsWith(prefix)) + .sorted() + .toList(); backupFilesQueue.addAll(allSavFiles); } catch (IOException e) { LOGGER.error("Could not determine most recent file", e); diff --git a/src/main/java/org/jabref/gui/auximport/AuxParserResultViewModel.java b/src/main/java/org/jabref/gui/auximport/AuxParserResultViewModel.java index 511ef2d168a..05222c44a37 100644 --- a/src/main/java/org/jabref/gui/auximport/AuxParserResultViewModel.java +++ b/src/main/java/org/jabref/gui/auximport/AuxParserResultViewModel.java @@ -21,18 +21,40 @@ public AuxParserResultViewModel(AuxParserResult auxParserResult) { public String getInformation(boolean includeMissingEntries) { String missingEntries = ""; if (includeMissingEntries && (this.auxParserResult.getUnresolvedKeysCount() > 0)) { - missingEntries = this.auxParserResult.getUnresolvedKeys().stream().collect(Collectors.joining(", ", " (", ")")); + missingEntries = + this.auxParserResult.getUnresolvedKeys().stream().collect(Collectors.joining(", ", " (", ")")); } StringBuilder result = new StringBuilder(); - result.append(Localization.lang("keys in library")).append(' ').append(this.auxParserResult.getMasterDatabase().getEntryCount()).append('\n') - .append(Localization.lang("found in AUX file")).append(' ').append(this.auxParserResult.getFoundKeysInAux()).append('\n') - .append(Localization.lang("resolved")).append(' ').append(this.auxParserResult.getResolvedKeysCount()).append('\n') - .append(Localization.lang("not found")).append(' ').append(this.auxParserResult.getUnresolvedKeysCount()).append(missingEntries).append('\n') - .append(Localization.lang("crossreferenced entries included")).append(' ').append(this.auxParserResult.getCrossRefEntriesCount()).append('\n') - .append(Localization.lang("strings included")).append(' ').append(this.auxParserResult.getInsertedStrings()).append('\n'); + result.append(Localization.lang("keys in library")) + .append(' ') + .append(this.auxParserResult.getMasterDatabase().getEntryCount()) + .append('\n') + .append(Localization.lang("found in AUX file")) + .append(' ') + .append(this.auxParserResult.getFoundKeysInAux()) + .append('\n') + .append(Localization.lang("resolved")) + .append(' ') + .append(this.auxParserResult.getResolvedKeysCount()) + .append('\n') + .append(Localization.lang("not found")) + .append(' ') + .append(this.auxParserResult.getUnresolvedKeysCount()) + .append(missingEntries) + .append('\n') + .append(Localization.lang("crossreferenced entries included")) + .append(' ') + .append(this.auxParserResult.getCrossRefEntriesCount()) + .append('\n') + .append(Localization.lang("strings included")) + .append(' ') + .append(this.auxParserResult.getInsertedStrings()) + .append('\n'); if (this.auxParserResult.getNestedAuxCount() > 0) { - result.append(Localization.lang("nested AUX files")).append(' ').append(this.auxParserResult.getNestedAuxCount()); + result.append(Localization.lang("nested AUX files")) + .append(' ') + .append(this.auxParserResult.getNestedAuxCount()); } return result.toString(); } diff --git a/src/main/java/org/jabref/gui/auximport/FromAuxDialog.fxml b/src/main/java/org/jabref/gui/auximport/FromAuxDialog.fxml index f8cc349381c..5f1bca0c9ec 100644 --- a/src/main/java/org/jabref/gui/auximport/FromAuxDialog.fxml +++ b/src/main/java/org/jabref/gui/auximport/FromAuxDialog.fxml @@ -13,26 +13,41 @@ - +