tdf#138512 sw: fix crash on textbox alignment

Regression from 3347d71b23
(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 <nemeth@numbertext.org>
Reviewed-by: László Németh <nemeth@numbertext.org>
This commit is contained in:
Attila Bakos (NISZ)
2021-01-20 10:52:26 +01:00
committed by László Németh
parent ec33be1d13
commit 54302a574a
3 changed files with 86 additions and 8 deletions

BIN
sw/qa/uitest/data/tdf138512.odt Executable file

Binary file not shown.

View File

@@ -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:

View File

@@ -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;
}