summaryrefslogtreecommitdiff
path: root/sw
diff options
context:
space:
mode:
authorVitaliy Anderson <vanderson@smartru.com>2017-01-13 05:26:07 -0800
committerAron Budea <aron.budea@collabora.com>2018-03-14 21:24:26 +0100
commit2c736afc7fb3fa745511e6e7232f6d86b553ce77 (patch)
tree75f7ffcc7c6e42e3bc2cd1168438047bdf34dd19 /sw
parent69ee2b1cc6969f8850f88c5257df289ccfd88c5d (diff)
tdf#104349, tdf#104668 MS Word compatibility trailing blanks option
The commits: 1c1747ac13a9d895df0fcba2fbb1bd266dccd74b and 4a410dd147f7160c1d62e3e0b67388a178d5136c make trailing spaces and their highlighting compatible with the Ms Word. The option is enabled by default for imported MS Word formats: .doc, .docx, .rtf For the ODF files the option is disabled by default Also it allows saving and loading the option state to the ODF UserData. It may be manually set in Tools->Options->LibreOffice Writer->Compatibility Reviewed-on: https://gerrit.libreoffice.org/33046 Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com> Tested-by: Mike Kaganski <mike.kaganski@collabora.com> (cherry picked from commit 7fa20da88a4778bdf20d6ca0491fe97ae03ab554) Change-Id: I5a86359c52d18e50bbb54b9f37c79b672591c369 (cherry picked from commit 6c86ae2fec7d2a1375a3e9683ea2155448990ce7)
Diffstat (limited to 'sw')
-rw-r--r--sw/inc/IDocumentSettingAccess.hxx3
-rw-r--r--sw/inc/docsh.hxx1
-rw-r--r--sw/inc/viewsh.hxx2
-rw-r--r--sw/source/core/doc/DocumentSettingManager.cxx9
-rw-r--r--sw/source/core/inc/DocumentSettingManager.hxx1
-rw-r--r--sw/source/core/text/guess.cxx37
-rw-r--r--sw/source/core/text/inftxt.cxx113
-rw-r--r--sw/source/core/view/viewsh.cxx11
-rw-r--r--sw/source/uibase/app/docsh.cxx14
-rw-r--r--sw/source/uibase/uiview/view.cxx15
10 files changed, 137 insertions, 69 deletions
diff --git a/sw/inc/IDocumentSettingAccess.hxx b/sw/inc/IDocumentSettingAccess.hxx
index 2827567d89f1..f152fef3ff26 100644
--- a/sw/inc/IDocumentSettingAccess.hxx
+++ b/sw/inc/IDocumentSettingAccess.hxx
@@ -62,6 +62,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 7dc28460c20a..94d458753d7b 100644
--- a/sw/inc/viewsh.hxx
+++ b/sw/inc/viewsh.hxx
@@ -416,6 +416,8 @@ public:
void SetProtectForm( bool _bProtectForm );
+ void SetMsWordCompTrailingBlanks( bool _bMsWordCompTrailingBlanks );
+
void SetSubtractFlysAnchoredAtFlys(bool bSubtractFlysAnchoredAtFlys);
// DOCUMENT COMPATIBILITY FLAGS END
diff --git a/sw/source/core/doc/DocumentSettingManager.cxx b/sw/source/core/doc/DocumentSettingManager.cxx
index 78201b61016a..69361f0add48 100644
--- a/sw/source/core/doc/DocumentSettingManager.cxx
+++ b/sw/source/core/doc/DocumentSettingManager.cxx
@@ -73,6 +73,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#
@@ -168,6 +169,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;
@@ -306,6 +309,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;
@@ -558,6 +566,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 6927f83db287..6efbb35ee59d 100644
--- a/sw/source/core/inc/DocumentSettingManager.hxx
+++ b/sw/source/core/inc/DocumentSettingManager.hxx
@@ -139,6 +139,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 e347013a4c9b..a405c87d3f9c 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 a6dca7caae37..0bb5737070db 100644
--- a/sw/source/core/text/inftxt.cxx
+++ b/sw/source/core/text/inftxt.cxx
@@ -1184,71 +1184,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 ca5768373ad1..2e5ba8c3e656 100644
--- a/sw/source/core/view/viewsh.cxx
+++ b/sw/source/core/view/viewsh.cxx
@@ -899,6 +899,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::SetSubtractFlysAnchoredAtFlys(bool bSubtractFlysAnchoredAtFlys)
{
diff --git a/sw/source/uibase/app/docsh.cxx b/sw/source/uibase/app/docsh.cxx
index ce71a05d9887..1573e9e850ec 100644
--- a/sw/source/uibase/app/docsh.cxx
+++ b/sw/source/uibase/app/docsh.cxx
@@ -1163,6 +1163,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 ea211cf616f5..c65c2c1190d8 100644
--- a/sw/source/uibase/uiview/view.cxx
+++ b/sw/source/uibase/uiview/view.cxx
@@ -1261,12 +1261,14 @@ 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,
- bBrowseMode = false, bGotBrowseMode = false;
+ bBrowseMode = false, bGotBrowseMode = false,
+ bGotMsWordCompTrailingBlanks = false;
for (sal_Int32 i = 0 ; i < nLength; i++)
{
@@ -1334,6 +1336,11 @@ void SwView::ReadUserDataSequence ( const uno::Sequence < beans::PropertyValue >
pValue->Value >>= bBrowseMode;
bGotBrowseMode = true;
}
+ else if ( pValue->Name == "MsWordCompTrailingBlanks" )
+ {
+ pValue->Value >>= bMsWordCompTrailingBlanks;
+ bGotMsWordCompTrailingBlanks = true;
+ }
// Fallback to common SdrModel processing
else GetDocShell()->GetDoc()->getIDocumentDrawModelAccess().GetDrawModel()->ReadUserDataSequenceValue(pValue);
pValue++;
@@ -1465,6 +1472,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 );
+ }
}
}
@@ -1504,6 +1515,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