Kaydet (Commit) 741e8b7b authored tarafından Michael Stahl's avatar Michael Stahl

fdo#58074: store page number in SwPageNumberField

Should hopefully fix the problem, which is essentially that all
SwPageNumberFields share a single SwPageNumberFieldType, which is only
updated properly in SwTxtFormatter::NewFldPortion, hence all expansions
of a SwPageNumberField other than that return wrong values.
Does not fix the problem for fields in headers though, which appears
much harder...

Change-Id: Iecf363c8acbc2aaa418cc0c980e0b62c8e0e7d14
üst 9669d2bd
...@@ -142,14 +142,14 @@ enum SwJumpEditFormat ...@@ -142,14 +142,14 @@ enum SwJumpEditFormat
class SwPageNumberFieldType : public SwFieldType class SwPageNumberFieldType : public SwFieldType
{ {
sal_Int16 nNumberingType; sal_Int16 nNumberingType;
sal_uInt16 nNum, nMax;
bool bVirtuell; bool bVirtuell;
public: public:
SwPageNumberFieldType(); SwPageNumberFieldType();
String& Expand( sal_uInt32 nFmt, short nOff, const String&, String& rRet ) const; String& Expand( sal_uInt32 nFmt, short nOff, sal_uInt16 const nPageNumber,
void ChangeExpansion( SwDoc* pDoc, sal_uInt16 nNum, sal_uInt16 nMax, sal_uInt16 const nMaxPage, const String&, String& rRet ) const;
void ChangeExpansion( SwDoc* pDoc,
sal_Bool bVirtPageNum, const sal_Int16* pNumFmt = 0 ); sal_Bool bVirtPageNum, const sal_Int16* pNumFmt = 0 );
virtual SwFieldType* Copy() const; virtual SwFieldType* Copy() const;
}; };
...@@ -163,10 +163,18 @@ class SW_DLLPUBLIC SwPageNumberField : public SwField ...@@ -163,10 +163,18 @@ class SW_DLLPUBLIC SwPageNumberField : public SwField
String sUserStr; String sUserStr;
sal_uInt16 nSubType; sal_uInt16 nSubType;
short nOffset; short nOffset;
// fdo#58074 store page number in SwField, not SwFieldType
sal_uInt16 m_nPageNumber;
sal_uInt16 m_nMaxPage;
public: public:
SwPageNumberField(SwPageNumberFieldType*, sal_uInt16 nSub = PG_RANDOM, SwPageNumberField(SwPageNumberFieldType*, sal_uInt16 nSub = PG_RANDOM,
sal_uInt32 nFmt = 0, short nOff = 0); sal_uInt32 nFmt = 0, short nOff = 0,
sal_uInt16 const nPageNumber = 0,
sal_uInt16 const nMaxPage = 0);
void ChangeExpansion(sal_uInt16 const nPageNumber,
sal_uInt16 const nMaxPage);
virtual String Expand() const; virtual String Expand() const;
virtual SwField* Copy() const; virtual SwField* Copy() const;
......
...@@ -107,19 +107,18 @@ using namespace nsSwDocInfoSubType; ...@@ -107,19 +107,18 @@ using namespace nsSwDocInfoSubType;
SwPageNumberFieldType::SwPageNumberFieldType() SwPageNumberFieldType::SwPageNumberFieldType()
: SwFieldType( RES_PAGENUMBERFLD ), : SwFieldType( RES_PAGENUMBERFLD ),
nNumberingType( SVX_NUM_ARABIC ), nNumberingType( SVX_NUM_ARABIC ),
nNum( 0 ),
nMax( USHRT_MAX ),
bVirtuell( false ) bVirtuell( false )
{ {
} }
String& SwPageNumberFieldType::Expand( sal_uInt32 nFmt, short nOff, String& SwPageNumberFieldType::Expand( sal_uInt32 nFmt, short nOff,
sal_uInt16 const nPageNumber, sal_uInt16 const nMaxPage,
const String& rUserStr, String& rRet ) const const String& rUserStr, String& rRet ) const
{ {
sal_uInt32 nTmpFmt = (SVX_NUM_PAGEDESC == nFmt) ? (sal_uInt32)nNumberingType : nFmt; sal_uInt32 nTmpFmt = (SVX_NUM_PAGEDESC == nFmt) ? (sal_uInt32)nNumberingType : nFmt;
long nTmp = nNum + nOff; int const nTmp = nPageNumber + nOff;
if( 0 >= nTmp || SVX_NUM_NUMBER_NONE == nTmpFmt || (!bVirtuell && nTmp > nMax) ) if (0 >= nTmp || SVX_NUM_NUMBER_NONE == nTmpFmt || (!bVirtuell && nTmp > nMaxPage))
rRet = aEmptyStr; rRet = aEmptyStr;
else if( SVX_NUM_CHAR_SPECIAL == nTmpFmt ) else if( SVX_NUM_CHAR_SPECIAL == nTmpFmt )
rRet = rUserStr; rRet = rUserStr;
...@@ -132,8 +131,6 @@ SwFieldType* SwPageNumberFieldType::Copy() const ...@@ -132,8 +131,6 @@ SwFieldType* SwPageNumberFieldType::Copy() const
{ {
SwPageNumberFieldType *pTmp = new SwPageNumberFieldType(); SwPageNumberFieldType *pTmp = new SwPageNumberFieldType();
pTmp->nNum = nNum;
pTmp->nMax = nMax;
pTmp->nNumberingType = nNumberingType; pTmp->nNumberingType = nNumberingType;
pTmp->bVirtuell = bVirtuell; pTmp->bVirtuell = bVirtuell;
...@@ -144,12 +141,10 @@ SwFieldType* SwPageNumberFieldType::Copy() const ...@@ -144,12 +141,10 @@ SwFieldType* SwPageNumberFieldType::Copy() const
Beschreibung: Verschiedene Expandierung Beschreibung: Verschiedene Expandierung
--------------------------------------------------------------------*/ --------------------------------------------------------------------*/
void SwPageNumberFieldType::ChangeExpansion( SwDoc* pDoc, sal_uInt16 nPage, void SwPageNumberFieldType::ChangeExpansion( SwDoc* pDoc,
sal_uInt16 nNumPages, sal_Bool bVirt, sal_Bool bVirt,
const sal_Int16* pNumFmt ) const sal_Int16* pNumFmt )
{ {
nNum = nPage;
nMax = nNumPages;
if( pNumFmt ) if( pNumFmt )
nNumberingType = *pNumFmt; nNumberingType = *pNumFmt;
...@@ -186,11 +181,21 @@ void SwPageNumberFieldType::ChangeExpansion( SwDoc* pDoc, sal_uInt16 nPage, ...@@ -186,11 +181,21 @@ void SwPageNumberFieldType::ChangeExpansion( SwDoc* pDoc, sal_uInt16 nPage,
--------------------------------------------------------------------*/ --------------------------------------------------------------------*/
SwPageNumberField::SwPageNumberField(SwPageNumberFieldType* pTyp, SwPageNumberField::SwPageNumberField(SwPageNumberFieldType* pTyp,
sal_uInt16 nSub, sal_uInt32 nFmt, short nOff) sal_uInt16 nSub, sal_uInt32 nFmt, short nOff,
sal_uInt16 const nPageNumber, sal_uInt16 const nMaxPage)
: SwField(pTyp, nFmt), nSubType(nSub), nOffset(nOff) : SwField(pTyp, nFmt), nSubType(nSub), nOffset(nOff)
, m_nPageNumber(nPageNumber)
, m_nMaxPage(nMaxPage)
{ {
} }
void SwPageNumberField::ChangeExpansion(sal_uInt16 const nPageNumber,
sal_uInt16 const nMaxPage)
{
m_nPageNumber = nPageNumber;
m_nMaxPage = nMaxPage;
}
String SwPageNumberField::Expand() const String SwPageNumberField::Expand() const
{ {
String sRet; String sRet;
...@@ -198,23 +203,33 @@ String SwPageNumberField::Expand() const ...@@ -198,23 +203,33 @@ String SwPageNumberField::Expand() const
if( PG_NEXT == nSubType && 1 != nOffset ) if( PG_NEXT == nSubType && 1 != nOffset )
{ {
if( pFldType->Expand( GetFormat(), 1, sUserStr, sRet ).Len() ) if (pFldType->Expand(GetFormat(), 1, m_nPageNumber, m_nMaxPage,
pFldType->Expand( GetFormat(), nOffset, sUserStr, sRet ); sUserStr, sRet).Len())
{
pFldType->Expand(GetFormat(), nOffset, m_nPageNumber, m_nMaxPage,
sUserStr, sRet);
}
} }
else if( PG_PREV == nSubType && -1 != nOffset ) else if( PG_PREV == nSubType && -1 != nOffset )
{ {
if( pFldType->Expand( GetFormat(), -1, sUserStr, sRet ).Len() ) if (pFldType->Expand(GetFormat(), -1, m_nPageNumber, m_nMaxPage,
pFldType->Expand( GetFormat(), nOffset, sUserStr, sRet ); sUserStr, sRet).Len())
{
pFldType->Expand(GetFormat(), nOffset, m_nPageNumber, m_nMaxPage,
sUserStr, sRet);
}
} }
else else
pFldType->Expand( GetFormat(), nOffset, sUserStr, sRet ); pFldType->Expand(GetFormat(), nOffset, m_nPageNumber, m_nMaxPage,
sUserStr, sRet);
return sRet; return sRet;
} }
SwField* SwPageNumberField::Copy() const SwField* SwPageNumberField::Copy() const
{ {
SwPageNumberField *pTmp = SwPageNumberField *pTmp = new SwPageNumberField(
new SwPageNumberField((SwPageNumberFieldType*)GetTyp(), nSubType, GetFormat(), nOffset); static_cast<SwPageNumberFieldType*>(GetTyp()), nSubType,
GetFormat(), nOffset, m_nPageNumber, m_nMaxPage);
pTmp->SetLanguage( GetLanguage() ); pTmp->SetLanguage( GetLanguage() );
pTmp->SetUserString( sUserStr ); pTmp->SetUserString( sUserStr );
return pTmp; return pTmp;
......
...@@ -169,8 +169,9 @@ SwExpandPortion *SwTxtFormatter::NewFldPortion( SwTxtFormatInfo &rInf, ...@@ -169,8 +169,9 @@ SwExpandPortion *SwTxtFormatter::NewFldPortion( SwTxtFormatInfo &rInf,
sal_Int16 nNumFmt = -1; sal_Int16 nNumFmt = -1;
if(SVX_NUM_PAGEDESC == pFld->GetFormat()) if(SVX_NUM_PAGEDESC == pFld->GetFormat())
nNumFmt = pFrame->FindPageFrm()->GetPageDesc()->GetNumType().GetNumberingType(); nNumFmt = pFrame->FindPageFrm()->GetPageDesc()->GetNumType().GetNumberingType();
static_cast<SwPageNumberField*>(pFld)
pPageNr->ChangeExpansion( pDoc, nVirtNum, nNumPages, ->ChangeExpansion(nVirtNum, nNumPages);
pPageNr->ChangeExpansion(pDoc,
bVirt, nNumFmt > -1 ? &nNumFmt : 0); bVirt, nNumFmt > -1 ? &nNumFmt : 0);
} }
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment