blob: a52411cb611cef2868510e6df787e48a567b93c6 [file] [log] [blame]
/**************************************************************
*
* 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
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_sw.hxx"
#include <com/sun/star/text/ChapterFormat.hpp>
#include <doc.hxx>
#include <frame.hxx> // SwChapterFieldType::ChangeExpansion()
#include <pam.hxx> // fuer GetBodyTxtNode
#include <ndtxt.hxx>
#include <chpfld.hxx>
#include <expfld.hxx> // fuer GetBodyTxtNode
#ifndef _UNOFLDMID_H
#include <unofldmid.h>
#endif
#include <numrule.hxx>
using namespace ::com::sun::star;
/*--------------------------------------------------------------------
Beschreibung: SwChapterFieldType
--------------------------------------------------------------------*/
SwChapterFieldType::SwChapterFieldType()
: SwFieldType( RES_CHAPTERFLD )
{
}
SwFieldType* SwChapterFieldType::Copy() const
{
return new SwChapterFieldType();
}
/*--------------------------------------------------------------------
Beschreibung: Kapittelfeld
--------------------------------------------------------------------*/
SwChapterField::SwChapterField(SwChapterFieldType* pTyp, sal_uInt32 nFmt)
: SwField(pTyp, nFmt), nLevel( 0 )
{}
String SwChapterField::Expand() const
{
String sStr( sNumber );
switch( GetFormat() )
{
case CF_TITLE: sStr = sTitle; break;
case CF_NUMBER:
case CF_NUM_TITLE: sStr.Insert( sPre, 0 );
sStr += sPost;
if( CF_NUM_TITLE == GetFormat() )
sStr += sTitle;
break;
case CF_NUM_NOPREPST_TITLE: sStr += sTitle; break;
}
return sStr;
}
SwField* SwChapterField::Copy() const
{
SwChapterField *pTmp =
new SwChapterField((SwChapterFieldType*)GetTyp(), GetFormat());
pTmp->nLevel = nLevel;
pTmp->sTitle = sTitle;
pTmp->sNumber = sNumber;
pTmp->sPost = sPost;
pTmp->sPre = sPre;
return pTmp;
}
// --> OD 2008-02-14 #i53420#
//void SwChapterField::ChangeExpansion( const SwFrm* pFrm,
// const SwTxtNode* pTxtNd,
// sal_Bool bSrchNum )
//{
// ASSERT( pFrm, "in welchem Frame stehe ich denn?" )
// SwDoc* pDoc = (SwDoc*)pTxtNd->GetDoc();
// SwPosition aPos( pDoc->GetNodes().GetEndOfContent() );
// if( pFrm->IsInDocBody() )
// aPos.nNode = *pTxtNd;
// else if( 0 == (pTxtNd = GetBodyTxtNode( *pDoc, aPos, *pFrm )) )
// // kein TxtNode (Formatierung Kopf/Fusszeile)
// return;
// ChangeExpansion(*pTxtNd, bSrchNum);
//}
void SwChapterField::ChangeExpansion(const SwFrm* pFrm,
const SwCntntNode* pCntntNode,
sal_Bool bSrchNum )
{
ASSERT( pFrm, "in welchem Frame stehe ich denn?" )
SwDoc* pDoc = (SwDoc*)pCntntNode->GetDoc();
const SwTxtNode* pTxtNode = dynamic_cast<const SwTxtNode*>(pCntntNode);
if ( !pTxtNode || !pFrm->IsInDocBody() )
{
SwPosition aDummyPos( pDoc->GetNodes().GetEndOfContent() );
pTxtNode = GetBodyTxtNode( *pDoc, aDummyPos, *pFrm );
}
if ( pTxtNode )
{
ChangeExpansion( *pTxtNode, bSrchNum );
}
}
// <--
void SwChapterField::ChangeExpansion(const SwTxtNode &rTxtNd, sal_Bool bSrchNum)
{
//i120759,this function is for both the reference chapter field and normal chapter field
//bSrchNum can distinguish the two types,to the latter type,the outline num rule is must...
sNumber = aEmptyStr;
sTitle = aEmptyStr;
sPost = aEmptyStr;
sPre = aEmptyStr;
//The reference chapter field of normal num rule will be handled in this code segment
if (bSrchNum && !rTxtNd.IsOutline())
{
SwNumRule* pRule(rTxtNd.GetNumRule());
if (rTxtNd.IsCountedInList() && pRule)
{
sNumber = rTxtNd.GetNumString(false);
const SwNumFmt& rNFmt = pRule->Get(static_cast<unsigned short>(rTxtNd.GetActualListLevel()));
sPost = rNFmt.GetSuffix();
sPre = rNFmt.GetPrefix();
}
else
{
sNumber = String("??", RTL_TEXTENCODING_ASCII_US);
}
sTitle = rTxtNd.GetExpandTxt();
for( xub_StrLen i = 0; i < sTitle.Len(); ++i )
if( ' ' > sTitle.GetChar( i ) )
sTitle.Erase( i--, 1 );
}else
{
//End
SwDoc* pDoc = (SwDoc*)rTxtNd.GetDoc();
const SwTxtNode *pTxtNd = rTxtNd.FindOutlineNodeOfLevel( nLevel );
if( pTxtNd )
{
if( bSrchNum )
{
const SwTxtNode* pONd = pTxtNd;
do {
if( pONd && pONd->GetTxtColl() )
{
sal_uInt8 nPrevLvl = nLevel;
// --> OD 2008-04-02 #refactorlists#
// nLevel = GetRealLevel( pONd->GetTxtColl()->
// GetOutlineLevel() );
//ASSERT( pONd->GetOutlineLevel() >= 0 && pONd->GetOutlineLevel() < MAXLEVEL, //#outline level,zhaojianwei
// "<SwChapterField::ChangeExpansion(..)> - outline node with inconsistent outline level. Serious defect -> please inform OD." );
//nLevel = static_cast<sal_uInt8>(pONd->GetOutlineLevel());
ASSERT( pONd->GetAttrOutlineLevel() >= 0 && pONd->GetAttrOutlineLevel() <= MAXLEVEL,
"<SwChapterField::ChangeExpansion(..)> - outline node with inconsistent outline level. Serious defect -> please inform OD." );
nLevel = static_cast<sal_uInt8>(pONd->GetAttrOutlineLevel()); //<-end,zhaojianwei
// <--
if( nPrevLvl < nLevel )
nLevel = nPrevLvl;
else if( SVX_NUM_NUMBER_NONE != pDoc->GetOutlineNumRule()
->Get( nLevel ).GetNumberingType() )
{
pTxtNd = pONd;
break;
}
if( !nLevel-- )
break;
pONd = pTxtNd->FindOutlineNodeOfLevel( nLevel );
}
else
break;
} while( sal_True );
}
// nur die Nummer besorgen, ohne Pre-/Post-fixstrings
if ( pTxtNd->IsOutline() )
{
// --> OD 2005-11-17 #128041#
// correction of refactoring done by cws swnumtree:
// retrieve numbering string without prefix and suffix strings
// as stated in the above german comment.
sNumber = pTxtNd->GetNumString( false );
// <--
SwNumRule* pRule( pTxtNd->GetNumRule() );
if ( pTxtNd->IsCountedInList() && pRule )
{
const SwNumFmt& rNFmt = pRule->Get( static_cast<sal_uInt16>(pTxtNd->GetActualListLevel()) );
sPost = rNFmt.GetSuffix();
sPre = rNFmt.GetPrefix();
}
}
else
{
sNumber = String("??", RTL_TEXTENCODING_ASCII_US);
}
sTitle = pTxtNd->GetExpandTxt();
for( xub_StrLen i = 0; i < sTitle.Len(); ++i )
if( ' ' > sTitle.GetChar( i ) )
sTitle.Erase( i--, 1 );
}
}
}
/*-----------------05.03.98 16:19-------------------
--------------------------------------------------*/
sal_Bool SwChapterField::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
{
switch( nWhichId )
{
case FIELD_PROP_BYTE1:
rAny <<= (sal_Int8)nLevel;
break;
case FIELD_PROP_USHORT1:
{
sal_Int16 nRet;
switch( GetFormat() )
{
case CF_NUMBER: nRet = text::ChapterFormat::NUMBER; break;
case CF_TITLE: nRet = text::ChapterFormat::NAME; break;
case CF_NUMBER_NOPREPST:
nRet = text::ChapterFormat::DIGIT;
break;
case CF_NUM_NOPREPST_TITLE:
nRet = text::ChapterFormat::NO_PREFIX_SUFFIX;
break;
case CF_NUM_TITLE:
default: nRet = text::ChapterFormat::NAME_NUMBER;
}
rAny <<= nRet;
}
break;
default:
DBG_ERROR("illegal property");
}
return sal_True;
}
/*-----------------05.03.98 16:19-------------------
--------------------------------------------------*/
sal_Bool SwChapterField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
{
sal_Bool bRet = sal_True;
switch( nWhichId )
{
case FIELD_PROP_BYTE1:
{
sal_Int8 nTmp = 0;
rAny >>= nTmp;
if(nTmp >= 0 && nTmp < MAXLEVEL)
nLevel = nTmp;
else
bRet = sal_False;
break;
}
case FIELD_PROP_USHORT1:
{
sal_Int16 nVal = 0;
rAny >>= nVal;
switch( nVal )
{
case text::ChapterFormat::NAME: SetFormat(CF_TITLE); break;
case text::ChapterFormat::NUMBER: SetFormat(CF_NUMBER); break;
case text::ChapterFormat::NO_PREFIX_SUFFIX:
SetFormat(CF_NUM_NOPREPST_TITLE);
break;
case text::ChapterFormat::DIGIT:
SetFormat(CF_NUMBER_NOPREPST);
break;
//case text::ChapterFormat::NAME_NUMBER:
default: SetFormat(CF_NUM_TITLE);
}
}
break;
default:
DBG_ERROR("illegal property");
bRet = sal_False;
}
return bRet;
}