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
class SwPageNumberFieldType : public SwFieldType
{
sal_Int16 nNumberingType;
sal_uInt16 nNum, nMax;
bool bVirtuell;
public:
SwPageNumberFieldType();
String& Expand( sal_uInt32 nFmt, short nOff, const String&, String& rRet ) const;
void ChangeExpansion( SwDoc* pDoc, sal_uInt16 nNum, sal_uInt16 nMax,
String& Expand( sal_uInt32 nFmt, short nOff, sal_uInt16 const nPageNumber,
sal_uInt16 const nMaxPage, const String&, String& rRet ) const;
void ChangeExpansion( SwDoc* pDoc,
sal_Bool bVirtPageNum, const sal_Int16* pNumFmt = 0 );
virtual SwFieldType* Copy() const;
};
......@@ -163,10 +163,18 @@ class SW_DLLPUBLIC SwPageNumberField : public SwField
String sUserStr;
sal_uInt16 nSubType;
short nOffset;
// fdo#58074 store page number in SwField, not SwFieldType
sal_uInt16 m_nPageNumber;
sal_uInt16 m_nMaxPage;
public:
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 SwField* Copy() const;
......
......@@ -107,19 +107,18 @@ using namespace nsSwDocInfoSubType;
SwPageNumberFieldType::SwPageNumberFieldType()
: SwFieldType( RES_PAGENUMBERFLD ),
nNumberingType( SVX_NUM_ARABIC ),
nNum( 0 ),
nMax( USHRT_MAX ),
bVirtuell( false )
{
}
String& SwPageNumberFieldType::Expand( sal_uInt32 nFmt, short nOff,
sal_uInt16 const nPageNumber, sal_uInt16 const nMaxPage,
const String& rUserStr, String& rRet ) const
{
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;
else if( SVX_NUM_CHAR_SPECIAL == nTmpFmt )
rRet = rUserStr;
......@@ -132,8 +131,6 @@ SwFieldType* SwPageNumberFieldType::Copy() const
{
SwPageNumberFieldType *pTmp = new SwPageNumberFieldType();
pTmp->nNum = nNum;
pTmp->nMax = nMax;
pTmp->nNumberingType = nNumberingType;
pTmp->bVirtuell = bVirtuell;
......@@ -144,12 +141,10 @@ SwFieldType* SwPageNumberFieldType::Copy() const
Beschreibung: Verschiedene Expandierung
--------------------------------------------------------------------*/
void SwPageNumberFieldType::ChangeExpansion( SwDoc* pDoc, sal_uInt16 nPage,
sal_uInt16 nNumPages, sal_Bool bVirt,
void SwPageNumberFieldType::ChangeExpansion( SwDoc* pDoc,
sal_Bool bVirt,
const sal_Int16* pNumFmt )
{
nNum = nPage;
nMax = nNumPages;
if( pNumFmt )
nNumberingType = *pNumFmt;
......@@ -186,11 +181,21 @@ void SwPageNumberFieldType::ChangeExpansion( SwDoc* pDoc, sal_uInt16 nPage,
--------------------------------------------------------------------*/
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)
, 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 sRet;
......@@ -198,23 +203,33 @@ String SwPageNumberField::Expand() const
if( PG_NEXT == nSubType && 1 != nOffset )
{
if( pFldType->Expand( GetFormat(), 1, sUserStr, sRet ).Len() )
pFldType->Expand( GetFormat(), nOffset, sUserStr, sRet );
if (pFldType->Expand(GetFormat(), 1, m_nPageNumber, m_nMaxPage,
sUserStr, sRet).Len())
{
pFldType->Expand(GetFormat(), nOffset, m_nPageNumber, m_nMaxPage,
sUserStr, sRet);
}
}
else if( PG_PREV == nSubType && -1 != nOffset )
{
if( pFldType->Expand( GetFormat(), -1, sUserStr, sRet ).Len() )
pFldType->Expand( GetFormat(), nOffset, sUserStr, sRet );
if (pFldType->Expand(GetFormat(), -1, m_nPageNumber, m_nMaxPage,
sUserStr, sRet).Len())
{
pFldType->Expand(GetFormat(), nOffset, m_nPageNumber, m_nMaxPage,
sUserStr, sRet);
}
}
else
pFldType->Expand( GetFormat(), nOffset, sUserStr, sRet );
pFldType->Expand(GetFormat(), nOffset, m_nPageNumber, m_nMaxPage,
sUserStr, sRet);
return sRet;
}
SwField* SwPageNumberField::Copy() const
{
SwPageNumberField *pTmp =
new SwPageNumberField((SwPageNumberFieldType*)GetTyp(), nSubType, GetFormat(), nOffset);
SwPageNumberField *pTmp = new SwPageNumberField(
static_cast<SwPageNumberFieldType*>(GetTyp()), nSubType,
GetFormat(), nOffset, m_nPageNumber, m_nMaxPage);
pTmp->SetLanguage( GetLanguage() );
pTmp->SetUserString( sUserStr );
return pTmp;
......
......@@ -169,8 +169,9 @@ SwExpandPortion *SwTxtFormatter::NewFldPortion( SwTxtFormatInfo &rInf,
sal_Int16 nNumFmt = -1;
if(SVX_NUM_PAGEDESC == pFld->GetFormat())
nNumFmt = pFrame->FindPageFrm()->GetPageDesc()->GetNumType().GetNumberingType();
pPageNr->ChangeExpansion( pDoc, nVirtNum, nNumPages,
static_cast<SwPageNumberField*>(pFld)
->ChangeExpansion(nVirtNum, nNumPages);
pPageNr->ChangeExpansion(pDoc,
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