From 0666f48020d87c98d3ab1f751cc913d421cb0115 Mon Sep 17 00:00:00 2001 From: George Lindholm <66577321+gnl42@users.noreply.github.com> Date: Tue, 12 Dec 2023 23:08:35 -0800 Subject: [PATCH 01/18] Tycho 4, Java 17, Eclipse 2023-06 #16 --- .mvn/extensions.xml | 2 +- csvedit.feature/feature.xml | 15 +- csvedit.plugin.ui/META-INF/MANIFEST.MF | 2 +- csvedit.plugin.ui/build.properties | 3 +- csvedit.plugin.ui/lib/javacsv.jar | Bin 13580 -> 0 bytes csvedit.plugin/.gitignore | 3 +- csvedit.plugin/META-INF/MANIFEST.MF | 6 +- csvedit.plugin/build.properties | 7 +- csvedit.plugin/lib/javacsv.jar | Bin 13580 -> 0 bytes .../csvedit/model/AbstractCSVFile.java | 172 ++++----- csvedit.site/pom.xml | 22 +- csvedit.target/csvedit.target | 24 ++ csvedit.target/pom.xml | 13 + pom.xml | 354 +++++++++++++----- 14 files changed, 415 insertions(+), 208 deletions(-) delete mode 100644 csvedit.plugin.ui/lib/javacsv.jar delete mode 100644 csvedit.plugin/lib/javacsv.jar create mode 100644 csvedit.target/csvedit.target create mode 100644 csvedit.target/pom.xml diff --git a/.mvn/extensions.xml b/.mvn/extensions.xml index 12e63a2..ecfbd8f 100644 --- a/.mvn/extensions.xml +++ b/.mvn/extensions.xml @@ -3,6 +3,6 @@ org.eclipse.tycho.extras tycho-pomless - 1.0.0 + 4.0.4 diff --git a/csvedit.feature/feature.xml b/csvedit.feature/feature.xml index 24e93c0..fc2bde1 100644 --- a/csvedit.feature/feature.xml +++ b/csvedit.feature/feature.xml @@ -52,17 +52,14 @@ permissions and limitations under the License. + version="0.0.0"/> + version="0.0.0"/> + + diff --git a/csvedit.plugin.ui/META-INF/MANIFEST.MF b/csvedit.plugin.ui/META-INF/MANIFEST.MF index 2097de5..6ef4487 100644 --- a/csvedit.plugin.ui/META-INF/MANIFEST.MF +++ b/csvedit.plugin.ui/META-INF/MANIFEST.MF @@ -5,6 +5,6 @@ Bundle-SymbolicName: org.fhsolution.eclipse.plugins.csvedit.ui;singleton:=true Bundle-Version: 1.2.0 Bundle-Vendor: www.fhsolution.com Fragment-Host: org.fhsolution.eclipse.plugins.csvedit;bundle-version="1.2.0" -Bundle-RequiredExecutionEnvironment: J2SE-1.5 +Bundle-RequiredExecutionEnvironment: JavaSE-17 Require-Bundle: org.eclipse.ui.ide, org.eclipse.core.resources diff --git a/csvedit.plugin.ui/build.properties b/csvedit.plugin.ui/build.properties index 1cbc97d..e3023e1 100644 --- a/csvedit.plugin.ui/build.properties +++ b/csvedit.plugin.ui/build.properties @@ -2,5 +2,4 @@ source.. = src/ output.. = bin/ bin.includes = META-INF/,\ .,\ - fragment.xml,\ - lib/ + fragment.xml diff --git a/csvedit.plugin.ui/lib/javacsv.jar b/csvedit.plugin.ui/lib/javacsv.jar deleted file mode 100644 index 75f404d48ef6f157baffa01f21a5fc545aeb31fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13580 zcmaib1#}!qvaOhznbl&8nJs2!SN zcl9|Dx3c19WOY>DQj`IQfCKq$lg^b8_}9+AKVU&1K;*C! z8Wllvq?eQ(msA6Z0HqweMeuCNj8sOKQC4xuq7^=tyG7VW9Cb}Vh{9wGkh#I|VNHm< zj--o}QFe~RA zqsCvqZU};YpK>%b90`n8A8WK;bgVhZm8+>X`y5{a({KFVVm+C5!IK7-ZBv1NT&+pL zLf?FkZG5&J?MPA8F@N7(#!cSgLcf3rKFi#udC;_q5jJaGdSD1VFFsLZ%NX%%EF!^! z!{qm^Zf6I{!>Ss$gxXZOJ$<9s90Ez2vI5B@vPFvwWLho{GHV&RqwSoORwekzJI6!0e!n?p1YaSXtan0F_)*kcKWea;$esQBPpVCG zrgp3hu}Pzd|3k#@!L6x1Mq+sj?8;lC`^VtgI@p+ch&dY@I+*@Dx^W5$-9jjR8}-3( zSYoOuqC24Iy&^5vvZK?z0P65hVG9j51qJm%>iNVYfy`H%(3c{(#fPBCHnnMwa{Fid z9n}}H3Lv(p2f4<)$l#{vyZ|@Y{k0@IFTzlvcX=fFO!6kF-%T$IT(D3{XV9At)-c%C zFSxopp2f0q^||gXtx;-+CS&n!-#46y8Lvc|t58B)Sw(ud@n6Wpv}B|(;gxYxTRDK3&aC_Qvj* zRL(e}Z7tXg-KNxGS-b_GlLy3Euh6@vCN-I2T~}4b;5+a?hkjt^RYvM9?4V#EAk_a5 zdQn3c!#|DcIGMLmjS)N{w^AUb^5ase{8o)_zFD%XaJ##i1_J}$PPfm^N@W?AVkSUv zL=08*8T5tP5g_WI0`=ATyt5~k3X1@L{Xf;Tw%ExGo6L0J+@o~c0O)N)UtSknwKv0afRs+zVG0KF+V5K z6CEY49lYJ{6WM-eD)O2X$&B75#Gwnxhq4eP?rl1-L{54VEMoRKpe!1ZV5LT}#_+R+ zv0Pq(qWF|h+tG)2aCqs8`^LWnNoz%Xd>t6kb^VtK&^R=5G#9gzr#t0=H zX57&0u%h-xB;~0B@}zfD4XQGw$>^13rX~$Y6yGTBmlIckbC7J0ekun(uukiF+)4BT z&N3#Mqi9;enE_P>?S zxrOe}vgyv?<8&BodjvYaucd1jHb5^Ck#ukW>d}$DmP+0gwD&Bt*(|>D{mlA?n*yS7 zXCXaEc>ymLVI)UBA3G{pup^R%NZE^(u|{lDQ?}WGkE)p>@x&U}{65ITdKDY5cF>Y~ zQ!+539tsin{do=wBK~5cqb%2ly1GW5c78Wpm^8tL`71tV%a)=GcsHsaCu3(bikhIp zWudhZ)_0$WIq0789TlmQSmEZx2e)xL}3>sP$tEbBUfp|2a$csu**t-e`GxqlNMxvP9O@#l_Ug`QL<0 zZ^)wyV?bTnHwG7)(ow^yE7GdcL#`cH_M6}~#W$PEG@T{EY7Ik3A9Ea4$@$PTMulSw z_#vA<7X_qc=#4#QvA*7&KEK@DVEaMoVaN6OqI%BS5-dAFR^-x<6bMPhB(Oy$R1n90 zEg?9-)=DBIOoG6Y_cmNuSR^%BwDQCY6`j4?tx!fCbnPG~#7eaf?MS%CYXb`=SMZGj zV|>a*&w;q6>L8h9wu@|Pqi3E%;H|7Hx|m4j1&j2h=(wwBr`i1eQ~qAlt7~b@a)fUT zK6SQ+o4*aOXf8yE8z)MzEzpHW=_)wAnI+53Yzm(U?W0^RT@oU+?xkBQLY+I9PD2ab z-H-ML0)1-ewi2F2k)D1!|1)m*GXG%~b}7iy*Ldel3M(=R$8=h!Tb}Ixb87i_YnRX3 zh%6j6MH5S@byT#^{+_1K!>f-v=)MW zV}WlQ0wA)?Yyo}hX=7YErT$_l@bf;VFH5-Q!B zWU|DoidbndWbrN8^v?~vq^S!NQeRO#37j_BIMJHTFG1 zGa;}eouG!g=!B1535?xrkuSMAuYfyxDbf8(Fq&YB`V?W*=5mr2cgBlkvQgOM0n*356|#_JILdtQFaVHX5;^3ulW zvw7;$zb^djnSk6Krf?i5s2BtS)&iZ|A6p;3E!nt)X5UO27$AuZXOAd4mO}a5(YwS2 zY>`OY^4J-(=NOqQjau^Z7oQ`Y#jMyj41HhWk02dV)Q$Y9u@gaB1rXM(V#d(@^kVY3 z-I^10Ri?xtSns7Um+kv2rY8)=3w-j@|(9i;~%`X}n&lvghkT}dqRJ;D^cn@FmmT>t*U!D0H zI2T_Wv5frZfzR4L*narN$vg0W{-3MnZ0ht2Bfu5A86lLASKId@%Eiq79CAmX%OIsX zl3c_Q&CDHP5bt{#Bv%>68<)^{bThjWjMjKd(FaTRwJcGc`x4B3uC{bRaBs83vnUma{4 zz7J{6{l}Fo()Tawuzf!MeLbQQIX{+ZS%IV>0hWRRb5 z#AqAA;1koi#dBQ@-g7Hogz~@JKy?7~tT?6MTHrWU$=l2zA`~U(ZSepq>*~jxYUQ_H zKa&BN?0+n?ErZ>)o${(!lm4HVGRWhT08I0hgN*+|dgqUEu|7E;v zh6vdgzmCRDV%J5LgNb z*lG|mK{H<|s07)}G$Eq~frvXx9m_d@I&2tW`C@*Clp;!fxPYQ9;hIAi@4aU;3-*?U4Ce0 z<^XKX)HGTw>59a~)6sLVVhgv$v>C{VlIGKjUdX-td`0DB1JlHmm9!N|y(!jcG-OK5 zMA_nAnIQyeGi8>MaWfS?sqk2|Z&_;Giv-y82F`@^2Ie=qHK}8TCSS7{YU+aDmH3Y! zxnb_x#0N4IwJ$>ob1Z~Q(>vDWM$Xk}W3!ZhHYp99Q&~4KAJKIn)R9jr4|jv4Tu_{r z9BN3cDA?tZR#&QB?wVIz7nQ0*S8K}-*$^shc-I&cTvET@$59jQ=JpwWc@a=nk1}T_ z-N>a`p4G6lq>g<`f;*zshCVi&V4JuqYO+!~D?Ef$c3xnDP1#1XBqCLej-9)PaQebr zcHU6;5vg&b&&~{*x}~oRi6`~gAe4aq6f8PwzKiT#>IhqUL(h2YX~hbp<8e#$ZL?+~ zq1zW7Ek@Kk)O#f86ZaY%OD3V#RdIgD{H`T5q~!WKVP4+u+zRqiz~?O_hP0?VcPboe zhMzyR`DV)jXn5)}oR(IikyIRgUd%n`S+ERMDl1D$PzEvXU9`#+FV$%75Jye z+p~F^7Y6#@^js@763R*zmrz)c`<|e@8uAdsYj|>*sl)G(5dgeEN4YcOO*{SyBBhhh zU!Kl%L*@_&K1}J^mM@3a6HTp@-?=aBz+gcCNa~_L!lAc99C$kJ2`6_P&lO1IBGY6T zod+9O>fyKI%cI0qg=_rDRc=#`98NG~M*3sYfDHEp-KuKA>+{DciqihOd@ocHekl0J z@hoOADS~XHylpgd9kc=Nonxhslfe8yCoB{8G%m-P+-3Z;2rE>mqL1E?bi%=O)2yy7 z*x080eT;FAmSm;<3EHBALk6uC7cl_u@3`@XQnBe4k$vneVA=?4^fb@Vayaj?yY12q z$~h8kqVKFj{L%6j4Fs!@t-DIQ1FxFrb7q6hGH@4TN;(2}YcPMnaYK2jv*C)-*ikju zZmnwuz+vL^yti($Z7!_*_%lRjzUe}Dq1BMzeZ)8Mt6)o{M>?t%F1S6%QENjU17W2# zFNabwEN&I)%NPP)*^N0erh6%68;<7tFEGbP%S;&aP(Y>3^scD)Heri8xq-{Y8V7b* z@_O+LvXvU<+Bz)w=N-GcdLFZF$YqD~KvGu{Zk&Zi^Y&5Q4v3#sWJ)Cy${i_Cv|LQ( zu3opm_ai)rrEa~SKel;0U<06Lned#n$-YH5o7$>p5`UDFlC`W?bx!cK*j`;blftlY znb|!o)>=Q4-(`=7M6q?!K@ZmcU{a~6pCg`qE^VSV41ujBflMQ_%a%wM+&RT@u24d5 zo76k2F5?>cm7cIk9Gc@hB1LGh5iF^yuQm5n*#~W><{b+*-1DwvQ9Bu2?998;)gqIO z$=MGPV76F^U_2CsBNmcz-i$QOABV7@rlO9)*b0)+wa$P{2Il~_`~2462L{^uXgE}D z=)n}+Sxf>&2z)66s~L7i)P9oQ@FhL>{_rPvpyrsFN0?<=aO1-&IlLtoJU%t{q!M(CDsC&kjH$ z`iN{TBy2jcu-X6xoevVz;^7f~g9?a)JjiJP72OKp^`i)5@z3VN^FMGL<)BJw*Ly68WTt z4oC_+RaBq&_$oVD9iZ;T&yA=r>3xL#8PS%s>;e(QWbCWwEAOhJ-I1roIgwzY;2TRF zqk<;!!Ms#4V9I~`zi6^JNWya6>)S<>Imtwu<4#+uof^+h%J` z--3E?Lm?A_+fsH&8lD6NfpI6`22D#4)>{veBaa^e0LoyxQTd1&UW8)s7|KX^uMH#oN?aVg!yb^heKl|#CsA@xB9B~Y;yg#I~*>8P>T||D2 zi%SETcd&O-!Tf_UD@(-~ca{&_*~(fnt2wi+!9n)4r=)i^VBbPs)i%v984>o)OmYuv zJ6p%-x3fJgj^|OV$q~DVgs&FOsc}h#UlSk*O=D?K>r{V2p6xc#JQ6)co*UL@m(IuJ3)SRDGT$!BoJ0Y5{55wvbn+-obWe(;a zm#4Og$`Y-~tK!;-0EL>90f#~NH;Kg>6tDyXzgqOeQb2+Rei2GpmZ5H7Mmd8+7=Xea zV9zuYf=6$bO`@(l zrda;yYfKqD@d8bfiw zO0^3CMVJA%Vr*GuYRwOUyHqhc!f>$`bionp<<~_Ja=yrRjzq=N7|qwrbWZrLfz6+J zwAkx8-1C zkSffy0?{p}-h^SX-DL%fY&?$$f1(Cc+htPU|1>6XV>|jU^i&)z#fGG{MYaG-Uui^MP$$HkKBNiSeKoJcRO_AQ=dt$Ib%J7vL z>p~@AJDt@3o7g!!RMHazl|6{G;R#TrV=e=}zwGY#BdOt+=M@tBcOwW^DxNsY#YP?$ zmHkQ#UQNtU#=OhCP#ejaHIE+{u#%W*Mgx(Wp&5r*yF{-@Kcvuz?sAL!@(pap9^kxQ z5q##&Hs0-bMi}ylQNo=V*!4hY_IL>*aM#{f7$yj0%oe0P!3lUXW6Cz3?Ym(deyQWj zL7X5Z3_S2$(Kq(NsicbFkf7!N4Q9~jV7>?$A$*0NlWhfmApM5cK zpN*?#PO7qsEzv+L&&d*RxJFmr)E%z~wSnreRIUA}J)a3>w41|=QYnDlcVh0qppQaVCG4fWASY%PFiO~k=YB@PhLzvpM>FNCa_ze} zvGTA0Y#H(c^!QgjB?@1F+J(5z-^h!vVzNeNs7b-Y9C9@&#aFuK4L)G1lbBn zmY)@;zLkpva!&-+*jb;Ya(2ouQ-agz7t(wXzv=}IIb{uTMlf5>r}@knDAS}RPFZnN z6q{wuG(|YJ>K%O75bJBvGrtyR?pe)ceRNa$*Vl;=uwpLlSx!l6{#f>mY)HH%ILWuozx)B5WjjU#fEkybvN}Gp+n20v3v4JJ+>i~0t(@I@Xv%k| zBwnJ$Sj=`K5cTuzAvNzSv1c5N;jYj|U@SS)GoFEuG^un$*3TmoB05w?6Z5bZ8y`n| zl~X>I;2-56VwM%c`If#gat=fFjQ`xmrho!jq?U$0>*&+Q#ld@-yDBWvBOjzhxP7Tk zWk%}>PO#biJmLfJ6^iO%8+A97Po~EWU9(&yM~ZVSA#m)V(Gi>H4&jmOUQawRblkt3 z{|Gee!wW|tSMQ@jH6I-g5a3Cmcab+W`$8bw<7<^^YX>YCa}v=W=-gl5u(7L8#jo5K z&nTR-vvWzs9~zV4*;`x--m6{BpaU+jfblw0B~LS8_t?p&eG5X2QKG(Ykx}rQIB?4X zVPua^%>mYr8Sf8-VSNLqxpAzvh0qh&H_-brvpUKrVC>TX0`|bZp zyl}(|-9%6T>=A$pRjk7}9ncFsb>$R|iL_h63G#49cWZ-lW!znJhPwjX7*;QEMEFN9 zaKl2Y6g4>^#<6r5R-n+|X-nh=MXe>WWQjnkwV+{{m|E6r*E|+{;VROm;AFUi?T}MT zW!vNoI^MWCC!Ts?Cg!~=o-u3EhZRijtmYS)P<_5@A4tXIzF`~k`Mm3>c@Ub1QwiOU z>5_8YjT~V2_5I~p?n)QDK4L4TUNeTv4-Z4K!*^T3=7Dy+jG2ub%MA6*1gmttTO*`1}Kbe;}sDFf(5H}gX@wrK3(iL*xr;yY! z7LVJBn@bDlR9hiP59QFS@^2FRceL;#b6~A_GOa9n65#cX2jaHWX`xW1L-a@WRG>EV zVgn8@3H%Q+Iv0t%+HDAs2)_p@i0C+gksS!LR^fi|Xybxj3);Sy6GHyLl`lR+u;i2q z)S)?=VYK{(S`%umo%D`h37av$JaM+tx1ai{dP1kz#sneMoP+UX^#JAYIw zK%n6hLi?c)QZJ`7|Gfk~eHorVc8pfqLU;UW7yWZ~;D*&R&lT@+gJYDKP!f*yjW+5x zV|{~iV$e)`rS*`yp_vM!j-w8r_$O^ASet**X2NUxd$TNj61 z&xnMf`g4vCVuYbNGmZ~5grN$W_zYMsTIGI*Isz!`LxvARSWp)UIPEIF3~2T%l)vvA zIYjnux~<|81Ty^V?f6!+!U;R5z|HS<*@`GNXT^8rqY+{~yl`+Xzn;e3n&}QWYfT%hij50pvd%m$3TEC z)N?|p#bJ_BmkjLI$7Ri6~zM z%&gy_BI9ptv%XI{5pA;tdZMAF<}p^MWBEx*4r|c1d4RKQ3$e{WhJTCgxlyiQUoE(XO((au!=EH5YC>WEH!3)0J?LOionBk`Ai7f95~HRHrpA7pM~;}YXE&8$hkshRlcQrZ6U=%xa)66DvMxd3iKpF}<@IOI z_#KE*SF?3-{QP%_ps$c4wD1hEo{hm?eC_5O9mi;dS7oGvHij89 zx!>4`PV5qhs-#w=&Xg(&z2Yg_4A#n4f=9#)jM|d({6uPFSu$@Y_0sR+7%v*%K`>8k zJnelK6#JBapLYRo?!~?koV^en=Pd3NLk+6TBlfbz&IVb~{M^8Oy#V)Emq{msZy0a$ z)k)Rd7x_q6cBko<5W@FycL!i|7kO5_eK+xeLi{zCbO3^x^TwQP$I?z_45Gcd@{XOl z^ds&vU^9lb$mj4u5PUFsIOWS@Z zLC9_I=J8sy2v_%Ni>mE~4BFOpO$IsPUX`3r^#(8o_p!RZ%ZvUk_jo^tB8dwjAwCT_ z)Nz-9;AU|QJ}b>Gu)w-cgN-g=9}?~`bI?Y2s7%`3poU%cU?5KHq67AIB(X-Ns#yS; z7I^4X>wKsksesL&G&S|%g81P_I2A$BI0)-~#Xl>zu$>*0MS4-a5NCP#-O*Kdy+R;g zHWWw6G3y|ip_)|`TMxfknY>De-!&xJ-BKhP<2kk=5$Pv@=@)u4*lU$HanaE{eAt=E z35hjqMFNlW&I1?l(``@P2yKD9`N8~3vQOOIPH=;4TxIZrI+~UG3F9W#@C79G<-ag?)qcsHJZTS`h}_q(pPMo;^~ z!ML(z3EI)==LVfN9(8JFlUN(yE$&A5BEUKBv5j9P1kCd#FS67Xq}WZEggVkG zzyo(H%o+qLwB|Aw_}&xE@re^H@Cj$n@`+{7^ND27@hyx{$6;UofQI6qM2j9Nzy;=& zt*?86ulR;uJvEiDo&+!V(@Hb>{=!rRUptc58&ei){qd}gq#eRcS0ap7SUI=@Qo zzJBizdXa2Yld!xCmcbQubS5$OP%0)DVK5+~@_!|p$S*4B4(Z&L!hm+lT`BQZ4zFWm z`h+K%r5)#De8g$0djmZGF!~eeu(|wRQBbN9jJBj)@kqqK@OUyJOUFM`B2+t7Y^j@1 z7aj{hFPm@BwO=ww&0NG}YX}7i-Uc=vmyN_g_7$jIUXui)`D#OsV0zl{lOo>a%>3KQ z!m{sTS(YH*h#yCM<+b7->6#MgCk6wA0O&%=%L@L6A72+2l=Usov&X-$(_N_zje&O1 z+hV}?iaEKO9Oeo3tjUqCDwybc^NY=o6%MxC=|!M&W*E&ja4O?u5*p{c9^RLs$tj~} zEQ;^{vYG(VXHIGW`^F&V->fG5&fxE>36&b29_S0Gua)h!ySK|Yu%P`MSQ3G8Od%8~ zU|ppQ8KS)gVWhJJkfhZ%{`4)&m=azE&~gbJ9SUuTlR_s%mNIzsQ_aEI1#%a39n-x0 zGaN^2`>{o=-jcNq(hpCV0uw8otQVXE-uC-P@vnR?sGYQY45R_xRt~Is6T67A>w~*; zvg@baIuy;9>e=nlLn~?RJ<;yc9@zaJEa%;AYaX#dTFnd53G4;F!_hNn>ybYwfH{sk z74R1cOvD!lj}X>AenZe{K4C+lX{!^vCxy$G{=f%7f<5zNBm9QrRvXxERvGX}gN-2`PuUVrsxVQO z3s+4|%yml%v`P<+7B{)DZrMWpWPwH6MN~-SBJVKX!kcXED_sIfG$PpQm8kL(9-$J1 z2ZAL_I-XTAW{~{#vIp5`t1TB6ULYFDDHfApIqgO|N znI+?IAU)T{)6?|*-tBH<^gT3go4>6)j3y@agmSY}&4@iZNytoKqF&CJG}Z*{=xP#E zT{T1P4{468mZ%|-2z6j!S?4tq^PHtDbFR*1oR!uzUm0SZKbt%CK>eAPv@c&?-7HIT zO1;H^nZpn`51ZbcJOIkAj@-4rMj~2FB8kDP$O6_L$dg3}MOHzN%9}}qtEB8Q`gZ?g z$R^!J+T2JwJb1~9d%`nuhTfoREadP-l7GNxxFk7OMSv zttJ-V(2A&y9a!8?oy4ZkunNkED|DS-+^eG&wq0Fj&CZQAIEc(=6t*U0U&wZOM6I4U0C%}0rMkPe7r%3dsh$eWJKpp<)@ zt)0^H6N23NpRN|Z9a*V!m8-T!$lnt374#l1H>mS02FouKl*|@>*ZB~zRP9dQ+Nv7U zXgd8_TAWv2ZoKMgg?%+0*h&{v8MTt=T?TsP(r>XwNB4Q9Y15k4CB@wSUEMH`$l7S5 zqTX)dG}$>V#`IH~X^XEHc4oE;KZR9~6eW9s(npMN=I)Lej?gMmD@E>kY|eD?pba<- zv0}4Pn$o$cDW$R=Fm>IjMw});zl;)R_2kxu`aO&2bpDd`4S`zAgTkhYE9V&799UF4 zYE*BWHV$!NW7G~>^6y@y!GUx<-;A3}PRQq6Kdu_asIJ|{M>Gl`r9Q9iH%sU*gmo-J zgEG!~{;>4TH6aqC`>1k6!6TXZ8RbaOfh#o>1p}~Upp1z@MG938*xI#pb%3h^opw;j z4{1S5Sk9IB>enhY8%iX;hGB;2fp?wyv2-lm(*p~EdDU~4O`#j#hP(#4^K}un&m})z z*I`l<8-cyzaw9)W(U1PW7*B}G?`Jf@L{_RLwORue!yZPFNH z4n(9Ih~1i5w%IAZ7_B^lY`2uG7HuI7mgaz4u)F5ku+@r)DPhtyL) z(D7~6In}h+RJY-MNGGf&=32qCt@#$x;JfXv?&*d-vNZtzksZys|u@A0fFM-3u|FgSM+iKbAEIoG!cWmAPZ6{utA7 zO>i}hDAJA&%;PoOb&yw*#MR~zP8v6ut&6ZY!Q>BL z_k+4!abyl-(Uqz!DBL_7VZUY^=^&|b>VtljG_s?LD|xi8ntF=pyCh;d_PB#P=Blow0pyJFYJD3N-xgmh{Wlx4r+${eOQl;6JW^{cOO$eL)KRe-pX>*Y*EADezAR|IeX8Kz=)T+Z)2~ z+W!9>^MAYho4Wt^?Kh9Lx82`7{;$^mKfZsh_WzG}fj{h9eeq}Cf71T{aTb3qbpHd_ z?5$?`d))t#z5fdQtBm^(;H@_y*WUsED(e0f^;b3WAE*wHe~q>f7R3e0SpcO z_rQOuuz!X8Rk8U8N zcl9|Dx3c19WOY>DQj`IQfCKq$lg^b8_}9+AKVU&1K;*C! z8Wllvq?eQ(msA6Z0HqweMeuCNj8sOKQC4xuq7^=tyG7VW9Cb}Vh{9wGkh#I|VNHm< zj--o}QFe~RA zqsCvqZU};YpK>%b90`n8A8WK;bgVhZm8+>X`y5{a({KFVVm+C5!IK7-ZBv1NT&+pL zLf?FkZG5&J?MPA8F@N7(#!cSgLcf3rKFi#udC;_q5jJaGdSD1VFFsLZ%NX%%EF!^! z!{qm^Zf6I{!>Ss$gxXZOJ$<9s90Ez2vI5B@vPFvwWLho{GHV&RqwSoORwekzJI6!0e!n?p1YaSXtan0F_)*kcKWea;$esQBPpVCG zrgp3hu}Pzd|3k#@!L6x1Mq+sj?8;lC`^VtgI@p+ch&dY@I+*@Dx^W5$-9jjR8}-3( zSYoOuqC24Iy&^5vvZK?z0P65hVG9j51qJm%>iNVYfy`H%(3c{(#fPBCHnnMwa{Fid z9n}}H3Lv(p2f4<)$l#{vyZ|@Y{k0@IFTzlvcX=fFO!6kF-%T$IT(D3{XV9At)-c%C zFSxopp2f0q^||gXtx;-+CS&n!-#46y8Lvc|t58B)Sw(ud@n6Wpv}B|(;gxYxTRDK3&aC_Qvj* zRL(e}Z7tXg-KNxGS-b_GlLy3Euh6@vCN-I2T~}4b;5+a?hkjt^RYvM9?4V#EAk_a5 zdQn3c!#|DcIGMLmjS)N{w^AUb^5ase{8o)_zFD%XaJ##i1_J}$PPfm^N@W?AVkSUv zL=08*8T5tP5g_WI0`=ATyt5~k3X1@L{Xf;Tw%ExGo6L0J+@o~c0O)N)UtSknwKv0afRs+zVG0KF+V5K z6CEY49lYJ{6WM-eD)O2X$&B75#Gwnxhq4eP?rl1-L{54VEMoRKpe!1ZV5LT}#_+R+ zv0Pq(qWF|h+tG)2aCqs8`^LWnNoz%Xd>t6kb^VtK&^R=5G#9gzr#t0=H zX57&0u%h-xB;~0B@}zfD4XQGw$>^13rX~$Y6yGTBmlIckbC7J0ekun(uukiF+)4BT z&N3#Mqi9;enE_P>?S zxrOe}vgyv?<8&BodjvYaucd1jHb5^Ck#ukW>d}$DmP+0gwD&Bt*(|>D{mlA?n*yS7 zXCXaEc>ymLVI)UBA3G{pup^R%NZE^(u|{lDQ?}WGkE)p>@x&U}{65ITdKDY5cF>Y~ zQ!+539tsin{do=wBK~5cqb%2ly1GW5c78Wpm^8tL`71tV%a)=GcsHsaCu3(bikhIp zWudhZ)_0$WIq0789TlmQSmEZx2e)xL}3>sP$tEbBUfp|2a$csu**t-e`GxqlNMxvP9O@#l_Ug`QL<0 zZ^)wyV?bTnHwG7)(ow^yE7GdcL#`cH_M6}~#W$PEG@T{EY7Ik3A9Ea4$@$PTMulSw z_#vA<7X_qc=#4#QvA*7&KEK@DVEaMoVaN6OqI%BS5-dAFR^-x<6bMPhB(Oy$R1n90 zEg?9-)=DBIOoG6Y_cmNuSR^%BwDQCY6`j4?tx!fCbnPG~#7eaf?MS%CYXb`=SMZGj zV|>a*&w;q6>L8h9wu@|Pqi3E%;H|7Hx|m4j1&j2h=(wwBr`i1eQ~qAlt7~b@a)fUT zK6SQ+o4*aOXf8yE8z)MzEzpHW=_)wAnI+53Yzm(U?W0^RT@oU+?xkBQLY+I9PD2ab z-H-ML0)1-ewi2F2k)D1!|1)m*GXG%~b}7iy*Ldel3M(=R$8=h!Tb}Ixb87i_YnRX3 zh%6j6MH5S@byT#^{+_1K!>f-v=)MW zV}WlQ0wA)?Yyo}hX=7YErT$_l@bf;VFH5-Q!B zWU|DoidbndWbrN8^v?~vq^S!NQeRO#37j_BIMJHTFG1 zGa;}eouG!g=!B1535?xrkuSMAuYfyxDbf8(Fq&YB`V?W*=5mr2cgBlkvQgOM0n*356|#_JILdtQFaVHX5;^3ulW zvw7;$zb^djnSk6Krf?i5s2BtS)&iZ|A6p;3E!nt)X5UO27$AuZXOAd4mO}a5(YwS2 zY>`OY^4J-(=NOqQjau^Z7oQ`Y#jMyj41HhWk02dV)Q$Y9u@gaB1rXM(V#d(@^kVY3 z-I^10Ri?xtSns7Um+kv2rY8)=3w-j@|(9i;~%`X}n&lvghkT}dqRJ;D^cn@FmmT>t*U!D0H zI2T_Wv5frZfzR4L*narN$vg0W{-3MnZ0ht2Bfu5A86lLASKId@%Eiq79CAmX%OIsX zl3c_Q&CDHP5bt{#Bv%>68<)^{bThjWjMjKd(FaTRwJcGc`x4B3uC{bRaBs83vnUma{4 zz7J{6{l}Fo()Tawuzf!MeLbQQIX{+ZS%IV>0hWRRb5 z#AqAA;1koi#dBQ@-g7Hogz~@JKy?7~tT?6MTHrWU$=l2zA`~U(ZSepq>*~jxYUQ_H zKa&BN?0+n?ErZ>)o${(!lm4HVGRWhT08I0hgN*+|dgqUEu|7E;v zh6vdgzmCRDV%J5LgNb z*lG|mK{H<|s07)}G$Eq~frvXx9m_d@I&2tW`C@*Clp;!fxPYQ9;hIAi@4aU;3-*?U4Ce0 z<^XKX)HGTw>59a~)6sLVVhgv$v>C{VlIGKjUdX-td`0DB1JlHmm9!N|y(!jcG-OK5 zMA_nAnIQyeGi8>MaWfS?sqk2|Z&_;Giv-y82F`@^2Ie=qHK}8TCSS7{YU+aDmH3Y! zxnb_x#0N4IwJ$>ob1Z~Q(>vDWM$Xk}W3!ZhHYp99Q&~4KAJKIn)R9jr4|jv4Tu_{r z9BN3cDA?tZR#&QB?wVIz7nQ0*S8K}-*$^shc-I&cTvET@$59jQ=JpwWc@a=nk1}T_ z-N>a`p4G6lq>g<`f;*zshCVi&V4JuqYO+!~D?Ef$c3xnDP1#1XBqCLej-9)PaQebr zcHU6;5vg&b&&~{*x}~oRi6`~gAe4aq6f8PwzKiT#>IhqUL(h2YX~hbp<8e#$ZL?+~ zq1zW7Ek@Kk)O#f86ZaY%OD3V#RdIgD{H`T5q~!WKVP4+u+zRqiz~?O_hP0?VcPboe zhMzyR`DV)jXn5)}oR(IikyIRgUd%n`S+ERMDl1D$PzEvXU9`#+FV$%75Jye z+p~F^7Y6#@^js@763R*zmrz)c`<|e@8uAdsYj|>*sl)G(5dgeEN4YcOO*{SyBBhhh zU!Kl%L*@_&K1}J^mM@3a6HTp@-?=aBz+gcCNa~_L!lAc99C$kJ2`6_P&lO1IBGY6T zod+9O>fyKI%cI0qg=_rDRc=#`98NG~M*3sYfDHEp-KuKA>+{DciqihOd@ocHekl0J z@hoOADS~XHylpgd9kc=Nonxhslfe8yCoB{8G%m-P+-3Z;2rE>mqL1E?bi%=O)2yy7 z*x080eT;FAmSm;<3EHBALk6uC7cl_u@3`@XQnBe4k$vneVA=?4^fb@Vayaj?yY12q z$~h8kqVKFj{L%6j4Fs!@t-DIQ1FxFrb7q6hGH@4TN;(2}YcPMnaYK2jv*C)-*ikju zZmnwuz+vL^yti($Z7!_*_%lRjzUe}Dq1BMzeZ)8Mt6)o{M>?t%F1S6%QENjU17W2# zFNabwEN&I)%NPP)*^N0erh6%68;<7tFEGbP%S;&aP(Y>3^scD)Heri8xq-{Y8V7b* z@_O+LvXvU<+Bz)w=N-GcdLFZF$YqD~KvGu{Zk&Zi^Y&5Q4v3#sWJ)Cy${i_Cv|LQ( zu3opm_ai)rrEa~SKel;0U<06Lned#n$-YH5o7$>p5`UDFlC`W?bx!cK*j`;blftlY znb|!o)>=Q4-(`=7M6q?!K@ZmcU{a~6pCg`qE^VSV41ujBflMQ_%a%wM+&RT@u24d5 zo76k2F5?>cm7cIk9Gc@hB1LGh5iF^yuQm5n*#~W><{b+*-1DwvQ9Bu2?998;)gqIO z$=MGPV76F^U_2CsBNmcz-i$QOABV7@rlO9)*b0)+wa$P{2Il~_`~2462L{^uXgE}D z=)n}+Sxf>&2z)66s~L7i)P9oQ@FhL>{_rPvpyrsFN0?<=aO1-&IlLtoJU%t{q!M(CDsC&kjH$ z`iN{TBy2jcu-X6xoevVz;^7f~g9?a)JjiJP72OKp^`i)5@z3VN^FMGL<)BJw*Ly68WTt z4oC_+RaBq&_$oVD9iZ;T&yA=r>3xL#8PS%s>;e(QWbCWwEAOhJ-I1roIgwzY;2TRF zqk<;!!Ms#4V9I~`zi6^JNWya6>)S<>Imtwu<4#+uof^+h%J` z--3E?Lm?A_+fsH&8lD6NfpI6`22D#4)>{veBaa^e0LoyxQTd1&UW8)s7|KX^uMH#oN?aVg!yb^heKl|#CsA@xB9B~Y;yg#I~*>8P>T||D2 zi%SETcd&O-!Tf_UD@(-~ca{&_*~(fnt2wi+!9n)4r=)i^VBbPs)i%v984>o)OmYuv zJ6p%-x3fJgj^|OV$q~DVgs&FOsc}h#UlSk*O=D?K>r{V2p6xc#JQ6)co*UL@m(IuJ3)SRDGT$!BoJ0Y5{55wvbn+-obWe(;a zm#4Og$`Y-~tK!;-0EL>90f#~NH;Kg>6tDyXzgqOeQb2+Rei2GpmZ5H7Mmd8+7=Xea zV9zuYf=6$bO`@(l zrda;yYfKqD@d8bfiw zO0^3CMVJA%Vr*GuYRwOUyHqhc!f>$`bionp<<~_Ja=yrRjzq=N7|qwrbWZrLfz6+J zwAkx8-1C zkSffy0?{p}-h^SX-DL%fY&?$$f1(Cc+htPU|1>6XV>|jU^i&)z#fGG{MYaG-Uui^MP$$HkKBNiSeKoJcRO_AQ=dt$Ib%J7vL z>p~@AJDt@3o7g!!RMHazl|6{G;R#TrV=e=}zwGY#BdOt+=M@tBcOwW^DxNsY#YP?$ zmHkQ#UQNtU#=OhCP#ejaHIE+{u#%W*Mgx(Wp&5r*yF{-@Kcvuz?sAL!@(pap9^kxQ z5q##&Hs0-bMi}ylQNo=V*!4hY_IL>*aM#{f7$yj0%oe0P!3lUXW6Cz3?Ym(deyQWj zL7X5Z3_S2$(Kq(NsicbFkf7!N4Q9~jV7>?$A$*0NlWhfmApM5cK zpN*?#PO7qsEzv+L&&d*RxJFmr)E%z~wSnreRIUA}J)a3>w41|=QYnDlcVh0qppQaVCG4fWASY%PFiO~k=YB@PhLzvpM>FNCa_ze} zvGTA0Y#H(c^!QgjB?@1F+J(5z-^h!vVzNeNs7b-Y9C9@&#aFuK4L)G1lbBn zmY)@;zLkpva!&-+*jb;Ya(2ouQ-agz7t(wXzv=}IIb{uTMlf5>r}@knDAS}RPFZnN z6q{wuG(|YJ>K%O75bJBvGrtyR?pe)ceRNa$*Vl;=uwpLlSx!l6{#f>mY)HH%ILWuozx)B5WjjU#fEkybvN}Gp+n20v3v4JJ+>i~0t(@I@Xv%k| zBwnJ$Sj=`K5cTuzAvNzSv1c5N;jYj|U@SS)GoFEuG^un$*3TmoB05w?6Z5bZ8y`n| zl~X>I;2-56VwM%c`If#gat=fFjQ`xmrho!jq?U$0>*&+Q#ld@-yDBWvBOjzhxP7Tk zWk%}>PO#biJmLfJ6^iO%8+A97Po~EWU9(&yM~ZVSA#m)V(Gi>H4&jmOUQawRblkt3 z{|Gee!wW|tSMQ@jH6I-g5a3Cmcab+W`$8bw<7<^^YX>YCa}v=W=-gl5u(7L8#jo5K z&nTR-vvWzs9~zV4*;`x--m6{BpaU+jfblw0B~LS8_t?p&eG5X2QKG(Ykx}rQIB?4X zVPua^%>mYr8Sf8-VSNLqxpAzvh0qh&H_-brvpUKrVC>TX0`|bZp zyl}(|-9%6T>=A$pRjk7}9ncFsb>$R|iL_h63G#49cWZ-lW!znJhPwjX7*;QEMEFN9 zaKl2Y6g4>^#<6r5R-n+|X-nh=MXe>WWQjnkwV+{{m|E6r*E|+{;VROm;AFUi?T}MT zW!vNoI^MWCC!Ts?Cg!~=o-u3EhZRijtmYS)P<_5@A4tXIzF`~k`Mm3>c@Ub1QwiOU z>5_8YjT~V2_5I~p?n)QDK4L4TUNeTv4-Z4K!*^T3=7Dy+jG2ub%MA6*1gmttTO*`1}Kbe;}sDFf(5H}gX@wrK3(iL*xr;yY! z7LVJBn@bDlR9hiP59QFS@^2FRceL;#b6~A_GOa9n65#cX2jaHWX`xW1L-a@WRG>EV zVgn8@3H%Q+Iv0t%+HDAs2)_p@i0C+gksS!LR^fi|Xybxj3);Sy6GHyLl`lR+u;i2q z)S)?=VYK{(S`%umo%D`h37av$JaM+tx1ai{dP1kz#sneMoP+UX^#JAYIw zK%n6hLi?c)QZJ`7|Gfk~eHorVc8pfqLU;UW7yWZ~;D*&R&lT@+gJYDKP!f*yjW+5x zV|{~iV$e)`rS*`yp_vM!j-w8r_$O^ASet**X2NUxd$TNj61 z&xnMf`g4vCVuYbNGmZ~5grN$W_zYMsTIGI*Isz!`LxvARSWp)UIPEIF3~2T%l)vvA zIYjnux~<|81Ty^V?f6!+!U;R5z|HS<*@`GNXT^8rqY+{~yl`+Xzn;e3n&}QWYfT%hij50pvd%m$3TEC z)N?|p#bJ_BmkjLI$7Ri6~zM z%&gy_BI9ptv%XI{5pA;tdZMAF<}p^MWBEx*4r|c1d4RKQ3$e{WhJTCgxlyiQUoE(XO((au!=EH5YC>WEH!3)0J?LOionBk`Ai7f95~HRHrpA7pM~;}YXE&8$hkshRlcQrZ6U=%xa)66DvMxd3iKpF}<@IOI z_#KE*SF?3-{QP%_ps$c4wD1hEo{hm?eC_5O9mi;dS7oGvHij89 zx!>4`PV5qhs-#w=&Xg(&z2Yg_4A#n4f=9#)jM|d({6uPFSu$@Y_0sR+7%v*%K`>8k zJnelK6#JBapLYRo?!~?koV^en=Pd3NLk+6TBlfbz&IVb~{M^8Oy#V)Emq{msZy0a$ z)k)Rd7x_q6cBko<5W@FycL!i|7kO5_eK+xeLi{zCbO3^x^TwQP$I?z_45Gcd@{XOl z^ds&vU^9lb$mj4u5PUFsIOWS@Z zLC9_I=J8sy2v_%Ni>mE~4BFOpO$IsPUX`3r^#(8o_p!RZ%ZvUk_jo^tB8dwjAwCT_ z)Nz-9;AU|QJ}b>Gu)w-cgN-g=9}?~`bI?Y2s7%`3poU%cU?5KHq67AIB(X-Ns#yS; z7I^4X>wKsksesL&G&S|%g81P_I2A$BI0)-~#Xl>zu$>*0MS4-a5NCP#-O*Kdy+R;g zHWWw6G3y|ip_)|`TMxfknY>De-!&xJ-BKhP<2kk=5$Pv@=@)u4*lU$HanaE{eAt=E z35hjqMFNlW&I1?l(``@P2yKD9`N8~3vQOOIPH=;4TxIZrI+~UG3F9W#@C79G<-ag?)qcsHJZTS`h}_q(pPMo;^~ z!ML(z3EI)==LVfN9(8JFlUN(yE$&A5BEUKBv5j9P1kCd#FS67Xq}WZEggVkG zzyo(H%o+qLwB|Aw_}&xE@re^H@Cj$n@`+{7^ND27@hyx{$6;UofQI6qM2j9Nzy;=& zt*?86ulR;uJvEiDo&+!V(@Hb>{=!rRUptc58&ei){qd}gq#eRcS0ap7SUI=@Qo zzJBizdXa2Yld!xCmcbQubS5$OP%0)DVK5+~@_!|p$S*4B4(Z&L!hm+lT`BQZ4zFWm z`h+K%r5)#De8g$0djmZGF!~eeu(|wRQBbN9jJBj)@kqqK@OUyJOUFM`B2+t7Y^j@1 z7aj{hFPm@BwO=ww&0NG}YX}7i-Uc=vmyN_g_7$jIUXui)`D#OsV0zl{lOo>a%>3KQ z!m{sTS(YH*h#yCM<+b7->6#MgCk6wA0O&%=%L@L6A72+2l=Usov&X-$(_N_zje&O1 z+hV}?iaEKO9Oeo3tjUqCDwybc^NY=o6%MxC=|!M&W*E&ja4O?u5*p{c9^RLs$tj~} zEQ;^{vYG(VXHIGW`^F&V->fG5&fxE>36&b29_S0Gua)h!ySK|Yu%P`MSQ3G8Od%8~ zU|ppQ8KS)gVWhJJkfhZ%{`4)&m=azE&~gbJ9SUuTlR_s%mNIzsQ_aEI1#%a39n-x0 zGaN^2`>{o=-jcNq(hpCV0uw8otQVXE-uC-P@vnR?sGYQY45R_xRt~Is6T67A>w~*; zvg@baIuy;9>e=nlLn~?RJ<;yc9@zaJEa%;AYaX#dTFnd53G4;F!_hNn>ybYwfH{sk z74R1cOvD!lj}X>AenZe{K4C+lX{!^vCxy$G{=f%7f<5zNBm9QrRvXxERvGX}gN-2`PuUVrsxVQO z3s+4|%yml%v`P<+7B{)DZrMWpWPwH6MN~-SBJVKX!kcXED_sIfG$PpQm8kL(9-$J1 z2ZAL_I-XTAW{~{#vIp5`t1TB6ULYFDDHfApIqgO|N znI+?IAU)T{)6?|*-tBH<^gT3go4>6)j3y@agmSY}&4@iZNytoKqF&CJG}Z*{=xP#E zT{T1P4{468mZ%|-2z6j!S?4tq^PHtDbFR*1oR!uzUm0SZKbt%CK>eAPv@c&?-7HIT zO1;H^nZpn`51ZbcJOIkAj@-4rMj~2FB8kDP$O6_L$dg3}MOHzN%9}}qtEB8Q`gZ?g z$R^!J+T2JwJb1~9d%`nuhTfoREadP-l7GNxxFk7OMSv zttJ-V(2A&y9a!8?oy4ZkunNkED|DS-+^eG&wq0Fj&CZQAIEc(=6t*U0U&wZOM6I4U0C%}0rMkPe7r%3dsh$eWJKpp<)@ zt)0^H6N23NpRN|Z9a*V!m8-T!$lnt374#l1H>mS02FouKl*|@>*ZB~zRP9dQ+Nv7U zXgd8_TAWv2ZoKMgg?%+0*h&{v8MTt=T?TsP(r>XwNB4Q9Y15k4CB@wSUEMH`$l7S5 zqTX)dG}$>V#`IH~X^XEHc4oE;KZR9~6eW9s(npMN=I)Lej?gMmD@E>kY|eD?pba<- zv0}4Pn$o$cDW$R=Fm>IjMw});zl;)R_2kxu`aO&2bpDd`4S`zAgTkhYE9V&799UF4 zYE*BWHV$!NW7G~>^6y@y!GUx<-;A3}PRQq6Kdu_asIJ|{M>Gl`r9Q9iH%sU*gmo-J zgEG!~{;>4TH6aqC`>1k6!6TXZ8RbaOfh#o>1p}~Upp1z@MG938*xI#pb%3h^opw;j z4{1S5Sk9IB>enhY8%iX;hGB;2fp?wyv2-lm(*p~EdDU~4O`#j#hP(#4^K}un&m})z z*I`l<8-cyzaw9)W(U1PW7*B}G?`Jf@L{_RLwORue!yZPFNH z4n(9Ih~1i5w%IAZ7_B^lY`2uG7HuI7mgaz4u)F5ku+@r)DPhtyL) z(D7~6In}h+RJY-MNGGf&=32qCt@#$x;JfXv?&*d-vNZtzksZys|u@A0fFM-3u|FgSM+iKbAEIoG!cWmAPZ6{utA7 zO>i}hDAJA&%;PoOb&yw*#MR~zP8v6ut&6ZY!Q>BL z_k+4!abyl-(Uqz!DBL_7VZUY^=^&|b>VtljG_s?LD|xi8ntF=pyCh;d_PB#P=Blow0pyJFYJD3N-xgmh{Wlx4r+${eOQl;6JW^{cOO$eL)KRe-pX>*Y*EADezAR|IeX8Kz=)T+Z)2~ z+W!9>^MAYho4Wt^?Kh9Lx82`7{;$^mKfZsh_WzG}fj{h9eeq}Cf71T{aTb3qbpHd_ z?5$?`d))t#z5fdQtBm^(;H@_y*WUsED(e0f^;b3WAE*wHe~q>f7R3e0SpcO z_rQOuuz!X8Rk8U8(); - listeners = new ArrayList(); - header = new ArrayList(); + rows = new ArrayList<>(); + listeners = new ArrayList<>(); + header = new ArrayList<>(); } // TODO : all abstract methods should be moved to a specific interface /** * Check if first line in the file will be considered as the file header + * * @return true if the first line in the file represents the header */ public abstract boolean isFirstLineHeader(); /** * Check search in the text must be case sensitive + * * @return true if the search must be case sensitive. */ public abstract boolean getSensitiveSearch(); /** * Get custom delimiter to use as a separator + * * @return the delimiter */ public abstract char getCustomDelimiter(); /** * Get the character that defines comment lines - * @return the comment line starting character. If no comments are allowed in this - * file, then Character.UNASSIGNED constant must be returned; + * + * @return the comment line starting character. If no comments are allowed in + * this file, then Character.UNASSIGNED constant must be returned; * */ public abstract char getCommentChar(); /** * Get custom text qualifier to use as a text qualifier in the data + * * @return the text qualifier character to use as a text qualifier in the data */ public abstract char getTextQualifier(); /** * check if the text qualifier has to be use for all fields or not + * * @return true if the text qualifier is to be used for all data fields */ public abstract boolean useQualifier(); /** * Get the delimiter used to separate different values in a same csv cell + * * @return the delimiter used to separate values */ public abstract String getInCellDelimiter(); - + /** - * Get the pattern to identify a column header where values can be splitted with the inCellDelimiter - * and displayed in a table instead of a textfield + * Get the pattern to identify a column header where values can be splitted with + * the inCellDelimiter and displayed in a table instead of a textfield + * * @return the regex */ public abstract String getRegexTableMarker(); @@ -104,14 +112,14 @@ public AbstractCSVFile() { /** * @param text */ - public void setInput(String text) { + public void setInput(final String text) { readLines(text); } /** * @param display */ - public void displayFirstLine(boolean display) { + public void displayFirstLine(final boolean display) { displayFirstLine = display; } @@ -119,14 +127,13 @@ public void displayFirstLine(boolean display) { * @param reader * @return */ - protected CsvReader initializeReader (Reader reader) - { - CsvReader csvReader = new CsvReader(reader); + protected CsvReader initializeReader(final Reader reader) { + final CsvReader csvReader = new CsvReader(reader); - char customDelimiter = getCustomDelimiter(); + final char customDelimiter = getCustomDelimiter(); csvReader.setDelimiter(customDelimiter); - char commentChar = getCommentChar(); + final char commentChar = getCommentChar(); if (commentChar != Character.UNASSIGNED) { csvReader.setComment(commentChar); // prevent loss of comment in csv source file @@ -142,11 +149,11 @@ protected CsvReader initializeReader (Reader reader) /** * @param fileText */ - protected void readLines(String fileText) { + protected void readLines(final String fileText) { rows.clear(); try { - CsvReader csvReader = initializeReader(new StringReader(fileText)); + final CsvReader csvReader = initializeReader(new StringReader(fileText)); // case when the first line is the encoding if (!displayFirstLine) { csvReader.skipLine(); @@ -154,16 +161,15 @@ protected void readLines(String fileText) { boolean setHeader = false; while (csvReader.readRecord()) { - String[] rowValues = csvReader.getValues(); - CSVRow csvRow = new CSVRow(rowValues, this); + final String[] rowValues = csvReader.getValues(); + final CSVRow csvRow = new CSVRow(rowValues, this); if (!rowValues[0].startsWith(String.valueOf(getCommentChar()))) { if (isFirstLineHeader() && !setHeader) { setHeader = true; csvRow.setHeader(true); populateHeaders(rowValues); } - } - else { + } else { csvRow.setCommentLine(true); } rows.add(csvRow); @@ -178,7 +184,7 @@ protected void readLines(String fileText) { } csvReader.close(); - } catch (Exception e) { + } catch (final Exception e) { System.out.println("exception in readLines " + e); e.printStackTrace(); } @@ -190,17 +196,17 @@ protected void readLines(String fileText) { /** * @param entries */ - private void populateHeaders (String[] entries) { + private void populateHeaders(final String[] entries) { header.clear(); if (entries != null) { - for (String entry : entries) { + for (final String entry : entries) { header.add(entry); } -/* for (int i = header.size(); i < nbOfColumns; i++) { - header.add(""); - }*/ + /* + * for (int i = header.size(); i < nbOfColumns; i++) { header.add(""); } + */ } else { for (int i = 1; i < nbOfColumns + 1; i++) { header.add("Column" + i); @@ -218,7 +224,7 @@ public ArrayList getHeader() { /** * @return */ - public String[] getArrayHeader () { + public String[] getArrayHeader() { return header.toArray(new String[header.size()]); } @@ -228,42 +234,40 @@ public String[] getArrayHeader () { /** * */ - public void addRow () { - CSVRow row = CSVRow.createEmptyLine(nbOfColumns, this); + public void addRow() { + final CSVRow row = CSVRow.createEmptyLine(nbOfColumns, this); addRow(row); } /** * @param row */ - public void addRow (CSVRow row) { + public void addRow(final CSVRow row) { rows.add(row); } /** * @param row */ - public void addRowAfterElement (CSVRow row) { - CSVRow newRow = CSVRow.createEmptyLine(nbOfColumns, this); - int indexRow = findRow(row); + public void addRowAfterElement(final CSVRow row) { + final CSVRow newRow = CSVRow.createEmptyLine(nbOfColumns, this); + final int indexRow = findRow(row); if (indexRow != -1) { rows.add(indexRow, newRow); - } - else { + } else { addRow(newRow); } } - + /** * @param row */ - public void duplicateRow (CSVRow row) { - CSVRow newRow = new CSVRow(row, this); - int indexRow = findRow(row); + public void duplicateRow(final CSVRow row) { + final CSVRow newRow = new CSVRow(row, this); + final int indexRow = findRow(row); if (indexRow != -1) { rows.add(indexRow, newRow); - } - else { + } else { addRow(newRow); } } @@ -272,9 +276,9 @@ public void duplicateRow (CSVRow row) { * @param row * @return */ - public int findRow (CSVRow findRow) { + public int findRow(final CSVRow findRow) { for (int i = 0; i <= getArrayRows(true).length; i++) { - CSVRow row = getRowAt(i); + final CSVRow row = getRowAt(i); if (row.equals(findRow)) { return i; } @@ -292,10 +296,10 @@ public List getRows() { /** * @return */ - public Object[] getArrayRows (boolean includeCommentLine) { + public Object[] getArrayRows(final boolean includeCommentLine) { // filter header and comment rows - ArrayList myrows = new ArrayList(); - for (CSVRow row : rows) { + final ArrayList myrows = new ArrayList<>(); + for (final CSVRow row : rows) { // should we return the comment line if (row.isCommentLine()) { if (includeCommentLine) { @@ -314,36 +318,37 @@ else if (!row.isHeader()) { * @param index * @return */ - public CSVRow getRowAt (int index) { + public CSVRow getRowAt(final int index) { return rows.get(index); } /** - * @see org.fhsolution.eclipse.plugins.csvedit.model.IRowChangesListener#rowChanged(org.fhsolution.eclipse.plugins.csvedit.model.CSVRow, int) + * @see org.fhsolution.eclipse.plugins.csvedit.model.IRowChangesListener#rowChanged(org.fhsolution.eclipse.plugins.csvedit.model.CSVRow, + * int) */ - public void rowChanged (CSVRow row, int rowIndex) { - for (ICsvFileModelListener l : listeners) { - ((ICsvFileModelListener) l).entryChanged(row, rowIndex); + @Override + public void rowChanged(final CSVRow row, final int rowIndex) { + for (final ICsvFileModelListener l : listeners) { + l.entryChanged(row, rowIndex); } } /** * @param rowIndex */ - public void removeRow (int rowIndex) { + public void removeRow(final int rowIndex) { rows.remove(rowIndex); } /** * */ - public void removeRow (CSVRow row) { + public void removeRow(final CSVRow row) { if (!rows.remove(row)) { // TODO return error message } } - // ---------------------------------- // Helper method on column management // ---------------------------------- @@ -351,10 +356,10 @@ public void removeRow (CSVRow row) { /** * @param colName */ - public void addColumn (String colName) { + public void addColumn(final String colName) { nbOfColumns++; header.add(colName); - for (CSVRow row : rows) { + for (final CSVRow row : rows) { row.addElement(""); } } @@ -371,14 +376,14 @@ public int getColumnCount() { * * @param colIndex */ - public void removeColumn (int colIndex) { + public void removeColumn(final int colIndex) { if (isFirstLineHeader()) { header.remove(colIndex); nbOfColumns--; } - for (CSVRow row : rows) { + for (final CSVRow row : rows) { if (!row.isCommentLine()) { - System.out.println("remove elmt:["+colIndex+"] in row [" + row +"]"); + System.out.println("remove elmt:[" + colIndex + "] in row [" + row + "]"); row.removeElementAt(colIndex); } } @@ -389,38 +394,39 @@ public void removeColumn (int colIndex) { * * @param colIndex */ - public void removeColumn (String columnName) { + public void removeColumn(final String columnName) { if (columnName == null) { return; } - int colIndex = header.indexOf(columnName); + final int colIndex = header.indexOf(columnName); removeColumn(colIndex); } /** * @param csvFileListener */ - public void removeModelListener (ICsvFileModelListener csvFileListener) { + public void removeModelListener(final ICsvFileModelListener csvFileListener) { listeners.remove(csvFileListener); } /** * @param csvFileListener */ - public void addModelListener (ICsvFileModelListener csvFileListener) { - if (!listeners.contains(csvFileListener)) + public void addModelListener(final ICsvFileModelListener csvFileListener) { + if (!listeners.contains(csvFileListener)) { listeners.add(csvFileListener); + } } /** * Initialize the CsvWriter + * * @param writer * @return */ - protected CsvWriter initializeWriter (Writer writer) - { - char delimiter = getCustomDelimiter(); - CsvWriter csvWriter = new CsvWriter(writer, delimiter); + protected CsvWriter initializeWriter(final Writer writer) { + final char delimiter = getCustomDelimiter(); + final CsvWriter csvWriter = new CsvWriter(writer, delimiter); csvWriter.setTextQualifier(getTextQualifier()); csvWriter.setForceQualifier(useQualifier()); csvWriter.setComment(getCommentChar()); @@ -430,32 +436,28 @@ protected CsvWriter initializeWriter (Writer writer) /** * @return */ - public String getTextRepresentation () { + public String getTextRepresentation() { - StringWriter sw = new StringWriter(); + final StringWriter sw = new StringWriter(); try { - CsvWriter clw = initializeWriter(sw); + final CsvWriter clw = initializeWriter(sw); /* - if (isFirstLineHeader() && header.size() > 0) { - String[] headerArray = new String[header.size()]; - for (int i=0; i 0) { String[] headerArray = new + * String[header.size()]; for (int i=0; i - - 4.0.0 - - csvedit - org.nodeclipse - 1.2.0-SNAPSHOT - - csvedit.site - eclipse-repository - csvedit :: update site + + 4.0.0 + + csvedit + org.nodeclipse + 1.2.0-SNAPSHOT + + csvedit.site + eclipse-repository + csvedit :: update site diff --git a/csvedit.target/csvedit.target b/csvedit.target/csvedit.target new file mode 100644 index 0000000..6b2e3ca --- /dev/null +++ b/csvedit.target/csvedit.target @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + org.jumpmind.symmetric + symmetric-csv + 2.5.13 + jar + + + + + \ No newline at end of file diff --git a/csvedit.target/pom.xml b/csvedit.target/pom.xml new file mode 100644 index 0000000..3aeae87 --- /dev/null +++ b/csvedit.target/pom.xml @@ -0,0 +1,13 @@ + + + 4.0.0 + + org.nodeclipse + csvedit + 1.2.0-SNAPSHOT + + csvedit.target + eclipse-target-definition + \ No newline at end of file diff --git a/pom.xml b/pom.xml index 308f723..947ee38 100644 --- a/pom.xml +++ b/pom.xml @@ -1,99 +1,271 @@ - - 4.0.0 - org.nodeclipse - csvedit - 1.2.0-SNAPSHOT - pom - csvedit :: parent - csvedit parent + + 4.0.0 + org.nodeclipse + csvedit + 1.2.0-SNAPSHOT + pom + csvedit :: parent + csvedit parent - - 3.0 - + + 17 + 4.0.4 + -Xmx512m -XX:MaxPermSize=256m + UTF-8 + - - 1.6 - 3.0 - 1.0.0 - -Xmx512m -XX:MaxPermSize=256m - UTF-8 - + + scm:git@github.com:gnl42/CsvEdit.git + scm:git@github.com:gnl42/CsvEdit.git + https://github.com/gnl42/CsvEdit + - - - luna - p2 - http://download.eclipse.org/releases/luna - - - - - sonatype-public - http://repository.sonatype.org/content/groups/sonatype-public-grid - - + + + + + org.apache.maven.plugins + maven-javadoc-plugin + 3.5.0 + + + org.apache.maven.plugins + maven-site-plugin + 3.12.1 + + + org.apache.maven.plugins + maven-deploy-plugin + 3.1.1 + + + org.codehaus.mojo + build-helper-maven-plugin + 3.4.0 + + + org.apache.maven.plugins + maven-surefire-report-plugin + 3.1.2 + + + org.apache.maven.plugins + maven-enforcer-plugin + 3.3.0 + + + org.apache.maven.plugins + maven-resources-plugin + 3.3.1 + + + org.apache.maven.plugins + maven-clean-plugin + 3.3.1 + + + org.apache.maven.plugins + maven-jxr-plugin + 3.3.0 + + + org.eclipse.tycho + tycho-compiler-plugin + ${tycho.version} + + + org.eclipse.tycho + tycho-maven-plugin + ${tycho.version} + true + + + org.eclipse.tycho + tycho-p2-repository-plugin + ${tycho.version} + + + org.eclipse.tycho + tycho-source-plugin + ${tycho.version} + + + org.eclipse.tycho.extras + tycho-source-feature-plugin + ${tycho.version} + + + org.eclipse.tycho + tycho-p2-plugin + ${tycho.version} + + + org.eclipse.tycho + tycho-versions-plugin + ${tycho.version} + + + org.eclipse.tycho + tycho-p2-director-plugin + ${tycho.version} + + + org.eclipse.tycho + tycho-surefire-plugin + ${tycho.version} + + + org.eclipse.tycho + target-platform-configuration + ${tycho.version} + + + org.eclipse.tycho.extras + tycho-eclipserun-plugin + ${tycho.version} + + + org.eclipse.tycho.extras + tycho-pack200a-plugin + ${tycho.version} + + + org.eclipse.tycho.extras + tycho-pack200b-plugin + ${tycho.version} + + + org.eclipse.cbi.maven.plugins + eclipse-jarsigner-plugin + 1.4.2 + + + + + + org.apache.maven.plugins + maven-resources-plugin + + UTF-8 + + + + org.eclipse.tycho + tycho-compiler-plugin + + 17 + true + true + + + + org.eclipse.tycho + tycho-maven-plugin + true + + + org.eclipse.tycho + tycho-p2-repository-plugin + + + org.eclipse.tycho + tycho-packaging-plugin + ${tycho.version} + + + org.codehaus.mojo + exec-maven-plugin + 3.1.0 + + + org.eclipse.tycho + tycho-p2-plugin + + + attach-p2-metadata + package + + p2-metadata + + + + + + org.eclipse.tycho + tycho-versions-plugin + + + org.eclipse.tycho + tycho-surefire-plugin + + false + true + true + + + ${ui.test.vmargs} + + + org.eclipse.equinox.launcher + 4 + true + + + + + + + + + p2-installable-unit + org.eclipse.equinox.event + + + + + + org.eclipse.tycho + target-platform-configuration + + + + linux + gtk + x86_64 + + + win32 + win32 + x86_64 + + + macosx + cocoa + x86_64 + + + + + org.nodeclipse + csvedit.target + 1.2.0-SNAPSHOT + + + + + + - - - - org.eclipse.tycho - tycho-maven-plugin - ${tycho.version} - true - - - org.eclipse.tycho - target-platform-configuration - ${tycho.version} - - p2 - consider - true - - - - - - - - org.eclipse.tycho - tycho-packaging-plugin - ${tycho.version} - - yyyyMMdd-HHmm - - - - org.eclipse.tycho - tycho-surefire-plugin - ${tycho.version} - - true - - **/*Test.java - - ${tycho.test.jvmArgs} - - 60 - - - - org.apache.maven.plugins - maven-assembly-plugin - 2.3 - - - - - - csvedit.plugin - csvedit.plugin.ui - csvedit.feature - - csvedit.site - + + csvedit.target + csvedit.plugin + csvedit.plugin.ui + csvedit.feature + csvedit.site + \ No newline at end of file From 0e4f44dde7e567f05ad51cbe082fa6931b154f2d Mon Sep 17 00:00:00 2001 From: George Lindholm <66577321+gnl42@users.noreply.github.com> Date: Tue, 12 Dec 2023 23:08:47 -0800 Subject: [PATCH 02/18] Fix NPE --- .../csvedit/providers/CSVLabelProvider.java | 48 ++++++++++--------- 1 file changed, 26 insertions(+), 22 deletions(-) diff --git a/csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/providers/CSVLabelProvider.java b/csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/providers/CSVLabelProvider.java index e85b72a..d0c6fdf 100644 --- a/csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/providers/CSVLabelProvider.java +++ b/csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/providers/CSVLabelProvider.java @@ -37,12 +37,12 @@ public class CSVLabelProvider extends StyledCellLabelProvider { //implements ITableLabelProvider private String searchText; - private Color searchColor; + private final Color searchColor; /** * */ - public CSVLabelProvider () { + public CSVLabelProvider() { searchColor = Display.getCurrent().getSystemColor(SWT.COLOR_YELLOW); } @@ -51,7 +51,7 @@ public CSVLabelProvider () { * @param columnIndex * @return */ - public Image getColumnImage(Object element, int columnIndex) { + public Image getColumnImage(final Object element, final int columnIndex) { return null; } @@ -60,11 +60,12 @@ public Image getColumnImage(Object element, int columnIndex) { * @param columnIndex * @return */ - public String getColumnText(Object element, int columnIndex) { - CSVRow row = (CSVRow) element; + public String getColumnText(final Object element, final int columnIndex) { + final CSVRow row = (CSVRow) element; - if(row.getEntries().size() > columnIndex) { - return row.getEntries().get(columnIndex).toString(); + if (row.getEntries().size() > columnIndex) { + final String entry = row.getEntries().get(columnIndex); + return entry != null ? entry.toString() : ""; } return ""; @@ -73,32 +74,37 @@ public String getColumnText(Object element, int columnIndex) { /** * @see org.eclipse.jface.viewers.BaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener) */ - public void addListener(ILabelProviderListener listener) { + @Override + public void addListener(final ILabelProviderListener listener) { } /** - * @see org.eclipse.jface.viewers.BaseLabelProvider#isLabelProperty(java.lang.Object, java.lang.String) + * @see org.eclipse.jface.viewers.BaseLabelProvider#isLabelProperty(java.lang.Object, + * java.lang.String) */ - public boolean isLabelProperty(Object element, String property) { + @Override + public boolean isLabelProperty(final Object element, final String property) { return true; } /** * @see org.eclipse.jface.viewers.BaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener) */ - public void removeListener(ILabelProviderListener listener) { + @Override + public void removeListener(final ILabelProviderListener listener) { } /** * @param searchText */ - public void setSearchText(String searchText) { + public void setSearchText(final String searchText) { this.searchText = searchText; } /** * @see org.eclipse.jface.viewers.StyledCellLabelProvider#dispose() */ + @Override public void dispose() { } @@ -106,24 +112,22 @@ public void dispose() { * @see org.eclipse.jface.viewers.StyledCellLabelProvider#update(org.eclipse.jface.viewers.ViewerCell) */ @Override - public void update(ViewerCell cell) { - CSVRow element = (CSVRow) cell.getElement(); - int index = cell.getColumnIndex(); - String columnText = getColumnText(element, index); + public void update(final ViewerCell cell) { + final CSVRow element = (CSVRow) cell.getElement(); + final int index = cell.getColumnIndex(); + final String columnText = getColumnText(element, index); cell.setText(columnText); cell.setImage(getColumnImage(element, index)); if (searchText != null && searchText.length() > 0) { - int intRangesCorrectSize[] = - SearchResultStyle.getSearchTermOccurrences(searchText, columnText); - List styleRange = new ArrayList(); + final int intRangesCorrectSize[] = SearchResultStyle.getSearchTermOccurrences(searchText, columnText); + final List styleRange = new ArrayList<>(); for (int i = 0; i < intRangesCorrectSize.length / 2; i++) { - StyleRange myStyleRange = new StyleRange(0, 0, null, searchColor); + final StyleRange myStyleRange = new StyleRange(0, 0, null, searchColor); myStyleRange.start = intRangesCorrectSize[i]; myStyleRange.length = intRangesCorrectSize[++i]; styleRange.add(myStyleRange); } - cell.setStyleRanges(styleRange.toArray(new StyleRange[styleRange - .size()])); + cell.setStyleRanges(styleRange.toArray(new StyleRange[styleRange.size()])); } else { cell.setStyleRanges(null); } From e035141f3f7722651ebf97f06d49ab388cbba1b6 Mon Sep 17 00:00:00 2001 From: George Lindholm <66577321+gnl42@users.noreply.github.com> Date: Tue, 12 Dec 2023 23:26:17 -0800 Subject: [PATCH 03/18] Deploy to GitHub #9 mvn clean deploy -P release-composite --- csvedit.site/packaging-p2composite.ant | 181 ++++++++++++++++++++ csvedit.site/pom.xml | 221 +++++++++++++++++++++++++ pom.xml | 42 ++++- 3 files changed, 441 insertions(+), 3 deletions(-) create mode 100644 csvedit.site/packaging-p2composite.ant diff --git a/csvedit.site/packaging-p2composite.ant b/csvedit.site/packaging-p2composite.ant new file mode 100644 index 0000000..f9bd40c --- /dev/null +++ b/csvedit.site/packaging-p2composite.ant @@ -0,0 +1,181 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + version=1 +metadata.repository.factory.order=compositeContent.xml,\! +artifact.repository.factory.order=compositeArtifacts.xml,\! + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/csvedit.site/pom.xml b/csvedit.site/pom.xml index 8b03533..0027ec7 100644 --- a/csvedit.site/pom.xml +++ b/csvedit.site/pom.xml @@ -11,4 +11,225 @@ csvedit.site eclipse-repository csvedit :: update site + + + + + org.eclipse.tycho + tycho-packaging-plugin + + 'v'yyyyMMdd'-'HHmm + + + + + org.eclipse.tycho + tycho-p2-repository-plugin + + ${project.artifactId}-${qualifiedVersion} + + + + + + + + + release-composite + + false + + + + + + org.codehaus.mojo + build-helper-maven-plugin + + + + parse-version + + parse-version + + + + + + org.codehaus.mojo + exec-maven-plugin + + git + + + + git-clone + prepare-package + + exec + + + + clone + --depth=1 + -b + master + ${github-update-repo} + ${github-local-clone} + + + + + git-add + verify + + exec + + + + -C + ${github-local-clone} + add + -A + + + + + git-commit + verify + + exec + + + + -C + ${github-local-clone} + commit + -m + Release ${qualifiedVersion} + + + + + git-push + deploy + + exec + + + + -C + ${github-local-clone} + push + origin + master + + + + + + + maven-resources-plugin + + + copy-repository + package + + copy-resources + + + + ${current-release-directory} + + + + ${project.build.directory}/repository + + + + + + + + org.eclipse.tycho.extras + tycho-eclipserun-plugin + + + + eclipse-version + p2 + + https://download.eclipse.org/releases/2023-06 + + + + + org.eclipse.ant.core + eclipse-plugin + + + org.apache.ant + eclipse-plugin + + + + org.eclipse.equinox.p2.repository.tools + eclipse-plugin + + + + org.eclipse.equinox.p2.core.feature + eclipse-feature + + + + org.eclipse.equinox.p2.extras.feature + eclipse-feature + + + org.eclipse.rcp + eclipse-feature + + + + + + + add-p2-composite-repository + package + + eclipse-run + + + + -application + org.eclipse.ant.core.antRunner + -buildfile + packaging-p2composite.ant + p2.composite.add + -Dsite.label="${site.label}" + + -Dcomposite.base.dir=${github-local-clone} + + -DunqualifiedVersion=${unqualifiedVersion} + -DbuildQualifier=${buildQualifier} + + -DparsedVersion.majorVersion=${parsedVersion.majorVersion} + + -DparsedVersion.minorVersion=${parsedVersion.minorVersion} + + + + + + + + + diff --git a/pom.xml b/pom.xml index 947ee38..a9cb6d8 100644 --- a/pom.xml +++ b/pom.xml @@ -15,12 +15,21 @@ 4.0.4 -Xmx512m -XX:MaxPermSize=256m UTF-8 + + + + git@github.com:Mathieuu/CsvEdit-update.git + ${project.build.directory}/checkout + ${github-local-clone}/releases + ${releases-directory}/${qualifiedVersion} + + CsvEdit-update - scm:git@github.com:gnl42/CsvEdit.git - scm:git@github.com:gnl42/CsvEdit.git - https://github.com/gnl42/CsvEdit + scm:git@github.com:Mathieuu/CsvEdit.git + scm:git@github.com:Mathieuu/CsvEdit.git + https://github.com/Mathieuu/CsvEdit @@ -261,6 +270,33 @@ + + + + release-composite + + + + + maven-install-plugin + + + default-install + none + + + + + maven-deploy-plugin + + true + + + + + + + csvedit.target csvedit.plugin From b6e6104eae3e30e22ea1f7c0f457a09c9693db54 Mon Sep 17 00:00:00 2001 From: George Lindholm <66577321+gnl42@users.noreply.github.com> Date: Wed, 13 Dec 2023 00:35:41 -0800 Subject: [PATCH 04/18] Fix column sorting #17 --- .../csvedit/editors/MultiPageCSVEditor.java | 1550 ++++++++--------- .../csvedit/sorter/CSVTableSorter.java | 27 +- 2 files changed, 781 insertions(+), 796 deletions(-) diff --git a/csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/editors/MultiPageCSVEditor.java b/csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/editors/MultiPageCSVEditor.java index e233cc1..ff8688d 100644 --- a/csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/editors/MultiPageCSVEditor.java +++ b/csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/editors/MultiPageCSVEditor.java @@ -66,810 +66,792 @@ import org.fhsolution.eclipse.plugins.csvedit.sorter.CSVTableSorter; /** - * + * * @author fhenri * @author msavy - * + * */ -public abstract class MultiPageCSVEditor extends MultiPageEditorPart implements - IResourceChangeListener { +public abstract class MultiPageCSVEditor extends MultiPageEditorPart implements IResourceChangeListener { + + private boolean isPageModified; + + /** index of the source page */ + public static final int indexSRC = 1; + /** index of the table page */ + public static final int indexTBL = 0; + + /** The text editor used in page 0. */ + protected TextEditor editor; + + /** The table viewer used in page 1. */ + protected TableViewer tableViewer; - private boolean isPageModified; - - /** index of the source page */ - public static final int indexSRC = 1; - /** index of the table page */ - public static final int indexTBL = 0; + private CSVTableSorter tableSorter; - /** The text editor used in page 0. */ - protected TextEditor editor; + private Menu tableHeaderMenu; - /** The table viewer used in page 1. */ - protected TableViewer tableViewer; + private final AbstractCSVFile model; + + /** + * + */ + private final ICsvFileModelListener csvFileListener = new ICsvFileModelListener() { + @Override + public void entryChanged(final CSVRow row, final int rowIndex) { + // tableViewer.update(row, new String[] { Integer.toString(rowIndex) + // }); + tableModified(); + } + }; + + /** + * Creates a multi-page editor example. + */ + public MultiPageCSVEditor() { + super(); + ResourcesPlugin.getWorkspace().addResourceChangeListener(this); + model = createCSVFile(); + } + + /** + * Create the CSV file object. Class that extends the MultiPageCSVEditor + * must implement this class. + * + * @return an {@link AbstractCSVFile} object which provides the contents as well + * as some formatting information such as the delimiter and extra meta + * information + */ + protected abstract AbstractCSVFile createCSVFile(); - private CSVTableSorter tableSorter; + /** + * Creates the pages of the multi-page editor. + * + * @see org.eclipse.ui.part.MultiPageEditorPart#createPages() + */ + @Override + protected void createPages() { + try { + createTablePage(); + createSourcePage(); + updateTitle(); + populateTablePage(); + } catch (final Exception e) { + System.err.println(e); + e.printStackTrace(); + } + } + + /** + * Creates page 0 of the multi-page editor, which contains a text editor. + */ + private void createSourcePage() { + try { + editor = new CSVTextEditor(model.getCustomDelimiter()); + addPage(editor, getEditorInput()); + setPageText(indexSRC, "CSV Source"); + } catch (final PartInitException e) { + ErrorDialog.openError(getSite().getShell(), "Error creating nested text editor", null, e.getStatus()); + } + } + + /** + * + */ + private void createTablePage() { + final Composite parent = getContainer(); + + // XXX move all the creation into its own component + final Canvas canvas = new Canvas(parent, SWT.None); + + final GridLayout layout = new GridLayout(6, false); + canvas.setLayout(layout); + + // create the header part with the search function and Add/Delete rows + final Label searchLabel = new Label(canvas, SWT.NONE); + searchLabel.setText("Filter: "); + final Text searchText = new Text(canvas, SWT.BORDER | SWT.SEARCH); + searchText.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL)); + + // Create and configure the buttons + final Button duplicate = new Button(canvas, SWT.PUSH | SWT.CENTER); + duplicate.setText("Duplicate"); + duplicate.setToolTipText("Duplicate the current row"); + final GridData buttonDuplicateGridData = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING); + buttonDuplicateGridData.widthHint = 80; + duplicate.setLayoutData(buttonDuplicateGridData); + duplicate.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(final SelectionEvent e) { + final CSVRow row = (CSVRow) ((IStructuredSelection) tableViewer.getSelection()).getFirstElement(); + if (row != null) { + model.duplicateRow(row); + tableModified(); + } + } + }); + + final Button insert = new Button(canvas, SWT.PUSH | SWT.CENTER); + insert.setText("Insert Row"); + insert.setToolTipText("Insert a new row before the current one"); + final GridData buttonInsertGridData = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING); + buttonInsertGridData.widthHint = 80; + insert.setLayoutData(buttonInsertGridData); + insert.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(final SelectionEvent e) { + final CSVRow row = (CSVRow) ((IStructuredSelection) tableViewer.getSelection()).getFirstElement(); + if (row != null) { + model.addRowAfterElement(row); + tableModified(); + } + } + }); + /* + * insert.addKeyListener(new KeyAdapter() { public void keyPressed(KeyEvent e) { + * //if(((e.stateMask & SWT.CTRL) != 0) & (e.keyCode == 'd')) { //if + * (e.stateMask == SWT.CTRL && e.keyCode == 'd') { if (e.character == SWT.DEL) { + * CSVRow row = (CSVRow) ((IStructuredSelection) + * tableViewer.getSelection()).getFirstElement(); if (row != null) { + * model.addLineAfterElement(row); tableViewer.refresh(); tableModified(); } } } + * }); + */ + + final Button add = new Button(canvas, SWT.PUSH | SWT.CENTER); + add.setText("Add Row"); + add.setToolTipText("Add a new row at the end of the file"); + final GridData buttonAddGridData = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING); + buttonAddGridData.widthHint = 80; + add.setLayoutData(buttonAddGridData); + add.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(final SelectionEvent e) { + model.addRow(); + tableModified(); + } + }); + + final Button delete = new Button(canvas, SWT.PUSH | SWT.CENTER); + delete.setText("Delete Row"); + delete.setToolTipText("Delete the current row"); + final GridData buttonDelGridData = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING); + buttonDelGridData.widthHint = 80; + delete.setLayoutData(buttonDelGridData); + delete.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(final SelectionEvent e) { + CSVRow row = (CSVRow) ((IStructuredSelection) tableViewer.getSelection()).getFirstElement(); + + while (row != null) { + row = (CSVRow) ((IStructuredSelection) tableViewer.getSelection()).getFirstElement(); + if (row != null) { + model.removeRow(row); + tableModified(); + } + } + } + }); + /* + * insert.addKeyListener(new KeyAdapter() { public void keyPressed(KeyEvent e) { + * if (e.stateMask == SWT.CTRL && e.keyCode == 'd') { CSVRow row = (CSVRow) + * ((IStructuredSelection) tableViewer.getSelection()).getFirstElement(); if + * (row != null) { model.removeLine(row); tableViewer.refresh(); + * tableModified(); } } } }); + */ + /* + * + * // manage 1st line - should only be visible if global option is set if + * (pref.getUseFirstLineAsHeader()) { Label encodingLineLabel = new + * Label(canvas, SWT.NONE); encodingLineLabel.setText("Display 1st line"); final + * Button encodingLineBtn = new Button(canvas, SWT.CHECK); + * encodingLineBtn.setLayoutData(new + * GridData(GridData.HORIZONTAL_ALIGN_BEGINNING)); + * encodingLineBtn.setSelection(true); encodingLineBtn.addSelectionListener(new + * SelectionAdapter() { public void widgetSelected(SelectionEvent e) { + * model.displayFirstLine(encodingLineBtn.getSelection()); + * updateTableFromTextEditor(); } }); } sensitiveBtn.addSelectionListener(new + * SelectionAdapter() { public void widgetSelected(SelectionEvent e) { + * tableFilter.setSearchText(searchText.getText(), sensitiveBtn.getSelection()); + * labelProvider.setSearchText(searchText.getText()); tableViewer.refresh(); } + * }); + */ + tableViewer = new TableViewer(canvas, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER); + tableViewer.setUseHashlookup(true); + final Table table = tableViewer.getTable(); + table.setHeaderVisible(true); + table.setLinesVisible(true); + + // set the sorter for the table + tableSorter = new CSVTableSorter(); + tableViewer.setComparator(tableSorter); + + // set a table filter + final CSVTableFilter tableFilter = new CSVTableFilter(); + tableViewer.addFilter(tableFilter); + + // add the filtering and coloring when searching specific elements. + searchText.addKeyListener(new KeyAdapter() { + @Override + public void keyReleased(final KeyEvent ke) { + tableFilter.setSearchText(searchText.getText(), model.getSensitiveSearch()); + final String filterText = searchText.getText(); + for (int i = 0; i < tableViewer.getColumnProperties().length; i++) { + final CellLabelProvider labelProvider = tableViewer.getLabelProvider(i); + if (labelProvider != null) { + ((CSVLabelProvider) labelProvider).setSearchText(filterText); + } + } + tableViewer.refresh(); + } + }); + + /* + * // create a TableCursor to navigate around the table final TableCursor cursor + * = new TableCursor(table, SWT.NONE); // create an editor to edit the cell when + * the user hits "ENTER" // while over a cell in the table final ControlEditor + * editor = new ControlEditor(cursor); editor.grabHorizontal = true; + * editor.grabVertical = true; + * + * cursor.addSelectionListener(new SelectionAdapter() { // This is called as the + * user navigates around the table public void widgetSelected(SelectionEvent e) + * { // Select the row in the table where the TableCursor is + * table.setSelection(new TableItem[] {cursor.getRow()}); } + * + * // when the user hits "ENTER" in the TableCursor, // pop up a text editor so + * that user can change the text of the cell public void + * widgetDefaultSelected(SelectionEvent e) { // Begin an editing session final + * Text text = new Text(cursor, SWT.NONE); + * + * // Copy the text from the cell to the Text int column = cursor.getColumn(); + * text.setText(cursor.getRow().getText(column)); + * + * // Add a handler to detect key presses text.addKeyListener(new KeyAdapter() { + * public void keyPressed(KeyEvent e) { // tab will save & move to the next + * column if (e.character == SWT.TAB) { TableItem row = cursor.getRow(); int + * column = cursor.getColumn(); row.setText(column, text.getText()); + * text.dispose(); cursor.setSelection(row, column+1); tableModified(); } // + * close the text editor and copy the data over // when the user hits "ENTER" if + * (e.character == SWT.CR) { TableItem row = cursor.getRow(); + * row.setText(cursor.getColumn(), text.getText()); tableModified(); + * text.dispose(); } // close the text editor when the user hits "ESC" if + * (e.character == SWT.ESC) { text.dispose(); } } }); // close the text editor + * when the user tabs away text.addFocusListener(new FocusAdapter() { public + * void focusLost(FocusEvent e) { text.dispose(); } }); editor.setEditor(text); + * text.setFocus(); } }); + * + * /* // Hide the TableCursor when the user hits the "CTRL" or "SHIFT" key. // + * This allows the user to select multiple items in the table. + * cursor.addKeyListener(new KeyAdapter() { public void keyPressed(KeyEvent e) { + * + * // delete line if (e.character == SWT.DEL) { TableItem row = cursor.getRow(); + * tableModified(); row.dispose(); //table.showItem(row); + * //cursor.setSelection(row, 0); } + * + * // insert line if (e.character == (char) SWT.F8) { TableItem row = + * cursor.getRow(); row.dispose(); } + * + * // add line + * + * cursor.setVisible(true); cursor.setFocus(); + * + * if (e.keyCode == SWT.CTRL || e.keyCode == SWT.SHIFT || (e.stateMask & + * SWT.CONTROL) != 0 || (e.stateMask & SWT.SHIFT) != 0) { + * cursor.setVisible(false); return; } } }); + * + * // When the user double clicks in the TableCursor, pop up a text editor so + * that // they can change the text of the cell. cursor.addMouseListener(new + * MouseAdapter() { public void mouseDown(MouseEvent e) { final Text text = new + * Text(cursor, SWT.NONE); TableItem row = cursor.getRow(); int column = + * cursor.getColumn(); text.setText(row.getText(column)); + * text.addKeyListener(new KeyAdapter() { public void keyPressed(KeyEvent e) { + * // close the text editor and copy the data over // when the user hits "ENTER" + * if (e.character == SWT.CR) { TableItem row = cursor.getRow(); int column = + * cursor.getColumn(); row.setText(column, text.getText()); tableModified(); + * text.dispose(); } // close the text editor when the user hits "ESC" if + * (e.character == SWT.ESC) { text.dispose(); } } }); // close the text editor + * when the user clicks away text.addFocusListener(new FocusAdapter() { public + * void focusLost(FocusEvent e) { text.dispose(); } }); editor.setEditor(text); + * text.setFocus(); } }); + * + * // Show the TableCursor when the user releases the "SHIFT" or "CTRL" key. // + * This signals the end of the multiple selection task. table.addKeyListener(new + * KeyAdapter() { public void keyReleased(KeyEvent e) { + * + * if (e.keyCode == SWT.CONTROL && (e.stateMask & SWT.SHIFT) != 0) return; if + * (e.keyCode == SWT.SHIFT && (e.stateMask & SWT.CONTROL) != 0) return; if + * (e.keyCode != SWT.CONTROL && (e.stateMask & SWT.CONTROL) != 0) return; if + * (e.keyCode != SWT.SHIFT && (e.stateMask & SWT.SHIFT) != 0) return; + * + * TableItem[] selection = table.getSelection(); TableItem row = + * (selection.length == 0) ? table.getItem(table.getTopIndex()) : selection[0]; + * table.showItem(row); cursor.setSelection(row, 0); cursor.setVisible(true); + * cursor.setFocus(); } }); + */ + + /* + * tableViewer.addDoubleClickListener(new IDoubleClickListener() { + * + * public void doubleClick(DoubleClickEvent event) { + * + * CSVRow row = (CSVRow) ((IStructuredSelection) + * tableViewer.getSelection()).getFirstElement(); DetailedView input = new + * DetailedView(Display.getDefault(), model.getHeader(), row); + * + * input.open(); + * + * } }); + */ + + // Layout the viewer + final GridData gridData = new GridData(); + gridData.verticalAlignment = GridData.FILL; + gridData.horizontalSpan = 6; + gridData.grabExcessHorizontalSpace = true; + gridData.grabExcessVerticalSpace = true; + gridData.horizontalAlignment = GridData.FILL; + tableViewer.getControl().setLayoutData(gridData); + + addPage(canvas); + setPageText(indexTBL, "CSV Table"); + } + + /** + * Set Name of the file to the tab + */ + private void updateTitle() { + final IEditorInput input = getEditorInput(); + setPartName(input.getName()); + setTitleToolTip(input.getToolTipText()); + } + + /** + * @throws Exception + */ + private void populateTablePage() throws Exception { + tableViewer.setContentProvider(new CSVContentProvider()); - private Menu tableHeaderMenu; + // make the selection available + getSite().setSelectionProvider(tableViewer); - private AbstractCSVFile model; + tableViewer.getTable().getDisplay().asyncExec(new Runnable() { + @Override + public void run() { + updateTableFromTextEditor(); + } + }); + } - /** + /** * */ - private final ICsvFileModelListener csvFileListener = new ICsvFileModelListener() { - public void entryChanged(CSVRow row, int rowIndex) { - // tableViewer.update(row, new String[] { Integer.toString(rowIndex) - // }); - tableModified(); - } - }; - - /** - * Creates a multi-page editor example. - */ - public MultiPageCSVEditor() { - super(); - ResourcesPlugin.getWorkspace().addResourceChangeListener(this); - model = createCSVFile(); - } - - /** - * Create the CSV file object. Class that extends the MultiPageCSVEditor - * must implement this class. - * - * @return an {@link AbstractCSVFile} object which provides the contents as - * well as some formatting information such as the delimiter and - * extra meta information - */ - protected abstract AbstractCSVFile createCSVFile(); - - /** - * Creates the pages of the multi-page editor. - * - * @see org.eclipse.ui.part.MultiPageEditorPart#createPages() - */ - protected void createPages() { - try { - createTablePage(); - createSourcePage(); - updateTitle(); - populateTablePage(); - } catch (Exception e) { - System.err.println(e); - e.printStackTrace(); - } - } - - /** - * Creates page 0 of the multi-page editor, which contains a text editor. - */ - private void createSourcePage() { - try { - editor = new CSVTextEditor(model.getCustomDelimiter()); - addPage(editor, getEditorInput()); - setPageText(indexSRC, "CSV Source"); - } catch (PartInitException e) { - ErrorDialog.openError(getSite().getShell(), - "Error creating nested text editor", null, e.getStatus()); - } - } - - /** + public void tableModified() { + tableViewer.refresh(); + final boolean wasPageModified = isPageModified; + isPageModified = true; + if (!wasPageModified) { + firePropertyChange(IEditorPart.PROP_DIRTY); + editor.validateEditorInputState(); // will invoke: + // FileModificationValidator.validateEdit() + // (expected by some repository + // providers) + } + } + + /** * */ - private void createTablePage() { - Composite parent = getContainer(); - - // XXX move all the creation into its own component - Canvas canvas = new Canvas(parent, SWT.None); - - GridLayout layout = new GridLayout(6, false); - canvas.setLayout(layout); - - // create the header part with the search function and Add/Delete rows - Label searchLabel = new Label(canvas, SWT.NONE); - searchLabel.setText("Filter: "); - final Text searchText = new Text(canvas, SWT.BORDER | SWT.SEARCH); - searchText.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL - | GridData.HORIZONTAL_ALIGN_FILL)); - - // Create and configure the buttons - Button duplicate = new Button(canvas, SWT.PUSH | SWT.CENTER); - duplicate.setText("Duplicate"); - duplicate.setToolTipText("Duplicate the current row"); - GridData buttonDuplicateGridData = new GridData( - GridData.HORIZONTAL_ALIGN_BEGINNING); - buttonDuplicateGridData.widthHint = 80; - duplicate.setLayoutData(buttonDuplicateGridData); - duplicate.addSelectionListener(new SelectionAdapter() { - public void widgetSelected(SelectionEvent e) { - CSVRow row = (CSVRow) ((IStructuredSelection) tableViewer - .getSelection()).getFirstElement(); - if (row != null) { - model.duplicateRow(row); - tableModified(); - } - } - }); - - Button insert = new Button(canvas, SWT.PUSH | SWT.CENTER); - insert.setText("Insert Row"); - insert.setToolTipText("Insert a new row before the current one"); - GridData buttonInsertGridData = new GridData( - GridData.HORIZONTAL_ALIGN_BEGINNING); - buttonInsertGridData.widthHint = 80; - insert.setLayoutData(buttonInsertGridData); - insert.addSelectionListener(new SelectionAdapter() { - public void widgetSelected(SelectionEvent e) { - CSVRow row = (CSVRow) ((IStructuredSelection) tableViewer - .getSelection()).getFirstElement(); - if (row != null) { - model.addRowAfterElement(row); - tableModified(); - } - } - }); - /* - * insert.addKeyListener(new KeyAdapter() { public void - * keyPressed(KeyEvent e) { //if(((e.stateMask & SWT.CTRL) != 0) & - * (e.keyCode == 'd')) { //if (e.stateMask == SWT.CTRL && e.keyCode == - * 'd') { if (e.character == SWT.DEL) { CSVRow row = (CSVRow) - * ((IStructuredSelection) - * tableViewer.getSelection()).getFirstElement(); if (row != null) { - * model.addLineAfterElement(row); tableViewer.refresh(); - * tableModified(); } } } }); - */ - - Button add = new Button(canvas, SWT.PUSH | SWT.CENTER); - add.setText("Add Row"); - add.setToolTipText("Add a new row at the end of the file"); - GridData buttonAddGridData = new GridData( - GridData.HORIZONTAL_ALIGN_BEGINNING); - buttonAddGridData.widthHint = 80; - add.setLayoutData(buttonAddGridData); - add.addSelectionListener(new SelectionAdapter() { - public void widgetSelected(SelectionEvent e) { - model.addRow(); - tableModified(); - } - }); - - Button delete = new Button(canvas, SWT.PUSH | SWT.CENTER); - delete.setText("Delete Row"); - delete.setToolTipText("Delete the current row"); - GridData buttonDelGridData = new GridData( - GridData.HORIZONTAL_ALIGN_BEGINNING); - buttonDelGridData.widthHint = 80; - delete.setLayoutData(buttonDelGridData); - delete.addSelectionListener(new SelectionAdapter() { - public void widgetSelected(SelectionEvent e) { - CSVRow row = (CSVRow) ((IStructuredSelection) tableViewer - .getSelection()).getFirstElement(); - - while(row != null){ - row = (CSVRow) ((IStructuredSelection) tableViewer.getSelection()).getFirstElement(); - if (row != null) { - model.removeRow(row); - tableModified(); - } - } - } - }); - /* - * insert.addKeyListener(new KeyAdapter() { public void - * keyPressed(KeyEvent e) { if (e.stateMask == SWT.CTRL && e.keyCode == - * 'd') { CSVRow row = (CSVRow) ((IStructuredSelection) - * tableViewer.getSelection()).getFirstElement(); if (row != null) { - * model.removeLine(row); tableViewer.refresh(); tableModified(); } } } - * }); - */ - /* - * - * // manage 1st line - should only be visible if global option is set - * if (pref.getUseFirstLineAsHeader()) { Label encodingLineLabel = new - * Label(canvas, SWT.NONE); - * encodingLineLabel.setText("Display 1st line"); final Button - * encodingLineBtn = new Button(canvas, SWT.CHECK); - * encodingLineBtn.setLayoutData(new - * GridData(GridData.HORIZONTAL_ALIGN_BEGINNING)); - * encodingLineBtn.setSelection(true); - * encodingLineBtn.addSelectionListener(new SelectionAdapter() { public - * void widgetSelected(SelectionEvent e) { - * model.displayFirstLine(encodingLineBtn.getSelection()); - * updateTableFromTextEditor(); } }); } - * sensitiveBtn.addSelectionListener(new SelectionAdapter() { public - * void widgetSelected(SelectionEvent e) { - * tableFilter.setSearchText(searchText.getText(), - * sensitiveBtn.getSelection()); - * labelProvider.setSearchText(searchText.getText()); - * tableViewer.refresh(); } }); - */ - tableViewer = new TableViewer(canvas, SWT.MULTI | SWT.H_SCROLL - | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER); - tableViewer.setUseHashlookup(true); - final Table table = tableViewer.getTable(); - table.setHeaderVisible(true); - table.setLinesVisible(true); - - // set the sorter for the table - tableSorter = new CSVTableSorter(); - tableViewer.setSorter(tableSorter); - - // set a table filter - final CSVTableFilter tableFilter = new CSVTableFilter(); - tableViewer.addFilter(tableFilter); - - // add the filtering and coloring when searching specific elements. - searchText.addKeyListener(new KeyAdapter() { - public void keyReleased(KeyEvent ke) { - tableFilter.setSearchText(searchText.getText(), - model.getSensitiveSearch()); - String filterText = searchText.getText(); - for (int i = 0; i < tableViewer.getColumnProperties().length; i++) { - CellLabelProvider labelProvider = tableViewer - .getLabelProvider(i); - if(labelProvider != null){ - ((CSVLabelProvider) labelProvider) - .setSearchText(filterText); - } - } - tableViewer.refresh(); - } - }); - - /* - * // create a TableCursor to navigate around the table final - * TableCursor cursor = new TableCursor(table, SWT.NONE); // create an - * editor to edit the cell when the user hits "ENTER" // while over a - * cell in the table final ControlEditor editor = new - * ControlEditor(cursor); editor.grabHorizontal = true; - * editor.grabVertical = true; - * - * cursor.addSelectionListener(new SelectionAdapter() { // This is - * called as the user navigates around the table public void - * widgetSelected(SelectionEvent e) { // Select the row in the table - * where the TableCursor is table.setSelection(new TableItem[] - * {cursor.getRow()}); } - * - * // when the user hits "ENTER" in the TableCursor, // pop up a text - * editor so that user can change the text of the cell public void - * widgetDefaultSelected(SelectionEvent e) { // Begin an editing session - * final Text text = new Text(cursor, SWT.NONE); - * - * // Copy the text from the cell to the Text int column = - * cursor.getColumn(); text.setText(cursor.getRow().getText(column)); - * - * // Add a handler to detect key presses text.addKeyListener(new - * KeyAdapter() { public void keyPressed(KeyEvent e) { // tab will save - * & move to the next column if (e.character == SWT.TAB) { TableItem row - * = cursor.getRow(); int column = cursor.getColumn(); - * row.setText(column, text.getText()); text.dispose(); - * cursor.setSelection(row, column+1); tableModified(); } // close the - * text editor and copy the data over // when the user hits "ENTER" if - * (e.character == SWT.CR) { TableItem row = cursor.getRow(); - * row.setText(cursor.getColumn(), text.getText()); tableModified(); - * text.dispose(); } // close the text editor when the user hits "ESC" - * if (e.character == SWT.ESC) { text.dispose(); } } }); // close the - * text editor when the user tabs away text.addFocusListener(new - * FocusAdapter() { public void focusLost(FocusEvent e) { - * text.dispose(); } }); editor.setEditor(text); text.setFocus(); } }); - * - * /* // Hide the TableCursor when the user hits the "CTRL" or "SHIFT" - * key. // This allows the user to select multiple items in the table. - * cursor.addKeyListener(new KeyAdapter() { public void - * keyPressed(KeyEvent e) { - * - * // delete line if (e.character == SWT.DEL) { TableItem row = - * cursor.getRow(); tableModified(); row.dispose(); - * //table.showItem(row); //cursor.setSelection(row, 0); } - * - * // insert line if (e.character == (char) SWT.F8) { TableItem row = - * cursor.getRow(); row.dispose(); } - * - * // add line - * - * cursor.setVisible(true); cursor.setFocus(); - * - * if (e.keyCode == SWT.CTRL || e.keyCode == SWT.SHIFT || (e.stateMask & - * SWT.CONTROL) != 0 || (e.stateMask & SWT.SHIFT) != 0) { - * cursor.setVisible(false); return; } } }); - * - * // When the user double clicks in the TableCursor, pop up a text - * editor so that // they can change the text of the cell. - * cursor.addMouseListener(new MouseAdapter() { public void - * mouseDown(MouseEvent e) { final Text text = new Text(cursor, - * SWT.NONE); TableItem row = cursor.getRow(); int column = - * cursor.getColumn(); text.setText(row.getText(column)); - * text.addKeyListener(new KeyAdapter() { public void - * keyPressed(KeyEvent e) { // close the text editor and copy the data - * over // when the user hits "ENTER" if (e.character == SWT.CR) { - * TableItem row = cursor.getRow(); int column = cursor.getColumn(); - * row.setText(column, text.getText()); tableModified(); text.dispose(); - * } // close the text editor when the user hits "ESC" if (e.character - * == SWT.ESC) { text.dispose(); } } }); // close the text editor when - * the user clicks away text.addFocusListener(new FocusAdapter() { - * public void focusLost(FocusEvent e) { text.dispose(); } }); - * editor.setEditor(text); text.setFocus(); } }); - * - * // Show the TableCursor when the user releases the "SHIFT" or "CTRL" - * key. // This signals the end of the multiple selection task. - * table.addKeyListener(new KeyAdapter() { public void - * keyReleased(KeyEvent e) { - * - * if (e.keyCode == SWT.CONTROL && (e.stateMask & SWT.SHIFT) != 0) - * return; if (e.keyCode == SWT.SHIFT && (e.stateMask & SWT.CONTROL) != - * 0) return; if (e.keyCode != SWT.CONTROL && (e.stateMask & - * SWT.CONTROL) != 0) return; if (e.keyCode != SWT.SHIFT && (e.stateMask - * & SWT.SHIFT) != 0) return; - * - * TableItem[] selection = table.getSelection(); TableItem row = - * (selection.length == 0) ? table.getItem(table.getTopIndex()) : - * selection[0]; table.showItem(row); cursor.setSelection(row, 0); - * cursor.setVisible(true); cursor.setFocus(); } }); - */ - -/* tableViewer.addDoubleClickListener(new IDoubleClickListener() { - - public void doubleClick(DoubleClickEvent event) { - - CSVRow row = (CSVRow) ((IStructuredSelection) tableViewer.getSelection()).getFirstElement(); - DetailedView input = new DetailedView(Display.getDefault(), model.getHeader(), row); - - input.open(); - - } - });*/ - - // Layout the viewer - GridData gridData = new GridData(); - gridData.verticalAlignment = GridData.FILL; - gridData.horizontalSpan = 6; - gridData.grabExcessHorizontalSpace = true; - gridData.grabExcessVerticalSpace = true; - gridData.horizontalAlignment = GridData.FILL; - tableViewer.getControl().setLayoutData(gridData); - - addPage(canvas); - setPageText(indexTBL, "CSV Table"); - } - - /** - * Set Name of the file to the tab - */ - private void updateTitle() { - IEditorInput input = getEditorInput(); - setPartName(input.getName()); - setTitleToolTip(input.getToolTipText()); - } - - /** - * @throws Exception - */ - private void populateTablePage() throws Exception { - tableViewer.setContentProvider(new CSVContentProvider()); - - // make the selection available - getSite().setSelectionProvider(tableViewer); - - tableViewer.getTable().getDisplay().asyncExec(new Runnable() { - public void run() { - updateTableFromTextEditor(); - } - }); - } - - /** + private void updateTableFromTextEditor() { + + tableHeaderMenu = new Menu(tableViewer.getTable()); + + // PropertyFile propertyFile = (PropertyFile) treeViewer.getInput(); + model.removeModelListener(csvFileListener); + + model.setInput(editor.getDocumentProvider().getDocument(editor.getEditorInput()).get()); + + final MenuItem detailedEditItem = new MenuItem(tableHeaderMenu, SWT.PUSH, 0); + detailedEditItem.setText("Edit"); + detailedEditItem.setSelection(false); + detailedEditItem.addListener(SWT.Selection, new Listener() { + + @Override + public void handleEvent(final Event event) { + + final CSVRow row = (CSVRow) ((IStructuredSelection) tableViewer.getSelection()).getFirstElement(); + + if (row != null) { + final DetailedEditor input = new DetailedEditor(Display.getDefault(), model.getHeader(), row, model.getInCellDelimiter(), + model.getRegexTableMarker()); + input.open(); + } + } + }); + + new MenuItem(tableHeaderMenu, SWT.SEPARATOR, 1); + + final TableColumn[] columns = tableViewer.getTable().getColumns(); + if (columns.length > 0) { // if table header columns already created + // update column header text + for (int i = 0; i < model.getHeader().size(); i++) { + if (i < columns.length) { + columns[i].setText(model.getHeader().get(i)); + addMenuItemToColumn(columns[i], i); + } + } + } else { + // create columns + for (int i = 0; i < model.getHeader().size(); i++) { + final TableViewerColumn column = new TableViewerColumn(tableViewer, SWT.LEFT); + final int index = i; + column.getColumn().setText(model.getHeader().get(i)); + column.getColumn().setWidth(100); + column.getColumn().setResizable(true); + column.getColumn().setMoveable(true); + column.setLabelProvider(new CSVLabelProvider()); + addMenuItemToColumn(column.getColumn(), index); + } + } + + if (model.isFirstLineHeader()) { + new MenuItem(tableHeaderMenu, SWT.SEPARATOR); + + // create menu item to delete column + final MenuItem deleteColumnItem = new MenuItem(tableHeaderMenu, SWT.PUSH); + deleteColumnItem.setText("Delete Column"); + deleteColumnItem.setSelection(false); + deleteColumnItem.addListener(SWT.Selection, new Listener() { + @Override + public void handleEvent(final Event event) { + // call delete column page + final DeleteColumnPage dcPage = new DeleteColumnPage(getSite().getShell(), model.getArrayHeader()); + if (dcPage.open() == InputDialog.OK) { + final String[] colToDelete = dcPage.getColumnSelected(); + for (final String column : colToDelete) { + final int colIndex = findColumnForName(column); + tableViewer.getTable().getColumn(colIndex).dispose(); + // +2 because the first two items are Edit and a separator + tableHeaderMenu.getItem(colIndex + 2).dispose(); + model.removeColumn(column); + } + tableModified(); + } + } + }); + + // create menu item to insert column + final MenuItem insertColumnItem = new MenuItem(tableHeaderMenu, SWT.PUSH); + insertColumnItem.setText("Add Column"); + insertColumnItem.setSelection(false); + insertColumnItem.addListener(SWT.Selection, new Listener() { + @Override + public void handleEvent(final Event event) { + // call insert/add column page + final InsertColumnPage acPage = new InsertColumnPage(getSite().getShell(), model.getArrayHeader()); + if (acPage.open() == InputDialog.OK) { + final String colToInsert = acPage.getColumnNewName(); + model.addColumn(colToInsert); + + tableViewer.setInput(model); + final TableColumn column = new TableColumn(tableViewer.getTable(), SWT.LEFT); + column.setText(colToInsert); + column.setWidth(100); + column.setResizable(true); + column.setMoveable(true); + + addMenuItemToColumn(column, model.getColumnCount() - 1); + defineCellEditing(); + + tableModified(); + } + } + }); + } + + tableViewer.setInput(model); + model.addModelListener(csvFileListener); + + tableViewer.getTable().addListener(SWT.MenuDetect, new Listener() { + @Override + public void handleEvent(final Event event) { + tableViewer.getTable().setMenu(tableHeaderMenu); + } + }); + + defineCellEditing(); + } + + /** + * + */ + private void defineCellEditing() { + final String[] columnProperties = new String[model.getColumnCount()]; + final CellEditor[] cellEditors = new CellEditor[model.getColumnCount()]; + + for (int i = 0; i < model.getColumnCount(); i++) { + columnProperties[i] = Integer.toString(i); + cellEditors[i] = new TextCellEditor(tableViewer.getTable()); + } + + tableViewer.setColumnProperties(columnProperties); + + // XXX can be replaced by tableViewer.setEditingSupport() + tableViewer.setCellEditors(cellEditors); + tableViewer.setCellModifier(new CSVEditorCellModifier()); + + } + + /** + * Find a column in the Table by its name + * + * @param columnName + * @return the index of the Column indicated by its name + */ + private int findColumnForName(final String columnName) { + final int index = -1; + final TableColumn[] tableColumns = tableViewer.getTable().getColumns(); + for (int i = 0; i < tableColumns.length; i++) { + final TableColumn column = tableColumns[i]; + if (columnName.equalsIgnoreCase(column.getText())) { + return i; + } + } + return index; + } + + /** + * @param column + * @param index + */ + private void addMenuItemToColumn(final TableColumn column, final int index) { + + // create menu item + final MenuItem itemName = new MenuItem(tableHeaderMenu, SWT.CHECK, index); + itemName.setText(column.getText()); + itemName.setSelection(column.getResizable()); + itemName.addListener(SWT.Selection, new Listener() { + @Override + public void handleEvent(final Event event) { + if (itemName.getSelection()) { + column.setWidth(100); + column.setResizable(true); + } else { + column.setWidth(0); + column.setResizable(false); + } + } + }); + + // Setting the right sorter + column.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(final SelectionEvent e) { + int dir = tableViewer.getTable().getSortDirection(); + switch (dir) { + case SWT.UP: + dir = SWT.DOWN; + break; + case SWT.DOWN: + dir = SWT.NONE; + break; + case SWT.NONE: + dir = SWT.UP; + break; + } + tableSorter.setColumn(index, dir); + tableViewer.getTable().setSortDirection(dir); + if (dir == SWT.NONE) { + tableViewer.getTable().setSortColumn(null); + } else { + tableViewer.getTable().setSortColumn(column); + } + tableViewer.refresh(); + } + }); + + } + + /** + * The MultiPageEditorPart implementation of this + * IWorkbenchPart method disposes all nested editors. This method + * is automatically called when the editor is closed and marks the end of the + * editor's life cycle. It cleans up any platform resources, such as images, + * clipboard, and so on, which were created by this class. + * + * @see org.eclipse.ui.part.MultiPageEditorPart#dispose() + */ + @Override + public void dispose() { + ResourcesPlugin.getWorkspace().removeResourceChangeListener(this); + super.dispose(); + } + + /** + * Saves the multi-page editor's document. If the save is successful, the part + * should fire a property changed event (PROP_DIRTY property), reflecting the + * new dirty state. If the save is canceled via user action, or for any other + * reason, the part should invoke setCanceled on the IProgressMonitor to inform + * the caller + * + * @see org.eclipse.ui.part.EditorPart#doSave(org.eclipse.core.runtime.IProgressMonitor) + */ + @Override + public void doSave(final IProgressMonitor monitor) { + if (getActivePage() == indexTBL && isPageModified) { + updateTextEditorFromTable(); + } else { + updateTableFromTextEditor(); + } + + isPageModified = false; + editor.doSave(monitor); + } + + /** + * Returns whether the "Save As" operation is supported by this part. + * + * @see org.eclipse.ui.part.EditorPart#isSaveAsAllowed() + */ + @Override + public boolean isSaveAsAllowed() { + return true; + } + + /** + * Saves the multi-page editor's document as another file. Also updates the text + * for page 0's tab, and updates this multi-page editor's input to correspond to + * the nested editor's. + * + * @see org.eclipse.ui.part.EditorPart#doSaveAs() + */ + @Override + public void doSaveAs() { + if (getActivePage() == indexTBL && isPageModified) { + updateTextEditorFromTable(); + } else { + updateTableFromTextEditor(); + } + + isPageModified = false; + + editor.doSaveAs(); + setInput(editor.getEditorInput()); + updateTitle(); + } + + /** + * Initializes this editor with the given editor site and input. This method is + * automatically called shortly after editor construction; it marks the start of + * the editor's lifecycle. + * + * The MultiPageEditorExample implementation of this method checks + * that the input is an instance of IFileEditorInput. + * + * @see org.eclipse.ui.part.MultiPageEditorPart#init(org.eclipse.ui.IEditorSite, + * org.eclipse.ui.IEditorInput) + */ + @Override + public void init(final IEditorSite site, final IEditorInput editorInput) throws PartInitException { + /* + * String message = "Input is " + editorInput + " of instance " + + * editorInput.getClass().getName(); IStatus status = new Status(IStatus.ERROR, + * "csvedit", IStatus.ERROR, message, null); + * Activator.getDefault().getLog().log(status); + */ + + /* + * if (!(editorInput instanceof IFileEditorInput)) throw new + * PartInitException("Invalid Input: Must be IFileEditorInput"); + */ + super.init(site, editorInput); + } + + /** + * @see org.eclipse.ui.part.MultiPageEditorPart#handlePropertyChange(int) + */ + @Override + protected void handlePropertyChange(final int propertyId) { + if (propertyId == IEditorPart.PROP_DIRTY) { + isPageModified = isDirty(); + } + super.handlePropertyChange(propertyId); + } + + /** + * @see org.eclipse.ui.part.MultiPageEditorPart#isDirty() + */ + @Override + public boolean isDirty() { + return isPageModified || super.isDirty(); + } + + /** + * Calculates the contents of page 2 when the it is activated. * + * @see org.eclipse.ui.part.MultiPageEditorPart#pageChange(int) */ - public void tableModified() { - tableViewer.refresh(); - boolean wasPageModified = isPageModified; - isPageModified = true; - if (!wasPageModified) { - firePropertyChange(IEditorPart.PROP_DIRTY); - editor.validateEditorInputState(); // will invoke: - // FileModificationValidator.validateEdit() - // (expected by some repository - // providers) - } - } - - /** + @Override + protected void pageChange(final int newPageIndex) { + switch (newPageIndex) { + case indexSRC: + if (isDirty()) { + updateTextEditorFromTable(); + } + break; + case indexTBL: + if (isDirty()) { + updateTableFromTextEditor(); + } + break; + } + isPageModified = false; + super.pageChange(newPageIndex); + } + + /** * */ - private void updateTableFromTextEditor() { - - tableHeaderMenu = new Menu(tableViewer.getTable()); - - // PropertyFile propertyFile = (PropertyFile) treeViewer.getInput(); - model.removeModelListener(csvFileListener); - - model.setInput(editor.getDocumentProvider() - .getDocument(editor.getEditorInput()).get()); - - final MenuItem detailedEditItem = new MenuItem(tableHeaderMenu, - SWT.PUSH, 0); - detailedEditItem.setText("Edit"); - detailedEditItem.setSelection(false); - detailedEditItem.addListener(SWT.Selection, new Listener() { - - public void handleEvent(Event event) { - - CSVRow row = (CSVRow) ((IStructuredSelection) tableViewer.getSelection()).getFirstElement(); - - if(row != null){ - DetailedEditor input = new DetailedEditor(Display.getDefault(), model.getHeader(), - row, model.getInCellDelimiter(), model.getRegexTableMarker()); - input.open(); - } - } - }); - - new MenuItem(tableHeaderMenu, SWT.SEPARATOR, 1); - - TableColumn[] columns = tableViewer.getTable().getColumns(); - if (columns.length > 0) { // if table header columns already created - // update column header text - for (int i = 0; i < model.getHeader().size(); i++){ - if(i < columns.length){ - columns[i].setText(model.getHeader().get(i)); - final int index = i; - addMenuItemToColumn(columns[i], index+2); - } - } - } else { - // create columns - for (int i = 0; i < model.getHeader().size(); i++) { - final TableViewerColumn column = new TableViewerColumn( - tableViewer, SWT.LEFT); - final int index = i; - column.getColumn().setText(model.getHeader().get(i)); - column.getColumn().setWidth(100); - column.getColumn().setResizable(true); - column.getColumn().setMoveable(true); - column.setLabelProvider(new CSVLabelProvider()); - //+2 because the first two items are Edit and a separator - addMenuItemToColumn(column.getColumn(), index+2); - } - } - - if (model.isFirstLineHeader()) { - new MenuItem(tableHeaderMenu, SWT.SEPARATOR); - - // create menu item to delete column - final MenuItem deleteColumnItem = new MenuItem(tableHeaderMenu, - SWT.PUSH); - deleteColumnItem.setText("Delete Column"); - deleteColumnItem.setSelection(false); - deleteColumnItem.addListener(SWT.Selection, new Listener() { - public void handleEvent(Event event) { - // call delete column page - DeleteColumnPage dcPage = new DeleteColumnPage(getSite() - .getShell(), model.getArrayHeader()); - if (dcPage.open() == InputDialog.OK) { - String[] colToDelete = dcPage.getColumnSelected(); - for (String column : colToDelete) { - int colIndex = findColumnForName(column); - tableViewer.getTable().getColumn(colIndex) - .dispose(); - //+2 because the first two items are Edit and a separator - tableHeaderMenu.getItem(colIndex+2).dispose(); - model.removeColumn(column); - } - tableModified(); - } - } - }); - - // create menu item to insert column - final MenuItem insertColumnItem = new MenuItem(tableHeaderMenu, - SWT.PUSH); - insertColumnItem.setText("Add Column"); - insertColumnItem.setSelection(false); - insertColumnItem.addListener(SWT.Selection, new Listener() { - public void handleEvent(Event event) { - // call insert/add column page - InsertColumnPage acPage = new InsertColumnPage(getSite() - .getShell(), model.getArrayHeader()); - if (acPage.open() == InputDialog.OK) { - String colToInsert = acPage.getColumnNewName(); - model.addColumn(colToInsert); - - tableViewer.setInput(model); - final TableColumn column = new TableColumn(tableViewer - .getTable(), SWT.LEFT); - column.setText(colToInsert); - column.setWidth(100); - column.setResizable(true); - column.setMoveable(true); - - addMenuItemToColumn(column, model.getColumnCount() - 1); - defineCellEditing(); - - tableModified(); - } - } - }); - } - - tableViewer.setInput(model); - model.addModelListener(csvFileListener); - - tableViewer.getTable().addListener(SWT.MenuDetect, new Listener() { - public void handleEvent(Event event) { - tableViewer.getTable().setMenu(tableHeaderMenu); - } - }); - - defineCellEditing(); - } - - /** + private void updateTextEditorFromTable() { + editor.getDocumentProvider().getDocument(editor.getEditorInput()).set(((AbstractCSVFile) tableViewer.getInput()).getTextRepresentation()); + } + + /** + * When the focus shifts to the editor, this method is called; it must then + * redirect focus to the appropriate editor based on which page is currently + * selected. * + * @see org.eclipse.ui.part.MultiPageEditorPart#setFocus() */ - private void defineCellEditing() { - String[] columnProperties = new String[model.getColumnCount()]; - CellEditor[] cellEditors = new CellEditor[model.getColumnCount()]; - - for (int i = 0; i < model.getColumnCount(); i++) { - columnProperties[i] = Integer.toString(i); - cellEditors[i] = new TextCellEditor(tableViewer.getTable()); - } - - tableViewer.setColumnProperties(columnProperties); - - // XXX can be replaced by tableViewer.setEditingSupport() - tableViewer.setCellEditors(cellEditors); - tableViewer.setCellModifier(new CSVEditorCellModifier()); - - } - - /** - * Find a column in the Table by its name - * - * @param columnName - * @return the index of the Column indicated by its name - */ - private int findColumnForName(String columnName) { - int index = -1; - TableColumn[] tableColumns = tableViewer.getTable().getColumns(); - for (int i = 0; i < tableColumns.length; i++) { - TableColumn column = tableColumns[i]; - if (columnName.equalsIgnoreCase(column.getText())) - return i; - } - return index; - } - - /** - * @param column - * @param index - */ - private void addMenuItemToColumn(final TableColumn column, final int index) { - - // create menu item - final MenuItem itemName = new MenuItem(tableHeaderMenu, SWT.CHECK, - index); - itemName.setText(column.getText()); - itemName.setSelection(column.getResizable()); - itemName.addListener(SWT.Selection, new Listener() { - public void handleEvent(Event event) { - if (itemName.getSelection()) { - column.setWidth(100); - column.setResizable(true); - } else { - column.setWidth(0); - column.setResizable(false); - } - } - }); - - // Setting the right sorter - column.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - int dir = tableViewer.getTable().getSortDirection(); - switch (dir) { - case SWT.UP: - dir = SWT.DOWN; - break; - case SWT.DOWN: - dir = SWT.NONE; - break; - case SWT.NONE: - dir = SWT.UP; - break; - } - tableSorter.setColumn(index, dir); - tableViewer.getTable().setSortDirection(dir); - if (dir == SWT.NONE) { - tableViewer.getTable().setSortColumn(null); - } else { - tableViewer.getTable().setSortColumn(column); - } - tableViewer.refresh(); - } - }); - - } - - /** - * The MultiPageEditorPart implementation of this - * IWorkbenchPart method disposes all nested editors. This - * method is automatically called when the editor is closed and marks the - * end of the editor's life cycle. It cleans up any platform resources, such - * as images, clipboard, and so on, which were created by this class. - * - * @see org.eclipse.ui.part.MultiPageEditorPart#dispose() - */ - public void dispose() { - ResourcesPlugin.getWorkspace().removeResourceChangeListener(this); - super.dispose(); - } - - /** - * Saves the multi-page editor's document. If the save is successful, the - * part should fire a property changed event (PROP_DIRTY property), - * reflecting the new dirty state. If the save is canceled via user action, - * or for any other reason, the part should invoke setCanceled on the - * IProgressMonitor to inform the caller - * - * @see org.eclipse.ui.part.EditorPart#doSave(org.eclipse.core.runtime.IProgressMonitor) - */ - public void doSave(IProgressMonitor monitor) { - if (getActivePage() == indexTBL && isPageModified) { - updateTextEditorFromTable(); - } else { - updateTableFromTextEditor(); - } - - isPageModified = false; - editor.doSave(monitor); - } - - /** - * Returns whether the "Save As" operation is supported by this part. - * - * @see org.eclipse.ui.part.EditorPart#isSaveAsAllowed() - */ - public boolean isSaveAsAllowed() { - return true; - } - - /** - * Saves the multi-page editor's document as another file. Also updates the - * text for page 0's tab, and updates this multi-page editor's input to - * correspond to the nested editor's. - * - * @see org.eclipse.ui.part.EditorPart#doSaveAs() - */ - public void doSaveAs() { - if (getActivePage() == indexTBL && isPageModified) { - updateTextEditorFromTable(); - } else { - updateTableFromTextEditor(); - } - - isPageModified = false; - - editor.doSaveAs(); - setInput(editor.getEditorInput()); - updateTitle(); - } - - /** - * Initializes this editor with the given editor site and input. This method - * is automatically called shortly after editor construction; it marks the - * start of the editor's lifecycle. - * - * The MultiPageEditorExample implementation of this method - * checks that the input is an instance of IFileEditorInput. - * - * @see org.eclipse.ui.part.MultiPageEditorPart#init(org.eclipse.ui.IEditorSite, - * org.eclipse.ui.IEditorInput) - */ - public void init(IEditorSite site, IEditorInput editorInput) - throws PartInitException { - /* - * String message = "Input is " + editorInput + " of instance " + - * editorInput.getClass().getName(); IStatus status = new - * Status(IStatus.ERROR, "csvedit", IStatus.ERROR, message, null); - * Activator.getDefault().getLog().log(status); - */ - - /* - * if (!(editorInput instanceof IFileEditorInput)) throw new - * PartInitException("Invalid Input: Must be IFileEditorInput"); - */ - super.init(site, editorInput); - } - - /** - * @see org.eclipse.ui.part.MultiPageEditorPart#handlePropertyChange(int) - */ - protected void handlePropertyChange(int propertyId) { - if (propertyId == IEditorPart.PROP_DIRTY) - isPageModified = isDirty(); - super.handlePropertyChange(propertyId); - } - - /** - * @see org.eclipse.ui.part.MultiPageEditorPart#isDirty() - */ - public boolean isDirty() { - return isPageModified || super.isDirty(); - } - - /** - * Calculates the contents of page 2 when the it is activated. - * - * @see org.eclipse.ui.part.MultiPageEditorPart#pageChange(int) - */ - protected void pageChange(int newPageIndex) { - switch (newPageIndex) { - case indexSRC: - if (isDirty()) - updateTextEditorFromTable(); - break; - case indexTBL: - if (isDirty()) - updateTableFromTextEditor(); - break; - } - isPageModified = false; - super.pageChange(newPageIndex); - } - - /** + @Override + public void setFocus() { + switch (getActivePage()) { + case indexSRC: + editor.setFocus(); + break; + case indexTBL: + tableViewer.getTable().setFocus(); + break; + } + } + + /** + * Closes all project files on project close. * + * @see org.eclipse.core.resources.IResourceChangeListener#resourceChanged(org.eclipse.core.resources.IResourceChangeEvent) */ - private void updateTextEditorFromTable() { - editor.getDocumentProvider() - .getDocument(editor.getEditorInput()) - .set(((AbstractCSVFile) tableViewer.getInput()) - .getTextRepresentation()); - } - - /** - * When the focus shifts to the editor, this method is called; it must then - * redirect focus to the appropriate editor based on which page is currently - * selected. - * - * @see org.eclipse.ui.part.MultiPageEditorPart#setFocus() - */ - public void setFocus() { - switch (getActivePage()) { - case indexSRC: - editor.setFocus(); - break; - case indexTBL: - tableViewer.getTable().setFocus(); - break; - } - } - - /** - * Closes all project files on project close. - * - * @see org.eclipse.core.resources.IResourceChangeListener#resourceChanged(org.eclipse.core.resources.IResourceChangeEvent) - */ - public void resourceChanged(final IResourceChangeEvent event) { - if (event.getType() == IResourceChangeEvent.PRE_CLOSE) { - Display.getDefault().asyncExec(new Runnable() { - public void run() { - IWorkbenchPage[] pages = getSite().getWorkbenchWindow() - .getPages(); - for (int i = 0; i < pages.length; i++) { - if (((FileEditorInput) editor.getEditorInput()) - .getFile().getProject() - .equals(event.getResource())) { - IEditorPart editorPart = pages[i].findEditor(editor - .getEditorInput()); - pages[i].closeEditor(editorPart, true); - } - } - } - }); - } - } + @Override + public void resourceChanged(final IResourceChangeEvent event) { + if (event.getType() == IResourceChangeEvent.PRE_CLOSE) { + Display.getDefault().asyncExec(new Runnable() { + @Override + public void run() { + final IWorkbenchPage[] pages = getSite().getWorkbenchWindow().getPages(); + for (final IWorkbenchPage page : pages) { + if (((FileEditorInput) editor.getEditorInput()).getFile().getProject().equals(event.getResource())) { + final IEditorPart editorPart = page.findEditor(editor.getEditorInput()); + page.closeEditor(editorPart, true); + } + } + } + }); + } + } } diff --git a/csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/sorter/CSVTableSorter.java b/csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/sorter/CSVTableSorter.java index 0287481..03c831e 100644 --- a/csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/sorter/CSVTableSorter.java +++ b/csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/sorter/CSVTableSorter.java @@ -15,7 +15,7 @@ package org.fhsolution.eclipse.plugins.csvedit.sorter; import org.eclipse.jface.viewers.Viewer; -import org.eclipse.jface.viewers.ViewerSorter; +import org.eclipse.jface.viewers.ViewerComparator; import org.eclipse.swt.SWT; import org.fhsolution.eclipse.plugins.csvedit.model.CSVRow; @@ -24,7 +24,7 @@ * @author fhenri * */ -public class CSVTableSorter extends ViewerSorter { +public class CSVTableSorter extends ViewerComparator { private int propertyIndex; private static final int DESCENDING = 1; @@ -38,7 +38,7 @@ public class CSVTableSorter extends ViewerSorter { * Public Constructor */ public CSVTableSorter() { - this.propertyIndex = -1; + propertyIndex = -1; direction = DESCENDING; } @@ -47,29 +47,32 @@ public CSVTableSorter() { * * @param column columnId selected by the user. */ - public void setColumn(int column, int dir) { + public void setColumn(final int column, final int dir) { if (dir == SWT.NONE) { noSort = true; return; } noSort = false; - if (column != this.propertyIndex) { + if (column != propertyIndex) { // New column; do an ascending sort - this.propertyIndex = column; + propertyIndex = column; } - this.direction = dir == SWT.UP ? ASCENDING : DESCENDING; + direction = dir == SWT.UP ? ASCENDING : DESCENDING; } /** - * @see org.eclipse.jface.viewers.ViewerComparator#compare(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object) + * @see org.eclipse.jface.viewers.ViewerComparator#compare(org.eclipse.jface.viewers.Viewer, + * java.lang.Object, java.lang.Object) */ @Override - public int compare(Viewer viewer, Object e1, Object e2) { + public int compare(final Viewer viewer, final Object e1, final Object e2) { // this is necessary at opening of csv file so column are not sorted. - if (propertyIndex == -1 || noSort) return 0; + if (propertyIndex == -1 || noSort) { + return 0; + } - String row1 = ((CSVRow) e1).getElementAt(propertyIndex); - String row2 = ((CSVRow) e2).getElementAt(propertyIndex); + final String row1 = ((CSVRow) e1).getElementAt(propertyIndex); + final String row2 = ((CSVRow) e2).getElementAt(propertyIndex); int rc = row1.compareTo(row2); From 386efaf0bb7ddb9d0d8dc2ce17111db9ba63d634 Mon Sep 17 00:00:00 2001 From: George Lindholm <66577321+gnl42@users.noreply.github.com> Date: Wed, 13 Dec 2023 00:36:08 -0800 Subject: [PATCH 05/18] Empty column is null --- .../csvedit/filter/CSVTableFilter.java | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/filter/CSVTableFilter.java b/csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/filter/CSVTableFilter.java index 13bc541..d1a8dde 100644 --- a/csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/filter/CSVTableFilter.java +++ b/csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/filter/CSVTableFilter.java @@ -37,32 +37,34 @@ public class CSVTableFilter extends ViewerFilter { * * @param s string to search */ - public void setSearchText (String s, boolean isCaseSensitive) { + public void setSearchText(final String s, final boolean isCaseSensitive) { // Search must be a substring of the existing value - this.searchString = ".*" + s + ".*"; + searchString = ".*" + s + ".*"; if (isCaseSensitive) { - searchPattern = - Pattern.compile(searchString); + searchPattern = Pattern.compile(searchString); } else { - searchPattern = - Pattern.compile(searchString, Pattern.CASE_INSENSITIVE); + searchPattern = Pattern.compile(searchString, Pattern.CASE_INSENSITIVE); } } /** - * @see org.eclipse.jface.viewers.ViewerFilter#select(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object) + * @see org.eclipse.jface.viewers.ViewerFilter#select(org.eclipse.jface.viewers.Viewer, + * java.lang.Object, java.lang.Object) */ @Override - public boolean select (Viewer viewer, Object parentElement, Object element) { + public boolean select(final Viewer viewer, final Object parentElement, final Object element) { if (searchString == null || searchString.length() == 0) { return true; } // loop on all column of the current row to find matches - CSVRow row = (CSVRow) element; - for (String s:row.getEntries()) { - Matcher m = searchPattern.matcher(s); + final CSVRow row = (CSVRow) element; + for (String s : row.getEntries()) { + if (s == null) { + s = ""; + } + final Matcher m = searchPattern.matcher(s); if (m.matches()) { return true; } From 33bfffc406cab9fae4398c4fac4ca5cec549518c Mon Sep 17 00:00:00 2001 From: George Lindholm <66577321+gnl42@users.noreply.github.com> Date: Thu, 14 Dec 2023 00:02:55 -0800 Subject: [PATCH 06/18] lint complaints --- .../AttributeEditorCellModifier.java | 63 +++++----- .../csvedit/model/AbstractCSVFile.java | 1 - .../eclipse/plugins/csvedit/model/CSVRow.java | 118 +++++++++--------- 3 files changed, 94 insertions(+), 88 deletions(-) diff --git a/csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/detailededitor/AttributeEditorCellModifier.java b/csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/detailededitor/AttributeEditorCellModifier.java index 58eec3f..3b907fc 100644 --- a/csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/detailededitor/AttributeEditorCellModifier.java +++ b/csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/detailededitor/AttributeEditorCellModifier.java @@ -16,64 +16,67 @@ package org.fhsolution.eclipse.plugins.csvedit.detailededitor; import org.eclipse.jface.viewers.ICellModifier; -import org.eclipse.swt.graphics.Color; -import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.TableItem; /** -* -* @author fhenri -* @author msavy -* -*/ + * + * @author fhenri + * @author msavy + * + */ public class AttributeEditorCellModifier implements ICellModifier { /** * Checks whether the given property of the given element can be modified. * - * @return true if the property can be modified, and false if it is not modifiable - * @see org.eclipse.jface.viewers.ICellModifier#canModify(java.lang.Object, java.lang.String) + * @return true if the property can be modified, and false if it is not + * modifiable + * @see org.eclipse.jface.viewers.ICellModifier#canModify(java.lang.Object, + * java.lang.String) */ - public boolean canModify (Object element, String property) { + @Override + public boolean canModify(final Object element, final String property) { return true; } /** - * Returns the value for the given property of the given element. - * Returns "" if the element does not have the given property. + * Returns the value for the given property of the given element. Returns "" if + * the element does not have the given property. * - * @see org.eclipse.jface.viewers.ICellModifier#getValue(java.lang.Object, java.lang.String) + * @see org.eclipse.jface.viewers.ICellModifier#getValue(java.lang.Object, + * java.lang.String) */ - public Object getValue (Object element, String property) { - int elementIndex = Integer.parseInt(property); - AttributeRow row = (AttributeRow) element; + @Override + public Object getValue(final Object element, final String property) { + final int elementIndex = Integer.parseInt(property); + final AttributeRow row = (AttributeRow) element; - if(elementIndex < row.getNumberOfElements()) { + if (elementIndex < row.getNumberOfElements()) { return row.getElementAt(elementIndex); - } - else { + } else { return ""; } } /** - * Modifies the value for the given property of the given element. - * Has no effect if the element does not have the given property, - * or if the property cannot be modified. + * Modifies the value for the given property of the given element. Has no effect + * if the element does not have the given property, or if the property cannot be + * modified. * - * @see org.eclipse.jface.viewers.ICellModifier#modify(java.lang.Object, java.lang.String, java.lang.Object) + * @see org.eclipse.jface.viewers.ICellModifier#modify(java.lang.Object, + * java.lang.String, java.lang.Object) */ - public void modify (Object element, String property, Object value) { - int elementIndex = Integer.parseInt(property); + @Override + public void modify(final Object element, final String property, final Object value) { + final int elementIndex = Integer.parseInt(property); if (element instanceof TableItem) { - AttributeRow row = (AttributeRow) ((TableItem) element).getData(); + final AttributeRow row = (AttributeRow) ((TableItem) element).getData(); - if(elementIndex < row.getNumberOfElements()) { + if (elementIndex < row.getNumberOfElements()) { row.setRowEntry(elementIndex, value.toString()); - } - else { - for (int i=row.getNumberOfElements();i line, IRowChangesListener listener) { - entries = new ArrayList(line); + public CSVRow(final List line, final IRowChangesListener listener) { + entries = new ArrayList<>(line); this.listener = listener; } /** * Constructor + * * @param row * @param listener */ - public CSVRow(CSVRow row, IRowChangesListener listener){ - - this.entries = (ArrayList)row.entries.clone(); - this.listener = listener; - this.isCommentLine = row.isCommentLine; - this.isHeader = row.isHeader; - } - + public CSVRow(final CSVRow row, final IRowChangesListener listener) { + + entries = new ArrayList<>(row.getEntries()); + this.listener = listener; + isCommentLine = row.isCommentLine; + isHeader = row.isHeader; + } + /** * Constructor + * * @param lineElements * @param listener */ - public CSVRow(String[] lineElements, IRowChangesListener listener) { + public CSVRow(final String[] lineElements, final IRowChangesListener listener) { this(Arrays.asList(lineElements), listener); } /** * Create an empty row + * * @param nbOfColumns * @param delimiter * @param listener * @return */ - public static CSVRow createEmptyLine (int nbOfColumns, IRowChangesListener listener) { - List line = new LinkedList(); - for (int i=0; i line = new LinkedList<>(); + for (int i = 0; i < nbOfColumns; i++) { line.add(""); } return new CSVRow(line, listener); @@ -89,14 +94,14 @@ public static CSVRow createEmptyLine (int nbOfColumns, IRowChangesListener liste /** * @return */ - public ArrayList getEntries () { + public ArrayList getEntries() { return entries; } /** * @return */ - public String[] getEntriesAsArray () { + public String[] getEntriesAsArray() { return entries.toArray(new String[entries.size()]); } @@ -104,22 +109,22 @@ public String[] getEntriesAsArray () { * @param elementIndex * @param elementString */ - public void setRowEntry (int elementIndex, String elementString) { - if (entries.get(elementIndex).compareTo(elementString) != 0) { + public void setRowEntry(final int elementIndex, final String elementString) { + if (entries.get(elementIndex).compareTo(elementString) != 0) { entries.set(elementIndex, elementString); listener.rowChanged(this, elementIndex); } } /** - * return the element at a given index. - * This method makes sure that if the current line does not have as many - * elements as the header, it will not break and return an empty string + * return the element at a given index. This method makes sure that if the + * current line does not have as many elements as the header, it will not break + * and return an empty string * * @param index * @return the element at a given index */ - public String getElementAt (int index) { + public String getElementAt(final int index) { if (index >= entries.size()) { return ""; } @@ -128,16 +133,17 @@ public String getElementAt (int index) { /** * Return the number of elements in this row + * * @return number of elements in this row */ - public int getNumberOfElements () { + public int getNumberOfElements() { return entries.size(); } /** * @param element */ - public void addElement(String element) { + public void addElement(final String element) { entries.add(element); } @@ -146,27 +152,27 @@ public void addElement(String element) { * * @param index */ - public void removeElementAt (int index) { + public void removeElementAt(final int index) { entries.remove(index); } - public void setCommentLine (boolean comment) { + public void setCommentLine(final boolean comment) { isCommentLine = comment; } - public boolean isCommentLine () { + public boolean isCommentLine() { return isCommentLine; } - public void setHeader (boolean header) { + public void setHeader(final boolean header) { isHeader = header; } - public boolean isHeader () { + public boolean isHeader() { return isHeader; } - public String getComment () { + public String getComment() { return entries.get(0).substring(1); } @@ -175,9 +181,10 @@ public String getComment () { * * @see java.lang.Object#toString() */ - public String toString () { + @Override + public String toString() { String result = ""; - for (String s:entries) { + for (final String s : entries) { // FIXME get preferences here result = result.concat(s).concat(","); } @@ -189,10 +196,7 @@ public String toString () { */ @Override public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((entries == null) ? 0 : entries.hashCode()); - return result; + return Objects.hash(entries); } /** @@ -200,26 +204,26 @@ public int hashCode() { * * @see java.lang.Object#equals(java.lang.Object) */ - @Override - public boolean equals(Object anObject) { - - // The commented lines implies that if two rows have the same content, - // the cell editor will modify - // the first one found instead of the focused one - // each row should be considered as unique even if they have the same content - - /* - * AttributeRow thisRow = (AttributeRow) anObject; for (int i=0; - * i Date: Thu, 14 Dec 2023 00:14:37 -0800 Subject: [PATCH 07/18] Another NPE --- .../eclipse/plugins/csvedit/sorter/CSVTableSorter.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/sorter/CSVTableSorter.java b/csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/sorter/CSVTableSorter.java index 03c831e..2c40247 100644 --- a/csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/sorter/CSVTableSorter.java +++ b/csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/sorter/CSVTableSorter.java @@ -71,8 +71,8 @@ public int compare(final Viewer viewer, final Object e1, final Object e2) { return 0; } - final String row1 = ((CSVRow) e1).getElementAt(propertyIndex); - final String row2 = ((CSVRow) e2).getElementAt(propertyIndex); + final String row1 = nvl(((CSVRow) e1).getElementAt(propertyIndex)); + final String row2 = nvl(((CSVRow) e2).getElementAt(propertyIndex)); int rc = row1.compareTo(row2); @@ -82,4 +82,8 @@ public int compare(final Viewer viewer, final Object e1, final Object e2) { } return rc; } + + private static final String nvl(final String string) { + return string != null ? string : ""; + } } From 4d8d2db818ecc97db9e8be1920d80e60cf1f32e1 Mon Sep 17 00:00:00 2001 From: George Lindholm <66577321+gnl42@users.noreply.github.com> Date: Thu, 14 Dec 2023 00:14:46 -0800 Subject: [PATCH 08/18] Update .gitignore --- .gitignore | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index b1a83d9..59a623f 100644 --- a/.gitignore +++ b/.gitignore @@ -38,4 +38,7 @@ RemoteSystemsTempFiles/ # TeXlipse plugin .texlipse -internalChangelog.txt \ No newline at end of file +internalChangelog.txt +.project +.classpath + From d3d25b1dc6a83e8e12d76d89c1f7d39041b900a0 Mon Sep 17 00:00:00 2001 From: George Lindholm <66577321+gnl42@users.noreply.github.com> Date: Sat, 16 Dec 2023 17:49:37 -0800 Subject: [PATCH 09/18] Revert "Deploy to GitHub #9" This reverts commit e035141f3f7722651ebf97f06d49ab388cbba1b6. --- csvedit.site/packaging-p2composite.ant | 181 -------------------- csvedit.site/pom.xml | 221 ------------------------- pom.xml | 42 +---- 3 files changed, 3 insertions(+), 441 deletions(-) delete mode 100644 csvedit.site/packaging-p2composite.ant diff --git a/csvedit.site/packaging-p2composite.ant b/csvedit.site/packaging-p2composite.ant deleted file mode 100644 index f9bd40c..0000000 --- a/csvedit.site/packaging-p2composite.ant +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - version=1 -metadata.repository.factory.order=compositeContent.xml,\! -artifact.repository.factory.order=compositeArtifacts.xml,\! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/csvedit.site/pom.xml b/csvedit.site/pom.xml index 0027ec7..8b03533 100644 --- a/csvedit.site/pom.xml +++ b/csvedit.site/pom.xml @@ -11,225 +11,4 @@ csvedit.site eclipse-repository csvedit :: update site - - - - - org.eclipse.tycho - tycho-packaging-plugin - - 'v'yyyyMMdd'-'HHmm - - - - - org.eclipse.tycho - tycho-p2-repository-plugin - - ${project.artifactId}-${qualifiedVersion} - - - - - - - - - release-composite - - false - - - - - - org.codehaus.mojo - build-helper-maven-plugin - - - - parse-version - - parse-version - - - - - - org.codehaus.mojo - exec-maven-plugin - - git - - - - git-clone - prepare-package - - exec - - - - clone - --depth=1 - -b - master - ${github-update-repo} - ${github-local-clone} - - - - - git-add - verify - - exec - - - - -C - ${github-local-clone} - add - -A - - - - - git-commit - verify - - exec - - - - -C - ${github-local-clone} - commit - -m - Release ${qualifiedVersion} - - - - - git-push - deploy - - exec - - - - -C - ${github-local-clone} - push - origin - master - - - - - - - maven-resources-plugin - - - copy-repository - package - - copy-resources - - - - ${current-release-directory} - - - - ${project.build.directory}/repository - - - - - - - - org.eclipse.tycho.extras - tycho-eclipserun-plugin - - - - eclipse-version - p2 - - https://download.eclipse.org/releases/2023-06 - - - - - org.eclipse.ant.core - eclipse-plugin - - - org.apache.ant - eclipse-plugin - - - - org.eclipse.equinox.p2.repository.tools - eclipse-plugin - - - - org.eclipse.equinox.p2.core.feature - eclipse-feature - - - - org.eclipse.equinox.p2.extras.feature - eclipse-feature - - - org.eclipse.rcp - eclipse-feature - - - - - - - add-p2-composite-repository - package - - eclipse-run - - - - -application - org.eclipse.ant.core.antRunner - -buildfile - packaging-p2composite.ant - p2.composite.add - -Dsite.label="${site.label}" - - -Dcomposite.base.dir=${github-local-clone} - - -DunqualifiedVersion=${unqualifiedVersion} - -DbuildQualifier=${buildQualifier} - - -DparsedVersion.majorVersion=${parsedVersion.majorVersion} - - -DparsedVersion.minorVersion=${parsedVersion.minorVersion} - - - - - - - - - diff --git a/pom.xml b/pom.xml index a9cb6d8..947ee38 100644 --- a/pom.xml +++ b/pom.xml @@ -15,21 +15,12 @@ 4.0.4 -Xmx512m -XX:MaxPermSize=256m UTF-8 - - - - git@github.com:Mathieuu/CsvEdit-update.git - ${project.build.directory}/checkout - ${github-local-clone}/releases - ${releases-directory}/${qualifiedVersion} - - CsvEdit-update - scm:git@github.com:Mathieuu/CsvEdit.git - scm:git@github.com:Mathieuu/CsvEdit.git - https://github.com/Mathieuu/CsvEdit + scm:git@github.com:gnl42/CsvEdit.git + scm:git@github.com:gnl42/CsvEdit.git + https://github.com/gnl42/CsvEdit @@ -270,33 +261,6 @@ - - - - release-composite - - - - - maven-install-plugin - - - default-install - none - - - - - maven-deploy-plugin - - true - - - - - - - csvedit.target csvedit.plugin From 607db0dd61d0462e0d1f7df508a1808ba458804b Mon Sep 17 00:00:00 2001 From: George Lindholm <66577321+gnl42@users.noreply.github.com> Date: Sun, 17 Dec 2023 00:20:14 -0800 Subject: [PATCH 10/18] Cleanup --- .gitignore | 51 +-- .mvn/extensions.xml | 10 +- csvedit.feature/.gitignore | 30 -- csvedit.feature/feature.xml | 12 +- csvedit.plugin.ui/.gitignore | 30 -- csvedit.plugin.ui/META-INF/MANIFEST.MF | 6 +- csvedit.plugin.ui/build.properties | 3 +- csvedit.plugin.ui/fragment.xml | 14 +- .../DefaultCSVMultipageEditor.java | 23 +- .../customeditor/model/DefaultCSVFile.java | 39 +- .../model/PreferencesCSVOptionsProvider.java | 93 +++++ .../preferences/CSVPreferencePage.java | 82 ++-- .../preferences/PreferenceConstants.java | 2 +- .../preferences/PreferenceInitializer.java | 8 +- .../model/PreferencesCSVOptionsProvider.java | 95 ----- csvedit.plugin/.gitignore | 31 -- csvedit.plugin/META-INF/MANIFEST.MF | 12 +- csvedit.plugin/build.properties | 2 + .../glindholm/plugin/csvedit2}/Activator.java | 19 +- .../AttributeEditorCellModifier.java | 24 +- .../csvedit2/detailededitor/AttributeRow.java | 184 +++++++++ .../DetailedAttributeTableViewer.java | 213 ++++++++++ .../detailededitor/DetailedEditor.java | 243 ++++++++++++ .../IAttributeChangesListener.java | 18 +- .../editors/CSVEditorCellModifier.java | 46 ++- .../csvedit2}/editors/MultiPageCSVEditor.java | 375 ++++++++---------- .../MultiPageCSVEditorContributor.java | 25 +- .../csvedit2}/editors/text/CSVRegion.java | 16 +- .../csvedit2}/editors/text/CSVTextEditor.java | 13 +- .../CSVTextSourceViewerConfiguration.java | 20 +- .../csvedit2}/editors/text/CSVToken.java | 24 +- .../editors/text/CSVTokenScanner.java | 63 ++- .../csvedit2}/filter/CSVTableFilter.java | 5 +- .../csvedit2}/model/AbstractCSVFile.java | 18 +- .../plugin/csvedit2}/model/CSVRow.java | 13 +- .../model/ICsvFileModelListener.java | 2 +- .../csvedit2}/model/ICsvModelProvider.java | 2 +- .../csvedit2}/model/ICsvOptionsProvider.java | 6 +- .../csvedit2}/model/IRowChangesListener.java | 9 +- .../csvedit2}/page/DeleteColumnPage.java | 44 +- .../csvedit2}/page/InsertColumnPage.java | 74 ++-- .../providers/CSVContentProvider.java | 22 +- .../csvedit2}/providers/CSVLabelProvider.java | 7 +- .../csvedit2}/sorter/CSVTableSorter.java | 5 +- .../csvedit2}/style/SearchResultStyle.java | 42 +- .../csvedit/detailededitor/AttributeRow.java | 189 --------- .../DetailedAttributeTableViewer.java | 232 ----------- .../detailededitor/DetailedEditor.java | 253 ------------ csvedit.site/category.xml | 7 +- csvedit.site/packaging-p2composite.ant | 181 +++++++++ csvedit.site/pom.xml | 227 ++++++++++- csvedit.target/pom.xml | 6 +- csvedit.update/.gitignore | 30 -- csvedit.update/.project | 17 - csvedit.update/artifacts.jar | Bin 670 -> 0 bytes csvedit.update/content.jar | Bin 2107 -> 0 bytes ...solution.eclipse.feature.csvedit_1.0.1.jar | Bin 931 -> 0 bytes ...solution.eclipse.feature.csvedit_1.0.2.jar | Bin 926 -> 0 bytes ...solution.eclipse.feature.csvedit_1.0.3.jar | Bin 931 -> 0 bytes ...solution.eclipse.feature.csvedit_1.1.0.jar | Bin 959 -> 0 bytes ...solution.eclipse.feature.csvedit_1.1.1.jar | Bin 957 -> 0 bytes ...solution.eclipse.feature.csvedit_1.1.2.jar | Bin 959 -> 0 bytes ...solution.eclipse.feature.csvedit_1.2.0.jar | Bin 970 -> 0 bytes ...ution.eclipse.plugins.csvedit.ui_1.1.0.jar | Bin 20864 -> 0 bytes ...ution.eclipse.plugins.csvedit.ui_1.1.1.jar | Bin 20881 -> 0 bytes ...ution.eclipse.plugins.csvedit.ui_1.1.2.jar | Bin 20572 -> 0 bytes ...ution.eclipse.plugins.csvedit.ui_1.2.0.jar | Bin 21487 -> 0 bytes ...solution.eclipse.plugins.csvedit_1.0.2.jar | Bin 90691 -> 0 bytes ...solution.eclipse.plugins.csvedit_1.0.3.jar | Bin 89549 -> 0 bytes ...solution.eclipse.plugins.csvedit_1.1.0.jar | Bin 61455 -> 0 bytes ...solution.eclipse.plugins.csvedit_1.1.1.jar | Bin 61995 -> 0 bytes ...solution.eclipse.plugins.csvedit_1.1.2.jar | Bin 62056 -> 0 bytes ...solution.eclipse.plugins.csvedit_1.2.0.jar | Bin 83683 -> 0 bytes csvedit.update/site.xml | 22 - pom.xml | 55 ++- 75 files changed, 1705 insertions(+), 1589 deletions(-) delete mode 100644 csvedit.feature/.gitignore delete mode 100644 csvedit.plugin.ui/.gitignore rename csvedit.plugin.ui/src/{org/fhsolution/eclipse/plugins/csvedit => me/glindholm/plugin/csvedit2}/customeditor/DefaultCSVMultipageEditor.java (62%) rename csvedit.plugin.ui/src/{org/fhsolution/eclipse/plugins/csvedit => me/glindholm/plugin/csvedit2}/customeditor/model/DefaultCSVFile.java (75%) create mode 100644 csvedit.plugin.ui/src/me/glindholm/plugin/csvedit2/customeditor/model/PreferencesCSVOptionsProvider.java rename csvedit.plugin.ui/src/{org/fhsolution/eclipse/plugins/csvedit => me/glindholm/plugin/csvedit2}/customeditor/preferences/CSVPreferencePage.java (54%) rename csvedit.plugin.ui/src/{org/fhsolution/eclipse/plugins/csvedit => me/glindholm/plugin/csvedit2}/customeditor/preferences/PreferenceConstants.java (95%) rename csvedit.plugin.ui/src/{org/fhsolution/eclipse/plugins/csvedit => me/glindholm/plugin/csvedit2}/customeditor/preferences/PreferenceInitializer.java (87%) delete mode 100644 csvedit.plugin.ui/src/org/fhsolution/eclipse/plugins/csvedit/customeditor/model/PreferencesCSVOptionsProvider.java delete mode 100644 csvedit.plugin/.gitignore rename csvedit.plugin/src/{org/fhsolution/eclipse/plugins/csvedit => me/glindholm/plugin/csvedit2}/Activator.java (78%) rename csvedit.plugin/src/{org/fhsolution/eclipse/plugins/csvedit => me/glindholm/plugin/csvedit2}/detailededitor/AttributeEditorCellModifier.java (84%) create mode 100644 csvedit.plugin/src/me/glindholm/plugin/csvedit2/detailededitor/AttributeRow.java create mode 100644 csvedit.plugin/src/me/glindholm/plugin/csvedit2/detailededitor/DetailedAttributeTableViewer.java create mode 100644 csvedit.plugin/src/me/glindholm/plugin/csvedit2/detailededitor/DetailedEditor.java rename csvedit.plugin/src/{org/fhsolution/eclipse/plugins/csvedit => me/glindholm/plugin/csvedit2}/detailededitor/IAttributeChangesListener.java (72%) rename csvedit.plugin/src/{org/fhsolution/eclipse/plugins/csvedit => me/glindholm/plugin/csvedit2}/editors/CSVEditorCellModifier.java (61%) rename csvedit.plugin/src/{org/fhsolution/eclipse/plugins/csvedit => me/glindholm/plugin/csvedit2}/editors/MultiPageCSVEditor.java (65%) rename csvedit.plugin/src/{org/fhsolution/eclipse/plugins/csvedit => me/glindholm/plugin/csvedit2}/editors/MultiPageCSVEditorContributor.java (73%) rename csvedit.plugin/src/{org/fhsolution/eclipse/plugins/csvedit => me/glindholm/plugin/csvedit2}/editors/text/CSVRegion.java (86%) rename csvedit.plugin/src/{org/fhsolution/eclipse/plugins/csvedit => me/glindholm/plugin/csvedit2}/editors/text/CSVTextEditor.java (74%) rename csvedit.plugin/src/{org/fhsolution/eclipse/plugins/csvedit => me/glindholm/plugin/csvedit2}/editors/text/CSVTextSourceViewerConfiguration.java (72%) rename csvedit.plugin/src/{org/fhsolution/eclipse/plugins/csvedit => me/glindholm/plugin/csvedit2}/editors/text/CSVToken.java (78%) rename csvedit.plugin/src/{org/fhsolution/eclipse/plugins/csvedit => me/glindholm/plugin/csvedit2}/editors/text/CSVTokenScanner.java (64%) rename csvedit.plugin/src/{org/fhsolution/eclipse/plugins/csvedit => me/glindholm/plugin/csvedit2}/filter/CSVTableFilter.java (95%) rename csvedit.plugin/src/{org/fhsolution/eclipse/plugins/csvedit => me/glindholm/plugin/csvedit2}/model/AbstractCSVFile.java (95%) rename csvedit.plugin/src/{org/fhsolution/eclipse/plugins/csvedit => me/glindholm/plugin/csvedit2}/model/CSVRow.java (94%) rename csvedit.plugin/src/{org/fhsolution/eclipse/plugins/csvedit => me/glindholm/plugin/csvedit2}/model/ICsvFileModelListener.java (92%) rename csvedit.plugin/src/{org/fhsolution/eclipse/plugins/csvedit => me/glindholm/plugin/csvedit2}/model/ICsvModelProvider.java (92%) rename csvedit.plugin/src/{org/fhsolution/eclipse/plugins/csvedit => me/glindholm/plugin/csvedit2}/model/ICsvOptionsProvider.java (93%) rename csvedit.plugin/src/{org/fhsolution/eclipse/plugins/csvedit => me/glindholm/plugin/csvedit2}/model/IRowChangesListener.java (83%) rename csvedit.plugin/src/{org/fhsolution/eclipse/plugins/csvedit => me/glindholm/plugin/csvedit2}/page/DeleteColumnPage.java (69%) rename csvedit.plugin/src/{org/fhsolution/eclipse/plugins/csvedit => me/glindholm/plugin/csvedit2}/page/InsertColumnPage.java (55%) rename csvedit.plugin/src/{org/fhsolution/eclipse/plugins/csvedit => me/glindholm/plugin/csvedit2}/providers/CSVContentProvider.java (72%) rename csvedit.plugin/src/{org/fhsolution/eclipse/plugins/csvedit => me/glindholm/plugin/csvedit2}/providers/CSVLabelProvider.java (95%) rename csvedit.plugin/src/{org/fhsolution/eclipse/plugins/csvedit => me/glindholm/plugin/csvedit2}/sorter/CSVTableSorter.java (95%) rename csvedit.plugin/src/{org/fhsolution/eclipse/plugins/csvedit => me/glindholm/plugin/csvedit2}/style/SearchResultStyle.java (59%) delete mode 100644 csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/detailededitor/AttributeRow.java delete mode 100644 csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/detailededitor/DetailedAttributeTableViewer.java delete mode 100644 csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/detailededitor/DetailedEditor.java create mode 100644 csvedit.site/packaging-p2composite.ant delete mode 100644 csvedit.update/.gitignore delete mode 100644 csvedit.update/.project delete mode 100644 csvedit.update/artifacts.jar delete mode 100644 csvedit.update/content.jar delete mode 100644 csvedit.update/features/org.fhsolution.eclipse.feature.csvedit_1.0.1.jar delete mode 100644 csvedit.update/features/org.fhsolution.eclipse.feature.csvedit_1.0.2.jar delete mode 100644 csvedit.update/features/org.fhsolution.eclipse.feature.csvedit_1.0.3.jar delete mode 100644 csvedit.update/features/org.fhsolution.eclipse.feature.csvedit_1.1.0.jar delete mode 100644 csvedit.update/features/org.fhsolution.eclipse.feature.csvedit_1.1.1.jar delete mode 100644 csvedit.update/features/org.fhsolution.eclipse.feature.csvedit_1.1.2.jar delete mode 100644 csvedit.update/features/org.fhsolution.eclipse.feature.csvedit_1.2.0.jar delete mode 100644 csvedit.update/plugins/org.fhsolution.eclipse.plugins.csvedit.ui_1.1.0.jar delete mode 100644 csvedit.update/plugins/org.fhsolution.eclipse.plugins.csvedit.ui_1.1.1.jar delete mode 100644 csvedit.update/plugins/org.fhsolution.eclipse.plugins.csvedit.ui_1.1.2.jar delete mode 100644 csvedit.update/plugins/org.fhsolution.eclipse.plugins.csvedit.ui_1.2.0.jar delete mode 100644 csvedit.update/plugins/org.fhsolution.eclipse.plugins.csvedit_1.0.2.jar delete mode 100644 csvedit.update/plugins/org.fhsolution.eclipse.plugins.csvedit_1.0.3.jar delete mode 100644 csvedit.update/plugins/org.fhsolution.eclipse.plugins.csvedit_1.1.0.jar delete mode 100644 csvedit.update/plugins/org.fhsolution.eclipse.plugins.csvedit_1.1.1.jar delete mode 100644 csvedit.update/plugins/org.fhsolution.eclipse.plugins.csvedit_1.1.2.jar delete mode 100644 csvedit.update/plugins/org.fhsolution.eclipse.plugins.csvedit_1.2.0.jar delete mode 100644 csvedit.update/site.xml diff --git a/.gitignore b/.gitignore index 59a623f..6f85526 100644 --- a/.gitignore +++ b/.gitignore @@ -1,44 +1,7 @@ -# maven tycho build output -target - -*.pydevproject -.metadata -.gradle -bin/ -tmp/ -*.tmp -*.bak -*.swp -*~.nib -local.properties -.settings/ -.loadpath - -# Runtime Eclipse -runtime-EclipseApplication/ - -# Temp filesystem -RemoteSystemsTempFiles/ - -# External tool builders -.externalToolBuilders/ - -# Locally stored "Eclipse launch configurations" -*.launch - -# CDT-specific -.cproject - -# PDT-specific -.buildpath - -# sbteclipse plugin -.target - -# TeXlipse plugin -.texlipse - -internalChangelog.txt -.project -.classpath - +.classpath +.project +.polyglot.META-INF +.polyglot.feature.xml +.settings/ +bin/ +target/ diff --git a/.mvn/extensions.xml b/.mvn/extensions.xml index ecfbd8f..b7cea6f 100644 --- a/.mvn/extensions.xml +++ b/.mvn/extensions.xml @@ -1,8 +1,8 @@ - - org.eclipse.tycho.extras - tycho-pomless - 4.0.4 - + + org.eclipse.tycho + tycho-build + 4.0.4 + diff --git a/csvedit.feature/.gitignore b/csvedit.feature/.gitignore deleted file mode 100644 index b71f363..0000000 --- a/csvedit.feature/.gitignore +++ /dev/null @@ -1,30 +0,0 @@ -*.pydevproject -.metadata -.gradle -bin/ -tmp/ -*.tmp -*.bak -*.swp -*~.nib -local.properties -.settings/ -.loadpath - -# External tool builders -.externalToolBuilders/ - -# Locally stored "Eclipse launch configurations" -*.launch - -# CDT-specific -.cproject - -# PDT-specific -.buildpath - -# sbteclipse plugin -.target - -# TeXlipse plugin -.texlipse \ No newline at end of file diff --git a/csvedit.feature/feature.xml b/csvedit.feature/feature.xml index fc2bde1..40e5616 100644 --- a/csvedit.feature/feature.xml +++ b/csvedit.feature/feature.xml @@ -1,10 +1,10 @@ + plugin="me.glindholm.plugin.csvedit2.plugins.csvedit"> This aims to create a CSV file editor in Eclipse with features @@ -51,15 +51,15 @@ permissions and limitations under the License. diff --git a/csvedit.plugin.ui/.gitignore b/csvedit.plugin.ui/.gitignore deleted file mode 100644 index b71f363..0000000 --- a/csvedit.plugin.ui/.gitignore +++ /dev/null @@ -1,30 +0,0 @@ -*.pydevproject -.metadata -.gradle -bin/ -tmp/ -*.tmp -*.bak -*.swp -*~.nib -local.properties -.settings/ -.loadpath - -# External tool builders -.externalToolBuilders/ - -# Locally stored "Eclipse launch configurations" -*.launch - -# CDT-specific -.cproject - -# PDT-specific -.buildpath - -# sbteclipse plugin -.target - -# TeXlipse plugin -.texlipse \ No newline at end of file diff --git a/csvedit.plugin.ui/META-INF/MANIFEST.MF b/csvedit.plugin.ui/META-INF/MANIFEST.MF index 6ef4487..812a822 100644 --- a/csvedit.plugin.ui/META-INF/MANIFEST.MF +++ b/csvedit.plugin.ui/META-INF/MANIFEST.MF @@ -1,10 +1,10 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Eclipse CSV Editor UI contributions -Bundle-SymbolicName: org.fhsolution.eclipse.plugins.csvedit.ui;singleton:=true -Bundle-Version: 1.2.0 +Bundle-SymbolicName: me.glindholm.plugin.csvedit2.ui;singleton:=true +Bundle-Version: 2.0.0.qualifier Bundle-Vendor: www.fhsolution.com -Fragment-Host: org.fhsolution.eclipse.plugins.csvedit;bundle-version="1.2.0" +Fragment-Host: me.glindholm.plugin.csvedit2 Bundle-RequiredExecutionEnvironment: JavaSE-17 Require-Bundle: org.eclipse.ui.ide, org.eclipse.core.resources diff --git a/csvedit.plugin.ui/build.properties b/csvedit.plugin.ui/build.properties index e3023e1..d68138b 100644 --- a/csvedit.plugin.ui/build.properties +++ b/csvedit.plugin.ui/build.properties @@ -1,5 +1,6 @@ source.. = src/ -output.. = bin/ +output.. = target/classes + bin.includes = META-INF/,\ .,\ fragment.xml diff --git a/csvedit.plugin.ui/fragment.xml b/csvedit.plugin.ui/fragment.xml index 723d89a..9e429fa 100644 --- a/csvedit.plugin.ui/fragment.xml +++ b/csvedit.plugin.ui/fragment.xml @@ -4,27 +4,27 @@ + class="me.glindholm.plugin.csvedit2.customeditor.preferences.PreferenceInitializer"> + id="me.glindholm.plugin.csvedit2.views.CSVEditView"> diff --git a/csvedit.plugin.ui/src/org/fhsolution/eclipse/plugins/csvedit/customeditor/DefaultCSVMultipageEditor.java b/csvedit.plugin.ui/src/me/glindholm/plugin/csvedit2/customeditor/DefaultCSVMultipageEditor.java similarity index 62% rename from csvedit.plugin.ui/src/org/fhsolution/eclipse/plugins/csvedit/customeditor/DefaultCSVMultipageEditor.java rename to csvedit.plugin.ui/src/me/glindholm/plugin/csvedit2/customeditor/DefaultCSVMultipageEditor.java index 7639ed5..76bf513 100644 --- a/csvedit.plugin.ui/src/org/fhsolution/eclipse/plugins/csvedit/customeditor/DefaultCSVMultipageEditor.java +++ b/csvedit.plugin.ui/src/me/glindholm/plugin/csvedit2/customeditor/DefaultCSVMultipageEditor.java @@ -12,12 +12,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.fhsolution.eclipse.plugins.csvedit.customeditor; +package me.glindholm.plugin.csvedit2.customeditor; -import org.fhsolution.eclipse.plugins.csvedit.customeditor.model.DefaultCSVFile; -import org.fhsolution.eclipse.plugins.csvedit.customeditor.model.PreferencesCSVOptionsProvider; -import org.fhsolution.eclipse.plugins.csvedit.editors.MultiPageCSVEditor; -import org.fhsolution.eclipse.plugins.csvedit.model.AbstractCSVFile; +import me.glindholm.plugin.csvedit2.customeditor.model.DefaultCSVFile; +import me.glindholm.plugin.csvedit2.customeditor.model.PreferencesCSVOptionsProvider; +import me.glindholm.plugin.csvedit2.editors.MultiPageCSVEditor; +import me.glindholm.plugin.csvedit2.model.AbstractCSVFile; public class DefaultCSVMultipageEditor extends MultiPageCSVEditor { @@ -26,19 +26,20 @@ public class DefaultCSVMultipageEditor extends MultiPageCSVEditor { /** * Create the CSV file */ - protected AbstractCSVFile createCSVFile() - { + @Override + protected AbstractCSVFile createCSVFile() { preferences = new PreferencesCSVOptionsProvider(); return new DefaultCSVFile(preferences); } /** - * Create the different tab for the multi editor and set the focus to the - * page according to user preferences. + * Create the different tab for the multi editor and set the focus to the page according to user + * preferences. * - * @see org.fhsolution.eclipse.plugins.csvedit.editors.MultiPageCSVEditor#createPages() + * @see me.glindholm.plugin.csvedit2.editors.MultiPageCSVEditor#createPages() */ - protected void createPages () { + @Override + protected void createPages() { super.createPages(); setActivePage(preferences.getDefaultPage()); } diff --git a/csvedit.plugin.ui/src/org/fhsolution/eclipse/plugins/csvedit/customeditor/model/DefaultCSVFile.java b/csvedit.plugin.ui/src/me/glindholm/plugin/csvedit2/customeditor/model/DefaultCSVFile.java similarity index 75% rename from csvedit.plugin.ui/src/org/fhsolution/eclipse/plugins/csvedit/customeditor/model/DefaultCSVFile.java rename to csvedit.plugin.ui/src/me/glindholm/plugin/csvedit2/customeditor/model/DefaultCSVFile.java index 303dff0..fc1b8b4 100644 --- a/csvedit.plugin.ui/src/org/fhsolution/eclipse/plugins/csvedit/customeditor/model/DefaultCSVFile.java +++ b/csvedit.plugin.ui/src/me/glindholm/plugin/csvedit2/customeditor/model/DefaultCSVFile.java @@ -12,18 +12,19 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.fhsolution.eclipse.plugins.csvedit.customeditor.model; +package me.glindholm.plugin.csvedit2.customeditor.model; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; -import org.fhsolution.eclipse.plugins.csvedit.model.AbstractCSVFile; -import org.fhsolution.eclipse.plugins.csvedit.model.ICsvOptionsProvider; +import me.glindholm.plugin.csvedit2.model.AbstractCSVFile; +import me.glindholm.plugin.csvedit2.model.ICsvOptionsProvider; /** * - * {@link DefaultCSVFile} implements the {@link AbstractCSVFile} abstract - * methods based on the values stored in the preferences system + * {@link DefaultCSVFile} implements the {@link AbstractCSVFile} abstract methods based on the + * values stored in the preferences system + * * @author jpizar * @author msavy * @@ -35,11 +36,11 @@ public class DefaultCSVFile extends AbstractCSVFile { /** * Constructor + * * @param provider the {@link PreferencesCSVOptionsProvider} */ - public DefaultCSVFile(ICsvOptionsProvider provider) { - super(); - this.optionsProvider = provider; + public DefaultCSVFile(final ICsvOptionsProvider provider) { + optionsProvider = provider; } @Override @@ -59,20 +60,20 @@ public char getCustomDelimiter() { @Override public char getCommentChar() { - String commentChar = optionsProvider.getCommentChar(); + final String commentChar = optionsProvider.getCommentChar(); char result = Character.UNASSIGNED; if (commentChar != null && commentChar != "") { - result = commentChar.charAt(0); + result = commentChar.charAt(0); } return result; } @Override public char getTextQualifier() { - String qualifierChar = optionsProvider.getTextQualifier(); + final String qualifierChar = optionsProvider.getTextQualifier(); char result = Character.UNASSIGNED; if (qualifierChar != null && qualifierChar != "" && qualifierChar.length() > 0) { - result = qualifierChar.charAt(0); + result = qualifierChar.charAt(0); } return result; } @@ -81,7 +82,7 @@ public char getTextQualifier() { public boolean useQualifier() { return optionsProvider.useTextQualifier(); } - + @Override public String getInCellDelimiter() { return optionsProvider.getInCellDelimiter(); @@ -89,16 +90,16 @@ public String getInCellDelimiter() { @Override public String getRegexTableMarker() { - - String result = ""; - + + String result = ""; + try { Pattern.compile(optionsProvider.getRegexTableMarker()); result = optionsProvider.getRegexTableMarker(); - } catch (PatternSyntaxException exception) { - + } catch (final PatternSyntaxException exception) { + } - + return result; } } \ No newline at end of file diff --git a/csvedit.plugin.ui/src/me/glindholm/plugin/csvedit2/customeditor/model/PreferencesCSVOptionsProvider.java b/csvedit.plugin.ui/src/me/glindholm/plugin/csvedit2/customeditor/model/PreferencesCSVOptionsProvider.java new file mode 100644 index 0000000..a97a7dd --- /dev/null +++ b/csvedit.plugin.ui/src/me/glindholm/plugin/csvedit2/customeditor/model/PreferencesCSVOptionsProvider.java @@ -0,0 +1,93 @@ +/* Copyright 2011 csvedit + * + * 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 + * + * http://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 me.glindholm.plugin.csvedit2.customeditor.model; + +import me.glindholm.plugin.csvedit2.Activator; +import me.glindholm.plugin.csvedit2.customeditor.preferences.PreferenceConstants; +import me.glindholm.plugin.csvedit2.model.ICsvOptionsProvider; + +/** + * + * @author fhenri, msavy + * + */ +public class PreferencesCSVOptionsProvider implements ICsvOptionsProvider { + + private final boolean useFirstLineAsHeader; + private final boolean sensitiveSearch; + private final boolean useQualifier; + private final String customDelimiter; + private final String commentChar; + private final String defaultPage; + private final String textQualifier; + private final String inCellDelimiter; + private final String regexTableMarker; + + public PreferencesCSVOptionsProvider() { + useFirstLineAsHeader = Activator.getDefault().getPreferenceStore().getBoolean(PreferenceConstants.USE_FIRST_LINE_AS_HEADER); + customDelimiter = Activator.getDefault().getPreferenceStore().getString(PreferenceConstants.CUSTOM_DELIMITER); + sensitiveSearch = Activator.getDefault().getPreferenceStore().getBoolean(PreferenceConstants.CASE_SENSITIVE_SEARCH); + commentChar = Activator.getDefault().getPreferenceStore().getString(PreferenceConstants.COMMENT_CHAR); + textQualifier = Activator.getDefault().getPreferenceStore().getString(PreferenceConstants.TEXT_QUALIFIER); + useQualifier = Activator.getDefault().getPreferenceStore().getBoolean(PreferenceConstants.USE_QUALIFIER); + defaultPage = Activator.getDefault().getPreferenceStore().getString(PreferenceConstants.DEFAULT_VIEW_PAGE); + inCellDelimiter = Activator.getDefault().getPreferenceStore().getString(PreferenceConstants.INCELL_DELIMITER); + regexTableMarker = Activator.getDefault().getPreferenceStore().getString(PreferenceConstants.REGEX_HEADER_TABLE); + } + + @Override + public String getCustomDelimiter() { + return customDelimiter; + } + + @Override + public boolean getUseFirstLineAsHeader() { + return useFirstLineAsHeader; + } + + @Override + public boolean getSensitiveSearch() { + return sensitiveSearch; + } + + @Override + public String getCommentChar() { + return commentChar; + } + + public int getDefaultPage() { + return Integer.parseInt(defaultPage); + } + + @Override + public String getTextQualifier() { + return textQualifier; + } + + @Override + public boolean useTextQualifier() { + return useQualifier; + } + + @Override + public String getRegexTableMarker() { + return regexTableMarker; + } + + @Override + public String getInCellDelimiter() { + return inCellDelimiter; + } +} diff --git a/csvedit.plugin.ui/src/org/fhsolution/eclipse/plugins/csvedit/customeditor/preferences/CSVPreferencePage.java b/csvedit.plugin.ui/src/me/glindholm/plugin/csvedit2/customeditor/preferences/CSVPreferencePage.java similarity index 54% rename from csvedit.plugin.ui/src/org/fhsolution/eclipse/plugins/csvedit/customeditor/preferences/CSVPreferencePage.java rename to csvedit.plugin.ui/src/me/glindholm/plugin/csvedit2/customeditor/preferences/CSVPreferencePage.java index c9cd923..ef3bb41 100644 --- a/csvedit.plugin.ui/src/org/fhsolution/eclipse/plugins/csvedit/customeditor/preferences/CSVPreferencePage.java +++ b/csvedit.plugin.ui/src/me/glindholm/plugin/csvedit2/customeditor/preferences/CSVPreferencePage.java @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.fhsolution.eclipse.plugins.csvedit.customeditor.preferences; +package me.glindholm.plugin.csvedit2.customeditor.preferences; import org.eclipse.jface.preference.BooleanFieldEditor; import org.eclipse.jface.preference.ComboFieldEditor; @@ -20,23 +20,22 @@ import org.eclipse.jface.preference.StringFieldEditor; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPreferencePage; -import org.fhsolution.eclipse.plugins.csvedit.Activator; + +import me.glindholm.plugin.csvedit2.Activator; /** - * This class represents a preference page that is contributed to the - * Preferences dialog. By subclassing FieldEditorPreferencePage, we - * can use the field support built into JFace that allows us to create a page - * that is small and knows how to save, restore and apply itself. + * This class represents a preference page that is contributed to the Preferences dialog. By + * subclassing FieldEditorPreferencePage, we can use the field support built into JFace + * that allows us to create a page that is small and knows how to save, restore and apply itself. *

- * This page is used to modify preferences only. They are stored in the - * preference store that belongs to the main plug-in class. That way, - * preferences can be accessed directly via the preference store. + * This page is used to modify preferences only. They are stored in the preference store that + * belongs to the main plug-in class. That way, preferences can be accessed directly via the + * preference store. * * @author fhenri * */ -public class CSVPreferencePage extends FieldEditorPreferencePage -implements IWorkbenchPreferencePage { +public class CSVPreferencePage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage { /** * Public constructor @@ -48,72 +47,55 @@ public CSVPreferencePage() { } /** - * Creates the field editors. Field editors are abstractions of the common - * GUI blocks needed to manipulate various types of preferences. Each field - * editor knows how to save and restore itself. + * Creates the field editors. Field editors are abstractions of the common GUI blocks needed to + * manipulate various types of preferences. Each field editor knows how to save and restore itself. * * @see org.eclipse.jface.preference.FieldEditorPreferencePage#createFieldEditors() */ + @Override public void createFieldEditors() { - String[][] pagesLabelsAndValues = new String[2][2]; + final String[][] pagesLabelsAndValues = new String[2][2]; pagesLabelsAndValues[0][0] = "Table"; pagesLabelsAndValues[0][1] = "0"; pagesLabelsAndValues[1][0] = "Source"; pagesLabelsAndValues[1][1] = "1"; - addField(new ComboFieldEditor( - PreferenceConstants.DEFAULT_VIEW_PAGE, - "Select the default tab to view csv file:", - pagesLabelsAndValues, + addField(new ComboFieldEditor(PreferenceConstants.DEFAULT_VIEW_PAGE, "Select the default tab to view csv file:", pagesLabelsAndValues, getFieldEditorParent())); - addField(new BooleanFieldEditor( - PreferenceConstants.USE_FIRST_LINE_AS_HEADER, - "&Use the first line of the CSV file as the column headers", + addField(new BooleanFieldEditor(PreferenceConstants.USE_FIRST_LINE_AS_HEADER, "&Use the first line of the CSV file as the column headers", getFieldEditorParent())); - StringFieldEditor customDelimiterField = new StringFieldEditor( - PreferenceConstants.CUSTOM_DELIMITER, - "Choose the delimiter to use:", 2, getFieldEditorParent()); + final StringFieldEditor customDelimiterField = new StringFieldEditor(PreferenceConstants.CUSTOM_DELIMITER, "Choose the delimiter to use:", 2, + getFieldEditorParent()); customDelimiterField.setTextLimit(1); customDelimiterField.setEmptyStringAllowed(false); addField(customDelimiterField); - StringFieldEditor textQualifierChar = new StringFieldEditor( - PreferenceConstants.TEXT_QUALIFIER, + final StringFieldEditor textQualifierChar = new StringFieldEditor(PreferenceConstants.TEXT_QUALIFIER, "Define the character used as a text qualifier of the data:", 2, getFieldEditorParent()); customDelimiterField.setTextLimit(1); customDelimiterField.setEmptyStringAllowed(false); addField(textQualifierChar); - addField(new BooleanFieldEditor( - PreferenceConstants.USE_QUALIFIER, - "For the text qualifier to be used for all fields", - getFieldEditorParent())); + addField(new BooleanFieldEditor(PreferenceConstants.USE_QUALIFIER, "For the text qualifier to be used for all fields", getFieldEditorParent())); - StringFieldEditor commentChar = new StringFieldEditor( - PreferenceConstants.COMMENT_CHAR, - "Choose the character to use as a comment:", 2, getFieldEditorParent()); + final StringFieldEditor commentChar = new StringFieldEditor(PreferenceConstants.COMMENT_CHAR, "Choose the character to use as a comment:", 2, + getFieldEditorParent()); customDelimiterField.setTextLimit(1); customDelimiterField.setEmptyStringAllowed(true); addField(commentChar); - addField(new BooleanFieldEditor( - PreferenceConstants.CASE_SENSITIVE_SEARCH, - "&Case sensitive filtering", - getFieldEditorParent())); - - - StringFieldEditor regexField = new StringFieldEditor( - PreferenceConstants.REGEX_HEADER_TABLE, + addField(new BooleanFieldEditor(PreferenceConstants.CASE_SENSITIVE_SEARCH, "&Case sensitive filtering", getFieldEditorParent())); + + final StringFieldEditor regexField = new StringFieldEditor(PreferenceConstants.REGEX_HEADER_TABLE, "Header regex indicating that the column should be displayed as table", StringFieldEditor.UNLIMITED, getFieldEditorParent()); regexField.setEmptyStringAllowed(true); addField(regexField); - - - StringFieldEditor incellDelimiterField = new StringFieldEditor( - PreferenceConstants.INCELL_DELIMITER, + + final StringFieldEditor incellDelimiterField = new StringFieldEditor(PreferenceConstants.INCELL_DELIMITER, "Delimiter to use as a value delimiter in a cell", StringFieldEditor.UNLIMITED, getFieldEditorParent()); - //incellDelimiterField.setTextLimit(1); //TODO test: does it really work with more than 1 character delimiter + // incellDelimiterField.setTextLimit(1); //TODO test: does it really work with more than 1 character + // delimiter incellDelimiterField.setEmptyStringAllowed(true); addField(incellDelimiterField); @@ -122,7 +104,8 @@ public void createFieldEditors() { /** * @see org.eclipse.jface.preference.FieldEditorPreferencePage#performOk() */ - public boolean performOk () { + @Override + public boolean performOk() { // TODO here we should reload all opened csv file with the new pref. return super.performOk(); } @@ -132,7 +115,8 @@ public boolean performOk () { * * @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench) */ - public void init(IWorkbench workbench) { + @Override + public void init(final IWorkbench workbench) { } } \ No newline at end of file diff --git a/csvedit.plugin.ui/src/org/fhsolution/eclipse/plugins/csvedit/customeditor/preferences/PreferenceConstants.java b/csvedit.plugin.ui/src/me/glindholm/plugin/csvedit2/customeditor/preferences/PreferenceConstants.java similarity index 95% rename from csvedit.plugin.ui/src/org/fhsolution/eclipse/plugins/csvedit/customeditor/preferences/PreferenceConstants.java rename to csvedit.plugin.ui/src/me/glindholm/plugin/csvedit2/customeditor/preferences/PreferenceConstants.java index 1e5180c..0913350 100644 --- a/csvedit.plugin.ui/src/org/fhsolution/eclipse/plugins/csvedit/customeditor/preferences/PreferenceConstants.java +++ b/csvedit.plugin.ui/src/me/glindholm/plugin/csvedit2/customeditor/preferences/PreferenceConstants.java @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.fhsolution.eclipse.plugins.csvedit.customeditor.preferences; +package me.glindholm.plugin.csvedit2.customeditor.preferences; /** * Constant definitions for plug-in preferences diff --git a/csvedit.plugin.ui/src/org/fhsolution/eclipse/plugins/csvedit/customeditor/preferences/PreferenceInitializer.java b/csvedit.plugin.ui/src/me/glindholm/plugin/csvedit2/customeditor/preferences/PreferenceInitializer.java similarity index 87% rename from csvedit.plugin.ui/src/org/fhsolution/eclipse/plugins/csvedit/customeditor/preferences/PreferenceInitializer.java rename to csvedit.plugin.ui/src/me/glindholm/plugin/csvedit2/customeditor/preferences/PreferenceInitializer.java index 00d7e7c..5c3b47e 100644 --- a/csvedit.plugin.ui/src/org/fhsolution/eclipse/plugins/csvedit/customeditor/preferences/PreferenceInitializer.java +++ b/csvedit.plugin.ui/src/me/glindholm/plugin/csvedit2/customeditor/preferences/PreferenceInitializer.java @@ -12,11 +12,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.fhsolution.eclipse.plugins.csvedit.customeditor.preferences; +package me.glindholm.plugin.csvedit2.customeditor.preferences; import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer; import org.eclipse.jface.preference.IPreferenceStore; -import org.fhsolution.eclipse.plugins.csvedit.Activator; + +import me.glindholm.plugin.csvedit2.Activator; /** * Class used to initialize default preference values. @@ -31,8 +32,9 @@ public class PreferenceInitializer extends AbstractPreferenceInitializer { * * @see org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer#initializeDefaultPreferences() */ + @Override public void initializeDefaultPreferences() { - IPreferenceStore store = Activator.getDefault().getPreferenceStore(); + final IPreferenceStore store = Activator.getDefault().getPreferenceStore(); store.setDefault(PreferenceConstants.USE_FIRST_LINE_AS_HEADER, true); store.setDefault(PreferenceConstants.CASE_SENSITIVE_SEARCH, false); store.setDefault(PreferenceConstants.CUSTOM_DELIMITER, ","); diff --git a/csvedit.plugin.ui/src/org/fhsolution/eclipse/plugins/csvedit/customeditor/model/PreferencesCSVOptionsProvider.java b/csvedit.plugin.ui/src/org/fhsolution/eclipse/plugins/csvedit/customeditor/model/PreferencesCSVOptionsProvider.java deleted file mode 100644 index 464db3a..0000000 --- a/csvedit.plugin.ui/src/org/fhsolution/eclipse/plugins/csvedit/customeditor/model/PreferencesCSVOptionsProvider.java +++ /dev/null @@ -1,95 +0,0 @@ -/* Copyright 2011 csvedit - * - * 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 - * - * http://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 org.fhsolution.eclipse.plugins.csvedit.customeditor.model; - -import org.fhsolution.eclipse.plugins.csvedit.Activator; -import org.fhsolution.eclipse.plugins.csvedit.customeditor.preferences.PreferenceConstants; -import org.fhsolution.eclipse.plugins.csvedit.model.ICsvOptionsProvider; - -/** - * - * @author fhenri, msavy - * - */ -public class PreferencesCSVOptionsProvider implements ICsvOptionsProvider { - - private boolean useFirstLineAsHeader; - private boolean sensitiveSearch; - private boolean useQualifier; - private String customDelimiter; - private String commentChar; - private String defaultPage; - private String textQualifier; - private String inCellDelimiter; - private String regexTableMarker; - - public PreferencesCSVOptionsProvider () - { - useFirstLineAsHeader = - Activator.getDefault().getPreferenceStore().getBoolean(PreferenceConstants.USE_FIRST_LINE_AS_HEADER); - customDelimiter = - Activator.getDefault().getPreferenceStore().getString(PreferenceConstants.CUSTOM_DELIMITER); - sensitiveSearch = - Activator.getDefault().getPreferenceStore().getBoolean(PreferenceConstants.CASE_SENSITIVE_SEARCH); - commentChar = - Activator.getDefault().getPreferenceStore().getString(PreferenceConstants.COMMENT_CHAR); - textQualifier = - Activator.getDefault().getPreferenceStore().getString(PreferenceConstants.TEXT_QUALIFIER); - useQualifier = - Activator.getDefault().getPreferenceStore().getBoolean(PreferenceConstants.USE_QUALIFIER); - defaultPage = - Activator.getDefault().getPreferenceStore().getString(PreferenceConstants.DEFAULT_VIEW_PAGE); - inCellDelimiter = - Activator.getDefault().getPreferenceStore().getString(PreferenceConstants.INCELL_DELIMITER); - regexTableMarker = - Activator.getDefault().getPreferenceStore().getString(PreferenceConstants.REGEX_HEADER_TABLE); - } - - public String getCustomDelimiter () { - return customDelimiter; - } - - public boolean getUseFirstLineAsHeader () { - return useFirstLineAsHeader; - } - - public boolean getSensitiveSearch () { - return sensitiveSearch; - } - - public String getCommentChar () { - return commentChar; - } - - public int getDefaultPage () { - return Integer.parseInt(defaultPage); - } - - public String getTextQualifier() { - return textQualifier; - } - - public boolean useTextQualifier() { - return useQualifier; - } - - public String getRegexTableMarker() { - return regexTableMarker; - } - - public String getInCellDelimiter() { - return inCellDelimiter; - } -} diff --git a/csvedit.plugin/.gitignore b/csvedit.plugin/.gitignore deleted file mode 100644 index db9592b..0000000 --- a/csvedit.plugin/.gitignore +++ /dev/null @@ -1,31 +0,0 @@ -*.pydevproject -.metadata -.gradle -bin/ -tmp/ -*.tmp -*.bak -*.swp -*~.nib -local.properties -.settings/ -.loadpath - -# External tool builders -.externalToolBuilders/ - -# Locally stored "Eclipse launch configurations" -*.launch - -# CDT-specific -.cproject - -# PDT-specific -.buildpath - -# sbteclipse plugin -.target - -# TeXlipse plugin -.texlipse -/.polyglot.build.properties diff --git a/csvedit.plugin/META-INF/MANIFEST.MF b/csvedit.plugin/META-INF/MANIFEST.MF index 1e0faca..9e1c222 100644 --- a/csvedit.plugin/META-INF/MANIFEST.MF +++ b/csvedit.plugin/META-INF/MANIFEST.MF @@ -1,9 +1,9 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Eclipse CSV Editor -Bundle-SymbolicName: org.fhsolution.eclipse.plugins.csvedit;singleton:=true -Bundle-Version: 1.2.0 -Bundle-Activator: org.fhsolution.eclipse.plugins.csvedit.Activator +Bundle-SymbolicName: me.glindholm.plugin.csvedit2;singleton:=true +Bundle-Version: 2.0.0.qualifier +Bundle-Activator: me.glindholm.plugin.csvedit2.Activator Bundle-RequiredExecutionEnvironment: JavaSE-17 Require-Bundle: org.eclipse.ui, org.eclipse.core.runtime, @@ -13,15 +13,15 @@ Require-Bundle: org.eclipse.ui, org.eclipse.ui.ide Bundle-ActivationPolicy: lazy Bundle-ClassPath: . -Export-Package: org.fhsolution.eclipse.plugins.csvedit.editors; +Export-Package: me.glindholm.plugin.csvedit2.editors; uses:="org.eclipse.jface.action, org.eclipse.ui.texteditor, org.eclipse.core.runtime, org.eclipse.ui, org.eclipse.core.resources, org.eclipse.jface.viewers, - org.fhsolution.eclipse.plugins.csvedit.model, + me.glindholm.plugin.csvedit2.plugins.csvedit.model, org.eclipse.ui.part", - org.fhsolution.eclipse.plugins.csvedit.model;uses:="com.csvreader" + me.glindholm.plugin.csvedit2.model;uses:="com.csvreader" Import-Package: org.jumpmind.symmetric.csv Bundle-Vendor: www.fhsolution.com diff --git a/csvedit.plugin/build.properties b/csvedit.plugin/build.properties index 0fbcf40..be0890c 100644 --- a/csvedit.plugin/build.properties +++ b/csvedit.plugin/build.properties @@ -1,4 +1,6 @@ source.. = src/ +output.. = target/classes + bin.includes = plugin.xml,\ META-INF/,\ .,\ diff --git a/csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/Activator.java b/csvedit.plugin/src/me/glindholm/plugin/csvedit2/Activator.java similarity index 78% rename from csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/Activator.java rename to csvedit.plugin/src/me/glindholm/plugin/csvedit2/Activator.java index 1b6110e..d4358cf 100644 --- a/csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/Activator.java +++ b/csvedit.plugin/src/me/glindholm/plugin/csvedit2/Activator.java @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.fhsolution.eclipse.plugins.csvedit; +package me.glindholm.plugin.csvedit2; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.ui.plugin.AbstractUIPlugin; @@ -27,7 +27,7 @@ public class Activator extends AbstractUIPlugin { // The plug-in ID - public static final String PLUGIN_ID = "org.fhsolution.eclipse.csvedit"; + public static final String PLUGIN_ID = "me.glindholm.plugin.csvedit2.csvedit"; // The shared instance private static Activator plugin; @@ -35,14 +35,15 @@ public class Activator extends AbstractUIPlugin { /** * The constructor */ - public Activator () { + public Activator() { } /** * * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext) */ - public void start (BundleContext context) throws Exception { + @Override + public void start(final BundleContext context) throws Exception { super.start(context); plugin = this; } @@ -51,7 +52,8 @@ public void start (BundleContext context) throws Exception { * * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext) */ - public void stop (BundleContext context) throws Exception { + @Override + public void stop(final BundleContext context) throws Exception { plugin = null; super.stop(context); } @@ -61,18 +63,17 @@ public void stop (BundleContext context) throws Exception { * * @return the shared instance */ - public static Activator getDefault () { + public static Activator getDefault() { return plugin; } /** - * Returns an image descriptor for the image file at the given - * plug-in relative path + * Returns an image descriptor for the image file at the given plug-in relative path * * @param path the path * @return the image descriptor */ - public static ImageDescriptor getImageDescriptor (String path) { + public static ImageDescriptor getImageDescriptor(final String path) { return imageDescriptorFromPlugin(PLUGIN_ID, path); } } diff --git a/csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/detailededitor/AttributeEditorCellModifier.java b/csvedit.plugin/src/me/glindholm/plugin/csvedit2/detailededitor/AttributeEditorCellModifier.java similarity index 84% rename from csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/detailededitor/AttributeEditorCellModifier.java rename to csvedit.plugin/src/me/glindholm/plugin/csvedit2/detailededitor/AttributeEditorCellModifier.java index 3b907fc..d45bc16 100644 --- a/csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/detailededitor/AttributeEditorCellModifier.java +++ b/csvedit.plugin/src/me/glindholm/plugin/csvedit2/detailededitor/AttributeEditorCellModifier.java @@ -13,7 +13,7 @@ * limitations under the License. */ -package org.fhsolution.eclipse.plugins.csvedit.detailededitor; +package me.glindholm.plugin.csvedit2.detailededitor; import org.eclipse.jface.viewers.ICellModifier; import org.eclipse.swt.widgets.TableItem; @@ -29,10 +29,8 @@ public class AttributeEditorCellModifier implements ICellModifier { /** * Checks whether the given property of the given element can be modified. * - * @return true if the property can be modified, and false if it is not - * modifiable - * @see org.eclipse.jface.viewers.ICellModifier#canModify(java.lang.Object, - * java.lang.String) + * @return true if the property can be modified, and false if it is not modifiable + * @see org.eclipse.jface.viewers.ICellModifier#canModify(java.lang.Object, java.lang.String) */ @Override public boolean canModify(final Object element, final String property) { @@ -40,11 +38,10 @@ public boolean canModify(final Object element, final String property) { } /** - * Returns the value for the given property of the given element. Returns "" if - * the element does not have the given property. + * Returns the value for the given property of the given element. Returns "" if the element does not + * have the given property. * - * @see org.eclipse.jface.viewers.ICellModifier#getValue(java.lang.Object, - * java.lang.String) + * @see org.eclipse.jface.viewers.ICellModifier#getValue(java.lang.Object, java.lang.String) */ @Override public Object getValue(final Object element, final String property) { @@ -59,12 +56,11 @@ public Object getValue(final Object element, final String property) { } /** - * Modifies the value for the given property of the given element. Has no effect - * if the element does not have the given property, or if the property cannot be - * modified. + * Modifies the value for the given property of the given element. Has no effect if the element does + * not have the given property, or if the property cannot be modified. * - * @see org.eclipse.jface.viewers.ICellModifier#modify(java.lang.Object, - * java.lang.String, java.lang.Object) + * @see org.eclipse.jface.viewers.ICellModifier#modify(java.lang.Object, java.lang.String, + * java.lang.Object) */ @Override public void modify(final Object element, final String property, final Object value) { diff --git a/csvedit.plugin/src/me/glindholm/plugin/csvedit2/detailededitor/AttributeRow.java b/csvedit.plugin/src/me/glindholm/plugin/csvedit2/detailededitor/AttributeRow.java new file mode 100644 index 0000000..b0b6ad7 --- /dev/null +++ b/csvedit.plugin/src/me/glindholm/plugin/csvedit2/detailededitor/AttributeRow.java @@ -0,0 +1,184 @@ +/* Copyright 2011 csvedit + * + * 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 + * + * http://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 me.glindholm.plugin.csvedit2.detailededitor; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.LinkedList; +import java.util.List; +import java.util.Objects; + +/** + * Represents a row made of String elements for the detailed view + * + * @author fhenri + * @author msavy + * + */ +public class AttributeRow { + + /** Splitted line */ + private final ArrayList entries; + + /** Row changes listener */ + private final IAttributeChangesListener listener; + + /** + * Constructor + * + * @param line + * @param listener + */ + public AttributeRow(final List line, final IAttributeChangesListener listener) { + entries = new ArrayList<>(line); + this.listener = listener; + } + + /** + * Constructor + * + * @param lineElements + * @param listener + */ + public AttributeRow(final String[] lineElements, final IAttributeChangesListener listener) { + this(Arrays.asList(lineElements), listener); + } + + /** + * Create an empty row + * + * @param nbOfColumns + * @param delimiter + * @param listener + * @return + */ + public static AttributeRow createEmptyLine(final int nbOfColumns, final IAttributeChangesListener listener) { + final List line = new LinkedList<>(); + for (int i = 0; i < nbOfColumns; i++) { + line.add(""); + } + return new AttributeRow(line, listener); + } + + /** + * @return + */ + public ArrayList getEntries() { + return entries; + } + + /** + * @return + */ + public String[] getEntriesAsArray() { + return entries.toArray(new String[entries.size()]); + } + + /** + * @param elementIndex + * @param elementString + */ + public void setRowEntry(final int elementIndex, final String elementString) { + if (entries.get(elementIndex).compareTo(elementString) != 0) { + entries.set(elementIndex, elementString); + listener.rowChanged(this, elementIndex); + } + } + + /** + * return the element at a given index. This method makes sure that if the current line does not + * have as many elements as the header, it will not break and return an empty string + * + * @param index + * @return the element at a given index + */ + public String getElementAt(final int index) { + if (index >= entries.size()) { + return ""; + } + return entries.get(index); + } + + /** + * Return the number of elements in this row + * + * @return number of elements in this row + */ + public int getNumberOfElements() { + return entries.size(); + } + + /** + * @param element + */ + public void addElement(final String element) { + entries.add(element); + } + + /** + * Remove an element of the row represented by its index + * + * @param index + */ + public void removeElementAt(final int index) { + entries.remove(index); + } + + /** + * Give the String representation of a CSVRow object. + * + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + String result = ""; + for (final String s : entries) { + // FIXME get preferences here + result = result.concat(s).concat(","); + } + return result; + } + + /** + * @see java.lang.Object#hashCode() + */ + @Override + public int hashCode() { + return Objects.hash(entries); + } + + @Override + public boolean equals(final Object anObject) { + // The commented lines implies that if two rows have the same content, + // the cell editor will modify + // the first one found instead of the focused one + // each row is unique + + /* + * //System.out.println("compare:\n[" + this + "] and\n[" + anObject + "]"); if (!(anObject + * instanceof AttributeRow)) { return false; } + * + * AttributeRow thisRow = (AttributeRow) anObject; for (int i=0; i model = new ArrayList<>(); + + IAttributeChangesListener listener = (row, index) -> tableViewer.refresh(); + + /** + * Default constructor Add an empty TableViewer to a Composite view + */ + public DetailedAttributeTableViewer(final Composite composite) { + + tableViewer = new TableViewer(composite, SWT.BORDER | SWT.FULL_SELECTION | SWT.MULTI); + final Table table = tableViewer.getTable(); + table.setLinesVisible(true); + table.setHeaderVisible(true); + final GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1); + gd.minimumHeight = 100; + table.setLayoutData(gd); + } + + /** + * Fill the table + * + * @param headers + * @param content a List where each String[] is a column of the table + */ + public void fillTable(final List headers, final List content) { + + for (int i = 0; i < headers.size(); i++) { + final TableViewerColumn column = new TableViewerColumn(tableViewer, SWT.LEFT); + + column.getColumn().setText(headers.get(i)); + column.getColumn().setWidth(200); + column.getColumn().setResizable(true); + column.getColumn().setMoveable(true); + + final int index = i; + + column.setLabelProvider(new ColumnLabelProvider() { + @Override + public String getText(final Object element) { + return ((AttributeRow) element).getElementAt(index); + } + }); + } + + model = new ArrayList<>(); + + if (content.size() > 0) { + // We first look for the biggest column, it will be the reference to generate all AttributeRow + int biggestColumn = 0; + + for (int i = 0; i < content.size(); i++) { + if (content.get(biggestColumn).length < content.get(i).length) { + biggestColumn = i; + } + } + + // For each row of the biggest column (String[]), we look for the rows + // at the same level in other columns and we build a AttributeRow with those data + for (int i = 0; i < content.get(biggestColumn).length; i++) { + final List attributes = new ArrayList<>(); + for (int j = 0; j < content.size(); j++) { + if (i < content.get(j).length) { + attributes.add(content.get(j)[i]); + } else { + attributes.add(""); + } + } + model.add(new AttributeRow(attributes, listener)); + } + } + + tableViewer.setContentProvider(new ArrayContentProvider()); + tableViewer.setInput(model); + + defineCellEditing(tableViewer, headers.size()); + addRightClickItems(tableViewer); + } + + /** + * Make cells of the tableViewer editable + */ + private void defineCellEditing(final TableViewer tableViewer, final int numberOfColumns) { + final String[] columnProperties = new String[numberOfColumns]; + final CellEditor[] cellEditors = new CellEditor[numberOfColumns]; + + for (int i = 0; i < numberOfColumns; i++) { + columnProperties[i] = Integer.toString(i); + cellEditors[i] = new TextCellEditor(tableViewer.getTable()); + } + + tableViewer.setColumnProperties(columnProperties); + + tableViewer.setCellEditors(cellEditors); + tableViewer.setCellModifier(new AttributeEditorCellModifier()); + + } + + /** + * Describe the behavior of right click on the tableViewer + */ + private void addRightClickItems(final TableViewer tableViewer) { + + // create menu item to delete column + final Menu tableHeaderMenu = new Menu(tableViewer.getTable()); + + // create menu item to insert column + final MenuItem insertColumnItem = new MenuItem(tableHeaderMenu, SWT.PUSH); + insertColumnItem.setText("Add row"); + insertColumnItem.setSelection(false); + insertColumnItem.addListener(SWT.Selection, event -> { + // call insert/add column page + final AttributeRow row = (AttributeRow) ((IStructuredSelection) tableViewer.getSelection()).getFirstElement(); + + final IAttributeChangesListener listener = (row1, index) -> tableViewer.refresh(); + + final List emptyAttributes = new ArrayList<>(); + for (int i = 0; i < tableViewer.getTable().getColumnCount(); i++) { + emptyAttributes.add("#TO_FILL#"); + } + + final AttributeRow emptyRow = new AttributeRow(emptyAttributes, listener); + + if (row != null) { + model.add(model.indexOf(row) + 1, emptyRow); + } else { + model.add(emptyRow); + } + + tableViewer.refresh(); + }); + + final MenuItem deleteColumnItem = new MenuItem(tableHeaderMenu, SWT.PUSH); + deleteColumnItem.setText("Delete Row"); + deleteColumnItem.setSelection(false); + deleteColumnItem.addListener(SWT.Selection, event -> { + + AttributeRow row = (AttributeRow) ((IStructuredSelection) tableViewer.getSelection()).getFirstElement(); + + while (row != null) { + row = (AttributeRow) ((IStructuredSelection) tableViewer.getSelection()).getFirstElement(); + if (row != null) { + model.remove(model.indexOf(row)); + tableViewer.refresh(); + } + } + }); + + // Link to the tableViewer + tableViewer.getTable().addListener(SWT.MenuDetect, event -> { + tableViewer.getTable().setMenu(tableHeaderMenu); + tableViewer.refresh(); + }); + } + + public TableViewer getTableViewer() { + return tableViewer; + } + + public void setTableViewer(final TableViewer tableViewer) { + this.tableViewer = tableViewer; + } + + public List getModel() { + return model; + } + + public void setModele(final List model) { + this.model = model; + } +} diff --git a/csvedit.plugin/src/me/glindholm/plugin/csvedit2/detailededitor/DetailedEditor.java b/csvedit.plugin/src/me/glindholm/plugin/csvedit2/detailededitor/DetailedEditor.java new file mode 100644 index 0000000..225c36f --- /dev/null +++ b/csvedit.plugin/src/me/glindholm/plugin/csvedit2/detailededitor/DetailedEditor.java @@ -0,0 +1,243 @@ +/* Copyright 2011 csvedit + * + * 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 + * + * http://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 me.glindholm.plugin.csvedit2.detailededitor; + +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.custom.ScrolledComposite; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.layout.FillLayout; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Text; + +import me.glindholm.plugin.csvedit2.model.CSVRow; + +/** + * Class providing methods to add a custom tableViewer to a Composite + * + * @author msavy + * + */ +public class DetailedEditor { + + Shell shell; + protected List componentList = new ArrayList<>(); + + protected CSVRow row; // The row to modify + protected List headerList; // A list of the headers for each column + // of the row + + protected String inCellDelimiter; + protected String regexTableMarker; + + final static String UNKNOWN_URL_FORMAT = "_UNKNOWN_URL_FORMAT:"; + + public Shell getShell() { + return shell; + } + + public void setShell(final Shell shell) { + this.shell = shell; + } + + /** + * Default constructor, open a new window + * + */ + public DetailedEditor(final Display display, final List headerList, final CSVRow row, final String inCellDelimiter, final String regexTableMarker) { + + shell = new Shell(display); + shell.setLayout(new FillLayout()); + shell.setText("Detailed CSV edition"); + + shell.setSize(800, 600); + + // If there is more columns for the header than there is for the column, + // we had empty columns in the row + // It happen when the row's last columns are empty and separators are + // forgotten. + // The CSV reader can't guess there is a column to create + if (row.getNumberOfElements() > 0 && headerList.size() > row.getNumberOfElements()) { + for (int i = row.getNumberOfElements() - 1; i < headerList.size(); i++) { + row.addElement(""); + } + } + + this.headerList = headerList; + this.row = row; + + this.inCellDelimiter = inCellDelimiter; + this.regexTableMarker = regexTableMarker; + + final ScrolledComposite scrolledComposite = new ScrolledComposite(shell, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL); + scrolledComposite.setExpandHorizontal(true); + scrolledComposite.setExpandVertical(true); + + final Composite composite = new Composite(scrolledComposite, SWT.NONE); + composite.setLayout(new GridLayout(2, false)); + + generateComponents(composite); + new Label(composite, SWT.NONE); + + final Composite compositeBtn = new Composite(composite, SWT.NONE); + final GridData gd_compositeBtn = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1); + gd_compositeBtn.heightHint = 55; + gd_compositeBtn.widthHint = 220; + compositeBtn.setLayoutData(gd_compositeBtn); + + final Button btnApply = new Button(compositeBtn, SWT.NONE); + btnApply.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(final SelectionEvent e) { + } + }); + btnApply.setBounds(19, 14, 75, 30); + btnApply.addListener(SWT.Selection, e -> { + switch (e.type) { + case SWT.Selection: + updateRow(); + shell.dispose(); + break; + } + }); + btnApply.setText("Apply"); + + final Button btnCancel = new Button(compositeBtn, SWT.NONE); + btnCancel.setBounds(141, 14, 75, 30); + btnCancel.addListener(SWT.Selection, e -> { + switch (e.type) { + case SWT.Selection: + shell.dispose(); + break; + } + }); + btnCancel.setText("Cancel"); + + shell.setMinimumSize(400, 200); + + scrolledComposite.setContent(composite); + scrolledComposite.setMinSize(composite.computeSize(SWT.DEFAULT, SWT.DEFAULT)); + + // The components must be filled only after the scrolled composite size + // has been set + // Otherwise the size of the scrolled composite would adapt its size to + // the content of its components + fillComponents(); + } + + /** + * Generates components of the DetailedView depending of their type + * + */ + private void generateComponents(final Composite composite) { + + for (int i = 0; i < headerList.size() && !headerList.get(i).equals(""); i++) { + + final Label label = new Label(composite, SWT.NONE); + label.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1)); + + if (headerList.get(i).matches(regexTableMarker)) { + final DetailedAttributeTableViewer tableViewer = new DetailedAttributeTableViewer(composite); + componentList.add(tableViewer); + + } else { + label.setText(headerList.get(i)); + + final Text text = new Text(composite, SWT.BORDER); + text.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); + componentList.add(text); + } + } + } + + /** + * Fills components according to data provided by the field attribute "row" + * + */ + private void fillComponents() { + + for (int i = 0; i < componentList.size(); i++) { + + // Fill text components + if (componentList.get(i) instanceof Text) { + ((Text) componentList.get(i)).setText(row.getElementAt(i)); + + // Fill table viewer components + } else if (componentList.get(i) instanceof DetailedAttributeTableViewer) { + + final List headers = new ArrayList<>(); + headers.add(headerList.get(i)); + + final String column1[] = row.getElementAt(i).split("[^|]\\|[^|]"); + for (int j = 0; j < column1.length; j++) { + column1[j] = column1[j].trim(); + } + + final List content = new ArrayList<>(); + if (!(column1.length == 1 && column1[0].equals(""))) { + content.add(column1); + } + ((DetailedAttributeTableViewer) componentList.get(i)).fillTable(headers, content); + } + } + } + + private void updateRow() { + + for (int i = 0; i < headerList.size() && !headerList.get(i).equals(""); i++) { + + if (componentList.get(i) instanceof Text) { + row.setRowEntry(i, ((Text) componentList.get(i)).getText()); + + // if update source is a table viewer + } else if (componentList.get(i) instanceof DetailedAttributeTableViewer) { + + final List model = ((DetailedAttributeTableViewer) componentList.get(i)).getModel(); + final StringBuilder updatedStr = new StringBuilder(); + + for (final AttributeRow atts : model) { + + if (atts.getElementAt(0).equals("")) { + continue; + } + + updatedStr.append(atts.getElementAt(0).trim()); + updatedStr.append(" | "); + } + + String finalStr = updatedStr.toString(); + if (finalStr.length() > 0 && finalStr.substring(finalStr.length() - 3).equals(" | ")) { + finalStr = finalStr.substring(0, finalStr.length() - 3); + } + + row.setRowEntry(i, finalStr); + } + } + } + + public void open() { + shell.open(); + } +} \ No newline at end of file diff --git a/csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/detailededitor/IAttributeChangesListener.java b/csvedit.plugin/src/me/glindholm/plugin/csvedit2/detailededitor/IAttributeChangesListener.java similarity index 72% rename from csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/detailededitor/IAttributeChangesListener.java rename to csvedit.plugin/src/me/glindholm/plugin/csvedit2/detailededitor/IAttributeChangesListener.java index 4e61274..63c99bf 100644 --- a/csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/detailededitor/IAttributeChangesListener.java +++ b/csvedit.plugin/src/me/glindholm/plugin/csvedit2/detailededitor/IAttributeChangesListener.java @@ -13,22 +13,22 @@ * limitations under the License. */ -package org.fhsolution.eclipse.plugins.csvedit.detailededitor; +package me.glindholm.plugin.csvedit2.detailededitor; /** * Class providing methods to add a custom tableViewer to a Composite + * * @author fhenri * @author msavy * */ public interface IAttributeChangesListener { - /** - * Element at the given index position has changes in - * @param row the {@link AttributeRow} which changed - * @param index the index position - */ - void rowChanged(AttributeRow row, int index); + /** + * Element at the given index position has changes in + * + * @param row the {@link AttributeRow} which changed + * @param index the index position + */ + void rowChanged(AttributeRow row, int index); } - - diff --git a/csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/editors/CSVEditorCellModifier.java b/csvedit.plugin/src/me/glindholm/plugin/csvedit2/editors/CSVEditorCellModifier.java similarity index 61% rename from csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/editors/CSVEditorCellModifier.java rename to csvedit.plugin/src/me/glindholm/plugin/csvedit2/editors/CSVEditorCellModifier.java index fd17c16..5576dc8 100644 --- a/csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/editors/CSVEditorCellModifier.java +++ b/csvedit.plugin/src/me/glindholm/plugin/csvedit2/editors/CSVEditorCellModifier.java @@ -12,11 +12,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.fhsolution.eclipse.plugins.csvedit.editors; +package me.glindholm.plugin.csvedit2.editors; import org.eclipse.jface.viewers.ICellModifier; import org.eclipse.swt.widgets.TableItem; -import org.fhsolution.eclipse.plugins.csvedit.model.CSVRow; + +import me.glindholm.plugin.csvedit2.model.CSVRow; /** * @@ -31,46 +32,47 @@ public class CSVEditorCellModifier implements ICellModifier { * @return true if the property can be modified, and false if it is not modifiable * @see org.eclipse.jface.viewers.ICellModifier#canModify(java.lang.Object, java.lang.String) */ - public boolean canModify (Object element, String property) { + @Override + public boolean canModify(final Object element, final String property) { return true; } /** - * Returns the value for the given property of the given element. - * Returns "" if the element does not have the given property. + * Returns the value for the given property of the given element. Returns "" if the element does not + * have the given property. * * @see org.eclipse.jface.viewers.ICellModifier#getValue(java.lang.Object, java.lang.String) */ - public Object getValue (Object element, String property) { - int elementIndex = Integer.parseInt(property); - CSVRow row = (CSVRow) element; + @Override + public Object getValue(final Object element, final String property) { + final int elementIndex = Integer.parseInt(property); + final CSVRow row = (CSVRow) element; - if(elementIndex < row.getNumberOfElements()) { + if (elementIndex < row.getNumberOfElements()) { return row.getElementAt(elementIndex); - } - else { + } else { return ""; } } /** - * Modifies the value for the given property of the given element. - * Has no effect if the element does not have the given property, - * or if the property cannot be modified. + * Modifies the value for the given property of the given element. Has no effect if the element does + * not have the given property, or if the property cannot be modified. * - * @see org.eclipse.jface.viewers.ICellModifier#modify(java.lang.Object, java.lang.String, java.lang.Object) + * @see org.eclipse.jface.viewers.ICellModifier#modify(java.lang.Object, java.lang.String, + * java.lang.Object) */ - public void modify (Object element, String property, Object value) { - int elementIndex = Integer.parseInt(property); + @Override + public void modify(final Object element, final String property, final Object value) { + final int elementIndex = Integer.parseInt(property); if (element instanceof TableItem) { - CSVRow row = (CSVRow) ((TableItem) element).getData(); + final CSVRow row = (CSVRow) ((TableItem) element).getData(); - if(elementIndex < row.getNumberOfElements()) { + if (elementIndex < row.getNumberOfElements()) { row.setRowEntry(elementIndex, value.toString()); - } - else { - for (int i=row.getNumberOfElements();i tableModified(); /** * Creates a multi-page editor example. */ public MultiPageCSVEditor() { - super(); ResourcesPlugin.getWorkspace().addResourceChangeListener(this); model = createCSVFile(); } /** - * Create the CSV file object. Class that extends the MultiPageCSVEditor - * must implement this class. + * Create the CSV file object. Class that extends the MultiPageCSVEditor must implement this + * class. * - * @return an {@link AbstractCSVFile} object which provides the contents as well - * as some formatting information such as the delimiter and extra meta - * information + * @return an {@link AbstractCSVFile} object which provides the contents as well as some formatting + * information such as the delimiter and extra meta information */ protected abstract AbstractCSVFile createCSVFile(); @@ -207,13 +197,11 @@ public void widgetSelected(final SelectionEvent e) { } }); /* - * insert.addKeyListener(new KeyAdapter() { public void keyPressed(KeyEvent e) { - * //if(((e.stateMask & SWT.CTRL) != 0) & (e.keyCode == 'd')) { //if - * (e.stateMask == SWT.CTRL && e.keyCode == 'd') { if (e.character == SWT.DEL) { - * CSVRow row = (CSVRow) ((IStructuredSelection) - * tableViewer.getSelection()).getFirstElement(); if (row != null) { - * model.addLineAfterElement(row); tableViewer.refresh(); tableModified(); } } } - * }); + * insert.addKeyListener(new KeyAdapter() { public void keyPressed(KeyEvent e) { //if(((e.stateMask + * & SWT.CTRL) != 0) & (e.keyCode == 'd')) { //if (e.stateMask == SWT.CTRL && e.keyCode == 'd') { if + * (e.character == SWT.DEL) { CSVRow row = (CSVRow) ((IStructuredSelection) + * tableViewer.getSelection()).getFirstElement(); if (row != null) { model.addLineAfterElement(row); + * tableViewer.refresh(); tableModified(); } } } }); */ final Button add = new Button(canvas, SWT.PUSH | SWT.CENTER); @@ -251,28 +239,24 @@ public void widgetSelected(final SelectionEvent e) { } }); /* - * insert.addKeyListener(new KeyAdapter() { public void keyPressed(KeyEvent e) { - * if (e.stateMask == SWT.CTRL && e.keyCode == 'd') { CSVRow row = (CSVRow) - * ((IStructuredSelection) tableViewer.getSelection()).getFirstElement(); if - * (row != null) { model.removeLine(row); tableViewer.refresh(); - * tableModified(); } } } }); + * insert.addKeyListener(new KeyAdapter() { public void keyPressed(KeyEvent e) { if (e.stateMask == + * SWT.CTRL && e.keyCode == 'd') { CSVRow row = (CSVRow) ((IStructuredSelection) + * tableViewer.getSelection()).getFirstElement(); if (row != null) { model.removeLine(row); + * tableViewer.refresh(); tableModified(); } } } }); */ /* * * // manage 1st line - should only be visible if global option is set if - * (pref.getUseFirstLineAsHeader()) { Label encodingLineLabel = new - * Label(canvas, SWT.NONE); encodingLineLabel.setText("Display 1st line"); final - * Button encodingLineBtn = new Button(canvas, SWT.CHECK); - * encodingLineBtn.setLayoutData(new - * GridData(GridData.HORIZONTAL_ALIGN_BEGINNING)); - * encodingLineBtn.setSelection(true); encodingLineBtn.addSelectionListener(new - * SelectionAdapter() { public void widgetSelected(SelectionEvent e) { - * model.displayFirstLine(encodingLineBtn.getSelection()); - * updateTableFromTextEditor(); } }); } sensitiveBtn.addSelectionListener(new - * SelectionAdapter() { public void widgetSelected(SelectionEvent e) { - * tableFilter.setSearchText(searchText.getText(), sensitiveBtn.getSelection()); - * labelProvider.setSearchText(searchText.getText()); tableViewer.refresh(); } - * }); + * (pref.getUseFirstLineAsHeader()) { Label encodingLineLabel = new Label(canvas, SWT.NONE); + * encodingLineLabel.setText("Display 1st line"); final Button encodingLineBtn = new Button(canvas, + * SWT.CHECK); encodingLineBtn.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING)); + * encodingLineBtn.setSelection(true); encodingLineBtn.addSelectionListener(new SelectionAdapter() { + * public void widgetSelected(SelectionEvent e) { + * model.displayFirstLine(encodingLineBtn.getSelection()); updateTableFromTextEditor(); } }); } + * sensitiveBtn.addSelectionListener(new SelectionAdapter() { public void + * widgetSelected(SelectionEvent e) { tableFilter.setSearchText(searchText.getText(), + * sensitiveBtn.getSelection()); labelProvider.setSearchText(searchText.getText()); + * tableViewer.refresh(); } }); */ tableViewer = new TableViewer(canvas, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER); tableViewer.setUseHashlookup(true); @@ -305,86 +289,74 @@ public void keyReleased(final KeyEvent ke) { }); /* - * // create a TableCursor to navigate around the table final TableCursor cursor - * = new TableCursor(table, SWT.NONE); // create an editor to edit the cell when - * the user hits "ENTER" // while over a cell in the table final ControlEditor - * editor = new ControlEditor(cursor); editor.grabHorizontal = true; - * editor.grabVertical = true; + * // create a TableCursor to navigate around the table final TableCursor cursor = new + * TableCursor(table, SWT.NONE); // create an editor to edit the cell when the user hits "ENTER" // + * while over a cell in the table final ControlEditor editor = new ControlEditor(cursor); + * editor.grabHorizontal = true; editor.grabVertical = true; * - * cursor.addSelectionListener(new SelectionAdapter() { // This is called as the - * user navigates around the table public void widgetSelected(SelectionEvent e) - * { // Select the row in the table where the TableCursor is - * table.setSelection(new TableItem[] {cursor.getRow()}); } + * cursor.addSelectionListener(new SelectionAdapter() { // This is called as the user navigates + * around the table public void widgetSelected(SelectionEvent e) { // Select the row in the table + * where the TableCursor is table.setSelection(new TableItem[] {cursor.getRow()}); } * - * // when the user hits "ENTER" in the TableCursor, // pop up a text editor so - * that user can change the text of the cell public void - * widgetDefaultSelected(SelectionEvent e) { // Begin an editing session final - * Text text = new Text(cursor, SWT.NONE); + * // when the user hits "ENTER" in the TableCursor, // pop up a text editor so that user can change + * the text of the cell public void widgetDefaultSelected(SelectionEvent e) { // Begin an editing + * session final Text text = new Text(cursor, SWT.NONE); * * // Copy the text from the cell to the Text int column = cursor.getColumn(); * text.setText(cursor.getRow().getText(column)); * - * // Add a handler to detect key presses text.addKeyListener(new KeyAdapter() { - * public void keyPressed(KeyEvent e) { // tab will save & move to the next - * column if (e.character == SWT.TAB) { TableItem row = cursor.getRow(); int - * column = cursor.getColumn(); row.setText(column, text.getText()); - * text.dispose(); cursor.setSelection(row, column+1); tableModified(); } // - * close the text editor and copy the data over // when the user hits "ENTER" if - * (e.character == SWT.CR) { TableItem row = cursor.getRow(); - * row.setText(cursor.getColumn(), text.getText()); tableModified(); - * text.dispose(); } // close the text editor when the user hits "ESC" if - * (e.character == SWT.ESC) { text.dispose(); } } }); // close the text editor - * when the user tabs away text.addFocusListener(new FocusAdapter() { public - * void focusLost(FocusEvent e) { text.dispose(); } }); editor.setEditor(text); - * text.setFocus(); } }); + * // Add a handler to detect key presses text.addKeyListener(new KeyAdapter() { public void + * keyPressed(KeyEvent e) { // tab will save & move to the next column if (e.character == SWT.TAB) { + * TableItem row = cursor.getRow(); int column = cursor.getColumn(); row.setText(column, + * text.getText()); text.dispose(); cursor.setSelection(row, column+1); tableModified(); } // close + * the text editor and copy the data over // when the user hits "ENTER" if (e.character == SWT.CR) { + * TableItem row = cursor.getRow(); row.setText(cursor.getColumn(), text.getText()); + * tableModified(); text.dispose(); } // close the text editor when the user hits "ESC" if + * (e.character == SWT.ESC) { text.dispose(); } } }); // close the text editor when the user tabs + * away text.addFocusListener(new FocusAdapter() { public void focusLost(FocusEvent e) { + * text.dispose(); } }); editor.setEditor(text); text.setFocus(); } }); * - * /* // Hide the TableCursor when the user hits the "CTRL" or "SHIFT" key. // - * This allows the user to select multiple items in the table. - * cursor.addKeyListener(new KeyAdapter() { public void keyPressed(KeyEvent e) { + * /* // Hide the TableCursor when the user hits the "CTRL" or "SHIFT" key. // This allows the user + * to select multiple items in the table. cursor.addKeyListener(new KeyAdapter() { public void + * keyPressed(KeyEvent e) { * - * // delete line if (e.character == SWT.DEL) { TableItem row = cursor.getRow(); - * tableModified(); row.dispose(); //table.showItem(row); - * //cursor.setSelection(row, 0); } + * // delete line if (e.character == SWT.DEL) { TableItem row = cursor.getRow(); tableModified(); + * row.dispose(); //table.showItem(row); //cursor.setSelection(row, 0); } * - * // insert line if (e.character == (char) SWT.F8) { TableItem row = - * cursor.getRow(); row.dispose(); } + * // insert line if (e.character == (char) SWT.F8) { TableItem row = cursor.getRow(); + * row.dispose(); } * * // add line * * cursor.setVisible(true); cursor.setFocus(); * - * if (e.keyCode == SWT.CTRL || e.keyCode == SWT.SHIFT || (e.stateMask & - * SWT.CONTROL) != 0 || (e.stateMask & SWT.SHIFT) != 0) { - * cursor.setVisible(false); return; } } }); + * if (e.keyCode == SWT.CTRL || e.keyCode == SWT.SHIFT || (e.stateMask & SWT.CONTROL) != 0 || + * (e.stateMask & SWT.SHIFT) != 0) { cursor.setVisible(false); return; } } }); * - * // When the user double clicks in the TableCursor, pop up a text editor so - * that // they can change the text of the cell. cursor.addMouseListener(new - * MouseAdapter() { public void mouseDown(MouseEvent e) { final Text text = new - * Text(cursor, SWT.NONE); TableItem row = cursor.getRow(); int column = - * cursor.getColumn(); text.setText(row.getText(column)); - * text.addKeyListener(new KeyAdapter() { public void keyPressed(KeyEvent e) { - * // close the text editor and copy the data over // when the user hits "ENTER" - * if (e.character == SWT.CR) { TableItem row = cursor.getRow(); int column = - * cursor.getColumn(); row.setText(column, text.getText()); tableModified(); - * text.dispose(); } // close the text editor when the user hits "ESC" if - * (e.character == SWT.ESC) { text.dispose(); } } }); // close the text editor - * when the user clicks away text.addFocusListener(new FocusAdapter() { public - * void focusLost(FocusEvent e) { text.dispose(); } }); editor.setEditor(text); - * text.setFocus(); } }); + * // When the user double clicks in the TableCursor, pop up a text editor so that // they can + * change the text of the cell. cursor.addMouseListener(new MouseAdapter() { public void + * mouseDown(MouseEvent e) { final Text text = new Text(cursor, SWT.NONE); TableItem row = + * cursor.getRow(); int column = cursor.getColumn(); text.setText(row.getText(column)); + * text.addKeyListener(new KeyAdapter() { public void keyPressed(KeyEvent e) { // close the text + * editor and copy the data over // when the user hits "ENTER" if (e.character == SWT.CR) { + * TableItem row = cursor.getRow(); int column = cursor.getColumn(); row.setText(column, + * text.getText()); tableModified(); text.dispose(); } // close the text editor when the user hits + * "ESC" if (e.character == SWT.ESC) { text.dispose(); } } }); // close the text editor when the + * user clicks away text.addFocusListener(new FocusAdapter() { public void focusLost(FocusEvent e) { + * text.dispose(); } }); editor.setEditor(text); text.setFocus(); } }); * - * // Show the TableCursor when the user releases the "SHIFT" or "CTRL" key. // - * This signals the end of the multiple selection task. table.addKeyListener(new - * KeyAdapter() { public void keyReleased(KeyEvent e) { + * // Show the TableCursor when the user releases the "SHIFT" or "CTRL" key. // This signals the end + * of the multiple selection task. table.addKeyListener(new KeyAdapter() { public void + * keyReleased(KeyEvent e) { * - * if (e.keyCode == SWT.CONTROL && (e.stateMask & SWT.SHIFT) != 0) return; if - * (e.keyCode == SWT.SHIFT && (e.stateMask & SWT.CONTROL) != 0) return; if - * (e.keyCode != SWT.CONTROL && (e.stateMask & SWT.CONTROL) != 0) return; if - * (e.keyCode != SWT.SHIFT && (e.stateMask & SWT.SHIFT) != 0) return; + * if (e.keyCode == SWT.CONTROL && (e.stateMask & SWT.SHIFT) != 0) return; if (e.keyCode == + * SWT.SHIFT && (e.stateMask & SWT.CONTROL) != 0) return; if (e.keyCode != SWT.CONTROL && + * (e.stateMask & SWT.CONTROL) != 0) return; if (e.keyCode != SWT.SHIFT && (e.stateMask & SWT.SHIFT) + * != 0) return; * - * TableItem[] selection = table.getSelection(); TableItem row = - * (selection.length == 0) ? table.getItem(table.getTopIndex()) : selection[0]; - * table.showItem(row); cursor.setSelection(row, 0); cursor.setVisible(true); - * cursor.setFocus(); } }); + * TableItem[] selection = table.getSelection(); TableItem row = (selection.length == 0) ? + * table.getItem(table.getTopIndex()) : selection[0]; table.showItem(row); cursor.setSelection(row, + * 0); cursor.setVisible(true); cursor.setFocus(); } }); */ /* @@ -392,9 +364,8 @@ public void keyReleased(final KeyEvent ke) { * * public void doubleClick(DoubleClickEvent event) { * - * CSVRow row = (CSVRow) ((IStructuredSelection) - * tableViewer.getSelection()).getFirstElement(); DetailedView input = new - * DetailedView(Display.getDefault(), model.getHeader(), row); + * CSVRow row = (CSVRow) ((IStructuredSelection) tableViewer.getSelection()).getFirstElement(); + * DetailedView input = new DetailedView(Display.getDefault(), model.getHeader(), row); * * input.open(); * @@ -432,12 +403,7 @@ private void populateTablePage() throws Exception { // make the selection available getSite().setSelectionProvider(tableViewer); - tableViewer.getTable().getDisplay().asyncExec(new Runnable() { - @Override - public void run() { - updateTableFromTextEditor(); - } - }); + tableViewer.getTable().getDisplay().asyncExec(this::updateTableFromTextEditor); } /** @@ -471,18 +437,14 @@ private void updateTableFromTextEditor() { final MenuItem detailedEditItem = new MenuItem(tableHeaderMenu, SWT.PUSH, 0); detailedEditItem.setText("Edit"); detailedEditItem.setSelection(false); - detailedEditItem.addListener(SWT.Selection, new Listener() { - - @Override - public void handleEvent(final Event event) { + detailedEditItem.addListener(SWT.Selection, event -> { - final CSVRow row = (CSVRow) ((IStructuredSelection) tableViewer.getSelection()).getFirstElement(); + final CSVRow row = (CSVRow) ((IStructuredSelection) tableViewer.getSelection()).getFirstElement(); - if (row != null) { - final DetailedEditor input = new DetailedEditor(Display.getDefault(), model.getHeader(), row, model.getInCellDelimiter(), - model.getRegexTableMarker()); - input.open(); - } + if (row != null) { + final DetailedEditor input = new DetailedEditor(Display.getDefault(), model.getHeader(), row, model.getInCellDelimiter(), + model.getRegexTableMarker()); + input.open(); } }); @@ -518,22 +480,19 @@ public void handleEvent(final Event event) { final MenuItem deleteColumnItem = new MenuItem(tableHeaderMenu, SWT.PUSH); deleteColumnItem.setText("Delete Column"); deleteColumnItem.setSelection(false); - deleteColumnItem.addListener(SWT.Selection, new Listener() { - @Override - public void handleEvent(final Event event) { - // call delete column page - final DeleteColumnPage dcPage = new DeleteColumnPage(getSite().getShell(), model.getArrayHeader()); - if (dcPage.open() == InputDialog.OK) { - final String[] colToDelete = dcPage.getColumnSelected(); - for (final String column : colToDelete) { - final int colIndex = findColumnForName(column); - tableViewer.getTable().getColumn(colIndex).dispose(); - // +2 because the first two items are Edit and a separator - tableHeaderMenu.getItem(colIndex + 2).dispose(); - model.removeColumn(column); - } - tableModified(); + deleteColumnItem.addListener(SWT.Selection, event -> { + // call delete column page + final DeleteColumnPage dcPage = new DeleteColumnPage(getSite().getShell(), model.getArrayHeader()); + if (dcPage.open() == Window.OK) { + final String[] colToDelete = dcPage.getColumnSelected(); + for (final String column : colToDelete) { + final int colIndex = findColumnForName(column); + tableViewer.getTable().getColumn(colIndex).dispose(); + // +2 because the first two items are Edit and a separator + tableHeaderMenu.getItem(colIndex + 2).dispose(); + model.removeColumn(column); } + tableModified(); } }); @@ -541,27 +500,24 @@ public void handleEvent(final Event event) { final MenuItem insertColumnItem = new MenuItem(tableHeaderMenu, SWT.PUSH); insertColumnItem.setText("Add Column"); insertColumnItem.setSelection(false); - insertColumnItem.addListener(SWT.Selection, new Listener() { - @Override - public void handleEvent(final Event event) { - // call insert/add column page - final InsertColumnPage acPage = new InsertColumnPage(getSite().getShell(), model.getArrayHeader()); - if (acPage.open() == InputDialog.OK) { - final String colToInsert = acPage.getColumnNewName(); - model.addColumn(colToInsert); - - tableViewer.setInput(model); - final TableColumn column = new TableColumn(tableViewer.getTable(), SWT.LEFT); - column.setText(colToInsert); - column.setWidth(100); - column.setResizable(true); - column.setMoveable(true); - - addMenuItemToColumn(column, model.getColumnCount() - 1); - defineCellEditing(); + insertColumnItem.addListener(SWT.Selection, event -> { + // call insert/add column page + final InsertColumnPage acPage = new InsertColumnPage(getSite().getShell(), model.getArrayHeader()); + if (acPage.open() == Window.OK) { + final String colToInsert = acPage.getColumnNewName(); + model.addColumn(colToInsert); + + tableViewer.setInput(model); + final TableColumn column = new TableColumn(tableViewer.getTable(), SWT.LEFT); + column.setText(colToInsert); + column.setWidth(100); + column.setResizable(true); + column.setMoveable(true); - tableModified(); - } + addMenuItemToColumn(column, model.getColumnCount() - 1); + defineCellEditing(); + + tableModified(); } }); } @@ -569,12 +525,7 @@ public void handleEvent(final Event event) { tableViewer.setInput(model); model.addModelListener(csvFileListener); - tableViewer.getTable().addListener(SWT.MenuDetect, new Listener() { - @Override - public void handleEvent(final Event event) { - tableViewer.getTable().setMenu(tableHeaderMenu); - } - }); + tableViewer.getTable().addListener(SWT.MenuDetect, event -> tableViewer.getTable().setMenu(tableHeaderMenu)); defineCellEditing(); } @@ -627,16 +578,13 @@ private void addMenuItemToColumn(final TableColumn column, final int index) { final MenuItem itemName = new MenuItem(tableHeaderMenu, SWT.CHECK, index); itemName.setText(column.getText()); itemName.setSelection(column.getResizable()); - itemName.addListener(SWT.Selection, new Listener() { - @Override - public void handleEvent(final Event event) { - if (itemName.getSelection()) { - column.setWidth(100); - column.setResizable(true); - } else { - column.setWidth(0); - column.setResizable(false); - } + itemName.addListener(SWT.Selection, event -> { + if (itemName.getSelection()) { + column.setWidth(100); + column.setResizable(true); + } else { + column.setWidth(0); + column.setResizable(false); } }); @@ -670,10 +618,9 @@ public void widgetSelected(final SelectionEvent e) { } /** - * The MultiPageEditorPart implementation of this - * IWorkbenchPart method disposes all nested editors. This method - * is automatically called when the editor is closed and marks the end of the - * editor's life cycle. It cleans up any platform resources, such as images, + * The MultiPageEditorPart implementation of this IWorkbenchPart method + * disposes all nested editors. This method is automatically called when the editor is closed and + * marks the end of the editor's life cycle. It cleans up any platform resources, such as images, * clipboard, and so on, which were created by this class. * * @see org.eclipse.ui.part.MultiPageEditorPart#dispose() @@ -685,11 +632,10 @@ public void dispose() { } /** - * Saves the multi-page editor's document. If the save is successful, the part - * should fire a property changed event (PROP_DIRTY property), reflecting the - * new dirty state. If the save is canceled via user action, or for any other - * reason, the part should invoke setCanceled on the IProgressMonitor to inform - * the caller + * Saves the multi-page editor's document. If the save is successful, the part should fire a + * property changed event (PROP_DIRTY property), reflecting the new dirty state. If the save is + * canceled via user action, or for any other reason, the part should invoke setCanceled on the + * IProgressMonitor to inform the caller * * @see org.eclipse.ui.part.EditorPart#doSave(org.eclipse.core.runtime.IProgressMonitor) */ @@ -716,9 +662,8 @@ public boolean isSaveAsAllowed() { } /** - * Saves the multi-page editor's document as another file. Also updates the text - * for page 0's tab, and updates this multi-page editor's input to correspond to - * the nested editor's. + * Saves the multi-page editor's document as another file. Also updates the text for page 0's tab, + * and updates this multi-page editor's input to correspond to the nested editor's. * * @see org.eclipse.ui.part.EditorPart#doSaveAs() */ @@ -738,12 +683,11 @@ public void doSaveAs() { } /** - * Initializes this editor with the given editor site and input. This method is - * automatically called shortly after editor construction; it marks the start of - * the editor's lifecycle. + * Initializes this editor with the given editor site and input. This method is automatically called + * shortly after editor construction; it marks the start of the editor's lifecycle. * - * The MultiPageEditorExample implementation of this method checks - * that the input is an instance of IFileEditorInput. + * The MultiPageEditorExample implementation of this method checks that the input is an + * instance of IFileEditorInput. * * @see org.eclipse.ui.part.MultiPageEditorPart#init(org.eclipse.ui.IEditorSite, * org.eclipse.ui.IEditorInput) @@ -751,9 +695,8 @@ public void doSaveAs() { @Override public void init(final IEditorSite site, final IEditorInput editorInput) throws PartInitException { /* - * String message = "Input is " + editorInput + " of instance " + - * editorInput.getClass().getName(); IStatus status = new Status(IStatus.ERROR, - * "csvedit", IStatus.ERROR, message, null); + * String message = "Input is " + editorInput + " of instance " + editorInput.getClass().getName(); + * IStatus status = new Status(IStatus.ERROR, "csvedit", IStatus.ERROR, message, null); * Activator.getDefault().getLog().log(status); */ @@ -814,9 +757,8 @@ private void updateTextEditorFromTable() { } /** - * When the focus shifts to the editor, this method is called; it must then - * redirect focus to the appropriate editor based on which page is currently - * selected. + * When the focus shifts to the editor, this method is called; it must then redirect focus to the + * appropriate editor based on which page is currently selected. * * @see org.eclipse.ui.part.MultiPageEditorPart#setFocus() */ @@ -840,15 +782,12 @@ public void setFocus() { @Override public void resourceChanged(final IResourceChangeEvent event) { if (event.getType() == IResourceChangeEvent.PRE_CLOSE) { - Display.getDefault().asyncExec(new Runnable() { - @Override - public void run() { - final IWorkbenchPage[] pages = getSite().getWorkbenchWindow().getPages(); - for (final IWorkbenchPage page : pages) { - if (((FileEditorInput) editor.getEditorInput()).getFile().getProject().equals(event.getResource())) { - final IEditorPart editorPart = page.findEditor(editor.getEditorInput()); - page.closeEditor(editorPart, true); - } + Display.getDefault().asyncExec(() -> { + final IWorkbenchPage[] pages = getSite().getWorkbenchWindow().getPages(); + for (final IWorkbenchPage page : pages) { + if (((FileEditorInput) editor.getEditorInput()).getFile().getProject().equals(event.getResource())) { + final IEditorPart editorPart = page.findEditor(editor.getEditorInput()); + page.closeEditor(editorPart, true); } } }); diff --git a/csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/editors/MultiPageCSVEditorContributor.java b/csvedit.plugin/src/me/glindholm/plugin/csvedit2/editors/MultiPageCSVEditorContributor.java similarity index 73% rename from csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/editors/MultiPageCSVEditorContributor.java rename to csvedit.plugin/src/me/glindholm/plugin/csvedit2/editors/MultiPageCSVEditorContributor.java index e512a7b..8204d71 100644 --- a/csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/editors/MultiPageCSVEditorContributor.java +++ b/csvedit.plugin/src/me/glindholm/plugin/csvedit2/editors/MultiPageCSVEditorContributor.java @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.fhsolution.eclipse.plugins.csvedit.editors; +package me.glindholm.plugin.csvedit2.editors; import org.eclipse.jface.action.IAction; import org.eclipse.jface.action.IMenuManager; @@ -22,9 +22,9 @@ import org.eclipse.ui.texteditor.ITextEditor; /** - * This is the contributor class defines in the Editor ContributorClass attribute - * of the pluging which adds new actions to the workbench menu and toolbar, - * reflecting the features of the editor type + * This is the contributor class defines in the Editor ContributorClass attribute of the pluging + * which adds new actions to the workbench menu and toolbar, reflecting the features of the editor + * type * * @author fhenri * @@ -34,36 +34,39 @@ public class MultiPageCSVEditorContributor extends MultiPageEditorActionBarContr /** * Creates a multi-page contributor. */ - public MultiPageCSVEditorContributor () { - super(); + public MultiPageCSVEditorContributor() { } /** * Returns the action registered with the given text editor. + * * @return IAction or null if editor is null. */ - protected IAction getAction (ITextEditor editor, String actionID) { - return (editor == null ? null : editor.getAction(actionID)); + protected IAction getAction(final ITextEditor editor, final String actionID) { + return editor == null ? null : editor.getAction(actionID); } /** * * @see org.eclipse.ui.part.MultiPageEditorActionBarContributor#setActivePage(org.eclipse.ui.IEditorPart) */ - public void setActivePage (IEditorPart part) { + @Override + public void setActivePage(final IEditorPart part) { } /** * * @see org.eclipse.ui.part.EditorActionBarContributor#contributeToMenu(org.eclipse.jface.action.IMenuManager) */ - public void contributeToMenu (IMenuManager manager) { + @Override + public void contributeToMenu(final IMenuManager manager) { } /** * * @see org.eclipse.ui.part.EditorActionBarContributor#contributeToToolBar(org.eclipse.jface.action.IToolBarManager) */ - public void contributeToToolBar (IToolBarManager manager) { + @Override + public void contributeToToolBar(final IToolBarManager manager) { } } diff --git a/csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/editors/text/CSVRegion.java b/csvedit.plugin/src/me/glindholm/plugin/csvedit2/editors/text/CSVRegion.java similarity index 86% rename from csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/editors/text/CSVRegion.java rename to csvedit.plugin/src/me/glindholm/plugin/csvedit2/editors/text/CSVRegion.java index 5cd7a17..d06ff56 100644 --- a/csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/editors/text/CSVRegion.java +++ b/csvedit.plugin/src/me/glindholm/plugin/csvedit2/editors/text/CSVRegion.java @@ -12,13 +12,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.fhsolution.eclipse.plugins.csvedit.editors.text; +package me.glindholm.plugin.csvedit2.editors.text; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.ITypedRegion; /** * {@link CSVRegion} defines a piece of information inside a CSV document + * * @author J. Andres Pizarro */ public class CSVRegion implements ITypedRegion { @@ -34,35 +35,38 @@ public class CSVRegion implements ITypedRegion { /** * Constructor + * * @param offset the region offset inside the document * @param length the region length - * @param index the region index + * @param index the region index */ - public CSVRegion(int offset, int length, int index) - { + public CSVRegion(final int offset, final int length, final int index) { m_offset = offset; m_length = length; m_index = index; } + @Override public int getLength() { return m_length; } + @Override public int getOffset() { return m_offset; } + @Override public String getType() { return IDocument.DEFAULT_CONTENT_TYPE; } /** * Get the index where this region is positioned inside a CSV line + * * @return the column index where this region is located */ - public int getColumnIndex() - { + public int getColumnIndex() { return m_index; } } \ No newline at end of file diff --git a/csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/editors/text/CSVTextEditor.java b/csvedit.plugin/src/me/glindholm/plugin/csvedit2/editors/text/CSVTextEditor.java similarity index 74% rename from csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/editors/text/CSVTextEditor.java rename to csvedit.plugin/src/me/glindholm/plugin/csvedit2/editors/text/CSVTextEditor.java index 75c5241..962f326 100644 --- a/csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/editors/text/CSVTextEditor.java +++ b/csvedit.plugin/src/me/glindholm/plugin/csvedit2/editors/text/CSVTextEditor.java @@ -12,13 +12,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.fhsolution.eclipse.plugins.csvedit.editors.text; +package me.glindholm.plugin.csvedit2.editors.text; import org.eclipse.ui.editors.text.TextEditor; /** - * {@link CSVTextEditor} extends basic {@link TextEditor} adding syntax highlighting - * for the separated elements + * {@link CSVTextEditor} extends basic {@link TextEditor} adding syntax highlighting for the + * separated elements + * * @author J. Andres Pizarro Gascon */ public class CSVTextEditor extends TextEditor { @@ -26,10 +27,8 @@ public class CSVTextEditor extends TextEditor { /** * Constructor */ - public CSVTextEditor(char delimiter) - { - CSVTextSourceViewerConfiguration csvTextConfig = - new CSVTextSourceViewerConfiguration(delimiter, getPreferenceStore()); + public CSVTextEditor(final char delimiter) { + final CSVTextSourceViewerConfiguration csvTextConfig = new CSVTextSourceViewerConfiguration(delimiter, getPreferenceStore()); setSourceViewerConfiguration(csvTextConfig); } } \ No newline at end of file diff --git a/csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/editors/text/CSVTextSourceViewerConfiguration.java b/csvedit.plugin/src/me/glindholm/plugin/csvedit2/editors/text/CSVTextSourceViewerConfiguration.java similarity index 72% rename from csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/editors/text/CSVTextSourceViewerConfiguration.java rename to csvedit.plugin/src/me/glindholm/plugin/csvedit2/editors/text/CSVTextSourceViewerConfiguration.java index fd0a864..de456eb 100644 --- a/csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/editors/text/CSVTextSourceViewerConfiguration.java +++ b/csvedit.plugin/src/me/glindholm/plugin/csvedit2/editors/text/CSVTextSourceViewerConfiguration.java @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.fhsolution.eclipse.plugins.csvedit.editors.text; +package me.glindholm.plugin.csvedit2.editors.text; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.text.IDocument; @@ -22,33 +22,35 @@ import org.eclipse.jface.text.source.ISourceViewer; import org.eclipse.ui.editors.text.TextSourceViewerConfiguration; -class CSVTextSourceViewerConfiguration extends TextSourceViewerConfiguration -{ +class CSVTextSourceViewerConfiguration extends TextSourceViewerConfiguration { /** Delimiter */ private final char m_delimiter; /** * Constructor + * * @param prefStore the {@link IPreferenceStore} used by the base class constructor */ - public CSVTextSourceViewerConfiguration(char delimiter, IPreferenceStore prefStore) { + public CSVTextSourceViewerConfiguration(final char delimiter, final IPreferenceStore prefStore) { super(prefStore); m_delimiter = delimiter; } /* * (non-Javadoc) - * @see org.eclipse.jface.text.source.SourceViewerConfiguration#getPresentationReconciler(org.eclipse.jface.text.source.ISourceViewer) + * + * @see + * org.eclipse.jface.text.source.SourceViewerConfiguration#getPresentationReconciler(org.eclipse. + * jface.text.source.ISourceViewer) */ @Override - public IPresentationReconciler getPresentationReconciler( - ISourceViewer sourceViewer) { - PresentationReconciler reconciler = new PresentationReconciler(); + public IPresentationReconciler getPresentationReconciler(final ISourceViewer sourceViewer) { + final PresentationReconciler reconciler = new PresentationReconciler(); /* * Reconciler configuration */ - DefaultDamagerRepairer dr = new DefaultDamagerRepairer(new CSVTokenScanner(m_delimiter)); + final DefaultDamagerRepairer dr = new DefaultDamagerRepairer(new CSVTokenScanner(m_delimiter)); reconciler.setDamager(dr, IDocument.DEFAULT_CONTENT_TYPE); reconciler.setRepairer(dr, IDocument.DEFAULT_CONTENT_TYPE); return reconciler; diff --git a/csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/editors/text/CSVToken.java b/csvedit.plugin/src/me/glindholm/plugin/csvedit2/editors/text/CSVToken.java similarity index 78% rename from csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/editors/text/CSVToken.java rename to csvedit.plugin/src/me/glindholm/plugin/csvedit2/editors/text/CSVToken.java index 91a8f68..7681ba7 100644 --- a/csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/editors/text/CSVToken.java +++ b/csvedit.plugin/src/me/glindholm/plugin/csvedit2/editors/text/CSVToken.java @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.fhsolution.eclipse.plugins.csvedit.editors.text; +package me.glindholm.plugin.csvedit2.editors.text; import org.eclipse.jface.text.TextAttribute; import org.eclipse.jface.text.rules.Token; @@ -22,12 +22,11 @@ public class CSVToken extends Token { /** * Different CSV tokens + * * @author japg */ - public enum CSVTokenType - { - ODD_COLUMN(new TextAttribute(null, null, SWT.NORMAL)), - EVEN_COLUMN(new TextAttribute(null, null, SWT.BOLD)), + public enum CSVTokenType { + ODD_COLUMN(new TextAttribute(null, null, SWT.NORMAL)), EVEN_COLUMN(new TextAttribute(null, null, SWT.BOLD)), SEPARATOR(new TextAttribute(null, null, SWT.NORMAL)); /** Text decoration */ @@ -35,19 +34,19 @@ public enum CSVTokenType /** * Constructor + * * @param attrs */ - private CSVTokenType(TextAttribute attrs) - { + CSVTokenType(final TextAttribute attrs) { m_textDecoration = attrs; } /** * Get text attributes for this token type + * * @return */ - TextAttribute getTextAttribute() - { + TextAttribute getTextAttribute() { return m_textDecoration; } } @@ -57,20 +56,21 @@ TextAttribute getTextAttribute() /** * Constructor + * * @param type * @param column */ - public CSVToken(CSVTokenType type, int column) { + public CSVToken(final CSVTokenType type, final int column) { super(type.getTextAttribute()); m_columnIndex = column; } /** * Get column index where this token is located + * * @return */ - public int getColumnIndex() - { + public int getColumnIndex() { return m_columnIndex; } } \ No newline at end of file diff --git a/csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/editors/text/CSVTokenScanner.java b/csvedit.plugin/src/me/glindholm/plugin/csvedit2/editors/text/CSVTokenScanner.java similarity index 64% rename from csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/editors/text/CSVTokenScanner.java rename to csvedit.plugin/src/me/glindholm/plugin/csvedit2/editors/text/CSVTokenScanner.java index c47d79c..d3a57c4 100644 --- a/csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/editors/text/CSVTokenScanner.java +++ b/csvedit.plugin/src/me/glindholm/plugin/csvedit2/editors/text/CSVTokenScanner.java @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.fhsolution.eclipse.plugins.csvedit.editors.text; +package me.glindholm.plugin.csvedit2.editors.text; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.IDocument; @@ -20,7 +20,8 @@ import org.eclipse.jface.text.rules.IToken; import org.eclipse.jface.text.rules.ITokenScanner; import org.eclipse.jface.text.rules.Token; -import org.fhsolution.eclipse.plugins.csvedit.editors.text.CSVToken.CSVTokenType; + +import me.glindholm.plugin.csvedit2.editors.text.CSVToken.CSVTokenType; public class CSVTokenScanner implements ITokenScanner { @@ -42,7 +43,7 @@ public class CSVTokenScanner implements ITokenScanner { /** Current column */ private int m_currentColumn; - /** Current token offset*/ + /** Current token offset */ private int m_tokenOffset; /** Current token length */ @@ -51,14 +52,14 @@ public class CSVTokenScanner implements ITokenScanner { /** * Constructor * - * @param separator - * the separator to use for scanning tokens + * @param separator the separator to use for scanning tokens */ - public CSVTokenScanner(char separator) { + public CSVTokenScanner(final char separator) { m_delimiter = separator; } - public void setRange(IDocument document, int offset, int length) { + @Override + public void setRange(final IDocument document, final int offset, final int length) { m_document = document; m_docOffset = offset; m_docLength = length; @@ -71,83 +72,79 @@ public void setRange(IDocument document, int offset, int length) { m_tokenLength = 0; } + @Override public IToken nextToken() { - if (m_currentOffset >= (m_docOffset + m_docLength)) { + if (m_currentOffset >= m_docOffset + m_docLength) { return Token.EOF; } IToken result = Token.UNDEFINED; - int startOffset = m_currentOffset; + final int startOffset = m_currentOffset; int length = 0; try { // Get line information - IRegion lineRegion = m_document.getLineInformationOfOffset(m_currentOffset); - int lineMinOffset = lineRegion.getOffset(); - int lineMaxOffset = lineMinOffset + lineRegion.getLength(); + final IRegion lineRegion = m_document.getLineInformationOfOffset(m_currentOffset); + final int lineMinOffset = lineRegion.getOffset(); + final int lineMaxOffset = lineMinOffset + lineRegion.getLength(); // Read char - char current = m_document.getChar(m_currentOffset++); + final char current = m_document.getChar(m_currentOffset++); length++; // Check if we are at the end of the line - if (current == '\n') - { + if (current == '\n') { result = Token.WHITESPACE; m_tokenOffset = startOffset; m_tokenLength = length; m_currentColumn = 0; - } - else if (current == m_delimiter) { - result = new CSVToken(CSVTokenType.SEPARATOR, - m_currentColumn++); + } else if (current == m_delimiter) { + result = new CSVToken(CSVTokenType.SEPARATOR, m_currentColumn++); m_tokenOffset = startOffset; m_tokenLength = length; - //System.out.println("Token found [" + m_document.get(m_tokenOffset, m_tokenLength) + "]"); + // System.out.println("Token found [" + m_document.get(m_tokenOffset, m_tokenLength) + "]"); } else { // Look for the next delimiter or the next line boolean scan = true; while (scan) { // check if we are at the end of the line if (m_currentOffset >= lineMaxOffset) { - CSVTokenType type = ((m_currentColumn % 2) == 0) ? CSVTokenType.ODD_COLUMN : CSVTokenType.EVEN_COLUMN; + final CSVTokenType type = m_currentColumn % 2 == 0 ? CSVTokenType.ODD_COLUMN : CSVTokenType.EVEN_COLUMN; result = new CSVToken(type, m_currentColumn); m_tokenOffset = startOffset; m_tokenLength = length; - m_currentColumn= 0; - //System.out.println("Token found [" + m_document.get(m_tokenOffset, m_tokenLength) + "]"); + m_currentColumn = 0; + // System.out.println("Token found [" + m_document.get(m_tokenOffset, m_tokenLength) + "]"); scan = false; - } - else - { + } else { // iterate until a delimiter is found - char next = m_document.getChar(m_currentOffset); + final char next = m_document.getChar(m_currentOffset); if (next == m_delimiter) { - CSVTokenType type = ((m_currentColumn % 2) == 0) ? CSVTokenType.ODD_COLUMN : CSVTokenType.EVEN_COLUMN; + final CSVTokenType type = m_currentColumn % 2 == 0 ? CSVTokenType.ODD_COLUMN : CSVTokenType.EVEN_COLUMN; result = new CSVToken(type, m_currentColumn); m_tokenOffset = startOffset; m_tokenLength = length; - //System.out.println("Token found [" + m_document.get(m_tokenOffset, m_tokenLength) + "]"); + // System.out.println("Token found [" + m_document.get(m_tokenOffset, m_tokenLength) + "]"); scan = false; - } - else - { + } else { m_currentOffset++; length++; } } } } - } catch (BadLocationException e) { + } catch (final BadLocationException e) { e.printStackTrace(); result = Token.EOF; } return result; } + @Override public int getTokenOffset() { return m_tokenOffset; } + @Override public int getTokenLength() { return m_tokenLength; } diff --git a/csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/filter/CSVTableFilter.java b/csvedit.plugin/src/me/glindholm/plugin/csvedit2/filter/CSVTableFilter.java similarity index 95% rename from csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/filter/CSVTableFilter.java rename to csvedit.plugin/src/me/glindholm/plugin/csvedit2/filter/CSVTableFilter.java index d1a8dde..9a80c75 100644 --- a/csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/filter/CSVTableFilter.java +++ b/csvedit.plugin/src/me/glindholm/plugin/csvedit2/filter/CSVTableFilter.java @@ -12,14 +12,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.fhsolution.eclipse.plugins.csvedit.filter; +package me.glindholm.plugin.csvedit2.filter; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerFilter; -import org.fhsolution.eclipse.plugins.csvedit.model.CSVRow; + +import me.glindholm.plugin.csvedit2.model.CSVRow; /** * Filter the elements given a pattern. diff --git a/csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/model/AbstractCSVFile.java b/csvedit.plugin/src/me/glindholm/plugin/csvedit2/model/AbstractCSVFile.java similarity index 95% rename from csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/model/AbstractCSVFile.java rename to csvedit.plugin/src/me/glindholm/plugin/csvedit2/model/AbstractCSVFile.java index 2e7b21f..045bea4 100644 --- a/csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/model/AbstractCSVFile.java +++ b/csvedit.plugin/src/me/glindholm/plugin/csvedit2/model/AbstractCSVFile.java @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.fhsolution.eclipse.plugins.csvedit.model; +package me.glindholm.plugin.csvedit2.model; import java.io.Reader; import java.io.StringReader; @@ -74,8 +74,8 @@ public AbstractCSVFile() { /** * Get the character that defines comment lines * - * @return the comment line starting character. If no comments are allowed in - * this file, then Character.UNASSIGNED constant must be returned; + * @return the comment line starting character. If no comments are allowed in this file, then + * Character.UNASSIGNED constant must be returned; * */ public abstract char getCommentChar(); @@ -102,8 +102,8 @@ public AbstractCSVFile() { public abstract String getInCellDelimiter(); /** - * Get the pattern to identify a column header where values can be splitted with - * the inCellDelimiter and displayed in a table instead of a textfield + * Get the pattern to identify a column header where values can be splitted with the inCellDelimiter + * and displayed in a table instead of a textfield * * @return the regex */ @@ -323,7 +323,7 @@ public CSVRow getRowAt(final int index) { } /** - * @see org.fhsolution.eclipse.plugins.csvedit.model.IRowChangesListener#rowChanged(org.fhsolution.eclipse.plugins.csvedit.model.CSVRow, + * @see me.glindholm.plugin.csvedit2.model.IRowChangesListener#rowChanged(me.glindholm.plugin.csvedit2.model.CSVRow, * int) */ @Override @@ -443,9 +443,9 @@ public String getTextRepresentation() { final CsvWriter clw = initializeWriter(sw); /* - * if (isFirstLineHeader() && header.size() > 0) { String[] headerArray = new - * String[header.size()]; for (int i=0; i 0) { String[] headerArray = new String[header.size()]; + * for (int i=0; i selectedColumn; + private final String[] columnTitle; + private final ArrayList selectedColumn; /** * @param parentShell * @param columns */ - public DeleteColumnPage ( - Shell parentShell, - String[] columns) { + public DeleteColumnPage(final Shell parentShell, final String[] columns) { super(parentShell); - this.columnTitle = columns; - this.selectedColumn = new ArrayList(columnTitle.length); + columnTitle = columns; + selectedColumn = new ArrayList<>(columnTitle.length); } - /** * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite) */ - protected Control createDialogArea (Composite parent) { - Composite container = (Composite) super.createDialogArea(parent); + @Override + protected Control createDialogArea(final Composite parent) { + final Composite container = (Composite) super.createDialogArea(parent); final GridLayout gridLayout = new GridLayout(); gridLayout.numColumns = 2; container.setLayout(gridLayout); final Label filterLabel = new Label(container, SWT.NONE); - filterLabel.setLayoutData(new GridData(GridData.BEGINNING, - GridData.BEGINNING, false, false, 2, 1)); + filterLabel.setLayoutData(new GridData(GridData.BEGINNING, GridData.BEGINNING, false, false, 2, 1)); filterLabel.setText("Select the column that you want to delete:"); final Label nameLabel = new Label(container, SWT.NONE); - nameLabel.setLayoutData(new GridData(GridData.END, - GridData.CENTER, false, false)); + nameLabel.setLayoutData(new GridData(GridData.END, GridData.CENTER, false, false)); nameLabel.setText("Column:"); final List columnList = new List(container, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.MULTI); columnList.setBounds(40, 20, 220, 100); columnList.setItems(columnTitle); - columnList.addSelectionListener( - new SelectionAdapter() { - public void widgetSelected (SelectionEvent e) { - selectedColumn.clear(); - selectedColumn.addAll(Arrays.asList(columnList.getSelection())); - }}); + columnList.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(final SelectionEvent e) { + selectedColumn.clear(); + selectedColumn.addAll(Arrays.asList(columnList.getSelection())); + } + }); return container; } @@ -87,14 +84,15 @@ public void widgetSelected (SelectionEvent e) { /** * @return */ - public String[] getColumnSelected () { + public String[] getColumnSelected() { return selectedColumn.toArray(new String[selectedColumn.size()]); } /** * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell) */ - protected void configureShell (Shell newShell) { + @Override + protected void configureShell(final Shell newShell) { super.configureShell(newShell); newShell.setText("Delete Column"); } diff --git a/csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/page/InsertColumnPage.java b/csvedit.plugin/src/me/glindholm/plugin/csvedit2/page/InsertColumnPage.java similarity index 55% rename from csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/page/InsertColumnPage.java rename to csvedit.plugin/src/me/glindholm/plugin/csvedit2/page/InsertColumnPage.java index 0ef6c95..0cbe68b 100644 --- a/csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/page/InsertColumnPage.java +++ b/csvedit.plugin/src/me/glindholm/plugin/csvedit2/page/InsertColumnPage.java @@ -12,14 +12,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.fhsolution.eclipse.plugins.csvedit.page; +package me.glindholm.plugin.csvedit2.page; import java.util.ArrayList; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.swt.SWT; -import org.eclipse.swt.events.ModifyEvent; -import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; @@ -35,61 +33,50 @@ */ public class InsertColumnPage extends Dialog { - private String[] columnTitle; + private final String[] columnTitle; private String newColumnName; - private ArrayList selectedColumn; + private final ArrayList selectedColumn; /** * @param parentShell * @param columns */ - public InsertColumnPage ( - Shell parentShell, - String[] columns) { + public InsertColumnPage(final Shell parentShell, final String[] columns) { super(parentShell); - this.columnTitle = columns; - this.newColumnName = ""; - this.selectedColumn = new ArrayList(columnTitle.length); + columnTitle = columns; + newColumnName = ""; + selectedColumn = new ArrayList<>(columnTitle.length); } - - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite) */ - protected Control createDialogArea (Composite parent) { - Composite container = (Composite) super.createDialogArea(parent); + @Override + protected Control createDialogArea(final Composite parent) { + final Composite container = (Composite) super.createDialogArea(parent); final GridLayout gridLayout = new GridLayout(); gridLayout.numColumns = 2; container.setLayout(gridLayout); /* - final Label nameLabel = new Label(container, SWT.NONE); - nameLabel.setLayoutData(new GridData(GridData.END, - GridData.CENTER, false, false)); - nameLabel.setText("Column:"); - - final List columnList = new List(container, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.MULTI); - columnList.setBounds(40, 20, 220, 100); - columnList.setItems(columnTitle); - - columnList.addSelectionListener( - new SelectionAdapter() { - public void widgetSelected (SelectionEvent e) { - selectedColumn.clear(); - selectedColumn.addAll(Arrays.asList(columnList.getSelection())); - }}); - */ + * final Label nameLabel = new Label(container, SWT.NONE); nameLabel.setLayoutData(new + * GridData(GridData.END, GridData.CENTER, false, false)); nameLabel.setText("Column:"); + * + * final List columnList = new List(container, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | + * SWT.MULTI); columnList.setBounds(40, 20, 220, 100); columnList.setItems(columnTitle); + * + * columnList.addSelectionListener( new SelectionAdapter() { public void widgetSelected + * (SelectionEvent e) { selectedColumn.clear(); + * selectedColumn.addAll(Arrays.asList(columnList.getSelection())); }}); + */ final Label filterLabel = new Label(container, SWT.NONE); - filterLabel.setLayoutData(new GridData(GridData.BEGINNING, - GridData.BEGINNING, false, false, 2, 1)); + filterLabel.setLayoutData(new GridData(GridData.BEGINNING, GridData.BEGINNING, false, false, 2, 1)); filterLabel.setText("Please Give the name of the new column to be created"); final Text newColumnNameField = new Text(container, SWT.BORDER); newColumnNameField.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false)); - newColumnNameField.addModifyListener(new ModifyListener() { - public void modifyText(ModifyEvent e) { - newColumnName = newColumnNameField.getText(); - } - }); + newColumnNameField.addModifyListener(e -> newColumnName = newColumnNameField.getText()); return container; } @@ -97,21 +84,24 @@ public void modifyText(ModifyEvent e) { /** * @return */ - public String getColumnNewName () { + public String getColumnNewName() { return newColumnName; } /** * @return */ - public String[] getColumnSelected () { + public String[] getColumnSelected() { return selectedColumn.toArray(new String[selectedColumn.size()]); } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell) */ - protected void configureShell (Shell newShell) { + @Override + protected void configureShell(final Shell newShell) { super.configureShell(newShell); newShell.setText("Insert Column"); } diff --git a/csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/providers/CSVContentProvider.java b/csvedit.plugin/src/me/glindholm/plugin/csvedit2/providers/CSVContentProvider.java similarity index 72% rename from csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/providers/CSVContentProvider.java rename to csvedit.plugin/src/me/glindholm/plugin/csvedit2/providers/CSVContentProvider.java index b4653a8..1339654 100644 --- a/csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/providers/CSVContentProvider.java +++ b/csvedit.plugin/src/me/glindholm/plugin/csvedit2/providers/CSVContentProvider.java @@ -12,11 +12,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.fhsolution.eclipse.plugins.csvedit.providers; +package me.glindholm.plugin.csvedit2.providers; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.Viewer; -import org.fhsolution.eclipse.plugins.csvedit.model.AbstractCSVFile; + +import me.glindholm.plugin.csvedit2.model.AbstractCSVFile; /** * @@ -30,10 +31,10 @@ public class CSVContentProvider implements IStructuredContentProvider { * * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object) */ - public Object[] getElements(Object element) { + @Override + public Object[] getElements(final Object element) { - if(element instanceof AbstractCSVFile) { - AbstractCSVFile model = (AbstractCSVFile) element; + if (element instanceof final AbstractCSVFile model) { return model.getArrayRows(false); } return null; @@ -42,15 +43,18 @@ public Object[] getElements(Object element) { /** * @see org.eclipse.jface.viewers.IContentProvider#dispose() */ + @Override public void dispose() { } /** - * Notifies this content provider that the given viewer's input - * has been switched to a different element. + * Notifies this content provider that the given viewer's input has been switched to a different + * element. * - * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object) + * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, + * java.lang.Object, java.lang.Object) */ - public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { + @Override + public void inputChanged(final Viewer viewer, final Object oldInput, final Object newInput) { } } diff --git a/csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/providers/CSVLabelProvider.java b/csvedit.plugin/src/me/glindholm/plugin/csvedit2/providers/CSVLabelProvider.java similarity index 95% rename from csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/providers/CSVLabelProvider.java rename to csvedit.plugin/src/me/glindholm/plugin/csvedit2/providers/CSVLabelProvider.java index d0c6fdf..e6adfea 100644 --- a/csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/providers/CSVLabelProvider.java +++ b/csvedit.plugin/src/me/glindholm/plugin/csvedit2/providers/CSVLabelProvider.java @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.fhsolution.eclipse.plugins.csvedit.providers; +package me.glindholm.plugin.csvedit2.providers; import java.util.ArrayList; import java.util.List; @@ -25,8 +25,9 @@ import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Display; -import org.fhsolution.eclipse.plugins.csvedit.model.CSVRow; -import org.fhsolution.eclipse.plugins.csvedit.style.SearchResultStyle; + +import me.glindholm.plugin.csvedit2.model.CSVRow; +import me.glindholm.plugin.csvedit2.style.SearchResultStyle; /** * diff --git a/csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/sorter/CSVTableSorter.java b/csvedit.plugin/src/me/glindholm/plugin/csvedit2/sorter/CSVTableSorter.java similarity index 95% rename from csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/sorter/CSVTableSorter.java rename to csvedit.plugin/src/me/glindholm/plugin/csvedit2/sorter/CSVTableSorter.java index 2c40247..e9f8e92 100644 --- a/csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/sorter/CSVTableSorter.java +++ b/csvedit.plugin/src/me/glindholm/plugin/csvedit2/sorter/CSVTableSorter.java @@ -12,12 +12,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.fhsolution.eclipse.plugins.csvedit.sorter; +package me.glindholm.plugin.csvedit2.sorter; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerComparator; import org.eclipse.swt.SWT; -import org.fhsolution.eclipse.plugins.csvedit.model.CSVRow; + +import me.glindholm.plugin.csvedit2.model.CSVRow; /** * diff --git a/csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/style/SearchResultStyle.java b/csvedit.plugin/src/me/glindholm/plugin/csvedit2/style/SearchResultStyle.java similarity index 59% rename from csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/style/SearchResultStyle.java rename to csvedit.plugin/src/me/glindholm/plugin/csvedit2/style/SearchResultStyle.java index e8b4a3a..e972bac 100644 --- a/csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/style/SearchResultStyle.java +++ b/csvedit.plugin/src/me/glindholm/plugin/csvedit2/style/SearchResultStyle.java @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.fhsolution.eclipse.plugins.csvedit.style; +package me.glindholm.plugin.csvedit2.style; import java.util.ArrayList; import java.util.List; @@ -33,19 +33,15 @@ public class SearchResultStyle { * @param content * @return */ - public static int[] getSearchTermOccurrences( - String searchTerm, - String content) - { + public static int[] getSearchTermOccurrences(final String searchTerm, final String content) { List styleRange; List ranges; - Display disp = Display.getCurrent(); - StyleRange myStyleRange = - new StyleRange(0, 0, null, disp.getSystemColor(SWT.COLOR_YELLOW)); + final Display disp = Display.getCurrent(); + final StyleRange myStyleRange = new StyleRange(0, 0, null, disp.getSystemColor(SWT.COLOR_YELLOW)); // reset the StyleRange-Array for each new field - styleRange = new ArrayList(); - ranges = new ArrayList(); // reset the ranges-array + styleRange = new ArrayList<>(); + ranges = new ArrayList<>(); // reset the ranges-array if (searchTerm.equals("")) { return new int[] {}; } @@ -53,9 +49,7 @@ public static int[] getSearchTermOccurrences( // determine all occurrences of the searchText and write the beginning // and length of each occurrence into an array for (int i = 0; i < content.length(); i++) { - if (i + searchTerm.length() <= content.length() - && content.substring(i, i + searchTerm.length()) - .equalsIgnoreCase(searchTerm)) { + if (i + searchTerm.length() <= content.length() && content.substring(i, i + searchTerm.length()).equalsIgnoreCase(searchTerm)) { // ranges format: n->start of the range, n+1->length of the // range ranges.add(i); @@ -64,22 +58,15 @@ public static int[] getSearchTermOccurrences( } // convert the list into an int[] and make sure that overlapping // search term occurrences are are merged - int[] intRanges = new int[ranges.size()]; + final int[] intRanges = new int[ranges.size()]; int arrayIndexCounter = 0; for (int listIndexCounter = 0; listIndexCounter < ranges.size(); listIndexCounter++) { if (listIndexCounter % 2 == 0) { - if (searchTerm.length() > 1 - && listIndexCounter != 0 - && ranges.get(listIndexCounter - 2) - + ranges.get(listIndexCounter - 1) >= ranges - .get(listIndexCounter)) { - intRanges[arrayIndexCounter - 1] = 0 - - ranges.get(listIndexCounter - 2) - + ranges.get(listIndexCounter) - + ranges.get(++listIndexCounter); + if (searchTerm.length() > 1 && listIndexCounter != 0 + && ranges.get(listIndexCounter - 2) + ranges.get(listIndexCounter - 1) >= ranges.get(listIndexCounter)) { + intRanges[arrayIndexCounter - 1] = 0 - ranges.get(listIndexCounter - 2) + ranges.get(listIndexCounter) + ranges.get(++listIndexCounter); } else { - intRanges[arrayIndexCounter++] = ranges - .get(listIndexCounter); + intRanges[arrayIndexCounter++] = ranges.get(listIndexCounter); } } else { intRanges[arrayIndexCounter++] = ranges.get(listIndexCounter); @@ -88,9 +75,8 @@ public static int[] getSearchTermOccurrences( } // if there have been any overlappings we need to reduce the size of // the array to avoid conflicts in the setStyleRanges method - int[] intRangesCorrectSize = new int[arrayIndexCounter]; - System.arraycopy(intRanges, 0, intRangesCorrectSize, 0, - arrayIndexCounter); + final int[] intRangesCorrectSize = new int[arrayIndexCounter]; + System.arraycopy(intRanges, 0, intRangesCorrectSize, 0, arrayIndexCounter); return intRangesCorrectSize; } diff --git a/csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/detailededitor/AttributeRow.java b/csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/detailededitor/AttributeRow.java deleted file mode 100644 index c569832..0000000 --- a/csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/detailededitor/AttributeRow.java +++ /dev/null @@ -1,189 +0,0 @@ -/* Copyright 2011 csvedit - * - * 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 - * - * http://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 org.fhsolution.eclipse.plugins.csvedit.detailededitor; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.LinkedList; -import java.util.List; - -/** - * Represents a row made of String elements for the detailed view - * @author fhenri - * @author msavy - * - */ -public class AttributeRow { - - /** Splitted line */ - private final ArrayList entries; - - /** Row changes listener */ - private final IAttributeChangesListener listener; - - /** - * Constructor - * - * @param line - * @param listener - */ - public AttributeRow(List line, IAttributeChangesListener listener) { - entries = new ArrayList(line); - this.listener = listener; - } - - /** - * Constructor - * - * @param lineElements - * @param listener - */ - public AttributeRow(String[] lineElements, - IAttributeChangesListener listener) { - this(Arrays.asList(lineElements), listener); - } - - /** - * Create an empty row - * - * @param nbOfColumns - * @param delimiter - * @param listener - * @return - */ - public static AttributeRow createEmptyLine(int nbOfColumns, - IAttributeChangesListener listener) { - List line = new LinkedList(); - for (int i = 0; i < nbOfColumns; i++) { - line.add(""); - } - return new AttributeRow(line, listener); - } - - /** - * @return - */ - public ArrayList getEntries() { - return entries; - } - - /** - * @return - */ - public String[] getEntriesAsArray() { - return entries.toArray(new String[entries.size()]); - } - - /** - * @param elementIndex - * @param elementString - */ - public void setRowEntry(int elementIndex, String elementString) { - if (entries.get(elementIndex).compareTo(elementString) != 0) { - entries.set(elementIndex, elementString); - listener.rowChanged(this, elementIndex); - } - } - - /** - * return the element at a given index. This method makes sure that if the - * current line does not have as many elements as the header, it will not - * break and return an empty string - * - * @param index - * @return the element at a given index - */ - public String getElementAt(int index) { - if (index >= entries.size()) { - return ""; - } - return entries.get(index); - } - - /** - * Return the number of elements in this row - * - * @return number of elements in this row - */ - public int getNumberOfElements() { - return entries.size(); - } - - /** - * @param element - */ - public void addElement(String element) { - entries.add(element); - } - - /** - * Remove an element of the row represented by its index - * - * @param index - */ - public void removeElementAt(int index) { - entries.remove(index); - } - - /** - * Give the String representation of a CSVRow object. - * - * @see java.lang.Object#toString() - */ - public String toString() { - String result = ""; - for (String s : entries) { - // FIXME get preferences here - result = result.concat(s).concat(","); - } - return result; - } - - /** - * @see java.lang.Object#hashCode() - */ - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((entries == null) ? 0 : entries.hashCode()); - return result; - } - - @Override - public boolean equals(Object anObject) { - // The commented lines implies that if two rows have the same content, - // the cell editor will modify - // the first one found instead of the focused one - // each row is unique - - /* - * //System.out.println("compare:\n[" + this + "] and\n[" + anObject + - * "]"); if (!(anObject instanceof AttributeRow)) { return false; } - * - * AttributeRow thisRow = (AttributeRow) anObject; for (int i=0; - * i model = new ArrayList(); - - IAttributeChangesListener listener = new IAttributeChangesListener() { - public void rowChanged(AttributeRow row, int index) { - tableViewer.refresh(); - } - }; - - /** - * Default constructor - * Add an empty TableViewer to a Composite view - */ - public DetailedAttributeTableViewer(Composite composite) { - - tableViewer = new TableViewer(composite, SWT.BORDER | SWT.FULL_SELECTION | SWT.MULTI); - Table table = tableViewer.getTable(); - table.setLinesVisible(true); - table.setHeaderVisible(true); - GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1); - gd.minimumHeight = 100; - table.setLayoutData(gd); - } - - /** - * Fill the table - * @param headers - * @param content a List where each String[] is a column of the table - */ - public void fillTable(List headers, List content){ - - for (int i = 0; i < headers.size(); i++) { - final TableViewerColumn column = new TableViewerColumn(tableViewer, - SWT.LEFT); - - column.getColumn().setText(headers.get(i)); - column.getColumn().setWidth(200); - column.getColumn().setResizable(true); - column.getColumn().setMoveable(true); - - final int index = i; - - column.setLabelProvider(new ColumnLabelProvider() { - @Override - public String getText(Object element) { - return ((AttributeRow)element).getElementAt(index); - } - }); - } - - model = new ArrayList(); - - if(content.size() > 0){ - //We first look for the biggest column, it will be the reference to generate all AttributeRow - int biggestColumn = 0; - - for(int i = 0; i < content.size(); i++){ - if(content.get(biggestColumn).length < content.get(i).length){ - biggestColumn = i; - } - } - - //For each row of the biggest column (String[]), we look for the rows - //at the same level in other columns and we build a AttributeRow with those data - for(int i = 0; i < content.get(biggestColumn).length; i++){ - List attributes = new ArrayList(); - for(int j = 0; j < content.size(); j++){ - if(i < content.get(j).length){ - attributes.add(content.get(j)[i]); - } else { - attributes.add(""); - } - } - model.add(new AttributeRow(attributes, listener)); - } - } - - tableViewer.setContentProvider(new ArrayContentProvider()); - tableViewer.setInput(model); - - defineCellEditing(tableViewer, headers.size()); - addRightClickItems(tableViewer); - } - - /** - * Make cells of the tableViewer editable - */ - private void defineCellEditing(TableViewer tableViewer, int numberOfColumns) { - String[] columnProperties = new String[numberOfColumns]; - CellEditor[] cellEditors = new CellEditor[numberOfColumns]; - - for (int i = 0; i < numberOfColumns; i++) { - columnProperties[i] = Integer.toString(i); - cellEditors[i] = new TextCellEditor(tableViewer.getTable()); - } - - tableViewer.setColumnProperties(columnProperties); - - tableViewer.setCellEditors(cellEditors); - tableViewer.setCellModifier(new AttributeEditorCellModifier()); - - } - - /** - * Describe the behavior of right click on the tableViewer - */ - private void addRightClickItems(final TableViewer tableViewer){ - - // create menu item to delete column - final Menu tableHeaderMenu = new Menu(tableViewer.getTable()); - - // create menu item to insert column - final MenuItem insertColumnItem = new MenuItem(tableHeaderMenu, - SWT.PUSH); - insertColumnItem.setText("Add row"); - insertColumnItem.setSelection(false); - insertColumnItem.addListener(SWT.Selection, new Listener() { - public void handleEvent(Event event) { - // call insert/add column page - AttributeRow row = (AttributeRow) ((IStructuredSelection) tableViewer.getSelection()).getFirstElement(); - - IAttributeChangesListener listener = new IAttributeChangesListener() { - public void rowChanged(AttributeRow row, int index) { - // TODO Auto-generated method stub - tableViewer.refresh(); - } - }; - - List emptyAttributes = new ArrayList(); - for(int i = 0; i < tableViewer.getTable().getColumnCount(); i++){ - emptyAttributes.add("#TO_FILL#"); - } - - AttributeRow emptyRow = new AttributeRow(emptyAttributes, listener); - - if (row != null) { - model.add(model.indexOf(row) + 1, emptyRow); - } else { - model.add(emptyRow); - } - - tableViewer.refresh(); - } - }); - - final MenuItem deleteColumnItem = new MenuItem(tableHeaderMenu, - SWT.PUSH); - deleteColumnItem.setText("Delete Row"); - deleteColumnItem.setSelection(false); - deleteColumnItem.addListener(SWT.Selection, new Listener() { - public void handleEvent(Event event) { - - AttributeRow row = (AttributeRow) ((IStructuredSelection) tableViewer.getSelection()).getFirstElement(); - - while(row != null){ - row = (AttributeRow) ((IStructuredSelection) tableViewer.getSelection()).getFirstElement(); - if (row != null) { - model.remove(model.indexOf(row)); - tableViewer.refresh(); - } - } - } - }); - - //Link to the tableViewer - tableViewer.getTable().addListener(SWT.MenuDetect, new Listener() { - public void handleEvent(Event event) { - tableViewer.getTable().setMenu(tableHeaderMenu); - tableViewer.refresh(); - } - }); - } - - public TableViewer getTableViewer() { - return tableViewer; - } - - public void setTableViewer(TableViewer tableViewer) { - this.tableViewer = tableViewer; - } - - public List getModel() { - return model; - } - - public void setModele(List model) { - this.model = model; - } -} diff --git a/csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/detailededitor/DetailedEditor.java b/csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/detailededitor/DetailedEditor.java deleted file mode 100644 index 515a38f..0000000 --- a/csvedit.plugin/src/org/fhsolution/eclipse/plugins/csvedit/detailededitor/DetailedEditor.java +++ /dev/null @@ -1,253 +0,0 @@ -/* Copyright 2011 csvedit - * - * 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 - * - * http://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 org.fhsolution.eclipse.plugins.csvedit.detailededitor; - -import java.util.ArrayList; -import java.util.List; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.custom.ScrolledComposite; -import org.eclipse.swt.events.SelectionAdapter; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.layout.FillLayout; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Event; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.Listener; -import org.eclipse.swt.widgets.Shell; -import org.eclipse.swt.widgets.Text; -import org.fhsolution.eclipse.plugins.csvedit.model.CSVRow; - -/** - * Class providing methods to add a custom tableViewer to a Composite - * @author msavy - * - */ -public class DetailedEditor { - - Shell shell; - protected List componentList = new ArrayList(); - - protected CSVRow row; // The row to modify - protected List headerList; // A list of the headers for each column - // of the row - - protected String inCellDelimiter; - protected String regexTableMarker; - - final static String UNKNOWN_URL_FORMAT = "_UNKNOWN_URL_FORMAT:"; - - public Shell getShell() { - return shell; - } - - public void setShell(Shell shell) { - this.shell = shell; - } - - /** - * Default constructor, open a new window - * - */ - public DetailedEditor(final Display display, final List headerList, - final CSVRow row, String inCellDelimiter, String regexTableMarker) { - - shell = new Shell(display); - shell.setLayout(new FillLayout()); - shell.setText("Detailed CSV edition"); - - shell.setSize(800, 600); - - // If there is more columns for the header than there is for the column, - // we had empty columns in the row - // It happen when the row's last columns are empty and separators are - // forgotten. - // The CSV reader can't guess there is a column to create - if (row.getNumberOfElements() > 0 - && headerList.size() > row.getNumberOfElements()) { - for (int i = row.getNumberOfElements() - 1; i < headerList.size(); i++) { - row.addElement(""); - } - } - - this.headerList = headerList; - this.row = row; - - this.inCellDelimiter = inCellDelimiter; - this.regexTableMarker = regexTableMarker; - - ScrolledComposite scrolledComposite = new ScrolledComposite(shell, - SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL); - scrolledComposite.setExpandHorizontal(true); - scrolledComposite.setExpandVertical(true); - - Composite composite = new Composite(scrolledComposite, SWT.NONE); - composite.setLayout(new GridLayout(2, false)); - - generateComponents(composite); - new Label(composite, SWT.NONE); - - Composite compositeBtn = new Composite(composite, SWT.NONE); - GridData gd_compositeBtn = new GridData(SWT.LEFT, SWT.CENTER, false, - false, 1, 1); - gd_compositeBtn.heightHint = 55; - gd_compositeBtn.widthHint = 220; - compositeBtn.setLayoutData(gd_compositeBtn); - - Button btnApply = new Button(compositeBtn, SWT.NONE); - btnApply.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - } - }); - btnApply.setBounds(19, 14, 75, 30); - btnApply.addListener(SWT.Selection, new Listener() { - public void handleEvent(Event e) { - switch (e.type) { - case SWT.Selection: - updateRow(); - shell.dispose(); - break; - } - } - }); - btnApply.setText("Apply"); - - Button btnCancel = new Button(compositeBtn, SWT.NONE); - btnCancel.setBounds(141, 14, 75, 30); - btnCancel.addListener(SWT.Selection, new Listener() { - public void handleEvent(Event e) { - switch (e.type) { - case SWT.Selection: - shell.dispose(); - break; - } - } - }); - btnCancel.setText("Cancel"); - - shell.setMinimumSize(400, 200); - - scrolledComposite.setContent(composite); - scrolledComposite.setMinSize(composite.computeSize(SWT.DEFAULT, - SWT.DEFAULT)); - - // The components must be filled only after the scrolled composite size - // has been set - // Otherwise the size of the scrolled composite would adapt its size to - // the content of its components - fillComponents(); - } - - /** - * Generates components of the DetailedView depending of their type - * - */ - private void generateComponents(Composite composite) { - - for (int i = 0; i < headerList.size() && !headerList.get(i).equals(""); i++) { - - Label label = new Label(composite, SWT.NONE); - label.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1)); - - if (headerList.get(i).matches(regexTableMarker)) { - DetailedAttributeTableViewer tableViewer = new DetailedAttributeTableViewer(composite); - componentList.add(tableViewer); - - } else { - label.setText(headerList.get(i)); - - Text text = new Text(composite, SWT.BORDER); - text.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); - componentList.add(text); - } - } - } - - /** - * Fills components according to data provided by the field attribute "row" - * - */ - private void fillComponents() { - - for (int i = 0; i < componentList.size(); i++) { - - // Fill text components - if (componentList.get(i) instanceof Text) { - ((Text) componentList.get(i)).setText(row.getElementAt(i)); - - // Fill table viewer components - } else if (componentList.get(i) instanceof DetailedAttributeTableViewer) { - - List headers = new ArrayList(); - headers.add(headerList.get(i)); - - String column1[] = row.getElementAt(i).split("[^|]\\|[^|]"); - for (int j = 0; j < column1.length; j++) { - column1[j] = column1[j].trim(); - } - - List content = new ArrayList(); - if (!(column1.length == 1 && column1[0].equals(""))) - content.add(column1); - ((DetailedAttributeTableViewer) componentList.get(i)).fillTable(headers, content); - } - } - } - - private void updateRow() { - - for (int i = 0; i < headerList.size() && !headerList.get(i).equals(""); i++) { - - if (componentList.get(i) instanceof Text) { - row.setRowEntry(i, ((Text) componentList.get(i)).getText()); - - // if update source is a table viewer - } else if (componentList.get(i) instanceof DetailedAttributeTableViewer) { - - List model = ((DetailedAttributeTableViewer) componentList - .get(i)).getModel(); - StringBuilder updatedStr = new StringBuilder(); - - for (AttributeRow atts : model) { - - if (atts.getElementAt(0).equals("")) { - continue; - } - - updatedStr.append(atts.getElementAt(0).trim()); - updatedStr.append(" | "); - } - - String finalStr = updatedStr.toString(); - if (finalStr.length() > 0 - && (finalStr.substring(finalStr.length() - 3, finalStr.length()).equals(" | "))) { - finalStr = finalStr.substring(0, finalStr.length() - 3); - } - - row.setRowEntry(i, finalStr); - } - } - } - - public void open() { - shell.open(); - } -} \ No newline at end of file diff --git a/csvedit.site/category.xml b/csvedit.site/category.xml index 15828c1..450e179 100644 --- a/csvedit.site/category.xml +++ b/csvedit.site/category.xml @@ -1,8 +1,7 @@ - - + + - + diff --git a/csvedit.site/packaging-p2composite.ant b/csvedit.site/packaging-p2composite.ant new file mode 100644 index 0000000..6606791 --- /dev/null +++ b/csvedit.site/packaging-p2composite.ant @@ -0,0 +1,181 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + version=1 +metadata.repository.factory.order=compositeContent.xml,\! +artifact.repository.factory.order=compositeArtifacts.xml,\! + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/csvedit.site/pom.xml b/csvedit.site/pom.xml index 8b03533..8a2f343 100644 --- a/csvedit.site/pom.xml +++ b/csvedit.site/pom.xml @@ -4,11 +4,232 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 4.0.0 - csvedit - org.nodeclipse - 1.2.0-SNAPSHOT + csvedit2 + me.glindholm.plugin + 2.0.0-SNAPSHOT csvedit.site eclipse-repository csvedit :: update site + + + + + org.eclipse.tycho + tycho-packaging-plugin + + 'v'yyyyMMdd'-'HHmm + + + + + org.eclipse.tycho + tycho-p2-repository-plugin + + ${project.artifactId}-${qualifiedVersion} + + + + + + + + + release-composite + + false + + + + + + org.codehaus.mojo + build-helper-maven-plugin + + + + parse-version + + parse-version + + + + + + org.codehaus.mojo + exec-maven-plugin + + git + + + + git-clone + prepare-package + + exec + + + + clone + --depth=1 + -b + main + ${github-update-repo} + ${github-local-clone} + + + + + git-add + verify + + exec + + + + -C + ${github-local-clone} + add + -A + + + + + git-commit + verify + + exec + + + + -C + ${github-local-clone} + commit + -m + Release ${qualifiedVersion} + + + + + git-push + deploy + + exec + + + + -C + ${github-local-clone} + push + origin + main + + + + + + + maven-resources-plugin + + + copy-repository + package + + copy-resources + + + + ${current-release-directory} + + + + ${project.build.directory}/repository + + + + + + + + org.eclipse.tycho.extras + tycho-eclipserun-plugin + + + + eclipse-version + p2 + + https://download.eclipse.org/releases/2023-06 + + + + + org.eclipse.ant.core + eclipse-plugin + + + org.apache.ant + eclipse-plugin + + + + org.eclipse.equinox.p2.repository.tools + eclipse-plugin + + + + org.eclipse.equinox.p2.core.feature + eclipse-feature + + + + org.eclipse.equinox.p2.extras.feature + eclipse-feature + + + org.eclipse.rcp + eclipse-feature + + + + + + + add-p2-composite-repository + package + + eclipse-run + + + + -application + org.eclipse.ant.core.antRunner + -buildfile + packaging-p2composite.ant + p2.composite.add + -Dsite.label="${site.label}" + + -Dcomposite.base.dir=${github-local-clone} + + -DunqualifiedVersion=${unqualifiedVersion} + -DbuildQualifier=${buildQualifier} + + -DparsedVersion.majorVersion=${parsedVersion.majorVersion} + + -DparsedVersion.minorVersion=${parsedVersion.minorVersion} + + + + + + + + + diff --git a/csvedit.target/pom.xml b/csvedit.target/pom.xml index 3aeae87..5248007 100644 --- a/csvedit.target/pom.xml +++ b/csvedit.target/pom.xml @@ -4,9 +4,9 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - org.nodeclipse - csvedit - 1.2.0-SNAPSHOT + me.glindholm.plugin + csvedit2 + 2.0.0-SNAPSHOT csvedit.target eclipse-target-definition diff --git a/csvedit.update/.gitignore b/csvedit.update/.gitignore deleted file mode 100644 index b71f363..0000000 --- a/csvedit.update/.gitignore +++ /dev/null @@ -1,30 +0,0 @@ -*.pydevproject -.metadata -.gradle -bin/ -tmp/ -*.tmp -*.bak -*.swp -*~.nib -local.properties -.settings/ -.loadpath - -# External tool builders -.externalToolBuilders/ - -# Locally stored "Eclipse launch configurations" -*.launch - -# CDT-specific -.cproject - -# PDT-specific -.buildpath - -# sbteclipse plugin -.target - -# TeXlipse plugin -.texlipse \ No newline at end of file diff --git a/csvedit.update/.project b/csvedit.update/.project deleted file mode 100644 index 4bd93c1..0000000 --- a/csvedit.update/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - csvedit.update - - - - - - org.eclipse.pde.UpdateSiteBuilder - - - - - - org.eclipse.pde.UpdateSiteNature - - diff --git a/csvedit.update/artifacts.jar b/csvedit.update/artifacts.jar deleted file mode 100644 index 7c0df1d9a0c14f9fa1e747a5c55c3bd8e8ed3c07..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 670 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 diff --git a/csvedit.update/features/org.fhsolution.eclipse.feature.csvedit_1.0.2.jar b/csvedit.update/features/org.fhsolution.eclipse.feature.csvedit_1.0.2.jar deleted file mode 100644 index 3cdd37c45766f654b952e5c0ad029b3fa28336cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 926 zcmWIWW@Zs#-~d9SW@|eJB)|=1r==#AloqAxRpjQp4Lg{3+kj`U^b30dI}zy#H!}UB zXRkSNNsKp4#bNHY7l9Kc-Dl|RoFrrZ``5*Zk5%4Uz1im78>2F*|Hm{}x z<66u1(DMp6qv-XO0XG%)%#SVK-y(j$ujwDtOl@8{)(w>|RvcSTE;@QCE7FRqZ-RGV zM32<@j@zQk4z=DEIQdM2{o(7^fA3t(td5n~E2KGVU6Li=q1btI+jWc=-qSriJ2#rm zbYth6I1wwh8yvkxZC#N6KnZp_z!MUcv=!XZ_#$6_RjxLy={8?-= z(}bI*5h-m3C+52>;*@_RR7@OMsw;ujjyz*{k z^7r=h&ksgTpRn0f!&mgOM~tnr{W|f!*3~DMREh@~9G%^{Gj^UvMHa)CJBFW91B@A} zHoj*)!}|Z6OTl`TC~mg--j210Yk1cz;QEoaVp8bWKapt@a+a8!ijoZMU*~Kbv!hFr zCn#~Q;O9%S6Sk~vuewvNFl$Cr@-*@1(s6B^J(KSm{;=~o=BZvGb3Sj`cjF3~dv|%& zH-8Lex@;}st3Lhl%?hi9mrZ%p{XZnz?0mx@6govLo=a#uZ`RZ6CP`9`O%(y>oPK}G zX^hdyI5lbIniNT=WiRC&0<#?()x@{SY3@zdV%02qIOF!5`z8{mT)9_oyxOez$9b;& zt3U5w<-Ew<>NzVX^_qV7mV5H;)q=C4wPo7cf1k8A(azeu_LXUB_$t$%Hw^AQRhU+J z_fXaBXTQ{L>RmF=KXFe?^@*;J{kPEH&GDDOYsfMny$6Z`hu{ zSm5}QKa*e1?Psm>a$WS#Q=ZEw>O4d3mLq4MExnu{;LXnQR(<(pF=hsammCZX0p5&E iA`FNOg)9fkP^bVYdj)v2vVkNSfzT32`vVPRU;qGW9FwB} diff --git a/csvedit.update/features/org.fhsolution.eclipse.feature.csvedit_1.0.3.jar b/csvedit.update/features/org.fhsolution.eclipse.feature.csvedit_1.0.3.jar deleted file mode 100644 index eff2d812a29ae28e5e9f3fbd45d12ade503f7770..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 931 zcmWIWW@Zs#-~hruc{X+oNPrv2PD@QJDJ@FXtH{lH8+Op|wu8Xl=tuHyb_>Fk$`(u) zo3zM;MNpKLlU?BW*{VltBHqusTk7-ct8BWgdSlSnYusUayNy4mJv&=`Z13mkF^7bD zMWenRe!N1ONo!s3!cBD*=6m1N@Sfi<&$8FjC|t^hBjIny7Wu5nuAf`4ZYmLxQJlVL zgM{fk!R_8Yt=#5{lg5HDaiEK5V(xw$<5kBXbp=od6vQo8`Wpj_a-f1~jy5_uPEC;vG6R|mLc`Jfh z*bYCDd*-Bc<=(A^0E17V4yt#Uq}+6FOwwG+i}T zh0WRqm|F}*L^=NN<#xZBdNzt8=xp(fdCUWgmvgkf`RMTro zThF>R%eC%3T=lg7byBL!wu0(6p`oH1n?AC-nM{b_>SM`z{Q6^oiKp9K;h-?@#~WHL zUY6}I_1kqkc87__V=<_$f8On4xOl zYt}QY|IfJ;ELVx*W}ENrSbI2!bi=#l>8j}5NovtEzn)TB`~CR8xRz(vxY{57tNX-vwks-sb(QbUrCoD1uLi$~rOK;)H=SOcvf1zc9(C*8Q$Cm*?7eaQ9e>@?KgU{YbsUPsYY8Hx~NG z%xZATyvi}ftCZ_e;bu8&?Q6T!>>stopU=5gIJu}=U&v`s!qe39v~y?XSe~o+^laV4 z4UWmJVVA$Sn)xw`USAsU)nspMTwmO>{5X40HBqDIymp=m-#dzCWd)~Sy_NM+mNosv z(hS|Sz3Io^vUxweRNIlFJ>~M3hhH7vO{lHEE45cpb=JfrUcbxhUh@?f-n~=p70>-O z!}4NId(n!Su}_w`obJtNHm-1ZhZx`t0q-rmE1);Z_Q&KPcP9}}@T zYIT0ZreDt7I8wEbE$v~bQB&^$J`LxdB?7DWK4fP5 zD-+E-L!{wM-a#ef7RPrNr2>?;?|z^hKnno1{J8p%&wm?KVGM+ z`=X|2Lc-6Q1`FB#|B`e2;(H!mQdsF!u)`_U<&z@Qln0`*&C$wd%066(_Ir>lA|YU6 z!_DWvzv}I|s%je>d+%+xoDXkXU=r#hT%35Ma8|iYwD=A+%Pm0$M}If&`fU^WX(#&y z?c*n=J0>ucl)hj+qiTQNrD(NE6gS)cD#zNxS=?)ua{b7AHmTH6ZjG6TnUGTI+a8X| zwhINr*Cn$}4vI)Wa%#8oq;FpX`rG+jgo8g!F@1ZpZ+ax-=STl$?3pY2`H{*`llZvU z`+5&Azj>CnE#jO$*N%OSpI;x{{j;cU?}E#!XT;_|{9E(!9m|9ji?&o;pY$zPD6Ypr zd77k1hx^kIt7+-cPZllG^j?;AKC30_vV7~JYm>x$m2)IC_cpC!(Uf{P!@?U^AD;r3X O5eO}TbOF#n1_l7^{HM_X diff --git a/csvedit.update/features/org.fhsolution.eclipse.feature.csvedit_1.1.1.jar b/csvedit.update/features/org.fhsolution.eclipse.feature.csvedit_1.1.1.jar deleted file mode 100644 index b4c4d75a63da2a45ae6d37ed8d0f0ddb34010b16..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 957 zcmWIWW@Zs#-~d9Q4cqJ(kN`K3otBzdQd*R%SCO0ZHq1BwvV*|h=tuTFH4X}KZkSo&^Vxj8F$>zBSJ<0nB| z#5UhEeq7ePwBTiKM~e28%U}L|jm!JRcYWA*#jn%5qfyxo;&FMj>(+~r@k2JlZ4 zK3k^IKI^8dpVyW<9cC8I<{>w4?fjNHFZlC}t5Mg5oagO1`}=~;kz;dCZ{2XfCHY|H zgElL-go3D=1}~462WxpbSkpIhy=aMcKHuZJ=6QC4Se%;j4URVrMn^ojHr|r9OSo`; zXQ-4AX3`TOU~n~N-@ zWhXPRPxEK*c>M9l(H9kea(JGzd5Sh2X4O)j^j&ZP%la2mccc=xHMid@Vv%2Tpkcv7 z&w`3SN3+W>-G2P=rRS!ra#Gt^m#$2jHG^BZ@A969H+CH`J-Kjdljc4CD|ersoaArY z5NGMOkB5nQ!RlK51ihcNYLl{6FGd;sILiG>IxIRtH}pWc@$@y^pAxn@Zki~dnVs%3 zWE2NOfq{>aPo-c-yKHPC<8cXD>5p?=?_{?AX3 zKK&|WcW&LfwC<;W)-;^fw%8l9XRiM9>D*Rx59fU3ymwYSzn`H~%d6X5H}k&Q!-E_q zNi!WAD+2tMCRc8A)zg}_DP`5SHEt_R{|0Jg>1JLuIn*}slJW|#35x{#cHaHDn{9L4 z!e%M<+HWoY!=Kle{wps1_J!}3iZ7qh>>t~BUOz3Ub*j&9J^ZDh*0sH^`R%mG8%br0 zi_-V}vaxV!G1-6GCFb*m6W`2k{&c;#{_>aI&!5~gdzYwIxyDxR(Yw7z|NqQB{MUA` zc<3uX&$Fi{E{BCCW(J1GoD2*B-i%Bl42b-OECbC diff --git a/csvedit.update/features/org.fhsolution.eclipse.feature.csvedit_1.1.2.jar b/csvedit.update/features/org.fhsolution.eclipse.feature.csvedit_1.1.2.jar deleted file mode 100644 index 1f35a1fc2508cc1445b085f3aa5aefb3c02149db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 959 zcmWIWW@Zs#-~htLoo+4+NPrv2PD@QJDJ@FXtH{lH8+I`7wuQjn*V=4WBD)=QEG^%v zm2u_IQaC2YCt#^twPfW)pD9YAlQuo7t8G_$d&4tIL_@54<-_KqGb@chKfAd2-I@m*j() z589$!6AD6W8oWGM-ml^1V7^O7TK+a6~ph@G1(n8WhTfzwH)HR7)1zT*ql zC$F|uV^!E3z2O8;;)LoARU(@{p0m2!vHqb#n&_p43k{jnlcZep!lcVf9A-G>ah_XL zSlKDGQgLzhZ`;?6+g+YLlj1`^$NsQcf=C zSPkL;l-;9+%vrE=5;)A^xPuGQ}>ePEAMLE4b!w99Nwe)dap@D?t~l_r&G72 zA1<$Qdb~E~{EJD`4p}LO&9zp_4Cnt^@xsBxkTpNzavaZ|Gh8#o{rgYaZ%&Gvqay$O z^zGg4sx@=&-ajvP`e!L)`S*g-?G@(n=iZBbDPi7xRQ*T!zKU`tkC4EqnjFvXW*?^? zy4;b<#`-AGaw^}`n_@dxWSp9`a#ymc)7qE+9RssHyO#-G>z}f2zLsN`o5i!X=ik(HmJallYBe&e2hOpf#YCeE_=zue_%ZSt?XHEr&X^I2rudaHo$N4@$2k6{WX98+htg#%w?i{G;5Ap>~+~^k9O64 zn3Ah{W%5&&&9bK!rj<>c%%p3+=;OHyQmb;_#(Y*gy`s`bd#!e-o&U9z+Kgw(&gY&+ zMI%R$O}z*BG~7Fu zDy)t^%r5e)ILCCsFOHNlZn2q)BA@uv_#gM~+3I)w(foqT>0*}_E}Y4vUYGUs?;5jr zKiU#n?+7h&eY}ZDH7MGx{F`TT$JWLRZyGK(rmma4R`BXA*}^x+Pf8uTKI762BTWmT zb!XQ-e=gqrC+W#lg9){E4s-gBuXkVmczW^<6OTs%GV1~)1>LVRE^G+9XuHGoP)iovSd4-o;m05%L z%wJROG3D6B>2i+iWt7v|=CNFOx=`9c+kK9#xsV4QzpiT8EG{}tSca|KsllQrC`-}%d?L}A^Grt~#==gOX(DVp(| z|F}h!{psgFJ!NX=>95awH|;}ZS+#Yv&U10gJ9iHKJp1TyjphEx3onJzy7fO4?)y=| z*==J#dQa7_MV!PdG-21MFo|c&T5Zl|MuJVJ7s!!<^Igc@8ixacD;Mp zXH!76Ma$Mb$N&EnKl)g-P9XG!pXb@GiA!6}eUG)9aTWTUlAk&6$BPB=t34jXFZVpT zgqP<};oeN`f0rkDA6_Ljb+(#`>z`2L$!q@eEWErwz?+@pe|6viCuRnQf1C^q0p5&E iA`FPkhb#xme5e2^D+YM8vVkNSfzT32R|5@XU;qFu8^V16 diff --git a/csvedit.update/plugins/org.fhsolution.eclipse.plugins.csvedit.ui_1.1.0.jar b/csvedit.update/plugins/org.fhsolution.eclipse.plugins.csvedit.ui_1.1.0.jar deleted file mode 100644 index 66a9af821c645ddf5b51fc7a905aca62ac096bdf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20864 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 diff --git a/csvedit.update/plugins/org.fhsolution.eclipse.plugins.csvedit.ui_1.1.1.jar b/csvedit.update/plugins/org.fhsolution.eclipse.plugins.csvedit.ui_1.1.1.jar deleted file mode 100644 index 68794e51ae88971bcd3b75a850a3224b6f9b6eb3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20881 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 diff --git a/csvedit.update/plugins/org.fhsolution.eclipse.plugins.csvedit.ui_1.1.2.jar b/csvedit.update/plugins/org.fhsolution.eclipse.plugins.csvedit.ui_1.1.2.jar deleted file mode 100644 index c87a303d5be85b3887333f58bfbc6bae54f698a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20572 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 diff --git a/csvedit.update/plugins/org.fhsolution.eclipse.plugins.csvedit.ui_1.2.0.jar b/csvedit.update/plugins/org.fhsolution.eclipse.plugins.csvedit.ui_1.2.0.jar deleted file mode 100644 index 90a1ae66f0341dc49d55441ce2a0b3e00717ac9a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21487 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 diff --git a/csvedit.update/plugins/org.fhsolution.eclipse.plugins.csvedit_1.0.2.jar b/csvedit.update/plugins/org.fhsolution.eclipse.plugins.csvedit_1.0.2.jar deleted file mode 100644 index 42ca36975d78659f845bb13b70ef722293b00aab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 90691 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

nSE%O{f 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 diff --git a/csvedit.update/plugins/org.fhsolution.eclipse.plugins.csvedit_1.0.3.jar b/csvedit.update/plugins/org.fhsolution.eclipse.plugins.csvedit_1.0.3.jar deleted file mode 100644 index 5d542389f371ca703ecf9665862b775dd505a74c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 89549 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�O+ah&BX_v=J(jQe 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 diff --git a/csvedit.update/plugins/org.fhsolution.eclipse.plugins.csvedit_1.1.0.jar b/csvedit.update/plugins/org.fhsolution.eclipse.plugins.csvedit_1.1.0.jar deleted file mode 100644 index 944a7ee6cff06e35fd2df6ae89e18ffb200d8d52..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61455 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 diff --git a/csvedit.update/plugins/org.fhsolution.eclipse.plugins.csvedit_1.1.1.jar b/csvedit.update/plugins/org.fhsolution.eclipse.plugins.csvedit_1.1.1.jar deleted file mode 100644 index 39884f85ca991f2a20dea70bbaf4ab602f58e030..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61995 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 aEHCB`AEF0e)-f1)@RP-f!Ps{|pZ*IYJC}|C diff --git a/csvedit.update/plugins/org.fhsolution.eclipse.plugins.csvedit_1.1.2.jar b/csvedit.update/plugins/org.fhsolution.eclipse.plugins.csvedit_1.1.2.jar deleted file mode 100644 index d7d0eae142e65f3c6aaec5ab394bf09184aab4e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 62056 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\l>~Rg9S)s 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%0AqFOhb+W9hIQ{*ePnh&+H-v6RDtQ!eNgBiCG3& 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 z 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 - - - Update site for the csvedit eclipse plugin - - - - - - - - - - - - - - - - - - diff --git a/pom.xml b/pom.xml index 947ee38..b7f2e4c 100644 --- a/pom.xml +++ b/pom.xml @@ -3,9 +3,9 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 4.0.0 - org.nodeclipse - csvedit - 1.2.0-SNAPSHOT + me.glindholm.plugin + csvedit2 + 2.0.0-SNAPSHOT pom csvedit :: parent csvedit parent @@ -13,14 +13,23 @@ 17 4.0.4 - -Xmx512m -XX:MaxPermSize=256m + -Xmx512m UTF-8 + + + + git@github.com:gnl42/CsvEdit2-update.git + ${project.build.directory}/checkout + ${github-local-clone}/releases + ${releases-directory}/${qualifiedVersion} + + CsvEdit2-update - scm:git@github.com:gnl42/CsvEdit.git - scm:git@github.com:gnl42/CsvEdit.git - https://github.com/gnl42/CsvEdit + scm:git@github.com:gnl42/CsvEdit2.git + scm:git@github.com:gnl42/CsvEdit2.git + https://github.com/gnl42/CsvEdit2 @@ -251,9 +260,9 @@ - org.nodeclipse + me.glindholm.plugin csvedit.target - 1.2.0-SNAPSHOT + 2.0.0-SNAPSHOT @@ -261,6 +270,34 @@ + + + + release-composite + + + + + maven-install-plugin + + + default-install + none + + + + + maven-deploy-plugin + + true + + + + + + + + csvedit.target csvedit.plugin From 8189a0904bb4d9ff521c6ec222523f87002e873c Mon Sep 17 00:00:00 2001 From: George Lindholm <66577321+gnl42@users.noreply.github.com> Date: Mon, 18 Dec 2023 23:51:27 -0800 Subject: [PATCH 11/18] Fix NPE, Button text, setup --- csvedit.feature/feature.xml | 2 +- csvedit.plugin.ui/build.properties | 4 +- .../icons/csv.gif | Bin csvedit.plugin/build.properties | 4 +- .../detailededitor/DetailedEditor.java | 27 ++++--- .../csvedit2/editors/MultiPageCSVEditor.java | 67 ++++++++++++------ .../plugin/csvedit2/model/CSVRow.java | 3 +- 7 files changed, 67 insertions(+), 40 deletions(-) rename {csvedit.plugin => csvedit.plugin.ui}/icons/csv.gif (100%) diff --git a/csvedit.feature/feature.xml b/csvedit.feature/feature.xml index 40e5616..96c1d7d 100644 --- a/csvedit.feature/feature.xml +++ b/csvedit.feature/feature.xml @@ -4,7 +4,7 @@ label="CSV Edit" version="2.0.0.qualifier" provider-name="www.fhsolution.com" - plugin="me.glindholm.plugin.csvedit2.plugins.csvedit"> + plugin="me.glindholm.plugin.csvedit2"> This aims to create a CSV file editor in Eclipse with features diff --git a/csvedit.plugin.ui/build.properties b/csvedit.plugin.ui/build.properties index d68138b..2766588 100644 --- a/csvedit.plugin.ui/build.properties +++ b/csvedit.plugin.ui/build.properties @@ -1,6 +1,6 @@ source.. = src/ -output.. = target/classes bin.includes = META-INF/,\ .,\ - fragment.xml + fragment.xml,\ + icons/ diff --git a/csvedit.plugin/icons/csv.gif b/csvedit.plugin.ui/icons/csv.gif similarity index 100% rename from csvedit.plugin/icons/csv.gif rename to csvedit.plugin.ui/icons/csv.gif diff --git a/csvedit.plugin/build.properties b/csvedit.plugin/build.properties index be0890c..8911777 100644 --- a/csvedit.plugin/build.properties +++ b/csvedit.plugin/build.properties @@ -1,8 +1,6 @@ source.. = src/ -output.. = target/classes bin.includes = plugin.xml,\ META-INF/,\ - .,\ - icons + . jre.compilation.profile=JavaSE-17 diff --git a/csvedit.plugin/src/me/glindholm/plugin/csvedit2/detailededitor/DetailedEditor.java b/csvedit.plugin/src/me/glindholm/plugin/csvedit2/detailededitor/DetailedEditor.java index 225c36f..9835f95 100644 --- a/csvedit.plugin/src/me/glindholm/plugin/csvedit2/detailededitor/DetailedEditor.java +++ b/csvedit.plugin/src/me/glindholm/plugin/csvedit2/detailededitor/DetailedEditor.java @@ -38,7 +38,7 @@ * Class providing methods to add a custom tableViewer to a Composite * * @author msavy - * + * */ public class DetailedEditor { @@ -64,7 +64,7 @@ public void setShell(final Shell shell) { /** * Default constructor, open a new window - * + * */ public DetailedEditor(final Display display, final List headerList, final CSVRow row, final String inCellDelimiter, final String regexTableMarker) { @@ -99,7 +99,7 @@ public DetailedEditor(final Display display, final List headerList, fina composite.setLayout(new GridLayout(2, false)); generateComponents(composite); - new Label(composite, SWT.NONE); +// new Label(composite, SWT.NONE); final Composite compositeBtn = new Composite(composite, SWT.NONE); final GridData gd_compositeBtn = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1); @@ -149,7 +149,7 @@ public void widgetSelected(final SelectionEvent e) { /** * Generates components of the DetailedView depending of their type - * + * */ private void generateComponents(final Composite composite) { @@ -174,15 +174,19 @@ private void generateComponents(final Composite composite) { /** * Fills components according to data provided by the field attribute "row" - * + * */ private void fillComponents() { for (int i = 0; i < componentList.size(); i++) { // Fill text components + String text = row.getElementAt(i); + if (text == null) { + text = ""; + } if (componentList.get(i) instanceof Text) { - ((Text) componentList.get(i)).setText(row.getElementAt(i)); + ((Text) componentList.get(i)).setText(text); // Fill table viewer components } else if (componentList.get(i) instanceof DetailedAttributeTableViewer) { @@ -190,7 +194,7 @@ private void fillComponents() { final List headers = new ArrayList<>(); headers.add(headerList.get(i)); - final String column1[] = row.getElementAt(i).split("[^|]\\|[^|]"); + final String column1[] = text.split("[^|]\\|[^|]"); for (int j = 0; j < column1.length; j++) { column1[j] = column1[j].trim(); } @@ -208,13 +212,14 @@ private void updateRow() { for (int i = 0; i < headerList.size() && !headerList.get(i).equals(""); i++) { - if (componentList.get(i) instanceof Text) { - row.setRowEntry(i, ((Text) componentList.get(i)).getText()); + Object component = componentList.get(i); + if (component instanceof Text) { + row.setRowEntry(i, ((Text) component).getText()); // if update source is a table viewer - } else if (componentList.get(i) instanceof DetailedAttributeTableViewer) { + } else if (component instanceof DetailedAttributeTableViewer) { - final List model = ((DetailedAttributeTableViewer) componentList.get(i)).getModel(); + final List model = ((DetailedAttributeTableViewer) component).getModel(); final StringBuilder updatedStr = new StringBuilder(); for (final AttributeRow atts : model) { diff --git a/csvedit.plugin/src/me/glindholm/plugin/csvedit2/editors/MultiPageCSVEditor.java b/csvedit.plugin/src/me/glindholm/plugin/csvedit2/editors/MultiPageCSVEditor.java index 7a40b0d..c1c5f88 100644 --- a/csvedit.plugin/src/me/glindholm/plugin/csvedit2/editors/MultiPageCSVEditor.java +++ b/csvedit.plugin/src/me/glindholm/plugin/csvedit2/editors/MultiPageCSVEditor.java @@ -31,6 +31,7 @@ import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.graphics.Point; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; @@ -96,6 +97,10 @@ public abstract class MultiPageCSVEditor extends MultiPageEditorPart implements */ private final ICsvFileModelListener csvFileListener = (row, rowIndex) -> tableModified(); + private Label searchLabel; + + private Text searchText; + /** * Creates a multi-page editor example. */ @@ -156,18 +161,14 @@ private void createTablePage() { final GridLayout layout = new GridLayout(6, false); canvas.setLayout(layout); - // create the header part with the search function and Add/Delete rows - final Label searchLabel = new Label(canvas, SWT.NONE); + searchLabel = new Label(canvas, SWT.NONE); searchLabel.setText("Filter: "); - final Text searchText = new Text(canvas, SWT.BORDER | SWT.SEARCH); + searchText = new Text(canvas, SWT.BORDER | SWT.SEARCH); searchText.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL)); // Create and configure the buttons final Button duplicate = new Button(canvas, SWT.PUSH | SWT.CENTER); - duplicate.setText("Duplicate"); - duplicate.setToolTipText("Duplicate the current row"); - final GridData buttonDuplicateGridData = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING); - buttonDuplicateGridData.widthHint = 80; + final GridData buttonDuplicateGridData = createGridDataForButton(parent, duplicate, "Duplicate", "Duplicate the current row"); duplicate.setLayoutData(buttonDuplicateGridData); duplicate.addSelectionListener(new SelectionAdapter() { @Override @@ -181,10 +182,7 @@ public void widgetSelected(final SelectionEvent e) { }); final Button insert = new Button(canvas, SWT.PUSH | SWT.CENTER); - insert.setText("Insert Row"); - insert.setToolTipText("Insert a new row before the current one"); - final GridData buttonInsertGridData = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING); - buttonInsertGridData.widthHint = 80; + final GridData buttonInsertGridData = createGridDataForButton(parent, insert, "Insert Row", "Insert a new row before the current one"); insert.setLayoutData(buttonInsertGridData); insert.addSelectionListener(new SelectionAdapter() { @Override @@ -205,10 +203,7 @@ public void widgetSelected(final SelectionEvent e) { */ final Button add = new Button(canvas, SWT.PUSH | SWT.CENTER); - add.setText("Add Row"); - add.setToolTipText("Add a new row at the end of the file"); - final GridData buttonAddGridData = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING); - buttonAddGridData.widthHint = 80; + final GridData buttonAddGridData = createGridDataForButton(parent, add, "Add Row", "Add a new row at the end of the file"); add.setLayoutData(buttonAddGridData); add.addSelectionListener(new SelectionAdapter() { @Override @@ -219,10 +214,7 @@ public void widgetSelected(final SelectionEvent e) { }); final Button delete = new Button(canvas, SWT.PUSH | SWT.CENTER); - delete.setText("Delete Row"); - delete.setToolTipText("Delete the current row"); - final GridData buttonDelGridData = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING); - buttonDelGridData.widthHint = 80; + final GridData buttonDelGridData = createGridDataForButton(parent, delete, "Delete Row", "Delete the current row"); delete.setLayoutData(buttonDelGridData); delete.addSelectionListener(new SelectionAdapter() { @Override @@ -385,6 +377,18 @@ public void keyReleased(final KeyEvent ke) { setPageText(indexTBL, "CSV Table"); } + private static GridData createGridDataForButton(final Composite parent, final Button button, String myText, String toolTip) { + Text textName = new Text(parent, SWT.BORDER); + textName.setText(myText); + Point size = textName.computeSize(SWT.DEFAULT, SWT.DEFAULT); + + button.setText(textName.getText()); + button.setToolTipText(toolTip); + final GridData buttonDuplicateGridData = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING); + buttonDuplicateGridData.widthHint = size.x; + return buttonDuplicateGridData; + } + /** * Set Name of the file to the tab */ @@ -448,7 +452,7 @@ private void updateTableFromTextEditor() { } }); - new MenuItem(tableHeaderMenu, SWT.SEPARATOR, 1); +// new MenuItem(tableHeaderMenu, SWT.SEPARATOR, 1); final TableColumn[] columns = tableViewer.getTable().getColumns(); if (columns.length > 0) { // if table header columns already created @@ -474,8 +478,8 @@ private void updateTableFromTextEditor() { } if (model.isFirstLineHeader()) { - new MenuItem(tableHeaderMenu, SWT.SEPARATOR); - +// new MenuItem(tableHeaderMenu, SWT.SEPARATOR); +// // create menu item to delete column final MenuItem deleteColumnItem = new MenuItem(tableHeaderMenu, SWT.PUSH); deleteColumnItem.setText("Delete Column"); @@ -628,6 +632,25 @@ public void widgetSelected(final SelectionEvent e) { @Override public void dispose() { ResourcesPlugin.getWorkspace().removeResourceChangeListener(this); + if (tableHeaderMenu != null && !tableHeaderMenu.isDisposed()) { + tableHeaderMenu.dispose(); + tableHeaderMenu = null; + } + if (editor != null) { + editor.dispose(); + editor = null; + } + + if (searchLabel != null && !searchLabel.isDisposed()) { + searchLabel.dispose(); + searchLabel = null; + } + + if (searchText != null && !searchText.isDisposed()) { + searchText.dispose(); + searchText = null; + } + super.dispose(); } diff --git a/csvedit.plugin/src/me/glindholm/plugin/csvedit2/model/CSVRow.java b/csvedit.plugin/src/me/glindholm/plugin/csvedit2/model/CSVRow.java index c6b7f42..fffee3c 100644 --- a/csvedit.plugin/src/me/glindholm/plugin/csvedit2/model/CSVRow.java +++ b/csvedit.plugin/src/me/glindholm/plugin/csvedit2/model/CSVRow.java @@ -110,7 +110,8 @@ public String[] getEntriesAsArray() { * @param elementString */ public void setRowEntry(final int elementIndex, final String elementString) { - if (entries.get(elementIndex).compareTo(elementString) != 0) { + String entry = entries.get(elementIndex); + if (entry != null && entry.compareTo(elementString) != 0) { entries.set(elementIndex, elementString); listener.rowChanged(this, elementIndex); } From 56f79bfc5b45f3f0b617c0100ad1ae1a46e205ab Mon Sep 17 00:00:00 2001 From: George Lindholm <66577321+gnl42@users.noreply.github.com> Date: Sun, 7 Jan 2024 21:11:00 -0800 Subject: [PATCH 12/18] Take out pom-less --- .mvn/extensions.xml | 8 -------- csvedit.feature/.project | 17 ----------------- csvedit.feature/pom.xml | 19 +++++++++++++++++++ csvedit.plugin.ui/.classpath | 8 -------- csvedit.plugin.ui/.project | 28 ---------------------------- csvedit.plugin.ui/pom.xml | 22 ++++++++++++++++++++++ csvedit.plugin/.classpath | 8 -------- csvedit.plugin/.project | 28 ---------------------------- csvedit.plugin/pom.xml | 22 ++++++++++++++++++++++ 9 files changed, 63 insertions(+), 97 deletions(-) delete mode 100644 .mvn/extensions.xml delete mode 100644 csvedit.feature/.project create mode 100644 csvedit.feature/pom.xml delete mode 100644 csvedit.plugin.ui/.classpath delete mode 100644 csvedit.plugin.ui/.project create mode 100644 csvedit.plugin.ui/pom.xml delete mode 100644 csvedit.plugin/.classpath delete mode 100644 csvedit.plugin/.project create mode 100644 csvedit.plugin/pom.xml diff --git a/.mvn/extensions.xml b/.mvn/extensions.xml deleted file mode 100644 index b7cea6f..0000000 --- a/.mvn/extensions.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - org.eclipse.tycho - tycho-build - 4.0.4 - - diff --git a/csvedit.feature/.project b/csvedit.feature/.project deleted file mode 100644 index e05670e..0000000 --- a/csvedit.feature/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - csvedit.feature - - - - - - org.eclipse.pde.FeatureBuilder - - - - - - org.eclipse.pde.FeatureNature - - diff --git a/csvedit.feature/pom.xml b/csvedit.feature/pom.xml new file mode 100644 index 0000000..445d2bc --- /dev/null +++ b/csvedit.feature/pom.xml @@ -0,0 +1,19 @@ + + + 4.0.0 + + me.glindholm.plugin + csvedit2 + 2.0.0-SNAPSHOT + ..\pom.xml + + me.glindholm.plugin.csvedit2.feature + eclipse-feature + [feature] CSV Edit + + www.fhsolution.com + + diff --git a/csvedit.plugin.ui/.classpath b/csvedit.plugin.ui/.classpath deleted file mode 100644 index 2295842..0000000 --- a/csvedit.plugin.ui/.classpath +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/csvedit.plugin.ui/.project b/csvedit.plugin.ui/.project deleted file mode 100644 index 8871fdd..0000000 --- a/csvedit.plugin.ui/.project +++ /dev/null @@ -1,28 +0,0 @@ - - - csvedit.plugin.ui - - - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.pde.ManifestBuilder - - - - - org.eclipse.pde.SchemaBuilder - - - - - - org.eclipse.pde.PluginNature - org.eclipse.jdt.core.javanature - - diff --git a/csvedit.plugin.ui/pom.xml b/csvedit.plugin.ui/pom.xml new file mode 100644 index 0000000..a3a8b98 --- /dev/null +++ b/csvedit.plugin.ui/pom.xml @@ -0,0 +1,22 @@ + + + 4.0.0 + + me.glindholm.plugin + csvedit2 + 2.0.0-SNAPSHOT + ..\pom.xml + + me.glindholm.plugin.csvedit2.ui + eclipse-plugin + [bundle] Eclipse CSV Editor UI contributions + + www.fhsolution.com + + + src + + diff --git a/csvedit.plugin/.classpath b/csvedit.plugin/.classpath deleted file mode 100644 index d115351..0000000 --- a/csvedit.plugin/.classpath +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/csvedit.plugin/.project b/csvedit.plugin/.project deleted file mode 100644 index d498890..0000000 --- a/csvedit.plugin/.project +++ /dev/null @@ -1,28 +0,0 @@ - - - csvedit.plugin - - - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.pde.ManifestBuilder - - - - - org.eclipse.pde.SchemaBuilder - - - - - - org.eclipse.pde.PluginNature - org.eclipse.jdt.core.javanature - - diff --git a/csvedit.plugin/pom.xml b/csvedit.plugin/pom.xml new file mode 100644 index 0000000..a9eb7cc --- /dev/null +++ b/csvedit.plugin/pom.xml @@ -0,0 +1,22 @@ + + + 4.0.0 + + me.glindholm.plugin + csvedit2 + 2.0.0-SNAPSHOT + ..\pom.xml + + me.glindholm.plugin.csvedit2 + eclipse-plugin + [bundle] Eclipse CSV Editor + + www.fhsolution.com + + + src + + From 3b1bea87baec0fca9f47f34dd395823d9eeaa8a6 Mon Sep 17 00:00:00 2001 From: George Lindholm <66577321+gnl42@users.noreply.github.com> Date: Sun, 7 Jan 2024 23:00:17 -0800 Subject: [PATCH 13/18] Unreleased resource #1: Task-Url: https://github.com/gnl42/CsvEdit2/issues/issues/1 --- .../glindholm/plugin/csvedit2/providers/CSVLabelProvider.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/csvedit.plugin/src/me/glindholm/plugin/csvedit2/providers/CSVLabelProvider.java b/csvedit.plugin/src/me/glindholm/plugin/csvedit2/providers/CSVLabelProvider.java index e6adfea..4c3f967 100644 --- a/csvedit.plugin/src/me/glindholm/plugin/csvedit2/providers/CSVLabelProvider.java +++ b/csvedit.plugin/src/me/glindholm/plugin/csvedit2/providers/CSVLabelProvider.java @@ -35,7 +35,7 @@ * */ public class CSVLabelProvider extends StyledCellLabelProvider { -//implements ITableLabelProvider + //implements ITableLabelProvider private String searchText; private final Color searchColor; @@ -107,6 +107,7 @@ public void setSearchText(final String searchText) { */ @Override public void dispose() { + super.dispose(); } /** From e1e05ce6b08c220d3756a5508443382be3ae0f83 Mon Sep 17 00:00:00 2001 From: George Lindholm <66577321+gnl42@users.noreply.github.com> Date: Sun, 7 Jan 2024 23:01:04 -0800 Subject: [PATCH 14/18] Change output folder path --- csvedit.plugin.ui/build.properties | 1 + csvedit.plugin/build.properties | 1 + 2 files changed, 2 insertions(+) diff --git a/csvedit.plugin.ui/build.properties b/csvedit.plugin.ui/build.properties index 2766588..96a5ce9 100644 --- a/csvedit.plugin.ui/build.properties +++ b/csvedit.plugin.ui/build.properties @@ -1,4 +1,5 @@ source.. = src/ +output.. = target/classes/ bin.includes = META-INF/,\ .,\ diff --git a/csvedit.plugin/build.properties b/csvedit.plugin/build.properties index 8911777..bda1ecd 100644 --- a/csvedit.plugin/build.properties +++ b/csvedit.plugin/build.properties @@ -1,5 +1,6 @@ source.. = src/ +output.. = target/classes/ bin.includes = plugin.xml,\ META-INF/,\ . From 22287448f1d95c0de8ec63086e90948489eda03f Mon Sep 17 00:00:00 2001 From: George Lindholm <66577321+gnl42@users.noreply.github.com> Date: Sun, 7 Jan 2024 23:40:39 -0800 Subject: [PATCH 15/18] Clean up references --- README.md | 57 +++++++++++--------------- csvedit.feature/feature.xml | 7 ++-- csvedit.feature/pom.xml | 4 -- csvedit.plugin.ui/META-INF/MANIFEST.MF | 2 +- csvedit.plugin.ui/pom.xml | 7 ---- csvedit.plugin/META-INF/MANIFEST.MF | 2 +- csvedit.plugin/pom.xml | 7 ---- 7 files changed, 28 insertions(+), 58 deletions(-) diff --git a/README.md b/README.md index 74edf09..e1617d5 100644 --- a/README.md +++ b/README.md @@ -11,30 +11,12 @@ or ask for push access here. Tell about new fork by adding new issue. I will hap ## What is this ? -This repository is a fork of [https://code.google.com/p/csvedit/](https://code.google.com/p/csvedit/) created by Mathieu Savy in 2104. It contains the latest functionalities available for CSVEdit but most of the new features are still being tested. If you look for a more reliable version of the plugin you should probably visit the original repository. - -- The previous stable release 1.1.3 was available [on Eclipse Marketplace](https://marketplace.eclipse.org/content/csv-edit). -- The version available in this repository is 1.2.x - -The intention was to contribute features from here to the original repository once they are mature. +This repository is a fork of [https://github.com/Mathieuu/CsvEdit](https://github.com/Mathieuu/CsvEdit) created by Mathieu Savy in 2013 +which in itself is a fork of [https://code.google.com/p/csvedit/](https://code.google.com/p/csvedit/) created by Frederic Henri in 2010. ### How to get the latest version -HELP WANTED WITH PUBLISHING 1.2+ build - -0. NOT AVAILABLE Via Eclipse marketplace at -or drag-n-drop the image on the Eclipse toolbar -[![Drag onto your running Eclipse toolbar. *Requires Eclipse Marketplace Client](images/resurrector-CSV-logo.png)](http://marketplace.eclipse.org/marketplace-client-intro?mpc_install=3739198) - -1. NOT AVAILABLE The latest version (1.2) 2017-10-31 built is NO LONGER available with update-site `http://www.nodeclipse.org/updates/csvedit/`. -In Eclipse Help -> Install new software, add the URL and follow the instructions. - -2. Or from this repository: -[https://raw.githubusercontent.com/SegFaultError/CsvEdit/master/csvedit.update/site.xml](https://raw.githubusercontent.com/SegFaultError/CsvEdit/master/csvedit.update/site.xml) - -- [] TODO 3. Offline site archive from GitHub releases. - -4. Other option is to build from sources with maven `mvn package` and install from local repository archive, that will be in `csvedit.site/target/repository`. +[https://gnl42.github.io/CsvEdit2-update/](https://gnl42.github.io/CsvEdit2-update/) ### CSVEdit @@ -42,27 +24,34 @@ CSVEdit make CSVFile edition easier. + Edit from the source editor - The source editor has been enhanced to help you differentiate your data from the different column using a color mechanism + The source editor has been enhanced to help you differentiate your data from the different column using a color mechanism + Edit from a table view representing the csv data - The table editing is definitely the added value of the plugin and allows a bunch of operation on your csv file among the following features - - - Easy editing of data - - Insertion and deletion of table rows - - Insertion and deletion of table column - - Filtering of data - - Customize view with hidding/display of column to simplify the view - - Manage your column with moving/resizing columns - - Sorting data in column - - Manage your own CSV settings - + The table editing is definitely the added value of the plugin and allows a bunch of operation on your csv file among the following features + + - Easy editing of data + - Insertion and deletion of table rows + - Insertion and deletion of table column + - Filtering of data + - Customize view with hidding/display of column to simplify the view + - Manage your column with moving/resizing columns + - Sorting data in column + - Manage your own CSV settings + ![](images/Editor_Table_Tab.png) ![](images/Editor_Source_Tab.png) -![](images/Preferences.png) +![](images/Preferences.png) ## History +### Version 2.0.0 2024 + +Update for Eclipse 2023-12 +Various bug fixes + +### + Optional maven/tycho build was added in 2017 by Paul Verest. ### New features of 1.2.x diff --git a/csvedit.feature/feature.xml b/csvedit.feature/feature.xml index 96c1d7d..0f3dffe 100644 --- a/csvedit.feature/feature.xml +++ b/csvedit.feature/feature.xml @@ -3,10 +3,10 @@ id="me.glindholm.plugin.csvedit2.feature" label="CSV Edit" version="2.0.0.qualifier" - provider-name="www.fhsolution.com" + provider-name="George Lindholm" plugin="me.glindholm.plugin.csvedit2"> - + This aims to create a CSV file editor in Eclipse with features such as : - view csv file in source editor or table editor @@ -46,8 +46,7 @@ permissions and limitations under the License. - - + me.glindholm.plugin csvedit2 2.0.0-SNAPSHOT - ..\pom.xml me.glindholm.plugin.csvedit2.feature eclipse-feature [feature] CSV Edit - - www.fhsolution.com - diff --git a/csvedit.plugin.ui/META-INF/MANIFEST.MF b/csvedit.plugin.ui/META-INF/MANIFEST.MF index 812a822..6617809 100644 --- a/csvedit.plugin.ui/META-INF/MANIFEST.MF +++ b/csvedit.plugin.ui/META-INF/MANIFEST.MF @@ -3,7 +3,7 @@ Bundle-ManifestVersion: 2 Bundle-Name: Eclipse CSV Editor UI contributions Bundle-SymbolicName: me.glindholm.plugin.csvedit2.ui;singleton:=true Bundle-Version: 2.0.0.qualifier -Bundle-Vendor: www.fhsolution.com +Bundle-Vendor: George Lindholm Fragment-Host: me.glindholm.plugin.csvedit2 Bundle-RequiredExecutionEnvironment: JavaSE-17 Require-Bundle: org.eclipse.ui.ide, diff --git a/csvedit.plugin.ui/pom.xml b/csvedit.plugin.ui/pom.xml index a3a8b98..902eb23 100644 --- a/csvedit.plugin.ui/pom.xml +++ b/csvedit.plugin.ui/pom.xml @@ -8,15 +8,8 @@ me.glindholm.plugin csvedit2 2.0.0-SNAPSHOT - ..\pom.xml me.glindholm.plugin.csvedit2.ui eclipse-plugin [bundle] Eclipse CSV Editor UI contributions - - www.fhsolution.com - - - src - diff --git a/csvedit.plugin/META-INF/MANIFEST.MF b/csvedit.plugin/META-INF/MANIFEST.MF index 9e1c222..5f0454a 100644 --- a/csvedit.plugin/META-INF/MANIFEST.MF +++ b/csvedit.plugin/META-INF/MANIFEST.MF @@ -24,4 +24,4 @@ Export-Package: me.glindholm.plugin.csvedit2.editors; org.eclipse.ui.part", me.glindholm.plugin.csvedit2.model;uses:="com.csvreader" Import-Package: org.jumpmind.symmetric.csv -Bundle-Vendor: www.fhsolution.com +Bundle-Vendor: George Lindholm diff --git a/csvedit.plugin/pom.xml b/csvedit.plugin/pom.xml index a9eb7cc..d805c32 100644 --- a/csvedit.plugin/pom.xml +++ b/csvedit.plugin/pom.xml @@ -8,15 +8,8 @@ me.glindholm.plugin csvedit2 2.0.0-SNAPSHOT - ..\pom.xml me.glindholm.plugin.csvedit2 eclipse-plugin [bundle] Eclipse CSV Editor - - www.fhsolution.com - - - src - From 9d4f6d6d6666b03053cb13648052c1274835ccc1 Mon Sep 17 00:00:00 2001 From: George Lindholm <66577321+gnl42@users.noreply.github.com> Date: Sun, 12 Jan 2025 21:39:37 -0800 Subject: [PATCH 16/18] Custom delimiter for header #4 Task-Url: https://github.com/gnl42/CsvEdit2/issues/issues/1 --- .../customeditor/model/DefaultCSVFile.java | 5 + .../model/PreferencesCSVOptionsProvider.java | 6 + .../preferences/CSVPreferencePage.java | 35 ++++-- .../CustomDelimiterFieldEditor.java | 104 ++++++++++++++++++ .../preferences/PreferenceConstants.java | 1 + .../preferences/PreferenceInitializer.java | 1 + .../csvedit2/model/AbstractCSVFile.java | 16 ++- .../csvedit2/model/ICsvOptionsProvider.java | 2 + 8 files changed, 156 insertions(+), 14 deletions(-) create mode 100644 csvedit.plugin.ui/src/me/glindholm/plugin/csvedit2/customeditor/preferences/CustomDelimiterFieldEditor.java diff --git a/csvedit.plugin.ui/src/me/glindholm/plugin/csvedit2/customeditor/model/DefaultCSVFile.java b/csvedit.plugin.ui/src/me/glindholm/plugin/csvedit2/customeditor/model/DefaultCSVFile.java index fc1b8b4..50faa4b 100644 --- a/csvedit.plugin.ui/src/me/glindholm/plugin/csvedit2/customeditor/model/DefaultCSVFile.java +++ b/csvedit.plugin.ui/src/me/glindholm/plugin/csvedit2/customeditor/model/DefaultCSVFile.java @@ -53,6 +53,11 @@ public boolean getSensitiveSearch() { return optionsProvider.getSensitiveSearch(); } + @Override + public char getCustomHeaderDelimiter() { + return optionsProvider.getCustomHeaderDelimiter().charAt(0); + } + @Override public char getCustomDelimiter() { return optionsProvider.getCustomDelimiter().charAt(0); diff --git a/csvedit.plugin.ui/src/me/glindholm/plugin/csvedit2/customeditor/model/PreferencesCSVOptionsProvider.java b/csvedit.plugin.ui/src/me/glindholm/plugin/csvedit2/customeditor/model/PreferencesCSVOptionsProvider.java index a97a7dd..ef8fdc0 100644 --- a/csvedit.plugin.ui/src/me/glindholm/plugin/csvedit2/customeditor/model/PreferencesCSVOptionsProvider.java +++ b/csvedit.plugin.ui/src/me/glindholm/plugin/csvedit2/customeditor/model/PreferencesCSVOptionsProvider.java @@ -29,6 +29,7 @@ public class PreferencesCSVOptionsProvider implements ICsvOptionsProvider { private final boolean sensitiveSearch; private final boolean useQualifier; private final String customDelimiter; + private final String customHeaderDelimiter; private final String commentChar; private final String defaultPage; private final String textQualifier; @@ -38,6 +39,7 @@ public class PreferencesCSVOptionsProvider implements ICsvOptionsProvider { public PreferencesCSVOptionsProvider() { useFirstLineAsHeader = Activator.getDefault().getPreferenceStore().getBoolean(PreferenceConstants.USE_FIRST_LINE_AS_HEADER); customDelimiter = Activator.getDefault().getPreferenceStore().getString(PreferenceConstants.CUSTOM_DELIMITER); + customHeaderDelimiter = Activator.getDefault().getPreferenceStore().getString(PreferenceConstants.CUSTOM_HEADER_DELIMITER); sensitiveSearch = Activator.getDefault().getPreferenceStore().getBoolean(PreferenceConstants.CASE_SENSITIVE_SEARCH); commentChar = Activator.getDefault().getPreferenceStore().getString(PreferenceConstants.COMMENT_CHAR); textQualifier = Activator.getDefault().getPreferenceStore().getString(PreferenceConstants.TEXT_QUALIFIER); @@ -62,6 +64,10 @@ public boolean getSensitiveSearch() { return sensitiveSearch; } + @Override + public String getCustomHeaderDelimiter() { + return customHeaderDelimiter; + } @Override public String getCommentChar() { return commentChar; diff --git a/csvedit.plugin.ui/src/me/glindholm/plugin/csvedit2/customeditor/preferences/CSVPreferencePage.java b/csvedit.plugin.ui/src/me/glindholm/plugin/csvedit2/customeditor/preferences/CSVPreferencePage.java index ef3bb41..2688a44 100644 --- a/csvedit.plugin.ui/src/me/glindholm/plugin/csvedit2/customeditor/preferences/CSVPreferencePage.java +++ b/csvedit.plugin.ui/src/me/glindholm/plugin/csvedit2/customeditor/preferences/CSVPreferencePage.java @@ -18,6 +18,7 @@ import org.eclipse.jface.preference.ComboFieldEditor; import org.eclipse.jface.preference.FieldEditorPreferencePage; import org.eclipse.jface.preference.StringFieldEditor; +import org.eclipse.swt.SWT; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPreferencePage; @@ -63,26 +64,38 @@ public void createFieldEditors() { addField(new ComboFieldEditor(PreferenceConstants.DEFAULT_VIEW_PAGE, "Select the default tab to view csv file:", pagesLabelsAndValues, getFieldEditorParent())); - addField(new BooleanFieldEditor(PreferenceConstants.USE_FIRST_LINE_AS_HEADER, "&Use the first line of the CSV file as the column headers", - getFieldEditorParent())); - - final StringFieldEditor customDelimiterField = new StringFieldEditor(PreferenceConstants.CUSTOM_DELIMITER, "Choose the delimiter to use:", 2, + final BooleanFieldEditor firstLineIsHeader = new BooleanFieldEditor(PreferenceConstants.USE_FIRST_LINE_AS_HEADER, "&Use the first line of the CSV file as the column headers", getFieldEditorParent()); - customDelimiterField.setTextLimit(1); - customDelimiterField.setEmptyStringAllowed(false); - addField(customDelimiterField); + addField(firstLineIsHeader); + + final CustomDelimiterFieldEditor headerDelimiter = new CustomDelimiterFieldEditor(PreferenceConstants.CUSTOM_HEADER_DELIMITER, "Choose the delimiter to use for header:", getFieldEditorParent()); + addField(headerDelimiter); + + firstLineIsHeader.getDescriptionControl(getFieldEditorParent()).addListener(SWT.Selection, event -> { + final boolean enabled = firstLineIsHeader.getBooleanValue(); + headerDelimiter.setEnabled(enabled, getFieldEditorParent()); + }); + + addField(new CustomDelimiterFieldEditor(PreferenceConstants.CUSTOM_DELIMITER, "Choose the delimiter to use:", getFieldEditorParent())); + + // final StringFieldEditor customDelimiterField = new StringFieldEditor(PreferenceConstants.CUSTOM_DELIMITER, "Choose the delimiter to use:", 2, + // getFieldEditorParent()); + // customDelimiterField.setTextLimit(1); + // customDelimiterField.setEmptyStringAllowed(false); + // addField(customDelimiterField); final StringFieldEditor textQualifierChar = new StringFieldEditor(PreferenceConstants.TEXT_QUALIFIER, "Define the character used as a text qualifier of the data:", 2, getFieldEditorParent()); - customDelimiterField.setTextLimit(1); - customDelimiterField.setEmptyStringAllowed(false); + textQualifierChar.setTextLimit(1); + textQualifierChar.setEmptyStringAllowed(false); addField(textQualifierChar); + addField(new BooleanFieldEditor(PreferenceConstants.USE_QUALIFIER, "For the text qualifier to be used for all fields", getFieldEditorParent())); final StringFieldEditor commentChar = new StringFieldEditor(PreferenceConstants.COMMENT_CHAR, "Choose the character to use as a comment:", 2, getFieldEditorParent()); - customDelimiterField.setTextLimit(1); - customDelimiterField.setEmptyStringAllowed(true); + commentChar.setTextLimit(1); + commentChar.setEmptyStringAllowed(true); addField(commentChar); addField(new BooleanFieldEditor(PreferenceConstants.CASE_SENSITIVE_SEARCH, "&Case sensitive filtering", getFieldEditorParent())); diff --git a/csvedit.plugin.ui/src/me/glindholm/plugin/csvedit2/customeditor/preferences/CustomDelimiterFieldEditor.java b/csvedit.plugin.ui/src/me/glindholm/plugin/csvedit2/customeditor/preferences/CustomDelimiterFieldEditor.java new file mode 100644 index 0000000..de47612 --- /dev/null +++ b/csvedit.plugin.ui/src/me/glindholm/plugin/csvedit2/customeditor/preferences/CustomDelimiterFieldEditor.java @@ -0,0 +1,104 @@ + +package me.glindholm.plugin.csvedit2.customeditor.preferences; + +import org.eclipse.jface.preference.ComboFieldEditor; +import org.eclipse.swt.SWT; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.widgets.Combo; +import org.eclipse.swt.widgets.Composite; + +public class CustomDelimiterFieldEditor extends ComboFieldEditor { + private Combo combo; + private static final String[] delItems = { ",", ";", "|", "tab" }; + + public CustomDelimiterFieldEditor(final String name, final String labelText, final Composite parent) { + super(name, labelText, new String[][] {}, parent); + createControl(parent); + combo.setTextLimit(3); + } + + @Override + protected void adjustForNumColumns(final int numColumns) { + final GridData gd = (GridData) combo.getLayoutData(); + gd.horizontalSpan = numColumns - 1; + gd.grabExcessHorizontalSpace = gd.horizontalSpan == 1; + } + + @Override + protected void doFillIntoGrid(final Composite parent, final int numColumns) { + getLabelControl(parent); + if (combo == null) { + combo = new Combo(parent, SWT.DROP_DOWN | SWT.BORDER); + combo.setItems(delItems); + combo.addModifyListener(e -> valueChanged()); + combo.addVerifyListener(e -> { + if (e.text.length() == 0 || // + !"tab".equals(e.text) && e.text.length() > 1) { + e.doit = false; + } + }); + } + final GridData gd = new GridData(); + gd.horizontalSpan = numColumns - 1; + gd.horizontalAlignment = GridData.FILL; + combo.setLayoutData(gd); + } + + @Override + protected void doLoad() { + updateComboForValue(getPreferenceStore().getString(getPreferenceName())); + } + + @Override + protected void doLoadDefault() { + updateComboForValue(getPreferenceStore().getDefaultString(getPreferenceName())); + } + + @Override + protected void doStore() { + String value = combo.getText(); + if ("tab".equals(value)) { + value = "\t"; + } + getPreferenceStore().setValue(getPreferenceName(), value); + } + + @Override + public int getNumberOfControls() { + return 2; + } + + @Override + public void setEnabled(final boolean enabled, final Composite parent) { + // super.setEnabled(enabled, parent); + combo.setEnabled(enabled); + super.getLabelControl(parent).setEnabled(enabled); + } + + private void updateComboForValue(final String value) { + if (combo != null) { + if ("\t".equals(value)) { + combo.setText("tab"); + } else { + combo.setText(value); + } + } + } + + private void valueChanged() { + setPresentsDefaultValue(false); + final boolean oldState = isValid(); + refreshValidState(); + final boolean newState = isValid(); + if (newState != oldState) { + fireStateChanged(IS_VALID, oldState, newState); + } + String newValue = combo.getText(); + if ("tab".equals(newValue)) { + newValue = "\t"; + } + if (!newValue.equals(getPreferenceStore().getString(getPreferenceName()))) { + fireValueChanged(VALUE, getPreferenceStore().getString(getPreferenceName()), newValue); + } + } +} diff --git a/csvedit.plugin.ui/src/me/glindholm/plugin/csvedit2/customeditor/preferences/PreferenceConstants.java b/csvedit.plugin.ui/src/me/glindholm/plugin/csvedit2/customeditor/preferences/PreferenceConstants.java index 0913350..e3abd58 100644 --- a/csvedit.plugin.ui/src/me/glindholm/plugin/csvedit2/customeditor/preferences/PreferenceConstants.java +++ b/csvedit.plugin.ui/src/me/glindholm/plugin/csvedit2/customeditor/preferences/PreferenceConstants.java @@ -32,4 +32,5 @@ public class PreferenceConstants { public static final String INCELL_DELIMITER = "inCellDelimiter"; public static final String REGEX_HEADER_TABLE = "regexHeaderTable"; public static final String DEFAULT_VIEW_PAGE = "defaultPagePreference"; + public static final String CUSTOM_HEADER_DELIMITER = "headerDelimiterPreference"; } diff --git a/csvedit.plugin.ui/src/me/glindholm/plugin/csvedit2/customeditor/preferences/PreferenceInitializer.java b/csvedit.plugin.ui/src/me/glindholm/plugin/csvedit2/customeditor/preferences/PreferenceInitializer.java index 5c3b47e..a2af586 100644 --- a/csvedit.plugin.ui/src/me/glindholm/plugin/csvedit2/customeditor/preferences/PreferenceInitializer.java +++ b/csvedit.plugin.ui/src/me/glindholm/plugin/csvedit2/customeditor/preferences/PreferenceInitializer.java @@ -37,6 +37,7 @@ public void initializeDefaultPreferences() { final IPreferenceStore store = Activator.getDefault().getPreferenceStore(); store.setDefault(PreferenceConstants.USE_FIRST_LINE_AS_HEADER, true); store.setDefault(PreferenceConstants.CASE_SENSITIVE_SEARCH, false); + store.setDefault(PreferenceConstants.CUSTOM_HEADER_DELIMITER, ","); store.setDefault(PreferenceConstants.CUSTOM_DELIMITER, ","); store.setDefault(PreferenceConstants.TEXT_QUALIFIER, "\""); store.setDefault(PreferenceConstants.USE_QUALIFIER, false); diff --git a/csvedit.plugin/src/me/glindholm/plugin/csvedit2/model/AbstractCSVFile.java b/csvedit.plugin/src/me/glindholm/plugin/csvedit2/model/AbstractCSVFile.java index 045bea4..75b8996 100644 --- a/csvedit.plugin/src/me/glindholm/plugin/csvedit2/model/AbstractCSVFile.java +++ b/csvedit.plugin/src/me/glindholm/plugin/csvedit2/model/AbstractCSVFile.java @@ -19,6 +19,7 @@ import java.io.StringWriter; import java.io.Writer; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import org.jumpmind.symmetric.csv.CsvReader; @@ -64,6 +65,13 @@ public AbstractCSVFile() { */ public abstract boolean getSensitiveSearch(); + /** + * Get custom delimiter to use as a separator for the header + * + * @return the delimiter + */ + public abstract char getCustomHeaderDelimiter(); + /** * Get custom delimiter to use as a separator * @@ -160,6 +168,9 @@ protected void readLines(final String fileText) { } boolean setHeader = false; + if (isFirstLineHeader()) { + csvReader.setDelimiter(getCustomHeaderDelimiter()); + } while (csvReader.readRecord()) { final String[] rowValues = csvReader.getValues(); final CSVRow csvRow = new CSVRow(rowValues, this); @@ -168,6 +179,7 @@ protected void readLines(final String fileText) { setHeader = true; csvRow.setHeader(true); populateHeaders(rowValues); + csvReader.setDelimiter(getCustomDelimiter()); } } else { csvRow.setCommentLine(true); @@ -200,9 +212,7 @@ private void populateHeaders(final String[] entries) { header.clear(); if (entries != null) { - for (final String entry : entries) { - header.add(entry); - } + Collections.addAll(header, entries); /* * for (int i = header.size(); i < nbOfColumns; i++) { header.add(""); } diff --git a/csvedit.plugin/src/me/glindholm/plugin/csvedit2/model/ICsvOptionsProvider.java b/csvedit.plugin/src/me/glindholm/plugin/csvedit2/model/ICsvOptionsProvider.java index d029355..5db05b3 100644 --- a/csvedit.plugin/src/me/glindholm/plugin/csvedit2/model/ICsvOptionsProvider.java +++ b/csvedit.plugin/src/me/glindholm/plugin/csvedit2/model/ICsvOptionsProvider.java @@ -26,6 +26,8 @@ public interface ICsvOptionsProvider { boolean getSensitiveSearch(); + String getCustomHeaderDelimiter(); + String getCustomDelimiter(); String getTextQualifier(); From 0c540d7dfb171dc14b329a7e36615c104b1a6efe Mon Sep 17 00:00:00 2001 From: George Lindholm <66577321+gnl42@users.noreply.github.com> Date: Sun, 12 Jan 2025 21:39:52 -0800 Subject: [PATCH 17/18] Update csv library Task-Url: https://github.com/gnl42/CsvEdit2/issues/4 --- csvedit.target/csvedit.target | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/csvedit.target/csvedit.target b/csvedit.target/csvedit.target index 6b2e3ca..9d9feae 100644 --- a/csvedit.target/csvedit.target +++ b/csvedit.target/csvedit.target @@ -15,10 +15,16 @@ org.jumpmind.symmetric symmetric-csv - 2.5.13 + 3.15.11 jar + + + jumpmind + https://maven.jumpmind.com/repo/ + + \ No newline at end of file From 6b0cffc07826b7f83e04820ad7bf7a9a92f8711c Mon Sep 17 00:00:00 2001 From: George Lindholm <66577321+gnl42@users.noreply.github.com> Date: Sun, 12 Jan 2025 21:42:59 -0800 Subject: [PATCH 18/18] Next version #4: Task-Url: https://github.com/gnl42/CsvEdit2/issues/4 --- csvedit.feature/feature.xml | 2 +- csvedit.feature/pom.xml | 2 +- csvedit.plugin.ui/META-INF/MANIFEST.MF | 2 +- csvedit.plugin.ui/pom.xml | 2 +- csvedit.plugin/META-INF/MANIFEST.MF | 2 +- csvedit.plugin/pom.xml | 2 +- csvedit.site/category.xml | 2 +- csvedit.site/pom.xml | 2 +- csvedit.target/pom.xml | 2 +- pom.xml | 4 ++-- 10 files changed, 11 insertions(+), 11 deletions(-) diff --git a/csvedit.feature/feature.xml b/csvedit.feature/feature.xml index 0f3dffe..29f7cd0 100644 --- a/csvedit.feature/feature.xml +++ b/csvedit.feature/feature.xml @@ -2,7 +2,7 @@ diff --git a/csvedit.feature/pom.xml b/csvedit.feature/pom.xml index cbb1eb2..e9d05a5 100644 --- a/csvedit.feature/pom.xml +++ b/csvedit.feature/pom.xml @@ -7,7 +7,7 @@ me.glindholm.plugin csvedit2 - 2.0.0-SNAPSHOT + 2.1.0-SNAPSHOT me.glindholm.plugin.csvedit2.feature eclipse-feature diff --git a/csvedit.plugin.ui/META-INF/MANIFEST.MF b/csvedit.plugin.ui/META-INF/MANIFEST.MF index 6617809..6070ccb 100644 --- a/csvedit.plugin.ui/META-INF/MANIFEST.MF +++ b/csvedit.plugin.ui/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Eclipse CSV Editor UI contributions Bundle-SymbolicName: me.glindholm.plugin.csvedit2.ui;singleton:=true -Bundle-Version: 2.0.0.qualifier +Bundle-Version: 2.1.0.qualifier Bundle-Vendor: George Lindholm Fragment-Host: me.glindholm.plugin.csvedit2 Bundle-RequiredExecutionEnvironment: JavaSE-17 diff --git a/csvedit.plugin.ui/pom.xml b/csvedit.plugin.ui/pom.xml index 902eb23..32e8aae 100644 --- a/csvedit.plugin.ui/pom.xml +++ b/csvedit.plugin.ui/pom.xml @@ -7,7 +7,7 @@ me.glindholm.plugin csvedit2 - 2.0.0-SNAPSHOT + 2.1.0-SNAPSHOT me.glindholm.plugin.csvedit2.ui eclipse-plugin diff --git a/csvedit.plugin/META-INF/MANIFEST.MF b/csvedit.plugin/META-INF/MANIFEST.MF index 5f0454a..b44b10c 100644 --- a/csvedit.plugin/META-INF/MANIFEST.MF +++ b/csvedit.plugin/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Eclipse CSV Editor Bundle-SymbolicName: me.glindholm.plugin.csvedit2;singleton:=true -Bundle-Version: 2.0.0.qualifier +Bundle-Version: 2.1.0.qualifier Bundle-Activator: me.glindholm.plugin.csvedit2.Activator Bundle-RequiredExecutionEnvironment: JavaSE-17 Require-Bundle: org.eclipse.ui, diff --git a/csvedit.plugin/pom.xml b/csvedit.plugin/pom.xml index d805c32..00aa968 100644 --- a/csvedit.plugin/pom.xml +++ b/csvedit.plugin/pom.xml @@ -7,7 +7,7 @@ me.glindholm.plugin csvedit2 - 2.0.0-SNAPSHOT + 2.1.0-SNAPSHOT me.glindholm.plugin.csvedit2 eclipse-plugin diff --git a/csvedit.site/category.xml b/csvedit.site/category.xml index 450e179..2e74223 100644 --- a/csvedit.site/category.xml +++ b/csvedit.site/category.xml @@ -1,6 +1,6 @@ - + diff --git a/csvedit.site/pom.xml b/csvedit.site/pom.xml index 8a2f343..e4de24c 100644 --- a/csvedit.site/pom.xml +++ b/csvedit.site/pom.xml @@ -6,7 +6,7 @@ csvedit2 me.glindholm.plugin - 2.0.0-SNAPSHOT + 2.1.0-SNAPSHOT csvedit.site eclipse-repository diff --git a/csvedit.target/pom.xml b/csvedit.target/pom.xml index 5248007..f78770c 100644 --- a/csvedit.target/pom.xml +++ b/csvedit.target/pom.xml @@ -6,7 +6,7 @@ me.glindholm.plugin csvedit2 - 2.0.0-SNAPSHOT + 2.1.0-SNAPSHOT csvedit.target eclipse-target-definition diff --git a/pom.xml b/pom.xml index b7f2e4c..2ef6ac0 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ 4.0.0 me.glindholm.plugin csvedit2 - 2.0.0-SNAPSHOT + 2.1.0-SNAPSHOT pom csvedit :: parent csvedit parent @@ -262,7 +262,7 @@ me.glindholm.plugin csvedit.target - 2.0.0-SNAPSHOT + 2.1.0-SNAPSHOT