diff options
Diffstat (limited to 'sw')
-rw-r--r-- | sw/inc/IDocumentSettingAccess.hxx | 3 | ||||
-rw-r--r-- | sw/inc/docsh.hxx | 1 | ||||
-rw-r--r-- | sw/inc/viewsh.hxx | 2 | ||||
-rw-r--r-- | sw/source/core/doc/DocumentSettingManager.cxx | 9 | ||||
-rw-r--r-- | sw/source/core/inc/DocumentSettingManager.hxx | 1 | ||||
-rw-r--r-- | sw/source/core/text/guess.cxx | 37 | ||||
-rw-r--r-- | sw/source/core/text/inftxt.cxx | 113 | ||||
-rw-r--r-- | sw/source/core/view/viewsh.cxx | 11 | ||||
-rw-r--r-- | sw/source/uibase/app/docsh.cxx | 14 | ||||
-rw-r--r-- | sw/source/uibase/uiview/view.cxx | 15 |
10 files changed, 137 insertions, 69 deletions
diff --git a/sw/inc/IDocumentSettingAccess.hxx b/sw/inc/IDocumentSettingAccess.hxx index f16ae42f30dc..e85e7d796f48 100644 --- a/sw/inc/IDocumentSettingAccess.hxx +++ b/sw/inc/IDocumentSettingAccess.hxx @@ -61,6 +61,9 @@ enum class DocumentSettingId IGNORE_TABS_AND_BLANKS_FOR_LINE_CALCULATION, CLIP_AS_CHARACTER_ANCHORED_WRITER_FLY_FRAME, + // tdf#104349 tdf#104668 + MS_WORD_COMP_TRAILING_BLANKS, + UNIX_FORCE_ZERO_EXT_LEADING, TABS_RELATIVE_TO_INDENT, PROTECT_FORM, diff --git a/sw/inc/docsh.hxx b/sw/inc/docsh.hxx index 879c367631b5..afc451f9eb95 100644 --- a/sw/inc/docsh.hxx +++ b/sw/inc/docsh.hxx @@ -265,6 +265,7 @@ public: the load of document being finished. */ void LoadingFinished(); + virtual void SetFormatSpecificCompatibilityOptions( const OUString& rFilterTypeName ) override; /// Cancel transfer (called from SFX). virtual void CancelTransfers() override; diff --git a/sw/inc/viewsh.hxx b/sw/inc/viewsh.hxx index 1d5a34b6c343..96ddd10c6d3b 100644 --- a/sw/inc/viewsh.hxx +++ b/sw/inc/viewsh.hxx @@ -416,6 +416,8 @@ public: void SetProtectForm( bool _bProtectForm ); + void SetMsWordCompTrailingBlanks( bool _bMsWordCompTrailingBlanks ); + // DOCUMENT COMPATIBILITY FLAGS END // Calls Idle-formatter of Layout. diff --git a/sw/source/core/doc/DocumentSettingManager.cxx b/sw/source/core/doc/DocumentSettingManager.cxx index 5cf29c0a4e8a..f0066826b810 100644 --- a/sw/source/core/doc/DocumentSettingManager.cxx +++ b/sw/source/core/doc/DocumentSettingManager.cxx @@ -72,6 +72,7 @@ sw::DocumentSettingManager::DocumentSettingManager(SwDoc &rDoc) mbUnixForceZeroExtLeading(false), mbTabRelativeToIndent(true), mbProtectForm(false), // i#78591# + mbMsWordCompTrailingBlanks(false), // tdf#104349 tdf#104668 mbInvertBorderSpacing (false), mbCollapseEmptyCellPara(true), mbTabAtLeftIndentForParagraphsInList(false), //#i89181# @@ -166,6 +167,8 @@ bool sw::DocumentSettingManager::get(/*[in]*/ DocumentSettingId id) const case DocumentSettingId::UNIX_FORCE_ZERO_EXT_LEADING: return mbUnixForceZeroExtLeading; case DocumentSettingId::TABS_RELATIVE_TO_INDENT : return mbTabRelativeToIndent; case DocumentSettingId::PROTECT_FORM: return mbProtectForm; + // tdf#104349 tdf#104668 + case DocumentSettingId::MS_WORD_COMP_TRAILING_BLANKS: return mbMsWordCompTrailingBlanks; // #i89181# case DocumentSettingId::TAB_AT_LEFT_INDENT_FOR_PARA_IN_LIST: return mbTabAtLeftIndentForParagraphsInList; case DocumentSettingId::INVERT_BORDER_SPACING: return mbInvertBorderSpacing; @@ -301,6 +304,11 @@ void sw::DocumentSettingManager::set(/*[in]*/ DocumentSettingId id, /*[in]*/ boo mbProtectForm = value; break; + // tdf#140349 + case DocumentSettingId::MS_WORD_COMP_TRAILING_BLANKS: + mbMsWordCompTrailingBlanks = value; + break; + case DocumentSettingId::TABS_RELATIVE_TO_INDENT: mbTabRelativeToIndent = value; break; @@ -553,6 +561,7 @@ void sw::DocumentSettingManager::ReplaceCompatibilityOptions(const DocumentSetti mbUnixForceZeroExtLeading = rSource.mbUnixForceZeroExtLeading; mbTabRelativeToIndent = rSource.mbTabRelativeToIndent; mbTabAtLeftIndentForParagraphsInList = rSource.mbTabAtLeftIndentForParagraphsInList; + mbMsWordCompTrailingBlanks = rSource.mbMsWordCompTrailingBlanks; } sal_uInt32 sw::DocumentSettingManager::Getn32DummyCompatibilityOptions1() const diff --git a/sw/source/core/inc/DocumentSettingManager.hxx b/sw/source/core/inc/DocumentSettingManager.hxx index ba52cbfacd83..c4dcd473e274 100644 --- a/sw/source/core/inc/DocumentSettingManager.hxx +++ b/sw/source/core/inc/DocumentSettingManager.hxx @@ -138,6 +138,7 @@ class DocumentSettingManager : bool mbUnixForceZeroExtLeading : 1; // #i60945# bool mbTabRelativeToIndent : 1; // #i24363# tab stops relative to indent bool mbProtectForm : 1; + bool mbMsWordCompTrailingBlanks : 1; // tdf#104349 tdf#104668 bool mbInvertBorderSpacing : 1; bool mbCollapseEmptyCellPara : 1; bool mbTabAtLeftIndentForParagraphsInList; // #i89181# - see above diff --git a/sw/source/core/text/guess.cxx b/sw/source/core/text/guess.cxx index a13ed2466d08..b3dfd58a253f 100644 --- a/sw/source/core/text/guess.cxx +++ b/sw/source/core/text/guess.cxx @@ -75,23 +75,30 @@ bool SwTextGuess::Guess( const SwTextPortion& rPor, SwTextFormatInfo &rInf, const SvxAdjust& rAdjust = rInf.GetTextFrame()->GetTextNode()->GetSwAttrSet().GetAdjust().GetAdjust(); - // tdf#104668 space chars at the end should be cut - if ( rAdjust == SVX_ADJUST_RIGHT || rAdjust == SVX_ADJUST_CENTER ) + // tdf#104668 space chars at the end should be cut if the compatibility option is enabled + // for LTR mode only + if ( !rInf.GetTextFrame()->IsRightToLeft() ) { - sal_Int32 nSpaceCnt = 0; - for ( int i = (rInf.GetText().getLength() - 1); i >= rInf.GetIdx(); --i ) + if ( rInf.GetTextFrame()->GetNode()->getIDocumentSettingAccess()->get( DocumentSettingId::MS_WORD_COMP_TRAILING_BLANKS ) ) { - sal_Unicode cChar = rInf.GetText()[i]; - if ( cChar != CH_BLANK && cChar != CH_FULL_BLANK ) - break; - ++nSpaceCnt; - } - sal_Int32 nCharsCnt = nMaxLen - nSpaceCnt; - if ( nSpaceCnt && nCharsCnt < rPor.GetLen() ) - { - nMaxLen = nCharsCnt; - if ( !nMaxLen ) - return true; + if ( rAdjust == SVX_ADJUST_RIGHT || rAdjust == SVX_ADJUST_CENTER ) + { + sal_Int32 nSpaceCnt = 0; + for ( int i = (rInf.GetText().getLength() - 1); i >= rInf.GetIdx(); --i ) + { + sal_Unicode cChar = rInf.GetText()[i]; + if ( cChar != CH_BLANK && cChar != CH_FULL_BLANK ) + break; + ++nSpaceCnt; + } + sal_Int32 nCharsCnt = nMaxLen - nSpaceCnt; + if ( nSpaceCnt && nCharsCnt < rPor.GetLen() ) + { + nMaxLen = nCharsCnt; + if ( !nMaxLen ) + return true; + } + } } } diff --git a/sw/source/core/text/inftxt.cxx b/sw/source/core/text/inftxt.cxx index b4709f2461d3..58ee0c40904a 100644 --- a/sw/source/core/text/inftxt.cxx +++ b/sw/source/core/text/inftxt.cxx @@ -1182,71 +1182,78 @@ void SwTextPaintInfo::DrawBackBrush( const SwLinePortion &rPor ) const aFillColor = *m_pFnt->GetBackColor(); } - // tdf#104349 do not hightlight portions of space chars before end of line - bool draw = false; - bool full = false; - SwLinePortion *pPos = const_cast<SwLinePortion *>(&rPor); - sal_Int32 nIdx = GetIdx(); - sal_Int32 nLen; - - do + // tdf#104349 do not hightlight portions of space chars before end of line if the compatibility option is enabled + // for LTR mode only + if ( !GetTextFrame()->IsRightToLeft() ) { - nLen = pPos->GetLen(); - for ( int i = nIdx; i < (nIdx + nLen); ++i ) + if ( GetTextFrame()->GetNode()->getIDocumentSettingAccess()->get( DocumentSettingId::MS_WORD_COMP_TRAILING_BLANKS ) ) { - if (i < GetText().getLength() && GetText()[i] == CH_TXTATR_NEWLINE) - { - if ( i >= (GetIdx() + rPor.GetLen()) ) - { - goto drawcontinue; - } - } - if (i >= GetText().getLength() || GetText()[i] != CH_BLANK) + bool draw = false; + bool full = false; + SwLinePortion *pPos = const_cast<SwLinePortion *>(&rPor); + sal_Int32 nIdx = GetIdx(); + sal_Int32 nLen; + + do { - draw = true; - if ( i >= (GetIdx() + rPor.GetLen()) ) + nLen = pPos->GetLen(); + for ( int i = nIdx; i < (nIdx + nLen); ++i ) { - full = true; - goto drawcontinue; + if ( i < GetText().getLength() && GetText()[i] == CH_TXTATR_NEWLINE ) + { + if ( i >= (GetIdx() + rPor.GetLen()) ) + { + goto drawcontinue; + } + } + if ( i >= GetText().getLength() || GetText()[i] != CH_BLANK ) + { + draw = true; + if ( i >= (GetIdx() + rPor.GetLen()) ) + { + full = true; + goto drawcontinue; + } + } } - } - } - nIdx += nLen; - pPos = pPos->GetPortion(); - } while ( pPos ); + nIdx += nLen; + pPos = pPos->GetPortion(); + } while ( pPos ); - drawcontinue: + drawcontinue: - if ( !draw ) - return; - - if ( !full ) - { - pPos = const_cast<SwLinePortion *>(&rPor); - nIdx = GetIdx(); + if ( !draw ) + return; - nLen = pPos->GetLen(); - for ( int i = (nIdx + nLen - 1); i >= nIdx; --i ) - { - if (i < GetText().getLength() && GetText()[i] == CH_TXTATR_NEWLINE) - { - continue; - } - if (i >= GetText().getLength() || GetText()[i] != CH_BLANK) + if ( !full ) { - sal_uInt16 nOldWidth = rPor.Width(); - sal_uInt16 nNewWidth = GetTextSize( m_pOut, nullptr, GetText(), nIdx, (i + 1 - nIdx) ).Width(); - - const_cast<SwLinePortion&>(rPor).Width( nNewWidth ); - CalcRect( rPor, nullptr, &aIntersect, true ); - const_cast<SwLinePortion&>(rPor).Width( nOldWidth ); + pPos = const_cast<SwLinePortion *>(&rPor); + nIdx = GetIdx(); - if ( ! aIntersect.HasArea() ) + nLen = pPos->GetLen(); + for ( int i = (nIdx + nLen - 1); i >= nIdx; --i ) { - return; - } + if ( i < GetText().getLength() && GetText()[i] == CH_TXTATR_NEWLINE ) + { + continue; + } + if ( i >= GetText().getLength() || GetText()[i] != CH_BLANK ) + { + sal_uInt16 nOldWidth = rPor.Width(); + sal_uInt16 nNewWidth = GetTextSize( m_pOut, nullptr, GetText(), nIdx, (i + 1 - nIdx) ).Width(); - break; + const_cast<SwLinePortion&>(rPor).Width( nNewWidth ); + CalcRect( rPor, nullptr, &aIntersect, true ); + const_cast<SwLinePortion&>(rPor).Width( nOldWidth ); + + if ( !aIntersect.HasArea() ) + { + return; + } + + break; + } + } } } } diff --git a/sw/source/core/view/viewsh.cxx b/sw/source/core/view/viewsh.cxx index 5a5b1adef23b..e0ef02b2c4b6 100644 --- a/sw/source/core/view/viewsh.cxx +++ b/sw/source/core/view/viewsh.cxx @@ -904,6 +904,17 @@ void SwViewShell::SetProtectForm( bool _bProtectForm ) rIDSA.set(DocumentSettingId::PROTECT_FORM, _bProtectForm ); } +void SwViewShell::SetMsWordCompTrailingBlanks( bool _bMsWordCompTrailingBlanks ) +{ + IDocumentSettingAccess& rIDSA = getIDocumentSettingAccess(); + if (rIDSA.get(DocumentSettingId::MS_WORD_COMP_TRAILING_BLANKS) != _bMsWordCompTrailingBlanks) + { + SwWait aWait(*GetDoc()->GetDocShell(), true); + rIDSA.set(DocumentSettingId::MS_WORD_COMP_TRAILING_BLANKS, _bMsWordCompTrailingBlanks); + const SwInvalidateFlags nInv = SwInvalidateFlags::PrtArea | SwInvalidateFlags::Size | SwInvalidateFlags::Table | SwInvalidateFlags::Section; + lcl_InvalidateAllContent(*this, nInv); + } +} void SwViewShell::Reformat() { diff --git a/sw/source/uibase/app/docsh.cxx b/sw/source/uibase/app/docsh.cxx index 8ebdc5483630..3077decb1f3d 100644 --- a/sw/source/uibase/app/docsh.cxx +++ b/sw/source/uibase/app/docsh.cxx @@ -1156,6 +1156,20 @@ void SwDocShell::LoadingFinished() } } +void SwDocShell::SetFormatSpecificCompatibilityOptions( const OUString& rFilterTypeName ) +{ + //Enable MS Word-compatibility trailing blanks option for MS Word files + if ( rFilterTypeName == "writer_MS_Word_95" || + rFilterTypeName == "writer_MS_Word_97" || + rFilterTypeName == "writer_MS_Word_2003_XML" || + rFilterTypeName == "writer_MS_Word_2007" || + rFilterTypeName == "writer_MS_Word_2007_Template" || + rFilterTypeName == "writer_Rich_Text_Format" ) + { + GetDoc()->getIDocumentSettingAccess().set( DocumentSettingId::MS_WORD_COMP_TRAILING_BLANKS, true ); + } +} + // a Transfer is cancelled (is called from SFX) void SwDocShell::CancelTransfers() { diff --git a/sw/source/uibase/uiview/view.cxx b/sw/source/uibase/uiview/view.cxx index 305c4f400f53..6de7d5b5995f 100644 --- a/sw/source/uibase/uiview/view.cxx +++ b/sw/source/uibase/uiview/view.cxx @@ -1259,11 +1259,13 @@ void SwView::ReadUserDataSequence ( const uno::Sequence < beans::PropertyValue > sal_Int16 nViewLayoutColumns = pVOpt->GetViewLayoutColumns(); bool bSelectedFrame = ( m_pWrtShell->GetSelFrameType() != FrameTypeFlags::NONE ), + bMsWordCompTrailingBlanks = false, bGotVisibleLeft = false, bGotVisibleTop = false, bGotVisibleRight = false, bGotVisibleBottom = false, bGotZoomType = false, bGotZoomFactor = false, bGotIsSelectedFrame = false, - bGotViewLayoutColumns = false, bGotViewLayoutBookMode = false; + bGotViewLayoutColumns = false, bGotViewLayoutBookMode = false, + bGotMsWordCompTrailingBlanks = false; for (sal_Int32 i = 0 ; i < nLength; i++) { @@ -1326,6 +1328,11 @@ void SwView::ReadUserDataSequence ( const uno::Sequence < beans::PropertyValue > pValue->Value >>= bSelectedFrame; bGotIsSelectedFrame = true; } + else if ( pValue->Name == "MsWordCompTrailingBlanks" ) + { + pValue->Value >>= bMsWordCompTrailingBlanks; + bGotMsWordCompTrailingBlanks = true; + } // Fallback to common SdrModel processing else GetDocShell()->GetDoc()->getIDocumentDrawModelAccess().GetDrawModel()->ReadUserDataSequenceValue(pValue); pValue++; @@ -1452,6 +1459,10 @@ void SwView::ReadUserDataSequence ( const uno::Sequence < beans::PropertyValue > m_pWrtShell->EnableSmooth( true ); } } + if ( bGotMsWordCompTrailingBlanks ) + { + GetDocShell()->GetDoc()->getIDocumentSettingAccess().set( DocumentSettingId::MS_WORD_COMP_TRAILING_BLANKS, bMsWordCompTrailingBlanks ); + } } } @@ -1491,6 +1502,8 @@ void SwView::WriteUserDataSequence ( uno::Sequence < beans::PropertyValue >& rSe aVector.push_back(comphelper::makePropertyValue("IsSelectedFrame", FrameTypeFlags::NONE != m_pWrtShell->GetSelFrameType())); + aVector.push_back(comphelper::makePropertyValue("MsWordCompTrailingBlanks", GetDocShell()->GetDoc()->getIDocumentSettingAccess().get( DocumentSettingId::MS_WORD_COMP_TRAILING_BLANKS ))); + rSequence = comphelper::containerToSequence(aVector); // Common SdrModel processing |