From a6d8608595fd1ecfdff35c2003a28589ea1214ad Mon Sep 17 00:00:00 2001 From: Miklos Vajna Date: Tue, 19 Aug 2025 08:40:53 +0200 Subject: [PATCH] tdf#167761 sw format redline, char style: implement DOCX import Open the bugdoc, there should be a format redline that tracks the change of the char style from Strong to QuoteChar, but the doc model contains no redlines. What happens is that we try to handle character style as a character property, but SwUnoCursorHelper::makeRedline() uses SfxItemPropertySet::setPropertyValue() for CharStyleName, which calls into SwFormatCharFormat::PutValue(), which fails, so the redline is not created. Fix the problem by reusing lcl_setCharStyle(), that knows how to set the character style on an item set. The DOCX export worked already. Change-Id: I9479cadfdf6cb598cd4b11d49d851236c8ec09e3 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/189918 Reviewed-by: Miklos Vajna Tested-by: Jenkins --- .../OpenDocument-v1.4+libreoffice-schema.rng | 4 +- sw/CppunitTest_sw_core_unocore.mk | 1 + sw/inc/unocrsrhelper.hxx | 2 + .../data/format-char-style-change.docx | Bin 0 -> 14453 bytes sw/qa/core/unocore/unocrsrhelper.cxx | 65 ++++++++++++++++++ sw/source/core/unocore/unocrsrhelper.cxx | 10 +++ sw/source/core/unocore/unoobj.cxx | 13 ++-- 7 files changed, 88 insertions(+), 7 deletions(-) create mode 100644 sw/qa/core/unocore/data/format-char-style-change.docx create mode 100644 sw/qa/core/unocore/unocrsrhelper.cxx diff --git a/schema/libreoffice/OpenDocument-v1.4+libreoffice-schema.rng b/schema/libreoffice/OpenDocument-v1.4+libreoffice-schema.rng index a9c923703e0f..7b0ce565ab5e 100644 --- a/schema/libreoffice/OpenDocument-v1.4+libreoffice-schema.rng +++ b/schema/libreoffice/OpenDocument-v1.4+libreoffice-schema.rng @@ -4160,7 +4160,7 @@ xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1. - + @@ -4171,7 +4171,7 @@ xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1. - + diff --git a/sw/CppunitTest_sw_core_unocore.mk b/sw/CppunitTest_sw_core_unocore.mk index 43fb58bf4fe1..abdad82fa74b 100644 --- a/sw/CppunitTest_sw_core_unocore.mk +++ b/sw/CppunitTest_sw_core_unocore.mk @@ -15,6 +15,7 @@ $(eval $(call gb_CppunitTest_use_common_precompiled_header,sw_core_unocore)) $(eval $(call gb_CppunitTest_add_exception_objects,sw_core_unocore, \ sw/qa/core/unocore/unocore \ + sw/qa/core/unocore/unocrsrhelper \ )) # note: this links msword only for the reason to have an order dependency, diff --git a/sw/inc/unocrsrhelper.hxx b/sw/inc/unocrsrhelper.hxx index 270b2a69d6dd..0eda90fdc7c5 100644 --- a/sw/inc/unocrsrhelper.hxx +++ b/sw/inc/unocrsrhelper.hxx @@ -242,6 +242,8 @@ namespace SwUnoCursorHelper css::uno::Reference CreateFlatParagraphIterator(SwDoc &, sal_Int32, bool); + void SetCharStyle(SwDoc& rDoc, const css::uno::Any& rValue, SfxItemSet& rSet); + } // namespace SwUnoCursorHelper #endif diff --git a/sw/qa/core/unocore/data/format-char-style-change.docx b/sw/qa/core/unocore/data/format-char-style-change.docx new file mode 100644 index 0000000000000000000000000000000000000000..febf5dc3231dc31f2a448e25461be8300a0a3b95 GIT binary patch literal 14453 zcmeHuWpEtHvhD~iW(Er^W|k~wW@d|-S+>w(W@ct)SuBg0nVDrVSkfEsIp^-K@4k2u z@9(`mF%>d?7aTM_1hgHmJzK!N@L_xK+?0`>7D7QGBeBKHBWep8K$lC2a4--mLe zjB(ALKtfq$g>MD(+Fm<$I2a2^7+Hq;2`5&+Oh7UEO)aNdK_fS~lAd7lB>KkbnzK_c zE$q^I8)1`e#WSo646*rGv9z^gOS6G6d}!#69aDmlOV3O9Lsx$QL{cS0sgiK^Vt6UuU7$3_7cKk2zoVBA36NMiN%dkUL58b6Z80yelOz*l&5Gj_ z&%{lBc1#y_-i+6|#7R_v4{e8@f7I>OdTw(ABm}e-FuKj#ZNsJQ-5!D5?Q`UB^FUG2&kc^sd=x^9%8ELYynGiDfFJ;Bu z&b&C6%~?QKu6OQYFEf-Vb{8c&nrj8yQ*Fmr70xFGJrY(&Px}v$pr*@I&??P8FZIni zV!;B(WC03FJ75ALLo;MvB)BFQdL*QEREa78Maok`B(l#TMKLfdAiTzs%VmiwKUp;yxT-ke2!evBqL zP46z3xxi9qiPRVf0TfnBkKuk42KF?Tlm=74LIEuoPM`)#cjn@NyJkj`{%y}h8DcII1m+$OyYqyIn9-_#gwz@}<|de`&@9=2?Hm+&@O;e}9(Z{k&gYlyY5irYVFpgb zN@6~Rjk&u4cTIWTMbv1G?#mt+i!ww`b+#Z=-)^8rojX;6Xn$M+iO3a#j()T?MRNe- z;PPcVw|*T;i|tZ{D8}bBfyEwp-|Om0MShWfTGF2xi9cKlC0iES7{|5~>>|$&$*zbG z7}9qJqwri$@%VMQUL-bUPBYcW#SdQeXfh+cYw??Q_CLdn>7wsskE8=12_ zE(gXtai`uvK0e-Oc@q)Ms0>RaS}P>rUPQ}ciS3p4ypfMLkcD3-AhW9FS*yy;b0X`V zDm}$R2Y8WoIvVtE<@)RiR1hGX>TSXi5N6vTE#KLys<23g(5JqKX=#vOxufiqd-C$w zmnD;6R;E2LJ<8WNZ8eTFP~I3pHJ@J2HE4K%LAl&?&|aW7gu1U`hRcpX+~q~~n+DAc ziu@!YXhHIM!xK$2%wuC>v6eNB0fl)nwMNS&36#xcL#M)diKkvtq)^WxDMPfL2e$JE zpQIzHzsB&AXDMa#c?1p-Y6KPJp0Ur#N>}~y+dC7?jo+f}V{t+TBGAv|0X+mB01D&} zZ}P8@`&XaxpYRI;ToMC&|Ia?k<3?ovSQ3i=^ke<9ozEX2pJ9Wf*o4H}NDd_qM9Iyd?~COaXhrPgsI4HXtc z7bhQ|7LQ)hN4kJQXMyh+xM(b+=c>bcIH%6ygE>|}JJi~tlM){2K+!5#~_VJb_qOL&5BP zIZsNo<>?^Er}-d79J8DP`WHr6==Pt%lBqSOMwY27h5ogc>QVU@c%GaGhllEpd+pDR zAmqXJ(s7wPIu7_gv6LBGB&Q!;Bgq;f!J2)B;80StGwTFb-EA+{Tr0aqhy@uz6?wOk z^e006#pxGLJgB}AbqXuR57vA%W<;wU>Uj$9Rw`j9bKY>)y2aZ54gwusu$*@NF_YLX zUzziZ<(?t&8|l}wNJ{-6NmeEj7MI4$S3S-q)g3xaQejI!%w%%KVg5H zrL^%)aRUljfk-Ph?XXju4l|k7gLa^2CnB5cj!VWi?-N+?VqXN;aotoAh#hAF^;mO! zjqaoamscdMZ>?C^xy_1Y@Dg6*cz*B>yConCM(4kIG0P$1p+5r zNL|0$fq8_EkLOJQ%h1(&La zZSf3~p=4*kLdg247nmUwp)ANj?CJTtOKuK>P)buItyNyQGhL=uc0QVg^^QO#=GRqH zZX79k0J50ULo*#^ESx2yi#lIF-yI&*iFKxXUJWhf5p?q+e9({i1`}6JbHCu4_4e{$ zczGbV@p{{r{Y*m)=4l84UB3xASihq~HWL8<@OqUg@W5ao zdcI)u#2mRo|<8ftiyln{}9)1;r~_f3yK zMCJu5BU!wKov@}v_&dYSvmK?Ll`)*5qUgC0@{;)b%Eeg*4$SEpB4V^~(_qK6QJF@j zL){=ITa7g@e$|=~BT#y)K~HgW?2ox&`rtdW!`S2s*v}xJ29W|bG0;^}W><+yXVcwW7axQ-DbtC- z&pq^dXJ)J21)elX>V{Q}>c&{j`b#aygGV$a(AhBt3~c;QiD1kjvi#;$w>7#+0?Q?@ zBLc9Qb_~hb^JsO4ob>Y*M`sHg;+lsH4LuVyZAB)bsOR?Y+;kXwz3FQQ@<-d%q6O$_ zKcGItuIxjh7=9(zizI}6Zgip+fxE{fw%{_aDNwPov03hczpcn6?;moc%6_Z7in;BZ zv3;*qeV}x<=v$?9pj;4pc3cS4q%#9YnYPu`nUCFV>;OBY^c}Rl*o=-U_03a6sUeI0 zI5~`SKR2=_tj(9RkV5AMV)7|f%rb=f!ec)+i z(Fu~yNS+T&v@b|qI0#vKk0mpcXt(7!+ArQggX74i%!ZXe@drr89=ls<&va9&A|Nz( z1D@@rRvcBswoFIc*Jk!awYW-S0X+V6B$`6TB-Tt_ynZ2Lf+$DLg^s2b0|URHBR1f5 zxSbf0955H)HaUtlWEV%oqvSQbyRgpVDyN1$qupq$p{r)kLm-DsBDrM}OA(+?f*5sn z?s(_iWLF{}mtv44`t6#`qat=t)rK%+3AD&zf)%vH1ZF0aIf*ZM*DzhuQ`?wIyeI!a zTEym1ZHR_)#{k?tzWYYL@f8d9JD|HJ{I(WXT+#0OXQSqhmSp8ghiBr&!xWU0L(8u!esrWqy=E>jkwdX-fz$E=D@u^*`gCmb>H4ZL=RKiXM^qc3{ok?- z!USVQ8Tb^2hq(Pt4&XDUIay}TR8r177zc73rY*BtComPk3i37VeTtQ4GWph5i9Q*q z?0WjCB(^p=>bPc{l*)!I@F7Xgh7Q45gw_OTPFX5)4SdaJStDa98xOwbg>TGL#YZ}6 zRcvz6wVc`c!gM88tEq$1&8qTP7SO%*6kwDH?R3HUZ52~*$Zo=Y6Y^z$5;2gq2{qhu zOmwEg`KwpnJmS|tb_8x$mP-Q3ykLsEuU6+FKWpSvAGN-$bzblD>Lx8G6|z(+>AYKL zsP=Nac$~962T4qH-;8Q6+_(>F*c!B)OMNX?IjP5eS)R0w_}L*XSRwJ2118I|h#M{% zC$YJpDHLMa`jS0Qz!KP?YRY{{zTW)Nfs{io@c#NHX2rmIvfcY1!(gZGMvfscOPh!L zm8JbV3_2P+Ihos-I{pfQ^=ccoD{M$!1l4cdlh=4J)#aZBGkRQ(Nk!Ta6he8Fh>cN+ zM11p4n|ojH@hPViQ_F+3c1a7*&!5koT-%h^z1?=L>d6%q6vo;wi7!R-slW^8T+TgP zK1G?Xi<>L!e-{?nUyq@<=-sR8Y~#xhHG?;?07pxZbZ5MG(Of9GC^Hb_P{hn7L#L1; z`Z#?_(Znlul~Xbhu*o{jQWSoiM*tzP?aX3u&RQ$U70Or?fF>Eg%&(}BSWmbXB{aD3 zU`?c!YsOJhe|sp^LkOu*f?ttfxWhLLIh^rf$@_xzF8$*-A*{A-XGFnm)NR%+Y<^l1 zf%vbW_WPjuDi<7HqE1(yARXV->XiYAU|(=Vd3mA;KZ{1A?f&47)EL+Ta~Kr*;m$o2 z5_A^=A4dRd!taw-N0A#6*83Cd!AD9z!u4RP1?LemjAfa~`FJp~#^`{tAFRKzJDK8r zVES%bzKoo|*!qGz58_EcrHx7xOOkjabDpKSZa({pq$;8rwTYu(j$mOZEF}wH0?}ajO6Vih znh@M;=7@lIkzE_kz^1A$O{>@Q1dL1w)nD0)Ep+)so zAetRL(8ZnEw4Npe{2kh|E!de*0mmZuCscoZ=gyc7(U{I|ESt04_4+GCGunsSnstFn z@5Z>Cz{ab*Ex z!QP=kMJ5$*q-#Sgx4})p=-Vy%X7!9=8|)Y@9_rJ>M~I&Cuvg%9%On;olui7vKDn@jPxUnMdxu%&c$ znA=SeQem)tS6bMUbw9mdB8M2xMbXiI(=^By(?B}+AZ0R~sRS4Cb(cfSiD$sbP zUZ=@A$+ov;;LxQ=2yE)of6H--cXy?DMnn~}f%Dl1<~mnz4ga&ot`XR`kT{vo8mC6~ z^l6++^+}|%iC9YrkP-eOmjL!I{D?NR@DQ->h4$B!VwtbYIjPzWQXs7|^Iv z)wUskX}uXvm5j++PEDIX^J3zxpKhSAnw){#bOr4p?tfCeMzA$o`O#VoX7(jAUMe5z z+zElxI_FJz=yZoFlrOUAM1wmrj|7iCjsovpnGpmSVX`dQR_9uV^INp`>$`tim@}Jy zJYxsej0TGV0L1_DNKWon#((&uQ=Juu6;Tw=jnbEQ@tH0JcoHNcL!}gy5{>hf4fuWW z>=QzI6vUt)bO24&4zB}9yTN{+LxC^_ZLP{$aUV|;h9Wt`R{InJ@7G50uT|Xi+cfPQ z9Iso4gq!BcBKDuX?JxJv_ve-bNZf}NQzT*Q{-VR+XXgV>$YCQCjY@4Q=D3V6_Oiu!XcQF}{-He=d zb4Jji8ERrJbF#7 z65<1Xrf%%-mpvA~t{RzZfJYsaL+w1s-l(y(28%pj(9IC@B7NbY9v&e!iQqc8657eE zrl=TGvqvMq8^$1T%M4xnl!Eo(yRQ6G!4^wJtJ1iLt&x zG=@Z!x!w~Dy(g)G%k`V7J03Ym*p00i9%ab|+-%_7Au*7B&4BVm#rN&g<$Wgfh!BfY zJZ_G=lguB5jd3-1MjqTtl>8seuS?4;17#nVn zRYK@Q?@Y~AZhr8(7wn^AzfKLiaqNuTG+|7qZr@3N!lO5JwV{w!+)FyM`xSI#6Or=0 z0uq?Hg1XpBc*`=U%PqCCP_HK|%d(mf`Ll&tTUDU!{akeH9WRa|!^Dz&y684{t`}k& zNbxs2JPY9+j_-l}_GZu#JJB#W13BO90+`(I~=QMzDg!JBe1ll1e|T{_^$UK zdk|gkDZ7CUb{C?nYuA168ve$MookRI-|E`b3h=Ay{+;6z)l1z$8rm;qR*A;OsR`WC zaqH`5H0bJ7ABwu;$aym3@JK+yBdzv@S8-{Lj-PE16^L*7vXYqW;c7J)!Y+)5XTI%l zzYND&4S`{ZfJPxP91v4Fh6hK<9eDIRW(KBD*BtR1lVRnT^~HCwC!J=(g%u(HxKs%y z5y){di{YCn5H|oV(yeBgcygsRH2Se6qS8C5}CcI-Z8QedXeM`{vtyx+*xXBcMV9nBX zL4vF*=jMEXq(e?crI9_hBn7gG#`ON9);O5PoK0Xu6!yxv3I-2^E80OlPKbqWmA3GF z?T*u&H$VGi@pqLSWr8D;ql4bZ-0>SyA&eV!=ff<1)dIa-*ngR{-66k(tPi zX}%<6o1aD_Q7iU-ib!^td#1xg$}5}Vh~%*;Y%d+XW;lV3ur=$r>>K^pD66Gs9~)GR zBH(76XM>(S%H$Z~`kLoYq*Y_76q8}!9FVr*VJ59;{Zz?KKChh_?`fw?MUw6#)Tt?5 zl!PF(MQ3Td*eP)hVSkds6nmVwbRqQh&c_)RLw8|6mo!IDKFOgFByy{o**FAH>yYLL zifzPhEAg$DpuL)MScQ<|NbpfAT#T}#3+_{bV_str3FE^gm6GEqi_)_4qs=EdR5oCP zjFz^2L->-ksmH$gL~sg;H`lF8UQS_fK&ouZUD{i5Ssc~mePw!COEO|w=5GU_=C4IA z2Mh%=NU4U^XLB0_h`DvaL_N7d>xgb4$M2%8cV2N2e-QFjV9e<%Hj~#=#-m_R1bqUo zSbc9hWd=Y`ysIK1Kcs@H>nVGQetsfv9X9k;cuWD!yJChA-7|#=AD#%b1?5c(kziP( z?Ejj7^$|AqTsSV#qh{10kq=p*L*{|!14Xn&{R(&55V?M>^2T==0Hx(D^p=rUuR_dE z+^kq<83Tp8ux#StSdx)o3(FJK$lBF5SL>vd&nWq>n7|uy<(??a?TQz-qPjbR`l8+<4*^tGSQNpjYrN8nq{4*=gjsG<(=4I5nv5f!mP3r}CA$Z*~Z zG(%l9ePvBFb&;M_KAUru^J%Uko5~daP}@fX;0=TfI!5t4_u?ywid>| z=Wsz_w+SA%AAq0w2xuYV6d^A9NJY}3z&Sw1E_^_^7sxM0?IzkKLTwfmraHM!t|@?) zWj1Gsu^D*Cjc+HE9RNc#DR{=H1U&VJ8EyB6QJ54AKr+h_gsPX{0*514Hj6@~s=r63 z68-^v3&5fa{tNP-K0F6^vX1mQf@t;fMBtjmNT9UJte;Ma{$DU6aLMAXRjFbm2wG(* zUkoaLepnSgi$nVVADj-&|Ht*ruH_sM%oW z=2a$U7cyBmy04&+xaYCSHPLpLJI-QwT1(mC;59(#6pS1fqSm8g$$?_0H&w`SM$R;MbfOW~x8w!b9gCVdN)4)@N9HiJ z#_o$A4rk)#P)FE+qh-lrao5;Tu=Ltc@RjC_Rx3Zl&PDhX;1Ihh!0Y`i36x(~76MB2 z^}Z{@BLk)HOxeF;&H?(fETHyeSpBc^a59Ihm4(1*=8!<7oF`CgQU4;6J^wEetMFwm zPS=AHd`=rssh6@J4YmxcaMvG7g}~`cLBjdwkcQJNpyosyN^`B`BMcUq24s3@gjS)K zn7%`pj!b^gsx9ZKBZci|*7~ZglD<<*n#RH|sCKssrDN{&A^X9pXEVfECUq5_o-N&H9H@asyee-r+3rQLiW@({_0jRQ@&s-I@Q9zIK;73UpcM#fNjacOYV~ilk99RQ_iNnjzVS zj}1>H+7Wvf4*zZMy+XTm0!tzf^ysm^N!@XEi*}ioav)b~Y4=#ewjrQXcU7{1!Fapa zD<%&FM{X|+8Mjd?sJKyWOnXA3^1f21;VA-n=Sltj#5Hkb>6)0BX_6ni+P+|gM%$_H z^&a_D$1+(bl$TphN5ukb+OTVA2r|}jz}P60si|l~ikIa~P?f}5Y|eQ7RO=w#bGvcO z$Cm4gC9-?la^@!e7F|s4uS)0j*J0+LYxC^C%eoBn%fID;m6T)2=~i-!q0XIz9}u%G|?rEw@wK$Gb*E9GtI+?0pEsG z&L~wDgEDh>g)S&-Uf(qDE2}ncZh}#Z#FC#I&A7LBpD&^2dPc(Vc|7^)K~{Fb$ifPK z`2K*s_l-FNlf{&;U9^H#uokZfaRrP1Ekt)e}+^O4(bnn+*=!{vL3MNXIS2O{$5c)-V z&Uf_=sb-~pLH8w2^IxwX=?;38{_H$jS|w{`H) zz)k#nbxGJX^G{QBfK}rY8e)vq5ocCd1v0XhN%zD%E%2bmzG{X>n@U`<`xl zw$!jLN}RTp{p0mEoxO^)(n868e-L&4#!Ux zR=xl9IpQ#XwC?7;?CR})hadYPmsfdX46B62H1Qi{Sp-TrGS%F%8*q9 zBWaCBs*wlKQ$h+_1fuOM$5%Wz=Vs`tgfMx%cgg@Q(oMTkCff7mc*=ol)(P)3?+R#ZLDpKCH> z)l|^f-PBf(QWcY9HXk1~bAT`(qUEId$v{(BQJf?AL}5)_@#&Go5jq+A!Bo2pH@8kDEX#I`w0c&$V!9K#%W#YC^ z7 zyl8-6Fx>PZ!NkDm&$5+oeyT&d9MSVM5^T97$bl<@sb{g=d=*vuBp?&g-SMmj5|N;T zYsV)^D<%q>J4D@|!C=Rd@~=8{^C>SS%^*K$!TJqNbB=L$v|5*@d|8@PTRl#7Z;6q7 zGE7zC{D9xz9%L}0=wNk#zM#q`0(4AKvG9}usporvjU7(X425sA9C9lHVa z*&q=UWIaJe$*&sVYvM z_faW)z%Sf2=Giym0#yA4xRw9kH~Hms1R$b-W;6!#ms+Bov8~;|Y$!ibDk_ZuY2YH^ z2_NY`0?geC!@4%8Qd7i2&NBml1)SY$h>hs^%<>(axw%@Gt^w*7uWQqO=7%3gJsM7A z%kq?s_DpF5$jIUbRFNwW&rMOTX&g)#FmNeoM!20wsC;MZonOjhRSJWZ!-Wxuq*W>F zBVa96AbkWNwkAh8L^N?yR6nY236*_9x5;-$s?k^1h9F^bAs%yGsrv@_nFP&xT)|=I-m@e9LK26h`+hD+_ESx zlds8rpnb|8V^O@|`0)yo6bjXpEH#$n9Q6dnF_V0TiwsTUYhZ+!BjNCkpT$otu1!NE zW&PVl;mvxq@d_9qRIFV$mCS8wprWrWK{y;S?o_C-)h*sEttXsuI5&|VWzIRu5;|q2 z_rYq9kSqF-puL~qB%8UqGj=3$TA*#1svp7mm%+-Bu^(!n!ex2^#bq`VIbb7HcE{yz z2xp*aaHqcBVJ#q=4rs(W;P_sb`|LD+v~>Mjf{{K=0T>vQ^&(2B*S-;iNJ;G9pL`fY zmc8~l(#-KAn^HR*b5^*aqZiPx@td%m8LcGxFx4)>4>cO4^@$ED;Z^(&ywx4iju z7$SlC;?oHZ_lb}_{u_r7x1OVQWZICtXa6zyqldY1Z#Nn?!totxXB z8mv=Rzur9*XVsZsXVAG9kkj%z9OsJ+wN3#!{~RJEI14)c2+x$IU~QIVI? zEL-90xhNYrxKs0_OD(6!<~C-jS;dGhdQfZ~#^bx^w|3=bsVu|^PT>6XLx?EiUh?j1 zeW9)yF(1E<#8@~kf%ABOm;6|QGv-pa*t>BZBtx}x6L!2sotG0X?^_e$-Vk>B4^f%} zlZ6M#-`0HG=`!(tiC?h#K&hj$n3}#3C2F>J;GLV(_eaTdq|&x z=m_qRr+WXRoj%pZ68>6C^#bh_>92OGZ)f)_Q2(!)0&Ns{q$`ft^e`Z`sU7nPxA+NB zD}-XGp%)+L(1!p_N0vxb@mFf$zjj^}`m(6l-kO`vbEV?rzK@KMML6`UHHne!*GSEd zX_PP2%uoAi&LS0u6hP_U2#I+FE%ek?Rkhix6~s#g2Q86YEq;QvmR>_>X(f!Mv?5&HU6o8LMQU%n*CBwqB$FtE{T^5}4U0K}n31*j3VuVUEw_3Ju=aAuA0Qg&H%E@? zY>2~Am*cm|n{2U&-auLddq6^mNwgDF{|3Hg} z_!lkyH%k2Pzvu6a*uVZB7}$TS{lD;If7kRo74lDATJZlDV&v~Cey5TAslos_5P$r~ zzmiIRhyT9k`zQPcI9~sP|JM%i@8I8)xj(_`l>Y|*mfHQU;rDFgPYsV$|JLxg+~arr z@5{_T@%*&^#{aqK{2l!FIR7UU0Qd>ajs9EI{~i8!_xo3PKGR>||8~amQV>9!0|4NF OFASjBO0fR=^nU + +#include +#include +#include +#include +#include + +using namespace com::sun::star; + +namespace +{ +/// Covers sw/source/core/unocore/unocrsrhelper.cxx fixes. +class Test : public SwModelTestBase +{ +public: + Test() + : SwModelTestBase(u"/sw/qa/core/unocore/data/"_ustr) + { + } +}; + +CPPUNIT_TEST_FIXTURE(Test, testFormatCharStyleChangeDocxImport) +{ + // Given a document with a format redline, containing a char style change (strong -> quote): + // When importing that document: + createSwDoc("format-char-style-change.docx"); + + // Then make sure the model has the new style name, the redline has the old style name: + SwDocShell* pDocShell = getSwDocShell(); + SwDoc* pDoc = pDocShell->GetDoc(); + SwWrtShell* pWrtShell = pDocShell->GetWrtShell(); + pWrtShell->SttEndDoc(/*bStt=*/false); + SfxItemSetFixed aSet(pDoc->GetAttrPool()); + pWrtShell->GetCurAttr(aSet); + const SwFormatCharFormat& rNewCharFormat = aSet.Get(RES_TXTATR_CHARFMT); + CPPUNIT_ASSERT_EQUAL(u"Quote Char"_ustr, rNewCharFormat.GetCharFormat()->GetName().toString()); + const IDocumentRedlineAccess& rIDRA = pDoc->getIDocumentRedlineAccess(); + const SwRedlineTable& rRedlineTable = rIDRA.GetRedlineTable(); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 1 + // - Actual : 0 + // i.e. the import result had no redlines. + CPPUNIT_ASSERT_EQUAL(static_cast(1), rRedlineTable.size()); + const SwRangeRedline* pRedline = rRedlineTable[0]; + auto pExtraData = dynamic_cast(pRedline->GetExtraData()); + CPPUNIT_ASSERT(pExtraData); + std::shared_ptr pRedlineSet = pExtraData->GetItemSet(); + CPPUNIT_ASSERT(pRedlineSet); + const SwFormatCharFormat& rOldCharFormat = pRedlineSet->Get(RES_TXTATR_CHARFMT); + CPPUNIT_ASSERT_EQUAL(u"Strong Emphasis"_ustr, + rOldCharFormat.GetCharFormat()->GetName().toString()); +} +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/core/unocore/unocrsrhelper.cxx b/sw/source/core/unocore/unocrsrhelper.cxx index defa0496db1a..f78a2c86f590 100644 --- a/sw/source/core/unocore/unocrsrhelper.cxx +++ b/sw/source/core/unocore/unocrsrhelper.cxx @@ -1324,6 +1324,7 @@ void makeRedline( SwPaM const & rPaM, std::vector aValues; aEntries.reserve(aRevertProperties.getLength()); sal_uInt16 nStyleId = USHRT_MAX; + sal_uInt16 nCharStyleId = USHRT_MAX; sal_uInt16 nNumId = USHRT_MAX; for (const auto& rRevertProperty : aRevertProperties) { @@ -1349,6 +1350,10 @@ void makeRedline( SwPaM const & rPaM, aWhichPairs = aWhichPairs.MergeRange(pEntry->nWID, pEntry->nWID); if (rPropertyName == "ParaStyleName") nStyleId = aEntries.size(); + else if (rPropertyName == "CharStyleName") + { + nCharStyleId = aEntries.size(); + } } aEntries.push_back(pEntry); aValues.push_back(rRevertProperty.Value); @@ -1378,6 +1383,11 @@ void makeRedline( SwPaM const & rPaM, pRule->SetUsedByRedline(true); } } + else if (i == nCharStyleId) + { + // Set this manually, SwFormatCharFormat::PutValue() would fail. + SwUnoCursorHelper::SetCharStyle(rDoc, rValue, aItemSet); + } else { SfxItemPropertyMapEntry const*const pEntry = aEntries[i]; diff --git a/sw/source/core/unocore/unoobj.cxx b/sw/source/core/unocore/unoobj.cxx index 1c3f9d06a610..6921b3bba5ad 100644 --- a/sw/source/core/unocore/unoobj.cxx +++ b/sw/source/core/unocore/unoobj.cxx @@ -177,10 +177,12 @@ void SwUnoCursorHelper::GetTextFromPam(SwPaM & rPam, OUString & rBuffer, } +namespace SwUnoCursorHelper +{ /// @throws lang::IllegalArgumentException /// @throws uno::RuntimeException -static void -lcl_setCharStyle(SwDoc& rDoc, const uno::Any & rValue, SfxItemSet & rSet) +void +SetCharStyle(SwDoc& rDoc, const uno::Any & rValue, SfxItemSet & rSet) { SwDocShell *const pDocSh = rDoc.GetDocShell(); if(!pDocSh) @@ -203,6 +205,7 @@ lcl_setCharStyle(SwDoc& rDoc, const uno::Any & rValue, SfxItemSet & rSet) const SwFormatCharFormat aFormat(pStyle->GetCharFormat()); rSet.Put(aFormat); }; +} /// @throws lang::IllegalArgumentException static void @@ -352,7 +355,7 @@ lcl_setCharFormatSequence(SwPaM & rPam, uno::Any const& rValue) aStyle <<= aCharStyles.getConstArray()[nStyle]; // create a local set and apply each format directly SfxItemSetFixed aSet(rPam.GetDoc().GetAttrPool()); - lcl_setCharStyle(rPam.GetDoc(), aStyle, aSet); + SwUnoCursorHelper::SetCharStyle(rPam.GetDoc(), aStyle, aSet); // the first style should replace the current attributes, // all other have to be added SwUnoCursorHelper::SetCursorAttr(rPam, aSet, nStyle @@ -444,7 +447,7 @@ SwUnoCursorHelper::SetCursorPropertyValue( switch (rEntry.nWID) { case RES_TXTATR_CHARFMT: - lcl_setCharStyle(rPam.GetDoc(), rValue, rItemSet); + SwUnoCursorHelper::SetCharStyle(rPam.GetDoc(), rValue, rItemSet); break; case RES_TXTATR_AUTOFMT: lcl_setAutoStyle(rPam.GetDoc().GetIStyleAccess(), @@ -538,7 +541,7 @@ SwUnoCursorHelper::SetCursorPropertyValue( } if (prop.Name == "CharStyleName") { - lcl_setCharStyle(rPam.GetDoc(), prop.Value, items); + SwUnoCursorHelper::SetCharStyle(rPam.GetDoc(), prop.Value, items); } else {