tdf#124423 sw: fix AutoSize width frames of DOCX
Add layout compatibility option FRAME_AUTOWIDTH_WITH_MORE_PARA
to keep paragraph area width of AutoSize width frames with
more than one paragraph.
Co-authored-by: Tibor Nagy (NISZ)
Change-Id: Iab8926b6219ac92ef1ab7488bdef1d3f2b47c396
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/97425
Tested-by: László Németh <nemeth@numbertext.org>
Reviewed-by: László Németh <nemeth@numbertext.org>
diff --git a/sw/inc/IDocumentSettingAccess.hxx b/sw/inc/IDocumentSettingAccess.hxx
index 737e1f8..8ff48ff 100644
--- a/sw/inc/IDocumentSettingAccess.hxx
+++ b/sw/inc/IDocumentSettingAccess.hxx
@@ -107,6 +107,7 @@ enum class DocumentSettingId
PROTECT_BOOKMARKS,
PROTECT_FIELDS,
HEADER_SPACING_BELOW_LAST_PARA,
FRAME_AUTOWIDTH_WITH_MORE_PARA,
};
/** Provides access to settings of a document
diff --git a/sw/qa/extras/layout/data/tdf124423.docx b/sw/qa/extras/layout/data/tdf124423.docx
new file mode 100644
index 0000000..d48cc60
--- /dev/null
+++ b/sw/qa/extras/layout/data/tdf124423.docx
Binary files differ
diff --git a/sw/qa/extras/layout/data/tdf124423.odt b/sw/qa/extras/layout/data/tdf124423.odt
new file mode 100644
index 0000000..2202c93c
--- /dev/null
+++ b/sw/qa/extras/layout/data/tdf124423.odt
Binary files differ
diff --git a/sw/qa/extras/layout/layout.cxx b/sw/qa/extras/layout/layout.cxx
index aec3faa..e9d850b 100644
--- a/sw/qa/extras/layout/layout.cxx
+++ b/sw/qa/extras/layout/layout.cxx
@@ -4182,6 +4182,25 @@ CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testTdf134548)
}
}
CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testTdf124423)
{
createDoc("tdf124423.docx");
xmlDocUniquePtr pXmlDoc = parseLayoutDump();
sal_Int32 nFly1Width = getXPath(pXmlDoc, "(//fly)[1]/infos/prtBounds", "width").toInt32();
sal_Int32 nFly2Width = getXPath(pXmlDoc, "(//fly)[2]/infos/prtBounds", "width").toInt32();
sal_Int32 nPageWidth = getXPath(pXmlDoc, "//page/infos/prtBounds", "width").toInt32();
CPPUNIT_ASSERT_EQUAL(nPageWidth, nFly2Width);
CPPUNIT_ASSERT_LESS(nPageWidth / 2, nFly1Width);
createDoc("tdf124423.odt");
pXmlDoc = parseLayoutDump();
nFly1Width = getXPath(pXmlDoc, "(//fly)[1]/infos/prtBounds", "width").toInt32();
nFly2Width = getXPath(pXmlDoc, "(//fly)[2]/infos/prtBounds", "width").toInt32();
nPageWidth = getXPath(pXmlDoc, "//page/infos/prtBounds", "width").toInt32();
CPPUNIT_ASSERT_LESS(nPageWidth / 2, nFly2Width);
CPPUNIT_ASSERT_LESS(nPageWidth / 2, nFly1Width);
}
CPPUNIT_PLUGIN_IMPLEMENT();
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/doc/DocumentSettingManager.cxx b/sw/source/core/doc/DocumentSettingManager.cxx
index 1f2f4ae..5873f29 100644
--- a/sw/source/core/doc/DocumentSettingManager.cxx
+++ b/sw/source/core/doc/DocumentSettingManager.cxx
@@ -97,7 +97,8 @@ sw::DocumentSettingManager::DocumentSettingManager(SwDoc &rDoc)
mbDisableOffPagePositioning ( false ),
mbProtectBookmarks(false),
mbProtectFields(false),
mbHeaderSpacingBelowLastPara(false)
mbHeaderSpacingBelowLastPara(false),
mbFrameAutowidthWithMorePara(false)
// COMPATIBILITY FLAGS END
{
@@ -226,6 +227,7 @@ bool sw::DocumentSettingManager::get(/*[in]*/ DocumentSettingId id) const
case DocumentSettingId::PROTECT_BOOKMARKS: return mbProtectBookmarks;
case DocumentSettingId::PROTECT_FIELDS: return mbProtectFields;
case DocumentSettingId::HEADER_SPACING_BELOW_LAST_PARA: return mbHeaderSpacingBelowLastPara;
case DocumentSettingId::FRAME_AUTOWIDTH_WITH_MORE_PARA: return mbFrameAutowidthWithMorePara;
default:
OSL_FAIL("Invalid setting id");
}
@@ -474,6 +476,9 @@ void sw::DocumentSettingManager::set(/*[in]*/ DocumentSettingId id, /*[in]*/ boo
case DocumentSettingId::HEADER_SPACING_BELOW_LAST_PARA:
mbHeaderSpacingBelowLastPara = value;
break;
case DocumentSettingId::FRAME_AUTOWIDTH_WITH_MORE_PARA:
mbFrameAutowidthWithMorePara = value;
break;
default:
OSL_FAIL("Invalid setting id");
}
@@ -646,6 +651,7 @@ void sw::DocumentSettingManager::ReplaceCompatibilityOptions(const DocumentSetti
// No mbProtectBookmarks: this is false by default everywhere
// No mbProtectFields: this is false by default everywhere
mbHeaderSpacingBelowLastPara = rSource.mbHeaderSpacingBelowLastPara;
mbFrameAutowidthWithMorePara = rSource.mbFrameAutowidthWithMorePara;
}
sal_uInt32 sw::DocumentSettingManager::Getn32DummyCompatibilityOptions1() const
@@ -946,6 +952,11 @@ void sw::DocumentSettingManager::dumpAsXml(xmlTextWriterPtr pWriter) const
BAD_CAST(OString::boolean(mbHeaderSpacingBelowLastPara).getStr()));
xmlTextWriterEndElement(pWriter);
xmlTextWriterStartElement(pWriter, BAD_CAST("mbFrameAutowidthWithMorePara"));
xmlTextWriterWriteAttribute(pWriter, BAD_CAST("value"),
BAD_CAST(OString::boolean(mbFrameAutowidthWithMorePara).getStr()));
xmlTextWriterEndElement(pWriter);
xmlTextWriterEndElement(pWriter);
}
diff --git a/sw/source/core/inc/DocumentSettingManager.hxx b/sw/source/core/inc/DocumentSettingManager.hxx
index ef404de..8b409eb 100644
--- a/sw/source/core/inc/DocumentSettingManager.hxx
+++ b/sw/source/core/inc/DocumentSettingManager.hxx
@@ -166,7 +166,7 @@ class DocumentSettingManager :
bool mbProtectBookmarks;
bool mbProtectFields;
bool mbHeaderSpacingBelowLastPara;
bool mbFrameAutowidthWithMorePara; //tdf#124423
public:
DocumentSettingManager(SwDoc &rDoc);
diff --git a/sw/source/core/layout/fly.cxx b/sw/source/core/layout/fly.cxx
index 2521013..95fd7d8 100644
--- a/sw/source/core/layout/fly.cxx
+++ b/sw/source/core/layout/fly.cxx
@@ -72,6 +72,7 @@
#include <bodyfrm.hxx>
#include <FrameControlsManager.hxx>
#include <ndtxt.hxx>
#include <officecfg/Office/Compatibility.hxx>
using namespace ::com::sun::star;
@@ -2516,6 +2517,12 @@ static SwTwips lcl_CalcAutoWidth( const SwLayoutFrame& rFrame )
// No autowidth defined for columned frames
if ( !pFrame || pFrame->IsColumnFrame() )
return nRet;
// tdf#124423 In Microsoft compatibility mode: widen the frame to max (PagePrintArea) if it contains at least 2 paragraphs.
if (rFrame.GetFormat()->getIDocumentSettingAccess().get(DocumentSettingId::FRAME_AUTOWIDTH_WITH_MORE_PARA) && pFrame && pFrame->GetNext())
{
const SwPageFrame* pPage = pFrame->FindPageFrame();
return pFrame->GetUpper()->IsVertical() ? pPage->getFramePrintArea().Height() : pPage->getFramePrintArea().Width();
}
while ( pFrame )
{
diff --git a/sw/source/filter/ww8/ww8par.cxx b/sw/source/filter/ww8/ww8par.cxx
index adbd5f6..07f5502 100644
--- a/sw/source/filter/ww8/ww8par.cxx
+++ b/sw/source/filter/ww8/ww8par.cxx
@@ -1848,6 +1848,8 @@ void SwWW8ImplReader::ImportDop()
// tdf#128195
m_rDoc.getIDocumentSettingAccess().set(
DocumentSettingId::HEADER_SPACING_BELOW_LAST_PARA, true);
m_rDoc.getIDocumentSettingAccess().set(
DocumentSettingId::FRAME_AUTOWIDTH_WITH_MORE_PARA, true);
// Import Default Tabs
long nDefTabSiz = m_xWDop->dxaTab;
diff --git a/sw/source/uibase/uno/SwXDocumentSettings.cxx b/sw/source/uibase/uno/SwXDocumentSettings.cxx
index 7b94387..9af6745 100644
--- a/sw/source/uibase/uno/SwXDocumentSettings.cxx
+++ b/sw/source/uibase/uno/SwXDocumentSettings.cxx
@@ -144,6 +144,7 @@ enum SwDocumentSettingsPropertyHandles
HANDLE_PROTECT_BOOKMARKS,
HANDLE_PROTECT_FIELDS,
HANDLE_HEADER_SPACING_BELOW_LAST_PARA,
HANDLE_FRAME_AUTOWIDTH_WITH_MORE_PARA,
};
}
@@ -235,6 +236,7 @@ static MasterPropertySetInfo * lcl_createSettingsInfo()
{ OUString("ProtectBookmarks"), HANDLE_PROTECT_BOOKMARKS, cppu::UnoType<bool>::get(), 0 },
{ OUString("ProtectFields"), HANDLE_PROTECT_FIELDS, cppu::UnoType<bool>::get(), 0 },
{ OUString("HeaderSpacingBelowLastPara"), HANDLE_HEADER_SPACING_BELOW_LAST_PARA, cppu::UnoType<bool>::get(), 0 },
{ OUString("FrameAutowidthWithMorePara"), HANDLE_FRAME_AUTOWIDTH_WITH_MORE_PARA, cppu::UnoType<bool>::get(), 0 },
/*
* As OS said, we don't have a view when we need to set this, so I have to
@@ -980,6 +982,16 @@ void SwXDocumentSettings::_setSingleValue( const comphelper::PropertyInfo & rInf
}
}
break;
case HANDLE_FRAME_AUTOWIDTH_WITH_MORE_PARA:
{
bool bTmp;
if (rValue >>= bTmp)
{
mpDoc->getIDocumentSettingAccess().set(
DocumentSettingId::FRAME_AUTOWIDTH_WITH_MORE_PARA, bTmp);
}
}
break;
default:
throw UnknownPropertyException(OUString::number(rInfo.mnHandle));
}
@@ -1465,6 +1477,12 @@ void SwXDocumentSettings::_getSingleValue( const comphelper::PropertyInfo & rInf
DocumentSettingId::HEADER_SPACING_BELOW_LAST_PARA);
}
break;
case HANDLE_FRAME_AUTOWIDTH_WITH_MORE_PARA:
{
rValue <<= mpDoc->getIDocumentSettingAccess().get(
DocumentSettingId::FRAME_AUTOWIDTH_WITH_MORE_PARA);
}
break;
default:
throw UnknownPropertyException(OUString::number(rInfo.mnHandle));
}
diff --git a/writerfilter/source/dmapper/DomainMapper.cxx b/writerfilter/source/dmapper/DomainMapper.cxx
index 65b0b4a..1bec709 100644
--- a/writerfilter/source/dmapper/DomainMapper.cxx
+++ b/writerfilter/source/dmapper/DomainMapper.cxx
@@ -127,6 +127,7 @@ DomainMapper::DomainMapper( const uno::Reference< uno::XComponentContext >& xCon
m_pImpl->SetDocumentSettingsProperty("MsWordCompTrailingBlanks", uno::makeAny(true));
m_pImpl->SetDocumentSettingsProperty("HeaderSpacingBelowLastPara",
uno::makeAny(true));
m_pImpl->SetDocumentSettingsProperty("FrameAutowidthWithMorePara", uno::makeAny(true));
m_pImpl->SetDocumentSettingsProperty("TabAtLeftIndentForParagraphsInList", uno::makeAny(true));