[Libreoffice-commits] core.git: Branch 'libreoffice-6-4' - sw/inc sw/qa sw/source writerfilter/source
Vasily Melenchuk (via logerrit)
logerrit at kemper.freedesktop.org
Thu Aug 13 09:14:25 UTC 2020
sw/inc/IDocumentSettingAccess.hxx | 3 ++-
sw/qa/extras/ooxmlexport/data/128197_compat14.docx |binary
sw/qa/extras/ooxmlexport/data/128197_compat15.docx |binary
sw/qa/extras/ooxmlexport/ooxmlexport14.cxx | 15 +++++++++++++++
sw/source/core/doc/DocumentSettingManager.cxx | 7 +++++++
sw/source/core/inc/DocumentSettingManager.hxx | 1 +
sw/source/core/text/itrform2.cxx | 10 ++++++++++
sw/source/uibase/uno/SwXDocumentSettings.cxx | 13 +++++++++++++
writerfilter/source/dmapper/SettingsTable.cxx | 8 ++++++++
9 files changed, 56 insertions(+), 1 deletion(-)
New commits:
commit ed79b0f274c913ce8206a68a2ca9296b84ac0751
Author: Vasily Melenchuk <vasily.melenchuk at cib.de>
AuthorDate: Thu Jun 11 09:45:03 2020 +0300
Commit: Thorsten Behrens <Thorsten.Behrens at CIB.de>
CommitDate: Thu Aug 13 11:13:49 2020 +0200
tdf#128197: sw: different line height for DOCX with compat=14
Lines containing just a shape inline without any other text are
treated in DOCX with compatibility option 15 and 14 in a different
way: while compat=15 is layouting line exatly as LO does, in
compat=14 mode minimal line height takes into account just shape
height and not current font.
Change-Id: Id2bdab941a0bbaa9080567d736435d9e0babd490
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/96080
Tested-by: Jenkins
Reviewed-by: Thorsten Behrens <Thorsten.Behrens at CIB.de>
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/100542
diff --git a/sw/inc/IDocumentSettingAccess.hxx b/sw/inc/IDocumentSettingAccess.hxx
index f182027ded95..814f139b64fc 100644
--- a/sw/inc/IDocumentSettingAccess.hxx
+++ b/sw/inc/IDocumentSettingAccess.hxx
@@ -63,7 +63,8 @@ enum class DocumentSettingId
// tdf#104349 tdf#104668
MS_WORD_COMP_TRAILING_BLANKS,
-
+ // tdf#128197 MS Word in some modes can have line height based on shape height, not on font
+ MS_WORD_COMP_MIN_LINE_HEIGHT_BY_FLY,
UNIX_FORCE_ZERO_EXT_LEADING,
TABS_RELATIVE_TO_INDENT,
PROTECT_FORM,
diff --git a/sw/qa/extras/ooxmlexport/data/128197_compat14.docx b/sw/qa/extras/ooxmlexport/data/128197_compat14.docx
new file mode 100644
index 000000000000..507e28396019
Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/128197_compat14.docx differ
diff --git a/sw/qa/extras/ooxmlexport/data/128197_compat15.docx b/sw/qa/extras/ooxmlexport/data/128197_compat15.docx
new file mode 100644
index 000000000000..d618b117cfec
Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/128197_compat15.docx differ
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport14.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport14.cxx
index 237e19092d1a..18a22bbdd30c 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport14.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport14.cxx
@@ -35,6 +35,21 @@ protected:
}
};
+CPPUNIT_TEST_FIXTURE(Test, testTdf128197)
+{
+ load(mpTestDocumentPath, "128197_compat14.docx");
+ xmlDocPtr pLayout14 = parseLayoutDump();
+ sal_Int32 nHeight14 = getXPath(pLayout14, "//page[1]/body/txt[1]/infos/bounds", "height").toInt32();
+
+ load(mpTestDocumentPath, "128197_compat15.docx");
+ xmlDocPtr pLayout15 = parseLayoutDump();
+ sal_Int32 nHeight15 = getXPath(pLayout15, "//page[1]/body/txt[1]/infos/bounds", "height").toInt32();
+
+ // In compat mode=14 second line has size of the shape thus entire paragraph height is smaller
+ // So nHeight14 < nHeight15
+ CPPUNIT_ASSERT_LESS(nHeight15, nHeight14);
+}
+
DECLARE_OOXMLEXPORT_EXPORTONLY_TEST(testTdf78749, "tdf78749.docx")
{
//Shape lost the background image before, now check if it still has...
diff --git a/sw/source/core/doc/DocumentSettingManager.cxx b/sw/source/core/doc/DocumentSettingManager.cxx
index 11210614c56f..b7f3af73d2af 100644
--- a/sw/source/core/doc/DocumentSettingManager.cxx
+++ b/sw/source/core/doc/DocumentSettingManager.cxx
@@ -76,6 +76,7 @@ sw::DocumentSettingManager::DocumentSettingManager(SwDoc &rDoc)
mbTabRelativeToIndent(true),
mbProtectForm(false), // i#78591#
mbMsWordCompTrailingBlanks(false), // tdf#104349 tdf#104668
+ mbMsWordCompMinLineHeightByFly(false),
mbInvertBorderSpacing (false),
mbCollapseEmptyCellPara(true),
mbTabAtLeftIndentForParagraphsInList(false), //#i89181#
@@ -181,6 +182,7 @@ bool sw::DocumentSettingManager::get(/*[in]*/ DocumentSettingId id) const
case DocumentSettingId::PROTECT_FORM: return mbProtectForm;
// tdf#104349 tdf#104668
case DocumentSettingId::MS_WORD_COMP_TRAILING_BLANKS: return mbMsWordCompTrailingBlanks;
+ case DocumentSettingId::MS_WORD_COMP_MIN_LINE_HEIGHT_BY_FLY: return mbMsWordCompMinLineHeightByFly;
// #i89181#
case DocumentSettingId::TAB_AT_LEFT_INDENT_FOR_PARA_IN_LIST: return mbTabAtLeftIndentForParagraphsInList;
case DocumentSettingId::INVERT_BORDER_SPACING: return mbInvertBorderSpacing;
@@ -327,6 +329,10 @@ void sw::DocumentSettingManager::set(/*[in]*/ DocumentSettingId id, /*[in]*/ boo
mbMsWordCompTrailingBlanks = value;
break;
+ case DocumentSettingId::MS_WORD_COMP_MIN_LINE_HEIGHT_BY_FLY:
+ mbMsWordCompMinLineHeightByFly = value;
+ break;
+
case DocumentSettingId::TABS_RELATIVE_TO_INDENT:
mbTabRelativeToIndent = value;
break;
@@ -597,6 +603,7 @@ void sw::DocumentSettingManager::ReplaceCompatibilityOptions(const DocumentSetti
mbClipAsCharacterAnchoredWriterFlyFrames = rSource.mbClipAsCharacterAnchoredWriterFlyFrames;
mbUnixForceZeroExtLeading = rSource.mbUnixForceZeroExtLeading;
mbTabRelativeToIndent = rSource.mbTabRelativeToIndent;
+ mbMsWordCompMinLineHeightByFly = rSource.mbMsWordCompMinLineHeightByFly;
mbTabAtLeftIndentForParagraphsInList = rSource.mbTabAtLeftIndentForParagraphsInList;
mbSubtractFlys = rSource.mbSubtractFlys;
mbMsWordCompTrailingBlanks = rSource.mbMsWordCompTrailingBlanks;
diff --git a/sw/source/core/inc/DocumentSettingManager.hxx b/sw/source/core/inc/DocumentSettingManager.hxx
index fe87b339307c..e548c55a26b2 100644
--- a/sw/source/core/inc/DocumentSettingManager.hxx
+++ b/sw/source/core/inc/DocumentSettingManager.hxx
@@ -142,6 +142,7 @@ class DocumentSettingManager :
bool mbTabRelativeToIndent : 1; // #i24363# tab stops relative to indent
bool mbProtectForm : 1;
bool mbMsWordCompTrailingBlanks : 1; // tdf#104349 tdf#104668
+ bool mbMsWordCompMinLineHeightByFly : 1;
bool mbInvertBorderSpacing : 1;
bool mbCollapseEmptyCellPara : 1;
bool mbTabAtLeftIndentForParagraphsInList; // #i89181# - see above
diff --git a/sw/source/core/text/itrform2.cxx b/sw/source/core/text/itrform2.cxx
index 89c7641df414..4e57a0b64d90 100644
--- a/sw/source/core/text/itrform2.cxx
+++ b/sw/source/core/text/itrform2.cxx
@@ -333,6 +333,16 @@ void SwTextFormatter::InsertPortion( SwTextFormatInfo &rInf,
m_pCurr->Height( pPor->Height() );
if( m_pCurr->GetAscent() < pPor->GetAscent() )
m_pCurr->SetAscent( pPor->GetAscent() );
+
+ if (GetTextFrame()->GetDoc().getIDocumentSettingAccess().get(DocumentSettingId::MS_WORD_COMP_MIN_LINE_HEIGHT_BY_FLY))
+ {
+ // For DOCX with compat=14 the only shape in line defines height of the line inspite of used font
+ if (pLast->IsFlyCntPortion() && pPor->IsTextPortion() && pPor->GetLen() == TextFrameIndex(0))
+ {
+ m_pCurr->SetAscent(pLast->GetAscent());
+ m_pCurr->Height(pLast->Height());
+ }
+ }
}
// Sometimes chains are constructed (e.g. by hyphenate)
diff --git a/sw/source/uibase/uno/SwXDocumentSettings.cxx b/sw/source/uibase/uno/SwXDocumentSettings.cxx
index 9887cdc11dc8..51124bfe4071 100644
--- a/sw/source/uibase/uno/SwXDocumentSettings.cxx
+++ b/sw/source/uibase/uno/SwXDocumentSettings.cxx
@@ -114,6 +114,7 @@ enum SwDocumentSettingsPropertyHandles
HANDLE_USE_OLD_PRINTER_METRICS,
HANDLE_PROTECT_FORM,
HANDLE_MS_WORD_COMP_TRAILING_BLANKS,
+ HANDLE_MS_WORD_COMP_MIN_LINE_HEIGHT_BY_FLY,
HANDLE_TABS_RELATIVE_TO_INDENT,
HANDLE_RSID,
HANDLE_RSID_ROOT,
@@ -203,6 +204,7 @@ static MasterPropertySetInfo * lcl_createSettingsInfo()
{ OUString("RsidRoot"), HANDLE_RSID_ROOT, cppu::UnoType<sal_Int32>::get(), 0},
{ OUString("ProtectForm"), HANDLE_PROTECT_FORM, cppu::UnoType<bool>::get(), 0},
{ OUString("MsWordCompTrailingBlanks"), HANDLE_MS_WORD_COMP_TRAILING_BLANKS, cppu::UnoType<bool>::get(), 0 },
+ { OUString("MsWordCompMinLineHeightByFly"), HANDLE_MS_WORD_COMP_MIN_LINE_HEIGHT_BY_FLY, cppu::UnoType<bool>::get(), 0 },
{ OUString("TabAtLeftIndentForParagraphsInList"), HANDLE_TAB_AT_LEFT_INDENT_FOR_PARA_IN_LIST, cppu::UnoType<bool>::get(), 0},
{ OUString("ModifyPasswordInfo"), HANDLE_MODIFYPASSWORDINFO, cppu::UnoType< cppu::UnoSequenceType<css::beans::PropertyValue> >::get(), 0},
{ OUString("MathBaselineAlignment"), HANDLE_MATH_BASELINE_ALIGNMENT, cppu::UnoType<bool>::get(), 0},
@@ -749,6 +751,12 @@ void SwXDocumentSettings::_setSingleValue( const comphelper::PropertyInfo & rInf
mpDoc->getIDocumentSettingAccess().set(DocumentSettingId::MS_WORD_COMP_TRAILING_BLANKS, bTmp);
}
break;
+ case HANDLE_MS_WORD_COMP_MIN_LINE_HEIGHT_BY_FLY:
+ {
+ bool bTmp = *o3tl::doAccess<bool>(rValue);
+ mpDoc->getIDocumentSettingAccess().set(DocumentSettingId::MS_WORD_COMP_MIN_LINE_HEIGHT_BY_FLY, bTmp);
+ }
+ break;
case HANDLE_TAB_AT_LEFT_INDENT_FOR_PARA_IN_LIST:
{
bool bTmp = *o3tl::doAccess<bool>(rValue);
@@ -1275,6 +1283,11 @@ void SwXDocumentSettings::_getSingleValue( const comphelper::PropertyInfo & rInf
rValue <<= mpDoc->getIDocumentSettingAccess().get(DocumentSettingId::MS_WORD_COMP_TRAILING_BLANKS);
}
break;
+ case HANDLE_MS_WORD_COMP_MIN_LINE_HEIGHT_BY_FLY:
+ {
+ rValue <<= mpDoc->getIDocumentSettingAccess().get(DocumentSettingId::MS_WORD_COMP_MIN_LINE_HEIGHT_BY_FLY);
+ }
+ break;
case HANDLE_TAB_AT_LEFT_INDENT_FOR_PARA_IN_LIST:
{
rValue <<= mpDoc->getIDocumentSettingAccess().get(DocumentSettingId::TAB_AT_LEFT_INDENT_FOR_PARA_IN_LIST);
diff --git a/writerfilter/source/dmapper/SettingsTable.cxx b/writerfilter/source/dmapper/SettingsTable.cxx
index 58399cf0a151..90fb9c98752d 100644
--- a/writerfilter/source/dmapper/SettingsTable.cxx
+++ b/writerfilter/source/dmapper/SettingsTable.cxx
@@ -23,6 +23,7 @@
#include <rtl/ustring.hxx>
#include <sfx2/zoomitem.hxx>
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
#include <com/sun/star/beans/XPropertySet.hpp>
#include <com/sun/star/beans/XPropertyState.hpp>
#include <com/sun/star/container/XNameContainer.hpp>
@@ -701,6 +702,13 @@ void SettingsTable::ApplyProperties(uno::Reference<text::XTextDocument> const& x
{
uno::Reference< beans::XPropertySet> xDocProps( xDoc, uno::UNO_QUERY );
+ if (GetWordCompatibilityMode() <= 14)
+ {
+ uno::Reference<lang::XMultiServiceFactory> xTextFactory(xDoc, uno::UNO_QUERY_THROW);
+ uno::Reference<beans::XPropertySet> xDocumentSettings(xTextFactory->createInstance("com.sun.star.document.Settings"), uno::UNO_QUERY_THROW);
+ xDocumentSettings->setPropertyValue("MsWordCompMinLineHeightByFly", uno::makeAny(true));
+ }
+
// Show changes value
if (xDocProps.is())
{
More information about the Libreoffice-commits
mailing list