[Libreoffice-commits] core.git: Branch 'libreoffice-4-0' - editeng/source sw/inc sw/source
Michael Stahl
mstahl at redhat.com
Thu Jun 20 07:12:03 PDT 2013
editeng/source/misc/svxacorr.cxx | 13 ++++++++-----
sw/inc/swtypes.hxx | 2 ++
sw/source/core/doc/docfmt.cxx | 24 ++++++++++++++++++++++++
3 files changed, 34 insertions(+), 5 deletions(-)
New commits:
commit 5b3867f801dadc5c2c6346561e7d71990cd7eb33
Author: Michael Stahl <mstahl at redhat.com>
Date: Thu Jun 20 00:20:52 2013 +0200
fdo#62536: sw: fix AutoCorrect bold/underline on existing AUTOFMT
With the native AUTOFMT in Writer the SETATTR_DONTEXPAND does no longer
work reliably: if there is an existing AUTOFMT at the position then it
will be modified and no new hint with DontExpand will be inserted.
Work around this deficiency by inserting a no-length hint with the
preivous formatting at the end of the range.
(similar fix to the i#75891 problem in SwTextShell::InsertSymbol)
(commit 062eaeffe7cb986255063bb9b0a5f3fb3fc8e34c did not
introduce the problem but made it far more annoying)
Change-Id: I58ece7f5bd5a786b22a066e5902f1784dafa5dce
(cherry picked from commit fe444d1f74abe417962be0bcd3340f40f2446b58)
Reviewed-on: https://gerrit.libreoffice.org/4393
Reviewed-by: Noel Power <noel.power at suse.com>
Tested-by: Noel Power <noel.power at suse.com>
diff --git a/editeng/source/misc/svxacorr.cxx b/editeng/source/misc/svxacorr.cxx
index cf486af..046c4b3 100644
--- a/editeng/source/misc/svxacorr.cxx
+++ b/editeng/source/misc/svxacorr.cxx
@@ -732,24 +732,27 @@ sal_Bool SvxAutoCorrect::FnChgWeightUnderl( SvxAutoCorrDoc& rDoc, const String&
if( STRING_NOTFOUND != nFndPos )
{
- // Span the Attribute over the area and delete the Character found at
+ // first delete the Character at the end - this allows insertion
+ // of an empty hint in SetAttr which would be removed by Delete
+ // (fdo#62536, AUTOFMT in Writer)
+ rDoc.Delete( nEndPos, nEndPos + 1 );
+ rDoc.Delete( nFndPos, nFndPos + 1 );
+ // Span the Attribute over the area
// the end.
if( '*' == cInsChar ) // Bold
{
SvxWeightItem aSvxWeightItem( WEIGHT_BOLD, SID_ATTR_CHAR_WEIGHT );
- rDoc.SetAttr( nFndPos + 1, nEndPos,
+ rDoc.SetAttr( nFndPos, nEndPos - 1,
SID_ATTR_CHAR_WEIGHT,
aSvxWeightItem);
}
else // underline
{
SvxUnderlineItem aSvxUnderlineItem( UNDERLINE_SINGLE, SID_ATTR_CHAR_UNDERLINE );
- rDoc.SetAttr( nFndPos + 1, nEndPos,
+ rDoc.SetAttr( nFndPos, nEndPos - 1,
SID_ATTR_CHAR_UNDERLINE,
aSvxUnderlineItem);
}
- rDoc.Delete( nEndPos, nEndPos + 1 );
- rDoc.Delete( nFndPos, nFndPos + 1 );
}
return STRING_NOTFOUND != nFndPos;
diff --git a/sw/inc/swtypes.hxx b/sw/inc/swtypes.hxx
index fe1c414..214ba5a 100644
--- a/sw/inc/swtypes.hxx
+++ b/sw/inc/swtypes.hxx
@@ -192,6 +192,8 @@ typedef sal_uInt16 SetAttrMode;
namespace nsSetAttrMode
{
const SetAttrMode SETATTR_DEFAULT = 0x0000; // Default.
+ /// @attention: DONTEXPAND does not work very well for CHARATR
+ /// because it can expand only the whole AUTOFMT or nothing
const SetAttrMode SETATTR_DONTEXPAND = 0x0001; // Don't expand text attribute any further.
const SetAttrMode SETATTR_DONTREPLACE = 0x0002; // Don't replace another text attribute.
diff --git a/sw/source/core/doc/docfmt.cxx b/sw/source/core/doc/docfmt.cxx
index 4341aa9..c3171cd 100644
--- a/sw/source/core/doc/docfmt.cxx
+++ b/sw/source/core/doc/docfmt.cxx
@@ -2453,7 +2453,31 @@ void SwDoc::SetFmtItemByAutoFmt( const SwPaM& rPam, const SfxItemSet& rSet )
SetRedlineMode_intern( (RedlineMode_t)(eOld | nsRedlineMode_t::REDLINE_IGNORE));
}
+ xub_StrLen const nEnd(rPam.End()->nContent.GetIndex());
+ std::vector<sal_uInt16> whichIds;
+ SfxItemIter iter(rSet);
+ for (SfxPoolItem const* pItem = iter.FirstItem();
+ pItem; pItem = iter.NextItem())
+ {
+ whichIds.push_back(pItem->Which());
+ whichIds.push_back(pItem->Which());
+ }
+ whichIds.push_back(0);
+ SfxItemSet currentSet(GetAttrPool(), &whichIds[0]);
+ pTNd->GetAttr(currentSet, nEnd, nEnd, false, true, false);
+ for (size_t i = 0; whichIds[i]; i += 2)
+ { // yuk - want to explicitly set the pool defaults too :-/
+ currentSet.Put(currentSet.Get(whichIds[i], true));
+ }
+
InsertItemSet( rPam, rSet, nsSetAttrMode::SETATTR_DONTEXPAND );
+
+ // fdo#62536: DONTEXPAND does not work when there is already an AUTOFMT
+ // here, so insert the old attributes as an empty hint to stop expand
+ SwPaM endPam(*pTNd, nEnd);
+ endPam.SetMark();
+ InsertItemSet(endPam, currentSet, nsSetAttrMode::SETATTR_DEFAULT);
+
SetRedlineMode_intern( eOld );
}
More information about the Libreoffice-commits
mailing list