summaryrefslogtreecommitdiff
path: root/sw/source/core/fields/chpfld.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sw/source/core/fields/chpfld.cxx')
-rw-r--r--sw/source/core/fields/chpfld.cxx309
1 files changed, 309 insertions, 0 deletions
diff --git a/sw/source/core/fields/chpfld.cxx b/sw/source/core/fields/chpfld.cxx
new file mode 100644
index 000000000000..bfc14af1a7aa
--- /dev/null
+++ b/sw/source/core/fields/chpfld.cxx
@@ -0,0 +1,309 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 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)
+{
+ SwDoc* pDoc = (SwDoc*)rTxtNd.GetDoc();
+ const SwTxtNode *pTxtNd = rTxtNd.FindOutlineNodeOfLevel( nLevel );
+ if( pTxtNd )
+ {
+ if( bSrchNum )
+ {
+ const SwTxtNode* pONd = pTxtNd;
+ do {
+ if( pONd && pONd->GetTxtColl() )
+ {
+ BYTE 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<BYTE>(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<BYTE>(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<USHORT>(pTxtNd->GetActualListLevel()) );
+ sPost = rNFmt.GetSuffix();
+ sPre = rNFmt.GetPrefix();
+ }
+ else
+ sPost = aEmptyStr, sPre = aEmptyStr;
+ }
+ else
+ {
+ sPost = aEmptyStr;
+ sPre = aEmptyStr;
+ 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 );
+ }
+ else
+ {
+ sNumber = aEmptyStr;
+ sTitle = aEmptyStr;
+ sPost = aEmptyStr;
+ sPre = aEmptyStr;
+ }
+}
+
+/*-----------------05.03.98 16:19-------------------
+
+--------------------------------------------------*/
+BOOL SwChapterField::QueryValue( uno::Any& rAny, USHORT 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-------------------
+
+--------------------------------------------------*/
+BOOL SwChapterField::PutValue( const uno::Any& rAny, USHORT nWhichId )
+{
+ BOOL bRet = TRUE;
+ switch( nWhichId )
+ {
+ case FIELD_PROP_BYTE1:
+ {
+ sal_Int8 nTmp = 0;
+ rAny >>= nTmp;
+ if(nTmp >= 0 && nTmp < MAXLEVEL)
+ nLevel = nTmp;
+ else
+ bRet = 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 = FALSE;
+ }
+ return bRet;
+}