From bce58bc97b9997cb93b647881ba1eb1d7e2f9296 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Tue, 3 Aug 2021 17:52:49 +0200 Subject: [PATCH] SwingX: added search and clear icons to `JXSearchField` (issue #359) --- CHANGELOG.md | 5 ++ .../formdev/flatlaf/icons/FlatClearIcon.java | 85 ++++++++++++++++++ .../formdev/flatlaf/icons/FlatSearchIcon.java | 69 ++++++++++++++ .../icons/FlatSearchWithHistoryIcon.java | 55 ++++++++++++ .../com/formdev/flatlaf/FlatLaf.properties | 11 +++ flatlaf-core/svg/CapsLockIcon.svg | 2 +- flatlaf-core/svg/ClearHoveredIcon.svg | 3 + flatlaf-core/svg/ClearIcon.svg | 3 + flatlaf-core/svg/FlatLaf Icons.sketch | Bin 21806 -> 23474 bytes flatlaf-core/svg/SearchIcon.svg | 6 ++ flatlaf-core/svg/SearchWithHistoryIcon.svg | 7 ++ .../formdev/flatlaf/swingx/FlatLaf.properties | 15 ++++ .../uidefaults/FlatDarkLaf_1.8.0_202.txt | 19 ++++ .../uidefaults/FlatLightLaf_1.8.0_202.txt | 19 ++++ .../uidefaults/FlatTestLaf_1.8.0_202.txt | 19 ++++ .../testing/swingx/FlatSwingXTest.java | 31 +++++++ .../flatlaf/testing/swingx/FlatSwingXTest.jfd | 38 +++++++- .../flatlaf/themeeditor/FlatLafUIKeys.txt | 15 ++++ 18 files changed, 399 insertions(+), 3 deletions(-) create mode 100644 flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatClearIcon.java create mode 100644 flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatSearchIcon.java create mode 100644 flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatSearchWithHistoryIcon.java create mode 100644 flatlaf-core/svg/ClearHoveredIcon.svg create mode 100644 flatlaf-core/svg/ClearIcon.svg create mode 100644 flatlaf-core/svg/SearchIcon.svg create mode 100644 flatlaf-core/svg/SearchWithHistoryIcon.svg diff --git a/CHANGELOG.md b/CHANGELOG.md index 8318b475..d0e3a957 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,11 @@ FlatLaf Change Log ## 1.5-SNAPSHOT +#### New features and improvements + +- SwingX: Added search and clear icons to `JXSearchField`. (issue #359) + + #### Fixed bugs - Button and TextComponent: Do not apply minimum width/height if margins are diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatClearIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatClearIcon.java new file mode 100644 index 00000000..b756b509 --- /dev/null +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatClearIcon.java @@ -0,0 +1,85 @@ +/* + * Copyright 2021 FormDev Software GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.formdev.flatlaf.icons; + +import java.awt.Color; +import java.awt.Component; +import java.awt.Graphics2D; +import java.awt.geom.Ellipse2D; +import java.awt.geom.Line2D; +import java.awt.geom.Path2D; +import javax.swing.AbstractButton; +import javax.swing.ButtonModel; +import javax.swing.UIManager; +import com.formdev.flatlaf.ui.FlatUIUtils; + +/** + * "clear" icon for search fields. + * + * @uiDefault SearchField.clearIconColor Color + * @uiDefault SearchField.clearIconHoverColor Color + * @uiDefault SearchField.clearIconPressedColor Color + * + * @author Karl Tauber + * @since 1.5 + */ +public class FlatClearIcon + extends FlatAbstractIcon +{ + protected Color clearIconColor = UIManager.getColor( "SearchField.clearIconColor" ); + protected Color clearIconHoverColor = UIManager.getColor( "SearchField.clearIconHoverColor" ); + protected Color clearIconPressedColor = UIManager.getColor( "SearchField.clearIconPressedColor" ); + + public FlatClearIcon() { + super( 16, 16, null ); + } + + @Override + protected void paintIcon( Component c, Graphics2D g ) { + if( c instanceof AbstractButton ) { + ButtonModel model = ((AbstractButton)c).getModel(); + if( model.isPressed() || model.isRollover() ) { + /* + + + + */ + + // paint filled circle with cross + g.setColor( model.isPressed() ? clearIconPressedColor : clearIconHoverColor ); + Path2D path = new Path2D.Float( Path2D.WIND_EVEN_ODD ); + path.append( new Ellipse2D.Float( 1.75f, 1.75f, 12.5f, 12.5f ), false ); + path.append( FlatUIUtils.createPath( 4.5,5.5, 5.5,4.5, 8,7, 10.5,4.5, 11.5,5.5, 9,8, 11.5,10.5, 10.5,11.5, 8,9, 5.5,11.5, 4.5,10.5, 7,8 ), false ); + g.fill( path ); + return; + } + } + + /* + + + + */ + + // paint cross + g.setColor( clearIconColor ); + Path2D path = new Path2D.Float( Path2D.WIND_EVEN_ODD ); + path.append( new Line2D.Float( 5,5, 11,11 ), false ); + path.append( new Line2D.Float( 5,11, 11,5 ), false ); + g.draw( path ); + } +} diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatSearchIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatSearchIcon.java new file mode 100644 index 00000000..1bc726a6 --- /dev/null +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatSearchIcon.java @@ -0,0 +1,69 @@ +/* + * Copyright 2021 FormDev Software GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.formdev.flatlaf.icons; + +import java.awt.Color; +import java.awt.Component; +import java.awt.Graphics2D; +import java.awt.geom.Area; +import java.awt.geom.Ellipse2D; +import javax.swing.UIManager; +import com.formdev.flatlaf.ui.FlatButtonUI; +import com.formdev.flatlaf.ui.FlatUIUtils; + +/** + * "search" icon for search fields. + * + * @uiDefault SearchField.searchIconColor Color + * @uiDefault SearchField.searchIconHoverColor Color + * @uiDefault SearchField.searchIconPressedColor Color + * + * @author Karl Tauber + * @since 1.5 + */ +public class FlatSearchIcon + extends FlatAbstractIcon +{ + protected Color searchIconColor = UIManager.getColor( "SearchField.searchIconColor" ); + protected Color searchIconHoverColor = UIManager.getColor( "SearchField.searchIconHoverColor" ); + protected Color searchIconPressedColor = UIManager.getColor( "SearchField.searchIconPressedColor" ); + + public FlatSearchIcon() { + super( 16, 16, null ); + } + + @Override + protected void paintIcon( Component c, Graphics2D g ) { + /* + + + + + + + */ + + g.setColor( FlatButtonUI.buttonStateColor( c, searchIconColor, searchIconColor, + null, searchIconHoverColor, searchIconPressedColor ) ); + + // paint magnifier + Area area = new Area( new Ellipse2D.Float( 2, 2, 10, 10 ) ); + area.subtract( new Area( new Ellipse2D.Float( 3, 3, 8, 8 ) ) ); + area.add( new Area( FlatUIUtils.createPath( 10.813,9.75, 14,12.938, 12.938,14, 9.75,10.813 ) ) ); + g.fill( area ); + } +} diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatSearchWithHistoryIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatSearchWithHistoryIcon.java new file mode 100644 index 00000000..262bb8fc --- /dev/null +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatSearchWithHistoryIcon.java @@ -0,0 +1,55 @@ +/* + * Copyright 2021 FormDev Software GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.formdev.flatlaf.icons; + +import java.awt.Component; +import java.awt.Graphics2D; +import com.formdev.flatlaf.ui.FlatUIUtils; + +/** + * "search with history" icon for search fields. + * + * @author Karl Tauber + * @since 1.5 + */ +public class FlatSearchWithHistoryIcon + extends FlatSearchIcon +{ + public FlatSearchWithHistoryIcon() { + } + + @Override + protected void paintIcon( Component c, Graphics2D g ) { + /* + + + + + + + + */ + + // paint magnifier + g.translate( -2, 0 ); + super.paintIcon( c, g ); + g.translate( 2, 0 ); + + // paint history arrow + g.fill( FlatUIUtils.createPath( 11,7, 16,7, 13.5,10 ) ); + } +} diff --git a/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLaf.properties b/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLaf.properties index 90c86413..5688074e 100644 --- a/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLaf.properties +++ b/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLaf.properties @@ -514,6 +514,17 @@ ScrollPane.fillUpperCorner = true ScrollPane.smoothScrolling = true +#---- SearchField ---- + +SearchField.searchIconColor = fadeout(Actions.GreyInline,10%,lazy) +SearchField.searchIconHoverColor = fadeout(Actions.GreyInline,30%,lazy) +SearchField.searchIconPressedColor = fadeout(Actions.GreyInline,50%,lazy) + +SearchField.clearIconColor = fadeout(Actions.GreyInline,50%,lazy) +SearchField.clearIconHoverColor = $SearchField.clearIconColor +SearchField.clearIconPressedColor = fadeout(Actions.GreyInline,20%,lazy) + + #---- Separator ---- Separator.height = 3 diff --git a/flatlaf-core/svg/CapsLockIcon.svg b/flatlaf-core/svg/CapsLockIcon.svg index 1c45373d..a81e218e 100644 --- a/flatlaf-core/svg/CapsLockIcon.svg +++ b/flatlaf-core/svg/CapsLockIcon.svg @@ -1,7 +1,7 @@ - + diff --git a/flatlaf-core/svg/ClearHoveredIcon.svg b/flatlaf-core/svg/ClearHoveredIcon.svg new file mode 100644 index 00000000..21a9bf01 --- /dev/null +++ b/flatlaf-core/svg/ClearHoveredIcon.svg @@ -0,0 +1,3 @@ + + + diff --git a/flatlaf-core/svg/ClearIcon.svg b/flatlaf-core/svg/ClearIcon.svg new file mode 100644 index 00000000..092f8b4e --- /dev/null +++ b/flatlaf-core/svg/ClearIcon.svg @@ -0,0 +1,3 @@ + + + diff --git a/flatlaf-core/svg/FlatLaf Icons.sketch b/flatlaf-core/svg/FlatLaf Icons.sketch index 708e7fd147b2082c8fba0c403ed542d95a9a6a7d..3f5c46d7c4ab4db8a9e15032f0fed82cf0c78f5e 100644 GIT binary patch literal 23474 zcmZ5{W0Yt;uw~n}ZJW1k+qP}owr$(CZQFL=w(aTf&7U`Oek7+>*2+mvlG?i}Rq|56 zASeJp01yEGJ;zr9kZ+&>03B2S0I`u6L|@q+JpP~LcJ-sN>!3-Wpe1;37N@=H_Vm}ONue|ddg zwn4CAG-bgIX^ciec^?CXULaB0O)KAX%8-|ez#gAXMMrnlmx8mB*(A;-w%f%&jC3Zp zhpwx#JKNUH%0HPMUO_Dv71q12R`A#AIMQ7;mbtr0^o?42vzwa*iLp!F8GL%Rtv0SI zua8|9Jm~vlP}qkMn1hD)@kQc`9HQk3qKX#wRDqEZpA|Fbo3`QuS^4V4;#6dat&Bp9 z3OHv&2x4h$E0!1w%A211de6XmW>yeamv04BndEFVuj3}FuPv}>tgRQ76>U`y@R)!2 zI%gtA^rkF(YczK?wzVQ?(IE@RNYe7)M+U7aUO>15Kt%R-Z_(XBbPJRMYs{S+%oc|I1bNu(C?;^qRp#e7n`8v7Phu zmXHM-Jq< zonAo*4>iR|9BzN@YM{i!&=tDJSMQwxc^#MS6(O>ND&xa5Bqj9LN#%sSvLzShMWME_ zn(HUPe9^A|3;>5|Z0BEaE^zDnU!r3ZNReSGEmi!NUFqNIElK}`#oWv8k<&ldSCKXUu1#5J<(Dw6qFDhcTX^RglqrUiZpB0(8YR%Rp` z)%ZLzrXgw4apeSQ?i=L<@5}^Yx&I{Z>VzYA52l~A=E&vs=!q`kFQxTOfWSdgsXf2D z>d8SCyuL(0W)QwdZ7;O;-oj61az)Amc_Nx56y+iDNfHrFiqa~SHAPR!x7a+dQp40D zB;f7P2}yDw%4{+UQ(651;Vdl9`7hy@#hT~k(;RQojvL1JAJY%SEly&Zf&eS&rlEK| zgCCzo|BG3ylB!q#_U{AeH`U^Rp&qV59Yf%DQ4#Go36SNiIPrUk zNaEdv7}I6`P9;@o?~hrvjivT5GLYgaiy>T9ajX7#hXsJ+5w4W`OUX>$00+PkG-_J~ zVVwYXNkfkP5H~Ow^N6abHY4Oi*(mNS+C|70>|A^JpbBNNI-?PuvFE=b!up|&S2@n5 zztg~EKfSOkgkN1Ta=kQ$-xY=j9(CJ%IrTFC{3OZzvPvZPee6y9dB;*c32j9)SnJ%- z<9npzckg%Fg@N66?)|B9KWJNFG@Q}QvxgoAbbz~4M>;4HuOeyGxrvrHg<*d?By}E` z)#&+vmj8b+f{cP`7nltIfOHH5fc_UF>>G1q0ZABmL zmEQ4rc>a3x&G~u!A-k#RrTro?C?CV=U*6=I?K^F**-5^1={+lbcvu|2Ti2r} zOC4P$KQXiW0eR1CC0DyTY90T;pZRfMdRrZSJAT^a`||eoWKI8e^mKG!^!Pb>m`wcP zP8Ljviia))SPM zm)mzs-Q>fC2lEHM8vYDlc8^?Y;-T;N@#}f+n^5mv%h)qxLrUo9}gp*IVjN zN~2q8u4i;FcE;`1htK%Wm%~op=B8cl^WgFLXtG(;!({B}>f+}2>%Xhn)Wv7IKQ|4% z3*TvO>^2{p$8YwVReK&1_+;e0-fcO&Cwk;JwS3aOUu<8W-M-I`yRfw-Zo_j6y;;4v zE~BA`m0kAVEp3$-yK<@2jNFY>#+Ozt5x7J8xOuY`(CK7#(-<>U%Ta4~8Cl&wlXu5_ z?|NtCW^8A+cb=q91+4A$CssFcVJWT^mOF3UiKF+@1&x?ja=uCS}$(M zS691tQ}JIXkMD*<6W!E2jx+X~VQODQ3ufqJcC)pAc&Tqs5*HUelw@aS$WnKGIedJ- zYv0lrev^4uQln}NqqCfkQ-fm@s;aT*`SPs$wC3<((wzd$qVU~ z3ey-3%&7b6nNw7-$IoPY+HMM8v`~^GmwC9Pd>FhtKKgPdnJp2e%PEVLcUb4ojU=w4 zhh0-BzRaE&>H7OFZH3Z-5E&d24IpJ37XZCiA=7~(IgFWZF*@D!g4f(qK4|Q^X|(wE z@*VZ346+m*KgQ0}q3w079+RwL{OIzzb~1nK>_tbqvlr%zhqF_c*21*`S|W9~a@;Mk zQSV>h^~vNztlN#fdmy{oF5Bz-=QGgPsIu)Wz3Th*znq&7xvz-Ghswmw^ux2SV!IE? z*$;`IyHR#Ik0_rNt9CC^_S(bPa#Ky4<(! zhn5T4uj7Bdycx1Q{@hx1{+-rr9N4qtv-sX9O`Q&soc(z>cs@8mhvDkiQDDa!`8={e z`&?=Yabu_J?lW6Pfo;#TGWVXBAu==#3$= z5PDc~9(!jJZCd4#Ut2@FV1zAV&HfgoU83LR{W7<*rNdBC>JBclsYu1rs$GvBTzY=+ zYe1v2XG`zGPbt?USNgmgeEZ4yytp~Zo!L3DP^nFc$kky3823_xRoa#J>7~K#{Wt-L z4Am=rc!w3w%CAVy?d7TLohCT*X3N%jy3)v1=Ij1>iCla*3{G#!&iT2RJps<@urLG< zO1yBqw=Mg+JH8pDa`fJ)eg6PJA;-1W?){is-C1}1c$n>O*mdFee7b%$ypKJcOgwD7 z5K-r<3$<(NeZ9H@9$LnCg5XN8zA|%@e=l7&jn!riRU*GhMO+;pja(e>g)LpB{2qK_ zUbqn@#-aP#KRPVhjRJOafW8I?anXpWjZM8fy;{%5RC{oFUL5}zpN@FB$O6J}`&saF zk4yZA#M0~+ci6YAP>q00SccFXUV*e8cv$2`I~x?wizABVu^Q!kH@;lcD=@JJAQjDD z&B$WnO%}Y)M*Sz8VZm!wJe004j8JHC7?2IwKhi90C6qU&3z8C&_zMctq9>E}N*8${ z9;lNpt{sKH1+kzJMnX&2l1zbyX&#D@b}18KK~Q|M3_;KngwSS;!tKT4IW_KiL!;xD zO@WARcr2Y?Be&`oS-icq(GpLORM>xT78Xq(7kauqxTj5c7vxIsT zrNpiSb6vK5(8p~HYtp~?-@RB`ux#8FJ!KT=R`f5{yP_oNyv~9?aMX6Uz;r5y)gS7< zy*D_V-I}+=dv=pN>4f|4LB{snCkqaElaJ7TqF;)qe2ueyTDn2>cpx?BS(ewZg5E(p?g30fNX$GJc+39d0)0@kC|;PeZx_#Gi|z~_jyixf;vm(eT* z$U_4a1Zg5z3Wx^FLmMT16&pc0uva`^*kKlr)lyqx2Uf^{iCMBtY=J2TAG;>3LoncV znF!O@(o0U24tf6;IX1k@A@eA41j9)HD$e{Xn&xaL|KvkU&hyjd{<3p^YfP2Gje1k9 z>14_|$b`3XgiWCJ$#Xx_i3$;FX+`#|p@DctzAf!!%2_z>9Gi9=dBU380JM+-ryQv? zFgBkD9ePK@b-T0M%owgrkx%mwb4Dttf*f5?iFa+|2+C&>n*Udt_`SK$Y8TKjn&|I{)vyA zL?J%34cB%NrgnkX3)$EH)pLTkO z@nAgTx(@xQFH;1sEk?PG$JLjCF?Ip85iB!@r9xj3RBJBvS1q+cnR|yY?;fmbgV0d3 z{(hd8EzKWI69lN%46U0m!LWA9i>E97<gvXXK zES@_74udwZH7TzgS`-|DJJ$cTZst2%gvK$fq-%`E``y`FKxIslERK}zEXH(WE^l#N%X+BwnLdN<;kJy;8HOxfzampNT+vSD_ zn%DAux+N(_BMvYfRrmyh>TN^K`#GsnAFZFJARE&3Eg{Y1YbH6Y4IpkC2%)(Y;7Fdx zO&qFl)&!7eTdO_yGp{4*ZzxU$3Vc~NkYa`Za35x(!OfR|jbpCwXZeNp&8|0JlZO7- zAw$qLo9q-yXj=D_pMLZ_E)+FGO9xz{lAp42=(u`w&9G-pLV_B9n7KKSAV^SH*bO|y z+aEH<)xh;rE>FyE`jG5^GC{o%9qPVmq&TvBQsqKxPJ*8n{Ob)$&F#eixy(*#_7Hb9~l5WGkc zd`04azzdzj6-GrWqcm+nyU9B?+~g#Fadq~Q~9wWFmk8aO6QUMhVb#(>e~2v&9cXxa4BBsER013Qavo-3mJkobp? zH3PkU*U%mYXBaN_G{ z7|uc0Z!Yo;6;q;Jb4;N}qlCITwc%U;Q|@=r)<>axtXSA_W&%fdysRdwY|qj4LYhd2 zkC!P=BpX!+k=o0GN@ybH*b8?)I(XF|k11ZXcnWSjdM~3VCK`+3mO{O?9x9gBy_Ggj zVO1AHp%>qKm7ccScJE)KzdrBBjJfH5IKo}Lsf(!ssbJ( zc@m+QnQH=(xQ}eeCKMIQOn4Q;bVe(x;`63ur$iy*G4c%>5Tq2|;qn1`T!sVD>5Y&| zjVGY%FOe-X6Wbthnujyy*;|6nvO>$ii4v@WhHCziq;h1eN)dUe0@MYmkeZ0VV2BQk z`Ut>ajQSiHLgtAH5wwgb*xqV46LFuLT=p#{gEONT8h%4+MiAZ1zLF-L-mKYuR+#`s zWBh?;CMz+{<Ud}+97BF$`Z4CV8%Oz7Y1o6Rajc4mRj@M3(7(sEoP@i0DUzBhZFj zb#`oXe~q=JI|}X%WaiK}1BgIj>){wZjnr;BT0;9*wRIkNagky$HeN>{!q)aAJVJ>c zVMK4^HMva725z8~Va_5l%%C?o;lsp%J*)dB$iy_g3XLn(`Gd{1fv7-~f0ZwOSzG<%8{KV;V@VBF5|xPZLwT*z1$TBk8w>hCPZ+3a*)W>N);nf7)nh zo&9uhm!(jlc6cd7XRrN^3qBSe;vhaLW(W^(8iJj~?~1C~Pz`gN0c9)@JRlNcIVmbD zt}3?-z{Y=mnSCRj!U47;M-O3}(=LK5=h_kQ5)QGxAn??@;4@pYqLYZU;A^>dig=vmw7z2{u1RBbKhB)bIK10c5^mzCxA5n7QMqY|TIUmD z|3Lhh*4+Fl;X*m!{jgtQ+1hIr_GAzxH;EwrB;0uF6QYJQq{cl2VMnr;E|-lwnEz$I zH()A4>paWFbHWMsll7VREo-L0Q~PNzZ*~@*n?c92ZSEd63*L`dU<~=6A|;~Z5VQ~4g9rzu|JM_0bA8dgOl1X*R|%$E z#@+LXiG*1V>>*c-o6v5jr$F{L=%EKl_hD~wQmV6w7P-sQ{JQKmVl}v0Lz|bb@o8!2 zW_lNC$`ESJpT3Cz+an;2*N=wE12@vA0X>Hrxr>O_+i2QV)qgX%q<=rmT?nDw2!)V{ z-5?A`5pTH2wNAGY%Hjge{<>uGARD`2N=WzlP&x%as`HZ`bL26VeGu*(d~m<_!928e zR}9Eqk<_iUp4K|cAj1$&WPmP(iV)Y4f|%SAmqe<({DLe<2~|wtJvpfmp-C~!c;JJL ztSe(Q^zgq-bwZk>li1z@T3Wo%X>6`@Dfhe>hXBP54kPlsFS3Y>{mzkFUHD|S9iCmV zRt)B$k7=?+p*sJ~z$o@ZnKD=_UoVj8P0)1?M`Lt2#YGN4PtKwKZU(B#=|(AV8S3Vq zI7HZy;O80auA0kgCdjpAegO z(@LTFWu9k8*7x7jFG88YR9;zBotye;SM)H}va4SnS|w8%nt_y98PzcAsDN@JmG4R2 zu{hnnU`lA(lQr!iIyaVn^PG9SG5nlMR3l5t7WC5T3?>7R5K7O%=?$Q6Z~c`%^ON8I zwmvg9{q^lQ8a%E=Fj4iGm7YBgNO&4-BsK2##1s-7{dy`x5dQ+{eQaDgFVCMeL**yv zEUxB5(OsusPtk8uZc9($nirL)LwfDSi1eAEW>%KCfXXR%WS2Q>(K!^%hl{?j7BAqj zG;2AOf_7K?qC2F@$T(CZtU@`=`(Vh|DKytzy=RvaE+vW(B+|UDbj3txEXn{3Q^Rz3 z4A53?gXu1lfhQmCWoBRPmG{R<%Fks$7pLdBPy$ha$cKfH`UwIAhjju#0ipm=JkO|k zX)JEA-(2;>IyJsL+b<_}wKk*QT@2K?`wR5~QB2nvwcyO6`~ zmr$PAIP83LWwkP<1rIV;-=V6$qjK9-64$1}9gjHoA3(z`fnJez>aPzj1gG8r6;}%# z!w|)1zo~(r2kfk(9N;G)2SAe+eOinRxE0|2FB^BRlQOz_KLfe_z(wHWEGsIgi|1V@7jCL^lu_;Japmqn5p3m?nd#L=^k{mMf~Z>V5HfKirqwC z0>}AeXydnmY3>l)Pq=(!yYToOq`xa~wQ}U8qdIA} z&1>WxGMjrC#Eiy;MEbZ5fk9FH#@cgSm6j4)C3;S#7gtmGxn*u{$(^dl+$ByE0E*Ln zJDe1BDau6XCxNHi1#Xcxi!kk zMpJ1C?M&lkvteJ?DtkMt$^D9!I1z1^-qKsIc2?}O>Y1lB4)NxqJh;~!f6Fb=+Xuah z{?NozUuT^@1O9Ct_x6ZMmxA-QhMON3wDHkSnfKJiq)VOm)XT&UvELwD>yepzZ`{Nh zyLW%TL9YoohX*7_dt}nNZxYTw`Ti@7^S3eT)Q>#ns{r@by80Y5xJw$nYPHKJshfWt zddrZ$Znjvvz%fn>(yt$UkFd=e-=KfU5ZQohuDg$^otKxh8|$1b(?7HkbIf2h)1Nj! zatFaU3PgNf5bI#hv2j>*Fhacmddzh1J5=F$EIFPv?SLrn4s*=VAEl9=cO`{K3gcKU z+uNo#kb)YYQYB;{%uk5pct99LYLDWL$Qvh&Mi zMnEQ`5g9G1$U_sLEy#tmL|h^&6qJwrPprjke$6u4tIChNhAJr`Y-?}Ok9WpmQb{s| zM{n+84A2_cL#uv)X+xPNOD5#5!$jg%uM#o@2XD5t+*wKs2Wf+_M?{tJiv&Q&L4aK$KkqA6*-OJUu64FA(Vx_~9Moks%%?QG^RmGI=WR7&45Zc;X;uP2 z32$I&wZv8ILo^{934o?B4N?c8AFn{@Cjt-&kfH{w-ob{!f(D|d1Y{j}C4(_`SyWgU z!b!=ymyHJL%nsFhnHj8JJrZAzs;mggfCY`x7!aYG8AWT63EB!_iwG-YAGwEyi5j2< z@+*2ww~?Y6MZmWJC;tPWCKKoKDw{8wP|5ta1$c;tvc&|}dYK)ZCWFgo#44Y8-B)}D zR^I`z6sxM-XGnsb2Y{|H|KA*c2iGU^JL%Lx87v9|0aBXNvAR4?aHH(Iy(SsI6(R;q z@EP{xz?b~`nI7`U6j-pkp$W@X#b;E#b zUuk(A#d-{gf)W^vb|B8={(PH$@NDeFHSbR|MkM6Ni(hx{?^bbL671&;3rwVHFcO!rsH@PtObf0=ULqRAC7pEY&wt$2C06 z1ve@uqJWWiZUkrv3n6b2wTXxZ@1gb6259NB+FC4m+v^HM>r@LDVj8Z1S`W@8ScG?_ zLU8M0+pe=y*E0;278mfh%L5iJ$4N5dww|gdM3+UQ|JMr(%YS|R4$KzuKM_Y|SmDXa zNqKn$OD`$3BoUZqhu?8S;Au)FImPjh-(QZ#qcX0gk}R0A>(6^P2PGa1_GLIPGuw)l zs|lIrb?Y^yV0k03Dv#T1D^N?Sm5|fwLb5*fE#;RTnPyGbD(fI)@Q-jL3<@V;BjtY6 zOrxcPl6NRb@#>qBX-rVghb#6EG-|nvl0eKYBt_7o6u)`!xe<*U@6oIAF==X)qBz?B zS&m=drFnJ^2Sa{2zl3-u|a5fe@nb0bFBVn&?;9wgeO1@72rjkXyvf%gQP4cBC`9(pQ8+2A3 z9Vksk0hky7D^>*X1TF=0WyL=ESA_Dj{ht9zd^qapE-O_oiqx(eIBP@jvVwpm4!`*b z93+=zS)>9;>h7PaCZbqMumGGgxph(|5@utPSin#lbjNiF>MtyfGw#kc1H3j^;RZKM z?F@F#W0-kRP;+cxhlM@?Q0yv~jOMAP0ZHf|vZ|)K1tzMXWITb`8XQ;kIaLnz8@9R7 zMHTz_&FkD9JE5?e@_saw+YB~a^LQQ3M|VMNkGH;UO_)kz&2ldU>;o08+rqj5_nV~l z?UDj&Zt4k}Eha8a+w_rnFY(I4TPJSUXUu!U1(z-OmpFe)O2!PB_Kp}BOD0?t6rfmI zk%?kWZTuI#D^kboRt5fxMkBLpY-5`lQ{fwKV;MmC_>i=!0QIZ|UW+M#F#-Rof-Gob z)G?|;L4u3MX2Ur#LidY58luHfO13~7HbB_1yU*57uk{DI*!mmoiRZC~UPLYAT5CBJ zG3BPE{*U@z1?hw%NQ9I#S*XOMTuqCQ2kZGDU00vU*@_~12r*2M z2u9#kL%W(sQpOx0u#O7(rR(|Dkv|eC!`Zv9efoAv3}es$wQv>pk_hL;8|AH=;@gFy zPoI5vR$7(hb8CIi7oPqvy`S^)zAx%*Uz9$PZA_hC$7tW>#c1g$08E~ZldPLloT|30 zjTB0^4W3877R2B&cr;eVVJdW!BkVec zfj0E_eN}tw!wu1G{co~(2a<#uli!~NyKUxo6soi%9(@B~lzAbgy z1X;Rq7|#^pgzse}WinBZG~ofzW5HpqnLJyuU0DXt5C)6E!5>8l%<#}^GK51DaO6Ou z^(V)fiYZea7seFUkBvPn@X7h%??g;UQZY@AbM5Y$L3r4s*N9Muyj4sMw1p)cgJ-}} zSU;I#mNM*y1ee-AVXy-to}&A&^8W2Bm|W-AFk~yQZBFkL6c-w?P$5h?P)L;~1F84= zf>Q3U&vEWl0d=V`h9L`6Cngw%Q5cRc-i1YyU^Sg(rhuzMU*QDIf*m&0A>D#b z`uIhw+>T>Fgiz}%!74gHqMT*Hl9_2E)zSF)fyXJxl_N2W%$1=Kn1UW<`!B4S6=v1o z4a46qD<;AVlWej(CS(dJ|E+jhX6*|ARE)+_W>w+dl{A$oCqF8hV-S>u;-oAT!~txz z2N9OxOuft-xdfyJ&nx*;cG*Y-HDX*}`9m45ksu3$7p5xpN;{OE+UGM z4qbxEL;U||tSbg*PxTF@+a)fL)vx-EFvkUCx0ye3+=NQT(XaO$XOCkT!-r4FuQd-r zL8ULK7`+rpp22l&Xfc6$nNW%Yp}qmhMy4-ZU1Piq0frbulp(4JAaxI4PY=qTt)j`4 zATGvl-B>)GiDGsfy@IoVrwC=wHz!NCNN#oY#0=@dNY2P7jT^znv_=y5X2!m0p>w0U zQWqYJ7&!Bn1q~w1?Q+d+U|Loaoe+en8~R*IOvOIv#me1;62J``Bl8?3vF545D9iZ! zMRc*MOiQc757+J2HnKtOzOHF|p!=*%9l*ms3@z0^l+Bt#gWu;k#A&cXm0=6Vf~2+a z8_Vdcm~+ZA3}dA`1P7wDh;WGS6PPGNfWLWPpHqO;&acfK+k5W)Wt*gF)DRm{ckIV5 zHEXRp*)~PhD{4i{XrK_>yiIz!xHsP}ZQZiE3+uRe>)^{^)?WQz_c_(CGvHiz`yG6* z6**cjnLa-b<Pg`uZm_yuGhF2(uylY~Er> z4>Tf2ICrP0LyeuUb#$Rw-l1!kV8{_Tzjx$$sMyUFn8@LkWd!K+^C0cs3P%k-#8SfA z`eA(t{)9k6Igmnlk&Q7)M!qad9OgmGA%sSLpt(xR+E>@D{1s1C@OAMgM37Wzq%^ zTFpLaWSyKTS;Q}~^_yVBGy~Mj$f}i~M4mN3s>7(r&3|8vmBpQ(N=diQDn~*;JPBT! zxz9jUR6y4%04=i!Ibjs?BPvFO?msfw6_@(R+drqBE^%l#x7XUw4r;1Xyc>rx*j-P|t}`nE@?;w!hj8@c@O&%+@}RysF&uT)rg|g<0?dvY~oV zRWPnFoMOCY9aZw7E8#?WZwQatj(4eTjFOKz3ZgjT(Y z)t5YI-7LcF3%}tJi1P@YV}J#tPu2ZtO{rI6#;)62AAik{``FWk@jO9@gFT4HEc`e zq1}$zsl{u>U|_=iB^Z5Aj6l?5Wbb_@yDg1u??w$U{`Ma`vL?$x0$sHc0x1?8>o680 zy$CVb3*ycNP#^BnyF!n|Boo%e#WSCO_t?srAx{~CD{dPPV$JMY*OBx~Mr9g%A5Jvb zI|K`@=twUP{kB{ocK@jHO$*&0SKhb)za3!hK`{^3(#<(xdfX1O9C3v*;i0(AwY#yZU!>O zY3TR|mee3LWnDPrg#4$2edhumeCCmGGfu|;TndyW$-hnmLgGWcu3b40WX3ysMERv; z8du33wUYX>lWb1;JmDW~Q4RDXyppAg4l#s8i8Ny*5^x+kbEKjnnv2mc(cPOH>9ys& zrS!!fBZZi86|HEJ_6s z2Z^Jh9neq&<&mNC=$4g#_=Z+y0J|*z_+cJNmGHv}CCS}yV5NBlDHKdT1CSy*i|s@} zL;2cK@;pfn7LWu;0t5+SuOs5!*8?^B;QnU!$#JwjlPPhDy6+@KQhiO?T?x#jg3FrR zl`K$u-ux6F&%&YIL0Ev-ZOch-u2{t8fUwCMgO4=#prajPuW{uSoaSF6J667}B{V78 zq+LE2d+dy8&v1E%fBT9ftzJ4FosFt|nzo93yoq0)%mSQ&SOrhGmZDSqJ7)GXD!4|` zTxCLm85HtPfq)+fL)LI?+cc+NDApS~{xX?5Mf`YkmSD=1aOvfc;+g+6@%xQUex&+J z%nyLrK&>Ofpx3tK>eg@I#A+%dQ=;y1?O=9)ed;9>yxyy6Xn&M9+_f8ExB?k7QJ+I? zG5tAK(3?f9QnH|Nhjs8L|AvCY>_)nmDh#c;A*gmBu=6|+cFbJCJ>a?% zF<04XdE()u8$L_xr{ zvoC%}p+-i>i!~{0B(m3PIurm+e18G*%JJmDSb`x4l z`EQ_=!m!wmxmD6I9m?g`)Vd1(S#e`$hPp}v7e>wo?;}TQMp9CbX7wv zDap^ymC@DVd*|fq%E1_ErshEqsjT`z5bFXYHHB>rEDj>&HlI4MM|MA2B$cI1v1d5k z9h3n$oC3s+eP}x%o|M2Qi%k6Jxkj%IFJ2`ssS(g^p8}BxPy{Ccnln`el2iHY*eG)m zluM6r8RSzOwWPqn8b7uij^uU0)_+bHL{M3P$y5NE^DuOhokaHhStsd~Vwlq%RzoR`eRvvr1F${SUAVWePUafD9!NX>0!onY=mn z;EDDTpbQX}a9fHz3I0SFm~o?b6y)6h;RmIOQRdnenBFZy&n!4-*8zJv&K0w35#BnL z@Ym$S->VwfB9PuGNNtB}lf`ViW7G_3;5IcE!C8eN2a;hK)}bT^UUVB-G@1p|;nOi= zookm>bEW-OENle3T%~8Q3_HS4hX-^aNdK-hyUz8P~mvv%NqDKqVJ>$AdWzC02#L(Mllv zri6Bn9BM1Ixj@Fm))4_H0YK9#gumGQ;>818o|O^&@cwuO5s;4vr-b)(b3%Ec{IP?f zcnME$mC)1+IATTW0#&kL5Qi?6)X8P7LI<^D0_lfj>iG!jxh?-MI-}b-@+IkYqPUNoI_~_b*8wc*8mbm z05$;ybURc2L$f!PcMs5F{nbua%uQyh74hp#qJKd>g5xC2&=pfSIGYroAFlor5H98n1YOJE}FJ|>cBy!kutQ@jsn^rJ#3ZNf1R!( zi!Iq!{2-V5d$5QO(VpijpynO!le_)M0A&iWq0EuyNPva3KSny9En=t&>3(qpx>W`y zsRCH$3uEBKfULd-b+yOFl~Ain^&?C^@nS>U8ZE&M()xJK(I%%5(MGn3Q=>^Z6Zu0k z-mShC^+U71_6th;11Tkdl|Y|rv5g3}UBNZGaDF=|d-jo;``5gOEK z0XA~zxuQm-_>wMBLVmPemwv)1V|e#43G*%x4=}00Y?NWfsN!Gr$;+q<^$}MZWUsT5 zSN(=XWzx!Wea!hQkjXHGC>WSKlDNy#T*8kt?`boi6p>G2_UO7>-?BPPxHvz&TF$&s zrxkQ;Sp9`1)(cZVCPWasKt@n2>-V^=0jJu3#UOVaSp<0f*IZ$t=dX0=%l>#&@amZ% z=2k#-JuMlOCrF?#5(u%3AtQ~lTLLh#PdjES`J>vj1V(@`5`dXotp!sn#mhs^-NDUfbyFXh?CBu!j1XI`bj*xN|FKZhzmrjD(B5 zawJ=gkQZ@DO9pw>0BMT(J=WmP#8&V-AR{e6qI@*=hLxz~V$ zy%^-!7DCNE4pks1PR*fnQ+Fv#R$j()!iH;T5* zBr#wx|0c6UHt-L@CcIoaDx8)In8Qo3qfdL+vN&DI9BE@ZG6V(%b66{a&Iw)joJQM7 z5=}>%(nUm=|0_t3?29zzUD&wp`Ci+-h)+z>kUgE;3?t>cYKE1RW`okJ(lsX2(TEdWSCBlt7WDcIA^`aV-gnuyo!aC9P z;S}N+Ci(QLA|q4!GbY8l3QpBAST_&BJwB#m>5V^ ziUBH;brZF$vfsqtDrM#R!scbf`sEOmPw;weNm<&K?{V@oEG)&ZYBqhG`)Ef&lmm?H zL9LiV?tF-K>NPRaEqz>!`q%PY|LB~u-jQlyGX{|Cg#jW@O@P#Uoaek{{29!R#RSR? z!rM^4KlrA_fUHdZ81dT$lG6?f?oFUWGJ7m7&(w(S_}q`QC0gBJpoTfhNE`z8NopLi zjm&x9rXbGaul`b?KT^%kr(Mw zKJ<||)QjpS?{pH}i)Vk><000a1~v&78>fDtc)Po+`8jy{`1ybH$=V049I| z03d(!$y}UF9RDX%j3-ep5{DCJxOYPFM78dFt>J`hl8qDO8DY$1UFfDLjm3Fka0(;= z=3!ecIk-Em;Pp*HPR?hWclWy2ce}US+O2l;@Xg@I-owYER}Zge2*2o_F1O`t^ziEJ z_;c3f$NsyW@9$Ra$JgZXvrXrR74rBW6v%TXurp>M+Galwr;GsRaGTO&B^E4g?H%BI#xl*{e zKZqTxAdB|%#+ss}bqZ8Wim%j?1T1Lk+)IKS4jEO!K#@RcILs)Jgc1RB1vaP22+b*q zqfj&s#JSS|sd90yQ6+a#{%dn3ydBGZQ9>jGEvfL&~C5b#-QO3KaJcVvS8~ zi|RZLyozHwjLlFb@o7^M`lG?RF3a;O&P{_Bjl4X>%6}NFVW&a_{)@vb(-LEOt*p+wUGRl83`e~v8? zCa+AEEy~2SqsGV-VX06A8Fpb&$~(7vI#3cGbbbAO|M_~o^5o&;y~%Cue01HYh@zww zJUXinodo3?fkvPXYdqQqjXins{y{sL=w%I6ofQxK`wy16QMa`E!F z^U$rHSVQ5ox3RnX>;Fr0MA(o{paB5@Nc+u<|8HB`m^d5!&$i4~nY6_gL-(HrPi3~=qZt1AmXx4!o_I8@T+@yc<>qLb+EU*h*&Tsd$$dc6X zh$V1}%9B(^aG%MWv(Jf^oxeTXs@Ycc+~zU(9DuCK4kVaB$o@^!jn5;|?88A&A0sVf z>ltGKrra*^xjfG`S-g3fwK&Z=?=d|2t_PnWfL|_1shhgQQBt^kAn*TKi?_tgc zM}I6@&>45!3GaNm7ZaI6HlG*gtMLV!p0H2#OfOF)99-%a21q zWLS-jd`Qm`5^*a@oQHJaeC)r46*jX-6ab*M5#tmb6*%cfHwls?*H4*5XKuiacFu$2 z>x{=G)#o)d?==YTO=($5EC}vzcCLOY;hvv^AXdj|V$5kLL@83;%9_uW)R{*MC=6sW z9SH5>pW83uj+7T95`=Gz2KYw_3qb0MD@gb0ps330ncSO!w3AtNSyt^QG>S`NC3CW> zI^0gkdu8oyaT#e-onUS!D7;TsJnHLJp-BLxA{-(pkloi%k0k%;ma7HdoKXF*A8UzOG{_Pcc78;t07 zu$-{bio0+0@bd>)tW^gy^$1HSJ*mjXS|g2EvvYo}V?K`XzkMrpZPxlm3*B7qlMA0F zmk`znJ;lHmSK?K(8wX<*RT=$VsO67UHBx>xrl3uZfoRR#(8xPSrvBj|Fryje2gT%< zN|L|%o_*wYVP{qp3n2Wc(cirIV*7bGpFF??^QC%HGBf71h6yQ-kxXh~K9?o_)q&|- z(1S{>x?bWdKHMjoMN*}E7TM_0;*r%}7W*~y&eFx;)>H%LqQP=4eHC!S)9)G8#*q}+ zE<^5O!<)+v%LI!a;81ToVVkG1D%9I6m>;CDM@XpU0-hd&!c04tfw2#iV+xd0K`-Rq zHYItp_eu~#aF|)8F@>Q#C#BSm3zw_pJwLd=V$ajp(3BGSDQ=S5_^}GOV2J92XhQGr z?)F?KCw4_Ainb&Bx@Er}dotLU0L6_#`YtN`oNda2;(=nhzjJ5d0V?qqe_SSkGxqS~ zRAi(@&(^vvbsB-of>WGnpjF;}W$TBFSdV<^>AsGR_TIa@E863LVK*D$8ISC-?|!e}Ca{aKw7o55luWlZ-%QQA;zwMC>zz0c*#@Sgd);Dj84r<$DQ`z-P^H@gDjODr_B`9IBG;iOHzrA{) zoFkH=RcoL)U8?-mrdX{%jkFFdf zsaYd{GUTk!krt|?K1mBVpo1f?R!=evCa{PKFb(G*XJK6f^>T$XkL|i!$5>%h&YyLi zV~Y@z2lT)`wb*8p+z=C@geoX>Wy)Zr)yR8`OvGg~JQwJTuxq=V)sGQ=&huA{*Ttl~ zH`qe*eeOh&R^<~fhC=c$GK?hhIgrvP;U3NuIgs=T(=l^ea>-hjJio-Y_V$>7!{zq0 z%&e@v1bLca*isM(rnS!d;n-r3U1XgyqB>l7FlxBjG}I6t>CVA2 zUvDCZqC*DFXx*RLPMZ2<2IZCV!-%QVO^Zrc7#5Ja93sP&h279M*xGvXJA zTUDGuM4sxFq+3SF&Vcau_xGp5BxdxXeyyhNb3w}Fj@Y}a+J2VY8l~a9XXkN~hqTcX z>9T>1(n0%6})49X|MNv&y%zCZW&jjY~v3yEOQH{%T%VPN|Y{TbvS(tSTHdt zE9BG)${A(rf7~s+08ufwX9gtTnZ70wX>DxVHsJ}r%%({5i4n>Yu%8-qKWc(c9kr|; zFE{~-CVwgrk?pF!B7>=YC3wf@SjG$V%?|Y?Vf=k@MrsG3Mv8D;GfUX!l-2i>;dy<`B=|j_lO2W(=UQRKVQDD!+LZph= z*=Hg5x80BI&H$@qg%=nxY&~>|%uL(5zL7HYjv5=6d=ZW9L#Zv7qDnJxoUo*4QTOH8 z?ewQ>ddvjk*L3R)By%6x$xpDu%RiTgte^bgH7<_Tz8`${q}R{ZZNnwgZPAqPW_Xo{ zUPl}+>6VdJ-=RJ;?lBzk)35Hmr1oL;X=Tr4VlnY2+)szywQ2Y(bhO^1#_wjkS_h`V z=Tgzjq+ahkoHyij?3(0n#BRF9$td5J7^3ySpO%32{kzdEv{(Pgp@9zK*xq?i>VKkybSw4*cbx2A}0E!sb!a<~Bt{7T&sl4)*f znI7is%x-GVJPKBDtg+|wTNkr)S%0t%x3UoWm83w(MW4RBc)Z+>Ln}zM%F*&0bYpSn zp?}@CaLzMNvV|C6`rQk3#-SWMJZdNlp%vF7a*Bq`vfd=QFr@9G%kzAaag&E*lN*wB zpCv~abSq6LFmFrJyF@hB+X5qf5PrG~%Khxd7H>Grq1dUTv6(w2l3lQgFckp~zj#DF zm>As{5ImG-d>dJNvmpviY9#Dl1r=k%LcZYKr48q5dE`H@-=OpRwiUL{yC@(=1ajkB zjKNuiTD2fCLXN_YS{c?NAnz#>l+ua!xEM0(sr!rQDzv8}eVh-KlI>Z`+Xr5KGBsWy zJVg#4e~2+vUQ+^ug2+Zo#+2nVAg!L0@}&c6Ouh=~{J0 z%I4iTJyC4Iw z_(uAU09%m3bt0}aeMVO8L`09O$YV?#08ut&mB`G%;p2uJ$4!@RQg06z)aFeX8I?2m zT>^+wV(4hbq>#gVW90rzYaGlm3H4*rEe80meR^y)Tdj-nbs`Sz+A)!1HknV=`gz!o zQP&JW^5eHO#_q@DUb>6{CawX&L|Hj5G={8k9JEn+^ituv_v751#I9^DH)VO8mIh9d zW=zI1b*ZW3H{o?^P5qJk)jBV<0RG z3)U*rqB8+)(t<`;5sHmo_dofXpx{B>=0jF~){id6fxsp|r(}__01yKMLt98vxZiiXQ&#jay&h5Btl1v72w=;|c=M!*elDb~h=34s1E1fv{hio1e_0C=5mu*g|5t z2m9;82h3S0_Fod1mv3l)F^AVse>-)Ac8p7*m5B-ZxBOw~bmSjsf~>sA6t01lN4lcW z;SSHFbQ7_k0eZ5P@S?zL`Jj>E?4jk~DD)^T$M2=8+Wg=X+F8X%F6%G6U*XcDtWU4c zT}B6IB$TkyeMZbyr&zIMNiJaUQ(V;rMqpaL-QDHGY8Kknr9*OgIs-|D%S3U`@e7w@;%b2!_=b{#TiL&f+fSzS~<_m`)o|&^Z z0f#G2%Vk!5Gn*5^3{z}3F&`zl*ksonh)8_e=^Xp@9S?@d5MMynKo2D)C9BaPGPj#( z>sz8dI{Hvq84kZ6PS1akyVZ|{lwiNyHklMNh;*3=LCtf1BNHv$*|dM6YmKl2x)E4m zG4tw3T^SP-^P+v$wDBfwvAnJ>kCpY!E{{EQUH;DkS<9`^BO*x-?w!io%BfocEtco8 z3U?_}Q)>HQ##fWmMFdUS)=ESlbV$!RMta8FbIXkI%amBa`E5!_dEd^Xp|IONo)D|* z#h~4U*`mg}JwrXdK$@EC3u4vfb8dZ)w}KK4^qlGdOfGg1q<6*orx8jsgq@7TsmqXM zL|q7(4_o1f0!Xv()BAv96tf650$ zW38o&J%9eH9VBS)Fbrf)7tH>qB>{*wkNkLB-G{A!GD;NJ*QGR3MoK027bq#p$|0rU z(2)IzQyNKkp!7e!+pi1tjJfg9kPaPQtAo#vl(*39_}JB_yM4>%=99O2JN#qqX`knhX`@I(8@QFD2uFoe zb?R&Ncl9t{>Y4kx)gq%Kq?lx}o^OlFGUk=4cj}55!UT@y?{7)f;VVK^?9F#V!ry43 z`&Rim3Ep=QcwEYU*a?;3&CN$aVB*5-E>#`sLkK%+g zz&rX;n0&VtO^Pk2I5KS%j%>U+6<&bn z(!}&Q7&A{0x1SWP^iZ+?tgO?K=U0MS4xT3}Fgy$G-7vmuk4~_iRSB?aSp8k%%Wmz9 zkzltVNTW`}!F{-N2dsI{0N1yrVpqPNaiv(ra(J!4L^v4WH4NHXpQ`aEkx!Wp-MVb7 z2j7>rA&-_XE~)J=RO2p(skQF1Zym;{Zofs0J$xuYtely+HY560)hMr8ks2O@eo6tQ zG7CId+Xj_Ag-PmjpY1ha*-Gv@ZZ?>9-OZIkO?4n&s&m0w#{mV7>qqFS6e1QlRsI%P z;GKw$zzjK#8O-(f+uCfXv+~0PP6tJQJwB}@mZzyC%Y~6&w}2mjtObD_{2sx#%GclX zdr*5-NHPz3_7WNF+E9$KT8>NIUfw+JFrG^zgjnU9fG+3S7psPf1pJUfovvp38h()1 z^oxbRdX%sFhWm6gkw=DQR$UMrfPfa%7C(jO6mZw=wT;GnPlNdMVnJE;t~s3aL{N z_ik;N6J~bQeikDAJj+Pa;W?;0a6n{GfC_s`{3{gcS6mk3vw|#ryT~8YrkS>?#8k9z zco2?Jr0w;GBn5C5(hpQsBs7+E8$mXVw<1K@w8L*Jp`WRpL5B~lF?hxDnyL=KLJqg@ z;Y6@gJ8o8-U%2Ds$naJ3CtvM5q4`uYkA1%B`*|r+FMIrCQrLIV(l5L|hECIGc;M~7 z8I4cno@vOs1zsnpC-4!7{M5b|PEppQud$TjI$P7z6D{thgN}IWzU1%u3Hmz;n?{qf zigD1__$ovF9sQP)6tIDUc)6#I8KE)Qqp|n#k@H0G0`cbuEZbcP3IVeZgdnZg7hi}M z=~Z^0&fulKM=XX7T-H#PO|cyGKa1(Lx%b!K+LYR=UkH1}=Vj5dzIuY=#w!a9hRnH; zq$J1HT^>ErcPLDZSeT{h{MF*$ViOld4sQKcN#OF*C1-z3j0}4U+IWxWlP6!Ym&tR{ znr<!={%Rt?z0{VVeU!f4 zmJi<3YHaL*TtD8_OMMHpqCEIezsHDDKMDU|HHfMfCDK9v>{tI8H1X$thTDDZhVYIu z>guZF6m`&vp?&@vO6dr1DKi=VL)vBF5RIjy+Yi>LtGWsBRL3qmUH2rTZPU5_0oDLk z-E^1bG5B2@nvI4baPS_f*q7ZGW#qB^;!e=z!Oy72S=>sh6Rb)gg2hMKkIj>l(avpW z+pC_f%TpYC|sVD6Of zbgfo;a2ARCb*05OQrEm%W1q&zg~-pRTANIc7gcjLgIEx6tB-=b^uCSnH~5T6Ykb{( zy&T2>d*2Pbec%4b`F67Z^hWwtWkN1=nHE@aIa_I{rYCt_p}+U-&0q@T{d!)F?x*vt z$l>wXwiO*^Buf&o@NzLM|MCr$)?_+W^8gNW^f`ee7BMW=`=)0RVyHZwD97b%e-B6Z zkoi+`eq{Xk`XI;E-WcF20Beo@D2ib{OnR)@`kCl7uImBQ>nIpvz^mhpVx-X&Wx+DF zQjnncO6Vwm?tdLs`tMluzs3Jb|3{4Je?tEmZ1gYUUr_gZ}};1^y>L;s1vHSM2{^*uRpI^#9!#@Lmb)FX4}dg?bcFU#+3{xAku+ C#1!BF literal 21806 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 bCjZ}ahB_MLzllKrIWemdzj{#rckf>Syz{3C diff --git a/flatlaf-core/svg/SearchIcon.svg b/flatlaf-core/svg/SearchIcon.svg new file mode 100644 index 00000000..08fb4505 --- /dev/null +++ b/flatlaf-core/svg/SearchIcon.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/flatlaf-core/svg/SearchWithHistoryIcon.svg b/flatlaf-core/svg/SearchWithHistoryIcon.svg new file mode 100644 index 00000000..23903a08 --- /dev/null +++ b/flatlaf-core/svg/SearchWithHistoryIcon.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/flatlaf-swingx/src/main/resources/com/formdev/flatlaf/swingx/FlatLaf.properties b/flatlaf-swingx/src/main/resources/com/formdev/flatlaf/swingx/FlatLaf.properties index b15408db..54e323ce 100644 --- a/flatlaf-swingx/src/main/resources/com/formdev/flatlaf/swingx/FlatLaf.properties +++ b/flatlaf-swingx/src/main/resources/com/formdev/flatlaf/swingx/FlatLaf.properties @@ -42,3 +42,18 @@ JXTitledPanel.borderColor = $Button.borderColor JXTitledPanel.titleBackground = $TaskPane.titleBackgroundGradientStart JXTitledPanel.titleForeground = $TaskPane.titleForeground JXTitledPanel.captionInsets = 4,10,4,10 + + +#---- SearchField ---- + +SearchField.icon = com.formdev.flatlaf.icons.FlatSearchIcon +SearchField.rolloverIcon = lazy(SearchField.icon) +SearchField.pressedIcon = lazy(SearchField.icon) + +SearchField.popupIcon = com.formdev.flatlaf.icons.FlatSearchWithHistoryIcon +SearchField.popupRolloverIcon = lazy(SearchField.popupIcon) +SearchField.popupPressedIcon = lazy(SearchField.popupIcon) + +SearchField.clearIcon = com.formdev.flatlaf.icons.FlatClearIcon +SearchField.clearRolloverIcon = lazy(SearchField.clearIcon) +SearchField.clearPressedIcon = lazy(SearchField.clearIcon) diff --git a/flatlaf-testing/dumps/uidefaults/FlatDarkLaf_1.8.0_202.txt b/flatlaf-testing/dumps/uidefaults/FlatDarkLaf_1.8.0_202.txt index 8ddfceaa..8dab6a59 100644 --- a/flatlaf-testing/dumps/uidefaults/FlatDarkLaf_1.8.0_202.txt +++ b/flatlaf-testing/dumps/uidefaults/FlatDarkLaf_1.8.0_202.txt @@ -879,6 +879,25 @@ ScrollPane.smoothScrolling true ScrollPaneUI com.formdev.flatlaf.ui.FlatScrollPaneUI +#---- SearchField ---- + +SearchField.clearIcon [lazy] 16,16 com.formdev.flatlaf.icons.FlatClearIcon [UI] +SearchField.clearIconColor [lazy] #7f8b9180 50% javax.swing.plaf.ColorUIResource [UI] +SearchField.clearIconHoverColor [lazy] #7f8b9180 50% javax.swing.plaf.ColorUIResource [UI] +SearchField.clearIconPressedColor [lazy] #7f8b91cc 80% javax.swing.plaf.ColorUIResource [UI] +SearchField.clearPressedIcon [lazy] 16,16 com.formdev.flatlaf.icons.FlatClearIcon [UI] +SearchField.clearRolloverIcon [lazy] 16,16 com.formdev.flatlaf.icons.FlatClearIcon [UI] +SearchField.icon [lazy] 16,16 com.formdev.flatlaf.icons.FlatSearchIcon [UI] +SearchField.popupIcon [lazy] 16,16 com.formdev.flatlaf.icons.FlatSearchWithHistoryIcon [UI] +SearchField.popupPressedIcon [lazy] 16,16 com.formdev.flatlaf.icons.FlatSearchWithHistoryIcon [UI] +SearchField.popupRolloverIcon [lazy] 16,16 com.formdev.flatlaf.icons.FlatSearchWithHistoryIcon [UI] +SearchField.pressedIcon [lazy] 16,16 com.formdev.flatlaf.icons.FlatSearchIcon [UI] +SearchField.rolloverIcon [lazy] 16,16 com.formdev.flatlaf.icons.FlatSearchIcon [UI] +SearchField.searchIconColor [lazy] #7f8b91e6 90% javax.swing.plaf.ColorUIResource [UI] +SearchField.searchIconHoverColor [lazy] #7f8b91b3 70% javax.swing.plaf.ColorUIResource [UI] +SearchField.searchIconPressedColor [lazy] #7f8b9180 50% javax.swing.plaf.ColorUIResource [UI] + + #---- Separator ---- Separator.background #3c3f41 javax.swing.plaf.ColorUIResource [UI] diff --git a/flatlaf-testing/dumps/uidefaults/FlatLightLaf_1.8.0_202.txt b/flatlaf-testing/dumps/uidefaults/FlatLightLaf_1.8.0_202.txt index 2a118223..d67e290f 100644 --- a/flatlaf-testing/dumps/uidefaults/FlatLightLaf_1.8.0_202.txt +++ b/flatlaf-testing/dumps/uidefaults/FlatLightLaf_1.8.0_202.txt @@ -884,6 +884,25 @@ ScrollPane.smoothScrolling true ScrollPaneUI com.formdev.flatlaf.ui.FlatScrollPaneUI +#---- SearchField ---- + +SearchField.clearIcon [lazy] 16,16 com.formdev.flatlaf.icons.FlatClearIcon [UI] +SearchField.clearIconColor [lazy] #7f8b9180 50% javax.swing.plaf.ColorUIResource [UI] +SearchField.clearIconHoverColor [lazy] #7f8b9180 50% javax.swing.plaf.ColorUIResource [UI] +SearchField.clearIconPressedColor [lazy] #7f8b91cc 80% javax.swing.plaf.ColorUIResource [UI] +SearchField.clearPressedIcon [lazy] 16,16 com.formdev.flatlaf.icons.FlatClearIcon [UI] +SearchField.clearRolloverIcon [lazy] 16,16 com.formdev.flatlaf.icons.FlatClearIcon [UI] +SearchField.icon [lazy] 16,16 com.formdev.flatlaf.icons.FlatSearchIcon [UI] +SearchField.popupIcon [lazy] 16,16 com.formdev.flatlaf.icons.FlatSearchWithHistoryIcon [UI] +SearchField.popupPressedIcon [lazy] 16,16 com.formdev.flatlaf.icons.FlatSearchWithHistoryIcon [UI] +SearchField.popupRolloverIcon [lazy] 16,16 com.formdev.flatlaf.icons.FlatSearchWithHistoryIcon [UI] +SearchField.pressedIcon [lazy] 16,16 com.formdev.flatlaf.icons.FlatSearchIcon [UI] +SearchField.rolloverIcon [lazy] 16,16 com.formdev.flatlaf.icons.FlatSearchIcon [UI] +SearchField.searchIconColor [lazy] #7f8b91e6 90% javax.swing.plaf.ColorUIResource [UI] +SearchField.searchIconHoverColor [lazy] #7f8b91b3 70% javax.swing.plaf.ColorUIResource [UI] +SearchField.searchIconPressedColor [lazy] #7f8b9180 50% javax.swing.plaf.ColorUIResource [UI] + + #---- Separator ---- Separator.background #f2f2f2 javax.swing.plaf.ColorUIResource [UI] diff --git a/flatlaf-testing/dumps/uidefaults/FlatTestLaf_1.8.0_202.txt b/flatlaf-testing/dumps/uidefaults/FlatTestLaf_1.8.0_202.txt index 833e85f4..4df81a7b 100644 --- a/flatlaf-testing/dumps/uidefaults/FlatTestLaf_1.8.0_202.txt +++ b/flatlaf-testing/dumps/uidefaults/FlatTestLaf_1.8.0_202.txt @@ -883,6 +883,25 @@ ScrollPane.smoothScrolling true ScrollPaneUI com.formdev.flatlaf.ui.FlatScrollPaneUI +#---- SearchField ---- + +SearchField.clearIcon [lazy] 16,16 com.formdev.flatlaf.icons.FlatClearIcon [UI] +SearchField.clearIconColor [lazy] #7f8b9180 50% javax.swing.plaf.ColorUIResource [UI] +SearchField.clearIconHoverColor [lazy] #7f8b9180 50% javax.swing.plaf.ColorUIResource [UI] +SearchField.clearIconPressedColor [lazy] #7f8b91cc 80% javax.swing.plaf.ColorUIResource [UI] +SearchField.clearPressedIcon [lazy] 16,16 com.formdev.flatlaf.icons.FlatClearIcon [UI] +SearchField.clearRolloverIcon [lazy] 16,16 com.formdev.flatlaf.icons.FlatClearIcon [UI] +SearchField.icon [lazy] 16,16 com.formdev.flatlaf.icons.FlatSearchIcon [UI] +SearchField.popupIcon [lazy] 16,16 com.formdev.flatlaf.icons.FlatSearchWithHistoryIcon [UI] +SearchField.popupPressedIcon [lazy] 16,16 com.formdev.flatlaf.icons.FlatSearchWithHistoryIcon [UI] +SearchField.popupRolloverIcon [lazy] 16,16 com.formdev.flatlaf.icons.FlatSearchWithHistoryIcon [UI] +SearchField.pressedIcon [lazy] 16,16 com.formdev.flatlaf.icons.FlatSearchIcon [UI] +SearchField.rolloverIcon [lazy] 16,16 com.formdev.flatlaf.icons.FlatSearchIcon [UI] +SearchField.searchIconColor [lazy] #7f8b91e6 90% javax.swing.plaf.ColorUIResource [UI] +SearchField.searchIconHoverColor [lazy] #7f8b91b3 70% javax.swing.plaf.ColorUIResource [UI] +SearchField.searchIconPressedColor [lazy] #7f8b9180 50% javax.swing.plaf.ColorUIResource [UI] + + #---- Separator ---- Separator.background #ccffcc javax.swing.plaf.ColorUIResource [UI] diff --git a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/swingx/FlatSwingXTest.java b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/swingx/FlatSwingXTest.java index 7b982cc5..07e7afd0 100644 --- a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/swingx/FlatSwingXTest.java +++ b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/swingx/FlatSwingXTest.java @@ -124,6 +124,11 @@ public class FlatSwingXTest JTextField textField3 = new JTextField(); JLabel label10 = new JLabel(); JTextField textField4 = new JTextField(); + JLabel label11 = new JLabel(); + JXSearchField xSearchField1 = new JXSearchField(); + JXSearchField xSearchField2 = new JXSearchField(); + JXSearchField xSearchField3 = new JXSearchField(); + JXSearchField xSearchField4 = new JXSearchField(); JButton button1 = new JButton(); JButton button2 = new JButton(); @@ -146,6 +151,8 @@ public class FlatSwingXTest "[]" + "[]" + "[]" + + "[]" + + "[]" + "[37]")); //---- label1 ---- @@ -425,6 +432,30 @@ public class FlatSwingXTest } add(xTitledPanel2, "cell 3 8,grow"); + //---- label11 ---- + label11.setText("JXSearchField:"); + add(label11, "cell 0 9"); + + //---- xSearchField1 ---- + xSearchField1.setText("abc"); + add(xSearchField1, "cell 1 9,growx"); + + //---- xSearchField2 ---- + xSearchField2.setEnabled(false); + xSearchField2.setText("abc"); + add(xSearchField2, "cell 2 9,growx"); + + //---- xSearchField3 ---- + xSearchField3.setRecentSearchesSaveKey("flatlaf.swingx.search.recent"); + xSearchField3.setText("abc"); + add(xSearchField3, "cell 1 10,growx"); + + //---- xSearchField4 ---- + xSearchField4.setRecentSearchesSaveKey("flatlaf.swingx.search.recent"); + xSearchField4.setEnabled(false); + xSearchField4.setText("abc"); + add(xSearchField4, "cell 2 10,growx"); + //---- button1 ---- button1.setText("<"); diff --git a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/swingx/FlatSwingXTest.jfd b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/swingx/FlatSwingXTest.jfd index 567d0e87..a4d1affd 100644 --- a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/swingx/FlatSwingXTest.jfd +++ b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/swingx/FlatSwingXTest.jfd @@ -1,4 +1,4 @@ -JFDML JFormDesigner: "7.0.0.0.194" Java: "11.0.2" encoding: "UTF-8" +JFDML JFormDesigner: "7.0.4.0.360" Java: "16" encoding: "UTF-8" new FormModel { contentType: "form/swing" @@ -9,7 +9,7 @@ new FormModel { add( new FormContainer( "com.formdev.flatlaf.testing.FlatTestPanel", new FormLayoutManager( class net.miginfocom.swing.MigLayout ) { "$layoutConstraints": "ltr,insets dialog,hidemode 3" "$columnConstraints": "[left][][][][fill]" - "$rowConstraints": "[]0[][]0[top][][][][][][37]" + "$rowConstraints": "[]0[][]0[top][][][][][][][][37]" } ) { name: "this" add( new FormComponent( "javax.swing.JLabel" ) { @@ -354,6 +354,40 @@ new FormModel { }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { "value": "cell 3 8,grow" } ) + add( new FormComponent( "javax.swing.JLabel" ) { + name: "label11" + "text": "JXSearchField:" + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 0 9" + } ) + add( new FormComponent( "org.jdesktop.swingx.JXSearchField" ) { + name: "xSearchField1" + "text": "abc" + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 1 9,growx" + } ) + add( new FormComponent( "org.jdesktop.swingx.JXSearchField" ) { + name: "xSearchField2" + "enabled": false + "text": "abc" + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 2 9,growx" + } ) + add( new FormComponent( "org.jdesktop.swingx.JXSearchField" ) { + name: "xSearchField3" + "recentSearchesSaveKey": "flatlaf.swingx.search.recent" + "text": "abc" + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 1 10,growx" + } ) + add( new FormComponent( "org.jdesktop.swingx.JXSearchField" ) { + name: "xSearchField4" + "recentSearchesSaveKey": "flatlaf.swingx.search.recent" + "enabled": false + "text": "abc" + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 2 10,growx" + } ) }, new FormLayoutConstraints( null ) { "location": new java.awt.Point( 0, 0 ) "size": new java.awt.Dimension( 700, 600 ) diff --git a/flatlaf-theme-editor/src/main/resources/com/formdev/flatlaf/themeeditor/FlatLafUIKeys.txt b/flatlaf-theme-editor/src/main/resources/com/formdev/flatlaf/themeeditor/FlatLafUIKeys.txt index 6c84a82b..c50e3328 100644 --- a/flatlaf-theme-editor/src/main/resources/com/formdev/flatlaf/themeeditor/FlatLafUIKeys.txt +++ b/flatlaf-theme-editor/src/main/resources/com/formdev/flatlaf/themeeditor/FlatLafUIKeys.txt @@ -650,6 +650,21 @@ ScrollPane.font ScrollPane.foreground ScrollPane.smoothScrolling ScrollPaneUI +SearchField.clearIcon +SearchField.clearIconColor +SearchField.clearIconHoverColor +SearchField.clearIconPressedColor +SearchField.clearPressedIcon +SearchField.clearRolloverIcon +SearchField.icon +SearchField.popupIcon +SearchField.popupPressedIcon +SearchField.popupRolloverIcon +SearchField.pressedIcon +SearchField.rolloverIcon +SearchField.searchIconColor +SearchField.searchIconHoverColor +SearchField.searchIconPressedColor Separator.background Separator.foreground Separator.height