/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * This file is part of the LibreOffice project. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * This file incorporates work covered by the following license notice: * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed * with this work for additional information regarding copyright * ownership. The ASF licenses this file to you under the Apache * License, Version 2.0 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
/** * In the outer loop all portions are inspected - the GluePortions * at the end are processed first. * The end is shifted forwardly till no more GluePortions remain. * Always GluePortion-pairs (pLeft and pRight) are treated, where * textportions between pLeft and pRight are moved at the back of * pRight if pRight has enough Glue. With every move part of the * Glue is transferred from pRight to pLeft. * The next loop starts with the processed pLeft as pRight.
*/ void SwMarginPortion::AdjustRight( const SwLineLayout *pCurr )
{
SwGluePortion *pRight = nullptr; bool bNoMove = nullptr != pCurr->GetpKanaComp(); while( pRight != this )
{
// 1) We search for the left Glue
SwLinePortion *pPos = this;
SwGluePortion *pLeft = nullptr; while( pPos )
{ if( pPos->InFixMargGrp() )
pLeft = static_cast<SwGluePortion*>(pPos);
pPos = pPos->GetNextPortion(); if( pPos == pRight)
pPos = nullptr;
}
// Two adjoining FlyPortions are merged if( pRight && pLeft && pLeft->GetNextPortion() == pRight )
{
pRight->MoveAllGlue( pLeft );
pRight = nullptr;
} auto nRightGlue = pRight && 0 < pRight->GetPrtGlue()
? pRight->GetPrtGlue() : 0; // 2) balance left and right Glue // But not for tabs ... if( pLeft && nRightGlue && !pRight->InTabGrp() )
{ // pPrev is the portion immediately before pRight
SwLinePortion *pPrev = pRight->FindPrevPortion( pLeft );
if ( pRight->IsFlyPortion() && pRight->GetLen() )
{
SwFlyPortion *pFly = static_cast<SwFlyPortion *>(pRight); if ( pFly->GetBlankWidth() < nRightGlue )
{ // Creating new TextPortion, that takes over the // Blank previously swallowed by the Fly.
nRightGlue = nRightGlue - pFly->GetBlankWidth();
pFly->SubPrtWidth( pFly->GetBlankWidth() );
pFly->SetLen(TextFrameIndex(0));
SwTextPortion *pNewPor = new SwTextPortion;
pNewPor->SetLen(TextFrameIndex(1));
pNewPor->Height( pFly->Height() );
pNewPor->Width( pFly->GetBlankWidth() );
pFly->Insert( pNewPor );
} else
pPrev = pLeft;
} while( pPrev != pLeft )
{ if( bNoMove || pPrev->PrtWidth() >= nRightGlue ||
pPrev->InHyphGrp() || pPrev->IsKernPortion() )
{ // The portion before the pRight cannot be moved // because no Glue is remaining. // We set the break condition:
pPrev = pLeft;
} else
{
nRightGlue = nRightGlue - pPrev->PrtWidth(); // pPrev is moved behind pRight. For this the // Glue value between pRight and pLeft gets balanced.
pRight->MoveGlue( pLeft, pPrev->PrtWidth() ); // Now fix the linking of our portions.
SwLinePortion *pPrevPrev = pPrev->FindPrevPortion( pLeft );
pPrevPrev->SetNextPortion( pRight );
pPrev->SetNextPortion( pRight->GetNextPortion() );
pRight->SetNextPortion( pPrev ); if ( pPrev->GetNextPortion() && pPrev->InTextGrp()
&& pPrev->GetNextPortion()->IsHolePortion() )
{
SwHolePortion *pHolePor = static_cast<SwHolePortion*>(pPrev->GetNextPortion()); if ( !pHolePor->GetNextPortion() ||
!pHolePor->GetNextPortion()->InFixMargGrp() )
{
pPrev->AddPrtWidth( pHolePor->GetBlankWidth() );
pPrev->SetLen(pPrev->GetLen() + TextFrameIndex(1));
pPrev->SetNextPortion( pHolePor->GetNextPortion() ); delete pHolePor;
}
}
pPrev = pPrevPrev;
}
}
} // If no left Glue remains, we set the break condition.
pRight = pLeft ? pLeft : this;
}
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.