From 4803a0c3556aafb9481950c774b5c52d494fbe8a Mon Sep 17 00:00:00 2001 From: Dominik Stadler Date: Fri, 1 Jan 2016 16:28:01 +0000 Subject: [PATCH] bug 58618: XWPFParagraph insertNewRun and removeRun work incorrectly for runs after hyperlink/field runs git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1722503 13f79535-47bb-0310-9956-ffa450edef68 --- .../poi/xwpf/usermodel/XWPFParagraph.java | 38 ++++++++++++++---- .../poi/xwpf/usermodel/TestXWPFBugs.java | 18 +++++++++ .../poi/xwpf/usermodel/TestXWPFParagraph.java | 2 +- test-data/document/58618.docx | Bin 0 -> 10045 bytes 4 files changed, 50 insertions(+), 8 deletions(-) create mode 100644 test-data/document/58618.docx diff --git a/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFParagraph.java b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFParagraph.java index 4f2931886..a81ab3b1e 100644 --- a/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFParagraph.java +++ b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFParagraph.java @@ -1332,13 +1332,26 @@ public class XWPFParagraph implements IBodyElement, IRunBody, ISDTContents, Para /** * insert a new Run in RunArray * - * @param pos - * @return the inserted run + * @param pos The position at which the new run should be added. + * + * @return the inserted run or null if the given pos is out of bounds. */ public XWPFRun insertNewRun(int pos) { - if (pos >= 0 && pos <= paragraph.sizeOfRArray()) { - CTR ctRun = paragraph.insertNewR(pos); - XWPFRun newRun = new XWPFRun(ctRun, (IRunBody)this); + if (pos >= 0 && pos <= runs.size()) { + // calculate the correct pos as our run/irun list contains + // hyperlinks + // and fields so it is different to the paragraph R array. + int rPos = 0; + for (int i = 0; i < pos; i++) { + XWPFRun currRun = runs.get(i); + if (!(currRun instanceof XWPFHyperlinkRun + || currRun instanceof XWPFFieldRun)) { + rPos++; + } + } + + CTR ctRun = paragraph.insertNewR(rPos); + XWPFRun newRun = new XWPFRun(ctRun, (IRunBody) this); // To update the iruns, find where we're going // in the normal runs, and go in there @@ -1357,6 +1370,7 @@ public class XWPFParagraph implements IBodyElement, IRunBody, ISDTContents, Para return newRun; } + return null; } // TODO Add methods to allow adding a HyperlinkRun or a FieldRun @@ -1376,6 +1390,7 @@ public class XWPFParagraph implements IBodyElement, IRunBody, ISDTContents, Para int beginRunPos = 0, candCharPos = 0; boolean newList = false; + @SuppressWarnings("deprecation") CTR[] rArray = paragraph.getRArray(); for (int runPos = startRun; runPos < rArray.length; runPos++) { int beginTextPos = 0, beginCharPos = 0, textPos = 0, charPos = 0; @@ -1444,8 +1459,10 @@ public class XWPFParagraph implements IBodyElement, IRunBody, ISDTContents, Para int textEnd = segment.getEndText(); int charEnd = segment.getEndChar(); StringBuilder out = new StringBuilder(); + @SuppressWarnings("deprecation") CTR[] rArray = paragraph.getRArray(); for (int i = runBegin; i <= runEnd; i++) { + @SuppressWarnings("deprecation") CTText[] tArray = rArray[i].getTArray(); int startText = 0, endText = tArray.length - 1; if (i == runBegin) @@ -1473,7 +1490,7 @@ public class XWPFParagraph implements IBodyElement, IRunBody, ISDTContents, Para * @return true if the run was removed */ public boolean removeRun(int pos) { - if (pos >= 0 && pos < paragraph.sizeOfRArray()) { + if (pos >= 0 && pos < runs.size()) { // Remove the run from our high level lists XWPFRun run = runs.get(pos); if (run instanceof XWPFHyperlinkRun || @@ -1485,7 +1502,14 @@ public class XWPFParagraph implements IBodyElement, IRunBody, ISDTContents, Para runs.remove(pos); iruns.remove(run); // Remove the run from the low-level XML - getCTP().removeR(pos); + //calculate the correct pos as our run/irun list contains hyperlinks and fields so is different to the paragraph R array. + int rPos = 0; + for(int i=0;i}b3;o@ zk%2e7^)iJNMu!+$KjbgI-Q3#3g4EH(7`AZfwNFM54|@ZrmeZ|K*sV_F=2_n|!98!A zw$=C)J0$Nj@hPaA-ncdJoz2saQ>Qnt*_PmCp18EAed055UlSbS(~3u>=u|HJHicTS zz`G$fsK^fI13CEOutyfq1AK$d4HOikAw;a%dEvdn5N?D!Lf(M%rt)1lc2qK~EWIKB zk3gDLcKq3;Oj#$gX^bJGyQdQRdXu0G~%Kqdo_(^5e=`48^1XkTZQD2Zu==1 zs_TeD4D*9`X$nADx~jDVjJ1#hky5I!{h~L%1iGJD-cIwy2vaL~@?}u$k1;CoY2!T2 z3vqQBkVXQ1I>hZciEHV%Q}Ii5TN|tKtw+Kbl^u@o2@g*t;mtVF{HC*;K&ipz-I02` z+Sw9Rdz~Qs&=qy>qU=T?LuPl}@RbP4tj9+)+G`DtQ zW%*hD*De2peeo}!9`z0)2PcLea)PjGJm}2>L8Y8tT9L_hqdb5MN;`yc!yGMGZg0zf z+N=aI*#5pVqBx%sm@zBxK@hRZSbHvKF~dlD^^LntLnM-t_MmQhfF*|Xc(s+S-8`#c zd}6L(6nk0TdQFHJwJ@axXLY__@L;=Ia~x0>MKv~ll=MebS#$fqcTKqTw4!Bg3@ghM z(YgUGZo_#@eI61YREv|vk#K@RBxAcJ783?**?!09*YrP_NUYf=Xx_)0l%sO5S>?_B z06iK;#so8=OBfJ<4C7|!XvX@#j$&qK>S6<3&3-Ope>e>cbS;Cn{?EQ<6Gs$!*svupW$q+4 zg&b6J1ZN9KMfU?Rg0Soph9q39N62%oJ*9B0RF%8?nVQ47Ot)6@1@g6-8Y<9*JDa7- zg8GbmVU?O#NYrT#nLV2u&HW{EQJ>WX1i7p&atMj&w))}Ah%_~`vpgl(!quQk_Z-(Z zkYLm+#-MvkUuT1$V#R0+YR4fs)y5xdB70N)U6fOc0HvlZ;I3vo?tFE*nJEKE?)LrvM|o}%%f{Vz9sy(BA<`)6>P2~)qSPf-NiHXW>LCG)fUIr@gm_^=^};Fp;*qQH z0MDqEAEsX*J4(jQ$vNZZ-Q}wLB9D)~`wT0TDF4p6Z|`;5h@f+_6CwbB18wn(bAM&q zsQQpCgbllmXjcTg74k{n(%*Hwd8LecO}=BF0SO0*m=R-ZVEB^&(j?6m^CLV0O=Bd^`W3pRL&$ ztCK2<-F?+6@rE>DtY-9F>?t)o*(`~-K{bVwNN1R;9Gf25cigSQ} z0Qvi&=V8IgpZ!Dmd*gunI*#mMryzk)x2V?l)X)1zQG!W2uQYT-^7nitd#LI;WiFSW z@mE-MtYr0Q@Xc>{zj`rz+@(GbL$tE70GV-3fr|1*O z`Lg4mZG|5(cUca$x>Kad;)Xvtr6?gZ-1nq@v41C%rui87@-Ty1L$P$x{H{&Vk-?qS zoj7ug`&J}%g}ltAX32!JUv1-Non%2P=}I&`d-Ur9V3B_wGSxR!gb@pY3j!<-Sk&PD zz^VXrZq8)@AzXNO0 z?Wwb!>2p^SB$tTAj~UEh(q7w8a;xyE9V_kp3#ll;z zC4OtN$*O8;m3Mtw2Jg5RBPxWcaj!RSAIT|7$`+0X(8+M0(JL+++&hj*P@j2-CR87N zA-`a)@Q`81gik#Ss%@i>U#W|}Ty2S1PzRX=7;gIFpFkk*c z&nx_4ICHc@;lqrz`6sPBL^BFfr>nZ<*QQQOU8He+JUge+;}#7q`)e43>zX^K_ly;D zA(1>eVN;t%m=$EpCzi8lgQ+z~a#tjs3$LGeg#^5!%agAmJ_j*J)Df?4qTN8$**doK&l8!%{_m!k&M*e|=e%B_cV1l|?3U zwRiQkX9Gz@M|`~0CNpSDoweisaAJTWUnI-t{M!`KoV#}a<4w==j=MXL7ueI5wBwPi z*>@L*Ly=X&_xCN*1gBtsY4fYNeo$VLG1{@%JZGMKG=RCjO32^@Fq@bEl>Ot-v6m}AFremylEW9f5-G!I_c z?$_HUD*Z>MURr%Ek$3|gZL+8?oLKVGXSN_9`z5ggKBlZV{Ypk-%n|LDW%(APU^=)HD7p zI-q7ea6L5%!w0UcSZ=UO?aEwFk>S)?hFH4IPe!|LI~m|Dudv#s^pW99`$*BpNc;$L zwW(HrK31xRD>0sK2c2NDNoodDkvJsmJmMn-kOeWk6uIii4&I0wKdDA=9-rn_4M4#j;+-aXbz0*^QV{ZY!!p!E&CjhUNk7`t!fy9m$ zj5QX-->2z*3A2!U-&3LV#EZ9z1f6g`2oYWk0;^#VeBNY%frK|IlXGNyx$>F0AB|{_ z^2t{}GvVpC6Su{-nTZ1tO(=egC8zPio9|8Pa2t|oZxKI_uNQE%^uxL~U9R-Xd%#b$ z7Mx#z_&*h7W-^IM+f>cz*}fedu!4~Gq!E&D;J324OoVD96G^n=avv&!EfTgk?dl!- zK2sO>ya=wl&FoenlL=PS)so`o8dW2NWtz$?zZ(Iw9Z1p}QQf~N(9#Yxx>_gz2sBsH zY_OlHFD(_~*a+OFC#eW4gV6KVkfRqtho<%&nCg?yb8stZUrJ80+Q$}E*c5$U&!o}6 zz8GFR@M7lLz6(M_#rcwy(f8jR-!+RFM%Wk`Y=z9w_>%h(fp7NFW?Y+uw&H8&hYPDP z_~3gP$$&T^I(ga~g=ZQQ7cBDc%!6Knl6sR$2s}ZUD5U!&jir~aSd!TLMd@bdoofpH z*|%BdlXSCS1-{ix5|zU?Zls63@c~*+x~+NRnaRxyR#5q(`qA4O!Bx+Zh~04QjJd%Y z*wm!@0FC5}D*A4|1|8jx+gt{=+ui;|J1;`I@}9|kZAaP@seV-c%6V%pZdWYPj#Wp{ z6^aN(??%kKd1oUS#}emi4B2U;jo6jk=jI}B&@g*iOla2rR z!Bzyd9;YhGm(9(u53Xn7)Z?o9%2r$xL-7KRb)JvMpC*8p#D_Hhop241m=NEyT_>K4n89F1;l@*ka7C*CNcV8KVZl+8 z3~QbxVNBn%TN!;}WVWfk9eTDPrQNwEEoR+XNM5H-`1%fQeUDHd@5R2Ms(L`qkg&7y zTJq_Y_UwI4mSdexF{9A}UhQ6v4uVpJ@{H-gfYH zFP#Y~@x-&(buc zN=@j<`G{Oum~3j;)7ku`a0t;T-6#df@eq_h#`yK@`ct0DclzfUbJvsk;mmte&JRJP ziLgsqIkJ*MeUeXfT-Kv1dfZOAlB;E2u89&#tB>D)1j40sUkB*w(bxf0$z2b7as)ey zTSWemvv>H_Dqc__hy)J+;QkSOSwOR&YQ`qk=08bW`_9lVfDONIHRVtsu3eGgfea_w z>D&P;@)n@UG#yl5&@g;=(V{d}W&=ekZpLAsI(?zyVn zlh-_bD^+t-0#=t1cw)pp^4^Jr@TEaRX8b;P4Yl2m#EcD(7?@RFFKTM1mU?fOfU*Xi z9QjdHUmXt+BaB&P~tlK{lbLdt9#tr(R z!_Wy88=B96%1R|iJ9{TqV|)9bw1g)9{+q*q_FSgQuN+1z)ftxZaYX_pwzw|UEULqr zatX|Ma+@p@5GuPtk6B=enWwg!wVW+kqcIo_hVO@j*+EB#9IQK%S-D9HRuHE1g?%5_ z_m=D^WkC*vDc9ttJ|hzoMtGS6aa{dT)Yf|2HgXRkAL(=tL7A!$l@G4Dc;QB`Qp?^j zI~;9RN@OhN(Nz-r(A1*Njm8FC=eVDzJusGL9^UsgygnIX3q=*M1BpL;hOj$rsUTUK z!}9FO~3lg+R%Q^H;K( z+ByE3ME}cHC{>|X)H|>ubb1Ook+}~mP%R!Yy_C3}Z;hW(LXEb;G0Zyha zWd*W647OPzocHmWKV-bwB+=H;C17w9Yf?e*hIN=xwZ7c7Nu-7NmGeFy&Kn!7$D2*6 zgte#8%1R?j9RxzMv)3lJMs!<0SWsxT4YYI+@+xhsQ zn28ZiB)T(lDzN>}%Y6k2evuLq0PvL`0KkHd$FGc?le34l`L6)AHbYqz!iznyYPa1U zIB>!oS38tswVYcE9Gy(&X1gq3L_J&6;?t$K&wkKg)O9#qT(*G-PlvePE-h~lna$|eJ)^#(?(pWG<{>ooY(sZI1XmGVoEU~Js9CGFJ6m>B|qN)0<-= z*?1ktePL5zYSrI>Iw`AIG9n-CMy2AA9Wge{8C{Lw5*js~ghHz-vzhG8yxHMBbF^%YE6V zdu>KFO#BG;aJo&N+S8k;Hjut#JQ~x~auhI52$8fiKzZ}XKWvYo!!uK0%%I;d%bv-# zXz1}3 z|Ivp2ZLW8~W4(Rbr0}-1r`M9)xpn~-xs@k)$@5aLk3rvd!vxEDxF@kKkSu^3;eyun zLY9)<{A5k&`ulhQz{e?nlU{&OfXrNJ@oP2yXY21x)qyJUZFv1ri!i0tQs^2Y73O}6 zdAF($5u+4YjeP+1<+eAjwmS|zsG=y8Z4!@*3}5asg!M=TG%x2*k>b zoDaS#j>BeKmdq!KmxV*+y$Fu^EE!=&rzUn``4hDRz>nhcM;K|QB&P}>7 zv_-JKW_8=kX7Ywdcs~c2toz!k}7#pJanV{#H@)Jv$CTf4%}ws7snz zl-!pAFc}GiOM>3JrFoa_m0BGZ9$n99m7pCL$@BBQC6&I&Gx+ymDg|%#W^_Uu4aL>4 zHSr~oNVTGH{w#8gdouvPDi7;lFrFy1qA=BS^MaWpd0={zk&qaE-seLC*P}De8h)C@ zRMKxn!FP3L2-tUy=`=wq?si-U8yUBMC$xh_rtqK-`fw#%f)wjo z?fE(GshL`B7*()zbM{%HLJ5wspv@k2xhJ{eiAO^wD!tY1mxSv%A99(b_eW%;A||xFtGZy`CW&NLU6W!7~Daz5kfhD zKTk*L+TYC$5hb=ovkT+H`c%BWywq0pHx1NZYTU9bLx^@=x}U#YlD zU66A5(De7eO};Pf{_umc{>b9AM;*7@I=2byG0*~zR2bzA;c@l|?*l_MAGi#Bp8rwr zwdds~ahY-7thiOh{Md%7AX7{hkONSn?Aq_cmGEjj&8)>>5Wl%iXZ|sRLmj?l`eJ4# z%d_sQ>n&RAz+qwK+ZsF1>qG7l8tXEAoqO`vm`BGs@@Oz$Tvx&8z#AvFa{;ea-}~;+ zT(TMKluqCn^Gk}Jg}z{IvBUSh>B!MJ*fEoS^T@D z-#7jKw8ew+4_ko0!++oH`4jGq_AmJFdq2OM_&v||rwJ)&3gdr6n!iZm-{HTfJpP2= zKvnfG_}>yBzvF+G;eX*ruO_cv`;qTh^PdosS02ThfE8XAGe-|5nMT?UB1^tKg n_#OUx2>7RgJ>Va`_kRJQk~{*G9zRdrpaHs|;>Lpd=db?(nB`|z literal 0 HcmV?d00001