From f8310b1faceddf343924239b5204cd91608fa91b Mon Sep 17 00:00:00 2001 From: bancika Date: Thu, 25 Apr 2013 16:32:06 +0000 Subject: [PATCH] Added primitive shapes - ellipse, polygon and (rounded) rectangle --- .../diylc-library/lib/diylc-core.jar | Bin 210579 -> 210640 bytes .../components/boards/AbstractBoard.java | 6 +- .../diylc/components/connectivity/Line.java | 2 +- .../org/diylc/components/shapes/Ellipse.java | 150 +++++++++++++++ .../org/diylc/components/shapes/Polygon.java | 181 ++++++++++++++++++ .../diylc/components/shapes/Rectangle.java | 161 ++++++++++++++++ 6 files changed, 496 insertions(+), 4 deletions(-) create mode 100644 diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/shapes/Ellipse.java create mode 100644 diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/shapes/Polygon.java create mode 100644 diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/shapes/Rectangle.java diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-library/lib/diylc-core.jar b/ diy-layout-creator --username bancika@gmail.com/diylc-library/lib/diylc-core.jar index b2fed95a70941f5fa71d9789858d73bfd07876b0..d29b74f6f6cad9f3a6d5dd425c5bf3327e5f898f 100644 GIT binary patch delta 18955 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 PrGq7)Ra{!Z64v|&c9XZK delta 18888 zcmXV%1yEc~vxeEl-QC?Cg1ftWaCdiEEI1^%TObgEyF0<%-6gmOhx=v!yH#87Gu_iY zdgfG}vpao`lzfhaq^bZ3g#hvIbLp0dL=U`hOXN8Mp138G0m%M|IDiIt>6UBX*Zkx3z8bKdKrjHT8Nz``|LnL5sNgc4(jyS%(k)ZG5skgc7ajtF04tf?o-$np4idZG zN;M4rU*%IhI`n^vZT}Y>gzSU~^{-6fMhh-0c;Es4O@*Z=BM|xGzhq0|%}fIT2nhOQ z7f;;!2Jap47}9-Fz%y0q-}FzDjf2|%%aTk4n*EpT3Zw>3CK39-k^Btr0yl1x00|z6 zW8xCnFP#DdZcI59ADqoLoe^wL%Y+AOVRj<8HLhGVuwOdA3LO9Udm>n)ORmB70?IbP z^$g0v>r{_cl?nEj*It1A*$rR8Wu}%=aCxC^6I{QsV;sCrbAB7?zuj1`vr_{3Pe1lCz>4{Y1FSNq)L?bGfCsDZH8NPE z?(m^dPX3$IC*ng45+DQwJ}`X-5r|tq_{awQm+0}i1r7OMh3}K-xE7EQ5XR}~#sIwL z1w?@7zYNWasDM~7tY82>{)IHJVgp{lmL+_^02p$K0pRX5*OCF^z;#3@0n%VsBn@B^ z3_1*ea!7DjnwS&&_5W*03o?C16M)-H%K~r&S4m?BB!QzDxB#MHivthf1#Ge92NZw- zQ3#+2^RE|r5`bt(aL+MA3B-QFTNa7N6Gq}2b`;2SV~dI^A=u0RQi(ERZgPy~)FP6C{O z;ae&Iym-y|8318$_N{Dy9~cbs0m5kiI+tAykbwUO+bw`Tu&cNO@ZS#o&%)CK=mx`M zKL8U9$U^{KFj$WQG{Dd?0SE+xzzo0w42AOmaxe@m0q6n$@?0(hSiu&ubpRX~7`6az zV947A$b;eJ08j~r%wxbj7@W@mgkXrf0)&DA?G6wGhHnpmRxl{M0It9w^Z^h6gC7uB z4Q`YX3TOhJgm@UB$N#nq^lu!zFaMne;eh|m8WR&FO8Wg003*Ev2t;aDM*zBlLw_Rz z%fQK8P=Pi7ApO5JrA$X){%?|1Fo8B;Un>qU0t{jV!2fN!8sh(N5rYgU0e0z70@J~8 zMFWfn1Be0018$>*5s32dGHxDb0uBSfCtvCx{ZiQf7L^t%{fZ69l#a{>3EMow0!06J zc{lH~0slL-{)0OXAT}5fxq-c4nB)PLgTbF4h>!BGPMR!m9qS)>7y_X%|AC(i@CMwT zlN-OmlYWXkg8(?=ZG&)r_VW&V9lQ=SyRBEm1m;Y5SUo1*ri3gH_ zmMOoYi(A>ouJ2P>`lEEJtc0YmUAYMuT}-D6Yz$CuZv0@}a!DpSa0*zCPIo>T6>>^q zGy*B;TzDn}ufI*FI=9Oux{(S8$mm>nC)e)o01Th1vL7YuFLw@JB5n$*&cyM&+DAM` zC7kNSe3vWF)L?}6r7edg7*aZUuZ06Z0Ru&6IzhqdGM)$Q6+xeM@?3J?fIA`K^aVvdf--Nu?T3&zjRVywcw9D3(@0O?L0L*eIiYd;}LH!(L1zz>47pxE>+)4eUiQBs#d5wr3obX(^?quCKRw30&x5jRbR9eZl; z6&?0;mpf|@*EfLO16#wV*uvKZCGpY7wj1=#4=XwlPYTH7IzQruRpJRRb`AMpE5Z#; zfP^EZpLdm(cMYA1*pqQ6#ncC+8C|FztfK|Nr1fQyfm3rr)o}S5u4@K)VS0gxr>+J(JaqE$Uq2|^c2}s_>)b~?^N@$naWRP6A^6?mq!G4h@T9i%vm_*wIv)SwpRfd zp6tMm0o5tU(4PwEQ7A;~ps&dM$e#EK+6lbID6^$iJuF9imefYtJC==wM!{j9ZGPhJ zaM>f>n>7nZ(HR7@c!Z|>( zzVXW8PrA?pF{LmD+#r%&C5T0XdB`iW#cZJG4T6#9DLj%HE&GD9Tc7XF0W(kHitNGZ2ppt&fYCn zW5hnMllZ+F|HRpSeygl|i2Wm&`2A;j^&Y`y&sg@)^E_$xr({C?iQgs8rsd7(HCj>c zrL`ko4zCG??-KZzmu(9V^Z#8(A*VSt(@lIQ#`E26J2&KM!m|tA?Z*cvBCdKL9P?j2 z@3-I<#3Y2m1KjbVucHe|*yoF){+dVdJEYeq0qH^Px`o+JI>KDK=-WBir{nfDwJ?OR zpQ7TIGN+Wh>)>6~#*nqm*sAg-z3Vx=k|t?@qT|)|a!!6C*%kHl{MmLjwocDN2NFDQ zEZJ4{`23K3{&2N5*;?B_Ft(sPv=2)B^%^Iw2r6LUdXyJe{tJ+TFC1_UZviwJd>^GtOSq`*LpKa*5N0~XR~V);{e|pYci;0o<`>5 z&#fgzWsPNp$tp%+(gKarGsj4=?>0AOjg`XO)A)d1o!!A@ZCwzrn}z~!1qk!Z2Z}mOXlUz1)x8L!<|=SmwMskF zR`P>Z+va@p{V(jDg}O))4oE}KVXkPWbfbfCZiI*re;>mASSxK6E}^>ROKz17~2dQ=$ai5_MY&KiZ1Df zd3Zqki*LB$Ev>s4^9rM48TxvKYcav5e3EPv3)^?2_(oUjX?kd?Pe4JG6Gt z#rY@dJ$DahRX}P{=NrtEoMQ5KRN54sxC(S3p+uABjRr2rOYJeOmZ(rrl?@z|jK58N zMMMvji3idQQT*Na8uCdFZtLG}H5q7`!Of_N6q1Yu^15iv!5(86}e3#BqI)`o%g(vr5s?dR4iq=ZTD-0Rpng=i=!Ml(VE(Q&EJf|{MN zFNrJ=E73~aUWP4Grc5V$;(hd)f*4Z*f#D^4pZMA5)W4xX4_mVS%vP09!K=jgfyd`; ztk7@#1+A-@i=a#@d0$ZXDWZu*Y$B5Q&dnjX;~4rJ{RCx5fC&=<#Qe1Fn5eYu<}f(D zjP9}rO>;VIHi0-+U$A=@H;U~vM-giQm(3N|SKH{+uDne|iV$t2M!k z^-5E^l9h((AWFt#`Z)XYfAs2#PI7wQW5D@%e#%bboLkF*6KJZaizoFi#i>>x=-#(j z*>-w&E*blzilW|FR!x}6hNuVVczriv!X}l%Co^kb{eYnYo$+=N){st(etOrXE0ZCR zI1PmqvT1#hn0eI3|2#2lc1y$^yW|ELf13jpCO4KANH>jq-GqiT^949!%jp!z#W9_a z%(W%D6?J)IQn0wasM^3yF<++5B5MfcRbp?e-n$bc<-q*Ts~johr~LcKUmgYmrR1=;;ozIvK(+aFGH)uI3|WuczTDb; z^ctvKa|rlR5M^Tz-AWhwI}~5I*Gn3db#fN7Lz&XK08oL4CTKl}>Ky2SuSjJTU-c@* z@J!(sH7fWplz#1?-xXrpTli@nz3C8hF0UI!!zH%bsq_iFgwu@R5JuZnb5pJ*5k$a& zY=xLRF9yQVDM;HVXV){^n3c3Db|)uXQz5zBho+a(dtam8yXJTa-P`?q{<~9V(!50l zIm~(=`_lyG2bs)vPva^+(>~*n(X=i;+i*U zp_wNY8jDw*`MD(CFYU>rB4W0$$OY(JtMvJ>kK?TLH zlJ06WZ#UjNb;y3*66bEx=*d`2fLeR+*=GNI~M3y-tCo2JH(#hO4|9xw%l9^48 zvMRnXbFEM;{;JndS}eiJs>o%Ak>XSj{cWMJ+?P@&88cvURQrSGEt~|MW=$CsOJ+kO zB>y$DLgJ~SEWogJrI>ZjIHN*?etv}`nc13A(W{FCQS;s=$C|-d%ZXz}zG>8=dSjHcC9aRHDL3TeZ^9q+@vWvj5vHtlr$^T351I( zZO-||`1sR+67oIoYVaFKgyh;BlBg0_a!=#TO#?sn#ufUdVN#iACH1NRixKV7pEF54 zG##Xv&$Xg;#!1tj75K@LJ77O&+ax5e(nmDYf&}oWRa1B53#c-RxUT z=4S@0Rbn&#HLE)Nk*=ODn>todEuqI>%jCc>8#Z;- zb=e-;_I1@eb=?VB+g4tP8O@poHgyIoUK-I1Y>Oyfog+@>&Dm!t9qZA77wT4-cgW8r zWdZnKXjrwjPR|Hw+OyBOR(Mu~XkKt)b~|Yl=*UjCtkCfD7&2Tg_~B3>P=ylz=y858 zyuiQB3aJqlDZo4g4JOgWEIcWBk-nfPayP^HPhhTdPidCaz9{{LfNSB<%LKZnalTM4 zgxui@Ox0>pw8TYbG$-m}Y zM_MDJWLXak5Y8R@kza0B^-IHsKyPRy#ziE;?$LGLTZIfA6a=@(#*6lq%QF%%C1NI0 zQjF&9+ZPB4;Rne8t4d!|r_?%Vp;DKx%E2h%y?m>ClUVkNCT@Mi0#@hsNi0+ZR)3*=1KMLrup?QAtwfB@Nk&6Jd|;O#AOuA){HRD73xW*ybFFpM=- zo1cB=``0}KB#^1XI3@alc;=^=Hxwdnz}G&Yc)(;y;)m^(AZ^W>b%uKvRmMd>A?l&n z^5lrRrpW^NZr*Lt&5=5mik&i#s4m&o1`{0rn$1(tVS0#SYv#NiS7jAwhIC+uU;7`u7OeGKpo}x@zrRL|B!r)tUvfu+RPrIo z(J+C7Klrx^1K)!r;Uk$DIo|;E*D_RFr!D{th+RQ1ni?Xa5DJ<1$-2mtaa*{*u7TmK zs%?ueOA&3MWQ?jlbh++RR~IO2e3ke< z@@`r86k(J#WWde$aPRJvZ03PU5U)L|80Apf4fo43F>=ci*J4 zdp$2JYeIzS5AjnQtVab6u7!ELG_GRpoNdq-5#r?ezoRHbmZ@$wk+8 z(68exz$i2ihU**~x5|(K-B=^hG!v!e^0(We2AN&LZ+SK%J^~uibS9F9@vrb5=X;hr zNkC4ut|qKr?GGA2(U!Pe-8{7o%-7}*9pz`2FXe%Ij_T<5n|DI^#&%^i=0 zV4FME7Fu+Dj58QW9N9#q&6R>?O4EIsBNvwz2L`Zl{HA1k~#_h_ALGDC0IW zHWdef!=A%~w11EvHE^jix7d@bLSS#O&owm!lmv)vxYV7Lp^j*b<5RV#L3T6t`8g=I zhg4`)#MXRuQ-5ORR4z^JRC=^5eW7axHEAKyf16+A4 z(&mZbgwvG0Vg%@Y%%nv(dR?2EwFH}2BwZXlPYVpB?$CE#yoqW^l&FBP_ZFfVQYeAN zr7vkBL%(7(R~;%@erxPpgYdpcSFkPI|xZ zCGM`=78PxQPGoSBaY~5TBWIg|CMG(`*gC1Ozg0YUI46=Hm0s{I(XO6QN&LI#^hl9| zT;Tr1(Vv+01bMnB#=EgGyCi}Z*&>W});J4)g|oMv!sEn#IL?fA4Cuk=|At$l%&ORN z=AmoZTD4(KF5d;RB|xc3A+X)no>qO0OcSz|VT}>|MZH~kvV_wnyC>rVUHvNA$w_}s z*3se}P~7Y}ox+pLrh_~Wt*BLYKaNV**<_ryjX110UD6kQJ0f*YMxewE`!axjeZ?Yx%IOmYxs>r+TM#9=TW7-$sFG0k``HNmd=aHt%#ge8yy;@%sEj z8V`T_ip+k@+>}=I8>JAD{mJ=P=f)(>5qD=ZT&Qp;DrDXIwO`CE&Le`9v_H?+ndn`F zix4CHsc9QdK4h4%}eOg#BT`6-fB`z+J zhSYY6*e_pYi)pdWBp9mQ)WsGhM4WN4zSBqTSlRat(~9;k>DPH&_mxCUa#zNl5@w46 zQWLyPuw+-5rL=A+!iAKhZGcKyTH9A1hqEQr_sr+H!R?^M=Ts$yB@d59?@yJsyv<#K zfXN)^%eZSan1_X>FaCbo!PkoMr7hlEoUvpHb)+M6%Dpz9X&%TM5KIvwl13f&EYv_| z-k;W@wG{gtq8ysg)q}*_!(NNA!W(K;xrol-jdApog4*0JqV{+bD&hi8=Gs|^kauK> z3l?F`{*r^3ajhz!3siH@@2sR#*M&s8;$$STGu~asT`Mqjw$P5lp8N<+nbB=jUCnrH z%4~K@qe85o-tqWF$Q;vbms}tZwSCjC&9d}?9@i^D_Vodc4r95TK^{Hy$MTAdB1v~JQcY4R zycT8rJcyEx)IlobZky)TCRAnS~oYEw0 zucxr=+^|rAd_b8eyzdWA@%i^5)ot^ij91&^!&TpIk)ZQ{jmjX6n=$lB?5_-DAH6FF z4y0Pe{VBqKqP`wiY9x^GFa6vr!@m<0$fU#gI?5fJAUA=j#%<9hHcQ?-7X(8F)xS zQtx1xb9uRM1x-J(*0byl56EVW0~;9$`s&O6KsE5nG$#$3EVfD5!$M?TU;kO09G;!m zCtI>X8usNPiO}lv* zRP@)DmBw;1Wz|AiJ}&zQ;2Sf>Im!dHzvxFlQj6g{;2LhITg3fwQnYsPJ}%vWnM@M7bc zaNK37%`RU9Kl^_2|E-b{%hYO^DLC*4Eh|xFjIWzcaL;RC5Z$HWv)tTobt$_r`0{B zB$Z=93^q!6Y^kEz`aUtwlGT6%`;sqC3ukCDY3W|;*inI=7$Od&_}->G|0jopB)PaJ zO1fOkC2Uby9@v@Z`QWwfVNnnWsa_~>qmY?GDdh`~fltTGI_4_IASx@a%u_TMQ4d4? zvekYqQ+`>4E}z&FK7^Sfj)F!q`LUnLsH`#4SQ6YOgY?|s@Q_%d?4Dd)#sSYLDs}q( z7gpkLw!@1bj{_cA)#-nci{2^&)gepP@=~0!u3lcAn@YHI8PkI!gls`~m-v!K$N*T6 z3PfkQH@6aVi5g>7!6BOQ3c!ynM9Ku*G zb!^LL=*A_)b8<(Y3(z5|w`m8GWh`ACcx7rVIe$VT*``(*&A-RLA{x82*B>St)YOSHoG83b%RticX|%ZbyT&_) zymk`ismLvSt7-RE&#NSFyFGmNcmuy{?q~7dfyH;l1zG%*GZ4sn0D2Ndr)?3oq2+7Z z`t#o06pJ&lBje?|3mrk+e{V0mq5UOUYs+a<{_wLUA2m19XgNPat*FM-((R(}l{c^& zx{J5W1pg#Y{u8)QC4O9F!IT*+bNECm{LCJRaUuMS=?AeX1a0|cvHy1N4&NszP2>YB z4BG&Kjp^?8zdMr_|;-FaY?=}zB%I8AZI5ta8k$>cx8 zKIl#PBU^YCOV4S3e6c)JbDNdtW|O5s!2k^zaoB!Sj0lPA5$2F0X9T9c3~PSbo}RYK z;$H3kGvw9)vcg0BP*;TZT9qjYqmHQJq+3xQlqk$eqLq~*{98>xl^VU%>~#%zN7g}A zOF(N@MkS%KRP~G^Ni+Atj8|>RH~w}@2VbEXE4N_8QEyJoNWUWlg%j!Z#02JU6e82I~(SPoj*RN)F`gz zV3RyS*SJN65Zh_`%B5NtwvUzJFSi$_s=+Ip#T&C$P90;dqkzS;R4Y%)HWf+?#33c5 zI$E>^37EU(;?RmT-G$zx znbaItwnBsJD0uqW&yndOeWs!6cl)6~1}GupP$7C3n{>2kX)k}R%CsdCPHw4)Ga@b_ zgA(sOD`Gey)%EK7Etp(`mQ{~#*z@hbh3h=(?oj)vAax`Bj@OmkPL%LN@aIMWh33pg zu-$8o{MccVpi*B(oiJ_P=~LJVB_={-p)e-rSwYNGZZMry{@iAEB41Ute=Ofsg#{sl z?v{~4O0{xGhh+dPPn?jgBtbAoJJx*uz9Hq2My41TEM#))gYHU9U8-S7&#x#L;fnH; zfJ&xzH}zWp3|;?r5WAVFJ%i=9NU!8En2}O6#Q=m9l%z4t{W~v*Kq>C+3J=)K9nip9 zsmyN!>M}15c~-JREC}lgj>$!t`9+!F3`S;p0_P%@N~t@*N?)lWgh4oS0)(B~Z$TvH zD!-WZuQfq1>Gk=ak=cU0P+Mb~aGcf@s%(|eijcoO@u@B^QTR~{IF==?dl(8-Tt9d2 z-wMdqL~-@^<2EH@`;Xuj-ce5rvVj0~bI32l>DYgc+%*HFLf&~6ZQ<2v_&Sv9jVarM zw5S;adgA*wsUoU-n^F5#CpQZ6C4d>}>U)5F8FpzLf?ut4w%S$%FFkqt+X~ z1|Y9@_{*}yED7IuqTI%c$8H4#a{^MF_(Vr7ax3ttnnPhqqTn<%9gm`}U|cSK*|l5* z=ffxTISRw@UwBn@xIj&NxS^R03j{1H;8S@owlamEz`=_Eh= zSAGzf8qCXyiuvOijy;%dXc(gk`=;f0K6|z5tPRGrO&y1n+qv7eKGp!I<2q83edQIu!KQ6d0d@jz=uX1 zcRlxp{Hk#@j-g4Q=>)8K7qQf_K*Su%2CA|gepXQ`3+tZuM)}I(89-Pp_rlZG8)=_;Ar*2U4Bo*$LH0=R{WGh0lBw4;9eHC~< zV%s}96l2bi5<(rh`!67m8P_Qz4x8)zAv3bMBXp#c)3H>#yin>9QQy=q!7Jv7fD+az zvqGKOxT+~A#9T7YlY+W=v%=0{afrPxv70CpvV7PSYVGqa<(R)oq*%fT@-MaLk}}2H zw|l$zC0qe~Vf)cghMIEptmCA<^eTx9x^@Urdi-gb&khxlsXP1uUMMA8-;>GGiF@Tm?zBnrPQYBT%oD)xnl-|R{#a~N=n8wbXL&7gg`~JxxDp@^qV#q{L;el|Z1h4u^RH=^-aif3fI56(3S_0b=B?&-gH z@DRwoSs_zCv*fz~b^nBKu6IQ88#hJ)P)MU{9I5K*RqZ{j{j8sV#k=ck3VD2Q z;&uuCjQ&lVhb20kq#FkU@j)PU9J0eOcyRaOXD{B83CP8+M&$dJhbi{M+zFnaQqJRn z?(P5xM7)tMb~6azD8WEG*Bj28Es2U-soBjVPo#3sxV`YnMot#9&Lo6tV-SXbf{LZ=W6!={{_ zlL>K+NnK)p+=4)y?iVKay{HY?k$ihYc%#E95O3Xt)+K@!QF2LN+0fsM&HnE9$Vw+l z(lPn!u|>u0(*Shr6-f`fcun7@LY0S5H-BSt&!19C0lf=L%9;|S4zNcPrE3>EJj1wX z{Q3UhUM+c^P8*vymDBVnjuVMv0!SjEXok5O7w@uA0QWu<#lcxk!G6WTNtx5MzgL5X zLByX>x*M9p_9zi96F#AbDGP+k1uLbC!*7I{jWZ%2O6afh<5{I!?A2l7l?ovKwqSHT@naJ_(=^kjkX)a+c~|l(dz2+YB>+>4vvE9GAVXbl_B6Umamw0(VT4%JDDzG^koLWUv9H zBe+NSml>9yqkM&55q7z{c6wL>(B_e`C$*Shapcg+1JC!CTX%QDut3ojSe2%9R_OlN zJ60Nzkv6VaeHcFjIiMJTvar4Ti@Vr*MQ!hA#162P#qlB7s&;QmK8P%tEl~bJdmz2V(D!;HT zg+LuTAF|s|09K1O)BXGTS@3aF;K#-^>e|uU%yNjvrkhHh%RO5P zqf$)7|EyZLB1a{KSRhNa{GlztU#QLKF4)qsin1%cQ85FXYX+J$7q2qLOQV{mo4~LM z504!!+W*V1Q8{scI2x0?Pmq5+alq!^(HZ~`;RpK{d+hE|U*1}vY^bTeBWnq|eAiO9 z&v6?+)@;+Uc>LG>$rcr~cIQ$Htmz@=GzJkptno~OV=LKz|0N*1Wnb(}&N-j3#9cb{ zz1{Yug}*{axiSUaZeJWsy@t@fm`pqRvJJ34iGHO?ARdpwtvadOh2}K*SudZAh!d!k zPyaI6pEUmkL#<$msx@)kw@VO_n#4FSz+03$dS?iuU&jnJKuB^d$+we-AEKWRrRQpPTJM&0#ifk$WN-xe|xAOHxdRSJ)Y=y92&N#E0@gy zZ8y;ar;dq1uCphit0~_gDIobh1q?Gz=yJ!8?Y@x8YVtq1~^2WfA#Y6Ib@}W5fc1h1rhjPwb(4jjGs)EnE-XTPcnvfYSc&76`jJlbJXCbNgHDzcy#(>n>Jz)vQwt##suke`Nc8E{>g@-l0A z3@~J;pk`L^d+j)OSc$vmD?V6cvUUP80)OOM`RF?#(LSDen#sp%wsyFosJf>Qh%*kY zq2=1c4*zvJ@v-M=#HT-o2Gwz~zot?BvYAZAR>p#zz4A}P>|P0dri!?Y=D()9h&lur z&^laQ7LRBNL6nPseHjY?+$KH6{h~6Om@lF^CE6*BLnbYo%V~RbnE&15wnO2Uu>OuS zLmv+7RrFjD{|n~$b>NEG);f&FeV7NhkGuTMInk;+QeyKPyf43`RI%uOe*&!5-w3$O zRHio7R#|a&F==66Hd%B>rWJ)%;`2q&^16H2{swPklN>lRTT{inqEN(=}f(-e^ zVCGP*qMM;sly_N*IkJLAvj9|y*5wFCjhN4k7Ln)O!KORIY!x_cP^pa=5v;OyC@y$7 zw)ih(p(O>shob4z(s?P)&8&$Xr7A3wqese)Qeb?cAx9lGPG1i+trEy-vm%+Yztvz4d~ zwGr0LMW4s2;H@>UXNH`|@-_9Mw=%MKY)jU5o`HJ2)?90d>!bo1NJPV5d=kzNfNOen zJEtl4dI`9`u*V3DlwD%*V>m{tBtM0(L_>MlWT%>8S_fv6JVF~dK(0w3OX?}3S*?+? zgZ)vlHhq0fEBx6{d7ubfiT$U)CvSJ5sj1WwcYU3A-%mVXe-0c&JT>$=pBLF<2_hxU z)X_9j^Fzp5D^2VD+>N!oJd#Ex45Jlo#`vz~sv@wpYLZ9wcL61N4xmElhswSDqGRxSS;mBO3V--de=z(ss~$%(I4g|A1HvEF@oD{IRu9^FW+)-o`N{pdAAV<>GDDmZz6O6B6DNKDCv zt!?5*|N32CQF#$I+191mr>v5}L_j^jZ9HcsNz=$tDZv5b8)$eOR<2h4O0+bcC~~AH zTR4W#T~g7KgEs-P8Y4J7zO{@qNfi$snD3LGX&ksEd|H4};?-PJi@ikdI z5S91dChk(cc%^wKvd1_cbvES7ZkKJ7wwfZ33{Jw*)h7eS73C7Gvl0W?W6SpA(rtnj zxJz|LEBlw@0}vzQpuNN$Lfm1pZieJ%-ys(jvE#h})r0-8qGC1ZYP=8mW<{JFnmyxP zuGZVp3o2_MD=d??Fe-^fSY2_qdH3)0Oh*P@_Ng?!$Q4^(kdmcnmr6NRFVB0ecu*UJ z^4>ksy-p0IMmlVeZ1t)bj7b}XAGSBSrUxNV-O~u|3S{RtXM?T}Lt3O8#)r@=kuT?z zCa&n%sp0!vI(wuZIjkCrHQ(CO)K1U=`>eNvy4@OUxNmq9l8cZfinMLzS0eI2SAscO z;1*rApAi{s3}x*I?bSBEi7BEnNVo@GH7?e6-m5J<#qEQaD?IEON!UkY4})76Ya+?F zTDtAs3bJ(mLpb}SKPL0|S=vavSXCul%GQ?bZTyVtW&G?kszl81+-vu5YmKX?*(0~b z3_38{gV28?>eDB&3;UxQV`Jv2a@?6IgCUD|)(B(W(vQpj$Gai#5FpbRS$mOb=!!7k>!u)TaS`68dy24C}mquj93K{ch zEHbcUX;n29+Kk~pd!$ZC8SJmDO3?w)&S#G+L(tu@s+)BXOR8m&x}iUB49>iLVVHCX z>AZ^#yHnVXh5mNEPA?M^11BIqs7s=PPjb)Z$WlCN?ZDEZ=@ZET)j}?S3!|>*BHlP* zPylL%4)4)&&ZDdC%8_Tfa_CMXYlb&!V;@m4epB(KKW#zwT>Y5dDwVsiCClGgpA$7A ze=O{Ce0@jojo*TvEk)m>bGnK7JT;(U0M*}f9%Jqkf#S1IHsZ?mdtubN-sd?3uU_!Y zag=+u0(%T=xt~ahM@~GNS%Y|f%6+y7kqAV_x#PN}VG%K>8mL62k*Co1^4h>4@{ElJ z_uV+M>q0H`VaCn-zbCSAKJH1u&Ai>sHncpDr@F5zil6&yY{;2>nlQh*1}N)PEu@}q zlM=&_yLNc|=$KDkpBs|84kt4C<9FIla=_O!jn{(6>og&&mPN7Lf#{vlT+Q@dAmR_m z@oVgJcw?$U)|x0&dH9C?QN*bizwD(?=w@`sdkQgL!R3@1;#g-$Y57Ipe}6h*`(t)- zImXKR`Oj2Bvogb;ju^p(q$!ulgiPt4FEKl>NHwRBW!MdoeHcbDN^|aTw$vSA*qxK$ zPxe=X{B{IyC!}{EtFtcbd;`CV*(2;CXxwLV?zAdt(2JpDv%JH}Kl}IISg)fo*ZSJJ z377GpT=H-$u{UrX-_y5|#QrN|E4{vzV@%T8wP@24@q^#4576Wh_2qan6(GnXB-uT} zlU>P5dvhiF=~4(=VV!4PFa2_iwDcDBoxubQBFCCa4SRS=m9>bana!E$o z(;-4P8R&8wu+>eX#Cb$GL*LMydRtHL70xod4!yErKBByQ5A(Chn`kFjheAJau=g*0 zrqd(qYUG!GbVB_)kx+ndYw+9KpYCByu;r_322?^~@{`e^DaQexRRrUeDUA2V7+p}Y z7;0K<^@nhEfY@pr^{mx=iHn6l=pMjPsefbIW7Wsd8-jBw^xv~X%Bhds2>&i|_&{{4 zrzE#9P4VU)rayc`9FOl1@XyQFG#EiQnZx(dDU`Nz6-qjyoe3-1{=cYC3~^49$)(BF zz9w2pQt%iNVI#cfdr>hgj;a_EhWvecvFY1c;urDH#i)TM*gJ*x(In;91nH@rlt1pj zDnbLZYuUCMEOcEdU%P&-Qyo=`#X~*N%T>23m9Upj2bOGgP4dI^b_0{c0+54@b)3@h zocd5FwvDKVwWu-O`i4sUVULCJ{;!F1jcK!t;&^!u6d2c*OIs+V7w(s0ff5Nb1GyA7P}ruM z%eHLF%$7wn*U1V6!;Bop1@^aF{}uw_h;u>>cj z^_>1+6Z_@YbA8Tvp7$wVcu!u#z04ObjEvj!!j@ z_I#3E^8RaYOdXqj$$lp_H zk3(KN-f>$QWgx-G)ANd7MdvTG3u;1UMT~rOU;Pky5&5MRwOIx`Xw$2zmS-Ahu|ZWY z?_swEc@hTmm7uB-dsIl-wQE7;65(D@H3sOk#>kY zZ=~(Q=2+SzyckOdgyuNfE$q?xqt42B>K6Sw@$`&vEuQmp&t2>2ap8wT)-SK)x>#;Z z08b}Sm+0pbXp68eky?aD6X_}8Y$EzBN}@KA4=2Gsmc;dP9#b;MGrN1uOo$a ziGObj?GyVSDaf}W75g-l3VA6N>o=L8f7gV4STdpiO=i^no*DHmnXyh=8vM?s!S6vD z`e{o?-)GaY|9_?YZ=rb58PY^_rdgLQj_pVCZ7*;LZ{WjaV#ISa31EEg&LVd zR%#Y8VC7?E4p~|~io6}l_J9f4Te#=$3J1y1J6&Yypzu^%Vs`)-} z?44?|t4mXwshX^s(@*YPnfVj%zj}R|CttYuuZ2SfDCwW`eI{+MpJZN=cFIroD4X_~ zpDIM0WswFKl(x8_ay5Gm$uuFYq=ub#X@MH@x+L+L>Eny0XoG?Oi_zfuFDvtWU&V^j SPOPXrZM23`jeV=Uy5V0c^6YN_ diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/boards/AbstractBoard.java b/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/boards/AbstractBoard.java index 9c4f89e5..8d401224 100644 --- a/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/boards/AbstractBoard.java +++ b/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/boards/AbstractBoard.java @@ -56,13 +56,13 @@ public abstract class AbstractBoard extends AbstractTransparentComponent - firstPoint.y); g2d.setComposite(oldComposite); } + // Do not track any changes that follow because the whole board has been + // tracked so far. + drawingObserver.stopTracking(); g2d.setColor(componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? SELECTION_COLOR : borderColor); g2d.drawRect(firstPoint.x, firstPoint.y, secondPoint.x - firstPoint.x, secondPoint.y - firstPoint.y); - // Do not track any changes that follow because the whole board has been - // tracked so far. - drawingObserver.stopTracking(); } protected void drawCoordinates(Graphics2D g2d, int spacing) { diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/connectivity/Line.java b/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/connectivity/Line.java index c26389a0..7521ed0c 100644 --- a/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/connectivity/Line.java +++ b/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/connectivity/Line.java @@ -17,7 +17,7 @@ import org.diylc.core.annotations.ComponentDescriptor; import org.diylc.core.annotations.EditableProperty; import org.diylc.core.measures.Size; -@ComponentDescriptor(name = "Line", author = "Branislav Stojkovic", category = "Connectivity", creationMethod = CreationMethod.POINT_BY_POINT, instanceNamePrefix = "LN", description = "", zOrder = IDIYComponent.COMPONENT, bomPolicy = BomPolicy.NEVER_SHOW, autoEdit = false) +@ComponentDescriptor(name = "Line", author = "Branislav Stojkovic", category = "Shapes", creationMethod = CreationMethod.POINT_BY_POINT, instanceNamePrefix = "LN", description = "", zOrder = IDIYComponent.COMPONENT, bomPolicy = BomPolicy.NEVER_SHOW, autoEdit = false) public class Line extends AbstractLeadedComponent { private static final long serialVersionUID = 1L; diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/shapes/Ellipse.java b/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/shapes/Ellipse.java new file mode 100644 index 00000000..61059925 --- /dev/null +++ b/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/shapes/Ellipse.java @@ -0,0 +1,150 @@ +package org.diylc.components.shapes; + +import java.awt.AlphaComposite; +import java.awt.Color; +import java.awt.Composite; +import java.awt.Graphics2D; +import java.awt.Point; + +import org.diylc.common.ObjectCache; +import org.diylc.components.AbstractTransparentComponent; +import org.diylc.core.ComponentState; +import org.diylc.core.IDIYComponent; +import org.diylc.core.IDrawingObserver; +import org.diylc.core.Project; +import org.diylc.core.VisibilityPolicy; +import org.diylc.core.annotations.BomPolicy; +import org.diylc.core.annotations.ComponentDescriptor; +import org.diylc.core.annotations.EditableProperty; +import org.diylc.core.measures.Size; +import org.diylc.core.measures.SizeUnit; + +@ComponentDescriptor(name = "Ellipse", author = "Branislav Stojkovic", category = "Shapes", instanceNamePrefix = "ELL", description = "Elliptical area", zOrder = IDIYComponent.COMPONENT, flexibleZOrder = true, bomPolicy = BomPolicy.NEVER_SHOW, autoEdit = false) +public class Ellipse extends AbstractTransparentComponent { + + private static final long serialVersionUID = 1L; + + public static Color COLOR = Color.white; + public static Color BORDER_COLOR = Color.black; + public static Size DEFAULT_WIDTH = new Size(1.5d, SizeUnit.in); + public static Size DEFAULT_HEIGHT = new Size(1.2d, SizeUnit.in); + + protected String value = ""; + protected Point[] controlPoints = new Point[] { + new Point(0, 0), + new Point((int) DEFAULT_WIDTH.convertToPixels(), + (int) DEFAULT_HEIGHT.convertToPixels()) }; + protected Point firstPoint = new Point(); + protected Point secondPoint = new Point(); + + protected Color color = COLOR; + protected Color borderColor = BORDER_COLOR; + protected Size borderThickness = new Size(0.2d, SizeUnit.mm); + + @Override + public void draw(Graphics2D g2d, ComponentState componentState, + boolean outlineMode, Project project, + IDrawingObserver drawingObserver) { + g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke((int) borderThickness.convertToPixels())); + + if (componentState != ComponentState.DRAGGING) { + Composite oldComposite = g2d.getComposite(); + if (alpha < MAX_ALPHA) { + g2d.setComposite(AlphaComposite.getInstance( + AlphaComposite.SRC_OVER, 1f * alpha / MAX_ALPHA)); + } + g2d.setColor(color); + g2d.fillOval(firstPoint.x, firstPoint.y, secondPoint.x + - firstPoint.x, secondPoint.y - firstPoint.y); + g2d.setComposite(oldComposite); + } + // Do not track any changes that follow because the whole oval has been + // tracked so far. + drawingObserver.stopTracking(); + g2d.setColor(componentState == ComponentState.SELECTED + || componentState == ComponentState.DRAGGING ? SELECTION_COLOR + : borderColor); + g2d.drawOval(firstPoint.x, firstPoint.y, secondPoint.x - firstPoint.x, + secondPoint.y - firstPoint.y); + } + + @EditableProperty(name = "Color") + public Color getColor() { + return color; + } + + public void setColor(Color color) { + this.color = color; + } + + @EditableProperty(name = "Border") + public Color getBorderColor() { + return borderColor; + } + + public void setBorderColor(Color borderColor) { + this.borderColor = borderColor; + } + + @EditableProperty(name = "Border thickness") + public Size getBorderThickness() { + return borderThickness; + } + + public void setBorderThickness(Size borderThickness) { + this.borderThickness = borderThickness; + } + + @Override + public int getControlPointCount() { + return controlPoints.length; + } + + @Override + public Point getControlPoint(int index) { + return controlPoints[index]; + } + + @Override + public boolean isControlPointSticky(int index) { + return false; + } + + @Override + public VisibilityPolicy getControlPointVisibilityPolicy(int index) { + return VisibilityPolicy.WHEN_SELECTED; + } + + @Override + public void setControlPoint(Point point, int index) { + controlPoints[index].setLocation(point); + firstPoint.setLocation( + Math.min(controlPoints[0].x, controlPoints[1].x), Math.min( + controlPoints[0].y, controlPoints[1].y)); + secondPoint.setLocation(Math + .max(controlPoints[0].x, controlPoints[1].x), Math.max( + controlPoints[0].y, controlPoints[1].y)); + } + + @Override + public void drawIcon(Graphics2D g2d, int width, int height) { + int factor = 32 / width; + g2d.setColor(COLOR); + g2d.fillOval(2 / factor, 2 / factor, width - 4 / factor, height - 4 + / factor); + g2d.setColor(BORDER_COLOR); + g2d.drawOval(2 / factor, 2 / factor, width - 4 / factor, height - 4 + / factor); + } + + @Deprecated + @Override + public Void getValue() { + return null; + } + + @Deprecated + @Override + public void setValue(Void value) { + } +} diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/shapes/Polygon.java b/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/shapes/Polygon.java new file mode 100644 index 00000000..142c1029 --- /dev/null +++ b/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/shapes/Polygon.java @@ -0,0 +1,181 @@ +package org.diylc.components.shapes; + +import java.awt.AlphaComposite; +import java.awt.Color; +import java.awt.Composite; +import java.awt.Graphics2D; +import java.awt.Point; +import java.util.Arrays; + +import org.diylc.common.ObjectCache; +import org.diylc.components.AbstractTransparentComponent; +import org.diylc.core.ComponentState; +import org.diylc.core.IDIYComponent; +import org.diylc.core.IDrawingObserver; +import org.diylc.core.Project; +import org.diylc.core.VisibilityPolicy; +import org.diylc.core.annotations.BomPolicy; +import org.diylc.core.annotations.ComponentDescriptor; +import org.diylc.core.annotations.EditableProperty; +import org.diylc.core.measures.Size; +import org.diylc.core.measures.SizeUnit; + +@ComponentDescriptor(name = "Polygon", author = "Branislav Stojkovic", category = "Shapes", instanceNamePrefix = "POLY", description = "Polygonal area", zOrder = IDIYComponent.COMPONENT, flexibleZOrder = true, bomPolicy = BomPolicy.NEVER_SHOW, autoEdit = false) +public class Polygon extends AbstractTransparentComponent { + + private static final long serialVersionUID = 1L; + + public static Color COLOR = Color.white; + public static Color BORDER_COLOR = Color.black; + public static Size DEFAULT_WIDTH = new Size(1.5d, SizeUnit.in); + public static Size DEFAULT_HEIGHT = new Size(1.2d, SizeUnit.in); + + protected Point[] controlPoints = new Point[] { + new Point(0, 0), + new Point(0, (int) DEFAULT_HEIGHT.convertToPixels()), + new Point((int) DEFAULT_WIDTH.convertToPixels(), + (int) DEFAULT_HEIGHT.convertToPixels()), + new Point((int) DEFAULT_WIDTH.convertToPixels(), 0) }; + + protected Color color = COLOR; + protected Color borderColor = BORDER_COLOR; + protected Size borderThickness = new Size(0.2d, SizeUnit.mm); + protected PointCount pointCount = PointCount._4; + + @Override + public void draw(Graphics2D g2d, ComponentState componentState, + boolean outlineMode, Project project, + IDrawingObserver drawingObserver) { + g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke((int) borderThickness.convertToPixels())); + g2d.setColor(color); + int[] xPoints = new int[controlPoints.length]; + int[] yPoints = new int[controlPoints.length]; + for (int i = 0; i < controlPoints.length; i++) { + xPoints[i] = controlPoints[i].x; + yPoints[i] = controlPoints[i].y; + } + + Composite oldComposite = g2d.getComposite(); + if (this.alpha < MAX_ALPHA) { + g2d.setComposite(AlphaComposite.getInstance(3, 1.0F * this.alpha + / MAX_ALPHA)); + } + g2d.fillPolygon(xPoints, yPoints, controlPoints.length); + g2d.setComposite(oldComposite); + + // Do not track any changes that follow because the whole board has been + // tracked so far. + drawingObserver.stopTracking(); + Color lineColor = componentState == ComponentState.SELECTED + || componentState == ComponentState.DRAGGING ? SELECTION_COLOR + : borderColor; + g2d.setColor(lineColor); + g2d.drawPolygon(xPoints, yPoints, controlPoints.length); + } + + @EditableProperty(name = "Color") + public Color getColor() { + return color; + } + + public void setColor(Color color) { + this.color = color; + } + + @EditableProperty(name = "Border") + public Color getBorderColor() { + return borderColor; + } + + public void setBorderColor(Color borderColor) { + this.borderColor = borderColor; + } + + @EditableProperty(name = "Border thickness") + public Size getBorderThickness() { + return borderThickness; + } + + public void setBorderThickness(Size borderThickness) { + this.borderThickness = borderThickness; + } + + @Override + public int getControlPointCount() { + return controlPoints.length; + } + + @Override + public Point getControlPoint(int index) { + return controlPoints[index]; + } + + @Override + public boolean isControlPointSticky(int index) { + return false; + } + + @Override + public VisibilityPolicy getControlPointVisibilityPolicy(int index) { + return VisibilityPolicy.WHEN_SELECTED; + } + + @Override + public void setControlPoint(Point point, int index) { + controlPoints[index].setLocation(point); + } + + @EditableProperty(name = "Edges") + public PointCount getPointCount() { + return pointCount; + } + + public void setPointCount(PointCount pointCount) { + if (this.pointCount == pointCount) + return; + int oldPointCount = Integer.parseInt(this.pointCount.toString()); + int newPointCount = Integer.parseInt(pointCount.toString()); + this.controlPoints = Arrays.copyOf(this.controlPoints, newPointCount); + if (oldPointCount < newPointCount) { + this.controlPoints[newPointCount - 1] = this.controlPoints[oldPointCount - 1]; + for (int i = oldPointCount - 1; i < newPointCount - 1; i++) { + this.controlPoints[i] = new Point( + (this.controlPoints[i - 1].x + this.controlPoints[newPointCount - 1].x) / 2, + (this.controlPoints[i - 1].y + this.controlPoints[newPointCount - 1].y) / 2); + } + } + this.pointCount = pointCount; + } + + @Deprecated + @Override + public Void getValue() { + return null; + } + + @Deprecated + @Override + public void setValue(Void value) { + } + + @Override + public void drawIcon(Graphics2D g2d, int width, int height) { + int factor = 32 / width; + g2d.setColor(COLOR); + int[] x = { 2 / factor, width - 2 / factor, width - 4 / factor, + 3 / factor }; + int[] y = { 4 / factor, 2 / factor, height - 5 / factor, + height - 2 / factor }; + g2d.fillPolygon(x, y, 4); + g2d.setColor(BORDER_COLOR); + g2d.drawPolygon(x, y, 4); + } + + public enum PointCount { + _3, _4, _5, _6, _7, _8; + + public String toString() { + return name().substring(1); + }; + } +} diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/shapes/Rectangle.java b/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/shapes/Rectangle.java new file mode 100644 index 00000000..e1ed568e --- /dev/null +++ b/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/shapes/Rectangle.java @@ -0,0 +1,161 @@ +package org.diylc.components.shapes; + +import java.awt.AlphaComposite; +import java.awt.Color; +import java.awt.Composite; +import java.awt.Graphics2D; +import java.awt.Point; + +import org.diylc.common.ObjectCache; +import org.diylc.components.AbstractTransparentComponent; +import org.diylc.core.ComponentState; +import org.diylc.core.IDIYComponent; +import org.diylc.core.IDrawingObserver; +import org.diylc.core.Project; +import org.diylc.core.VisibilityPolicy; +import org.diylc.core.annotations.BomPolicy; +import org.diylc.core.annotations.ComponentDescriptor; +import org.diylc.core.annotations.EditableProperty; +import org.diylc.core.measures.Size; +import org.diylc.core.measures.SizeUnit; + +@ComponentDescriptor(name = "Rectangle", author = "Branislav Stojkovic", category = "Shapes", instanceNamePrefix = "RECT", description = "Ractangular area, with or withouth rounded edges", zOrder = IDIYComponent.COMPONENT, flexibleZOrder = true, bomPolicy = BomPolicy.NEVER_SHOW, autoEdit = false) +public class Rectangle extends AbstractTransparentComponent { + + private static final long serialVersionUID = 1L; + + public static Color COLOR = Color.white; + public static Color BORDER_COLOR = Color.black; + public static Size DEFAULT_WIDTH = new Size(1.5d, SizeUnit.in); + public static Size DEFAULT_HEIGHT = new Size(1.2d, SizeUnit.in); + + protected String value = ""; + protected Point[] controlPoints = new Point[] { + new Point(0, 0), + new Point((int) DEFAULT_WIDTH.convertToPixels(), + (int) DEFAULT_HEIGHT.convertToPixels()) }; + protected Point firstPoint = new Point(); + protected Point secondPoint = new Point(); + + protected Color color = COLOR; + protected Color borderColor = BORDER_COLOR; + protected Size edgeRadius = new Size(0d, SizeUnit.mm); + protected Size borderThickness = new Size(0.2d, SizeUnit.mm); + + @Override + public void draw(Graphics2D g2d, ComponentState componentState, + boolean outlineMode, Project project, + IDrawingObserver drawingObserver) { + g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke((int) borderThickness.convertToPixels())); + int radius = (int) edgeRadius.convertToPixels(); + if (componentState != ComponentState.DRAGGING) { + Composite oldComposite = g2d.getComposite(); + if (alpha < MAX_ALPHA) { + g2d.setComposite(AlphaComposite.getInstance( + AlphaComposite.SRC_OVER, 1f * alpha / MAX_ALPHA)); + } + g2d.setColor(color); + g2d.fillRoundRect(firstPoint.x, firstPoint.y, secondPoint.x + - firstPoint.x, secondPoint.y - firstPoint.y, radius, + radius); + g2d.setComposite(oldComposite); + } + // Do not track any changes that follow because the whole rect has been + // tracked so far. + drawingObserver.stopTracking(); + g2d.setColor(componentState == ComponentState.SELECTED + || componentState == ComponentState.DRAGGING ? SELECTION_COLOR + : borderColor); + g2d.drawRoundRect(firstPoint.x, firstPoint.y, secondPoint.x + - firstPoint.x, secondPoint.y - firstPoint.y, radius, radius); + } + + @EditableProperty(name = "Color") + public Color getColor() { + return color; + } + + public void setColor(Color color) { + this.color = color; + } + + @EditableProperty(name = "Border") + public Color getBorderColor() { + return borderColor; + } + + public void setBorderColor(Color borderColor) { + this.borderColor = borderColor; + } + + @EditableProperty(name = "Border thickness") + public Size getBorderThickness() { + return borderThickness; + } + + public void setBorderThickness(Size borderThickness) { + this.borderThickness = borderThickness; + } + + @EditableProperty(name = "Radius") + public Size getEdgeRadius() { + return edgeRadius; + } + + public void setEdgeRadius(Size edgeRadius) { + this.edgeRadius = edgeRadius; + } + + @Override + public int getControlPointCount() { + return controlPoints.length; + } + + @Override + public Point getControlPoint(int index) { + return controlPoints[index]; + } + + @Override + public boolean isControlPointSticky(int index) { + return false; + } + + @Override + public VisibilityPolicy getControlPointVisibilityPolicy(int index) { + return VisibilityPolicy.WHEN_SELECTED; + } + + @Override + public void setControlPoint(Point point, int index) { + controlPoints[index].setLocation(point); + firstPoint.setLocation( + Math.min(controlPoints[0].x, controlPoints[1].x), Math.min( + controlPoints[0].y, controlPoints[1].y)); + secondPoint.setLocation(Math + .max(controlPoints[0].x, controlPoints[1].x), Math.max( + controlPoints[0].y, controlPoints[1].y)); + } + + @Override + public void drawIcon(Graphics2D g2d, int width, int height) { + int factor = 32 / width; + g2d.setColor(COLOR); + g2d.fillRect(2 / factor, 2 / factor, width - 4 / factor, height - 4 + / factor); + g2d.setColor(BORDER_COLOR); + g2d.drawRect(2 / factor, 2 / factor, width - 4 / factor, height - 4 + / factor); + } + + @Deprecated + @Override + public Void getValue() { + return null; + } + + @Deprecated + @Override + public void setValue(Void value) { + } +}