From 44c358af2b79ca05eb9e64d5934bc6682ba01698 Mon Sep 17 00:00:00 2001 From: bancika Date: Thu, 27 Sep 2012 14:33:32 +0000 Subject: [PATCH] Mirrored text for PCB artwork --- .../diylc-library/lib/diylc-core.jar | Bin 207975 -> 207960 bytes .../org/diylc/components/misc/PCBText.java | 280 ++++++++++++++++++ 2 files changed, 280 insertions(+) create mode 100644 diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/misc/PCBText.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 b66f5d78aa3326e8028fa967d2d1c9f53eb8d324..03c461d35243f8de63d5b3386d56b78984b4cefb 100644 GIT binary patch delta 11533 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 delta 11455 zcmZWv2V70>|L>gBy6ttl?Y);4X;Fldl+qANgtiuiaw`#8)h&;THknD$(zY8?A<>kC z($tRr&pFrc_xs=Px9{umd7jUBf5tP;bI$#K_`o&vfs4z|8e`^Q!vAJ{6S-8;8Q(;M zA^0y%29d$ZIz$Pb^`-eBnm9>Cba2vysN-ZFF~Er~s*e*NL;`4uBW$#DCfN^=l;i>s-UQ3R)&!qPaU zZKW*W!_6WbtT=U&+DnKlq$vb#m$4_PvfO!sK9Wx)P%V`l37V-giSo?)8k!fovrf98 zOibsQX$Ug~+*&{di(jelC6qL^_R*D^71%K|7A7WEE}FX#1z0YkGH10-Je>vHX@ff=b%HAaUTHzt+(vQ9jzJ%UWvq_JfaxJTDvT z%?qxZLDogvi|f95n0-A#W`7Y=wyc#^mf3V`dTRQY`sS|Hv!~76?>+KyFnH+XpG|(W zv!Zidl&t2F2R;V=?}plEf0_2)7@MDo9Hu=B8P(mXR98K(yL{v|wPg9~R3>%u{V9qY z8l|+fjh&~~ee<}pxyVWP(^RuK_j!Yu-z0PXrIq)WZTL=bQyX(@23mWkzDbwOZwmOM z%D&9CT%Swj-Zph;%a`7x3(_XPZKZw#=4H*gW$n7Uyjr)%@;ru>hac zb*q`3`_boaF6Yk`YQ>(LDB{zqyIxsxp5*qrd6Lg9dTik9X4bb;A2|ZV){Xm~AHSGV z8Adj64r+fH?!0Kg3jW-viFDL#Dd^|6k==EnBRE9Twj(gabbUu~@x}aRjUAk}9c(1t za@Eh@7ex!BHyLR6Yz)Xj{J5ze;w5o~n88HDfo1Nok6V7Pczn{iZLi;h`6Ie1_e`oT z8}z(Peq7f1ysP5mhm%#ITHy{%rN!})0yB$;<_3L+1)oZm(OwH4`r4{R3bQU_%Wkqu zx_$TO_N3Fdm5+p$$oDzLCap5{xDs67rRuvczGXtrg8lGei%+v9)1lLT`OVbbi(jzd zT$6xRCEwFB{LEDz_5I#y^eJFu^xN=ym#*u|abg2MWHsN5w9_^ZoRJgXXZ6f$#Nm*G zSDe?_2choPcQvK=Lu}b%+#Lkgf7OmTwCh61nDo1MvEDLGHHuFPK!;aIpxGtqqHuX3 z-fyqUl0py2+DO^yAC!CMxNkd+SC*>rlK-Hmg{^+cC+(cC?)R0phhQ=JC!TF(K9nxy z{8BjbhQy~D8>ydwP5%`4!3|7x16D^R`qxj3makGCZ1q@qK>tzcm*MUkm(KqnDS8MP zI(T=|c*kshEGAzu+~PRDx6IA_$BJgSRTnG=j@Y|xN_bUeXr74kH+||M+QA2x15{h zZVWp0Xyx4y1?l_x&o^$G&ht)KMf$w@8CI!{S?Q#}TNA}xE zwKr+K5Cw1VmnBQLG>%ks&g?Q*_ftsnN}fv*yzp@Rz3aK=bEkePKmKW}a#}MqzbX~E z$mZ@qy``5XdXDTpHGBJP^)|zex8>h@imvf@X^cvFn)JD6%a1g&yZ?eq{X=r2n^OHW z^_u#D=XJ1Z99F(X937h1S5@42&K_jw(CnZqeeS2%P<>Q}ia>zLwyY+qE7R#YRHFpt1%zxy}9i@CM{^K@9 z@1i|Du_o(YjD*aQr&Uv*^kPJgCS(mNmw<(C^PsLH z7MI`bQy$GqtlMeyBsKV2sv;-f?iZILw@PcbS<4cQHEGV$OIMY#=L=Xpd9*k4TjZDr_jzQO90e0_Am*w~@YH*$Rre^T^nnKyy%aO zitFb`Z0l$!x4xo8h(Uhwp|~5ja#;s^27fMy7z)j&8uMK{%X~CPN&NI)c9W<9l-GX! zG3lJgR(<|+i|CvK7e+Lj4M^DjR%CU?_=(f?^hNba`M7#KyjZ6WT1+8SOKAXg3vI8<$B5Ut!?BC%0#lP`{hfk#n^xJ_CiNqT0m? zq(YQMsxB9mej3NTrOpabT`k}5d}T-{+Wpym(vr~{jXsht`_-6sRN7-g>iUzXFUEtS zXkZ1IUU=B|-I?=`?)B&# z+tXWi%|D!S(Ryxo^!@%}w71sa)|c{1@9DJnk0jCF`mt^2Uz5iLPPq4dn&Zj*#LN7L zuh*RFVt8=Ncyr#<_I|V3_TxO+BV|E{Uf$)hauI5J=&~)VGRs7F$lo$GJMi#^**A&} zcl;i7rSJP1X+;TBs_*i;*?1xSTVGb1oyI%1=`ZZ_hqBugsjZpP;qi!wa5^; zK+N$3^3438brq1cE6TY=KrzM16wL#?hM~?U9+rNPN+)+)7w;f%X3{*m<3s$KPjddjelDr=4KH8x z&DLk_eSUi9{`J%giO;5gbAX!8cV$%{_fjH6lSSD_eEyVO?P{rZkSI+ql3Gl*-CN=D zLZ`EC-_7l|b4h-7$Aj)H=4>~#u}nTP^7Kg}ZU3eH^H%b`5|wc+KId|HxM{{LHmu%G z3ng2l6}S92vSzl!_^6y`ezA>d_wUfT^84m(u5z;BFQ-pPy`kPNEl%q1InNthb&W>z zE#}o*%(jwXFa31;m-?`C6BpCt;3FET=MrcB6fLd%==mdHGV@>+De3*W+L_PqcVL=} zu70m(Yeo+0iC%1J8r1#h84hapDKDsq7 zj+}MX8F+W#ah^c2+Yq&p)6%66DfKL1ad+t!8JB^KxP?HBUIFFUD5Bw|K$$UQgq@s&~DEzkY2mT(EVSb2}mL z@;kP@eIROKzkUv23!39<&L}$3&7v*-nrYRXTWn5uM)BJ%(aJ16)QQdG-{VXVn*I3n zvsvSylkNH}50038S&Q8h-h6LUuAa94@%7s2qSL2^nrzMIy>Iq;Twi%NE!M0sY$I-Q(A`5%tZ{fqjPss7ghXTpCw?bzAsyUaDoOzb!K{RnkS}I`Ph|SPi|tr!}o_ z$IVav16O07Ihtn*X9nhj&i30f%h#e6o3kxBF0Y~pMsy18`lJ2UVkt&BY%KSC_gQb3 zj2Lyf!<%GQvy7!PpH(Q=WtmP4RAEt<>)#tAFrMb^rE+OYU4ziwV=M(!AFUmREEg`B zpQ*SbJ#?=lp}AgB)yqeiX6MYL#_!OoA?ML=@4h=sDCQzdrD=cdRG{X%kT*{0`c`*5 zeP8&VYj=I2e51d@+ofINwsE|&)r(=PO-YeInRi;gT@bIY6S|u&ve)^hz#9L(Uc0S4 z#nSGap;~ji7aU!@lpvk3QQV#yh@Cyeoj$aoe#)|5KbItYctGF6*Lvm!&wW*E>p|32 zRGZs>_HL@Q)mVeXrXA#Y=i{!(ac9L)uEC^V2P{9@=bsq*_bmi9FEpJm;CzBhl}L_JxD&+b2~I7YKIw?{+pKIX*lgPo1APGC!#$ zmHaU-{mz+Zi|@~Vv>%QL* zbdlfnLFH;Qoi@H(*5YcY#s1#5T^oWeGptm+Z)%$EQvdd0ZQ+fNL8p0pmSvhk zBnP7R6}}N2i|msvYZGlu9v9xoo)LDy@!i+7AC_fBCHh-#X|D?XkniZ&yE&RFRj~KM z%irWrRa?g|#azvwIO1i*>m067HimYYpIul(sxEVkS+Sd$SIA-Va$loBmu(cA!s>c2 z9v&h7B<4*mPu|JYovc10R>RpNAg#ENJG6RGx{BSAPsJi8;Muv*=@g+DtMLS8_ryMt zV@y}Rv2%{?lmLHG_(itH>UDVnP!9pCRlV0-rQ!SEPYAYI=%L&i*dS@=0S ze#LU&V3ctC`9~W0W+DnRCr9!WYTw*zSzTsZOXCSpoqp*wSy7mOpx#7l#5-Jx^XseH zO1D3z?|x*4EDQwJf7D}9zGj*dD!gTdHp`Rb?Yxh-+tzur<(}0pdwu)D2UXdml+#NN zSyHw;m6$T@-S7A(3tbJGY01x+U6jk;lS#Fa@-WggE6+{Hy!ShalPcvF*hl6${(4RH zDVrCPvBl%f8u!i>-97bX+X}-%UAC{+Vt$Xl2K{6<*Y(;Zln%4#4K|^=A4zQAcaEze zyC-(6ksdmd{=D>_52fGu*Y5)4{rDMW1m6xN( z-%=xMw2k|Vj;Fsqu2dDzRi%5*jlcak+lfN96P8obb<#p|uKfbPgUoXrSa0__1(k!kJ<4mx>6^WB4L7M=Yt=1oHz`g}#cb5j^m@8Bd(@Uw{J~r99``1(1Z1xG zm!9V}@_VK`4V!Mr1_`_^&KfI--KJ)qFLRXjygE(0$$IK8OS|j%2aWi?mU}ZRuB@u! z;QP^MvMaXl5b~cdH0-9a)?nHX;j79qZL>~64{1-ofwYXMo8C0?IUPzOf?DT?>m2<7*Aa6AZSA(D}mmYBub2b zCKFzA#Q-ssNKGWf_tQ9t@#CunL~y=Yi3I(VJ3;U#ZgdlRZ*CGFcZyHlNyYf_k0Ibs z!S^Eg8Rj7T%A!FtN5yIP?{I*}Y#0a4?LIFx#*8EQ)(7G1F`w^|cLu~b>2#X;MYxt) zJG2E@tx%{Gk&c*rMxjPi%~a){?+jm6m+5Jux0~dpqx~wQc*wXnBIIjR(4*PwaiDy$kDI?f8;zoU1z2V^o`SeoIwhPkA1p?UTH7nIX=02xk0E&_ho0q{;EBGx?bN`?t5~E z%wnAiugSgUF6v3Ry2 z_UP(@&r}oE?Oc1K)RyNDn?K{b6jx3P8Xswm)Mj3GmO9y?k?c1-wo%h`XYrO3ezZ7S z-y3_jt4$o}==+uvbi&nUt6@=+ME-0$+vyW3ucWFeQA=3^aT04s=J;myZ?e=oP@+oQ zdhFvBj$Oztv+x0`Kjd2CYItV&3rx#;jmILmbmBs&JX&==-=mZlNIjr-Uwym|dI+56ki+jmGx5D`xv%361?E>2c^6_9ZOld7z{LPuqyhJ$lus=F&1F5r;#aF^BEDJ9)jlBjcb=SK#`oOHm(TDqZK)v-ALcaD2y=rLy4sJ{ zJ}&q@wz#S12F5)D_l#MR-s2v)XF7q76e3a#K98Ze{LG*(hSSP#iUb`PCJ}UWl$)Tx zCq$WXxyXzIq3=Ie#s|lx$|U3pu25RXg`6WgTltV>T&2`j5LqNRTPVm=j0bn#fThiL zL+2k*z(0*pN>_>_g!@t@DFhxJ(CDEIvXL-al1E+>ohD`E4$(QPjwBEr&J{=!p`59M zm=To|5A`Bs$9EwVyf&rDdyw;V4{!Vr zTG22jri)-t2_gb6kTJH>EuKgop+9*LxlMF3e35CwaY_JUNpO0D5POuErk_)r!X_ZX z2&ki=B47sv<1Fu7#V@QB&K201>_9@C7OWzAUZ5Ggqt4B2Gh9)b_j)m zgbA3g!DU38E&v%j^EN<%83=NOg0NJ?nTX=eRb&l;%6AW0Pr@^EEJ5lCk!S@1&t}NE zTZPmR9sfE+kPdhInbW8kgd>Bj0GM=?IL2RE@)S`Z)Vf|E4n#+%5s4%^g|87$q9fdf z$PyjHcZe!NWS>w-Ixr4rXqcEGutO3PC{2BjEYPdfiLev;nO#UQ-L*!gvZfGp&5Nff zT58aTz|ZS2O7{We9?{_$Lf+Ds;L9z>xBf1{>;QxUq@-b(BE!fKfsKqJF@(XX3FHJF z`_Asq2Vx;Mm8cR}md4miwWpDbgj($!GET?!KRCgTLA5_9nBYPwAVCJsSl<$y1U!(j zW#m4Bcd`(44}FG{Q$m>6LIWc@uD>kA)nrDk2>oz2w3g5}BB8hFad5wVJr)l2Lx>eo z%Fc~mAXMRsOd&d2Lg;CtQ$j)giH@Q;bcTD4lSJ1OoF*9*5S{%B(45$l zznFnX2`tE%49WsB6)+O;d4~u90~Pca4xy=v^56$isi_+JlIXB$pmzAtQ@TS7C2k9) z-r6Xc;6&-7bwp?VO7srV88<+uxpC#84d`T$(`5aN0Tne|3Tsn?zUPa^p$V6sN}~QFEMDO`^s) zU6@2S;dK2JYJpRzCjqWcp|bekX<1s54Hpf5AdQI`s?PjMKH#s0~gp zPNQ3J+BJ<@<5YD9b;4=%3~Gpcby5O{V2`(o{ zSNul3ahmoUb^CumN&)l_Js#ITs06Cv4HB17X#oDvi&KF!75oS$ZI_=okDWDw!gCa^ zJp6_VWR{^^D3ETndl^-d!Ebm+Ej}H24^<2iCMG3F|MQm@Z5m8-3RVGbEEpFaODAsb z96}2WQB08_SSf0l1R8socI~iYia(um9FsuKrd+}BA0ty5;UG2T8!-Ul2vpt{LGy`F z273@XWB}wLJm4IHt&+xLIa`y1h{Ho^H8T^F*na|nG%xxy=tD47JPb}0;;f9KZH-z% zghnKBx-E3{G>M7Hjm*R(!C;sc12sj!RTLAztqY+w;tHBk4FByDEaG6_F4B-o66%cA zGBh7Jfe90u`v>Ju+rt{%f;CWN(7fJ=YhLEW*uX;$`W|@60sR@Z{N+pHVM%jB z*3VYZ%7q95JA437>HwU!^Z@jFkXiGM&OG&(nT0dI4iiio*9Z^8#=)Hyh>yQ*fessBW30pk;N!-0h{zsE zq=bKkMd*i(!VnqLB=F$I6mkD&xS=cY89Y-VP{EA};>;GD88}C0B0Tg+C3qlHjRc~2 zVES8mFac>i65)oq5NGHBuQp@)PXUz&Q^w(LLQ8BL9|HCWB4p47O>yox&b1dLxZ*&K z7p^PFUCj%*wiE>HrXbS)%KLw}c_t=NhLp%4n-^2T5gH)^q6)t8(w+13!C@)T;=`0> z@qpX+gxLWYY!YnZ3=qrm2uL)76E35GkQg2o5H$@G~`PmMeB!eTK6@;!3&|ZOX{L>MYAEM>x{7-`wl<{L^JhK*D^hN*w zi?~+)J5*@_sMc@r|J6vV5q{t;fN>F#ef~H|BEy|g1RG-sP8tzb68{XU7Kdy#BZQ)0 zP5|S@;~@#c6|u_#1PEdj5M_Zd|I^G4Dj=(YzaXZI>u2Lb15hmpA8+_nc$0_xqv13} zz{dD^iv@y0@bLz1)(AlxQ?L^b2^(4C6R$Qw{dKT0t^jY4D@0!b9&*rT2>cMj)QEho zBr?ngpneZ*jBE77E(Dz4g@}T!Wcpn0B12OEj*>Cra&`v}QAJO1jEsqa0Wy7e%t0nL zeGmcnec^J}5QgV2o{d?Ynb>1E*Cnt?G0b;1@DRo{@oW-=A^a6^PZ-_-;II!4vClyW z7!N|kff$7zg9-&YT@?xvC~%{>QvSk6Rqj~#4JLpm!kD-RxJ02RUXEKvMc|ecFiOGr zaVLlfWNy9yYDF+fU?PIy?^$3g&Xh>NnNlEL1Rk4s3QsC4eP6-wpTfrYC}OAKs;h9* zIoy@_ih%yBh|ItCHt+|J z*x;Q7g-wRRL=a4fVk?Lu4-W4zlIL!7G@Dry`VR#iAi3CO_N^&@NY*HSEEd?9nGpYDBp{oQU@Ovc0kB9MNqHP3M1gvd?hfVWe z(I;GF^6oDZ2tDJU~!EkSGK18PL})oIAPvm-|Tu6CpOi zhh)tqb+`ePU}MZU7XjI_m>^J+r7r^$S(qUUGo115q$DH54T3qQXE=5fj6?wu+F;p+Rt!!CDQJ4O~^E8{Ec4 zyR`m_#uYI^S^UK+pgd2d3C_vbuSJzqzo@@|&j}k;UsY`IRz&#~8?qi(0 zaV5c3x~vQ@LpW?$*1EU%xS5y|;q#vH+B*ewlriFcK0p~-{@6fRk^%QdR0ve7VO(_k zzE-xU0!$1i%RHUj)FVOUzJ{+HK$-4<*M{*zQ!eKr~WJ9W!S2)+_LyPGy?zE zvcINmz)kIMby==yJQjgZ*1YxqtZogsq(-l96Ew$Udr+{V2Yw0Q`1`UVq7F|cRj^VW zK1J|(63&*2wu8Ume1YEr7$4Qw!AW&YlTeaf#BQa)lo#O|Vcf?$phX?-V;Jo+1jewR f@Z0iFR6*Fzng!mdn3$^Je@jM8OpX)Koaz4ncp+$; diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/misc/PCBText.java b/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/misc/PCBText.java new file mode 100644 index 00000000..a28ec151 --- /dev/null +++ b/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/misc/PCBText.java @@ -0,0 +1,280 @@ +package org.diylc.components.misc; + +import java.awt.Color; +import java.awt.Font; +import java.awt.FontMetrics; +import java.awt.Graphics2D; +import java.awt.Point; +import java.awt.geom.AffineTransform; +import java.awt.geom.Rectangle2D; + +import org.diylc.common.HorizontalAlignment; +import org.diylc.common.Orientation; +import org.diylc.common.VerticalAlignment; +import org.diylc.components.AbstractComponent; +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; + +@ComponentDescriptor(name = "PCB Text", author = "Branislav Stojkovic", category = "Misc", description = "Mirrored text for PCB artwork", instanceNamePrefix = "L", zOrder = IDIYComponent.TRACE, flexibleZOrder = false, stretchable = false, bomPolicy = BomPolicy.NEVER_SHOW) +public class PCBText extends AbstractComponent { + + public static String DEFAULT_TEXT = "Double click to edit text"; + + public static Font DEFAULT_FONT = new Font("Courier New", Font.BOLD, 14); + + private static final long serialVersionUID = 1L; + + private Point point = new Point(0, 0); + private String text = DEFAULT_TEXT; + private Font font = DEFAULT_FONT; + private Color color = LABEL_COLOR; + private HorizontalAlignment horizontalAlignment = HorizontalAlignment.CENTER; + private VerticalAlignment verticalAlignment = VerticalAlignment.CENTER; + private Orientation orientation = Orientation.DEFAULT; + + @Override + public void draw(Graphics2D g2d, ComponentState componentState, + boolean outlineMode, Project project, + IDrawingObserver drawingObserver) { + g2d + .setColor(componentState == ComponentState.SELECTED ? LABEL_COLOR_SELECTED + : color); + g2d.setFont(font); + FontMetrics fontMetrics = g2d.getFontMetrics(); + Rectangle2D rect = fontMetrics.getStringBounds(text, g2d); + + int textHeight = (int) rect.getHeight(); + int textWidth = (int) rect.getWidth(); + + int x = point.x; + int y = point.y; + switch (getVerticalAlignment()) { + case CENTER: + y = point.y - textHeight / 2 + fontMetrics.getAscent(); + break; + case TOP: + y = point.y - textHeight + fontMetrics.getAscent(); + break; + case BOTTOM: + y = point.y + fontMetrics.getAscent(); + break; + default: + throw new RuntimeException("Unexpected alignment: " + + getVerticalAlignment()); + } + switch (getHorizontalAlignment()) { + case CENTER: + x = point.x - textWidth / 2; + break; + case LEFT: + x = point.x; + break; + case RIGHT: + x = point.x - textWidth; + break; + default: + throw new RuntimeException("Unexpected alignment: " + + getHorizontalAlignment()); + } + + switch (getOrientation()) { + case _90: + g2d.rotate(Math.PI / 2, point.x, point.y); + break; + case _180: + g2d.rotate(Math.PI, point.x, point.y); + break; + case _270: + g2d.rotate(Math.PI * 3 / 2, point.x, point.y); + break; + } + + // Flip horizontally + AffineTransform tx = AffineTransform.getScaleInstance(-1, 1); + tx.translate(-2 * x - textWidth, 0); + g2d.transform(tx); + + g2d.drawString(text, x, y); + } + + @Override + public void drawIcon(Graphics2D g2d, int width, int height) { + g2d.setColor(LABEL_COLOR); + g2d.setFont(LABEL_FONT.deriveFont(13f * width / 32).deriveFont( + Font.PLAIN)); + + FontMetrics fontMetrics = g2d.getFontMetrics(); + Rectangle2D rect = fontMetrics.getStringBounds("Abc", g2d); + + int textHeight = (int) (rect.getHeight()); + int textWidth = (int) (rect.getWidth()); + + // Center text horizontally and vertically. + int x = (width - textWidth) / 2 + 1; + int y = (height - textHeight) / 2 + fontMetrics.getAscent(); + + g2d.drawString("Abc", x, y); + } + + @EditableProperty + public Font getFont() { + return font; + } + + public void setFont(Font font) { + this.font = font; + } + + // Bold and italic fields are named to be alphabetically after Font. This is + // important! + + @EditableProperty(name = "Font Bold") + public boolean getBold() { + return font.isBold(); + } + + public void setBold(boolean bold) { + if (bold) { + if (font.isItalic()) { + font = font.deriveFont(Font.BOLD + Font.ITALIC); + } else { + font = font.deriveFont(Font.BOLD); + } + } else { + if (font.isItalic()) { + font = font.deriveFont(Font.ITALIC); + } else { + font = font.deriveFont(Font.PLAIN); + } + } + } + + @EditableProperty(name = "Font Italic") + public boolean getItalic() { + return font.isItalic(); + } + + public void setItalic(boolean italic) { + if (italic) { + if (font.isBold()) { + font = font.deriveFont(Font.BOLD + Font.ITALIC); + } else { + font = font.deriveFont(Font.ITALIC); + } + } else { + if (font.isBold()) { + font = font.deriveFont(Font.BOLD); + } else { + font = font.deriveFont(Font.PLAIN); + } + } + } + + @EditableProperty + public Orientation getOrientation() { + if (orientation == null) { + orientation = Orientation.DEFAULT; + } + return orientation; + } + + public void setOrientation(Orientation orientation) { + this.orientation = orientation; + } + + @EditableProperty(name = "Font Size") + public int getFontSize() { + return font.getSize(); + } + + public void setFontSize(int size) { + font = font.deriveFont((float) size); + } + + @Override + public int getControlPointCount() { + return 1; + } + + @Override + public Point getControlPoint(int index) { + return point; + } + + @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) { + this.point.setLocation(point); + } + + @EditableProperty(defaultable = false) + public String getText() { + return text; + } + + public void setText(String text) { + this.text = text; + } + + @EditableProperty + public Color getColor() { + return color; + } + + public void setColor(Color color) { + this.color = color; + } + + @EditableProperty(name = "Vertical alignment") + public VerticalAlignment getVerticalAlignment() { + if (verticalAlignment == null) { + verticalAlignment = VerticalAlignment.CENTER; + } + return verticalAlignment; + } + + public void setVerticalAlignment(VerticalAlignment verticalAlignment) { + this.verticalAlignment = verticalAlignment; + } + + @EditableProperty(name = "Horizontal alignment") + public HorizontalAlignment getHorizontalAlignment() { + if (horizontalAlignment == null) { + horizontalAlignment = HorizontalAlignment.CENTER; + } + return horizontalAlignment; + } + + public void setHorizontalAlignment(HorizontalAlignment alignment) { + this.horizontalAlignment = alignment; + } + + @Override + public String getName() { + return super.getName(); + } + + @Override + public Void getValue() { + return null; + } + + @Override + public void setValue(Void value) { + } +}