From a2d8a737f41cbb0ed8a51a99b1c233b25e433d1c Mon Sep 17 00:00:00 2001 From: Justin Luth Date: Thu, 3 Jun 2021 13:38:33 +0200 Subject: [PATCH] tdf#142404 DOCX c15: add compat flag TabOverSpacing DOCX in 2013 (compatibilityMode 15) no longer supports TabOverMargin (i.e. the text margin), but it does a similar kind of thing if the tab goes into the spacing-after of a paragraph. So add a compat flag to handle this in-between kind of situation. I grepped -i "tab_*over_*margin" to see if I was missing anything. Decimal/Center proved to be only tabOverMargin. IsInSect shouldn't matter since it fits inside the printing range. The other places where I didn't insert TabOverSpacing didn't seem relevant based on a code read. Tab-after-tab still doesn't work great, but what we have is already a massive house of cards that will just collapse if changed. No real provision for handling tabs-over-paragraph-end. -auto-tabs are created instead of "beyond nMyRight" tab, unless it is the first tab defined. -doesn't allow auto-tabs to fill the remaining space. But on the other hand, MS Word's implementation of tabs follows some kind of incomprehensible bizarre logic, so just ignore the tabs completely, please. Change-Id: I3723107b29ec3e287ea8661544711c13eee3ca48 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/116667 Tested-by: Jenkins Reviewed-by: Justin Luth Reviewed-by: Miklos Vajna --- sw/inc/IDocumentSettingAccess.hxx | 1 + .../data/tdf142404_tabOverSpacingC15.odt | Bin 0 -> 16623 bytes sw/qa/extras/ooxmlexport/ooxmlexport16.cxx | 18 ++++++++++++++ sw/source/core/doc/DocumentSettingManager.cxx | 12 ++++++++++ sw/source/core/inc/DocumentSettingManager.hxx | 1 + sw/source/core/text/inftxt.cxx | 10 +++++++- sw/source/core/text/itrcrsr.cxx | 4 +++- sw/source/core/text/txttab.cxx | 22 +++++++++++++----- sw/source/uibase/uno/SwXDocumentSettings.cxx | 13 +++++++++++ writerfilter/source/filter/WriterFilter.cxx | 5 ++++ 10 files changed, 78 insertions(+), 8 deletions(-) create mode 100644 sw/qa/extras/ooxmlexport/data/tdf142404_tabOverSpacingC15.odt diff --git a/sw/inc/IDocumentSettingAccess.hxx b/sw/inc/IDocumentSettingAccess.hxx index 059694ff1ceb..310f6a773c3d 100644 --- a/sw/inc/IDocumentSettingAccess.hxx +++ b/sw/inc/IDocumentSettingAccess.hxx @@ -82,6 +82,7 @@ enum class DocumentSettingId CLIPPED_PICTURES, BACKGROUND_PARA_OVER_DRAWINGS, TAB_OVER_MARGIN, + TAB_OVER_SPACING, // MS Word still wraps text around objects with less space than LO would. SURROUND_TEXT_WRAP_SMALL, PROP_LINE_SPACING_SHRINKS_FIRST_LINE, diff --git a/sw/qa/extras/ooxmlexport/data/tdf142404_tabOverSpacingC15.odt b/sw/qa/extras/ooxmlexport/data/tdf142404_tabOverSpacingC15.odt new file mode 100644 index 0000000000000000000000000000000000000000..9760fd253988658ed9872cae2e3db3ec63a9593b GIT binary patch literal 16623 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 literal 0 HcmV?d00001 diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport16.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport16.cxx index 045102438c90..a2217f3ab845 100644 --- a/sw/qa/extras/ooxmlexport/ooxmlexport16.cxx +++ b/sw/qa/extras/ooxmlexport/ooxmlexport16.cxx @@ -226,6 +226,24 @@ DECLARE_OOXMLEXPORT_TEST(testTdf142404_tabOverMarginC15, "tdf142404_tabOverMargi CPPUNIT_ASSERT_EQUAL_MESSAGE("too big for one page", 2, getPages()); } +DECLARE_OOXMLEXPORT_EXPORTONLY_TEST(testTdf142404_tabOverSpacingC15, "tdf142404_tabOverSpacingC15.odt") +{ + // Although TabOverMargin no longer applies to compatibilityMode 15 DOCX files, + // it still applies to a tab over the paragraph end (inside text boundaries). + // The original 3-page ODT saved as DOCX would fit on one page in MS Word 2010, but 3 in Word 2013. + CPPUNIT_ASSERT_EQUAL_MESSAGE("too big for two pages", 3, getPages()); + // The tab goes over the paragraph margin + CPPUNIT_ASSERT_EQUAL(OUString("A left tab positioned at"), parseDump("//page[1]/body/txt[2]/Text[1]", "Portion")); + sal_Int32 nTextLen = parseDump("//page[1]/body/txt[2]/Text[1]", "nWidth").toInt32(); + CPPUNIT_ASSERT_EQUAL(OUString("*"), parseDump("//page[1]/body/txt[2]/Text[2]", "Portion")); + sal_Int32 nTabLen = parseDump("//page[1]/body/txt[2]/Text[2]", "nWidth").toInt32(); + CPPUNIT_ASSERT_MESSAGE("Large left tab", nTextLen < nTabLen); + // Not 1 line high (Word 2010 DOCX), or 3 lines high (LO DOCX) or 5 lines high (ODT), but 4 lines high + sal_Int32 nHeight = parseDump("//page[1]/body/txt[2]/infos/bounds", "height").toInt32(); + CPPUNIT_ASSERT_MESSAGE("4 lines high", 1100 < nHeight); + CPPUNIT_ASSERT_MESSAGE("4 lines high", nHeight < 1300); +} + DECLARE_OOXMLEXPORT_TEST(testTdf139580, "tdf139580.odt") { // Without the fix in place, this test would have crashed at export time diff --git a/sw/source/core/doc/DocumentSettingManager.cxx b/sw/source/core/doc/DocumentSettingManager.cxx index 6ea5ea058da7..8776d0a476e1 100644 --- a/sw/source/core/doc/DocumentSettingManager.cxx +++ b/sw/source/core/doc/DocumentSettingManager.cxx @@ -90,6 +90,7 @@ sw::DocumentSettingManager::DocumentSettingManager(SwDoc &rDoc) mbClippedPictures(false), mbBackgroundParaOverDrawings(false), mbTabOverMargin(false), + mbTabOverSpacing(false), mbTreatSingleColumnBreakAsPageBreak(false), mbSurroundTextWrapSmall(false), mbPropLineSpacingShrinksFirstLine(true), @@ -204,6 +205,7 @@ bool sw::DocumentSettingManager::get(/*[in]*/ DocumentSettingId id) const case DocumentSettingId::CLIPPED_PICTURES: return mbClippedPictures; case DocumentSettingId::BACKGROUND_PARA_OVER_DRAWINGS: return mbBackgroundParaOverDrawings; case DocumentSettingId::TAB_OVER_MARGIN: return mbTabOverMargin; + case DocumentSettingId::TAB_OVER_SPACING: return mbTabOverSpacing; case DocumentSettingId::TREAT_SINGLE_COLUMN_BREAK_AS_PAGE_BREAK: return mbTreatSingleColumnBreakAsPageBreak; case DocumentSettingId::SURROUND_TEXT_WRAP_SMALL: return mbSurroundTextWrapSmall; case DocumentSettingId::PROP_LINE_SPACING_SHRINKS_FIRST_LINE: return mbPropLineSpacingShrinksFirstLine; @@ -390,6 +392,10 @@ void sw::DocumentSettingManager::set(/*[in]*/ DocumentSettingId id, /*[in]*/ boo mbTabOverMargin = value; break; + case DocumentSettingId::TAB_OVER_SPACING: + mbTabOverSpacing = value; + break; + case DocumentSettingId::TREAT_SINGLE_COLUMN_BREAK_AS_PAGE_BREAK: mbTreatSingleColumnBreakAsPageBreak = value; break; @@ -659,6 +665,7 @@ void sw::DocumentSettingManager::ReplaceCompatibilityOptions(const DocumentSetti mbClippedPictures = rSource.mbClippedPictures; mbBackgroundParaOverDrawings = rSource.mbBackgroundParaOverDrawings; mbTabOverMargin = rSource.mbTabOverMargin; + mbTabOverSpacing = rSource.mbTabOverSpacing; mbTreatSingleColumnBreakAsPageBreak = rSource.mbTreatSingleColumnBreakAsPageBreak; mbSurroundTextWrapSmall = rSource.mbSurroundTextWrapSmall; mbPropLineSpacingShrinksFirstLine = rSource.mbPropLineSpacingShrinksFirstLine; @@ -928,6 +935,11 @@ void sw::DocumentSettingManager::dumpAsXml(xmlTextWriterPtr pWriter) const BAD_CAST(OString::boolean(mbTabOverMargin).getStr())); (void)xmlTextWriterEndElement(pWriter); + (void)xmlTextWriterStartElement(pWriter, BAD_CAST("mbTabOverSpacing")); + (void)xmlTextWriterWriteAttribute(pWriter, BAD_CAST("value"), + BAD_CAST(OString::boolean(mbTabOverSpacing).getStr())); + (void)xmlTextWriterEndElement(pWriter); + (void)xmlTextWriterStartElement(pWriter, BAD_CAST("mbTreatSingleColumnBreakAsPageBreak")); (void)xmlTextWriterWriteAttribute( pWriter, BAD_CAST("value"), diff --git a/sw/source/core/inc/DocumentSettingManager.hxx b/sw/source/core/inc/DocumentSettingManager.hxx index 387be04a4c15..19e55d5ede47 100644 --- a/sw/source/core/inc/DocumentSettingManager.hxx +++ b/sw/source/core/inc/DocumentSettingManager.hxx @@ -153,6 +153,7 @@ class DocumentSettingManager final : bool mbClippedPictures; bool mbBackgroundParaOverDrawings; bool mbTabOverMargin; + bool mbTabOverSpacing; bool mbTreatSingleColumnBreakAsPageBreak; // tdf#76349 bool mbSurroundTextWrapSmall; bool mbPropLineSpacingShrinksFirstLine; // fdo#79602 diff --git a/sw/source/core/text/inftxt.cxx b/sw/source/core/text/inftxt.cxx index 476c4dacb7f5..f43f811bd744 100644 --- a/sw/source/core/text/inftxt.cxx +++ b/sw/source/core/text/inftxt.cxx @@ -1761,7 +1761,9 @@ SwTwips SwTextFormatInfo::GetLineWidth() const bool bTabOverMargin = GetTextFrame()->GetDoc().getIDocumentSettingAccess().get( DocumentSettingId::TAB_OVER_MARGIN); - if (!bTabOverMargin) + const bool bTabOverSpacing = GetTextFrame()->GetDoc().getIDocumentSettingAccess().get( + DocumentSettingId::TAB_OVER_SPACING); + if (!bTabOverMargin && !bTabOverSpacing) return nLineWidth; SwTabPortion* pLastTab = GetLastTab(); @@ -1792,6 +1794,12 @@ SwTwips SwTextFormatInfo::GetLineWidth() // text frame area to the right (RR above, but not LL). nLineWidth = nTextFrameWidth - X(); + if (!bTabOverMargin) // thus bTabOverSpacing only + { + // right, center, decimal can back-fill all the available space - same as TabOverMargin + if (pLastTab->GetWhichPor() == PortionType::TabLeft) + nLineWidth = nTextFrameWidth - pLastTab->GetTabPos(); + } return nLineWidth; } diff --git a/sw/source/core/text/itrcrsr.cxx b/sw/source/core/text/itrcrsr.cxx index 933de96b9acd..138359e68c41 100644 --- a/sw/source/core/text/itrcrsr.cxx +++ b/sw/source/core/text/itrcrsr.cxx @@ -1223,7 +1223,9 @@ void SwTextCursor::GetCharRect( SwRect* pOrig, TextFrameIndex const nOfst, pCMS->m_x2Lines->aPortion.Pos().AdjustY(aCharPos.Y() ); } - const bool bTabOverMargin = GetTextFrame()->GetDoc().getIDocumentSettingAccess().get(DocumentSettingId::TAB_OVER_MARGIN); + const IDocumentSettingAccess& rIDSA = GetTextFrame()->GetDoc().getIDocumentSettingAccess(); + const bool bTabOverMargin = rIDSA.get(DocumentSettingId::TAB_OVER_MARGIN) + || rIDSA.get(DocumentSettingId::TAB_OVER_SPACING); // Make sure the cursor respects the right margin, unless in compat mode, where the tab size has priority over the margin size. if( pOrig->Left() > nTmpRight && !bTabOverMargin) pOrig->Pos().setX( nTmpRight ); diff --git a/sw/source/core/text/txttab.cxx b/sw/source/core/text/txttab.cxx index ae8b69ba3bf9..e12d31c64251 100644 --- a/sw/source/core/text/txttab.cxx +++ b/sw/source/core/text/txttab.cxx @@ -329,6 +329,7 @@ bool SwTabPortion::PreFormat( SwTextFormatInfo &rInf ) const bool bTabCompat = rIDSA.get(DocumentSettingId::TAB_COMPAT); const bool bTabOverflow = rIDSA.get(DocumentSettingId::TAB_OVERFLOW); const bool bTabOverMargin = rIDSA.get(DocumentSettingId::TAB_OVER_MARGIN); + const bool bTabOverSpacing = rIDSA.get(DocumentSettingId::TAB_OVER_SPACING); // The minimal width of a tab is one blank at least. // #i37686# In compatibility mode, the minimum width @@ -381,10 +382,13 @@ bool SwTabPortion::PreFormat( SwTextFormatInfo &rInf ) case PortionType::TabLeft: { // handle this case in PostFormat - if( bTabOverMargin && !m_bAutoTabStop && GetTabPos() > rInf.Width() ) + if ((bTabOverMargin || bTabOverSpacing) && !m_bAutoTabStop && GetTabPos() > rInf.Width()) { - rInf.SetLastTab( this ); - break; + if (bTabOverMargin || GetTabPos() < rInf.GetTextFrame()->getFrameArea().Width()) + { + rInf.SetLastTab(this); + break; + } } PrtWidth( o3tl::narrowing(GetTabPos() - rInf.X()) ); @@ -443,13 +447,19 @@ bool SwTabPortion::PostFormat( SwTextFormatInfo &rInf ) { bool bTabOverMargin = rInf.GetTextFrame()->GetDoc().getIDocumentSettingAccess().get( DocumentSettingId::TAB_OVER_MARGIN); - + bool bTabOverSpacing = rInf.GetTextFrame()->GetDoc().getIDocumentSettingAccess().get( + DocumentSettingId::TAB_OVER_SPACING); if (rInf.GetTextFrame()->IsInSct()) bTabOverMargin = false; // If the tab position is larger than the right margin, it gets scaled down by default. // However, if compat mode enabled, we allow tabs to go over the margin: the rest of the paragraph is not broken into lines. - const sal_uInt16 nRight = bTabOverMargin ? GetTabPos() : std::min(GetTabPos(), rInf.Width()); + const sal_uInt16 nRight + = bTabOverMargin + ? GetTabPos() + : bTabOverSpacing + ? std::min(GetTabPos(), rInf.GetTextFrame()->getFrameArea().Right()) + : std::min(GetTabPos(), rInf.Width()); const SwLinePortion *pPor = GetNextPortion(); sal_uInt16 nPorWidth = 0; @@ -462,7 +472,7 @@ bool SwTabPortion::PostFormat( SwTextFormatInfo &rInf ) const PortionType nWhich = GetWhichPor(); const bool bTabCompat = rInf.GetTextFrame()->GetDoc().getIDocumentSettingAccess().get(DocumentSettingId::TAB_COMPAT); - if ( bTabOverMargin && PortionType::TabLeft == nWhich ) + if ((bTabOverMargin || bTabOverSpacing) && PortionType::TabLeft == nWhich) { nPorWidth = 0; } diff --git a/sw/source/uibase/uno/SwXDocumentSettings.cxx b/sw/source/uibase/uno/SwXDocumentSettings.cxx index 26454819b9c1..26a2e8285300 100644 --- a/sw/source/uibase/uno/SwXDocumentSettings.cxx +++ b/sw/source/uibase/uno/SwXDocumentSettings.cxx @@ -134,6 +134,7 @@ enum SwDocumentSettingsPropertyHandles HANDLE_EMBED_COMPLEX_SCRIPT_FONTS, HANDLE_EMBED_SYSTEM_FONTS, HANDLE_TAB_OVER_MARGIN, + HANDLE_TAB_OVER_SPACING, HANDLE_TREAT_SINGLE_COLUMN_BREAK_AS_PAGE_BREAK, HANDLE_SURROUND_TEXT_WRAP_SMALL, HANDLE_APPLY_PARAGRAPH_MARK_FORMAT_TO_NUMBERING, @@ -228,6 +229,7 @@ static rtl::Reference lcl_createSettingsInfo() { OUString("EmbedComplexScriptFonts"), HANDLE_EMBED_COMPLEX_SCRIPT_FONTS, cppu::UnoType::get(), 0}, { OUString("EmbedSystemFonts"), HANDLE_EMBED_SYSTEM_FONTS, cppu::UnoType::get(), 0}, { OUString("TabOverMargin"), HANDLE_TAB_OVER_MARGIN, cppu::UnoType::get(), 0}, + { OUString("TabOverSpacing"), HANDLE_TAB_OVER_SPACING, cppu::UnoType::get(), 0}, { OUString("TreatSingleColumnBreakAsPageBreak"), HANDLE_TREAT_SINGLE_COLUMN_BREAK_AS_PAGE_BREAK, cppu::UnoType::get(), 0}, { OUString("SurroundTextWrapSmall"), HANDLE_SURROUND_TEXT_WRAP_SMALL, cppu::UnoType::get(), 0}, { OUString("ApplyParagraphMarkFormatToNumbering"), HANDLE_APPLY_PARAGRAPH_MARK_FORMAT_TO_NUMBERING, cppu::UnoType::get(), 0}, @@ -894,6 +896,12 @@ void SwXDocumentSettings::_setSingleValue( const comphelper::PropertyInfo & rInf mpDoc->getIDocumentSettingAccess().set(DocumentSettingId::TAB_OVER_MARGIN, bTmp); } break; + case HANDLE_TAB_OVER_SPACING: + { + bool bTmp = *o3tl::doAccess(rValue); + mpDoc->getIDocumentSettingAccess().set(DocumentSettingId::TAB_OVER_SPACING, bTmp); + } + break; case HANDLE_TREAT_SINGLE_COLUMN_BREAK_AS_PAGE_BREAK: { bool bTmp = *o3tl::doAccess(rValue); @@ -1441,6 +1449,11 @@ void SwXDocumentSettings::_getSingleValue( const comphelper::PropertyInfo & rInf rValue <<= mpDoc->getIDocumentSettingAccess().get( DocumentSettingId::TAB_OVER_MARGIN ); } break; + case HANDLE_TAB_OVER_SPACING: + { + rValue <<= mpDoc->getIDocumentSettingAccess().get(DocumentSettingId::TAB_OVER_SPACING); + } + break; case HANDLE_TREAT_SINGLE_COLUMN_BREAK_AS_PAGE_BREAK: { rValue <<= mpDoc->getIDocumentSettingAccess().get( DocumentSettingId::TREAT_SINGLE_COLUMN_BREAK_AS_PAGE_BREAK ); diff --git a/writerfilter/source/filter/WriterFilter.cxx b/writerfilter/source/filter/WriterFilter.cxx index 55bb89f1e21b..f665fbdc29a6 100644 --- a/writerfilter/source/filter/WriterFilter.cxx +++ b/writerfilter/source/filter/WriterFilter.cxx @@ -319,6 +319,11 @@ void WriterFilter::setTargetDocument(const uno::Reference& xDo xSettings->setPropertyValue("InvertBorderSpacing", uno::makeAny(true)); xSettings->setPropertyValue("CollapseEmptyCellPara", uno::makeAny(true)); xSettings->setPropertyValue("TabOverflow", uno::makeAny(true)); + // tdf#142404 TabOverSpacing (new for compatiblityMode15/Word2013+) is a subset of TabOverMargin + // (which applied to DOCX <= compatibilityMode14). + // TabOverMargin looks at tabs beyond the normal text area, + // while TabOverSpacing only refers to a tab beyond the paragraph margin. + xSettings->setPropertyValue("TabOverSpacing", uno::makeAny(true)); xSettings->setPropertyValue("UnbreakableNumberings", uno::makeAny(true)); xSettings->setPropertyValue("FloattableNomargins", uno::makeAny(true));