diff options
-rw-r--r-- | sw/inc/hints.hxx | 2 | ||||
-rw-r--r-- | sw/source/core/attr/hints.cxx | 7 | ||||
-rw-r--r-- | sw/source/core/text/txtfrm.cxx | 22 | ||||
-rw-r--r-- | sw/source/core/txtnode/thints.cxx | 20 |
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 ); } |