summaryrefslogtreecommitdiff
path: root/binfilter/bf_sw/source/core/doc/sw_docnum.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'binfilter/bf_sw/source/core/doc/sw_docnum.cxx')
-rw-r--r--binfilter/bf_sw/source/core/doc/sw_docnum.cxx943
1 files changed, 943 insertions, 0 deletions
diff --git a/binfilter/bf_sw/source/core/doc/sw_docnum.cxx b/binfilter/bf_sw/source/core/doc/sw_docnum.cxx
new file mode 100644
index 000000000000..ec98c2794da4
--- /dev/null
+++ b/binfilter/bf_sw/source/core/doc/sw_docnum.cxx
@@ -0,0 +1,943 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * 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.
+ *
+ ************************************************************************/
+
+
+#ifdef _MSC_VER
+#pragma hdrstop
+#endif
+
+#include <hintids.hxx>
+
+
+#include <ftninfo.hxx>
+#include <ftnidx.hxx>
+
+#include <horiornt.hxx>
+
+#include <doc.hxx>
+#include <ndtxt.hxx>
+#include <paratr.hxx>
+#include <docary.hxx>
+#include <mvsave.hxx>
+#include <txtfrm.hxx>
+#include <hints.hxx>
+#include <redline.hxx>
+#include <comcore.hrc>
+#include <bf_svx/adjitem.hxx>
+namespace binfilter {
+
+/*N*/ inline BYTE GetUpperLvlChg( BYTE nCurLvl, BYTE nLevel, USHORT nMask )
+/*N*/ {
+/*N*/ if( 1 < nLevel )
+/*N*/ {
+/*N*/ if( nCurLvl + 1 >= nLevel )
+/*N*/ nCurLvl -= nLevel - 1;
+/*N*/ else
+/*N*/ nCurLvl = 0;
+/*N*/ }
+/*N*/ return (nMask - 1) & ~(( 1 << nCurLvl ) - 1);
+/*N*/ }
+
+/*N*/ void SwDoc::SetOutlineNumRule( const SwNumRule& rRule )
+/*N*/ {
+/*N*/ USHORT nChkLevel = 0, nChgFmtLevel = 0;
+/*N*/ if( pOutlineRule )
+/*N*/ {
+/*N*/ USHORT nMask = 1;
+/*N*/ for( BYTE n = 0; n < MAXLEVEL; ++n, nMask <<= 1 )
+/*N*/ {
+/*N*/ const SwNumFmt& rOld = pOutlineRule->Get( n ),
+/*N*/ & rNew = rRule.Get( n );
+/*N*/ if( rOld != rNew )
+/*N*/ {
+/*N*/ nChgFmtLevel |= nMask;
+/*N*/ if( rOld.GetAbsLSpace() != rNew.GetAbsLSpace() ||
+/*N*/ rOld.GetFirstLineOffset() != rNew.GetFirstLineOffset() )
+/*N*/ nChkLevel |= nMask;
+/*N*/ }
+/*N*/ else if( SVX_NUM_NUMBER_NONE > rNew.GetNumberingType() && 1 < rNew.GetIncludeUpperLevels() &&
+/*N*/ 0 != (nChgFmtLevel & GetUpperLvlChg( n,
+/*N*/ rNew.GetIncludeUpperLevels(), nMask )) )
+/*?*/ nChgFmtLevel |= nMask;
+/*N*/ }
+/*N*/ (*pOutlineRule) = rRule;
+/*N*/ }
+/*N*/ else
+/*N*/ {
+/*?*/ nChgFmtLevel = nChkLevel = 0xffff;
+/*?*/ pOutlineRule = new SwNumRule( rRule );
+/*N*/ }
+/*N*/ pOutlineRule->SetRuleType( OUTLINE_RULE );
+/*N*/ pOutlineRule->SetName( String::CreateFromAscii(
+/*N*/ SwNumRule::GetOutlineRuleName() ));
+
+ // teste ob die evt. gesetzen CharFormate in diesem Document
+ // definiert sind
+/*N*/ pOutlineRule->CheckCharFmts( this );
+
+ // losche aus dem Array alle Nodes, die ohne Outline Nummerierung sind
+/*N*/ SwOutlineNodes& rArr = (SwOutlineNodes&)GetNodes().GetOutLineNds();
+/*N*/ {
+/*N*/ SwNodeNum aNoNum( NO_NUMBERING );
+/*N*/ for( USHORT n = 0; n < rArr.Count(); ++n )
+/*N*/ {
+/*N*/ SwTxtNode* pTxtNd = rArr[n]->GetTxtNode();
+/*N*/ if( pTxtNd && NO_NUMBERING == pTxtNd->GetTxtColl()->GetOutlineLevel() )
+/*N*/ {
+/*?*/ pTxtNd->UpdateOutlineNum( aNoNum );
+/*?*/ rArr.Remove( n-- );
+/*N*/ }
+/*N*/ }
+/*N*/ }
+/*N*/
+ // suche alle Nodes, die neu aufgenommen werden muessen !!
+ // (eigentlich koennte das auch per Modify am die Nodes propagiert
+ // werden !! )
+/*N*/ ULONG nStt = GetNodes().GetEndOfContent().StartOfSectionIndex();
+ USHORT n=0;
+/*N*/ for( n = 0; n < pTxtFmtCollTbl->Count(); ++n )
+/*N*/ {
+/*N*/ SwTxtFmtColl* pColl = (*pTxtFmtCollTbl)[ n ];
+/*N*/ BYTE nLevel = pColl->GetOutlineLevel();
+/*N*/ if( NO_NUMBERING != nLevel )
+/*N*/ {
+/*N*/ #ifndef NUM_RELSPACE
+/*N*/ // JP 08.07.98: Einzuege aus der Outline uebernehmen.
+/*N*/ // ??Aber nur wenn sie veraendert wurden??
+/*N*/ if( ( nLevel = GetRealLevel( nLevel )) < MAXLEVEL
+/*N*/ /*&& 0 != (nChkLevel & (1 << nLevel ))*/ )
+/*N*/ {
+/*N*/ SvxLRSpaceItem aLR( (SvxLRSpaceItem&)pColl->GetAttr( RES_LR_SPACE ) );
+/*N*/ const SwNumFmt& rNFmt = pOutlineRule->Get( nLevel );
+/*N*/
+/*N*/ // ohne Nummer immer ohne FirstLineOffset!!!!
+/*N*/ short nFOfst;
+/*N*/ if( pColl->GetOutlineLevel() & NO_NUMLEVEL )
+/*N*/ nFOfst = 0;
+/*N*/ else
+/*N*/ nFOfst = rNFmt.GetFirstLineOffset();
+/*N*/
+/*N*/ if( aLR.GetTxtLeft() != rNFmt.GetAbsLSpace() ||
+/*N*/ aLR.GetTxtFirstLineOfst() != nFOfst )
+/*N*/ {
+/*N*/ aLR.SetTxtFirstLineOfstValue( nFOfst );
+/*N*/ aLR.SetTxtLeft( rNFmt.GetAbsLSpace() );
+/*N*/
+/*N*/ pColl->SetAttr( aLR );
+/*N*/ }
+/*N*/ }
+/*N*/ #endif
+/*N*/ SwClientIter aIter( *pColl );
+/*N*/ for( SwTxtNode* pNd = (SwTxtNode*)aIter.First( TYPE( SwTxtNode ));
+/*N*/ pNd; pNd = (SwTxtNode*)aIter.Next() )
+/*N*/ if( pNd->GetNodes().IsDocNodes() && nStt < pNd->GetIndex() )
+/*N*/ rArr.Insert( pNd );
+/*N*/ }
+/*N*/ }
+/*N*/
+/*N*/ for( n = 0; n < rArr.Count(); ++n )
+/*N*/ {
+/*N*/ SwTxtNode* pNd = rArr[ n ]->GetTxtNode();
+/*N*/ ASSERT( pNd, "was ist das fuer ein Node?" );
+/*N*/ if( ( 1 << (pNd->GetTxtColl()->GetOutlineLevel() & ~NO_NUMLEVEL )
+/*N*/ & nChgFmtLevel ))
+/*?*/ pNd->NumRuleChgd();
+/*N*/ }
+/*N*/ GetNodes().UpdateOutlineNodes(); // update der Nummern
+/*N*/
+/*N*/ // gibt es Fussnoten && gilt Kapitelweises Nummerieren, dann updaten
+/*N*/ if( GetFtnIdxs().Count() && FTNNUM_CHAPTER == GetFtnInfo().eNum )
+/*?*/ GetFtnIdxs().UpdateAllFtn();
+/*N*/
+/*N*/ UpdateExpFlds();
+/*N*/
+/*N*/ SetModified();
+/*N*/ }
+
+
+
+ // Hoch-/Runterstufen
+
+
+
+ // Hoch-/Runter - Verschieben !
+
+
+
+
+
+
+ // zu diesem Gliederungspunkt
+
+
+ // JP 13.06.96:
+ // im Namen kann eine Nummer oder/und der Text stehen.
+ // zuerst wird ueber die Nummer versucht den richtigen Eintrag zu finden.
+ // Gibt es diesen, dann wird ueber den Text verglichen, od es der
+ // gewuenschte ist. Ist das nicht der Fall, wird noch mal nur ueber den
+ // Text gesucht. Wird dieser gefunden ist es der Eintrag. Ansonsten der,
+ // der ueber die Nummer gefunden wurde.
+ // Ist keine Nummer angegeben, dann nur den Text suchen.
+
+
+/*N*/ void SwDoc::SetOutlineLSpace( BYTE nLevel, short nFirstLnOfst, USHORT nLSpace )
+/*N*/ {
+/*N*/ if( MAXLEVEL >= nLevel )
+/*N*/ {
+/*N*/ const SwNumFmt& rNFmt = pOutlineRule->Get( nLevel );
+/*N*/ if( nLSpace != rNFmt.GetAbsLSpace() ||
+/*N*/ nFirstLnOfst != rNFmt.GetFirstLineOffset() )
+/*N*/ {
+/*N*/ SwNumFmt aFmt( rNFmt );
+/*N*/ aFmt.SetAbsLSpace( nLSpace );
+/*N*/ aFmt.SetFirstLineOffset( nFirstLnOfst );
+/*N*/ pOutlineRule->Set( nLevel, aFmt );
+/*N*/ }
+/*N*/ }
+/*N*/ }
+
+/* */
+
+// --- Nummerierung -----------------------------------------
+
+/*N*/ void SwNumRuleInfo::MakeList( SwDoc& rDoc )
+/*N*/ {
+/*N*/ SwModify* pMod;
+/*N*/ const SfxPoolItem* pItem;
+/*N*/ USHORT i, nMaxItems = rDoc.GetAttrPool().GetItemCount( RES_PARATR_NUMRULE);
+/*N*/ for( i = 0; i < nMaxItems; ++i )
+/*N*/ if( 0 != (pItem = rDoc.GetAttrPool().GetItem( RES_PARATR_NUMRULE, i ) ) &&
+/*N*/ 0 != ( pMod = (SwModify*)((SwNumRuleItem*)pItem)->GetDefinedIn()) &&
+/*N*/ ((SwNumRuleItem*)pItem)->GetValue().Len() &&
+/*N*/ ((SwNumRuleItem*)pItem)->GetValue() == rName )
+/*N*/ {
+/*N*/ if( pMod->IsA( TYPE( SwFmt )) )
+/*?*/ pMod->GetInfo( *this );
+/*N*/ else if( ((SwTxtNode*)pMod)->GetNodes().IsDocNodes() )
+/*N*/ AddNode( *(SwTxtNode*)pMod );
+/*N*/ }
+/*N*/ }
+
+
+/*N*/ void lcl_ChgNumRule( SwDoc& rDoc, const SwNumRule& rRule, SwHistory* pHist,
+/*N*/ SwNumRuleInfo* pRuleInfo = 0 )
+/*N*/ {
+/*N*/ SwNumRule* pOld = rDoc.FindNumRulePtr( rRule.GetName() );
+/*N*/ ASSERT( pOld, "ohne die alte NumRule geht gar nichts" );
+/*N*/
+/*N*/ USHORT nChkLevel = 0, nChgFmtLevel = 0, nMask = 1;
+/*N*/
+ BYTE n=0;
+/*N*/ for( n = 0; n < MAXLEVEL; ++n, nMask <<= 1 )
+/*N*/ {
+/*N*/ const SwNumFmt& rOldFmt = pOld->Get( n ),
+/*N*/ & rNewFmt = rRule.Get( n );
+/*N*/
+/*N*/ if( rOldFmt != rNewFmt )
+/*N*/ {
+/*N*/ nChgFmtLevel |= nMask;
+/*N*/ if( rOldFmt.GetAbsLSpace() != rNewFmt.GetAbsLSpace() ||
+/*N*/ rOldFmt.GetFirstLineOffset() != rNewFmt.GetFirstLineOffset() )
+/*N*/ nChkLevel |= nMask;
+/*N*/ }
+/*N*/ else if( SVX_NUM_NUMBER_NONE > rNewFmt.GetNumberingType() && 1 < rNewFmt.GetIncludeUpperLevels() &&
+/*N*/ 0 != (nChgFmtLevel & GetUpperLvlChg( n, rNewFmt.GetIncludeUpperLevels(),nMask )) )
+/*?*/ nChgFmtLevel |= nMask;
+/*N*/ }
+/*N*/
+/*N*/ if( !nChgFmtLevel ) // es wurde nichts veraendert?
+/*N*/ {
+/*N*/ pOld->CheckCharFmts( &rDoc );
+/*N*/ pOld->SetContinusNum( rRule.IsContinusNum() );
+/*N*/ return ;
+/*N*/ }
+/*N*/
+/*N*/ SwNumRuleInfo* pUpd;
+/*N*/ if( !pRuleInfo )
+/*N*/ {
+/*N*/ pUpd = new SwNumRuleInfo( rRule.GetName() );
+/*N*/ pUpd->MakeList( rDoc );
+/*N*/ }
+/*N*/ else
+/*?*/ pUpd = pRuleInfo;
+/*N*/
+/*N*/ BYTE nLvl;
+/*N*/ for( ULONG nFirst = 0, nLast = pUpd->GetList().Count();
+/*N*/ nFirst < nLast; ++nFirst )
+/*N*/ {
+/*?*/ SwTxtNode* pTxtNd = pUpd->GetList().GetObject( nFirst );
+/*?*/ if( pTxtNd->GetNum() && ( nLvl = (~NO_NUMLEVEL &
+/*?*/ pTxtNd->GetNum()->GetLevel() ) ) < MAXLEVEL )
+/*?*/ {
+/*?*/ if( nChgFmtLevel & ( 1 << nLvl ))
+/*?*/ {
+/*?*/ pTxtNd->NumRuleChgd();
+/*?*/
+/*?*/ #ifndef NUM_RELSPACE
+/*?*/ if( nChkLevel && (nChkLevel & ( 1 << nLvl )) &&
+/*?*/ pOld->IsRuleLSpace( *pTxtNd ) )
+/*?*/ pTxtNd->SetNumLSpace( TRUE );
+/*?*/
+/*?*/ if( pHist )
+/*?*/ {
+/*?*/ const SfxPoolItem& rItem =
+/*?*/ pTxtNd->SwCntntNode::GetAttr( RES_LR_SPACE );
+/*?*/ pHist->Add( &rItem, &rItem, pTxtNd->GetIndex() );
+/*?*/ }
+/*?*/ #endif
+/*?*/ }
+/*?*/ }
+/*N*/ }
+/*N*/
+/*N*/ for( n = 0; n < MAXLEVEL; ++n )
+/*N*/ if( nChgFmtLevel & ( 1 << n ))
+/*N*/ pOld->Set( n, rRule.GetNumFmt( n ));
+/*N*/
+/*N*/ pOld->CheckCharFmts( &rDoc );
+/*N*/ pOld->SetInvalidRule( TRUE );
+/*N*/ pOld->SetContinusNum( rRule.IsContinusNum() );
+/*N*/
+/*N*/ if( !pRuleInfo )
+/*N*/ delete pUpd;
+/*N*/ }
+
+/*N*/ void SwDoc::SetNumRule( const SwPaM& rPam, const SwNumRule& rRule,
+/*N*/ sal_Bool bSetAbsLSpace, sal_Bool bCalledFromShell )
+/*N*/ {
+/*N*/ ULONG nPamPos = rPam.Start()->nNode.GetIndex();
+/*N*/ BOOL bSetItem = TRUE;
+/*N*/ SwNumRule* pNew = FindNumRulePtr( rRule.GetName() );
+/*N*/
+/*N*/ if( !pNew )
+/*N*/ {
+/*N*/ pNew = (*pNumRuleTbl)[ MakeNumRule( rRule.GetName(), &rRule ) ];
+/*N*/
+ /* #109308# If called from a shell propagate an existing
+ adjust item at the beginning am rPam into the new
+ numbering rule. */
+/*N*/ if (bCalledFromShell)
+/*N*/ {
+/*N*/ SwCntntNode * pCntntNode = rPam.GetCntntNode();
+/*N*/
+/*N*/ if (pCntntNode)
+/*N*/ {
+/*N*/ SwAttrSet & rAttrSet = pCntntNode->GetSwAttrSet();
+/*N*/ const SfxPoolItem * pItem = NULL;
+/*N*/
+/*N*/ if (SFX_ITEM_SET == rAttrSet.GetItemState(RES_PARATR_ADJUST,
+/*N*/ TRUE,
+/*N*/ &pItem))
+/*N*/ pNew->SetNumAdjust(((SvxAdjustItem *) pItem)->GetAdjust());
+/*N*/ }
+/*N*/ }
+/*N*/
+/*N*/ }
+/*N*/ else if( rRule.IsAutoRule() && !(*pNew == rRule) )
+/*N*/ {DBG_BF_ASSERT(0, "STRIP"); //STRIP001
+/*N*/ }
+/*N*/
+/*N*/ if( bSetItem )
+/*N*/ {
+/*N*/ Insert( rPam, SwNumRuleItem( pNew->GetName() ) );
+/*N*/ }
+/*N*/ UpdateNumRule( pNew->GetName(), nPamPos );
+/*N*/
+/*N*/ SetModified();
+/*N*/ }
+
+/*N*/ void SwDoc::SetNumRuleStart( const SwPosition& rPos, BOOL bFlag )
+/*N*/ {
+DBG_BF_ASSERT(0, "STRIP"); //STRIP001 SwTxtNode* pTxtNd = rPos.nNode.GetNode().GetTxtNode();
+/*N*/ }
+
+/*N*/ void SwDoc::SetNodeNumStart( const SwPosition& rPos, USHORT nStt )
+/*N*/ {
+/*N*/ SwTxtNode* pTxtNd = rPos.nNode.GetNode().GetTxtNode();
+/*N*/ const SwNumRule* pRule;
+/*N*/ if( pTxtNd && pTxtNd->GetNum() && 0 != ( pRule = pTxtNd->GetNumRule() )
+/*N*/ && nStt != pTxtNd->GetNum()->GetSetValue() )
+/*N*/ {
+/*N*/ SwNodeNum aNum( *pTxtNd->GetNum() );
+/*N*/ aNum.SetSetValue( nStt );
+/*N*/ pTxtNd->UpdateNum( aNum );
+/*N*/ UpdateNumRule( pRule->GetName(), USHRT_MAX != nStt
+/*N*/ ? rPos.nNode.GetIndex() : ULONG_MAX );
+/*N*/ SetModified();
+/*N*/ }
+/*N*/ }
+
+ // loeschen geht nur, wenn die Rule niemand benutzt!
+/*N*/ BOOL SwDoc::DelNumRule( const String& rName )
+/*N*/ {
+/*N*/ USHORT nPos = FindNumRule( rName );
+/*N*/ if( USHRT_MAX != nPos && !IsUsed( *(*pNumRuleTbl)[ nPos ] ))
+/*N*/ {
+/*N*/ pNumRuleTbl->DeleteAndDestroy( nPos );
+/*N*/ SetModified();
+/*N*/ return TRUE;
+/*N*/ }
+/*N*/ return FALSE;
+/*N*/ }
+
+/*N*/ void SwDoc::ChgNumRuleFmts( const SwNumRule& rRule )
+/*N*/ {
+/*N*/ SwNumRule* pRule = FindNumRulePtr( rRule.GetName() );
+/*N*/ if( pRule )
+/*N*/ {
+/*N*/ SwHistory* pHistory = 0;
+/*N*/ ::binfilter::lcl_ChgNumRule( *this, rRule, pHistory );
+/*N*/
+/*N*/ SetModified();
+/*N*/ }
+/*N*/ }
+
+/*N*/ void SwDoc::StopNumRuleAnimations( OutputDevice* pOut )
+/*N*/ {
+/*N*/ for( USHORT n = GetNumRuleTbl().Count(); n; )
+/*N*/ {
+/*N*/ SwNumRuleInfo aUpd( GetNumRuleTbl()[ --n ]->GetName() );
+/*N*/ aUpd.MakeList( *this );
+/*N*/
+/*N*/ for( ULONG nFirst = 0, nLast = aUpd.GetList().Count();
+/*N*/ nFirst < nLast; ++nFirst )
+/*N*/ {
+/*N*/ SwTxtNode* pTNd = aUpd.GetList().GetObject( nFirst );
+/*N*/
+/*N*/ SwClientIter aIter( *pTNd );
+/*N*/ for( SwFrm* pFrm = (SwFrm*)aIter.First( TYPE(SwFrm) );
+/*N*/ pFrm; pFrm = (SwFrm*)aIter.Next() )
+/*N*/ if( ((SwTxtFrm*)pFrm)->HasAnimation() )
+/*?*/ {DBG_BF_ASSERT(0, "STRIP"); }//STRIP001 ((SwTxtFrm*)pFrm)->StopAnimation( pOut );
+/*N*/ }
+/*N*/ }
+/*N*/ }
+
+
+
+/*N*/ BOOL SwDoc::DelNumRules( const SwPaM& rPam )
+/*N*/ {
+ DBG_BF_ASSERT(0, "STRIP"); return FALSE;//STRIP001 ULONG nStt = rPam.GetPoint()->nNode.GetIndex(),
+/*N*/ }
+
+
+ // zum naechsten/vorhergehenden Punkt auf gleicher Ebene
+
+
+
+
+
+
+
+
+/*N*/ BOOL SwDoc::NumUpDown( const SwPaM& rPam, BOOL bDown )
+/*N*/ {
+/*N*/ ULONG nStt = rPam.GetPoint()->nNode.GetIndex(),
+/*N*/ nEnd = rPam.GetMark()->nNode.GetIndex();
+/*N*/ if( nStt > nEnd )
+/*N*/ {
+/*?*/ ULONG nTmp = nStt; nStt = nEnd; nEnd = nTmp;
+/*N*/ }
+/*N*/
+/*N*/ signed char nDiff = bDown ? 1 : -1;
+/*N*/
+/*N*/ BOOL bRet = FALSE;
+/*N*/ String sNumRule;
+/*N*/ const SfxPoolItem* pItem;
+/*N*/ const String* pName;
+/*N*/ for( ; nStt <= nEnd; ++nStt )
+/*N*/ {
+/*N*/ SwTxtNode* pTNd = GetNodes()[ nStt ]->GetTxtNode();
+/*N*/ if( pTNd && 0 != ( pItem = pTNd->GetNoCondAttr(
+/*N*/ RES_PARATR_NUMRULE, TRUE ) ) &&
+/*N*/ ( pName = &((SwNumRuleItem*)pItem)->GetValue())->Len() )
+/*N*/ {
+/*N*/ BYTE nLevel = pTNd->GetNum()->GetLevel();
+/*N*/ if( ( -1 == nDiff && 0 < ( nLevel & ~NO_NUMLEVEL )) ||
+/*N*/ ( 1 == nDiff && MAXLEVEL - 1 > ( nLevel & ~NO_NUMLEVEL ) ) )
+/*N*/ {
+/*N*/ nLevel += nDiff;
+/*N*/ SwNodeNum aNum( *pTNd->GetNum() );
+/*N*/ aNum.SetLevel( nLevel );
+/*N*/
+/*N*/ pTNd->UpdateNum( aNum );
+/*N*/ #ifndef NUM_RELSPACE
+/*N*/ pTNd->SetNumLSpace( TRUE );
+/*N*/ #endif
+/*N*/ if( *pName != sNumRule )
+/*N*/ {
+/*N*/ sNumRule = *pName;
+/*N*/ SwNumRule* pRule = FindNumRulePtr( *pName );
+/*N*/ pRule->SetInvalidRule( TRUE );
+/*N*/ }
+/*N*/ bRet = TRUE;
+/*N*/ }
+/*N*/ }
+/*N*/ }
+/*N*/
+/*N*/ if( bRet )
+/*N*/ {
+/*N*/ UpdateNumRule();
+/*N*/ SetModified();
+/*N*/ }
+/*N*/ return bRet;
+/*N*/ }
+
+
+
+/*N*/ SwNumRule* SwDoc::GetCurrNumRule( const SwPosition& rPos ) const
+/*N*/ {
+/*N*/ SwNumRule* pRet = 0;
+/*N*/ const SfxPoolItem* pItem;
+/*N*/ SwTxtNode* pTNd = rPos.nNode.GetNode().GetTxtNode();
+/*N*/
+/*N*/ if( pTNd && 0 != ( pItem = pTNd->GetNoCondAttr( RES_PARATR_NUMRULE, TRUE ) ) &&
+/*N*/ ((SwNumRuleItem*)pItem)->GetValue().Len() )
+/*N*/ pRet = FindNumRulePtr( ((SwNumRuleItem*)pItem)->GetValue() );
+/*N*/ return pRet;
+/*N*/ }
+
+/*N*/ USHORT SwDoc::FindNumRule( const String& rName ) const
+/*N*/ {
+/*N*/ for( USHORT n = pNumRuleTbl->Count(); n; )
+/*N*/ if( (*pNumRuleTbl)[ --n ]->GetName() == rName )
+/*N*/ return n;
+/*
+//JP 20.11.97: sollte man im Find neue Rule anlegen??
+ erstmal nicht
+ USHORT nPoolId = GetPoolId( rName, GET_POOLID_NUMRULE );
+ if( USHRT_MAX != nPoolId )
+ {
+ SwDoc* pThis = (SwDoc*)this;
+ SwNumRule* pR = pThis->GetNumRuleFromPool( nPoolId );
+ for( n = pNumRuleTbl->Count(); n; )
+ if( (*pNumRuleTbl)[ --n ] == pR )
+ return n;
+ }
+*/
+/*N*/ return USHRT_MAX;
+/*N*/ }
+
+/*N*/ SwNumRule* SwDoc::FindNumRulePtr( const String& rName ) const
+/*N*/ {
+/*N*/ for( USHORT n = pNumRuleTbl->Count(); n; )
+/*N*/ if( (*pNumRuleTbl)[ --n ]->GetName() == rName )
+/*N*/ return (*pNumRuleTbl)[ n ];
+/*N*/
+/*
+//JP 20.11.97: sollte man im Find neue Rule anlegen??
+ erstmal nicht
+ USHORT nPoolId = GetPoolId( rName, GET_POOLID_NUMRULE );
+ if( USHRT_MAX != nPoolId )
+ {
+ SwDoc* pThis = (SwDoc*)this;
+ return pThis->GetNumRuleFromPool( nPoolId );
+ }
+*/
+/*N*/ return 0;
+/*N*/ }
+
+/*N*/ USHORT SwDoc::MakeNumRule( const String &rName, const SwNumRule* pCpy )
+/*N*/ {
+/*N*/ SwNumRule* pNew;
+/*N*/ if( pCpy )
+/*N*/ {
+/*N*/ pNew = new SwNumRule( *pCpy );
+/*N*/ pNew->SetName( GetUniqueNumRuleName( &rName ));
+/*N*/ if( pNew->GetName() != rName )
+/*N*/ {
+/*?*/ pNew->SetPoolFmtId( USHRT_MAX );
+/*?*/ pNew->SetPoolHelpId( USHRT_MAX );
+/*?*/ pNew->SetPoolHlpFileId( UCHAR_MAX );
+/*N*/ }
+/*N*/ pNew->CheckCharFmts( this );
+/*N*/ }
+/*N*/ else
+/*N*/ pNew = new SwNumRule( GetUniqueNumRuleName( &rName ) );
+/*N*/ USHORT nRet = pNumRuleTbl->Count();
+/*N*/ pNumRuleTbl->Insert( pNew, nRet );
+/*N*/ return nRet;
+/*N*/ }
+/*N*/
+/*N*/ String SwDoc::GetUniqueNumRuleName( const String* pChkStr, BOOL bAutoNum ) const
+/*N*/ {
+/*N*/ String aName;
+/*N*/ if( bAutoNum )
+/*N*/ {
+/*N*/ long n = Time().GetTime();
+/*N*/ n += Date().GetDate();
+/*N*/ aName = String::CreateFromInt32( n );
+/*N*/ if( pChkStr && !pChkStr->Len() )
+/*N*/ pChkStr = 0;
+/*N*/ }
+/*N*/ else if( pChkStr && pChkStr->Len() )
+/*N*/ aName = *pChkStr;
+/*N*/ else
+/*N*/ {
+/*?*/ pChkStr = 0;
+/*?*/ aName = SW_RESSTR( STR_NUMRULE_DEFNAME );
+/*N*/ }
+/*N*/
+/*N*/ USHORT nNum, nTmp, nFlagSize = ( pNumRuleTbl->Count() / 8 ) +2;
+/*N*/ BYTE* pSetFlags = new BYTE[ nFlagSize ];
+/*N*/ memset( pSetFlags, 0, nFlagSize );
+/*N*/
+/*N*/ xub_StrLen nNmLen = aName.Len();
+/*N*/ if( !bAutoNum && pChkStr )
+/*N*/ {
+/*?*/ while( nNmLen-- && '0' <= aName.GetChar( nNmLen ) &&
+/*?*/ '9' >= aName.GetChar( nNmLen ) )
+/*?*/ ; //nop
+/*?*/
+/*?*/ if( ++nNmLen < aName.Len() )
+/*?*/ {
+/*?*/ aName.Erase( nNmLen );
+/*?*/ pChkStr = 0;
+/*?*/ }
+/*N*/ }
+/*N*/
+/*N*/ const SwNumRule* pNumRule;
+ USHORT n=0;
+/*N*/ for( n = 0; n < pNumRuleTbl->Count(); ++n )
+/*N*/ if( 0 != ( pNumRule = (*pNumRuleTbl)[ n ] ) )
+/*N*/ {
+/*N*/ const String& rNm = pNumRule->GetName();
+/*N*/ if( rNm.Match( aName ) == nNmLen )
+/*N*/ {
+/*N*/ // Nummer bestimmen und das Flag setzen
+/*N*/ nNum = rNm.Copy( nNmLen ).ToInt32();
+/*N*/ if( nNum-- && nNum < pNumRuleTbl->Count() )
+/*N*/ pSetFlags[ nNum / 8 ] |= (0x01 << ( nNum & 0x07 ));
+/*N*/ }
+/*N*/ if( pChkStr && pChkStr->Equals( rNm ) )
+/*N*/ pChkStr = 0;
+/*N*/ }
+/*N*/
+/*N*/ if( !pChkStr )
+/*N*/ {
+/*N*/ // alle Nummern entsprechend geflag, also bestimme die richtige Nummer
+/*N*/ nNum = pNumRuleTbl->Count();
+/*N*/ for( n = 0; n < nFlagSize; ++n )
+/*N*/ if( 0xff != ( nTmp = pSetFlags[ n ] ))
+/*N*/ {
+/*N*/ // also die Nummer bestimmen
+/*N*/ nNum = n * 8;
+/*N*/ while( nTmp & 1 )
+/*N*/ ++nNum, nTmp >>= 1;
+/*N*/ break;
+/*N*/ }
+/*N*/
+/*N*/ }
+/*N*/ delete [] pSetFlags;
+/*N*/ if( pChkStr && pChkStr->Len() )
+/*N*/ return *pChkStr;
+/*N*/ return aName += String::CreateFromInt32( ++nNum );
+/*N*/ }
+
+/*N*/ const SwNode* lcl_FindBaseNode( const SwNode& rNd )
+/*N*/ {
+/*N*/ const SwNodes& rNds = rNd.GetNodes();
+/*N*/ ULONG nNdIdx = rNd.GetIndex();
+/*N*/ if( nNdIdx > rNds.GetEndOfExtras().GetIndex() )
+/*N*/ return rNds.GetEndOfContent().FindStartNode();
+/*N*/
+/*N*/ const SwNode* pSttNd = rNds[ ULONG(0) ]->FindStartNode();
+/*N*/ const SwNode* pNd = rNd.FindStartNode();
+/*N*/ while( pSttNd != pNd->FindStartNode()->FindStartNode() )
+/*?*/ pNd = pNd->FindStartNode();
+/*N*/ return pNd;
+/*N*/ }
+
+
+/*N*/ void SwDoc::UpdateNumRule()
+/*N*/ {
+/*N*/ SwNumRuleTbl& rNmTbl = GetNumRuleTbl();
+/*N*/ for( USHORT n = 0; n < rNmTbl.Count(); ++n )
+/*N*/ if( rNmTbl[ n ]->IsInvalidRule() )
+/*N*/ UpdateNumRule( rNmTbl[ n ]->GetName(), ULONG_MAX );
+/*N*/ }
+/*N*/
+/*N*/ void SwDoc::UpdateNumRule( const String& rName, ULONG nUpdPos )
+/*N*/ {
+/*N*/ SwNumRuleInfo aUpd( rName );
+/*N*/ aUpd.MakeList( *this );
+/*N*/
+/*N*/ if( ULONG_MAX == nUpdPos )
+/*N*/ nUpdPos = 0;
+/*N*/ else
+/*N*/ aUpd.GetList().SearchKey( nUpdPos, &nUpdPos );
+/*N*/
+/*N*/ SwNumRule* pRule = FindNumRulePtr( rName );
+/*N*/ if( nUpdPos < aUpd.GetList().Count() )
+/*N*/ {
+/*N*/ USHORT nInitLevels = USHRT_MAX; // Bitfeld fuer die Levels!
+/*N*/ // TRUE: starte mit NumFmt Start
+/*N*/ USHORT nNumVal = 0;
+/*N*/ SwNodeNum aNum( 0 );
+/*N*/
+/*N*/ if( pRule->IsContinusNum() )
+/*?*/ nNumVal = pRule->Get( 0 ).GetStart();
+/*N*/
+/*N*/ SwTxtNode* pStt = aUpd.GetList().GetObject( nUpdPos );
+/*N*/ SwTxtNode* pPrev = nUpdPos ? aUpd.GetList().GetObject( nUpdPos-1 ) : 0;
+/*N*/ const SwNode* pBaseNd = lcl_FindBaseNode( *pStt );
+/*N*/ if( pPrev && lcl_FindBaseNode( *pPrev ) == pBaseNd )
+/*N*/ {
+/*N*/ if( pPrev->GetNum() )
+/*N*/ {
+/*N*/ const SwNodeNum* pPrevNdNum = pPrev->GetNum();
+/*N*/ if( pPrevNdNum->GetLevel() & NO_NUMLEVEL )
+/*N*/ {
+/*N*/ // OD 10.12.2002 #106111# - use correct search level
+/*N*/ BYTE nSrchLvl = GetRealLevel( pStt->GetNum()->GetLevel() );
+/*N*/ pPrevNdNum = 0;
+/*N*/ ULONG nArrPos = nUpdPos-1;
+/*N*/ while( nArrPos-- )
+/*N*/ {
+/*N*/ pPrev = aUpd.GetList().GetObject( nArrPos );
+/*N*/ if( lcl_FindBaseNode( *pPrev ) != pBaseNd )
+/*N*/ break;
+/*N*/
+/*N*/ if( 0 != ( pPrevNdNum = pPrev->GetNum() ))
+/*N*/ {
+/*N*/ // uebergeordnete Ebene
+/*N*/ if( nSrchLvl > (pPrevNdNum->GetLevel() &~ NO_NUMLEVEL))
+/*N*/ {
+/*N*/ pPrevNdNum = 0;
+/*N*/ break;
+/*N*/ }
+/*N*/ // gleiche Ebene und kein NO_NUMLEVEL
+/*N*/ if( nSrchLvl == (pPrevNdNum->GetLevel() &~ NO_NUMLEVEL)
+/*N*/ && !( pPrevNdNum->GetLevel() & NO_NUMLEVEL ))
+/*N*/ break;
+/*N*/
+/*N*/ pPrevNdNum = 0;
+/*N*/ }
+/*N*/ }
+/*N*/ }
+/*N*/
+/*N*/ if( pPrevNdNum )
+/*N*/ {
+/*N*/ aNum = *pPrevNdNum;
+/*N*/ aNum.SetStart( FALSE );
+/*N*/ aNum.SetSetValue( USHRT_MAX );
+/*N*/ }
+/*N*/ }
+/*N*/ nInitLevels = 0;
+/*N*/ // OD 10.12.2002 #106111# - sublevels have to be restarted.
+/*N*/ for ( int nSubLvl = GetRealLevel( aNum.GetLevel() ) + 1; nSubLvl < MAXLEVEL; ++nSubLvl)
+/*N*/ nInitLevels |= ( 1 << nSubLvl );
+/*N*/ nNumVal = aNum.GetLevelVal()[ GetRealLevel( aNum.GetLevel() ) ];
+/*N*/ }
+/*N*/
+/*N*/ const SwNode* pOutlNd = 0;
+/*N*/ for( ; nUpdPos < aUpd.GetList().Count(); ++nUpdPos )
+/*N*/ {
+/*N*/ pStt = aUpd.GetList().GetObject( nUpdPos );
+/*N*/
+/*N*/ const SwNode* pTmpBaseNd = lcl_FindBaseNode( *pStt );
+/*N*/ if( pTmpBaseNd != pBaseNd )
+/*N*/ {
+/*?*/ aNum.SetLevel( 0 );
+/*?*/ memset( aNum.GetLevelVal(), 0,
+/*?*/ (MAXLEVEL) * sizeof( aNum.GetLevelVal()[0]) );
+/*?*/ pBaseNd = pTmpBaseNd;
+/*N*/ }
+/*N*/
+/*N*/ BYTE nLevel = aNum.GetLevel();
+/*N*/ BYTE nNdOldLvl = MAXLEVEL;
+/*N*/ if( pStt->GetNum() )
+/*N*/ {
+/*N*/ if( NO_NUMBERING != pStt->GetNum()->GetLevel() )
+/*N*/ nNdOldLvl = nLevel = pStt->GetNum()->GetLevel();
+/*N*/ if( pStt->GetNum()->IsStart() )
+/*N*/ {
+/*?*/ aNum.SetStart( TRUE );
+/*?*/ // OD 10.12.2002 #106111# - correct reset of level numbers
+/*?*/ for ( int nSubLvl = nLevel; nSubLvl < MAXLEVEL; ++nSubLvl)
+/*?*/ aNum.GetLevelVal()[ nSubLvl ] = 0;
+/*?*/ if( pRule->IsContinusNum() )
+/*?*/ {
+/*?*/ nNumVal = pRule->Get( 0 ).GetStart();
+/*?*/ nInitLevels |= 1;
+/*?*/ }
+/*?*/ else
+/*?*/ nInitLevels |= ( 1 << GetRealLevel( nLevel ));
+/*N*/ }
+/*N*/ else if( USHRT_MAX != pStt->GetNum()->GetSetValue() )
+/*N*/ {
+/*N*/ aNum.SetSetValue( nNumVal = pStt->GetNum()->GetSetValue() );
+/*N*/ // OD 10.12.2002 #106111# - init <nInitLevels> for continues
+/*N*/ // numbering.
+/*N*/ if( pRule->IsContinusNum() )
+/*N*/ nInitLevels |= 1;
+/*N*/ }
+/*N*/ }
+/*N*/
+/*N*/ if( NO_NUMLEVEL & nLevel ) // NoNum mit Ebene
+/*N*/ {
+/*N*/ BYTE nPrevLvl = GetRealLevel( aNum.GetLevel() ),
+/*N*/ nCurrLvl = GetRealLevel( nLevel );
+/*N*/
+/*N*/ if( nPrevLvl < nCurrLvl )
+/*N*/ {
+/*N*/ if( !(nInitLevels & ( 1 << nPrevLvl )) )
+/*N*/ ++nPrevLvl;
+/*N*/ for( ; nPrevLvl < nCurrLvl; ++nPrevLvl )
+/*?*/ nInitLevels |= ( 1 << nPrevLvl );
+/*N*/ }
+/*N*/
+/*N*/ aNum.SetLevel( nLevel );
+/*N*/ pStt->UpdateNum( aNum );
+/*N*/ }
+/*N*/ else if( NO_NUM != nLevel )
+/*N*/ {
+/*N*/ // beim Format mit Bitmap die Graphicen schon mal anfordern
+/*N*/ const SwNumFmt* pNumFmt = pRule->GetNumFmt( GetRealLevel( nLevel ));
+/*N*/ if( pNumFmt && SVX_NUM_BITMAP == pNumFmt->GetNumberingType() )
+/*?*/ pNumFmt->GetGraphic();
+/*N*/
+/*N*/ if( pRule->IsContinusNum() )
+/*N*/ {
+/*N*/ if( !(nInitLevels & 1) &&
+/*N*/ !( pNumFmt && (SVX_NUM_CHAR_SPECIAL == pNumFmt->GetNumberingType() ||
+/*N*/ SVX_NUM_BITMAP == pNumFmt->GetNumberingType() ||
+/*N*/ SVX_NUM_NUMBER_NONE == pNumFmt->GetNumberingType() )))
+/*?*/ ++nNumVal;
+/*?*/ aNum.GetLevelVal()[ nLevel ] = nNumVal;
+/*?*/ // OD 10.12.2002 #106111# - reset <nInitLevels>
+/*?*/ nInitLevels &= ~1;
+/*N*/ }
+/*N*/ else
+/*N*/ {
+/*N*/ BYTE nPrevLvl = GetRealLevel( aNum.GetLevel() );
+/*N*/ if( nPrevLvl < nLevel )
+/*N*/ {
+/*N*/ // Erfrage wie geloescht werden soll:
+/*N*/ // z.B von Stufe 0 -> 1: 1 -> 0.1 ; wenn nStart = 1
+/*N*/ // aber Stufe 1 -> 2: 1.1 -> 1.1.1 !!, nur 0.1 -> 0.0.1
+/*N*/ if( !(nInitLevels & ( 1 << nPrevLvl )) )
+/*N*/ ++nPrevLvl;
+/*N*/
+/*N*/ for( int ii = nPrevLvl; ii < nLevel; ++ii )
+/*N*/ {
+/*N*/ nInitLevels &= ~( 1 << ii );
+/*N*/ aNum.GetLevelVal()[ ii ] =
+/*N*/ pRule->Get( ii ).GetStart();
+/*N*/ }
+/*N*/ aNum.GetLevelVal()[ nLevel ] =
+/*N*/ USHRT_MAX == aNum.GetSetValue()
+/*N*/ ? pRule->Get( nLevel ).GetStart()
+/*N*/ : aNum.GetSetValue();
+/*N*/ }
+/*N*/ else if( USHRT_MAX != aNum.GetSetValue() )
+/*N*/ aNum.GetLevelVal()[ nLevel ] = aNum.GetSetValue();
+/*N*/ else if( nInitLevels & ( 1 << nLevel ))
+/*N*/ aNum.GetLevelVal()[ nLevel ] =
+/*N*/ pRule->Get( nLevel ).GetStart();
+/*N*/ else
+/*N*/ aNum.GetLevelVal()[ nLevel ]++;
+/*N*/ }
+/*N*/ nInitLevels &= ~( 1 << nLevel );
+/*N*/ aNum.SetLevel( nLevel );
+/*N*/
+/*N*/ // OD 10.12.2002 #106111# - reset numbers of all sublevels and
+/*N*/ // note in <nInitLevels> that numbering of all sublevels have
+/*N*/ // to be restarted.
+/*N*/ for ( int nSubLvl = nLevel+1; nSubLvl < MAXLEVEL; ++nSubLvl)
+/*N*/ {
+/*N*/ aNum.GetLevelVal()[ nSubLvl ] = 0;
+/*N*/ nInitLevels |= ( 1 << nSubLvl );
+/*N*/ }
+/*N*/
+/*N*/ pStt->UpdateNum( aNum );
+/*N*/ }
+/*N*/
+/*N*/ //FEATURE::CONDCOLL
+/*N*/ BOOL bCheck = TRUE;
+/*N*/ if( RES_CONDTXTFMTCOLL == pStt->GetFmtColl()->Which() )
+/*N*/ {
+/*N*/ // SwFmtColl* pChgColl = pStt->GetCondFmtColl();
+/*N*/ pStt->ChkCondColl();
+/*
+//JP 19.11.97:
+// setzen der bedingten Vorlage aendert nichts an den Einzuegen, die bleiben
+// als harte vorhanden
+ if( pStt->GetCondFmtColl() )
+ {
+ // es gab eine Aenderung -> harte Einzuege entfernen
+ if( pChgColl != pStt->GetCondFmtColl() )
+ pStt->ResetAttr( RES_LR_SPACE );
+ bCheck = FALSE;
+ }
+*/
+ }
+/*N*/ else if( !pOutlNd && NO_NUMBERING !=
+/*N*/ ((SwTxtFmtColl*)pStt->GetFmtColl())->GetOutlineLevel() )
+/*N*/ pOutlNd = pStt;
+/*N*/
+/*N*/ //FEATURE::CONDCOLL
+/*N*/
+/*N*/ #ifndef NUM_RELSPACE
+/*N*/ // hat sich eine Level - Aenderung ergeben, so setze jetzt die
+/*N*/ // gueltigen Einzuege
+/*N*/ if( bCheck && ( nLevel != nNdOldLvl || pStt->IsSetNumLSpace())
+/*N*/ && GetRealLevel( nLevel ) < MAXLEVEL )
+/*N*/ {
+/*N*/ SvxLRSpaceItem aLR( ((SvxLRSpaceItem&)pStt->SwCntntNode::GetAttr(
+/*N*/ RES_LR_SPACE )) );
+/*N*/
+/*N*/ const SwNumFmt& rNFmt = pRule->Get( GetRealLevel( nLevel ));
+/*N*/
+/*N*/ // ohne Nummer immer ohne FirstLineOffset!!!!
+/*N*/ short nFOfst = rNFmt.GetFirstLineOffset();
+/*N*/ if( nLevel & NO_NUMLEVEL ) nFOfst = 0;
+/*N*/ aLR.SetTxtFirstLineOfstValue( nFOfst );
+/*N*/ aLR.SetTxtLeft( rNFmt.GetAbsLSpace() );
+/*N*/
+/*N*/ pStt->SwCntntNode::SetAttr( aLR );
+/*N*/ }
+/*N*/ // Flag immer loeschen!
+/*N*/ pStt->SetNumLSpace( FALSE );
+/*N*/ #endif
+/*N*/ aNum.SetStart( FALSE );
+/*N*/ aNum.SetSetValue( USHRT_MAX );
+/*N*/ }
+/*N*/ if( pOutlNd )
+/*?*/ GetNodes().UpdtOutlineIdx( *pOutlNd );
+/*N*/ }
+/*N*/
+/*N*/ ASSERT( pRule, "die NumRule sollte schon vorhanden sein!" );
+/*N*/ if( pRule )
+/*N*/ pRule->SetInvalidRule( FALSE );
+/*N*/ }
+
+
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */