[Libreoffice-commits] core.git: sw/source
Michael Stahl
mstahl at redhat.com
Mon Feb 6 14:31:18 UTC 2017
sw/source/core/txtnode/thints.cxx | 111 +++++++++++++++++---------------------
1 file changed, 51 insertions(+), 60 deletions(-)
New commits:
commit 23972ff57fe9d7469aaf9318286b3cd38dfd3053
Author: Michael Stahl <mstahl at redhat.com>
Date: Mon Feb 6 15:22:47 2017 +0100
sw: translate more german comments
Change-Id: I662cde51b6fbf4e44c8a0a0314f057fdc1a764f0
diff --git a/sw/source/core/txtnode/thints.cxx b/sw/source/core/txtnode/thints.cxx
index d8a6a14..7c49bbc 100644
--- a/sw/source/core/txtnode/thints.cxx
+++ b/sw/source/core/txtnode/thints.cxx
@@ -2002,16 +2002,19 @@ static void lcl_MergeAttr_ExpandChrFormat( SfxItemSet& rSet, const SfxPoolItem&
}
}
- // aufnehmen als MergeWert (falls noch nicht gesetzt neu setzen!)
+/* If multiple attributes overlap, the last one wins!
+ Probably this can only happen between a RES_TXTATR_INETFMT and one of the
+ other hints, because BuildPortions ensures that CHARFMT/AUTOFMT don't
+ overlap. But there may be multiple CHARFMT/AUTOFMT with exactly the same
+ start/end, sorted by BuildPortions, in which case the same logic applies.
-/* wenn mehrere Attribute ueberlappen gewinnt der letze !!
- z.B
1234567890123456789
|------------| Font1
|------| Font2
^ ^
- |--| Abfragebereich: -> Gueltig ist Font2
+ |--| query range: -> Font2
*/
+ // merge into set
rSet.Put( rAttr );
}
@@ -2051,23 +2054,22 @@ bool SwTextNode::GetAttr( SfxItemSet& rSet, sal_Int32 nStt, sal_Int32 nEnd,
{
if( HasHints() )
{
- /* stelle erstmal fest, welche Text-Attribut in dem Bereich gueltig
- * sind. Dabei gibt es folgende Faelle:
- * UnEindeutig wenn: (wenn != Format-Attribut)
- * - das Attribut liegt vollstaendig im Bereich
- * - das Attributende liegt im Bereich
- * - der Attributanfang liegt im Bereich:
- * Eindeutig (im Set mergen):
- * - das Attrib umfasst den Bereich
- * nichts tun:
- * das Attribut liegt ausserhalb des Bereiches
- */
+ // First, check which text attributes are valid in the range.
+ // cases:
+ // Ambiguous, if
+ // * the attribute is wholly contained in the range
+ // * the attribute end is in the range
+ // * the attribute start is in the range
+ // Unambiguous (merge into set), if
+ // * the attribute wholly contains the range
+ // Ignored, if
+ // * the attribute is wholly outside the range
void (*fnMergeAttr)( SfxItemSet&, const SfxPoolItem& )
= bGetFromChrFormat ? &lcl_MergeAttr_ExpandChrFormat
: &lcl_MergeAttr;
- // dann besorge mal die Auto-(Format)Attribute
+ // get the node's automatic attributes
SfxItemSet aFormatSet( *rSet.GetPool(), rSet.GetRanges() );
if( !bOnlyTextAttr )
{
@@ -2080,13 +2082,13 @@ bool SwTextNode::GetAttr( SfxItemSet& rSet, sal_Int32 nStt, sal_Int32 nEnd,
const size_t nSize = m_pSwpHints->Count();
- if( nStt == nEnd ) // kein Bereich:
+ if (nStt == nEnd) // no range:
{
for (size_t n = 0; n < nSize; ++n)
{
const SwTextAttr* pHt = m_pSwpHints->Get(n);
const sal_Int32 nAttrStart = pHt->GetStart();
- if( nAttrStart > nEnd ) // ueber den Bereich hinaus
+ if (nAttrStart > nEnd) // behind the range
break;
const sal_Int32* pAttrEnd = pHt->End();
@@ -2101,7 +2103,7 @@ bool SwTextNode::GetAttr( SfxItemSet& rSet, sal_Int32 nStt, sal_Int32 nEnd,
(*fnMergeAttr)( rSet, pHt->GetAttr() );
}
}
- else // es ist ein Bereich definiert
+ else // a query range is defined
{
// #i75299#
std::unique_ptr< std::vector< SwPoolItemEndPair > > pAttrArr;
@@ -2112,7 +2114,7 @@ bool SwTextNode::GetAttr( SfxItemSet& rSet, sal_Int32 nStt, sal_Int32 nEnd,
{
const SwTextAttr* pHt = m_pSwpHints->Get(n);
const sal_Int32 nAttrStart = pHt->GetStart();
- if( nAttrStart > nEnd ) // ueber den Bereich hinaus
+ if (nAttrStart > nEnd) // outside, behind
break;
const sal_Int32* pAttrEnd = pHt->End();
@@ -2120,25 +2122,25 @@ bool SwTextNode::GetAttr( SfxItemSet& rSet, sal_Int32 nStt, sal_Int32 nEnd,
continue;
bool bChkInvalid = false;
- if( nAttrStart <= nStt ) // vor oder genau Start
+ if (nAttrStart <= nStt) // before or exactly Start
{
- if( *pAttrEnd <= nStt ) // liegt davor
+ if (*pAttrEnd <= nStt) // outside, before
continue;
- if( nEnd <= *pAttrEnd ) // hinter oder genau Ende
+ if (nEnd <= *pAttrEnd) // behind or exactly End
(*fnMergeAttr)( aFormatSet, pHt->GetAttr() );
else
// else if( pHt->GetAttr() != aFormatSet.Get( pHt->Which() ) )
- // uneindeutig
+ // ambiguous
bChkInvalid = true;
}
- else if( nAttrStart < nEnd // reicht in den Bereich
+ else if (nAttrStart < nEnd // starts in the range
)// && pHt->GetAttr() != aFormatSet.Get( pHt->Which() ) )
bChkInvalid = true;
if( bChkInvalid )
{
- // uneindeutig ?
+ // ambiguous?
std::unique_ptr< SfxItemIter > pItemIter;
const SfxPoolItem* pItem = nullptr;
@@ -2229,13 +2231,13 @@ bool SwTextNode::GetAttr( SfxItemSet& rSet, sal_Int32 nStt, sal_Int32 nEnd,
const sal_uInt16 nWh =
static_cast<sal_uInt16>(n + RES_CHRATR_BEGIN);
- if( nEnd <= rItemPair.mnEndPos ) // hinter oder genau Ende
+ if (nEnd <= rItemPair.mnEndPos) // behind or exactly end
{
if( *rItemPair.mpItem != aFormatSet.Get( nWh ) )
(*fnMergeAttr)( rSet, *rItemPair.mpItem );
}
else
- // uneindeutig
+ // ambiguous
rSet.InvalidateItem( nWh );
}
}
@@ -2243,15 +2245,15 @@ bool SwTextNode::GetAttr( SfxItemSet& rSet, sal_Int32 nStt, sal_Int32 nEnd,
}
if( aFormatSet.Count() )
{
- // aus dem Format-Set alle entfernen, die im TextSet auch gesetzt sind
+ // remove all from the format-set that are also set in the text-set
aFormatSet.Differentiate( rSet );
- // jetzt alle zusammen "mergen"
+ // now "merge" everything
rSet.Put( aFormatSet );
}
}
else if( !bOnlyTextAttr )
{
- // dann besorge mal die Auto-(Format)Attribute
+ // get the node's automatic attributes
SwContentNode::GetAttr( rSet );
if ( bMergeIndentValuesOfNumRule )
{
@@ -2937,12 +2939,6 @@ bool SwpHints::TryInsertHint(
return false;
}
- // Felder bilden eine Ausnahme:
- // 1) Sie koennen nie ueberlappen
- // 2) Wenn zwei Felder genau aneinander liegen,
- // sollen sie nicht zu einem verschmolzen werden.
- // Wir koennen also auf die while-Schleife verzichten
-
sal_Int32 *pHtEnd = pHint->GetEnd();
const sal_uInt16 nWhich = pHint->Which();
std::vector<sal_uInt16> aWhichSublist;
@@ -3007,8 +3003,7 @@ bool SwpHints::TryInsertHint(
if( !pDoc->getIDocumentFieldsAccess().IsNewFieldLst() )
{
- // was fuer ein Feld ist es denn ??
- // bestimmte Felder mussen am Doc das Calculations-Flag updaten
+ // certain fields must update the SwDoc's calculation flags
switch( pField->GetTyp()->Which() )
{
case RES_DBFLD:
@@ -3031,7 +3026,7 @@ bool SwpHints::TryInsertHint(
}
}
- // gehts ins normale Nodes-Array?
+ // insert into real document's nodes-array?
if( rNode.GetNodes().IsDocNodes() )
{
bool bInsFieldType = false;
@@ -3041,8 +3036,8 @@ bool SwpHints::TryInsertHint(
bInsFieldType = static_cast<SwSetExpFieldType*>(pField->GetTyp())->IsDeleted();
if( nsSwGetSetExpType::GSE_SEQ & static_cast<SwSetExpFieldType*>(pField->GetTyp())->GetType() )
{
- // bevor die ReferenzNummer gesetzt wird, sollte
- // das Feld am richtigen FeldTypen haengen!
+ // register the field at its FieldType before setting
+ // the sequence reference number!
SwSetExpFieldType* pFieldType = static_cast<SwSetExpFieldType*>(
pDoc->getIDocumentFieldsAccess().InsertFieldType( *pField->GetTyp() ) );
if( pFieldType != pField->GetTyp() )
@@ -3149,10 +3144,10 @@ bool SwpHints::TryInsertHint(
if( SetAttrMode::DONTEXPAND & nMode )
pHint->SetDontExpand( true );
- // SwTextAttrs ohne Ende werden sonderbehandelt:
- // Sie werden natuerlich in das Array insertet, aber sie werden nicht
- // in die pPrev/Next/On/Off-Verkettung aufgenommen.
- // Der Formatierer erkennt diese TextHints an dem CH_TXTATR_.. im Text !
+ // special handling for SwTextAttrs without end:
+ // 1) they cannot overlap
+ // 2) if two fields are adjacent, they must not be merged into one
+ // this is guaranteed by inserting a CH_TXTATR_* into the paragraph text!
sal_Int32 nHtStart = pHint->GetStart();
if( !pHtEnd )
{
@@ -3163,7 +3158,7 @@ bool SwpHints::TryInsertHint(
if( !rNode.GetDoc()->IsInReading() )
CHECK;
#endif
- // ... und die Abhaengigen benachrichtigen
+ // ... and notify listeners
if(rNode.HasWriterListeners())
{
SwUpdateAttr aHint(
@@ -3177,14 +3172,14 @@ bool SwpHints::TryInsertHint(
return true;
}
- // Ab hier gibt es nur noch pHint mit einem EndIdx !!!
+ // from here on, pHint is known to have an end index!
if( *pHtEnd < nHtStart )
{
OSL_ENSURE( *pHtEnd >= nHtStart,
"+SwpHints::Insert: invalid hint, end < start" );
- // Wir drehen den Quatsch einfach um:
+ // just swap the nonsense:
pHint->GetStart() = *pHtEnd;
*pHtEnd = nHtStart;
nHtStart = pHint->GetStart();
@@ -3247,7 +3242,7 @@ bool SwpHints::TryInsertHint(
}
}
- // ... und die Abhaengigen benachrichtigen
+ // ... and notify listeners
if ( rNode.HasWriterListeners() )
{
SwUpdateAttr aHint(
@@ -3310,14 +3305,12 @@ void SwpHints::DeleteAtPos( const size_t nPos )
CHECK_NOTMERGED; // called from BuildPortions
}
-// Ist der Hint schon bekannt, dann suche die Position und loesche ihn.
-// Ist er nicht im Array, so gibt es ein OSL_ENSURE(!!
-
+/// delete the hint
+/// precondition: pTextHt must be in this array
void SwpHints::Delete( SwTextAttr* pTextHt )
{
- // Attr 2.0: SwpHintsArr::Delete( pTextHt );
const size_t nPos = GetIndexOf( pTextHt );
- OSL_ENSURE( SAL_MAX_SIZE != nPos, "Attribut nicht im Attribut-Array!" );
+ OSL_ENSURE( SAL_MAX_SIZE != nPos, "Attribute not in SwpHints-Array!" );
if( SAL_MAX_SIZE != nPos )
DeleteAtPos( nPos );
}
@@ -3378,7 +3371,6 @@ sal_uInt16 SwTextNode::GetLang( const sal_Int32 nBegin, const sal_Int32 nLen,
const size_t nSize = m_pSwpHints->Count();
for ( size_t i = 0; i < nSize; ++i )
{
- // ist der Attribut-Anfang schon groesser als der Idx ?
const SwTextAttr *pHt = m_pSwpHints->Get(i);
const sal_Int32 nAttrStart = pHt->GetStart();
if( nEnd < nAttrStart )
@@ -3390,8 +3382,7 @@ sal_uInt16 SwTextNode::GetLang( const sal_Int32 nBegin, const sal_Int32 nLen,
( ( pHt->IsCharFormatAttr() || RES_TXTATR_AUTOFMT == nWhich ) && CharFormat::IsItemIncluded( nWhichId, pHt ) ) )
{
const sal_Int32 *pEndIdx = pHt->End();
- // Ueberlappt das Attribut den Bereich?
-
+ // do the attribute and the range overlap?
if( !pEndIdx )
continue;
if( nLen )
@@ -3409,11 +3400,11 @@ sal_uInt16 SwTextNode::GetLang( const sal_Int32 nBegin, const sal_Int32 nLen,
const SfxPoolItem* pItem = CharFormat::GetItem( *pHt, nWhichId );
const sal_uInt16 nLng = static_cast<const SvxLanguageItem*>(pItem)->GetLanguage();
- // Umfasst das Attribut den Bereich komplett?
+ // does the attribute completely cover the range?
if( nAttrStart <= nBegin && nEnd <= *pEndIdx )
nRet = nLng;
else if( LANGUAGE_DONTKNOW == nRet )
- nRet = nLng; // partielle Ueberlappung, der 1. gewinnt
+ nRet = nLng; // partial overlap, the first one wins
}
}
}
More information about the Libreoffice-commits
mailing list