summaryrefslogtreecommitdiff
path: root/sw/source/core
diff options
context:
space:
mode:
authorUray M. János <uray.janos@gmail.com>2012-07-17 19:00:21 +0200
committerAndras Timar <atimar@suse.com>2012-07-18 10:19:09 +0200
commit450273888bcebc8e44bf5023be60f525ef56f0ec (patch)
tree6943d72a36c7b3a74e5876f53986e96b679ac981 /sw/source/core
parent3103169c41c2c5d5566603d3d05d68181b8b69c1 (diff)
fdo#50801 fix cross-reference text when Caption order is Numbering first
Change-Id: I7306f99c18d0f9cfb3b0ce147ecc200662d23b3d Signed-off-by: Andras Timar <atimar@suse.com>
Diffstat (limited to 'sw/source/core')
-rw-r--r--sw/source/core/fields/expfld.cxx19
-rw-r--r--sw/source/core/fields/reffld.cxx117
2 files changed, 88 insertions, 48 deletions
diff --git a/sw/source/core/fields/expfld.cxx b/sw/source/core/fields/expfld.cxx
index 7ea20a4d74f0..c00d38eba283 100644
--- a/sw/source/core/fields/expfld.cxx
+++ b/sw/source/core/fields/expfld.cxx
@@ -896,19 +896,21 @@ void SwGetExpField::SetValue( const double& rAny )
/* --------------------------------------------------
Description: Find the index of the reference text
following the current field
+ nHint: search starting position after the current
+ field (or 0 if default)
--------------------------------------------------*/
-xub_StrLen SwGetExpField::GetReferenceTextPos( const SwFmtFld& rFmt, SwDoc& rDoc)
+xub_StrLen SwGetExpField::GetReferenceTextPos( const SwFmtFld& rFmt, SwDoc& rDoc, unsigned nHint)
{
//
const SwTxtFld* pTxtFld = rFmt.GetTxtFld();
const SwTxtNode& rTxtNode = pTxtFld->GetTxtNode();
//
- xub_StrLen nRet = *pTxtFld->GetStart() + 1;
+ xub_StrLen nRet = nHint ? nHint : *pTxtFld->GetStart() + 1;
String sNodeText = rTxtNode.GetTxt();
sNodeText.Erase(0, nRet);
if(sNodeText.Len())
{
- //now check if sNodeText starts with a non-alphanumeric character plus a blank
+ // now check if sNodeText starts with a non-alphanumeric character plus blanks
sal_uInt16 nSrcpt = pBreakIt->GetRealScriptOfText( sNodeText, 0 );
static sal_uInt16 nIds[] =
@@ -935,11 +937,14 @@ xub_StrLen SwGetExpField::GetReferenceTextPos( const SwFmtFld& rFmt, SwDoc& rDoc
if( !bIsAlphaNum ||
(c0 == ' ' || c0 == '\t'))
{
+ // ignoring blanks
nRet++;
- if( sNodeText.Len() > 1 &&
- (sNodeText.GetChar(1) == ' ' ||
- sNodeText.GetChar(1) == '\t'))
- nRet++;
+ unsigned i = 1;
+ while (i < sNodeText.Len() &&
+ (sNodeText.GetChar(i) == ' ' ||
+ sNodeText.GetChar(i) == '\t')
+ )
+ nRet++, i++;
}
}
}
diff --git a/sw/source/core/fields/reffld.cxx b/sw/source/core/fields/reffld.cxx
index 857bd2cef431..79b076b6e72c 100644
--- a/sw/source/core/fields/reffld.cxx
+++ b/sw/source/core/fields/reffld.cxx
@@ -69,6 +69,7 @@
#include <set>
#include <map>
+#include <algorithm> // min, max
#include <sfx2/childwin.hxx>
@@ -293,16 +294,28 @@ void SwGetRefField::UpdateField( const SwTxtFld* pFldTxtAttr )
sTxt.Erase();
SwDoc* pDoc = ((SwGetRefFieldType*)GetTyp())->GetDoc();
- sal_uInt16 nStt = USHRT_MAX;
- sal_uInt16 nEnd = USHRT_MAX;
- SwTxtNode* pTxtNd = SwGetRefFieldType::FindAnchor( pDoc, sSetRefName,
- nSubType, nSeqNo, &nStt, &nEnd );
+ // finding the reference target (the number)
+ sal_uInt16 nNumStart, nNumEnd;
+ SwTxtNode* pTxtNd = SwGetRefFieldType::FindAnchor(
+ pDoc, sSetRefName, nSubType, nSeqNo, &nNumStart, &nNumEnd
+ );
+ // not found?
if ( !pTxtNd )
{
sTxt = ViewShell::GetShellRes()->aGetRefFld_RefItemNotFound;
return ;
}
+ // where is the category name (e.g. "Illustration")?
+ rtl::OUString const Text = pTxtNd->GetTxt();
+ unsigned const nCatStart = Text.indexOf(sSetRefName);
+ unsigned const nCatEnd = nCatStart == unsigned(-1) ?
+ unsigned(-1) : nCatStart + sSetRefName.getLength();
+ bool const bHasCat = nCatStart != unsigned(-1);
+ // length of the referenced text
+ unsigned const nLen = Text.getLength();
+
+ // which format?
switch( GetFormat() )
{
case REF_CONTENT:
@@ -310,73 +323,95 @@ void SwGetRefField::UpdateField( const SwTxtFld* pFldTxtAttr )
case REF_ONLYCAPTION:
case REF_ONLYSEQNO:
{
+ // needed part of Text
+ unsigned nStart, nEnd;
+
switch( nSubType )
{
case REF_SEQUENCEFLD:
- nEnd = pTxtNd->GetTxt().Len();
+
switch( GetFormat() )
{
+ // "Category and Number"
case REF_ONLYNUMBER:
- if( nStt + 1 < nEnd )
- nEnd = nStt + 1;
- nStt = 0;
+ if (bHasCat) {
+ nStart = std::min<unsigned>(nNumStart, nCatStart);
+ nEnd = std::max<unsigned>(nNumEnd, nCatEnd);
+ } else {
+ nStart = nNumStart;
+ nEnd = nNumEnd;
+ }
break;
- case REF_ONLYCAPTION:
- {
- const SwTxtAttr* const pTxtAttr =
- pTxtNd->GetTxtAttrForCharAt(nStt, RES_TXTATR_FIELD);
- if( pTxtAttr )
- nStt = SwGetExpField::GetReferenceTextPos(
- pTxtAttr->GetFld(), *pDoc );
- else if( nStt + 1 < nEnd )
- ++nStt;
+ // "Caption Text"
+ case REF_ONLYCAPTION: {
+ // next alphanumeric character after category+number
+ if (const SwTxtAttr* const pTxtAttr =
+ pTxtNd->GetTxtAttrForCharAt(nNumStart, RES_TXTATR_FIELD)
+ ) {
+ // start searching from nFrom
+ unsigned const nFrom = bHasCat ?
+ std::max<unsigned>(nNumStart + 1, nCatEnd) : nNumStart + 1;
+ nStart = SwGetExpField::GetReferenceTextPos(
+ pTxtAttr->GetFld(), *pDoc, nFrom
+ );
+ } else {
+ nStart = bHasCat ?
+ std::max<unsigned>(nNumEnd, nCatEnd) : nNumEnd;
}
+ nEnd = nLen;
break;
+ }
+ // "Numbering"
case REF_ONLYSEQNO:
- if( nStt + 1 < nEnd )
- nEnd = nStt + 1;
+ nStart = nNumStart;
+ nEnd = std::min<unsigned>(nStart + 1, nLen);
break;
+ // "Reference" (whole Text)
default:
- nStt = 0;
+ nStart = 0;
+ nEnd = nLen;
break;
}
break;
case REF_BOOKMARK:
- if( USHRT_MAX == nEnd )
- {
- // Text steht ueber verschiedene Nodes verteilt.
- // Gesamten Text oder nur bis zum Ende vom Node?
- nEnd = pTxtNd->GetTxt().Len();
- }
+ nStart = nNumStart;
+ // Text steht ueber verschiedene Nodes verteilt.
+ // Gesamten Text oder nur bis zum Ende vom Node?
+ nEnd = nNumEnd == USHRT_MAX ? nLen : nNumEnd;
break;
case REF_OUTLINE:
+ nStart = nNumStart;
+ nEnd = nNumEnd;
break;
case REF_FOOTNOTE:
case REF_ENDNOTE:
+ // die Nummer oder den NumString besorgen
+ for( unsigned i = 0; i < pDoc->GetFtnIdxs().Count(); ++i )
{
- // die Nummer oder den NumString besorgen
- sal_uInt16 n, nFtnCnt = pDoc->GetFtnIdxs().Count();
- SwTxtFtn* pFtnIdx;
- for( n = 0; n < nFtnCnt; ++n )
- if( nSeqNo == (pFtnIdx = pDoc->GetFtnIdxs()[ n ])->GetSeqRefNo() )
- {
- sTxt = pFtnIdx->GetFtn().GetViewNumStr( *pDoc );
- break;
- }
- nStt = nEnd; // kein Bereich, der String ist fertig
+ SwTxtFtn* const pFtnIdx = pDoc->GetFtnIdxs()[i];
+ if( nSeqNo == pFtnIdx->GetSeqRefNo() )
+ {
+ sTxt = pFtnIdx->GetFtn().GetViewNumStr( *pDoc );
+ break;
+ }
}
+ return;
+
+ default:
+ nStart = nNumStart;
+ nEnd = nNumEnd;
break;
}
- if( nStt != nEnd ) // ein Bereich?
+ if( nStart != nEnd ) // ein Bereich?
{
- sTxt = pTxtNd->GetExpandTxt( nStt, nEnd - nStt );
+ sTxt = pTxtNd->GetExpandTxt( nStart, nEnd - nStart );
// alle Sonderzeichen entfernen (durch Blanks ersetzen):
if( sTxt.Len() )
@@ -399,7 +434,7 @@ void SwGetRefField::UpdateField( const SwTxtFld* pFldTxtAttr )
{
const SwTxtFrm* pFrm = (SwTxtFrm*)pTxtNd->getLayoutFrm( pDoc->GetCurrentLayout(), 0,0,sal_False),
*pSave = pFrm;
- while( pFrm && !pFrm->IsInside( nStt ) )
+ while( pFrm && !pFrm->IsInside( nNumStart ) )
pFrm = (SwTxtFrm*)pFrm->GetFollow();
if( pFrm || 0 != ( pFrm = pSave ))
@@ -446,14 +481,14 @@ void SwGetRefField::UpdateField( const SwTxtFld* pFldTxtAttr )
// Node stehen!
if( pFldTxtAttr->GetpTxtNode() == pTxtNd )
{
- sTxt = nStt < *pFldTxtAttr->GetStart()
+ sTxt = nNumStart < *pFldTxtAttr->GetStart()
? aLocaleData.getAboveWord()
: aLocaleData.getBelowWord();
break;
}
sTxt = ::IsFrameBehind( *pFldTxtAttr->GetpTxtNode(), *pFldTxtAttr->GetStart(),
- *pTxtNd, nStt )
+ *pTxtNd, nNumStart )
? aLocaleData.getAboveWord()
: aLocaleData.getBelowWord();
}