From 11dab839825810049c8e1aa65be5c7c8fb6ab77a Mon Sep 17 00:00:00 2001 From: Matthias Neeracher Date: Tue, 2 Jan 2007 07:09:06 +0000 Subject: [PATCH] Implement cut/copy/paste/delete --- English.lproj/MainMenu.nib/keyedobjects.nib | Bin 23357 -> 23744 bytes Sources/VLModel.cpp | 131 +++++++++++++++++++- Sources/VLModel.h | 17 ++- Sources/VLSheetViewSelection.mm | 28 +++++ 4 files changed, 174 insertions(+), 2 deletions(-) diff --git a/English.lproj/MainMenu.nib/keyedobjects.nib b/English.lproj/MainMenu.nib/keyedobjects.nib index ded72fefd18f7440994c6e7608981efd50c02d72..9cf7ecb65d073c20dc57914e6801f4663c123b20 100644 GIT binary patch literal 23744 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 literal 23357 zcmb`v2YeL88#g{PyL)$gX?y8Cm)?`R^xUN#cNaivNa!^rM+k%@q|nO_AT~r0LFv6n z7Z4kYil~SPiZlUHq=O2g2o`vs-OD8>#{c_!Kc9b;WXsI=dFGjCo_U^UW_EaeO?6|F zPWLs!h#&^Bh(ii>uG-K)s=T3MWc4^(L%*oH;iGI7O^yAc;I6T{uC^?ysjhyg;L*Lb zi*2H<($rFLhlV_jlt_h=ksf8DJXDA}pknj{dJ;W{mZCLiEn0_OMVrwUv;*x%d(a!` zZS)@c5FJ9Fp~L74^c6aT&ZBS91#}TzK|i89=ofSs-9vw1j1^dk)mXrOI2ecEP#lh9 za57H8dYpv|a3L063cMPx$6N6>ydA%WU&s6KyZAl)0X~R7$H(xO_$zz@pTXbZ@9{-^8DGb@ z@g4jNzK8$D5Ah>{2uoauD{&+4#FGS&KoUfPiI&8YI1*11ND9d$StOg}kUU~07Gfox zNl#KjdXZAnmkc38$uLq$Mw1#chKwbX$TTvYh=h_S$@63`d4Vh-OUW{_oUA6VlFeib z*+KS_H^`ghE%Gk;h#VvzlTXND@)bEwz9whLIdYzSOTH&p$dBYF@-xFR3P#DO88^m< z31pHPJ(JB8FA$TTq%m`TiZMr39(Pcd_uh0G#mIkSRU&un0} zG25BfnZ0oTF7pv{kU7DeX3jDfnID*I%q`|e=4a+MbBFnzxzGH~5|&{VEYG^KzHA_? zWuw?cHi_-Tc451*{n^3n5Oyd#oULN(*|BURJCU8rPGhIDPqMSwr`c!NXW8f2IqVDU zJa!qoie1O9XE(4L+3oBOb|<@=-OIkm?q}bZ?>}Y_v!BDiFWJ-V87TFQ{O$+#2743A z+=99r*k9QP>>unS4sk5!!g+84r{R3KU@n9UQKsmv=&KkC&qpfi6%*mVNsOyvy5d>I0>v`Ldc|hN z7R5HjYl=OJcNF^+2NfSHzE+%9e5<&sxS@EUB#MJd7e&0%Td`XiqPVV%QKl+&%3P&E znWtQ(Jg4$k1*ig5L8@R?m?}aQiT0|ZR57Y}a!!??N>rt&QdMcHbXA5bQ@RYQ{}6Qpu8EbEGnz2Sk+0@S=B`quj;Pqq3X#_hIhSGrK&!v{;EN$2TUh^5u3-q z%)i1f=9lnG`DOfaeg(ghU&XKH*YIokb^LmM1HX~q#J|dK=C|-$`EC4meh0ske~sV8 z@8OggnI#?Z|4poP# zwd!znggR0krH)p|sAJV}>Ued6I#HdZPFCyG>FTWBQMJuAH5UX=#3MCwL9WORxg!rG zAPw?FUdS8yAYbH%{80c3L_sJRg`iLrhO{UgMW9F&g`!amibZiK9wneel+>qtX|KAv zran;>HRX+sgS(gZup4Kv#Er5^HcQWKjeW{%nr+g1b6ssMSZ^@fjRU)vb}t`eYm~~u zb#VjSjIV1LEtRs@lHLpe%<4+H5WJ8p*ujPh0o_YY6&1F|#_HkKHPuZMTd?aIBtpe? zwN2g1Ys;%_4MPQ?dug9)C{|I&$z(o7aRbFyMV{iDRrq^};R)J5D|-Sc3|XaR@Nd+}Kn%#_`h5he>2XoSi$E z>niHXTf0o+(u^#~3cZz5XIBAHwaSjz5p`ONI-$=y7 zXf&!pV^A%sL-lAZYCw&s2{of}Xgr#LCZb7bGMa*>qG@P45)nl+&`dN-REz#%h!`ox ziz#A;m?P$kCebQ(5qpZg#R1|_u~Hl*)`^Yc1aYc3Lwrh{BhC{Sii^eN;#zT|xJBF{ z?h)S--xWWkID+D2iqk31q&S;mBgF+2cc9oxaYu?fQ{0{6UKIDGcp$|?DXyfrn&R5y zAiCM;DfBdY20bfvN?mh9g{^P*(yryhZ8f5w=py=_hB9-|^Jp%50nJ16(TivSdI>E= zi_pvH6|@*Ff#PM=O*OWmf=2d&tYe$2$91c#>{i}58oC6=k^BVordzFTOkHhtMc29t z(5N1@oyWikk@}^2f~``%fg#<^R@*H4h;E)>7?9}hIsMV2N1})5CAxksbFvIAM=Q`u zve}it)st)`W2AAxkD#^or;_QbYiR58_t6K?!vSJ&dp-OS^zcDP z4?}kZib3{H7%F&nkPLy=R8ymEs?!!X0KJ|LZjVUZdXzUbl-E|-I@iiC4Q(Wkp)Y}C zs2I^6$*+Ori58NlfuvRpmq~_6_2qo;#Er;=Eg9)M(eoN!6UK>-= z%FFj6JEWnxwkPOV*Yb&V%}q{>Ttb(Dkti{)Jw~npBiCCPxdn{Gh_Nyw(QS1@ld8tEuDx~MVY!$ZJCQDsK^BDNsXaFee z(lY#musimE5o)nDHdWWkmK~TQVyc+l4tv-WEyP}S31MGgPcNp)5`x%C>MD7N;s6|o zgJkwrQoM%ZRiGIq&DBlXK6Mr4HP-S*TTRJW2cKGz9nfTJ7$Xt4J;quTj+U9p6thps z_)ew>$2rtgW+bacPC6KBrs2@%PQ)CfbdpFy>KZC-4YGd1IIOKKZ>W^Z_bjiq)jUQ& z182(gbH%*&gpq@DvB60g22XHdkZ80^WMHT2N}IMv(@2OHOGXYAd`H5)eCwn!k9URz zTV;v`Vo`e(JAwF}DHb}2frMppZ4&M+k$bE?y>O|F-a)jqhu+6Y_oU7>J7n6g6tq|x z_t1*wS_v4g|Iv!pk&cJrVL+o;e4;%H6~KRGi^QscLMO4aEUb>L0}PMCqh-~ZN%1T& zwoN4y9NkwhvSk&{gBdsCCZN?-?9m>r@jz>W6RmDycRQ`#JiIL6M$5ZPPMme$*9YG86K zF*>MSf=Q@C@+2IuoSJ+UUjtJ0VnchRZaR%ZsmWtoM&XE|Lf}7%Y0De6{p*^wWfSYc z2McYgtE#H8NnSv8ZF607qfA(?0gO3O{}ulR)SJZd?NPrE4Sis5D3a#lW^tU{(6HX- znz}|?$@sx79*KP0hDr!w0Cl1`r5#kFKnsb|33ZY<*^UY^&iInrLAAE=j_Jt>QXm?D zoF>xtAiV+7#|d(}DB2-y;L1xnPz!xuH@L3eR@)AACIew=+okJ?Sbk5RPO}(jQFe_bR_6(IRp%nJ7YqPz;!8Db7vB! zMkk>dh!Kc9FTU`v8Icq?W<mad%;>qtEy zt`OIpk(~{v$cHqb1*8cC&}8zGaNnQ&rcrp(B?|6&B@A4oFGK^QPH2Uu7yZfIeF^p{|@ zQtF_js@1rW`7+|B|3X{{h%I3qAW8yzRovWy$PAVddxG**gH`^*OU1TBO)T8UDLt&Qz%WIOc8PH}g8ef%20?{dHc z_-o=WJ2(VoPc)CImx7d5_>xiJ`bloEt)cZ<=h~L^jH$s^?j-(q$UdO@y7*>$RQKat z^1huamU@4$_=ZfiBY4}gW1$77QroS(sbZwIv}t0Et)vg|Bl{Po#-26h)wN~NH%`up*Dykg~cqUyz(2Cs7bNEq)-r z2d@76(v$^hAaWK`Kl`CxpRVBBwM3IOu=XJhy(&k@N-mJ^){^h+fv2||V)kf;BtTPZ z-02ivkRQk;A_ZI@iw7tUZ?A)NjVRWdQAbBhx3|Z!8@SH%}Wso^&tS^V=G=a1`$WfY93@Y>(F{07dWY3<;ReIJn zR!ccZfGBMSYbr4c5R%G5b*Zi5VF6K0#6QIcD)9^P5Am>g)X{)c@!o1CNj!SOArIi! zA0(2&WHSEZ5%IqGyLe1I;wYXg-rK+!7$cL%uK{8~IAe(5O` zfr_3l>smKnG9%0ow2T?b3}ecf;Y@l<3{0+N5klN#20P}k;)>dNwt z(7}~9IeEp5V5-(IRmcccrHuIrfUIUlF{7CpW(-ry)G_tUSkOh86^TcwIi>aG6_V1( zH&XgeYD#%ic}-oFoXk5Xo)r}0H{zK-r4u2T8#AZ^kmYTXj#;!v7E5TMW8qlypy4 zjmw}K7eOnmks0dt2(D(vBR`G3>e&%Dok&`RqU@n`Y2Ov^_a%982U zOU={gg5d^ve#3k$kLFL9Pnko^XYzPH%zVxqVZLCFg01+H`3g)+6w?`0Q(nt~zU*8J zla!RO10|84^=&AxmlmdA@{#YQ%j#PBQqrSl$no0hZRJgoMcqVs^m!t;hg$JYWZ`Z5 zXyhY{dfTrei#pgZ#GiP(+MQ%htz%Bv^%MqHX_KuU3~QTOo?*UO&wS%hO39wsOSC7M zZwb^HUY<6n|BjA;?}NkRChU3tXRu}HEj z6q3D1oq)EL+)f-SPpE99yvcziRZfMw7QfWo&2M>8y;58x~yYe>QBsrCF3>u4P_i{b3qqec*xfJQ~1wvLS3J19ce5 zZ}6iS79r*JMDQKh2&qma#mdLjhV@}%*jP4BQX3hQVqc1ZC=ctHoV}lc%_#3n{^0YN~;lK}t?b))s~%_#vL%OMBWH zs_QDND>_RN#klesSZwLg+|*Q8D^G!G@`6um&9?O=$C_Aq4Is$`?M@t|39Xe?;7|fI zghh?gk{0Bs$4D7{7>+Vhqr7fpuhc>vV&n3O@ZO2E{N5hoz|tDbxD&i!9qrL9)59W) zeZ(N43&m=RUBnXzr4LPV-_zB#pPb0F@_J-%SyIPJaAjE=3xe?kVSLkG%j8y#`e&o%AJzlmuYy*064XmL;f)M-+wux=t$TqX%*zxQHhj#$0s68eA?Y$}4UeGE@ z1EdDExC?FX27@!uc4tSO#7^G8PG+Y#>@=u`6C!kgy~4lEV@8e?T(p?O7C%%nhgq3Z z+qZ-449O0%vm`r6aiC-fg8;zMFWSzvjo_Nq$O}r3Su4B03#L{!x=yhTke3awG;yZo zz-4weur*+Enm!%Iep)VY7&tjSB}12%lV(dy2P@!oW4G??^X%L;?A(^M+Lp-9Hl`jJ zfx+c7rhK#whM=jovPbJGkO87n?844xUt||Zi(>3c>_T=C`!boszQW|QOW36_+d-wC zX?``T(B`<_53*zyLhdeqDNO(;&H7))L)#WCUyilZrx1FdA2 zvn!a+vY99y2~iIWRS+12aui3|XE}B?yJjuBhFvQ)#$PrI4Hnyo^5&YR#ump9f^(Sp z+ipM!!4x&y3|je5V@jW{lB?9S8j=yc=ugSSF_tFPJqa>#SM`IHEB)S)*$)afY_(2Ou^}eT^nCxcdcP}$r~^%)pCxjykVmK z)gJcswe0K8tJjZA=p$&uoo##p%@nb{2vzpge)?5U>#ap?s(SL z@DJIKTBTt1e7}E;NC!St_Y=bK()rSICkxIUq8o7C%Ld^Wqp-!zm?>I#sTt0 zdD3!Z>smF`K`$SqMRB%7GOs-buK>_hXzq1K1rx@e>qx0~TS9aZ2x^1stqUII`!QTAG!*I;?va2}9n6 zz`1em@|5%<#R~?>>#b#Vbv47wVXv2$ef6c~URp1$ZOid-UYxf?ya&Z4?Gg8ToOsVx z;&rfV&I}tIq-{lYu+gX*wiHP#1!Zto2diAeVeOzn8#7c0gB=eo)a_eTswc_DwWPkYQnp@m$uJ;7<0L>a}srIZ}ST?WFm+FV|vmE!#p7;TzKkU=l2 zvpPpF|d$bafA2?C!#C4V^4WqcdWlydv$f}#OtjZ~t7d}B&ePu$O zYfBRQO7NYX^`Q^fSAqp&Ke9d93;@`H&afjW7wyUstRW3(qagw}hn87d-#+s7`#zDxl*gd4dJ zxdU7u?jSmio*@R(8{KE}xX-yG*ur(z^WLOS} zBgA#EX`o4rqIibbQP%vYpqF8d0(SLv5qH9den?Yn6-QIN5Hgq$eJ!H+ISQK%qQzV> zl;ZK?mk>yalEV+4t~in672uVKI!I!^Eq0}NHpOdYeSBUFgS~&x!!lihc!lD*6mJv@ znU!wE1RgJcwE0yDP;^<^C6A)GA+RZ%tC-I z?_uKp<{om7;J(cMhd=-M|7II z4~s{M6i;bk3{wB&2KIo}YOQ^{Rtr6aM;kqFh@R1XQS!xr=3~3MB+~sHdkq{M28#FA z;sf{;YzVfAqs99FxkrFEC$T$tiHDU0D~x{!e3E!?J6;PazX=B6Zrn)TA-(Ye7$$3A zI346Zhg~S3D^G%M4})DguY*$ckyQN?Q>t>VuA zAcYSrhX0Ec*z`G0r2cFflC?=^6uzzZmqCv}*7!H|KWdP#Pwdi;;7CAk!Bss+aDf2=33;wicZ z-BPSLYSLi?wbjde#`lE=CD54FL*O735315?E& zXSMmSx>ZW|f7OLKdh`EK7cEgb`~G%yg-Lqr|5Ep~Qu{BuFpF&eAL?>y&h7EKFcv9( z(YbQJZm?TH>hhMpQl`ODD0hTA3(n5B+zAe5`;9R5Qw#$LuD5{KF%UGRtrjG@lt$*} z8YxpRV{lXn&V=O2q0?Y-)r>#(Ws9*d_Jw0V@C2rAHC&%YLHIB_4W83WTn&>1Pj`|D zxC)-%g6m^Yri!b9(pB8I(sL#Weji3l$e(Bl_*sCGRj%BM7~Err3&f-eJ~oI10{*S@5m1_KY$F^6JT2Vj*XOf0}oUUjuP~87jU;g zQQW|l(!pK|cqZL;ftxV69Ra^#N&yWX4U2B@;yH08ln4X23~oSdT_lXr@Cg3wkl!7J z-y=j1zxdxo>V=$(Jh|uPGgWs@Ka=g(kaJs=!W(;J4-BFfYZ>Eqy z(<1E-syI`!0WjapmVD+gumr{6G^fgbs_ZYrvfv8vlP|V;%2FGjlH6mE@&;(qG$$`v z@=6xkePrl~P`ms3r6dA3Nfh-hUh-X0_WI1AwcpxBpuC{`PWip^qVfmjCFN!173Eds zHRW~X4dqScE#;5OpOil!P3fohe zT1T2vN>0kBxumRnuN*zBYD(rrN@wRv$^}abs!)+FNq5|Y!%enRDLo)KYUtBiN=d5_ zjtX&5A;+mgdYK-69B-3FwwGQy+~&Z@aJrDrd9VAVKv5ndu<7=f8gRmdRnT|7Dj|P~Rk#1mU zwcQMn$Hx*l?KaanMn@xX6dEJN>1YU;3U@pdb>j%?g{DHR-U}Zf9l4j#*!ClKG@dhp z&F?Qo?Wh5j;c{f}^TbRM z=2R&+Fbd3FDi}PqlplcN-628H0phv&Qj*}q|4I|cX8{Mn9MDrX?2r+PfU|}JAqoSt z+Skb#f}#IM)q^J?COcjeu9ciw{+cn$B#d-2}95AVzS@&0@OAIJys z!F&iG%7^hBl##knvdaQ`8YnFPv8^zBtDr>;Zu1XujkYFbUuU6jWihrm0KE)3x z{)1wW_g@tMP4PpDA5nrR!4&3r!cf9e!cn52L`jK?5}pz@B`%b>QsPF5J0%{J2$X0j z@ub9y5^qX;DDkDlj}m`M0w@WjB#4q=NXG)%+qzffoDd|Q@cS?Ft(vy-BN_tUJN=X?dy(#HK zNnc9(QPQ810hA1+WDq5TDH%e^P)deTQclTmN-8L+q{K$a2ui9b8A(YsC8H=AO-T(U zV<@Smq>hq$O2$&sKuIGdO_VfKGLDk*luV#xA|;b3nM}zP3ft1jG)ksZB2q#rnL)`+ z4Gt5QYp_!IOL#$eAbctqgfE4e!YScBp{MY)uu6#5U`BXOgB8LVVUh5T&|R1!oE4S` zQ#IH}_*S68Tf#P-6$1V!p>bb>8649a>JbSHg1;m^A_W(Y>;RT=ENK$lC^ifnRCMy;yR>H?LK2?0CIHEYF zIIcLMIIZ{wKC1DZ;s?bQ#Wnb_#*d2Iio1$?(g!w_?n*)FsSHv^D`S<(tY6l%FfVP##sD21oc7xVe8S|5nwj8dOcHajFTbNvbKT zX(~}QLp4h^TlKW+S=AiXT-7|)i>jAYi&U?umZ+AgR;X5~)~MF0HmEkKHmkO(wySok zcB%HL_Nv}gy{&pz^}gzW>SNU*)#s|Cs;^WhRHs#ERo|+x`BV>Ntw<1P5C#;5Q(jW6Ic8sET2 zGp@r2F#dp#Up$15UHHSNE8;-jJ=BBLL)636!`02|Y3iBkx$2kIi`6^SZ>smJPpPk{ z@2Y=O|E_-E66g}_66&ILiExQ>iE%Ny+3K>xy`k4Rj554RzJJM!2TBrnzRi z=D2ou?djUzb)c)wwZXN?b)4%2*Tt?&U6;GAbY1Pb)^)w>Ue~u=_qpzO{m}J@>q*zs zuD9K=n}?gm&CAWl&Ce~z&ES^jR^V3T*1^r<*4wS0+d#J=Zsl%`Zq07f+(ftM+?Khm za9icJ#%-P32W|)44!V8fcF66p+Yz_#+^)Obba!zNb`N#ex<|N2xm(>kx_5T(?%vbA zmwTCeANS$zmF`pB=eo~xf6@IV_eJh+xWDE8j{Cdr``tfqKj41C{jB>f_n+KvyZ_?; ztA~$=pGSa4kVl9|m`Aurf`{3or$;Z3GLJqU<2@#NO!k=SG2MfD%=DP&vA|=I$6}A= z9xFXId2IIB;jz!-J&*T2KJ@s(%tORqj6%552V4*$&qjp?40cP#K z@CTT>hZ>|I8dk$=Tr}PqUrn$kUX!Rv)}(5BYI>K8$CbryzKdl=dYgk zJnwr2cm;Wdc!ha|dqsLhdnI}$dl|htc|GCP)vLQ#o!3~eMz3bC@m>?XCVNfyqF!^o zmU=DsTIsdg>qD=Pygv5&)ax^^&%M6zI^%WL>$=xHulrtqc>U!a;vME4?j7kJ?H%hK z@15eU^Dgl2;@!==hj)p0gLjknIPVGGlf0*RPxF4kd%pKt@15Sey!UwT^*-)>!uyo> z8Sk^+=e;j@U-5qAsNr`D(5XTHw@ zpM^dz`z-cZ>a*NuozGUEw|w65dDmyZ&v!l-eJ=T2@ww)6!{?UI9iNB3F1~KQ9=;mi zEZ;oe0^cIv4!#!OV&6`_Px$ur9pF3IcbM;J-!Z;V`M%`4$oCcBCBFN8Kkz-^d(ih2 z-$TBKeUJE_@;&2w#rK-;4c}XS8b2>TA3s080KXu=5Wg_LWWQ9uJih|JBEJrPResfe zqy5JC)%lI}YxHaOo9j2vZ@J$}ztw(g{XX*h*zZ%n&-_03`@-*--zC2*{tACDe;L$o0gA+aIxAt@n+A;lp*LP|mggbWH98d4L|95N|{hAawM5wa!Z zjgW&OpM)F=IUI5%srkRL*BhujbOBUBOU5$YWpADS4N9GV)c54D7rgqDW(2^|_b zGIUbtQ=#)hmxsO@x;OOw&`&~-hu#kTCG^+Od!hG3AB6rH<{6eAmKl~EmK$aa%MU9I zvxJq0RfO5Xs=}(nMupXc%?w)?wjpd&*ygaUVcWxYhV2bI9(E$^RM?rYvtj4Lz76|L z>#OzG25N(~p<1mrLR+XcY0X-zwxhO__6hB9?Q_}%+LhX^+BdWxYL9A9YtL&hXs>Cn zYk$%Hsr_5~FkBffgolR5hNp$+h4&917(O_BXn1+}@bJp;DdFqGH->Kt-yFUrd{6j0 z;h%+n6@D%JPWb%@A;K>rBO)szC&Cbs7f~3|HDYkY(1?){qatb|XvEBj*%41iJR7kp zVq3(Hh+Pr;BR+^Y8gV+}`-rQN{*i%^A(7h1$jGS3*vR$p&I}~?0?q)oScZ>Il_m2;X4~-9xkBZNa?-f5VepvjN z_;K-5;}^#7jejeCU;O^~592?I|0Mpi_{;GR5)=u1f@^|Df@gwHLQFzjLPA1PLTW;O zLidE83B3}^68a`IC5%s)lrS|xOqh}IWWu_HZ3$l_TuQi_a3kTzgxd*s6Mjp$pXih5 zpBR)Fni!rKnHZC3N$i$bn>aSHDRF$_q{OL-(-UVTE=XLM_;TWs#N~;*6F*A)IPp;8 z;lwWz&n8|=ypi~0;_W0&l2?*%l7CWQQgBjOQc_ZCQd&}GQir5|Nw%b_q)|y@lIAAO zOInb$FzMx_#YxMO4kTSp`X%Ytq~DYNNDfL4N!BJuCPyd7CMP6kCFdk}P41sOFnLIF zdGd_pS;1i^7F~_l9wfKOx}~cH~FpPeaYvOFC@U0Q&U!?tV&s%vLR(t%I1`9DSK1i zO!*+?ibB^%>vrmP>-Os2(!Ha5SNFc|L)}5$C%Qwr!@4hY z$8=xmPUueS&g#zVF6h43UD93AUDw^z{iM62yQ{mWd!YMM_qXnm9_v}XQm@v#={@us zy_eoc@23yY2kXQ1;rb|jtUf`XtWSmXV}?FUpR3Q)7wAoTi@sRjN#8}^U0|`t$k=`iuI@`m6fu`kVS6^|$p8(o|^yX~Ah> zX%T7BX(@05FgMMZmY3E&ZG76qw8?4H(!{hGX|vL1r#+LlFl|NJsBhp8vk4mpeuS;)8Z%&_(J~@3=`kM50>Fd)sroWoLC4F1^SLt7;pG-fMekT2F z`uX$=8LA9*hHHjLh9<)+!zaTpBQPT@BQ7H$BRwNCqbQ?8h9#poqf^Ec8I2ju8RIi1 zWlYJKmLX=$$apeibH>(;?HM~VUdz~>@p{G^8Q*1G%($F!E#pSUt&E>CZfD%h_%oBu zRAjnjx@T%K12cm&lQVUh>6uxXxtV#Hg_#{Pt(mo%^_dNsjhW4v<1!~?PRg8`xgm2? z=H|>TncFhAXYS10mANPLeCCDB?=vrDUdgrNkO0#-r_01ZPH7ILz)=OE7vR=troV7G-S=NfIRatAYwq@2)|XjdXPwMClXWiZLe}?LKV)6bx|Ve#+bi2A+b`QcJ1{#aJ0v?SJ3KojyKi>? z?19;XvWH|3%`VTb$hKwIX4hvoXHUx(vlnMC&0e0pDtm4A`s|I_uV!z_-j=;Hdsp_J z?DN?dvcJ#1n0+bxa`x5i>)AJRymNeW{BweGLUO`#!gHc>Vsm=t^vWsA>6_C(XJF3Y zoMAZ?IdgL6=FH1kkh3u7<($Pi%W_uce46uF&gVHtbH2Lk+_XHba%6+E8PtHPjm#3{8e{hKYtLhG_Go_93wtGp9=r}NI{eVg}v-le>&c{lQY z%)6a;H}78FgS@};9_5pKE?<@JlJB0c$@k9p%MZ*C$=Bvb=Evm6=O^W-=BMRn=I7)a z^9%A#`Ih{S`Tg@p&B=vdKLMJI|*7o9CSUv#19V$tQIYehGTZWaAh zbi3$o(Qiffi~cD3tLUK#n^=>=q%ygf+)aYX%j9G7GX+`sgJ3@X^?4%soYdy8etk~8fB_6)tc%} z4W=g3IMYPa6w`DQHO(?TWqQUm$Mk|}zG;DJk?9rFQqywND$`oidebJ;X46*FcGFJN zF4OC#H%)Jw_L<%@ePB9Z`q*^Hbl7ynbj)5}P+>6+<=>6Ynd z(|yyQ<}`DrImc`?7nn_Ei@Bru33E4dPjjickGa2jka?(ixY=eNX&!B^HIFqnna7(a znWvgX^Gx$>^E2i-<`>K_nira1F)uZ*Ft0YRGjB9+Hg7ZUH19U=HNR!vXWnoA(0tJR zsrj(^3-g!eug#~--1yd=>1F9{>1P>e8Dc57R9dPm zqby@A^_E7cTt)AEz$j^$U&@0LF-e_N52 zv2s?GRc&>(x?2USr`6l)YxTDVT7#{jR;@L{8f}fWCRmfKDOQ~|&6;7&vgTL~)_iNB z)nqkWt=5j#&eks0Zq^>wUe+>eA8SABK+os)~Bt{TIX2jTIX9ASQlDfwl20VwJx`=w637i}{mFXAde{1!^>^z7>tEJ~#i*Dm=8BcYe6dThTd_y6rr4|4r`WGJpg5>Fv{+jl zQ5;nqQyf>EP@GhpQmiXZE6yy=F3v4B7Uvfi7MqIA#l^)vic5-n6%Q;PQarSHWbx?Y hn&Rf-NyX0;&n;e1yxM+rkr4Y|b-w+t<9G4e{{!=DO0NI_ diff --git a/Sources/VLModel.cpp b/Sources/VLModel.cpp index 43e0190..c1c8345 100644 --- a/Sources/VLModel.cpp +++ b/Sources/VLModel.cpp @@ -792,8 +792,11 @@ void VLMeasure::MMAChords(std::string & chords, const VLProperties & prop) const } } -VLSong::VLSong() +VLSong::VLSong(bool initialize) { + if (!initialize) + return; + const VLFraction fourFour(4,4); VLProperties defaultProperties = {fourFour, 0, 1, 3}; @@ -1681,3 +1684,129 @@ void VLSong::iterator::AdjustStatus() fStatus.push_back(Repeat(fMeasure, times)); } } + +VLSong VLSong::CopyMeasures(size_t beginMeasure, size_t endMeasure) +{ + VLSong subSong(false); + + int8_t firstProp = fMeasures[beginMeasure].fPropIdx; + int8_t lastProp = fMeasures[endMeasure-1].fPropIdx; + + subSong.fProperties.insert(subSong.fProperties.end(), + fProperties.begin()+firstProp, + fProperties.begin()+lastProp+1); + subSong.fMeasures.insert(subSong.fMeasures.end(), + fMeasures.begin()+beginMeasure, + fMeasures.begin()+endMeasure); + + if (firstProp) + for (size_t i=0; i= beginMeasure + && fRepeats[r].fEndings[0].fEnd <= endMeasure + ) { + VLRepeat repeat = fRepeats[r]; + for (size_t e=0; e= beginMeasure) + repeat.fEndings[e].fBegin += numMeas; + if (repeat.fEndings[e].fEnd >= beginMeasure) + repeat.fEndings[e].fEnd += numMeas; + } + } + for (size_t r=0; r firstProp) { + fProperties.erase(fProperties.begin()+firstProp, + fProperties.begin()+lastProp); + for (size_t m=endMeasure; m= beginMeasure + && repeat.fEndings[0].fEnd <= endMeasure + ) { + fRepeats.erase(fRepeats.begin()+r); + } else { + for (size_t e=0; e beginMeasure) + repeat.fEndings[e].fBegin = + std::max(beginMeasure, repeat.fEndings[e].fBegin-delta); + if (repeat.fEndings[e].fEnd > beginMeasure) + repeat.fEndings[e].fEnd = + std::max(beginMeasure, repeat.fEndings[e].fEnd-delta); + if (e && repeat.fEndings[e].fBegin==repeat.fEndings[e].fEnd) + repeat.fEndings.erase(repeat.fEndings.begin()+e); + else + ++e; + } + ++r; + } + } +} diff --git a/Sources/VLModel.h b/Sources/VLModel.h index 24cd4b7..c11b7f9 100644 --- a/Sources/VLModel.h +++ b/Sources/VLModel.h @@ -219,6 +219,11 @@ struct VLProperties { // Determine visual representation of note head // void VisualNote(VLFraction at, VLFraction actualDur, bool prevTriplet, VLFraction *visualDur, bool * triplet) const; + + bool operator==(const VLProperties & other) + { return fTime == other.fTime && fKey == other.fKey && fMode == other.fMode + && fDivisions == other.fDivisions; + } }; struct VLLyricsNote : VLNote { @@ -257,7 +262,7 @@ struct VLRepeat { }; struct VLSong { - VLSong(); + VLSong(bool initialize = true); void swap(VLSong & other); std::vector fProperties; @@ -327,6 +332,16 @@ struct VLSong { std::string GetWord(size_t stanza, size_t measure, VLFraction at); void SetWord(size_t stanza, size_t measure, VLFraction at, std::string word); + enum { + kInsert, + kOverwriteChords = 1, + kOverwriteMelody = 2 + }; + VLSong CopyMeasures(size_t beginMeasure, size_t endMeasure); + void PasteMeasures(size_t beginMeasure, const VLSong & measures, + int mode = kInsert); + void DeleteMeasures(size_t beginMeasure, size_t endMeasure); + size_t CountMeasures() const { return fMeasures.size(); } size_t CountStanzas() const; void LilypondNotes(std::string & notes) const; diff --git a/Sources/VLSheetViewSelection.mm b/Sources/VLSheetViewSelection.mm index 240b18e..79bf75a 100644 --- a/Sources/VLSheetViewSelection.mm +++ b/Sources/VLSheetViewSelection.mm @@ -10,6 +10,11 @@ #import "VLSheetViewSelection.h" #import "VLDocument.h" +// +// We're too lazy to properly serialize our private pasteboard format. +// +static VLSong sPasteboard; + @implementation VLSheetView (Selection) - (void)editSelection @@ -74,18 +79,41 @@ - (IBAction)cut:(id)sender { + [self copy:sender]; + [self delete:sender]; } - (IBAction)copy:(id)sender { + NSPasteboard * pb = [NSPasteboard generalPasteboard]; + NSString * pbType = [[NSBundle mainBundle] bundleIdentifier]; + + [pb declareTypes:[NSArray arrayWithObject:pbType] owner:nil]; + if ([pb setString:@"whatever" forType:pbType]) + sPasteboard = [self song]->CopyMeasures(fSelStart, fSelEnd); } - (IBAction)paste:(id)sender { + NSPasteboard * pb = [NSPasteboard generalPasteboard]; + NSString * pbType = [[NSBundle mainBundle] bundleIdentifier]; + + if ([pb availableTypeFromArray:[NSArray arrayWithObject:pbType]]) { + [[self document] willChangeSong]; + if (![sender tag]) // Delete on paste, but not on overwrite + [self song]->DeleteMeasures(fSelStart, fSelEnd); + [self song]->PasteMeasures(fSelStart, sPasteboard, [sender tag]); + [[self document] didChangeSong]; + [self setNeedsDisplay:YES]; + } } - (IBAction)delete:(id)sender { + [[self document] willChangeSong]; + [self song]->DeleteMeasures(fSelStart, fSelEnd); + [[self document] didChangeSong]; + [self setNeedsDisplay:YES]; } - (IBAction)editRepeat:(id)sender