From 54302a574a98d6fc071472f1fa64adaf70864a26 Mon Sep 17 00:00:00 2001 From: "Attila Bakos (NISZ)" Date: Wed, 20 Jan 2021 10:52:26 +0100 Subject: [PATCH] tdf#138512 sw: fix crash on textbox alignment MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Regression from 3347d71b23595919e167bd49932675e77cbbdbbb (sw: fix text position at textbox alignment) has been fixed by this commit. Hopefully there won't not be newer regressions. Please note the crash only occur on GTK vcl backend so, the py-test only with that case will show the problem. In the other case there were no crash. Change-Id: I3280547a6195e240e5b33e0d0931fb60d4d19fff Reviewed-on: https://gerrit.libreoffice.org/c/core/+/109669 Tested-by: László Németh Reviewed-by: László Németh --- sw/qa/uitest/data/tdf138512.odt | Bin 0 -> 9680 bytes sw/qa/uitest/writer_tests7/tdf138512.py | 56 ++++++++++++++++++++++++ sw/source/uibase/shells/drwbassh.cxx | 38 ++++++++++++---- 3 files changed, 86 insertions(+), 8 deletions(-) create mode 100755 sw/qa/uitest/data/tdf138512.odt create mode 100755 sw/qa/uitest/writer_tests7/tdf138512.py diff --git a/sw/qa/uitest/data/tdf138512.odt b/sw/qa/uitest/data/tdf138512.odt new file mode 100755 index 0000000000000000000000000000000000000000..e72fb8eb37d51689611ceb30c81280d61e516cd9 GIT binary patch literal 9680 zcmd6NbyQr*w{_zlJV0(=end*7!)rw!NVU__S8?D_-psu#`n=1Dvky}K=FKPuy`5+% zr1W*Persp4SYLE;ii37WK7K|qcjww5Cyu?;)?q{sVd?=h&U@_F!hESPm~SZPD8(k7ynAfrIQkNfeX%dw(1z41xRCxRij{Tr5JQw z*6xl}cxh5*)2;dB!_ZI2Ocm=c>QK!fHHdfb9Nff{#rY9hq@rw<`^zuzti8SZ#~@-$ zPb~+l61yviD|#sH&(Vy_S;H=b z`v+MGSGw{?ly7#>I7e0FJ_E{xly;I9<;yFEPkp5_s{;W$oG3GpURF2FP-&>A>~)P( zbYRgUkcH&gO$ueO5u^Hr^Q=f~W|dcBmkM51lpc|tHHMcHoQ{zef7HRtES%nXuQ+&b zIR||?)mMSp-4u&c)D*$RfS2I49i}UNDpGDOT&sC_t)IP-@FtrOhlt_kqzwV9 zbsp)~vI_NLPRL~+i|7z#@}sV5Bg*!tLw~})P+0tj<=lGs<$6N<0R!j7Ea*ULg?yLG zX}O}nSKGDPN7Pqs_GGUfzPPJqAlqTUVV2D@AH(zW!+1+lVm|EHCykLbkfpziYdBF5 z5N%(27JAI2eHs&Q%T79I3xTYt!?lo^)un{-QK)#?&#j@wE6_e4?GqTP1-&pB3VmI? z&~fx$ul9}V5e3C^vsmM6ITnoDJrlt2)Ax02JF+X3jeOJrXgfu>7@+Ihu8bj*}16didj3c;gNIg|~B#=wa?Z zP_M#~I*FIze;~DliaE*ZoCDfONqTgz3bb{n}IxbTs6qMv&9x**wb4pwbR2ToxP{V}@o%2xS~4 zj8?eSTX3S-$vLM_YFX^`!+5)f$JWact)UL&`bymuf-1(NW zf;q$kBO14pQ8Z3{jI!`lSXYrzhUlv9J}p@)R!*k%wd&x0;JtO_nFfE}+Tpsv)85#i zl|Uc+#vn09dwn|+^I6dDDuPCm2jTl?kbc*UWemf}XV8T|d6r&%<7yBR%OT?qfkU^b zD~+AbfM<=sJiXYDhh0nFOcz?m9G5p;R*0O*;>3MwX{^2)u5?2?Rt<(ZxH*Z_l3JMF zA)4!KMd#1Irq;C#t5^fEOGT$57n?QUAs`lLX-DASoRiAG&^+d;*$y9)lCsTA*BH(h zHEg@X$k`4fMs6(?W)6!a@}SxhW0D!~Oa6HOmCwGKT#IrDWlqcEZbs4f8F`nx9DSp- zE<1pF$A_SB#tFKmXhX`X&B=l@)&m1mj588#%&n*G0>d{8B{H)Yw z&gNYegw_&ZmtfGun^bI`f;iV#nr;%$O}3(6Z*}_pD2KdGclOOvpr)mc+F47BWR?q+>yY;5xe`xkMZY?57#(O``rwin;&S!Yv|88N?G{n%@7 zT-o*Okuf(=L`lzyB3rw;6|bIhCw4M3AG##iLx3?BS=fayxgKg;+JQc@a-<<1&?WfJ z^u38M>X(PC=8SJL7Cy&63mllT4Ga&<$}m2oj0K_9 zfzgu7e7fB(c63?mB*CLtB4V#c-NdfgQ6@P{0mI|3IYTG;3YEv@Lw_2p8?u`0;wA^yrWwl=nowohLDU)~XD zWCXGVJ^r6I{~YMB`z_fC6aesaJULa>%+bow8fb3mzzF`c$zW@38my=wiGujzDdI+v zmJ(BbJXZq%5CHf`9H8Sz&+g+XMNv*wT=VNJVebgUehgI)h%1gBU8&OU(LH5 z=oJt2PSo-#GLLRH2C*-XjJKVZ24qz z&2)PG?5C!=&mD^u-OH6dtF`^Bjf3m0qnlqQwtA<(_RZ`J&FxMsAIz*C&TkwoZJ%uH zecL@cKRCTOI=lLIetmIubANyT*t>^^hXhWb6952(DlI0g>N0;gJ7zsEgyz52`QrV6>()2LkXySyzg=1A;FtaxzBh)+8v*u!X9CLJf`u+vG#bmzHCyB5Z?0YCv zE8)DVBc00?&j~9n`gsl|J*P8gD7L3f2`@75M~$_3wJK)M*3QP8cu?c5Yw`~%&0mn8 z3MZ+jx4f#2&p+&|l5Q}z$^!_*gVpiM0rQx)W?HRj$1@WeW=X3c~O8d+qZ*3fD^5Q8i z`aW;*<8dk{oVs&`GAO(*0O}S?-dQOnHUy5lQ%;V;na1-tM;x+zA zWPzU9qI~3V?&67dC*!MbwMiP3!F}p)w69tcNpu^KxO5p`$FHpG>xuFIxZq%x%pu=% z>r%Bi+-6kb1P{HsEG~xIDxUs)JvJU!*rahRuP@Q-SuFUXDS=vRd0STx)-~*UahotP zHlMOIw>q|^wbmoTi@v*I+H@*@N?THju~z%CVJ^H^|MS-=c)LrJMpD$nL}^P}IxU;J zv+t`%n_xmxe4Ez-b(kI@5d4KlGKW9X)SUCI*M0snVg567{x3D|y(e1%ugQZMX5rw| zA0HBcw77y;iHL#k?~`t%$6p!QSc9L^^T({aS#!xIn*+`JSl=gqlCu=ZnZ7{r>Rcge z{$<`?w2Yd*!ZTdkx0V*kpv(K4a4Q2KCdXpV9#Z4rSDS8DqvX%d3(;`+g={hFJRfkB za22C^V}tK_?tYv;*L{C%-O?DX)s4}h08&m+#f_B$u5tpbGG~IPX&nfkcdNerkesW< z_Ss*R+w1NoEjJ2Tu z&{31NJRTdH-db3ua0aZS)J5mjF{A7Y8Eqbb`##IKdKq7{k*}(SJ-O}0hTzdLQM7M7 zw56G-n8>B}?!I=aEzN*55GmRkP(dUy3oFGoVP*N!?$im14f_M-4uYxd!CW)BgewnY z97fy?Q-r$vPO>bO?{rH4t#ZFHy+K#zogUj^>N7fI`8~1n{z3VG1fspX5H>)|NRPlE z$1A({#d5FG(b7Cb(bTQ@E0~~_FjV9wFJM~Wa@`kK9KQwd*|}jkf`d~P^GGY}siW~o zbS~VKUrIKm7~sq6Yo`Ra=DAPWUt;s&jHo-rN+)uFVCMWIB|g`}X-tLinwtAk=S}-| zpOSUoVrg!kO{^AL*GWxA*3YXu<-2=~gb> zR6nZS9N~x$jIJ+Y!7PsX>*yfc_)fn2&(i^*#uFi1qp6r?&A!zvaUJT$RVs}NVHl7r zM6#nq9jx`s8A?okcI}k()GoR29|CeN-o0Q{7-l3~>Qt{5%2liw_CdIWMXXsvTP(*9 zLVUTcmv3|xhM?sot}qk zmI3ob>PSK0^`Iav3*THa{f2aI<9%0BL%n?ull;Re*8-8Z0x|(LsA1hW(AdhdhJ+j+ zpYPx*{P6Rc>2PM#-GvczOW&*!XT-8e7sshin8!&^FXuu%$hG)xPySWww-=oy-b~O( zK{Wo|&Xn;&@tHJ^!Zdq1!BQCvQFCe}3Tzd5w>3nqLd?0~{W30*w-Yoy^yWK*Bb2k? z`6FEhhS!Y4x|fjU`{yop4I!_6c*0)fdMA{I1by{LtmBMOO=iF&nWW6MfXc}#OP5fd z?Vwl;n;Zs~5xaOrb7YYq#-D0U3M?4d@9^z#!}7wdeqbP@eGYSINxy88i~VR2k#os(?qGld5A>6xSHH0++hqnE46)9Wy=RJ+eT1*>V}g0 zMzD<)=L6(Z?2dQwU}y*f02E>V8N2_g9{NXd6$A!8t;=CC@)5~QXaUDRu!AlTyAvY~ z&@YtFtCVTk|C+)0)xIapq1KeTMq4!z`7P2oFhVm@6N%$q_LO=CM9r<3>FNv#^25~J<}R=>2ffd)y&szoAe+4OoQ+XTM(k1& zQ}lL$T%IrG&9MTNL^z}y!Zoi6?G-k8;2`!Jp9 zuqB|*Df!&fHLkGnz}sfrGs%T>r-k_jrA{1F)4t^v2dO8Hw}DQMheN%Lmhugw7ec1I z->}1k_2EWApk$=3+B$Yx<|xc=;2Asg8|Qv&Pv=@A#Wc-xw8_Bs9?zlS1yU3WrA^3KKCu-}HFF zJ-m)!qM-!d&xmxrB;gNT;wi|eKm^t(HwV^`MEMAXA;|T=2m28;D9CoP#-Ay1w`U%% z_ZT!!_+{}KoY01k%q|BZ=Wgk(HkTc}@mukTGjlsKa&w&MI$a@;HArDOdcD`k>-zBZ zo?+wxZ@sk2Nz77c_><{Por7rz_gdA&#{(gEyn7ZjhokX@s))+ZTJfDYqo{v7~Xm6YYT3$K6+*RON z()V7%V{D}}bUlIWMl3F&=}8Z#fy*Ep@=wxJBa%Gq4DCER8;2JWmx8jGvx?r!Crjt2Ii+4NTbVE9MOpT=pfy!ojUS0 zeLF9`>Z5wZ+iGq0CS8;v^>0dQ*A4mwmyL#9eWD4X6IQ{bZl+EF| zNz{Z%&wK>pe6CR-38{VC0xa{PYSltu{Fwq85n?-BJhJ zMF9ZjX^)EY1qu5gDf(3^!Lno>*fai}IX)q3drmS$D=H^~_Ppik$pw`|TZxxqFB+We zm28BwNn6Fh0lpRH_onuI*w(=YFLhY?W1 zt4#*E(!*E>4p+2s<2Ao!^HkS{knhgR@AhYwUv90o)U$Ffj;>Aju5VW}uuwk88kFcB zVq>ADC^0&=$j^)4lRZ4c3T6|OWmYq*&YVDa39(jie=qO+iMZ;Pwpu|he%Xy_t3}lX}=)zcl!(3aB+DuJX5tE39{>r?}13foJPdN+c z356Lig9wR7_6|xv)w*C=O~+z8MREo%OngMO$^7ETs88^gl4#0P<4oh+agGIDj=HkQ z0n*-#4nYH6#&7D{xAubT)MI2MNrbubuD5|#B?qO-zkGPZt~-@Cgk{3O{3Wx+8i&H- zc;3!s0}^G3Fvo?L1F=V}0e;$)SDf46banb`NUZyMh~fLMig_<-j*1CyQD{#Cu;tEG zu+)gLI$^78XBAT=Y04v;kAVHIRs=qCt&v}exxpJ z@ni*hCO+~j2#FPjMaB}y{^$HYYmosMkgv(#w3rOyU2fYs?qLQT=9iQiOd`H{KSw7MA@2wR6YgOMHd}{2MW8?B(GXYJ z5^sC^^L_J!JGYXXZI!FN5^s#Udz`0TQ@z_w^$r#QFk$+)pac6c=#Upz6{eR~kYM~z z^zj&x7RSh2caos_Uvm3*)v#nA=8D)={( zv{n#H^|))saP=G{<#nxIxWbGX?8z|0cz3(`I7)NM`>KJ-0@XrB3EOXIwo=sOsnfH* zDbybn7StTy3V-rxhz&eL5i&KhC>_rPt~1P7!H;GZPRxmR#$LiMpi2=HY-}K3H94js z!eYwe8uH)=HC5U5I7VWLxj3d+O1^=6cMN(Xp57x2P&6*AKP#0^_|)3OKWM%511#H ztKPnWV0sKxD50NR4grY;`2A}YkADA){rQr`pQu0cg}*+27mAMPuzbMoPS=={etJGg7ABmr$YHpLwy|7KYR06Md9~6Pv!5QCix4V zp9;hOl*RKGEI$>8-?Kbv4nM8(7cBpu0`YsYCk^7Ko&19A?~26lnf~r-n#WS$KVAJ- zh2r--fA5juFL?g0Sp1#opPI$bv86mR{Z7I7b3*_5ApA9@eyVByv<}q2RXG0%{A=#@ zlyUzw-N&`>@zth3^6!75{+e<;e@#&SiTvy8@w6=e fwDrdc_RB?DQ5NQLg$Dr8A3vbSMMsVF>FWOhXEb!! literal 0 HcmV?d00001 diff --git a/sw/qa/uitest/writer_tests7/tdf138512.py b/sw/qa/uitest/writer_tests7/tdf138512.py new file mode 100755 index 000000000000..5b0191051d85 --- /dev/null +++ b/sw/qa/uitest/writer_tests7/tdf138512.py @@ -0,0 +1,56 @@ +# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-offset: 4 -*- +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +from uitest.framework import UITestCase +from uitest.uihelper.common import get_state_as_dict +from libreoffice.uno.propertyvalue import mkPropertyValues +from com.sun.star.text.TextContentAnchorType import AS_CHARACTER +import org.libreoffice.unotest +import pathlib +import time + + +def get_url_for_data_file(file_name): + return pathlib.Path(org.libreoffice.unotest.makeCopyFromTDOC(file_name)).as_uri() + +class tdf138512(UITestCase): + + def test_tdf138512(self): + + # Open the bugdoc + self.ui_test.load_file(get_url_for_data_file("tdf138512.odt")) + + xWriterDoc = self.xUITest.getTopFocusWindow() + xWriterEdit = xWriterDoc.getChild("writer_edit") + document = self.ui_test.get_component() + + # Check that the anchortype is as_char + self.assertEqual( AS_CHARACTER, document.DrawPage.getByIndex(0).AnchorType) + + # Select the textbox + self.xUITest.executeCommand(".uno:JumpToNextFrame") + self.xUITest.executeCommand(".uno:JumpToNextFrame") + + # Align the shape to bottom + time.sleep(1) + self.xUITest.executeCommand(".uno:AlignDown") + time.sleep(1) + + # Align the shape up + self.xUITest.executeCommand(".uno:AlignUp") + time.sleep(1) + + # Deselect the shape + xWriterEdit.executeAction("TYPE", mkPropertyValues({"KEYCODE": "TAB"})) + xWriterEdit.executeAction("TYPE", mkPropertyValues({"KEYCODE": "ESC"})) + + # Without the fix this will crash at this point with gtk vcl backend + time.sleep(1) + self.assertEqual( AS_CHARACTER, document.DrawPage.getByIndex(0).AnchorType) + + self.ui_test.close_doc() + +# vim: set shiftwidth=4 softtabstop=4 expandtab: diff --git a/sw/source/uibase/shells/drwbassh.cxx b/sw/source/uibase/shells/drwbassh.cxx index f901f32cc15d..b73dccb6036d 100644 --- a/sw/source/uibase/shells/drwbassh.cxx +++ b/sw/source/uibase/shells/drwbassh.cxx @@ -443,8 +443,7 @@ void SwDrawBaseShell::Execute(SfxRequest const &rReq) if ( bAlignPossible ) { const SdrMarkList& rMarkList = pSdrView->GetMarkedObjectList(); - if (rMarkList.GetMarkCount() == 1 - && !SwTextBoxHelper::hasTextFrame(rMarkList.GetMark(0)->GetMarkedSdrObj())) + if (rMarkList.GetMarkCount() == 1) { sal_Int16 nHorizOrient = -1, nVertOrient = -1; @@ -472,13 +471,16 @@ void SwDrawBaseShell::Execute(SfxRequest const &rReq) break; } + SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj(); + SwFrameFormat* pFrameFormat = FindFrameFormat(pObj); + SwFrameFormat* pTextBox + = SwTextBoxHelper::getOtherTextBoxFormat(pFrameFormat, RES_DRAWFRMFMT); + if (nHorizOrient != -1) { pSh->StartAction(); - SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj(); - SwFrameFormat* pFrameFormat = FindFrameFormat( pObj ); SwFormatHoriOrient aHOrient(pFrameFormat->GetFormatAttr(RES_HORI_ORIENT)); - aHOrient.SetHoriOrient( nHorizOrient ); + aHOrient.SetHoriOrient(nHorizOrient); pFrameFormat->SetFormatAttr(aHOrient); pSh->EndAction(); } @@ -486,14 +488,34 @@ void SwDrawBaseShell::Execute(SfxRequest const &rReq) if (nVertOrient != -1) { pSh->StartAction(); - SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj(); - SwFrameFormat* pFrameFormat = FindFrameFormat( pObj ); SwFormatVertOrient aVOrient(pFrameFormat->GetFormatAttr(RES_VERT_ORIENT)); - aVOrient.SetVertOrient( nVertOrient ); + aVOrient.SetVertOrient(nVertOrient); pFrameFormat->SetFormatAttr(aVOrient); pSh->EndAction(); } + if (pTextBox) + { + Point nShapePos(pFrameFormat->GetHoriOrient().GetPos(), + pFrameFormat->GetVertOrient().GetPos()); + Point nOffset( + SwTextBoxHelper::getTextRectangle(pFrameFormat, false).TopLeft()); + + if (nHorizOrient != -1) + { + SwFormatHoriOrient aNewHOri(pTextBox->GetHoriOrient()); + aNewHOri.SetPos(nShapePos.X() + nOffset.X()); + pTextBox->SetFormatAttr(aNewHOri); + } + + if (nVertOrient != -1) + { + SwFormatVertOrient aNewVOri(pTextBox->GetVertOrient()); + aNewVOri.SetPos(nShapePos.Y() + nOffset.Y()); + pTextBox->SetFormatAttr(aNewVOri); + } + } + break; }