From c1c4f9999291f243dffcc790189454abe05216af Mon Sep 17 00:00:00 2001 From: bkuker Date: Thu, 10 Jan 2013 15:36:08 -0500 Subject: [PATCH] Trying out an "Unfinished" view... Jury is out --- .../datafiles/examples/Sticker Decals.ork | Bin 194875 -> 194805 bytes core/resources/l10n/messages.properties | 3 +- .../gui/figure3d/RocketFigure3d.java | 9 +- .../gui/scalefigure/RocketPanel.java | 416 +++++++++--------- 4 files changed, 213 insertions(+), 215 deletions(-) diff --git a/core/resources/datafiles/examples/Sticker Decals.ork b/core/resources/datafiles/examples/Sticker Decals.ork index 18e1a26d12503ccdb8ac1fb47a6244fed124325f..3f0c85d057560059838a73f97dbea91702570a4c 100644 GIT binary patch delta 28995 zcmV)3K+C_o@(cCx3k^_90|XQR2mlBG3w$cKjqL(u0|Rq4eYf@S0?Y(|q4*~P~>vi%oF(KD7EE!Es-G0k{3(Zp5!7ep;Smfi9~ z6egY+4fnV{#W08M(`t4d_=iwHpz-yG>HHqDCZX>&XNc`{UVQmd!gL0 zj@QjkEGUgr$9Icwxl6Hsr+Ev&2TzwH=R`uh-AsSrF{2LRv}7Hk%sNA1zg`?euk`0w7B@7n_OsFPoHC*oY+oagZ+Ril12;&egVxF(K&D91vHI_BGRh`o7^<1O+0C#EZaHp=0q!nBUs zop7Q}^WCKFqwuJ{BQzo~Tf$_%r;%SC_CWKHhmKLr(FC)M3O$1O<(>3;m6W(21h*{7 zNXf{dyAsh9JARCRvC~0P4Ex3kzf{7?we0yE*=kfc&ff0Z>Z^ z2w-dg5a$U106jDgc1~TLP;nNdJwbc9;zRO%O{_1yKN~i$i}hM*MG&>L{(_0svUu|056~ zgDmX7!#Cd~w7;o2SbuzTH+D7$l#Q+Izp*Mxs6*X8uzqCaU}wK_&IbV7aT#$@bq|AM zeZ+K)zQ>ohb1c$m%**893Gl=+RN9@n4nBb?C!Gd^wsN6NEK{L`Cx-_X%sqeDeeG}= zS>nGvD)Y9t&GyalJULmxciH*-IKpH2vijP0sZ<_*fZd*4EPrWWeO&hMM|0GIhPANr zBW08D^bL*gN`YJSLfe$2a)lfVi#|J)51Qps-HIBcll_+wre-Yx#J&X{(fv`@#3d3 z>1C4z=>?bN{(oLN*Zkp|g#Mau$Cy*!amHKBa5`rXR|d&J&$v+bPI)_`rd6{w%aQ4D z4euu53VkbD@8Tnz)XNmVX1&zzY@J_On4Sp6MgLR`<8b^mf1*!^V^BD+#{G}iU?&KQ zkCMt;rDJ!{)0B=4u904CqB&B1NVZ$O#xl0YLUMDa_J8uMsk}5a(VTTI2fhLe64I-q z$T2-{yAzfcmFk8~aRlhz>^8I$^{Y5KY{!alz70susCdo&HPCg8XrgfA+^NYd6(K~{ zDEOx17{M9vaM)-!S_b{K|@HnTqcacc4^-ul^_NbuVzkvDi$(^4)#B5LY6I zAl|gh9PPN2x9wr*1ev0UV@UiT-Fr*1y&S?3Tz@E(u;8W+Ak|#0l=yWJ*r4`|NOr_8 zX9dio>mO?u`d-kFGy_UScD) zLVp?gKK;%qzUI(7*texu4uA$VpxZaF1Sxq+8%aJ^RjS{w=h&DtE=9;8>PEm>ao2dI ziNR`p93HI_O^}fPY26#6+vcHeM80@$ik2HtnYOo2_^_Cc>I7 z{(!?b<}@_4=E(+XAEi;Q6kYKa1K}76S!;U4vpTv!ae~8?@XnG`=a35F6W=9Vc5)DS zpm1si{YWnx;bC} zwFAm@lw*yJ1LRNj3va-NFX#oMH8Ugf$qODls3dL>_<>4S?2gtrrpR>e6Nq)KaOlH`9-{Hl5QBMv1<8)uEDYe5p?V1!uj-gToykpw)IO4V`WO275- zqZly0cF9wct6q=5c%^o%8?*k*g09O38y7cI>2#o9uXWLWMukd`^?yh+)+Y&XKSP`F zr=^YC%@5VXdI3CDC+mKvu_9xVuy?L{o})F$2ey5`T+YPkjf&&Nl(C;64_pT2(x9U2 zu(>YZJDoVNJT`6259LD}VD1*$rhR7%jT3^m<(+^3{!pv+xN^j2YB=Q@KN;|6_nN%cmuq za=}mVt?-hML^4G94XnW>=(Q&I9TZi-$NN8daVsJa8u|C{mDe2*^9hbvF6~HaM9^%hX*Gm=zAl2 z$ezR2RuKHHle~C7)(;3Q-S5~nQkD0Nznm2=ONxYZlz(T}z2ExNgDfDNik&)O2{KVG z5xNNW(^|M4WhUy0P0Q}?Q~|NU{M%G9q8ND+Q{I1sj$Dd9s60V^mQ!7lk9w%pLm0jk ze%Q5z6S*yo3}QVKHT&_a#`*jm-xsp@-96|N`74gH92csrr6r*q_otfhxNgH!^H=3Z zg^sJWK!0=@Q3r1*HDn#cpa;2vQw4=3!OBUtXhlTDHy-FBv76}*ZfSA-5hHGYzW37d z0zEy7LoSD6Ec#qwY$piF)ch3jf^S$a_V^n+v0vhWaD-n7u1xGK>iZP-}7FRaCS1Ne34uu68U|Q+f?cYQ_i1wo_|jqk&T6s_gq&2)S3WwZGtO6I~Gb1 zR6|VqoA1rni;&XQkWT-w-ltJl7&e$!%?YnU&nv!FCP9x4o* z<#$V)Wn1Hp(P>BKpffF{{U=4Qtb_~aj{Frw*};pHYmwhNMxMTp%sKXcp?T(8Tp&7Y zt$!E3|7lCql7#kSb}bh3VSAWFN~S~WD5aQeN1Sv9y{6akZsdijwy0H{gV_+5YNT}> zF&>ufy`qHweMY`Oa&iD-(hl>t-1i2OFnCtjf+27{?0K!l<1r+o>o5n$?C}R7#Upe( zUBe({z=Ws)8s7IsC*<6@aFnUQFHT5&BY#05SAW*WrkE;~1~Y!F4U|(p%F1U6cFF@u zL$PM9wnYpv3A zQLOxHp2+qj0{_`P?V=-Y*Jlk)*=Gi!PlZZ_Zzctp7F8HkaquY$gb9qiV7vm)rhh~_ zUd@bmkBJtqT#R?on!Zo|@;a-w;*te|fng%Lngzn04%(*g{oftW^o?)>rbe_Ja8uP3 za5G&;#-5N$`+u0wT7Yv%wQ;EE82KkiMp@9F*Y^bz8A`)$R!E?)oJ?Bv@@I~wb6CQ} z9b+50w|7OPx-0!@*Q#&8jAwzLGJn%E`AJ0x%51-95s;3!{^IR;A%FF2EuhcH zu{h+%8l^sO=rV`$6)Jd6)tGG9PV5Nzjt0$rt8BO`D_b?G&5_R;OIP+Dqgf*N{OuFK zM-95BhMX@uQ47gn$Fnm2lepE{FovM~NjaLk%&%38<5$czKj#Re;WJUG>zl zqrYjz#I~s$`q27Mb3_JHGk-JCpElsNdh1Ui{fl8WR|eq+j!UcDC--{Ru=e zcT4D`lS>ADc&kGak0jrMLPMab^vz)0yNmIz5KY12CyS;Z?-Lixhkv=|y|`qv?wC(l zcZ_MUFO5a2AqKWGUHZw3Yej|Al%p7N1IIlhZ*th^(5-UScM2ZK&e_3`ji)IOZo{G# zPIbS8egn>D!ot;6b{Zi3mh_?*6RZ1WZpg01Ta3<^w>zXM_CweYedA>`rH{0*ldUC} z`QE?uv;lovTc%P8yMIm(qG-YKX6h6RrQVP=49 z=E*11TZPBz#DBJwn%1`X^>A8{NB+T1xbrc3$y@G$>LJrkCx34kXDxTmCIs#HOB(E(<>1> zhVPJU{f$5z)PLxV>|YJiOJcm+ia5bso^4F{EkDdnl&s?TRp?->7Mg$^DO=pd=nqWt z0i`@^QSEJ$M>1n+YzvEvLxqB_=}yYE*T{m0E3kJos;HB9tSM=Lj5>>^Zk>-3-s3g7 z`%&eM*MQM0TZz;p1s-h9 ziD##*{~CX8z!#vYzP0X4IMV-U36HjTE3fr>TwEpLj|2BY+rPHF4%>{&85O>w`+T*^ zzTUFg(TOVxJsXrpjdY;}Yvc4=ZLYj8iv|={mOlH0_%31)%pu63iBN>f`txkR()6XR zv_{&)XMb}=PW?5Fjuwol^yck^4>gWh#K5qIIPU1#uS{dt8nPVrlP7VT(7`<&W^s1) zf8_{4SbhMR?#nY@Mj)cGv>q%&#$55&C~iM4^ek3gvvwi1tRrDxiw@96_mKSZQ2Ab3 zbdEzU ze4v?s?t!FL*d`ff+QVzNq(>Kmn`c4{oY4Vuv4(9p?)!JSYUY{;d*i3l#QhPXY=r5l zKy-4TTX>#TzEfz$tE297*EH=pJ9SVJA^k(sgUfMO>robEP)1Di0% zUXBd(?vzjVKWL0`%T&xo#(u|5lfM(U1%Le|2v4NJnH_8q{$C{z0^9prDb*;r*xlSR zI^ic$D^s5Fgw3iDer@8_VW6G*9)vj&d=v+RP)b5z48pYgjWjQt>F3-uFAxx1pOi4D zu_)o4p8m?KpWSX~FpvjKp+^w~!^lt)nQHZzdvE@_V{g%jB;DfldRpI>=3h-CT7M6e z{-*PwY1*FJQ4w>-*+WB87Q0?5zrdMTl_r<$$*gApg*-)Y3)=y@g)g_lIJc5O z=KYEq+m=~Mg`0Ve`hmzIWcg}=0&YIC03#ece^>Fnjm;**J((rVFayfh^~Np}sFfH; zH%}#m9S$63zH-M2|H1nEE%jcD0K_pA4PgXu6W@b;_Cpbn`Iwe3#RS2n)_)am>-lPy z`#J1}uT2d7Z^(N_Q{y29igCXI}W!8b_W_Bot z`QuO5VCn>*>a{oxf*XQPMi(~MiJ=em{;7VY7varG^92Dm9k6zmRbjgxf2(sk z)1X~^(V_k8D5r>)g1u8-c0kfoufda!dVU%W|Jz_*7^M)95kD+4kV1O$FAz{U=vxi$1+KK1JFn8Qnt%0VS<{~kZvWwc zrg!yfi);@#@I*Q}?Z_~-+Mb3Ork$KGXQ+Av9Z9ZsLNSDF^EtBL?qyM|_D{cWxv;l+ z7`o|G2T_@aEv5ojUoxmL#R(4nphC&*w1l+Dem2gA);-PzVGI3fmS>;cI0TX1_%9pv|E?A*vha;EU<6aRT+D`E= zG2zdnZy~#7i-H(fTCBI;s@*+hU}&j8mj7lA0lOaYS?ln|cUJxKP59ZVa19k9i!oFo zT^7))i*fc}!he+09q)s_`?l}egsG4EY1Tb;K}g7jiA-+(;Y_oRDI z#*7%exfM9T&aM#{*3NChktuLwID-{q;CBe2Emp!UIm4XoCY-m>dyL`=~EjA8XW!ek|)l@t3ZSwPHzT} z3O|E+5H^I^1am_%=}YpArXayqIE2X@Zhuo0GFc8Q$FBANRmbgds*mm_K`E80JDNw! z=1hWqK<=04tPU9sFDPNMXDf#mWMO$zk9@Y-OABkLgi`UX)Hwq)?wGK6QRUEt<-{Ff zyf_p;KpKhDYXVPc)nTbcRQ5LkvtHBZob!LdZb;iW|Lk%FQ}BFx{Sj<}(Iz^l!od9>1M zCXd4inkAb(%0ojkztJnkvo5m5=zkT65KRL;&`-p4_xy)^djtH~vz{FE9Zo0$G@)@@ zYLu&=gW~T@SH>`XywAoEus=X%?$AB%@8(q6{tHF|{S^LtpRitRl{7YBVb}S!fX_o} zrB8ozrSlF}rFAOn7kU*YZwE~tE!s>j>rWM`Ki$cOK`41wHrYN8T`s$dCx3k&)}l+g zFlha+8gAnf;s--|oR3JF%J#kKGd4_gixHbb9up)Wu)i9PNF8%c{r8VH2YB#hrIUu8 z`_Q@p3co~_sFkC1Krw!v#pQeDQ37(VQEP6^5DO;V1eb9!>e)7D^EuGz)qDcEGw?Z7 zVbc<>&a#d7hT5d_N4hfbq<=m?^*9_o3({-f9~j_6-H}IBGM`@tUIj+a1}Ob&|D&ub zvYQ;$rDRS-hg_emYa8yYVlUQ@Z|^OlS4W+_PFN@?o+PL1p!upYrbI1D3AR!&_$nbJ zo=G1hJE||62Aqv1u&i1r30??ft~wO2=HcRrBt<$njtfuY;~r&5sej?;3-sj_*;sh+ zVdILRBc6RiTtjw*7k(TP43~o{Twtu*?cd#c2*2hZ4}Hh<)=AJ>^q>vAB(8ZB5If)K zyBDOSqt7S67Vh@CnAJI&m8aR#$3Cvfm_ksVo<#vtH4F1m;a7pj z-CX}~GDer}JxB9WYJYW~wnTT$&}+@cknD4jf$KM&!%5|ptZSJ&5f=Y0u(qo_SBxta z*2j+?Yy5An@GD-TTWxe^z%g^>u5G>#UC#YTGsX6_HmduW^?dDvp^X%yH;Tf$d!%l0 z9q=E@gICd?-lBBx$8%W(JQ57L{l`g=C{UKGFc9Fm^OsZ~%zx{@#^-%9o<`O;O(V-T zFzku(JMM9&N-ynSj$o#pL1&u6Y1?;)PmndeEpkOvDaqQ@d&yeOdr4L90u|fIb}^?1 z&(}=KxpTENpBMk#z1vuLHQgryyc>dGuYn$TE@CX~F5=ehjQ)Kx zJLOrb^XP1GISPZJ0*qZq+}}r?m6t#@^;s1OP}uqZYahi3N(903Apg(R=&KPtB*#H{zg^wt>&+>?{B9x=0xJpKB(EBIRcR}z zfq5O*V2m*T$9wFVjw^MnhnstP58bdQ{Q1QE#j3N>YP*MpQz4r{+n!*23b2S#qI$?( zTC%lqYA-*+QV#v$e+AM{FsS{>Bp6#+6r9cPZhyg~S!py~uCW>M(b;@xmpDCkv`u#B zr<4Nf+60|paW+MPR?O-@z+;?`D7|;A|EIRSEHH-q#p@Qm>!Ff&?T*ND@9-1;nDeYem=CY_%hU0#RH zHh=pOT4dnCU;Q2yYhK>inQ|)#Fye|R==a7iTE!b4IeVPGNtx z<)5GtN=leT%AzhFyg%kGOW$4B>qFQz!zUIj&^H#&kahmTTuS@r6D|Lk9J|Aw|K9PzEXfcyBs0kS zPa1JG=FP{UM8FY#mwM_9-cvWKS9*N5tU0W?`D~c=G+y(v@DAWaEZ8Y{kJzZVr3N)y zE;;v1)U~oMRsEQxfO28`0|Y#6)iZH~X4%Nm-9fF2nt>=DdG1i>LZa!=H*Nqa9BGk{V#UD~J2FL&%< zRk4K+-(Gw5FQ3g)$Yt)PB;brazNdyN{*a>e~G#D5=IRK#4s zO{%n10wgabO4RPO;1&W6??mKU1Y|6;-H~ilQcknASGoHmIor>>I)0#`p+}{aH&=(V zqlrNON4*g`0A|o=-}j@=|K;YNA(Zv%-?rh?K@BOWH1}NpAH<1mVLCcBx>YLc=E~+2i{tC*7ZB~jeHjhTg4I~x4EsS1Hn)ze6Lh2EU=#T7Y%iO7O45cvGKya z>~iYvC?Sts(2(MuTj^L4-+PE;2B+)Bt7vZA{l~S4J0q`|w6cHsp?|wKAex~@gfks9 zcW(Jp`=3NbD^5$uLH*>n@f#dhDC=C!sI-IvS>a)PKKk@vlAra9emA{^O8bG$de1L@ zH9w@=t%#mWG_a@-Yje;!ab8veH!05CSp-6^nK`nrSp<{*9sDv#1BCAPxJO_3s|Kju zJW@UNh4~l1lRop5C4W`^u)I#Jz?(E67zjXz~#-l-XPfv~<9NEGdqJ zd?NZtlR!FTbm$cFVwfAg7H~(}B<`$54eM8i>?j&CV1Wc4w_I$8=X(6`Mf$p@wO^j@ z?c_jEh&H9rG z_-%jB+g>?2qK|$>E7fw%A9%cL&5B9yjFP9VSva+yXb_aH!f$dgi#KMj#SFA*#6LrN z%sSf23wa^2CA?8x)%V9N{He4y3IUg@6?u}uXBcOqv$Kx<7b;afhwDUxkUTjrthIa! zyK;RlWJ16Ag@4Q1E;KS8esPV*-ZKZcI3G>&Le3_$g?)xRsX}y`@LcEm>mJFI0NFy* z3)5m;d}0VRMP_x2rylP&>eb)YQu365-0!g53{8Ck8z-HfDxi~cduAKTFjPDWPeRAad2!o_;LRA%EophpxE*< z!#tI27a_Ed!pks(N}qc)-*6}k%HT9N`5%rwUQH_LRA^RV(1o-Hr8aDMzE}i$7-(Z-2vaX#^^69lD|SP%$~PEO4XRR~>BI$}$!`hDltT?UOs-|ISAp>8h`jJfShXETrT zw0{bT`&0u(Ht3%LPng-?>ZnKS75tTX;;A9pkXypD50wXd?^0&0+!6}|Q>jD3y_)fY!PVg@s>VF&Ot)2438hg!pin@o262PH|Pn;X~;Hzkz z(%<-T!fXUS+7kZ)Dqs{9uDY@*NM~a0JPXuYKhBvnt$_+{YiNZ5U*t4{VE9k#D{q|# z!{1sDi_~a!yU61roIx4mmAM({O}nEsxQnlQx7?$ao-8?1f;sj|Q2(q2W$RpoGk@pB zu~!l?YK)S#0ndLnO*;T0YLP-FH&)Akwr1RHGt26SK?~3#jUOPsx3KO1MU*jQGH`rN z1snEuI6DyD*o~^Vo$oVu_kDhHcQF!3bXRkO$XDm&q|X?dbO zR$r+1++g~;SEyp}Ya4^TOP)xG^xb$Xq#y~i;(YLqgd#*UsI+d)ss}}kJuo6JW*AvY zl*}Q|MNCyIEPh;z;YILEq^hlOvIeR6+f4YMItm!|c3RE^wgF6|LepHQ-hV9OQcyMi zX9)yad+W}~6;ef3Hz@{Q^|=Y!UCCW-rL7b^`b8s`>C#S@lV|SxG{8FMMB0kf3 zPTL0-F|aXFHJ*s_Ej0^#NQ;$A`}!_mO6B0zX37tDZ6MORaWs@S?wPmO`iYhQW~*en zO(BEIR(Il{C^LAlK6Ta6Cb@48_unE zdHY_|(9p1u2dN6&q1dDsI*^^YQ(?o^^lI3H?+m{D$lWga@_Wedb}}3iJKFWznOGg{ zXVeWITR%oJPjd@NRt4y$yf%K)P?uTZL-^1)cI9=F%!WnP~khWoDge z*hKJS1Nv0jz<-IUpDhz|wDbT@Kn@oWAteSbR5PzmATh|l6zaa#k_I#@*8cbD~~n)_|bob zjFk(qJxf&mkow&xAxqwuzCo}x&Mw98|6%=8QVvr^<$u{^Af>+;Dub30QcLa6pQ;=4 zh_(!|kIBtYeM9o{HWpX`&abz}4T0?6r1LC2R>TFCL*RxIdqC`HI|VY=faMoU2LBkO z?X}jB&Q2iq8u4_gm^Rz6ZrhaSLROH@In6jjRjO8f^oIrFWQs9)WUPe>AyKW9t7h#d zyPx&fL4UDz_%27@RMd#Ag!%LLLcb6SrO2!9Nbt|L}+qixHCYx;ZuXGn>sNDWv61^wQi*%RF4fLE{#9*kB? zIA@LYVX<5jrUwnE5>wm{L}GfK`CY<``c>2=8h@o5D;{r=gOd3r>)Kv$_ycasA)C8r z%oex(@rvO)1o`(?V7fnRQ0jMg*ECE@WCQQ)sS7nIcNEUQu&?Wvam|lYQ0}y668@-f z*#1%bZ2qH`ytt&csyMkhWXt z$bbEg>Dhqm>T7ffKhB+}igM%sTF%hN+R6lOJi&4%2rVl9#zNwM9Okt;rbAoHlr+4k zHvUTUv%&*0Li?Dv_>Nq^X*Cn zVh(jg;pf%#oj-ACL|pssT=N-qs0ot7n)RTTxL^ncVEO`-Pv_>)#uAO!ADAu_wtr8= zU$6asnqfq-nqlv`p@Ieia8f6mgsC~t!onK|PAb`RehZ79c8HcmxiiVRL49Ky#;D8$ zWy6Ch9CJ~gic6pWv4Ck$7Uvgx#2j7Yf{waP3`;VD!M0bXdVfi0c4OvkjoJ{&*1q~K z{xxVZ6hUM#xodUV{`$Q;*Sn z+SPzj4$0>K305$qYLiZl6XDFg8POc!&mEJce3Zp_O9mc$i`!dNz;X0VXIH#7v554J zY0n$^{g7w|gk9*(&-L_Pvz6;85|k$u6Q)|aLPYZD6%Gq!t=W=|e9n_c(JH0d&4Uk`KwOC#P)ReIB3I8``&uOK6Ob z&Y-Z>+PA(4p9)hh;#vlVcc1I@^H}m6e${2OnadRH_n|DssV*`|12?b#ROs*hC|`T% z8(-b7AnOL_O}7=As43pH8}~{;WDkl}Z}FWwmR}Q&G?^6M*MC?>E|R1lUJ1B9-R_L+ zBB@~6V4O`&-Pat0@h$`{)y}M+gsa#}?-n~(-g|{4+v7CF0CNc<%k68tniYSfHS6}2 zHS6z;G;6m+QZr%2%a)s`?R1X~)N~9}Kef3kM0eMgVnr7uqp59rcKyEN3?w|(&zk_0 zDEH(v2P%cwdw+O_rysU%^_QQ4W`yyn7eaBU=5qr&K?IbeF>*UU`tskJsT3GSQiBTCpNqAYNDgx0g?xVjp&`TQ< zwn)4snl`}nsS;~v{7Mlx zz9O^5U7?+Dl7$RQd)3*H13K#Y7~&Sb+lUJ4QK+$ED)|32^E`Q1t=gBP;JG0S{8KN9 z5r2TJ=pF?8kIYQ#Gi>#DgbvUAOGFyVnWaZG_yIw%PbG%lv>5GxNQB;5sr?&3$wn$m zVW;R_)Pl#xACoMJw$UkI1!WBc&bm|^6C(zhY-f_97@w7!&hD!W3d+Mo>ok*X9h9ng znmVly#dELA25?*2Jl3zi~{c&sY+32BqWzb~ckN)<2HJbxHA zOg7oQvHn(9PE-6*B!BBFDcdi36UvHinFE$sG1?x!S(}}}e{~XS#^SB{UJmqbbrgBk zWYe;74GQvV@{{iAjB6wQpeKbb z`r^2zSWD;Dl05z3k(s>`=v`yQ7$@tk^*#!-UA>EH^fJ6@^u=eb6WkQq5|Mn*38Apt zbB|vCl5G?Ctyy*R9^I)uV@tU(vLGaEhk}|tna{}OCD}GLSEGMK+q(I+TU1FoZGqXEQu#4=u-u%> zv+wn_(8a&thN?;1y0A3hYc1kBh3l0k{w%U*Iq19qW>+_-L@OdHsp{R>j&~y7VAB+n)~J1#$0&s8P}(QVh+iuaY44AkZ;ksZlgA^&?N$Y* zROO~&0tYAW9=-+GWPfx2jFN9TBy80l?*)9N?oNXeH(5{dslNS;xfq(En)$gaE^j7E z*XDW-e05L#H(rwG$0-$S5bfO!JQ_IY6w+=2lQ4lebUYauWyXmUN~qqhx)9#FY704c z(a+|t9I!>b;^c??c_Smr4E~nMK&vsY*{Bg7e6z(-HS64suzyE|i)d{SVqk`x5Fou9 zYcp!smEu~%`FnFKD3AOKJ@%7ig-|%!FPu3zE-N}XU}|gr(%JX3n9#iwMmzO*@27&h zFlTwDocBwLbVf|7rD`6@tBLRjts^;5jI7?FAORy>Zx(QoT39fSPPDRjlHyuFqWwOH z@?~Rf{2jx1B7X?%cl8&RzIApUy2n~`r+n2^%K!a1J71cpgm}e7LXH8AQap5D2FJO) z@?au|aD*`s2riIG1(&D9m6yOnsm_%#3ua1sz=?umuN)#YhMb@_VP)Q+W z@%;3o(Wz`AlnOW(!$9QP?sU3N5Jy{XF@yerGk3HQf`3GQ1)6tLW{db!^S4=u(qh*g zAfRB6(omM{MG8zOjCK&H2#WUl@``Cu^G3b9$xL4wd(qRudNci|-w^8^R9vf4`irMn zMY`>bTy6)JjgAAxBH#RMN2~s3M9$_KnOPAV&Z~pIa@}j8aU2VZ5z+Pt{y;b?0;AEh z$FBKMWq;1|STYj@I%+@DkCiu}8eDPghvRN2_-|&=J(RF+>HG^*B1(b!Z&0eOmb#V>K+ zFf>PT{@l)K8bwhR1t?w;shAr;#O$1P%|<=CxGL>^kRY5NE)D2<7~E0 z8-F{BSA#T8F-5R2e70^pk5Mbmn(ko9KlOyXx>Ikf!cU8QhIR5tdA6JE*<(*nS92c% z*6%ONPDJ=LjFBTmyV_Impwu@%>+iAg33Qx#dk@QGlo^ly%sICUAGdG2XbYCi-=b`M zp5yMfrE8iUeiUak@rhNok!(GqbbUC$rGHVH75P*rGv$XPZltM-p$e`cl@`^wiS&8D z;9fcLVvA_B(^!F#CE|pu2?;*NBkOM*xZjhhpYrJ0*Z#Gu6AdVA6{i1n6siaJGcNQL zmLfYp>5wyZ<_bEZ%jJrlKlRAkssF{h2a*LYhk9+Re!WIcqhfIf0*&_v+eg0>?01Xx!g&iB-&T934f4cEHQly zcL71``GNFijd~x z^xL_b!l1J-f@-^$?^-f=yI*o#vh{PS(xpK!r`69x_V!()H}N#7<=8ON>uKdts>(pF zoWe4yBrKk$H#*?jf1eWxb$`k^XA8jZVA zXYvQlQW>=nM$557QgRBF$Wlu>x{ipecgrK$jYI(k11qkC;7gTPo?T>lAWh46P|K4F zaf!q$-IuIzPewUmzkg)()rc3#Ak+k7zrnU;2MZT?kNx_N7F4l-=0*$JqN{B{gmaV% z8x6dv9oq68JjD%Bzp`eq28Xy6{Z0HU8yn{Qc|7#DS2XOA&hEVV(*>V5Ou9?- ziBbHWj!7v5uMQCH1lrFGjcZvGn)KfYPnu2YGpthUP7$HXet&-{6IQiJJw{!!<LKD+wh!aUorhcX%R)>- zy$T;Ba&NY~k$;%A{*E`u(BLWL7}=GXHID}e(o@5gE3DO(QAFf0+!w1YX8XOeGpl>w zL+Tu!=%^5(17hWlo#I|AnxE$bW>T^ieK;Fc7+_s(&V~5LPv_ z(#q+Zc%h6eNqm?81Euu0c$sRQgEY!oe=W_C!RF8Tu*QSoO@w`!1*C7-w?+AuvADpv zTn#H6X)+J*>vrZ3eI%N8gepycA8ekl$&3wRU_yD-kipyj$H|>g`0XbK10W~o;KPf! z5Rp=tcYk!!)^ipP@Xl|4LjP`f41fM8+&dkHLZ6zVRYO`SAf3zdZr&3CF|VZr3T&~U z^b?7A$H-ke)Hzhho6kzAJ|it4{aLLkiML6CbQhu~ThQL473JMJflnc_qBMr+(fFEb zOv};w15i&J3rPrzLJ_xT=NXLgBX+PGh1CJNn}1>=4C7Yp6CG?XwqVFXAvfLLdrhn0 zZi^W6pFcl&?p03X(4U)EcV_322o{lS>!3hMAZ>@~9>f$kq?BMfVopW&CLD%Siv2EM7+1N>w28|k1~^M3(M0iFT=mx|o!&%^$*L8}rI z271RBD#zs!vj@fXzXzm_bd&KFhu;agC4VvG!vJ?rLK2;@B}gJh!kP&it5Et;;whVU z>1CjQZ(4LR%aYXS!%ZgT38MB2dwBDlwHmEq7VNfh4KAc*?nQ>r37IVJ!kJBE#8lx0 z-py-qg=#?-TB;vHgb~?}EOpXuR*i0de1pPD&he__M+mWNTaTI5pQ_FC&leXdis1zX zF`&#HI=}2btG`A4<10rRdLuZufpEu}O69q;?&1BvjB*4$J1QEON=s~X(69x2rInaT zg`SSokq;a7i=wL7z!xygkj*PhjkoS^AA5YYy&7Y|BHChfAzCkF1YC3lTCre~QjjWAMH7^A|DdMTA1 zHyqEFC?Pl=OX}QpG^)$;Bq$j)`Mz+~W25?-jSjgo!|5!6L~F!i3$zLr$LTotAz-}< zmGC3pMn39Zdu8IFD^PVN#}YDFWsb%h&NG?aXDlU%WXz*DY_ODmCv(6NZAX40y9R|N{F8tcP+xniT@hG87rnl>A4ms*hsn_Ak(Y60;Us75ph1U zDP)vrSj(v@Bh1=$6-8?&Xg7()VhX%e$-KTy*j$(=qa*Rsm@ zhL#^ucYkbT)_a4)omTpPuI3=-u27$CuK&VWVA4zzk9r<}+~$)V1Qsv7WY0vIxM)Gb zx@McvP#GHAE?mpc_J+8T#0!G?bA*qMEN8dr7zAm-)|$$HBIH_pm130YtKZD-xS)AW z(F*do7axSbN}TnYbIoGj5Bb%&cfU2=QZJOL-BMN88<@Y=Wy!FyCC*p)Qky22y@PF^ zX|A-mRe7Rx!47b$nN|taeFJOCHNqf;$VOG z{ya~U9ZO?!KKLc!GL`8uZc}OI;GXo)%W{Q)8Na;Mr;5&Y_WvqBBxvegqCggm4>^Lz zV#NuDV_WVWQLK>5mg#VQ6n4P*M25++Zf&yQwcD&OnzI*K3mnB*(tCX-#3sWC2~aZg zc&Omu5X+K)sR;Y%lZ?$5J#;^?)qn7?%}+By%FK`jBB@)zAAGq){zc%7w}N%WF7VdH zMqtN5=B?a{&vuQ6Sf6;3A`LMDHIg*)*GiQoqp_Kulk>P4HOU*y-0&^CywDTNJa&+c zzkdq;M5#Gj4p{yAub0aH`QlyC0-ouzcNYnzv7#}l_jAv%L0+PG-iN#cCr%(kN`gCj zG#tl*_Ii~t4tgJrxAJ)%_kvE2l;`bJCIM(MkCcxox#6N9Em9D=Q*O9%*1C^Oqa)K< zsmrjWc>RV_NFoQLAd-lnIJ&FHILM8C+D-}$>Yf?;9YCeGF_qdfxqIdbQ0XM$92;C7 z$mJ*M9I1u$5?r7{DdXz4b7SP7=t9+b;|wgLaifmm9B%5&vPS>)Xlw#f^c8n~ih3;z ze8F4s3oKNDITivUHZtyZtyqpbo`UYz2?yWo@bwHO5ZdA~J;vL=Uoz^H^o^?zlz0>S2ElNbp955w^f>^c@CsVJ^2$~pvH(b zOuA(;-;Jn&xe+Z6?~Of@m;5SwvlZAE;$sjoFT^e0Xv9YRYMr%E0i9NC-j_*CC2|*> zB&oujvvN!bD2Ip61vZ#D2oJAf*d;h^+%LK?1KFxyp1KI)0;>;b|5zj0kOi1TIkV*d z-ftncVR6XR{-U#WJSiUUp)AQSd^i0-OXuoHAwYH_pLeujCBD&%rP!seot2 z9QZO@HvJ(U=lzWXX=BOw^SaXjGt`h7Z|Mgd;E*CIEl?_EogT9EU>FDe!@L)~l<>@b zA3LG)&2=gwpdj>%a;}?lbK{9enXW;#Ov%|U6u&O3ZuPAVBu{sT%M9dG!OI`5mY=?P z{69=ibiRl_35;H}rzcC(WhB3wfxoqw7XjGl4stvXQCpG!q7NOb0jFP1>fnv#KSGsF zEgNR%H6?H)IR9StOOF*CZJQLd6rO8t`Kvqp-aZ?w*EE=Yo~*^5ZLG6@hJ4Q-)OoT| zCZ3=IC)&m$ZcLKs@$?SNWeCr!bNN_#-Bdd7yFzP!vqUcM`wrGs+896Xi#G5pg9`|@ zGHiO}e_y+8_J}KhduA@})-jQs9eimXyAQ3@pGQKn4;e?-8rfstW=B~!eq%>Uj zvhsr3!3N~eWq&^4k>dySv^Hang#)<_zm!^WZO2iGt<#4wuZ2BbhE5c6*aDh4cjADn zXRPPMCyRo)yh=W=hB1$gXr04DhqX)p-7X#NlLx78(~uaS6cznj(Vb0N$7&Vh&^)WX z#zd_=?wapYZ7sad42iTKHhEig4Tog~x)q?!+DjI8xP+u55f-5c#GDfPWkAa99_F|Y zoyUBVGxAglG#4wf7`W5;z_Z{(yG{ueO0pVO^R?in^W3xf+c@!d^RXtRUC4fVw4hO? zBJ@dXrpsux-PXN0AH_Ozuke<*FL4$0l32CC6)S&iXe=99l0FIb*XK$8@U|)#x{Zir zjfIuWHP08s{2u<=njCX`FF*tJ*<_nAa2(;M7v1S%eMEQ1h`Sc&duhGhL%*V4&qF%{ z2l&}@5g)u_3<=w@uGGfrFKX+WN0$&8JX`s-lfvm@ZOIo~hymgG@s;}umEH{F;^;<#iiU;zW*|G{i@ifW7+m(Y zhHD~~`Nek)xvCL@?%U!6yy>Q!Q=B4YudET_wVL$o@ z;YUQ=b}orOHh!u3^2TPYncDEzGk<(@;ds^b3}_q|ap3u|ZIkEL&Ae$?jVybu>!3e) zY!BwsKDv&T#_LA)LOz?g=wZI{Zz zEltB&Dx=_T5fNM_0XT+<3e2ed9<%q#a+?U{`$Dd}{2)Zh;lE43`dztI`{A4&??HsZkR~MiL7)Z%3ZHpmBWVRckLk-Ri^AG6 zMf>KOvdwRyu}~iHkMlXBDZz~Gu6L|xaoV}+yp`#mAmHVDt+F{?kI%!kYPe>Sk@J?| z%Zc_7jwf$OU5F104{^7BJ2YouE0G@dP@8=ao)^WDuu@vg6Y3@Wlqn>2R#Qr}MNX6E zPgv8@S<3aCpSTa?5+NT}KJW+@J+MzKR_ZhQWeVxr`nS(C1@T+0)$t@~*-U4#ZKpOk zoh_3xoj@k4wGGex-c)yzZN9>)zMCtnt^58o<-U`P^rCwhSj}!F;heMVw5%0xib!Ja z)KF_)qqcL5GI$P7v)sZgm16E7E+(G7?*O+ODKeBE8))eIVag+#>I~Wx>W8#zrC5$+ zhyW46R85BLT5?@- z6Cl?Nz7G&>6>`~}z|*ABgNdZG^1s_!XoWe{B*u;ytq`5-k!9AM7?+tKh*yaW4W)}( zOwv395ynvuFAS`@IJ^=&7(a!lZB!z`xIpm8l`wK;(_YYA)FKQmV%5>+cJdaI86tXh z$3eIu7Yywm8}l{N*o@MO9irDW^^q`xfR6%k2+p_z5Qe4KXT|3CPQFv{jH5~`tJ5#f60l3!!EFbsh+GiKyhi} z7EnGi7rgOd{Ed}JMVZcA0kOvJ-WS|zH0K*(G~t=rg_ui#JA(F?&39N}${sqws7JcM zpCw-%Qt};FPyb8P3)T7ikDk`+VN#IU=3rjI_v(Ih$}wuG^aBQuv#IC1OFGQ7n3^9^ zWKP*stCiF3YIHjV*y}!ew$yHYfOVhqdDtbx-|p#bjy&kZzIv9&g>i8#sY9rj6m6^k z8wR3)4Xj9RlRTbLg%(}bJ&cU%JQPLIlUws*Y7aDtCSNxg4_%fJ82+1ua%w;z=|XJ}4L%kdX0uPRv^0{zzKF^yV*?x&Yy=iIYzhm`y|&&0 z80E0gn&^cA%5ja*?=sFCfEST16YGAYaX0Ev*?+iuoIupxIIAcK_8MoU@YkLU_0T>; zx{qm6d|RE*El$3si6a#2-#jXOr7Jpl^r^Xen{%cLF0MJvv{_B+!)x1C-X#Js(TZ6$ zk1j3YLPC|3XUyK@%E5bB29|`qhM{@s4mlapNUWzH&%_-*OxRfc!5N`Tobc*$1fWplxo$n|xyQ@?jG|K7(v|T~ zYgbi)=fJ9zn+r<#n0!Z`C#Bvt1SfAN8Y7Y-`Wznksa|Nq$>rO;=XBF@0y)ks@0V~a z-nfmNZ!}ySK_{6zK;t(Xw-=OPJAsNioyq3MgHLZ?b*d zzS*&tX*VUZ2nDnxH!ZCTeEtliGt1j;7MX>F-1taHN|$#k)S6so^5zGGMk>I_^T1Nn z;rAMFqiTKsWUG}!uL;|s-U~UDnVPSWPHQ7Icp_LPalqn9+a>F&&}9ZOFHS@&?eU%C z-hGzAf-U6+OPoKb_tp$~Aw>G5^%czmetI3AkO?zU#PT|4RbvjPcS21yY}6~U#3e79 za>(u@Qyb-}nq?O540jr7hBmTy(YuHmgpvvDG<0NlVI7p;B+w^k*;kVKj>i&3Y_ljR ze9(t;@J6HjoeaA#NW|Ki&-_f{9>l&31;Z&;1wEYxcdnJ0T1GIO8q+MRrDzH=N> z|8_pc&jVVO*FJEjJ-*-QG*3ni?_r+(i0ID85yg(+N$H5Yv5jLWk_7Vu)p*y*3 zko%}pl#h1wz3g~IGS{8Wp3#UtM@aPr;l4oS)DKT%ma?Mw{!yEaq;BNb%ar^pCM4DT zL)aML{lkr}x8nWK%`>iYELsN`*x=&V%9KAS-IG-3j>%$8aB4j)l#WHmidfz*Q&(nJ zDo;ny7=RqiC+#3tEX@@ZddQl?J4KVp?`V;9e3(M#VxfoB_vV%6NF(0AGPRUfcL>9` z0(qXwGpu=VT^)Fzz9OWWIgPY(hK=sT@(`2D) zqw&}W|ORk%6}r{i?9$NC-X_AO(- zC09o5ROk-TZ=^Q4Qi!-Oi94-jH1v}Eu}+RVZ9dt1W9T(W7Z3mXpLBS#=JWozwX_t} zh6@Mj-;~?%{0M)2WMS_9RdYM6QX4;&zVC-rPb?tca2)7sUh6cv2}HTfv12MdjmSn|=4x>nw=Lj9|D%LufdMIE6V5JW|q4~c|0Y3JRE=?@g4*&NdJqc|JB zZF;eGXXk(QL&aobe50_;R>A=>e>}z)l`i~v{}Qla!wg?XbVu)A7`6<_M_EWGl=`dA6lr+OxyfVWI&=~s%JTVwcfm!V^GH}QRbmt` zXGD1`?>N?jzmAvMh$0f}!jy_vr{P#jM!^dG0?xN*(`y0dj;D7177mit8|UCb%3u9C zh)-G?`_LkBE2xGq$oYpW8u^~vIdvUxI;iD~Zv)HifXdgWol>6XbH5YwND*NzX|LWp zgh?v(lH(MlIVLDl}yGw`%7aM;bAsEYvTZ-bg(r!r!{% zYUsBMHF+Fn6TnJ-YJEgiGQ`lz>c)REUyYsTP)i5_lg)>lVVSTA^g-T`n9L@|`MQMA z1@PVTAp1-C-Mc)>RNNE7>dsyU!IfQ|LP(*f(@JcI$6$)9jV-@@&5Q2`O5h;Y zD5~euC8S5CR^{wbRwH|lNOh6}=)pLT<&%Ga#B`w_4ae>^w~mY$Cys*O<*35EWD#BI zs@Jt@rr}|`h>tKT5YY-)>S%xR)~H(@DfRdQRp7C@B^GQ;>O5)(H3^0|`$h1{EbeJn z^3#ZVS;SP45LPOHh&(tuRhZlmnAW|&Z`r|bhfOQSZWerN?XbjryJg~Hye;wDKdx%O zu^U4~&pi$>NFT^YP~$rIaaO5n^ZR$KJu~d8xUnLH1>~6(!rolFPFD``slP91`a>}R z)`)n`BdV#z(=UhM?#xAOA*$MsU(6NEVZ~)a+XwwFHgz$DTY0iPuW5G@a0z|??B+ICRlhggLy#e$PC32UaHw9G+Cy?T@6A9GP!%C zgeM&4c387(hsno(Y%zn-OGTxU`% zyVVl3%c!`zygqZmKElBuI5zKMBH@pJZ{%Iaog9j{A6V90fO{q0Zhum_@eIZ^bNo53 z$MZ?CczKM2%BDefXQD6kUc8tDfWJWW0_akHgt?rcHcLIF5bwmy2Lrp}+>|=WP8?6> zpOS?+$IcK>f93EqR#C?-yX6#)83&1ohQC1 z(nlH8;QPewNr3o0Q0YJ)UFRnX$@cYZa};;@sPFN}4g#oVCRpP+V6(nJg5pM`nxQH~XJyP<8vCe?x_(SnRb3EJRd| zT^B%nCtp_@n%cz!g$Y>&Sl1;KH+=hp!YQPmn_FtY4&bPy`8&A6d9=ujZXT=2cDVd8 zHuWr)C~Zy7TaZgE=wk~2KV|w9zblzl+W9bI7z1}p*r&WdQfjsY(lW6;F)1h)q`uq= zd3izuj_P*F!gf3vFFpY!W~z`qu8}G0RP~{6Pvx)5BPBJY$TeN)>9psTo-IjE83{5i8;|E6Q>4$nwOAet@- z&Eu?TjNpIvwbCS+lhpTWe^3)qL~1iC>vhWBnAjZLxR;U+2v?2P+X&TOQ^=zMjWY8n zq|a)24(}D>-nR$uhj{}7Sg`?B_!e5k`c-Cw?J8wBC1saQ(3Fd?4{F`|7Dg-1h)g!w zM?rrG7|zu8>hJdK*L3^Ca3OpksK|2E-i*baB6;IUBgi+=hqA!0-*m)T=0?-kPK%>| zL;AEwJH?9wt!qwQK8X$Qzn|&O5}=Uoh_sZtw?ti9;WTo#+jJ=4(r}nwl#rVL%Bp_% z!TFTM?E9Lv4&#KG-pEaTZ_v!UWr$qr{`Ffna~!i@kCYUV+vm@bpCBV+{2!xcFL@k= z?-KJDyH!dOxU#Umfx&})r`5RNrR_EaSw0_|hreq)0c`$8y~LjhWE-fN`M;8Gw+nnV z1<5}24NNIwR2%ZDJ3q7Hp;P^NZ%IbH)Qj6i?=(V3RvSi#(;S@8)o|PTs{Fv)e#S+Q zuZP9sfo-iXZ=3eXlRfbW9cj}bYq6&*52lk3wK#B5cV!>t>Y-m3tn*uc372OG)1U7wy^luVyR3T(+`V7u^lA=VJ=?=J>< znvqVV_O()YZBFfO{Nu|3R}19o4QU7Mi8i}z$FSgW=c#U*MLxlCIfNc2dOeShSa+qi z0QI6{eD>^u3aIK08gv+2ntq7xKq!uS2u1XGcHkmokep+dN${i%I6C8Z-BeSi zA@EAtnBjEMKj3eRRN8dc#pQzWS0?m-0V)WYGvIRkTh+EXW zl%Af?KaomS%k%=I+MmK-wYl%6bKsvAy%YYRBS8eVo6pbp3-OKF+{vVusPsIZ0A5kv zkg4y@G_u`_Y%OgpX63NsFjNYbsh*1r^ovb6TEk1kI}H^lqh1}_t{y!_J4)ArJT+1R z9&E-aTpH#y$ryhZG8nFnF>w&QZ|c*N*L27LoRD0?GC*Fz3dNHgcz?}iGT)q7OExu` zIvAs^dVpkO3Z@{>Q|-&A*dWRW{QWZfDb0h89+42qt=ESNxa$`uKg`)Y|ERaJT-uLW zXrm-+e{VUisdgOK`9wcqlYtn}!v~-R7rekVxBO;cj=7ISaF>+SlKP3CXM)}7`#!O(rI2EHUPJI?;X>@69DprNkGn~&s$T3s;s;G~$H{LJiF=K~nA zAy}`XJzglG@AeEjVJy9X5ZS&*dxX#CI?@tD+CBleU02Fhtmyd=6-mLgE7``zx54Mg zfp6^_Fy9HcRuntGqN-Qk>b=|NG-5W$r9!m=k%-53QZk5DxlVh=nC0ODUgh06KFy4q6nXl4)M>?CY{z?p929~-lj@Nh z8fkw#+Ez--5P@*^PW4w9UYky7nT;aTg-uS)(0|S;jPH}RA?xMet_2|qiognrR!wIx zx#s6~hW^BTmp$&p^xqS3&3V#-!F%hLlODiFW2c{Dz zhK?kpTHz4iD$@#~ zMc#VF{^;4D0dHv8hoYc*|KKmqCEQLKvj{%vV&yq7 z{;+ev@T)cjqZ=rOS(iL9i0U|&2A3MTzA|Fg2F71tp}-+hCH7qWDn`q2#CJzeEViwX zkZNG-Usi~DMn3yx2$$Ooz6Wd-70$(X61h5C^YuD7=S|lvAzl@QoK*?JoOXvLhuM9v z@02^MG0T%REb+2XjNgL!N?fyoxSPmp!A^Pr0_?Odlxq6j(Xd!n?7(}v+@L%vW3tgd zFb}84r>Cjya#4ZYefK&jxKSVa7?~*A&WvsA1z4W2k5sCh1>*grV5kKP?E`8RWWjxE zmgGVnx`Q?F33_&(ki>RnE3u@!a;t)5dKRGEaXif{c($eZ?*Yzm0IOX@u<>YG5w;Cr z_6=fl>3ySf?Y?)m(5ej)r(0x_?vHmqFjE+Q!z-@(OsCMPA}usIkAWT9Z*H)ib!Qka zKBFr*Y0RXH0BcAw^Cb-f)B!d4fsGE~jp!W>%fcIe&te;E;>(!av5vwhmv#M0rk`H4 zsNT=hv?oR>_^uvb@$^R@Ab*TGZhZu72=X~Y4bko`FCkdE-cSuoSTCxk4gC6pZ@E0y zfs;U7!AcBPRg{5_zUA2iR=IPZCbW4D3ffVa}+xt!?*kcb0WK*NxjUAHZEoaN=tlGH|GHUX> z&EG9?9c{-U#eaXGrlQ}h?hG)RkA~(bIECN9OwYo1#j<#EUh5`yniKX@(0)YxlU->z zIBAtpX_cpY5b4qoXLOOi%nYnPCafw*o4SSfG`nP8W7+s=Vk_BCpyC_3Mw7`e!k>5NveChIIl%0D1{>woZN|J> zDI-tE^)UMEb~hu7$lOcuHBq6kdT*iJdCBrs?e-)V5N6&>tzndl*yG7*wmaT%ZY-MPG0r!47z4A z#*}=kre%(i78!mg#9gl!Uw4UUFXPlO_#Sq5YvZ1Z*BX*ZlHk70mSg|y8w6>~wYwHJ z7@8LXh?@7$q_l{*9@!50x3IGOBIW0UzQOxz#`}}@bQLiS=Wu57V_lA4qIC(c<)vBH zp>o01G2%qCMW!CY29rhxB=o}f{&xJ!{2yrV zEZz~Du*NXr<1|)|wDjSj#FM|@IFl#5+9-C}2jd8}V^H_`^xaV>AcMfzbeeK3>APzJ zuzT>eLs&2!4Izs1<$HTt>x!urm+vo9mUdzIeU+Kig<$hcbAE>7%)F&IyMHEF%i4i| z_}yE`x%AF#5&QA0s|qFLJkf=kP1?^KD>E^AZTNCdC`-_anX_*cyqzUg&|Q%DwQ^%7 zk^IoDDB2RSWC$9lcS*M5N;lO2fEtLZ+!pa+P7WIUg5rx ze$|&~(Xh4E`eg@KOh&%s!bSuUw7H8u__)>mn+49gWKpFcy|PH2spkxLSm?(T5cu71 z>$Lem4c;_aPWsJU9f0y;O%|jp1%!Rah&=scVn6q4-SE89TX4<5uN=k#i^WvF;@!5pTHVg$*3uybBPS=mv zPMb^WN@dJmN3rdCAgT_3GY|=YZ(?Nibx;GF_mndJ4i{AWSbX>}mJ_2U@S?mX;`ULk z^LSG}tti&i!!?8B^;X1iV}ww1lQOucI9#b^IGr#LQR(2hdBz#YSIhtLZdf|5rcnB= zes+JJO-~Z$^7d;bG#NQB=~*vtAq@3l7#D*yDW|z2oOauCyK9^v5>Gn7Jh1!w#(%o+ zO(n~tOzgRg|1_WaR{FW&-3nT>c=9(VWD0e6dl!%C zS-<|YG`2Q%B9$;T{$bt7!35^20)jmCO?6bO8rM__yPF+#smTpF@r$J|8x0EA|{Z~y=R delta 29088 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 ZHp=plQ2&_%@?ZA{1%U=Bdjk6h{}0oXr3(N6 diff --git a/core/resources/l10n/messages.properties b/core/resources/l10n/messages.properties index a43d03cd2..4d49265b3 100644 --- a/core/resources/l10n/messages.properties +++ b/core/resources/l10n/messages.properties @@ -47,7 +47,8 @@ RocketActions.MoveDownAct.ttip.Movedown = Move this component downwards. RocketPanel.FigTypeAct.Sideview = Side view RocketPanel.FigTypeAct.Backview = Back view RocketPanel.FigTypeAct.Figure3D = 3D Figure -RocketPanel.FigTypeAct.Realistic3D = 3D Realistic +RocketPanel.FigTypeAct.Finished = 3D Finished +RocketPanel.FigTypeAct.Unfinished = 3D Unfinished RocketPanel.lbl.Flightcfg = Flight configuration: diff --git a/core/src/net/sf/openrocket/gui/figure3d/RocketFigure3d.java b/core/src/net/sf/openrocket/gui/figure3d/RocketFigure3d.java index e5f13f322..fdb27c55a 100644 --- a/core/src/net/sf/openrocket/gui/figure3d/RocketFigure3d.java +++ b/core/src/net/sf/openrocket/gui/figure3d/RocketFigure3d.java @@ -51,8 +51,9 @@ import com.jogamp.opengl.util.awt.Overlay; */ public class RocketFigure3d extends JPanel implements GLEventListener { - public static final int TYPE_REALISTIC = 0; - public static final int TYPE_FIGURE = 1; + public static final int TYPE_FIGURE = 0; + public static final int TYPE_UNFINISHED = 1; + public static final int TYPE_FINISHED = 2; private static final long serialVersionUID = 1L; private static final LogHelper log = Application.getLogger(); @@ -644,8 +645,10 @@ public class RocketFigure3d extends JPanel implements GLEventListener { rr.dispose(drawable); if (t == TYPE_FIGURE) { rr = new FigureRenderer(); - } else { + } else if (t == TYPE_FINISHED) { rr = new RealisticRenderer(document); + } else if (t == TYPE_UNFINISHED) { + rr = new UnfinishedRenderer(document); } rr.init(drawable); return false; diff --git a/core/src/net/sf/openrocket/gui/scalefigure/RocketPanel.java b/core/src/net/sf/openrocket/gui/scalefigure/RocketPanel.java index c71237a1d..51272987b 100644 --- a/core/src/net/sf/openrocket/gui/scalefigure/RocketPanel.java +++ b/core/src/net/sf/openrocket/gui/scalefigure/RocketPanel.java @@ -87,71 +87,76 @@ import net.sf.openrocket.util.StateChangeListener; */ public class RocketPanel extends JPanel implements TreeSelectionListener, ChangeSource { private static final long serialVersionUID = 1L; - + private static final Translator trans = Application.getTranslator(); - - /*RocketPanel.FigTypeAct.Sideview = Side view - RocketPanel.FigTypeAct.Backview = Back view - RocketPanel.FigViewAct.3DFigure = 3D Figure - RocketPanel.FigViewAct.3DRealistic = 3D Realistic*/ - - private static enum VIEW_TYPE { - Sideview, - Backview, - Figure3D, - Realistic3D; + + public static enum VIEW_TYPE { + Sideview(false, RocketFigure.TYPE_SIDE), + Backview(false, RocketFigure.TYPE_BACK), + Figure3D(true, RocketFigure3d.TYPE_FIGURE), + Unfinished(true, RocketFigure3d.TYPE_UNFINISHED), + Finished(true, RocketFigure3d.TYPE_FINISHED); + + public final boolean is3d; + private final int type; + + private VIEW_TYPE(final boolean is3d, final int type) { + this.is3d = is3d; + this.type = type; + }; + @Override - public String toString(){ + public String toString() { return trans.get("RocketPanel.FigTypeAct." + super.toString()); } } - + private boolean is3d; private final RocketFigure figure; private final RocketFigure3d figure3d; - - + + private final ScaleScrollPane scrollPane; - + private final JPanel figureHolder; - + private JLabel infoMessage; - + private TreeSelectionModel selectionModel = null; - + private BasicSlider rotationSlider; private ScaleSelector scaleSelector; - - + + /* Calculation of CP and CG */ private AerodynamicCalculator aerodynamicCalculator; private MassCalculator massCalculator; - - + + private final OpenRocketDocument document; private final Configuration configuration; - + private Caret extraCP = null; private Caret extraCG = null; private RocketInfo extraText = null; - - + + private double cpAOA = Double.NaN; private double cpTheta = Double.NaN; private double cpMach = Double.NaN; private double cpRoll = Double.NaN; - + // The functional ID of the rocket that was simulated private int flightDataFunctionalID = -1; private String flightDataMotorID = null; - - + + private SimulationWorker backgroundSimulationWorker = null; - + private List listeners = new ArrayList(); - - + + /** * The executor service used for running the background simulations. * This uses a fixed-sized thread pool for all background simulations @@ -161,37 +166,37 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change static { backgroundSimulationExecutor = Executors.newFixedThreadPool(SwingPreferences.getMaxThreadCount(), new ThreadFactory() { - private ThreadFactory factory = Executors.defaultThreadFactory(); - - @Override - public Thread newThread(Runnable r) { - Thread t = factory.newThread(r); - t.setDaemon(true); - t.setPriority(Thread.MIN_PRIORITY); - return t; - } - }); + private ThreadFactory factory = Executors.defaultThreadFactory(); + + @Override + public Thread newThread(Runnable r) { + Thread t = factory.newThread(r); + t.setDaemon(true); + t.setPriority(Thread.MIN_PRIORITY); + return t; + } + }); } - - + + public RocketPanel(OpenRocketDocument document) { - + this.document = document; configuration = document.getDefaultConfiguration(); - + // TODO: FUTURE: calculator selection aerodynamicCalculator = new BarrowmanCalculator(); massCalculator = new BasicMassCalculator(); - + // Create figure and custom scroll pane figure = new RocketFigure(configuration); figure3d = new RocketFigure3d(document, configuration); - + figureHolder = new JPanel(new BorderLayout()); - + scrollPane = new ScaleScrollPane(figure) { private static final long serialVersionUID = 1L; - + @Override public void mouseClicked(MouseEvent event) { handleMouseClick(event); @@ -199,12 +204,12 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change }; scrollPane.getViewport().setScrollMode(JViewport.SIMPLE_SCROLL_MODE); scrollPane.setFitting(true); - + createPanel(); - + is3d = true; go2D(); - + configuration.addChangeListener(new StateChangeListener() { @Override public void stateChanged(EventObject e) { @@ -213,7 +218,7 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change updateFigures(); } }); - + figure3d.addComponentSelectionListener(new RocketFigure3d.ComponentSelectionListener() { @Override public void componentClicked(RocketComponent clicked[], MouseEvent event) { @@ -221,14 +226,14 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change } }); } - + private void updateFigures() { if (!is3d) figure.updateFigure(); else figure3d.updateFigure(); } - + private void go3D() { if (is3d) return; @@ -237,13 +242,13 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change figureHolder.add(figure3d, BorderLayout.CENTER); rotationSlider.setEnabled(false); scaleSelector.setEnabled(false); - + revalidate(); figureHolder.revalidate(); - + figure3d.repaint(); } - + private void go2D() { if (!is3d) return; @@ -256,123 +261,112 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change figureHolder.revalidate(); figure.repaint(); } - + /** * Creates the layout and components of the panel. */ private void createPanel() { setLayout(new MigLayout("", "[shrink][grow]", "[shrink][shrink][grow][shrink]")); - + setPreferredSize(new Dimension(800, 300)); - - + + // View Type Dropdown ComboBoxModel cm = new DefaultComboBoxModel(VIEW_TYPE.values()) { @Override public void setSelectedItem(Object o) { super.setSelectedItem(o); VIEW_TYPE v = (VIEW_TYPE) o; - switch (v) { - case Sideview: - figure.setType(RocketFigure.TYPE_SIDE); - go2D(); - break; - case Backview: - figure.setType(RocketFigure.TYPE_BACK); - go2D(); - break; - case Realistic3D: - figure3d.setType(RocketFigure3d.TYPE_REALISTIC); + if (v.is3d) { + figure3d.setType(v.type); go3D(); - break; - case Figure3D: - figure3d.setType(RocketFigure3d.TYPE_FIGURE); - go3D(); - break; + } else { + figure.setType(v.type); + go2D(); } } }; add(new JLabel("View Type:"), "spanx, split"); add(new JComboBox(cm)); - + // Zoom level selector scaleSelector = new ScaleSelector(scrollPane); add(scaleSelector); - - - + + + // Stage selector StageSelector stageSelector = new StageSelector(configuration); add(stageSelector); - - - + + + // Flight configuration selector //// Flight configuration: JLabel label = new JLabel(trans.get("RocketPanel.lbl.Flightcfg")); label.setHorizontalAlignment(JLabel.RIGHT); add(label, "growx, right"); add(new JComboBox(new FlightConfigurationModel(configuration)), ""); - + //// Edit button JButton button = new JButton(trans.get("RocketPanel.but.FlightcfgEdit")); button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - JDialog configDialog = new FlightConfigurationDialog(document.getRocket(),SwingUtilities.windowForComponent(RocketPanel.this)); + JDialog configDialog = new FlightConfigurationDialog(document.getRocket(), SwingUtilities.windowForComponent(RocketPanel.this)); configDialog.show(); } }); add(button, "wrap"); - - - - + + + + // Create slider and scroll pane - + DoubleModel theta = new DoubleModel(figure, "Rotation", UnitGroup.UNITS_ANGLE, 0, 2 * Math.PI); UnitSelector us = new UnitSelector(theta, true); us.setHorizontalAlignment(JLabel.CENTER); add(us, "alignx 50%, growx"); - + // Add the rocket figure add(figureHolder, "grow, spany 2, wmin 300lp, hmin 100lp, wrap"); - - + + // Add rotation slider // Minimum size to fit "360deg" JLabel l = new JLabel("360" + Chars.DEGREE); Dimension d = l.getPreferredSize(); - + add(rotationSlider = new BasicSlider(theta.getSliderModel(0, 2 * Math.PI), JSlider.VERTICAL, true), "ax 50%, wrap, width " + (d.width + 6) + "px:null:null, growy"); - - + + //// Click to select    Shift+click to select other    Double-click to edit    Click+drag to move infoMessage = new JLabel(trans.get("RocketPanel.lbl.infoMessage")); infoMessage.setFont(new Font("Sans Serif", Font.PLAIN, 9)); add(infoMessage, "skip, span, gapleft 25, wrap"); - - + + addExtras(); } - - - + + + public RocketFigure getFigure() { return figure; } - + public AerodynamicCalculator getAerodynamicCalculator() { return aerodynamicCalculator; } - + public Configuration getConfiguration() { return configuration; } - + /** * Get the center of pressure figure element. * @@ -381,7 +375,7 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change public Caret getExtraCP() { return extraCP; } - + /** * Get the center of gravity figure element. * @@ -390,7 +384,7 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change public Caret getExtraCG() { return extraCG; } - + /** * Get the extra text figure element. * @@ -399,7 +393,7 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change public RocketInfo getExtraText() { return extraText; } - + public void setSelectionModel(TreeSelectionModel m) { if (selectionModel != null) { selectionModel.removeTreeSelectionListener(this); @@ -408,9 +402,9 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change selectionModel.addTreeSelectionListener(this); valueChanged((TreeSelectionEvent) null); // updates FigureParameters } - - - + + + /** * Return the angle of attack used in CP calculation. NaN signifies the default value * of zero. @@ -419,7 +413,7 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change public double getCPAOA() { return cpAOA; } - + /** * Set the angle of attack to be used in CP calculation. A value of NaN signifies that * the default AOA (zero) should be used. @@ -434,11 +428,11 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change updateFigures(); fireChangeEvent(); } - + public double getCPTheta() { return cpTheta; } - + public void setCPTheta(double theta) { if (MathUtil.equals(theta, cpTheta) || (Double.isNaN(theta) && Double.isNaN(cpTheta))) @@ -450,11 +444,11 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change updateFigures(); fireChangeEvent(); } - + public double getCPMach() { return cpMach; } - + public void setCPMach(double mach) { if (MathUtil.equals(mach, cpMach) || (Double.isNaN(mach) && Double.isNaN(cpMach))) @@ -464,11 +458,11 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change updateFigures(); fireChangeEvent(); } - + public double getCPRoll() { return cpRoll; } - + public void setCPRoll(double roll) { if (MathUtil.equals(roll, cpRoll) || (Double.isNaN(roll) && Double.isNaN(cpRoll))) @@ -478,31 +472,31 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change updateFigures(); fireChangeEvent(); } - - - + + + @Override public void addChangeListener(EventListener listener) { listeners.add(0, listener); } - + @Override public void removeChangeListener(EventListener listener) { listeners.remove(listener); } - + protected void fireChangeEvent() { EventObject e = new EventObject(this); for (EventListener l : listeners) { - if ( l instanceof StateChangeListener ) { - ((StateChangeListener)l).stateChanged(e); + if (l instanceof StateChangeListener) { + ((StateChangeListener) l).stateChanged(e); } } } - - - - + + + + /** * Handle clicking on figure shapes. The functioning is the following: * @@ -513,7 +507,7 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change * the next component. Otherwise select the first component in the list. */ public static final int CYCLE_SELECTION_MODIFIER = InputEvent.SHIFT_DOWN_MASK; - + private void handleMouseClick(MouseEvent event) { if (event.getButton() != MouseEvent.BUTTON1) return; @@ -521,20 +515,20 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change Point p1 = scrollPane.getViewport().getViewPosition(); int x = p0.x + p1.x; int y = p0.y + p1.y; - + RocketComponent[] clicked = figure.getComponentsByPoint(x, y); - + handleComponentClick(clicked, event); } - - private void handleComponentClick(RocketComponent[] clicked, MouseEvent event){ - + + private void handleComponentClick(RocketComponent[] clicked, MouseEvent event) { + // If no component is clicked, do nothing - if (clicked.length == 0){ + if (clicked.length == 0) { selectionModel.setSelectionPath(null); return; } - + // Check whether the currently selected component is in the clicked components. TreePath path = selectionModel.getSelectionPath(); if (path != null) { @@ -551,7 +545,7 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change } } } - + // Currently selected component not clicked if (path == null) { if (event.isShiftDown() && event.getClickCount() == 1 && clicked.length > 1) { @@ -560,34 +554,34 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change path = ComponentTreeModel.makeTreePath(clicked[0]); } } - + // Set selection and check for double-click selectionModel.setSelectionPath(path); if (event.getClickCount() == 2) { RocketComponent component = (RocketComponent) path.getLastPathComponent(); - + ComponentConfigDialog.showDialog(SwingUtilities.getWindowAncestor(this), document, component); } } - - - - + + + + /** * Updates the extra data included in the figure. Currently this includes * the CP and CG carets. */ private WarningSet warnings = new WarningSet(); - + private void updateExtras() { Coordinate cp, cg; double cpx, cgx; - + // TODO: MEDIUM: User-definable conditions FlightConditions conditions = new FlightConditions(configuration); warnings.clear(); - + if (!Double.isNaN(cpMach)) { conditions.setMach(cpMach); extraText.setMach(cpMach); @@ -595,20 +589,20 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change conditions.setMach(Application.getPreferences().getDefaultMach()); extraText.setMach(Application.getPreferences().getDefaultMach()); } - + if (!Double.isNaN(cpAOA)) { conditions.setAOA(cpAOA); } else { conditions.setAOA(0); } extraText.setAOA(cpAOA); - + if (!Double.isNaN(cpRoll)) { conditions.setRollRate(cpRoll); } else { conditions.setRollRate(0); } - + if (!Double.isNaN(cpTheta)) { conditions.setTheta(cpTheta); cp = aerodynamicCalculator.getCP(configuration, conditions, warnings); @@ -616,24 +610,24 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change cp = aerodynamicCalculator.getWorstCP(configuration, conditions, warnings); } extraText.setTheta(cpTheta); - - + + cg = massCalculator.getCG(configuration, MassCalcType.LAUNCH_MASS); // System.out.println("CG computed as "+cg+ " CP as "+cp); - + if (cp.weight > 0.000001) cpx = cp.x; else cpx = Double.NaN; - + if (cg.weight > 0.000001) cgx = cg.x; else cgx = Double.NaN; - + figure3d.setCG(cg); figure3d.setCP(cp); - + // Length bound is assumed to be tight double length = 0, diameter = 0; Collection bounds = configuration.getBounds(); @@ -647,7 +641,7 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change } length = maxX - minX; } - + for (RocketComponent c : configuration) { if (c instanceof SymmetricComponent) { double d1 = ((SymmetricComponent) c).getForeRadius() * 2; @@ -655,31 +649,31 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change diameter = MathUtil.max(diameter, d1, d2); } } - + extraText.setCG(cgx); extraText.setCP(cpx); extraText.setLength(length); extraText.setDiameter(diameter); extraText.setMass(cg.weight); extraText.setWarnings(warnings); - - + + if (figure.getType() == RocketFigure.TYPE_SIDE && length > 0) { - + // TODO: LOW: Y-coordinate and rotation extraCP.setPosition(cpx * RocketFigure.EXTRA_SCALE, 0); extraCG.setPosition(cgx * RocketFigure.EXTRA_SCALE, 0); - + } else { - + extraCP.setPosition(Double.NaN, Double.NaN); extraCG.setPosition(Double.NaN, Double.NaN); - + } - - + + //////// Flight simulation in background - + // Check whether to compute or not if (!((SwingPreferences) Application.getPreferences()).computeFlightInBackground()) { extraText.setFlightData(null); @@ -687,38 +681,38 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change stopBackgroundSimulation(); return; } - + // Check whether data is already up to date if (flightDataFunctionalID == configuration.getRocket().getFunctionalModID() && flightDataMotorID == configuration.getFlightConfigurationID()) { return; } - + flightDataFunctionalID = configuration.getRocket().getFunctionalModID(); flightDataMotorID = configuration.getFlightConfigurationID(); - + // Stop previous computation (if any) stopBackgroundSimulation(); - + // Check that configuration has motors if (!configuration.hasMotors()) { extraText.setFlightData(FlightData.NaN_DATA); extraText.setCalculatingData(false); return; } - + // Start calculation process extraText.setCalculatingData(true); - + Rocket duplicate = (Rocket) configuration.getRocket().copy(); - Simulation simulation = ((SwingPreferences)Application.getPreferences()).getBackgroundSimulation(duplicate); + Simulation simulation = ((SwingPreferences) Application.getPreferences()).getBackgroundSimulation(duplicate); simulation.getOptions().setMotorConfigurationID( configuration.getFlightConfigurationID()); - + backgroundSimulationWorker = new BackgroundSimulationWorker(document, simulation); backgroundSimulationExecutor.execute(backgroundSimulationWorker); } - + /** * Cancels the current background simulation worker, if any. */ @@ -728,26 +722,26 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change backgroundSimulationWorker = null; } } - - + + /** * A SimulationWorker that simulates the rocket flight in the background and * sets the results to the extra text when finished. The worker can be cancelled * if necessary. */ private class BackgroundSimulationWorker extends SimulationWorker { - + private final CustomExpressionSimulationListener exprListener; - + public BackgroundSimulationWorker(OpenRocketDocument doc, Simulation sim) { super(sim); List exprs = doc.getCustomExpressions(); exprListener = new CustomExpressionSimulationListener(exprs); } - + @Override protected FlightData doInBackground() { - + // Pause a little while to allow faster UI reaction try { Thread.sleep(300); @@ -755,38 +749,38 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change } if (isCancelled() || backgroundSimulationWorker != this) return null; - + return super.doInBackground(); } - + @Override protected void simulationDone() { // Do nothing if cancelled if (isCancelled() || backgroundSimulationWorker != this) return; - + backgroundSimulationWorker = null; extraText.setFlightData(simulation.getSimulatedData()); extraText.setCalculatingData(false); figure.repaint(); figure3d.repaint(); } - + @Override protected SimulationListener[] getExtraListeners() { return new SimulationListener[] { InterruptListener.INSTANCE, ApogeeEndListener.INSTANCE, - exprListener}; - + exprListener }; + } - + @Override protected void simulationInterrupted(Throwable t) { // Do nothing on cancel, set N/A data otherwise if (isCancelled() || backgroundSimulationWorker != this) // Double-check return; - + backgroundSimulationWorker = null; extraText.setFlightData(FlightData.NaN_DATA); extraText.setCalculatingData(false); @@ -794,9 +788,9 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change figure3d.repaint(); } } - - - + + + /** * Adds the extra data to the figure. Currently this includes the CP and CG carets. */ @@ -805,21 +799,21 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change extraCP = new CPCaret(0, 0); extraText = new RocketInfo(configuration); updateExtras(); - + figure.clearRelativeExtra(); figure.addRelativeExtra(extraCP); figure.addRelativeExtra(extraCG); figure.addAbsoluteExtra(extraText); - - + + figure3d.clearRelativeExtra(); //figure3d.addRelativeExtra(extraCP); //figure3d.addRelativeExtra(extraCG); figure3d.addAbsoluteExtra(extraText); - + } - - + + /** * Updates the selection in the FigureParameters and repaints the figure. * Ignores the event itself. @@ -832,17 +826,17 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change figure3d.setSelection(null); return; } - + RocketComponent[] components = new RocketComponent[paths.length]; for (int i = 0; i < paths.length; i++) components[i] = (RocketComponent) paths[i].getLastPathComponent(); figure.setSelection(components); - + figure3d.setSelection(components); } - - - + + + /** * An Action that shows whether the figure type is the type * given in the constructor. @@ -852,13 +846,13 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change private class FigureTypeAction extends AbstractAction implements StateChangeListener { private static final long serialVersionUID = 1L; private final int type; - + public FigureTypeAction(int type) { this.type = type; stateChanged(null); figure.addChangeListener(this); } - + @Override public void actionPerformed(ActionEvent e) { boolean state = (Boolean) getValue(Action.SELECTED_KEY); @@ -870,11 +864,11 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change } stateChanged(null); } - + @Override public void stateChanged(EventObject e) { putValue(Action.SELECTED_KEY, figure.getType() == type && !is3d); } } - + }