From 587569f41cf4c0eefee10339bdb324d366280cd5 Mon Sep 17 00:00:00 2001 From: plaa Date: Sun, 19 Feb 2012 08:23:22 +0000 Subject: [PATCH 1/1] Fixing various issues git-svn-id: https://openrocket.svn.sourceforge.net/svnroot/openrocket/trunk@427 180e2498-e6e9-4542-8430-84ac67f01cd8 --- core/ChangeLog | 4 + .../tours/creating_design/dialog-1.png | Bin 47886 -> 47824 bytes core/fileformat.txt | 3 +- core/resources/pix/icons/copyright.txt | 1 + core/resources/pix/icons/help-tours.png | Bin 0 -> 837 bytes .../file/motor/RockSimMotorLoader.java | 1 - .../sf/openrocket/gui/main/BasicFrame.java | 398 ++++++++++-------- .../ComponentTreeTransferHandler.java | 33 +- .../src/net/sf/openrocket/gui/util/Icons.java | 5 +- .../rocketcomponent/RocketComponent.java | 181 ++++---- 10 files changed, 337 insertions(+), 289 deletions(-) create mode 100644 core/resources/pix/icons/help-tours.png diff --git a/core/ChangeLog b/core/ChangeLog index 871d5fbc..e86da4f1 100644 --- a/core/ChangeLog +++ b/core/ChangeLog @@ -1,3 +1,7 @@ +2012-02-16 Sampo Niskanen + + * [BUG] Freeze when dropping component on child component + 2012-02-10 Sampo Niskanen * Configurable stage separation events diff --git a/core/datafiles-src/tours/creating_design/dialog-1.png b/core/datafiles-src/tours/creating_design/dialog-1.png index 2345dc0c37fd729498828bc475b4f38de217eab0..39a683278fb22d78a3f6464bfdc489751872db79 100644 GIT binary patch literal 47824 zcmZ_#1yEc~v^EMO0TO})PtXJn9^4@WcXuCxyW1cM!7aEmNN{&|3-0a=?moaEcgTCb z`pP$Rb2hUIHDJ5ETv%4qZx8R2dEqAq)-<-uE>!>@T0-{R3b> z;GL8uzQL7^67R!)K?cZ3h{8R;d}X%g$HKvVgp(2#R&`%IN_TTt?S%xb$+>bx;7&?% zvP{E$dXvSqFZQ)5)bBH@CLFw%uyFgPLhny>EWEdRO23&hofV^3`LY7OqEfYz&~pL#D)6v<7?Olk1#hb?~Kz%iTr&0 z$K$IYP6nKOjq;w&js4!h2)?b?FZcZX7zc0Heo3ms#h6nd)joN^;fARYi$BavSbG-$ zDC;&L7^dQ``2=gWT65`QrIGsdyj{-$_X=fh<7`7E?-&rqSU3OQHyyKG0#B2yIZ~f3 zmN;c%LHCau1eS2@(zLOP!!8LrStV(hguLPCL~du$D)d*#$o3ao9x9Fh)A*&E*##)% z(JDoYL8dav;4KCrFIsM#xEEi(EFvNzx7!J}XDf!^!Hjn=zK(SzeK<+-&JbHHGWKQ} z)%7NmV5)br*{W~EqM16YuM>jASb`mJx14)T={y+Lb8bE46gqcAxsrtlJ?D6D`?($W zgOp_V7yMC>$lQqlm&CT0ZvnOWU%uPxrY`Wp`8 zg*HNyr>ymwA>TJ1c+A-eU3ARwj~#grPBsQ-=pA5F?%KGBZ0#g(Fgu5lZ4{4qBtNwY zEGs7qhDcaf_A*&Df5sr0x5NH*hh*%NmDCK%)uh57 zp;eR_KXg%baHVAVwD9LQY)OtBtFE=L2tPid7BcBOA8JSB=&(x44zRYGxr~;5=T_Uz zLLpRI>xVa9HgSEbO}2T%8{Sk@bFdPU;8L_{9@}~C)IVQ!{v{|o#-Wf@96}mVaB8E_ zHxqWGT_0d$rfkpfE((2BSk7WDkLgFo&2L};*w@bZE`y#Mh5e5gMEunq_ivA5^5$7P zZB5vDiwX z$rJIG4KOIm`z#oR_r~RAz+3&r!9*toziJ{|^ps2UL%8K@4^RZw&@P)$6(@y6Z5JB= z5yU7--JQ=dhGFG*vqvVYlObyw>04*}sb$u`#!+Z&^A1I_crE;s+{2k;4b|hl*pq%^ z^l?b!ZO#7ZxcJRi5^)8e$OaM_E&J)O&kyIS4&*uPkMWSGc|c;b9&sD8Nc7Lj3PlFX zkS5ul%@HOM4cHn9Fm_KXwWiCztS57GD2X@{ohdXLZrhhoH;5hb6UAv3^qY!W@Ootx@kDHHVGGjj5jbSC^uZW8mgUKqC0^ z9zw*OkP(1fu=qLdRu6j1#S%Wt(Y>d;3+E(nHPGP?bp)R3w&Kk2FS+%EGm0J_$v)0; ztLKj)$`$6yz6vXE8A*X z1pbd6_?s#+hn0yhfAJQ*sP0I1oN2pCL1E@^tcxfL<)8 zJ|#C#E`^717G8-gkNIKl*Jl6#nL)~}sXZlQ7{k}o0*X&Svi9dxNo?MS(?S^m6v>6! zgn&aPa5BE+B|QA})I;YR9ZX$EK^Nx}c-1+Pz8@yCAQucGE{U3C)LqkSIl=bP-Rep+ zRw!bti|`JJ~N;)69{zV#Tc(w0f}auzSRf1+HU7FulY824{`sj>myxR&XQs-O z>npK5IJe6zDNKR5QGA+s;U3n7grj5f-?1Bdz*%a$d@vPyOisX@iO|h02$?v15 zG&k|Et(P17Q?O9x=uEx6cou&rWJDVKtTC-lm+l8LuCJ>BeQ_u{@_wJn zb_n*@kB(w^#r92YoPfpD`hjF8gp4V1?%3yjIb}i|U<7+400j=qLGk)Q<_L}>A)~7& zNuyKCyk+H-RrT?nN}5#Zx6=2!PeQ)qD3N9QFw z0oB!QU-=`MY{$iy@4al#W*|a&O9pw`QIE z3#a>-?ogE7EniMS%ksv}*wtIZm*D6)++EdabK3KW8Fw>48T`Gxcdz!hZeLp$H8Y>;VBy1OZIyHjdsxOnbFN{i9<4Iz% zpPY1+)0eO%gR`OOQc0H;PnTdUrcK7xt;2%I8mkOoaW$kx@vRh@2BODRpJEaRAuC5>HzV7X|~{vISk z9Hr1b)oNKMFWoY{z>fHXr)_Fwd3_$=RkwL~Ve3HbiVI^qE%`KBLpw%=_2O4i1Y<}D zEq6*>5<0Dv)a`1l&?@_~x79n{et10JI;DZVs9Z~gS(?jY%n7LCHcx$wrEzP89HVH09t3|y^&_!hsB>uQraTq0 z4N8{fup?t4YyRq33r7r(H2)rl`vRgL^YdWxO9OK99COt+WNqQSiHv{Ujq3Sje>?SW z*9fpx!lfCd>ZO9=N)=;It+}K*G;cmuYPr$-NOs_-CGSy9N}Br>@q8Vq=l;jEog&WC zH2u-C=T8cUCtZVc%tD*)*BBQxm-k|vj8EwiN;lJ}l|x}#yW#q&r)gjLG>(FI$7l6= zrVB-4M(Md z9v@yWA-EAA{i|F7PJ1d)cDc2+VrmILcy3i#!jsNi7g#{FDYEj;e2pVT$mceU64M~^ zgfB`(6OQ8>KX=oy9Uyg0M(=Ab)#l-`Zig=iXz{zA;7H{j^0eJbBG!z8!0x-*yGl%O2WZbuNnPSNOmscK+x^Ueh0ZKn%dm!em zRhROb8OvND$5c|I#(A0mnN);di|0$C_LvVjf*SJ}lnP1ybb350{)N+ZcLL7+1&W|R zN6(O}O%w7!GahzOC*|+&y>({yL@DC34Ys?mm>o0dPH0V(96@l7RDFxq#l(W&4rjo0 zbQ>#VmJaTkQ4OD8Uq4a6;S-1^xZG44n7eg)V(@9k9^3wf7B~9Fty}FOEseX@18K++ zxX9grJhJDcqKSAT31TR+PuHF#ym(`a z20K+-j_hXOs`1AAszJ_#f;c+%DGQ~!u}Z^5R3^P}3Z^OidR~m-I{;ra&)w9a%gb>P zr2a2!mANWyWsqyei4QTqCm02(G?|!NnG!gqYy0b$gL?{{rb|^;{yPv9_(Dcon{hvv zlg)z+~B9$AlvNCC>s zpFt#(zdS#2&Du?lg6OEOo~^Ud^*o&!s#^X&WpGXA7_>d<*XL;XKvgMiJe_HI^&=1m zwET?mmWh^!e&2JPp`HB-pCS&G{>Ej_E6o!L@e91C)3*-|a`rm&{8b0V9kft9|2hhF_j*TL1pt?A_e(hrYo;r+3V+ z+JrslFU|tvDoj!ysuyCcCv^m7FFP1ahC^%(n*J6WFAg};db;=d;H6TuN#^xqTyY=~ zcAHJIH~nAlt4mlTEokVPKqnik{pCWW|8#(F3l8+oIvbZCY6D1Ck1jz- z!tY)Qzx&lpfT_S7$GXCePb3xcPcZnYNKB6Z-_=)GVgEJ$87%hi_E*9^+5g@25uo(a z{*~}&jhYyQPeS_^7T>>rH)JQI`tZ_3QMjVAQn+}^$jpoep!8W_KuYRYP*63v{a92& zBE%5)WoT4#+}76OiEK4`!a$C$qcmA6*a-Lz;jK2k|0UVc+08&8@8HL;lSS zYOs1S{mk|2|NCTQwe)5W@()}<48Cu5l(A!AWSPvNyoYSeO2>0w5A7Z)6?H+T#>Oy3 z#@gT7qz8gPpcb!xbJhdEB9|gD0@@R`DeEPFv7v3oJT`v(>DD0h=VIAbtdLTW5K2lz zFXanr3jL-hW>kiK)P_>mkbNN@c5>0)npd}$o>3Il#xMr@}n(1^#vz0H$Vw+F2&|0w= zi&&>vFAhRsv0ta>+A5%IPj2`A%ZA811rv%Gn}Z5{~Qxn&Tg_miCj~r;NM5`{`S5NNQK4VbN*?O z!(2AX$e=QRo@nsYcqdlCT)i5;l=OBK(2gvESoRFX%kku-WUs(FhRPYrzsfyhep&o@ zqTD#;x4UCXeofd!#y1>DxJx-ff&die-3GSjzw%Y>rYdq*A5I?jTI#&eRi=_ zLPRQ0q!a4xC2P)Uzo@-bL39;Obmw<6FzZ$*PRt<7Cuh=CykmKfc0iP?ddt>EcQhBC zR%$@!-)Xo=a}DJkbn8HMVbP+E2MRMD9u|MYH%%Huxw|il#u|_|(N~e+GE1q;2W}Mu zp^t^~W`7DVr-1RNInhO*%fcaQZ3;F@i7_gw(?86^9tqKq)vDLZ54NtIb5)B_pQ%Le zkRPmTeP8xl!RMB%2k!XjXj^q0+}S|&F@`6Enle4$9T&4f&h=5oEwAM`_x*&Gyc4eVQyW__i4`h@)@r=tx~&@L*!6*L{_qQ7 zl77(xEcGoTT7xr2LkD4sT2t(pV&l^dJa&=-*gP1AjsF%fA_; z*{+>nx10|TaWZ42W?+6Q*7KKpEY_~wyVXE!brFl=aPooooZl|r2o-nA{rbdk{%=o^ z=lCyykmgQ;93Ww2Va8=;Gy2j<2LGqegBTmm|Tdp*LQE+Xea*NlXpkiFcFSQw!z!T zcB-eBGbfAH_?oo_dPU_d#O?P)R=zR4?amrcPJc&e2C;c%c*}0^{b)c%-BN2Lc4c)#-b%J*eY8V(= z1HHH(x3P;!d4j=P%V6h_2pX`WpI7U_*H!DH$c|A&3C^k|_9i&_W_!2gY_j|EBeIJXW$6?gg@c1iDsoa?I<0 z3C!=isi~o{aqAUM<>#bd*>1I#x()XFF`xdSgWoDN3d$q>C^-{N&A!2!xNzeK&Nb!> zq3DNm4o7=ftR{i~@D1IoTa({M zh_g;kmEwnz;|CB)%E(YKGRk59ixA=CF2ny=IRAG9vT$=JE1k7gr?b3|l+xf4f+XbCkojv*&nMoHt==Z+NF ztw^Rh?+2^$KY;SC(i}aElO*4v`n!XS>VC_S3O-P7R#aDPZt zRI#f6KQQKbeO9)E_|odDz_i(qX`_s2|J{uyDptHVL04!*DLS4{;R8NwF*f7|$9c54md7WPj6!2B$QEum@aV@Hqfts~ zDRVlfBIQ)8XL<1c33`E!z%MUo%V^qL@wbP8zdi2E^p6(d+)ktY$ia!v#-gWQZ&1n*t zlq8GgoWI98X$76C@#!bA2BGV4Rc$S4>}i+p>+y!A{jHf31lJ6|^Pxs(6%WsQyr-uVB+|pFif&T>mbR%OrDKNUcZV&EarnTdu9+YjjWQ#@$ zLG)6&fbL66Z(*+zPRIWaWF}Y`(+wRG5f?|sQjpuc^%lDHH1l0{*7|O#cYb)w+J3d% z-*B$dBsfUh zlV&VMzCMcmvf;fhqmu60F8GzC`N-rCA!bw%%^DK2mMYglxl)b&L=s?H^;9Z{c&HRy z-BHZLeEC?xL6J{W@834|Bn_%3{Zn`vQ3$jNBnZo6+!Zhr>nRd+KArMIaf6ILT|Cti zC_Hc_M_dZ^q<)@_YL5~;@zPuyx)+II1q)^fUA-Yn@cB{C5?E>n`K*|6v*O+2d}1~G zFoS*kGtb$(7DYmEM31TcZ>oZx+26VLGea`k~vKtwmF_2WqwTJYsk-8Ho10V|72kTJ!Psx4Th>osbeD15AWx{h?}w4DP-V za5-*4^{e20MNmi6b%Bl@URxW{-*)z85m37v!Fo%t3kokm)BMiEw>4DCkTd@0n?5tqG-pxEz2kkKn`JCJuVW6bP6ed_;Y(^Lq&X?9?L zEJ0ko@$=^3^_>WoDSyj({xMN0s7( zBv3j*Y^XIje7jg(K)nh#*U#6=JG_}%@#KSPDezWG(i>bkcoxR>se`jZiQme32lfjw9t`oyjC~+nq->Reh5W+AyHtI>un>C=?a; zwEZM$m&E?SU};ebG|)^z@P#6vM3EY|MNqE^df4p6BM0QEy42nsAOMLUaNEaLM-P|} zlx8+`baf4w-+N^}UP7vGnUgG?y$=wZ(0B%lAjlWv-SEWst&N2>t(?z|j`AI1Dmqp_ z>h6Ktt|LFTKXWv!6SV9zIodUfD}h85@$($xP3XAIuJm z9QK}YMQV%E_?-C71=|fir`oubH$KCHWZraHisg_ z9KazQL5J@2T?CT=>-QNDdEFgch5+^?YFiErC)@-l`L&gaxW1U{u`;OJI?jz$#P}+zEpHo|1_0XeV&%-raJsy#hnW0$| zLi6$n6gAEbN&cZWVa%Fc>_)@tT*LAlDqznn>&u5Pc*#)lc>o$O9 z`)%7=?8t7nX41dZdrWLoh0kOIrkB^p?!9FW@*5$E_+LU*VQ}d)jxFGWb}VE;w@1c! z3N%9FLvG(6#6KhOTl-Td`(d+xQ2)bNO%(Vo^lrfnIjZiabNq-U??h=wBkcW;Q|6R`_Tvq= z)_KSSHBUU~=!{gg@q=Vh(=kt6+$XlIYdA0W{ z+%P*k{_6gCogB$Evc~V1G*%)@QkKGqNyy|C{)0qzCcA9sFtE@VpH5$j;V}iX$VT5VhuJv>Jb7-?j^f6zg z)<8c9*fB47`fhhI4MkropntL~&-*y2d^3!Bb-Nd(--*0hkOb;G)K3x`Id!xg*J!7` z^z=~I7qQPK2=28&;gNtt7fEHacw|`IF&LZ+H@v9*)N;a`4%6SXir$Y{H}9uuPCx*O zd~!p@QvBGcttp%^iNKV?lbZ%4cJ<~&od2=-(g8up=PlJ%x8!q;e=&M#-Ym$|? zHPD0q^IO;61cpiDoyoFO_?y#5?MOWylBtYVs5Cijor5eP1DF-918;sHpE4yY6q&D(>?HfT^Jf?Rm^nU z-7vj>TCF#BcUztccdY4GPlOM=k=0qatlLrPt9X(3nE)(a%9Q{GMtrwXz&5U|^u2xx zmsa&g%O&{CaU?(7=!N;!h4seRrmGlXe^)t&ng?wCZj*U<;l06PL*uG3{pJ?zgvs#( z@kFfEpU>aIF2H#1U3NVGe-sGDY1F+Zq%r8cUijD0dwkgA4T>@3<>sn~Qj+jFYKlu! zjdicAx_#(I(rR^VqmKlV4nv@aY~QUq4+mu?tmvWH!;2hfD2*LS}{!-Db&ggZZ_@%v;0djaC&fyC%9 zl&TganIB^RhqBjywUP$N1QZP<3eRab1wI|yiDkU#X z&d;Al@@zxH%PalLmqmscna(6C%xEU&zzBEg7+8Qa!*>ol zj1U+ZZTRv3<*yiL@oPOSed`l=1}u;rUOA6~__`D1h#VYT`qqRpC;2b+UY?`!b6iY# zIGXFxZ4{}%X}(zTY|L-eaQ*Upc|!qQLRZ^0`BLrL|0V$G_dfXsa=19fgp$(jEg|KH z_+Nw^mX6m4c;n`jFaFRs`0u7lpVhxCE-p%wpL~gH;@HKttksTFHi!8+uZ zvPu`~++&~cSLLiNN&(w%;85nCJ9PBQFMv5vP0I;^W|G_c zb^Lp2YP&bFGzz8{TLZaF1SemVGmPa+wcOV`)9$N1n5fGC8oDQi2}Nd`?YgpC%_K?{ zvxZHi>fAn5k~$wu{~+yd-&_OY#91y$@K0VkkiKR&JUi_kH`Aw1J2L5-I-;2#PYBCv zWghPv|NRJO$;<{ikxRYN+gr6mXcxslUbGH3-E3k%MDnaR7lYOv?>%om0pWFa60fd- z_nI0h?AGGNPePhoQ`RL3_ej{G78J&vI%v)9h{t@+St`)}q!!NBt*4#mJr0$2`%&g$ zV9W`GBg+Lery2db-J1A~Q{Z^PY`5tpi`$^)Bs<|MF%R~aYHMp@ebY9c$Z~c<>Tu$L zztMK_yb8Uwu`*BZhgd=1vP8=Mm&-F@wOT?Jr!3vuugC0Q@O4DsG0)K%s1ndGS`3pP z={R@N5uO0X@X;qzrbC3Y?{*h?XwxXLrN|@yqLUf|m_Nb6DsDF8_W?)L2 zTh*r8))tFe5WQWal*5C^Sm8&|)p6DW;SJ~+y0JLp`QQ_WKze9t0wH+$PCxwZpf zC(y7nFt|3(Q(#^8 z;s@9()KLw(t!PWSvC#=+$$Qi^b?19m--zSl2^@5)WKIUWg_hEKX|(zUg#tz@6jOkn z2?dF1!~J;!ZB&u9Zc@qBh|UtlD-|n;Z%L+8FQmQi60m|VP98i$fyFhw=!DT zu6@SRXmjd+ly&5DjZ&WmNu?9R+aFxPqotz_!+%7m2t#C_b1eBet%ciF*BfXE zAU7qp@YegZEGTRjI>BSs-T_BrXdm7BnMvHq!JD&=HvPUmz;lCzbf4JVa!9$IjPzHb zxAz2swl7VXqY=|=)gE&p)&uAHCr;uJa=p|Lai>+){Dvp|4%x@9mZ`x{UL^To6#E+i zL!;4MZ`5-1GchwGLFulPmN>BthTM`%+V4(FJpe*Q??qN%3n`%AkBXgH^=V{i&fGhT zrVWFzBTC;X<_Zovq>3K<0%-0$_kq$>lX5(E)&D$=7LX1>Dg?a_)-u- zL)ekC{Z;Y_ZcjZ^dPHnwz&s-#Un6`td+L)fT%I>_;L1utE>a&xAY=_CPwk$|N?n~A zW^M2{)lR}L=NpeE}6jZ`o$tt%{5_W2F2puJcQc$2TdD=w_z%)q{4(hE^s_!@b)0kB<%8 zPHB2A{<)=(m1bN%KHf4%c0R*1%tg-&?`eT~$soMD&u^?Ql<_^P;;KgTzmAU0ECq{C z1?EnTOh6_A3=sEKr!=83VTO;{Pq&xIu-qz^XFHXvu z4NIUm7aqN{HtwegnTxmMdIn!V;N9Zc7CvuoG8cNg_^^;gk%~rn5ls|KhmOuSSZr4O54r(7A6qq>2}l=Mh%dlF+_hE#!5mD z=~YN%9_0%#%gaJKU;i=SHB(|5R>FT2cy)_(XA~73j90!xPutd>Fw-8*RcG3t*mBNM zz>=kEoWpQADNCzPvtpgWV3U7zNxQt0EEd}x#C3My6p_SvH-xZ+f+(W`*Pn)7sPp#q zJGmK*@JCM?#JN=k|53XO=OZZG6#~ZT+86`TrBx9GzPZZw$U(}-$@d3dQ0`M$So@zF zAv@Mk6CrD(yJ=5Vm!yzV7-heyRuyj?)8CG z7(Iq6?+i@34hn+4MFxI?Qi}WNeMuA+338y~?8^=<)?hN*15-!_M^R8vbRV_Bj9S^q zke!9J*sbY8C3lQ-Ken~x2a|{8cc8U=dvkdO;9tS#lLaUMCc@MD2IQY=dq^YD_rw$OeQxPxVz27aZZ`QMkJVfs>0{a1%S!qBPwfVU%r5KDQn-#e+2LD_R|nBv%c!MeG`}| z$RK<0?YrnJe@BkfX|LD(f~h1bOBbzfh`ac@TML$il8b(y&P2#5<_0?(!eC6s_^>z3ktkWZ zFOAG>vU$x9Fyz8Za(?b$t=%4((aNaf2syhVZ|7u4Om(z60CrF;@FRBZodr z34~Xi7;7%uvNVJKsuAv&cvWML5TZ;S45;cG+(#E?fN%ANukRvh7Eu&)uI=0Ab*|7t zp=Q1;RNKB+1xw+AD)Krne*L8Z@PUfOyYI^+GRMb~8Jq`Yr|SLho4TgxtKC*Bsfy(@ z;NiD-(E`jo3B;-5(b4e%6N|}w$6xA>lYWB9a6Gb|zI3L83@6E$fKBC@ioafESi&7! z-EQpeN*IQbws13V^xatN?{xp7`2ha1Mu`ibroY(fCdlUAA}42A4-8ju8^X4@VSYm~ z=zggGZ5yzvWUkA&3&S7p=C2a}!02_2EtnJLPt_yC*qv#Q=w(Ho^_*2$x>n6^At+JO zi#X%%Y6Jhce_OIg$4%ekdDUAc(EvRMyP1*PNE$UC^_7#K%hXFiFq-|wvGwXQb9z#aep!h zMncbWiK?n}LfC&U?aysZ&%usk@wE-Sw*9kE;>;?IFqrxQlM!G&oS<1-TmPloKpyY1 znG1#eH-)LGY1V|fXgF$p`c(jUkJm+rH$SUn?N+w2&yj8S!DVl}^Xj=!CI75IC1{z? z#CEmiE+IqV^Df=$g6c0Y1+4B;`Lm}+abLjO-8ThFBG``o!D22$wizTOP9NOdFkw{* z`~ACvppZj>S6uXmazG=NsI;)}ab*nsu7t)v$u_sU>1~$?u69OJ-v;}?N#&w2v(yM@ zf$5j^qgW?r2Jd)D7`5vF-S;lA0*OC862oum_x+i65fZC_CMF*mf&18e^>+DMVLN~F zhrnSM$vdE*9{>cFc#_Dzw-4)^u4Gk5Ry^h)0 zOhe%H!DK(bgW>xPD65@D&V=I3N_yQfpJI+UdQ40V)q>mWMAOy|6@zD)7X2WvuyW0N zi&2%$8GTbhwh&Nc?z(O*Qnwkf!%#$iqAu$F{i>0&!ej4ET%PlRT9jM+nRPS8_6mt&@JZ_zO-=vHRWi(q8nRu^xDe!&Bh5b zsh2Ak-~D|IUi7c@b`>l@C5Bv{oyh>4o%6i5YQHY2baqE<(S;2?lUu?)ovmz=)simh z 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 literal 47886 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¨=Z8+w8gNqw5c%9aXi8+hAbKaQ5K3R5Q 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 X$`@XssImqlz<;DA6vWF!4gCKv0&wjF diff --git a/core/fileformat.txt b/core/fileformat.txt index 3ba93461..9d64ec88 100644 --- a/core/fileformat.txt +++ b/core/fileformat.txt @@ -36,4 +36,5 @@ The following file format versions exist: 1.4: Introduced with OpenRocket 1.1.10. Adds the launchrodvelocity and deploymentvelocity attributes to element. The motor - digesting algorithm was changed. + digesting algorithm was changed. Adds and + elements to stage components (except sustainer). diff --git a/core/resources/pix/icons/copyright.txt b/core/resources/pix/icons/copyright.txt index 6583a503..7320b950 100644 --- a/core/resources/pix/icons/copyright.txt +++ b/core/resources/pix/icons/copyright.txt @@ -34,3 +34,4 @@ help-license.png help-log.png help-about.png help-bug.png +help-tours.png diff --git a/core/resources/pix/icons/help-tours.png b/core/resources/pix/icons/help-tours.png new file mode 100644 index 0000000000000000000000000000000000000000..546d8a79918997b4832e3f36d46a0069b2ab0837 GIT binary patch literal 837 zcmV-L1G@Z)P)MhlsiB#&m1(6xp=2yHsp$QrvLs?qKl)=~X+%WyB7z<$ zrIwf)wn|%1%bX!)iBwwCx#iltZg;yo{W50S2j}1SeVlW?a|lF)nNXHM<}e_T^~dH# zaYMvHny0*GtUW$5jfjX-sw_#oqi%OWyW`$D`%u$$bXqN})A<{pJT#j3=Vll*lzYc&DxbUw{6Ft{W#1OC^X^g?Mst+~r9fkzaP3uj)K~;L!S2715n{ zIqa|<+6KYdXytT#bulfT3CE}`VP4J_>BPD`>4Zoq=D_&u6z_&}rp!8vwF`36@+I}R zYM&z__Pu?F7xjhSr7`ML=@Pjra8?~j6hF#V(!LS}qG2K4DAHa-L?8)=MXJ$iQvd+i z7zMOBv3~T&7el9Qa3F9$&scxW{XW~xahe6N41prVlb1nq`4mr{$P=`jcSE{1*!G-#sY-H5)KqV4yPMoVJuw$LySsC|5KaKx~ZqI(`Yx!rvfv|k3vhya2ec4EfE004iK zoN{ih08lHzW$y8LYCfit?RLwz?%{C@goT4tL_u1Fu;70Ns;unQ(NQu00B{0VfW8SI z2>|f+`&b8vL=Yb2gTjRH!qO0aS)edIDo(j8QFC?!ZC*n+TmkQ|5oo@8sfH^~G7*Rf zi}*ZQm3~f7W*8%L|NI3XVsoJ(WS+7Ag{djXY7u7e=z`^uOqx23p-52>JQXY$J@#Or zBuH2C@^4Ig)xqVCBg+^(qD9}=UbK$8v46yly_JWN-Z&R=S2ChOhqj{y-aYXm!=!G? zAMA_|J!m|6Xbb~jeNvCuScTYn0o%%phj+w>9t_kF|9)eZM4p&mT3jBNKEH_LXK5+0 zUfa8eqvqZp4Npz4ufJlL!9e~r0|0 frames = new ArrayList(); - + /** * Whether "New" and "Open" should replace this frame. * Should be set to false on the first rocket modification. */ private boolean replaceable = false; - - + + private final OpenRocketDocument document; private final Rocket rocket; @@ -126,7 +151,7 @@ public class BasicFrame extends JFrame { private final RocketActions actions; - + /** * Sole constructor. Creates a new frame based on the supplied document * and adds it to the current frames list. @@ -140,7 +165,7 @@ public class BasicFrame extends JFrame { this.rocket = document.getRocket(); this.rocket.getDefaultConfiguration().setAllStages(); - + // Set replaceable flag to false at first modification rocket.addComponentChangeListener(new ComponentChangeListener() { @Override @@ -150,7 +175,7 @@ public class BasicFrame extends JFrame { } }); - + // Create the component tree selection model that will be used componentSelectionModel = new DefaultTreeSelectionModel(); componentSelectionModel.setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); @@ -164,10 +189,10 @@ public class BasicFrame extends JFrame { selectionModel.attachComponentTreeSelectionModel(componentSelectionModel); selectionModel.attachSimulationListSelectionModel(simulationSelectionModel); - + actions = new RocketActions(document, selectionModel, this); - + log.debug("Constructing the BasicFrame UI"); // The main vertical split pane @@ -175,7 +200,7 @@ public class BasicFrame extends JFrame { vertical.setResizeWeight(0.5); this.add(vertical); - + // The top tabbed pane tabbedPane = new JTabbedPane(); //// Rocket design @@ -185,8 +210,8 @@ public class BasicFrame extends JFrame { vertical.setTopComponent(tabbedPane); - - + + // Bottom segment, rocket figure rocketpanel = new RocketPanel(document); @@ -194,10 +219,10 @@ public class BasicFrame extends JFrame { rocketpanel.setSelectionModel(tree.getSelectionModel()); - + createMenu(); - + rocket.addComponentChangeListener(new ComponentChangeListener() { @Override public void componentChanged(ComponentChangeEvent e) { @@ -208,7 +233,7 @@ public class BasicFrame extends JFrame { setTitle(); this.pack(); - + // Set initial window size Dimension size = Toolkit.getDefaultToolkit().getScreenSize(); size.width = size.width * 9 / 10; @@ -246,7 +271,7 @@ public class BasicFrame extends JFrame { JSplitPane horizontal = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true); horizontal.setResizeWeight(0.5); - + // Upper-left segment, component tree JPanel panel = new JPanel(new MigLayout("fill, flowy", "", "[grow]")); @@ -264,8 +289,8 @@ public class BasicFrame extends JFrame { im.put(KeyStroke.getKeyStroke(KeyEvent.VK_O, ActionEvent.CTRL_MASK), null); im.put(KeyStroke.getKeyStroke(KeyEvent.VK_N, ActionEvent.CTRL_MASK), null); - - + + // Double-click opens config dialog MouseListener ml = new MouseAdapter() { @Override @@ -306,7 +331,7 @@ public class BasicFrame extends JFrame { JScrollPane scroll = new JScrollPane(tree); panel.add(scroll, "spany, grow, wrap"); - + // Buttons JButton button = new JButton(actions.getMoveUpAction()); panel.add(button, "sizegroup buttons, aligny 65%"); @@ -327,7 +352,7 @@ public class BasicFrame extends JFrame { horizontal.setLeftComponent(panel); - + // Upper-right segment, component addition buttons panel = new JPanel(new MigLayout("fill, insets 0", "[0::]")); @@ -351,7 +376,7 @@ public class BasicFrame extends JFrame { } - + /** * Return the currently selected rocket component, or null if none selected. */ @@ -485,7 +510,7 @@ public class BasicFrame extends JFrame { }); menu.add(item); - + menu.addSeparator(); //// Close @@ -520,8 +545,8 @@ public class BasicFrame extends JFrame { }); menu.add(item); - - + + //// Edit menu = new JMenu(trans.get("main.menu.edit")); menu.setMnemonic(KeyEvent.VK_E); @@ -529,7 +554,7 @@ public class BasicFrame extends JFrame { menu.getAccessibleContext().setAccessibleDescription(trans.get("BasicFrame.menu.Rocketedt")); menubar.add(menu); - + Action action = UndoRedoAction.newUndoAction(document); item = new JMenuItem(action); item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Z, ActionEvent.CTRL_MASK)); @@ -538,7 +563,7 @@ public class BasicFrame extends JFrame { item.getAccessibleContext().setAccessibleDescription(trans.get("main.menu.edit.undo.desc")); menu.add(item); - + action = UndoRedoAction.newRedoAction(document); item = new JMenuItem(action); item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Y, ActionEvent.CTRL_MASK)); @@ -549,7 +574,7 @@ public class BasicFrame extends JFrame { menu.addSeparator(); - + item = new JMenuItem(actions.getCutAction()); menu.add(item); @@ -564,8 +589,8 @@ public class BasicFrame extends JFrame { menu.addSeparator(); - - + + item = new JMenuItem(trans.get("main.menu.edit.resize")); item.setIcon(Icons.EDIT_SCALE); item.getAccessibleContext().setAccessibleDescription(trans.get("main.menu.edit.resize.desc")); @@ -580,8 +605,8 @@ public class BasicFrame extends JFrame { }); menu.add(item); - - + + //// Preferences item = new JMenuItem(trans.get("main.menu.edit.preferences")); item.setIcon(Icons.PREFERENCES); @@ -596,9 +621,9 @@ public class BasicFrame extends JFrame { }); menu.add(item); - - - + + + //// Analyze menu = new JMenu(trans.get("main.menu.analyze")); menu.setMnemonic(KeyEvent.VK_A); @@ -619,7 +644,7 @@ public class BasicFrame extends JFrame { }); menu.add(item); - + item = new JMenuItem(trans.get("main.menu.analyze.optimization"), KeyEvent.VK_O); item.getAccessibleContext().setAccessibleDescription(trans.get("main.menu.analyze.optimization.desc")); item.addActionListener(new ActionListener() { @@ -631,16 +656,16 @@ public class BasicFrame extends JFrame { }); menu.add(item); - - + + //// Debug // (shown if openrocket.debug.menu is defined) if (System.getProperty("openrocket.debug.menu") != null) { menubar.add(makeDebugMenu()); } - - + + //// Help menu = new JMenu(trans.get("main.menu.help")); @@ -648,11 +673,11 @@ public class BasicFrame extends JFrame { menu.getAccessibleContext().setAccessibleDescription(trans.get("main.menu.help.desc")); menubar.add(menu); - + // Guided tours item = new JMenuItem(trans.get("main.menu.help.tours"), KeyEvent.VK_L); - // TODO: Icon + item.setIcon(Icons.HELP_TOURS); item.getAccessibleContext().setAccessibleDescription(trans.get("main.menu.help.tours.desc")); item.addActionListener(new ActionListener() { @Override @@ -666,22 +691,6 @@ public class BasicFrame extends JFrame { menu.addSeparator(); - - //// License - item = new JMenuItem(trans.get("main.menu.help.license"), KeyEvent.VK_L); - item.setIcon(Icons.HELP_LICENSE); - item.getAccessibleContext().setAccessibleDescription(trans.get("main.menu.help.license.desc")); - item.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - log.user("License selected"); - new LicenseDialog(BasicFrame.this).setVisible(true); - } - }); - menu.add(item); - - menu.addSeparator(); - //// Bug report item = new JMenuItem(trans.get("main.menu.help.bugReport"), KeyEvent.VK_B); item.setIcon(Icons.HELP_BUG_REPORT); @@ -710,6 +719,21 @@ public class BasicFrame extends JFrame { menu.addSeparator(); + + //// License + item = new JMenuItem(trans.get("main.menu.help.license"), KeyEvent.VK_L); + item.setIcon(Icons.HELP_LICENSE); + item.getAccessibleContext().setAccessibleDescription(trans.get("main.menu.help.license.desc")); + item.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + log.user("License selected"); + new LicenseDialog(BasicFrame.this).setVisible(true); + } + }); + menu.add(item); + + //// About item = new JMenuItem(trans.get("main.menu.help.about"), KeyEvent.VK_A); item.setIcon(Icons.HELP_ABOUT); @@ -723,7 +747,7 @@ public class BasicFrame extends JFrame { }); menu.add(item); - + this.setJMenuBar(menubar); } @@ -734,7 +758,7 @@ public class BasicFrame extends JFrame { /* * This menu is intentionally left untranslated. */ - + //// Debug menu menu = new JMenu("Debug"); //// OpenRocket debugging tasks @@ -770,10 +794,10 @@ public class BasicFrame extends JFrame { int sel = JOptionPane.showOptionDialog(BasicFrame.this, new Object[] { "Input text key to generate random rocket:", field - }, "Generate random test rocket", JOptionPane.DEFAULT_OPTION, + }, "Generate random test rocket", JOptionPane.DEFAULT_OPTION, JOptionPane.QUESTION_MESSAGE, null, new Object[] { "Random", "OK" - }, "OK"); + }, "OK"); Rocket r; if (sel == 0) { @@ -792,8 +816,8 @@ public class BasicFrame extends JFrame { }); menu.add(item); - - + + item = new JMenuItem("Create 'Iso-Haisu'"); item.addActionListener(new ActionListener() { @Override @@ -808,7 +832,7 @@ public class BasicFrame extends JFrame { }); menu.add(item); - + item = new JMenuItem("Create 'Big Blue'"); item.addActionListener(new ActionListener() { @Override @@ -825,7 +849,7 @@ public class BasicFrame extends JFrame { menu.addSeparator(); - + item = new JMenuItem("Memory statistics"); item.addActionListener(new ActionListener() { @Override @@ -860,7 +884,7 @@ public class BasicFrame extends JFrame { stats[2] = String.format(" Used memory: %.1f MB (%.0f%%)", used / 1024.0 / 1024.0, 100.0 * used / max); stats[3] = String.format(" Free memory: %.1f MB (%.0f%%)", free / 1024.0 / 1024.0, 100.0 * free / max); - + DetailDialog.showDetailedMessageDialog(BasicFrame.this, stats, sb.toString(), "Memory statistics", JOptionPane.INFORMATION_MESSAGE); } @@ -897,7 +921,7 @@ public class BasicFrame extends JFrame { }); menu.add(item); - + menu.addSeparator(); //// Exception here @@ -952,10 +976,10 @@ public class BasicFrame extends JFrame { }); menu.add(item); - + menu.addSeparator(); - + item = new JMenuItem("Test popup"); item.addActionListener(new ActionListener() { @Override @@ -972,9 +996,9 @@ public class BasicFrame extends JFrame { }); menu.add(item); - - - + + + return menu; } @@ -989,7 +1013,7 @@ public class BasicFrame extends JFrame { } - + private void openAction() { JFileChooser chooser = new JFileChooser(); @@ -1067,7 +1091,7 @@ public class BasicFrame extends JFrame { filename = filename.substring(filename.lastIndexOf('/') + 1); } - + // Open the file log.info("Opening file from url=" + url + " filename=" + filename); try { @@ -1140,7 +1164,7 @@ public class BasicFrame extends JFrame { return false; } - + // Handle the document OpenRocketDocument doc = null; try { @@ -1182,7 +1206,7 @@ public class BasicFrame extends JFrame { throw new BugException("Document loader returned null"); } - + // Show warnings WarningSet warnings = worker.getRocketLoader().getWarnings(); if (!warnings.isEmpty()) { @@ -1198,12 +1222,12 @@ public class BasicFrame extends JFrame { trans.get("BasicFrame.WarningDialog.title"), warnings); } - + // Set document state doc.setFile(file); doc.setSaved(true); - + // Open the frame log.debug("Opening new frame with the document"); BasicFrame frame = new BasicFrame(doc); @@ -1211,15 +1235,15 @@ public class BasicFrame extends JFrame { return true; } - - /** - * "Save" action. If the design is new, then this is identical to "Save As", with a default file filter for .ork. - * If the rocket being edited previously was opened from a .ork file, then it will be saved immediately to the same - * file. But clicking on 'Save' for an existing design file with a .rkt will bring up a confirmation dialog because - * it's potentially a destructive write (loss of some fidelity if it's truly an original Rocksim generated file). - * - * @return true if the file was saved, false otherwise - */ + + /** + * "Save" action. If the design is new, then this is identical to "Save As", with a default file filter for .ork. + * If the rocket being edited previously was opened from a .ork file, then it will be saved immediately to the same + * file. But clicking on 'Save' for an existing design file with a .rkt will bring up a confirmation dialog because + * it's potentially a destructive write (loss of some fidelity if it's truly an original Rocksim generated file). + * + * @return true if the file was saved, false otherwise + */ private boolean saveAction() { File file = document.getFile(); if (file == null) { @@ -1229,45 +1253,45 @@ public class BasicFrame extends JFrame { log.info("Saving document to " + file); if (FileHelper.ROCKSIM_DESIGN_FILTER.accept(file)) { - return saveAsRocksim(file); + return saveAsRocksim(file); } return saveAs(file); } - - /** - * "Save As" action. - * - * Never should a .rkt file contain an OpenRocket content, or an .ork file contain a Rocksim design. Regardless of - * what extension the user has chosen, it would violate the Principle of Least Astonishment to do otherwise - * (and we want to make doing the wrong thing really hard to do). So always force the appropriate extension. - * - * This can result in some odd looking filenames (MyDesign.rkt.ork, MyDesign.rkt.ork.rkt, etc.) if the user is - * not paying attention, but the user can control that by modifying the filename in the dialog. - * - * @return true if the file was saved, false otherwise - */ + + /** + * "Save As" action. + * + * Never should a .rkt file contain an OpenRocket content, or an .ork file contain a Rocksim design. Regardless of + * what extension the user has chosen, it would violate the Principle of Least Astonishment to do otherwise + * (and we want to make doing the wrong thing really hard to do). So always force the appropriate extension. + * + * This can result in some odd looking filenames (MyDesign.rkt.ork, MyDesign.rkt.ork.rkt, etc.) if the user is + * not paying attention, but the user can control that by modifying the filename in the dialog. + * + * @return true if the file was saved, false otherwise + */ private boolean saveAsAction() { File file = null; - + StorageOptionChooser storageChooser = new StorageOptionChooser(document, document.getDefaultStorageOptions()); final JFileChooser chooser = new JFileChooser(); - chooser.addChoosableFileFilter(FileHelper.OPENROCKET_DESIGN_FILTER); - chooser.addChoosableFileFilter(FileHelper.ROCKSIM_DESIGN_FILTER); - - //Force the file filter to match the file extension that was opened. Will default to OR if the file is null. - if (FileHelper.ROCKSIM_DESIGN_FILTER.accept(document.getFile())) { - chooser.setFileFilter(FileHelper.ROCKSIM_DESIGN_FILTER); - } - else { - chooser.setFileFilter(FileHelper.OPENROCKET_DESIGN_FILTER); - } + chooser.addChoosableFileFilter(FileHelper.OPENROCKET_DESIGN_FILTER); + chooser.addChoosableFileFilter(FileHelper.ROCKSIM_DESIGN_FILTER); + + //Force the file filter to match the file extension that was opened. Will default to OR if the file is null. + if (FileHelper.ROCKSIM_DESIGN_FILTER.accept(document.getFile())) { + chooser.setFileFilter(FileHelper.ROCKSIM_DESIGN_FILTER); + } + else { + chooser.setFileFilter(FileHelper.OPENROCKET_DESIGN_FILTER); + } chooser.setCurrentDirectory(((SwingPreferences) Application.getPreferences()).getDefaultDirectory()); chooser.setAccessory(storageChooser); if (document.getFile() != null) { chooser.setSelectedFile(document.getFile()); - } - + } + int option = chooser.showSaveDialog(BasicFrame.this); if (option != JFileChooser.APPROVE_OPTION) { log.user("User decided not to save, option=" + option); @@ -1282,45 +1306,45 @@ public class BasicFrame extends JFrame { ((SwingPreferences) Application.getPreferences()).setDefaultDirectory(chooser.getCurrentDirectory()); storageChooser.storeOptions(document.getDefaultStorageOptions()); - - if (chooser.getFileFilter().equals(FileHelper.ROCKSIM_DESIGN_FILTER)) { - return saveAsRocksim(file); - } - else { - file = FileHelper.forceExtension(file, "ork"); - return FileHelper.confirmWrite(file, this) && saveAs(file); - } + + if (chooser.getFileFilter().equals(FileHelper.ROCKSIM_DESIGN_FILTER)) { + return saveAsRocksim(file); + } + else { + file = FileHelper.forceExtension(file, "ork"); + return FileHelper.confirmWrite(file, this) && saveAs(file); + } } - - /** - * Perform the writing of the design to the given file in Rocksim format. - * - * @param file the chosen file - * - * @return true if the file was written - */ - private boolean saveAsRocksim(File file) { - file = FileHelper.forceExtension(file, "rkt"); - if (!FileHelper.confirmWrite(file, this)) { - return false; - } - - try { - new RocksimSaver().save(file, document); - return true; - } catch (IOException e) { - return false; - } - } - - /** - * Perform the writing of the design to the given file in OpenRocket format. - * - * @param file the chosen file - * - * @return true if the file was written - */ - private boolean saveAs(File file) { + + /** + * Perform the writing of the design to the given file in Rocksim format. + * + * @param file the chosen file + * + * @return true if the file was written + */ + private boolean saveAsRocksim(File file) { + file = FileHelper.forceExtension(file, "rkt"); + if (!FileHelper.confirmWrite(file, this)) { + return false; + } + + try { + new RocksimSaver().save(file, document); + return true; + } catch (IOException e) { + return false; + } + } + + /** + * Perform the writing of the design to the given file in OpenRocket format. + * + * @param file the chosen file + * + * @return true if the file was written + */ + private boolean saveAs(File file) { log.info("Saving document as " + file); boolean saved = false; @@ -1330,7 +1354,7 @@ public class BasicFrame extends JFrame { return false; } - + SaveFileWorker worker = new SaveFileWorker(document, file, ROCKET_SAVER); if (!SwingWorkerDialog.runWorker(this, "Saving file", @@ -1413,7 +1437,7 @@ public class BasicFrame extends JFrame { } - + /** * */ @@ -1480,7 +1504,7 @@ public class BasicFrame extends JFrame { } - + /** * Find a currently open BasicFrame containing the specified rocket. This method * can be used to map a Rocket to a BasicFrame from GUI methods. diff --git a/core/src/net/sf/openrocket/gui/main/componenttree/ComponentTreeTransferHandler.java b/core/src/net/sf/openrocket/gui/main/componenttree/ComponentTreeTransferHandler.java index 4855112b..ff4ae578 100644 --- a/core/src/net/sf/openrocket/gui/main/componenttree/ComponentTreeTransferHandler.java +++ b/core/src/net/sf/openrocket/gui/main/componenttree/ComponentTreeTransferHandler.java @@ -32,6 +32,7 @@ public class ComponentTreeTransferHandler extends TransferHandler { private final OpenRocketDocument document; + /** * Sole constructor. * @@ -69,15 +70,15 @@ public class ComponentTreeTransferHandler extends TransferHandler { } - - + + @Override public void exportDone(JComponent comp, Transferable trans, int action) { // Removal from the old place is implemented already in import, so do nothing } - + @Override public boolean canImport(TransferHandler.TransferSupport support) { SourceTarget data = getSourceAndTarget(support); @@ -89,6 +90,17 @@ public class ComponentTreeTransferHandler extends TransferHandler { boolean allowed = data.destParent.isCompatible(data.child); log.verbose("Checking validity of drag-drop " + data.toString() + " allowed:" + allowed); + // Ensure we're not dropping a component onto a child component + RocketComponent path = data.destParent; + while (path != null) { + if (path.equals(data.child)) { + log.verbose("Drop would cause cycle in tree, disallowing."); + allowed = false; + break; + } + path = path.getParent(); + } + // If drag-dropping to another rocket always copy if (support.getDropAction() == MOVE && data.srcParent.getRoot() != data.destParent.getRoot()) { support.setDropAction(COPY); @@ -98,7 +110,6 @@ public class ComponentTreeTransferHandler extends TransferHandler { } - @Override public boolean importData(TransferHandler.TransferSupport support) { @@ -121,7 +132,7 @@ public class ComponentTreeTransferHandler extends TransferHandler { action = TransferHandler.COPY; } - + // Check whether move action would be a no-op if ((action == MOVE) && (data.srcParent == data.destParent) && (data.destIndex == data.srcIndex || data.destIndex == data.srcIndex + 1)) { @@ -129,7 +140,7 @@ public class ComponentTreeTransferHandler extends TransferHandler { return false; } - + switch (action) { case MOVE: log.user("Performing DnD move operation: " + data); @@ -184,7 +195,7 @@ public class ComponentTreeTransferHandler extends TransferHandler { } - + /** * Fetch the source and target for the DnD action. This method does not perform * checks on whether this action is allowed based on component positioning rules. @@ -214,7 +225,7 @@ public class ComponentTreeTransferHandler extends TransferHandler { } MyDropLocation location = convertDropLocation((JTree) support.getComponent(), dl); - + // Fetch the transferred component (child component) Transferable transferable = support.getTransferable(); RocketComponent child; @@ -228,7 +239,7 @@ public class ComponentTreeTransferHandler extends TransferHandler { throw new BugException(e); } - + // Get the source component & index RocketComponent srcParent = child.getParent(); if (srcParent == null) { @@ -237,7 +248,7 @@ public class ComponentTreeTransferHandler extends TransferHandler { } int srcIndex = srcParent.getChildPosition(child); - + // Get destination component & index RocketComponent destParent = ComponentTreeModel.componentFromPath(location.path); int destIndex = location.index; @@ -278,7 +289,7 @@ public class ComponentTreeTransferHandler extends TransferHandler { } - + /** * Convert the JTree drop location in order to work around bug 6560955 * (http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6560955). diff --git a/core/src/net/sf/openrocket/gui/util/Icons.java b/core/src/net/sf/openrocket/gui/util/Icons.java index 5c76bf24..8f304b63 100644 --- a/core/src/net/sf/openrocket/gui/util/Icons.java +++ b/core/src/net/sf/openrocket/gui/util/Icons.java @@ -43,7 +43,7 @@ public class Icons { SIMULATION_LISTENER_ERROR = SIMULATION_STATUS_ICON_MAP.get(Simulation.Status.OUTDATED); } - + public static final Icon FILE_NEW = loadImageIcon("pix/icons/document-new.png", "New document"); public static final Icon FILE_OPEN = loadImageIcon("pix/icons/document-open.png", "Open document"); public static final Icon FILE_OPEN_EXAMPLE = loadImageIcon("pix/icons/document-open-example.png", "Open example document"); @@ -62,9 +62,10 @@ public class Icons { public static final Icon EDIT_SCALE = loadImageIcon("pix/icons/edit-scale.png", "Scale"); public static final Icon HELP_ABOUT = loadImageIcon("pix/icons/help-about.png", "About"); + public static final Icon HELP_LICENSE = loadImageIcon("pix/icons/help-license.png", "License"); public static final Icon HELP_BUG_REPORT = loadImageIcon("pix/icons/help-bug.png", "Bug report"); public static final Icon HELP_DEBUG_LOG = loadImageIcon("pix/icons/help-log.png", "Debug log"); - public static final Icon HELP_LICENSE = loadImageIcon("pix/icons/help-license.png", "License"); + public static final Icon HELP_TOURS = loadImageIcon("pix/icons/help-tours.png", "Guided tours"); public static final Icon ZOOM_IN = loadImageIcon("pix/icons/zoom-in.png", "Zoom in"); public static final Icon ZOOM_OUT = loadImageIcon("pix/icons/zoom-out.png", "Zoom out"); diff --git a/core/src/net/sf/openrocket/rocketcomponent/RocketComponent.java b/core/src/net/sf/openrocket/rocketcomponent/RocketComponent.java index a5c8c66a..b1a57dbf 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/RocketComponent.java +++ b/core/src/net/sf/openrocket/rocketcomponent/RocketComponent.java @@ -77,7 +77,7 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab */ private ArrayList children = new ArrayList(); - + //////// Parameters common to all components: /** @@ -99,12 +99,12 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab */ protected double position = 0; - + // Color of the component, null means to use the default color private Color color = null; private LineStyle lineStyle = null; - + // Override mass/CG private double overrideMass = 0; private boolean massOverriden = false; @@ -113,7 +113,7 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab private boolean overrideSubcomponents = false; - + // User-given name of the component private String name = null; @@ -126,7 +126,7 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab // Preset component this component is based upon private ComponentPreset presetComponent = null; - + /** * Used to invalidate the component after calling {@link #copyFrom(RocketComponent)}. */ @@ -135,8 +135,8 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab //// NOTE !!! All fields must be copied in the method copyFrom()! //// - - + + /** * Default constructor. Sets the name of the component to the component's static name * and the relative position of the component. @@ -150,7 +150,7 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab //////////// Methods that must be implemented //////////// - + /** * Static component name. The name may not vary of the parameters, it must be static. */ @@ -166,7 +166,7 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab */ public abstract Coordinate getComponentCG(); // CG of non-overridden component - + /** * Return the longitudinal (around the y- or z-axis) unitary moment of inertia. * The unitary moment of inertia is the moment of inertia with the assumption that @@ -225,7 +225,7 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab } - + /** * Return a collection of bounding coordinates. The coordinates must be such that * the component is fully enclosed in their convex hull. @@ -245,12 +245,12 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab public abstract boolean isMassive(); - - - + + + //////////// Methods that may be overridden //////////// - + /** * Shift the coordinates in the array corresponding to radial movement. A component * that has a radial position must shift the coordinates in this array suitably. @@ -283,8 +283,8 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab } - - + + /** * Return the user-provided name of the component, or the component base * name if the user-provided name is empty. This can be used in the UI. @@ -345,7 +345,7 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab } - + /** * Make a deep copy of the rocket component tree structure from this component * downwards while maintaining the component ID's. The purpose of this method is @@ -400,8 +400,8 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab ////////////// Methods that may not be overridden //////////// - - + + ////////// Common parameter setting/getting ////////// /** @@ -441,8 +441,8 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab } - - + + /** * Get the current override mass. The mass is not necessarily in use * at the moment. @@ -495,9 +495,9 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab } - - - + + + /** * Return the current override CG. The CG is not necessarily overridden. * @@ -559,7 +559,7 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab } - + /** * Return whether the mass and/or CG override overrides all subcomponent values * as well. The default implementation is a normal getter/setter implementation, @@ -607,8 +607,8 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab } - - + + /** * Get the user-defined name of the component. */ @@ -662,7 +662,7 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab } - + /** * Return the preset component that this component is based upon. * @@ -690,7 +690,7 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab if (preset.getComponentClass() != this.getClass()) { throw new IllegalArgumentException("Attempting to load preset of type " + preset.getComponentClass() - + " into component of type " + this.getClass()); + + " into component of type " + this.getClass()); } RocketComponent root = getRoot(); @@ -748,7 +748,7 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab } - + /** * Returns the unique ID of the component. * @@ -767,8 +767,8 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab } - - + + /** * Get the characteristic length of the component, for example the length of a body tube * of the length of the root chord of a fin. This is used in positioning the component @@ -838,42 +838,42 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab this.relativePosition = position; fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); } - - - /** - * Determine position relative to given position argument. Note: This is a side-effect free method. No state - * is modified. - * - * @param thePosition the relative position to be used as the basis for the computation - * @param relativeTo the position is computed relative the the given component - * - * @return double position of the component relative to the parent, with respect to position - */ - public double asPositionValue (Position thePosition, RocketComponent relativeTo) { - double result = this.position; - if (relativeTo != null) { - double thisPos = this.toRelative(Coordinate.NUL, relativeTo)[0].x; - - switch (thePosition) { - case ABSOLUTE: - result = this.toAbsolute(Coordinate.NUL)[0].x; - break; - case TOP: - result = thisPos; - break; - case MIDDLE: - result = thisPos - (relativeTo.length - this.length) / 2; - break; - case BOTTOM: - result = thisPos - (relativeTo.length - this.length); - break; - default: - throw new BugException("Unknown position type: " + thePosition); - } - } - return result; - } - + + + /** + * Determine position relative to given position argument. Note: This is a side-effect free method. No state + * is modified. + * + * @param thePosition the relative position to be used as the basis for the computation + * @param relativeTo the position is computed relative the the given component + * + * @return double position of the component relative to the parent, with respect to position + */ + public double asPositionValue(Position thePosition, RocketComponent relativeTo) { + double result = this.position; + if (relativeTo != null) { + double thisPos = this.toRelative(Coordinate.NUL, relativeTo)[0].x; + + switch (thePosition) { + case ABSOLUTE: + result = this.toAbsolute(Coordinate.NUL)[0].x; + break; + case TOP: + result = thisPos; + break; + case MIDDLE: + result = thisPos - (relativeTo.length - this.length) / 2; + break; + case BOTTOM: + result = thisPos - (relativeTo.length - this.length); + break; + default: + throw new BugException("Unknown position type: " + thePosition); + } + } + return result; + } + /** * Get the position value of the component. The exact meaning of the value is * dependent on the current relative positioning. @@ -905,7 +905,7 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab } - + /////////// Coordinate changes /////////// /** @@ -1044,7 +1044,7 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab } - + /////////// Total mass and CG calculation //////////// /** @@ -1104,10 +1104,10 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab } - + /////////// Children handling /////////// - + /** * Adds a child to the rocket component tree. The component is added to the end * of the component's child list. This is a helper method that calls @@ -1138,10 +1138,18 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab */ public void addChild(RocketComponent component, int index) { checkState(); + if (component.parent != null) { throw new IllegalArgumentException("component " + component.getComponentName() + " is already in a tree"); } + + // Ensure that the no loops are created in component tree [A -> X -> Y -> B, B.addChild(A)] + if (this.getRoot().equals(component)) { + throw new IllegalStateException("Component " + component.getComponentName() + + " is a parent of " + this.getComponentName() + ", attempting to create cycle in tree."); + } + if (!isCompatible(component)) { throw new IllegalStateException("Component " + component.getComponentName() + " not currently compatible with component " + getComponentName()); @@ -1156,7 +1164,6 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab fireAddRemoveEvent(component); } - /** * Removes a child from the rocket component tree. * @@ -1199,8 +1206,8 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab } - - + + /** * Move a child to another position. * @@ -1614,7 +1621,7 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab } - + /** * Returns an iterator that iterates over all children and sub-children. *

@@ -1648,9 +1655,9 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab } - - - + + + /** * Compare component equality based on the ID of this component. Only the * ID and class type is used for a basis of comparison. @@ -1668,19 +1675,19 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab } - + @Override public int hashCode() { return id.hashCode(); } - + //////////// Helper methods for subclasses - - - + + + /** * Helper method to add rotationally symmetric bounds at the specified coordinates. * The X-axis value is x and the radius at the specified position is @@ -1703,7 +1710,7 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab protected static final double ringMass(double outerRadius, double innerRadius, double length, double density) { return Math.PI * (MathUtil.pow2(outerRadius) - MathUtil.pow2(innerRadius)) * - length * density; + length * density; } protected static final double ringLongitudinalUnitInertia(double outerRadius, @@ -1719,10 +1726,10 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab } - + //////////// OTHER - + /** * Loads the RocketComponent fields from the given component. This method is meant * for in-place replacement of a component. It is used with the undo/redo -- 2.39.5