Hi,
I was trying to implement the wrapping feature for fields (specifically
the hyperlinks) in impress. Currently, the text box containing
hyperlinks can overflow the width of the box. This can be a problem when
the content is on the border of the slide (or otherwise).
What this patch does/does not:
a) Wraps the field text during display (i.e. not during editing)
b) But, the subsequent text would start from the next line.
c) The link (in case of hyperlinks) is clickable only in the
first segment
I have attached the patch for review. Is my approach correct?
Thank you so much!
Muthu Subramanian
diff --git a/editeng/source/editeng/editdoc.hxx b/editeng/source/editeng/editdoc.hxx
--- a/editeng/source/editeng/editdoc.hxx
+++ b/editeng/source/editeng/editdoc.hxx
@@ -361,6 +361,7 @@ struct ExtraPortionInfo
sal_Bool bCompressed;
sal_Int32* pOrgDXArray;
+ ::std::vector< sal_Int32 > lineBreaksList;
ExtraPortionInfo();
diff --git a/editeng/source/editeng/impedit3.cxx b/editeng/source/editeng/impedit3.cxx
--- a/editeng/source/editeng/impedit3.cxx
+++ b/editeng/source/editeng/impedit3.cxx
@@ -1007,7 +1014,31 @@ sal_Bool ImpEditEngine::CreateLines( sal_uInt16 nPara, sal_uInt32 nStartPosY
)
pPortion->GetSize() = aTmpFont.QuickGetTextSize( GetRefDevice(),
aFieldValue, 0, aFieldValue.Len(), 0 );
// So no scrolling for oversized fields
if ( pPortion->GetSize().Width() > nXWidth )
+ {
+ sal_Int32 nWidthOrg = pPortion->GetSize().Width();
+ sal_Int32 nChars = aFieldValue.Len();
+ sal_Int32 nApproxWC = nXWidth / ( nWidthOrg / nChars );
+ ExtraPortionInfo *pExtraInfo= pPortion->GetExtraInfos();
+ if( !nApproxWC ) nApproxWC++;
+ if( pExtraInfo == NULL )
+ {
+ pExtraInfo = new ExtraPortionInfo();
+ pExtraInfo->nOrgWidth = nXWidth;
+ pPortion->SetExtraInfos( pExtraInfo );
+ }
+ else
+ {
+ pExtraInfo->lineBreaksList.clear();
+ }
+
pPortion->GetSize().Width() = nXWidth;
+
+ while( nChars > 0 )
+ {
+ pExtraInfo->lineBreaksList.push_back( aFieldValue.Len() -
nChars );
+ nChars -= nApproxWC;
+ }
+ }
}
nTmpWidth += pPortion->GetSize().Width();
pLine->GetCharPosArray().Insert( pPortion->GetSize().Width(),
nTmpPos-pLine->GetStart() );
@@ -2909,6 +2942,8 @@ void ImpEditEngine::Paint( OutputDevice* pOutDev, Rectangle aClipRec, Point
aSta
// Over the Portions of the line ...
// --------------------------------------------------
sal_uInt16 nIndex = pLine->GetStart();
+ bool bParsingFields = false;
+ ::std::vector< sal_Int32 >::iterator itSubLines;
for ( sal_uInt16 y = pLine->GetStartPortion(); y <= pLine->GetEndPortion();
y++ )
{
DBG_ASSERT( pPortion->GetTextPortions().Count(), "Line without Textportion
in Paint!" );
@@ -3084,12 +3122,48 @@ void ImpEditEngine::Paint( OutputDevice* pOutDev, Rectangle aClipRec, Point
aSta
aText = ((EditCharAttribField*)pAttr)->GetFieldValue();
nTextStart = 0;
nTextLen = aText.Len();
+ ExtraPortionInfo *pExtraInfo = pTextPortion->GetExtraInfos();
+ // Do not split the Fields into different lines while editing
+ if( bStripOnly && !bParsingFields && pExtraInfo &&
pExtraInfo->lineBreaksList.size() )
+ {
+ bParsingFields = true;
+ itSubLines = pExtraInfo->lineBreaksList.begin();
+ }
+ if( bParsingFields )
+ {
+ if( itSubLines != pExtraInfo->lineBreaksList.begin() )
+ {
+ if ( !IsVertical() )
+ {
+ aStartPos.Y() += pLine->GetMaxAscent();
+ aTmpPos.Y() += pLine->GetHeight();
+ }
+ else
+ {
+ aTmpPos.X() -= pLine->GetMaxAscent();
+ aStartPos.X() -= pLine->GetHeight();
+ }
+ }
+ ::std::vector< sal_Int32 >::iterator curIt = itSubLines;
+ itSubLines++;
+ if( itSubLines != pExtraInfo->lineBreaksList.end() )
+ {
+ nTextStart = *curIt;
+ nTextLen = *itSubLines - nTextStart;
+ }
+ else
+ {
+ nTextStart = *curIt;
+ nTextLen = nTextLen - nTextStart;
+ bParsingFields = false;
+ }
+ }
pTmpDXArray = new sal_Int32[ aText.Len() ];
pDXArray = pTmpDXArray;
Font _aOldFont( GetRefDevice()->GetFont() );
aTmpFont.SetPhysFont( GetRefDevice() );
- aTmpFont.QuickGetTextSize( GetRefDevice(), aText, 0,
aText.Len(), pTmpDXArray );
+ aTmpFont.QuickGetTextSize( GetRefDevice(), aText, nTextStart,
nTextLen, pTmpDXArray );
if ( aStatus.DoRestoreFont() )
GetRefDevice()->SetFont( _aOldFont );
@@ -3471,7 +3548,11 @@ void ImpEditEngine::Paint( OutputDevice* pOutDev, Rectangle aClipRec, Point
aSta
}
break;
}
- nIndex = nIndex + pTextPortion->GetLen();
+ if( bParsingFields )
+ y--;
+ else
+ nIndex = nIndex + pTextPortion->GetLen();
+
}
}
Context
- [Patch] [Advice] Wrapping fields in impress · Muthu Subramanian K
Privacy Policy |
Impressum (Legal Info) |
Copyright information: Unless otherwise specified, all text and images
on this website are licensed under the
Creative Commons Attribution-Share Alike 3.0 License.
This does not include the source code of LibreOffice, which is
licensed under the Mozilla Public License (
MPLv2).
"LibreOffice" and "The Document Foundation" are
registered trademarks of their corresponding registered owners or are
in actual use as trademarks in one or more countries. Their respective
logos and icons are also subject to international copyright laws. Use
thereof is explained in our
trademark policy.