summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sw/inc/hints.hxx2
-rw-r--r--sw/source/core/attr/hints.cxx7
-rw-r--r--sw/source/core/text/txtfrm.cxx22
-rw-r--r--sw/source/core/txtnode/thints.cxx20
4 files changed, 43 insertions, 8 deletions
diff --git a/sw/inc/hints.hxx b/sw/inc/hints.hxx
index 82eb27c8a22e..be1f1ac2fad7 100644
--- a/sw/inc/hints.hxx
+++ b/sw/inc/hints.hxx
@@ -99,7 +99,9 @@ public:
sal_Int32 nStart;
sal_Int32 nEnd;
sal_uInt16 nWhichAttr;
+ std::vector<sal_uInt16> aWhichFmtAttr; // attributes changed inside RES_TXTATR_AUTOFMT
SwUpdateAttr( sal_Int32 nS, sal_Int32 nE, sal_uInt16 nW );
+ SwUpdateAttr( sal_Int32 nS, sal_Int32 nE, sal_uInt16 nW, std::vector<sal_uInt16> aW );
};
/** SwRefMarkFldUpdate is sent when the referencemarks should be updated.
diff --git a/sw/source/core/attr/hints.cxx b/sw/source/core/attr/hints.cxx
index 44614b8e61b5..9b0f6a60866c 100644
--- a/sw/source/core/attr/hints.cxx
+++ b/sw/source/core/attr/hints.cxx
@@ -45,7 +45,12 @@ SwDelTxt::SwDelTxt( sal_Int32 nS, sal_Int32 nL )
}
SwUpdateAttr::SwUpdateAttr( sal_Int32 nS, sal_Int32 nE, sal_uInt16 nW )
- : SwMsgPoolItem( RES_UPDATE_ATTR ), nStart( nS ), nEnd( nE ), nWhichAttr( nW )
+ : SwMsgPoolItem( RES_UPDATE_ATTR ), nStart( nS ), nEnd( nE ), nWhichAttr( nW ), aWhichFmtAttr()
+{
+}
+
+SwUpdateAttr::SwUpdateAttr( sal_Int32 nS, sal_Int32 nE, sal_uInt16 nW, std::vector<sal_uInt16> aW )
+ : SwMsgPoolItem( RES_UPDATE_ATTR ), nStart( nS ), nEnd( nE ), nWhichAttr( nW ), aWhichFmtAttr( aW )
{
}
diff --git a/sw/source/core/text/txtfrm.cxx b/sw/source/core/text/txtfrm.cxx
index 0139fd7df136..1da7fa4e3b2e 100644
--- a/sw/source/core/text/txtfrm.cxx
+++ b/sw/source/core/text/txtfrm.cxx
@@ -845,6 +845,16 @@ static bool isA11yRelevantAttribute(MSHORT nWhich)
return nWhich != RES_CHRATR_RSID;
}
+static bool hasA11yRelevantAttribute( const std::vector<MSHORT>& nWhich )
+{
+ for( std::vector<MSHORT>::const_iterator nItr = nWhich.begin();
+ nItr < nWhich.end(); ++nItr )
+ if ( isA11yRelevantAttribute( *nItr ) )
+ return true;
+
+ return false;
+}
+
void SwTxtFrm::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew )
{
const MSHORT nWhich = pOld ? pOld->Which() : pNew ? pNew->Which() : 0;
@@ -967,11 +977,15 @@ void SwTxtFrm::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew )
}
}
- // #i104008#
- SwViewShell* pViewSh = getRootFrm() ? getRootFrm()->GetCurrShell() : 0;
- if ( pViewSh )
+ if( isA11yRelevantAttribute( ((SwUpdateAttr*)pNew)->nWhichAttr ) &&
+ hasA11yRelevantAttribute( ((SwUpdateAttr*)pNew)->aWhichFmtAttr ) )
{
- pViewSh->InvalidateAccessibleParaAttrs( *this );
+ // #i104008#
+ SwViewShell* pViewSh = getRootFrm() ? getRootFrm()->GetCurrShell() : 0;
+ if ( pViewSh )
+ {
+ pViewSh->InvalidateAccessibleParaAttrs( *this );
+ }
}
}
break;
diff --git a/sw/source/core/txtnode/thints.cxx b/sw/source/core/txtnode/thints.cxx
index 60336fb18174..cae6296bf64e 100644
--- a/sw/source/core/txtnode/thints.cxx
+++ b/sw/source/core/txtnode/thints.cxx
@@ -2955,6 +2955,7 @@ bool SwpHints::TryInsertHint(
sal_Int32 *pHtEnd = pHint->GetEnd();
sal_uInt16 nWhich = pHint->Which();
+ std::vector<sal_uInt16> aWhichSublist;
switch( nWhich )
{
@@ -2972,10 +2973,9 @@ bool SwpHints::TryInsertHint(
// #i75430# Recalc hidden flags if necessary
case RES_TXTATR_AUTOFMT:
{
+ boost::shared_ptr<SfxItemSet> const pSet( pHint->GetAutoFmt().GetStyleHandle() );
if (*pHint->GetStart() == *pHint->GetEnd())
{
- boost::shared_ptr<SfxItemSet> const pSet(
- pHint->GetAutoFmt().GetStyleHandle());
if (pSet->Count() == 1 && pSet->GetItem(RES_CHRATR_RSID, false))
{ // empty range RSID-only hints could cause trouble, there's no
rNode.DestroyAttr(pHint); // need for them so don't insert
@@ -2986,6 +2986,19 @@ bool SwpHints::TryInsertHint(
const SfxPoolItem* pHiddenItem = CharFmt::GetItem( *pHint, RES_CHRATR_HIDDEN );
if ( pHiddenItem )
rNode.SetCalcHiddenCharFlags();
+
+ // fdo#71556: populate aWhichFmtAttr member of SwMsgPoolItem
+ const sal_uInt16 *pRanges = pSet->GetRanges();
+ while( (*pRanges) != 0 )
+ {
+ sal_uInt16 nBeg = (*pRanges);
+ ++pRanges;
+ sal_uInt16 nEnd = (*pRanges);
+ ++pRanges;
+ for( sal_uInt16 nSubElem = nBeg; nSubElem <= nEnd; ++nSubElem )
+ if( pSet->HasItem( nSubElem ) )
+ aWhichSublist.push_back( nSubElem );
+ }
break;
}
case RES_TXTATR_INETFMT:
@@ -3237,7 +3250,8 @@ bool SwpHints::TryInsertHint(
// ... und die Abhaengigen benachrichtigen
if ( rNode.GetDepends() )
{
- SwUpdateAttr aHint( nHtStart, nHtStart == nHintEnd ? nHintEnd + 1 : nHintEnd, nWhich );
+ SwUpdateAttr aHint( nHtStart, nHtStart == nHintEnd ? nHintEnd + 1 : nHintEnd,
+ nWhich, aWhichSublist );
rNode.ModifyNotification( 0, &aHint );
}