xref: /aoo41x/main/sw/source/core/fields/reffld.cxx (revision dec99bbd)
1efeef26fSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3efeef26fSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4efeef26fSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5efeef26fSAndrew Rist  * distributed with this work for additional information
6efeef26fSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7efeef26fSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8efeef26fSAndrew Rist  * "License"); you may not use this file except in compliance
9efeef26fSAndrew Rist  * with the License.  You may obtain a copy of the License at
10efeef26fSAndrew Rist  *
11efeef26fSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12efeef26fSAndrew Rist  *
13efeef26fSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14efeef26fSAndrew Rist  * software distributed under the License is distributed on an
15efeef26fSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16efeef26fSAndrew Rist  * KIND, either express or implied.  See the License for the
17efeef26fSAndrew Rist  * specific language governing permissions and limitations
18efeef26fSAndrew Rist  * under the License.
19efeef26fSAndrew Rist  *
20efeef26fSAndrew Rist  *************************************************************/
21efeef26fSAndrew Rist 
22efeef26fSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_sw.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir 
28cdf0e10cSrcweir #define _SVSTDARR_USHORTSSORT
29cdf0e10cSrcweir #define _SVSTDARR_USHORTS
30cdf0e10cSrcweir #include <svl/svstdarr.hxx>
31cdf0e10cSrcweir #include <com/sun/star/text/ReferenceFieldPart.hpp>
32cdf0e10cSrcweir #include <com/sun/star/text/ReferenceFieldSource.hpp>
33cdf0e10cSrcweir #include <unotools/localedatawrapper.hxx>
34cdf0e10cSrcweir #include <com/sun/star/lang/XMultiServiceFactory.hpp>
35cdf0e10cSrcweir #include <comphelper/processfactory.hxx>
36cdf0e10cSrcweir #include <editeng/unolingu.hxx>
37cdf0e10cSrcweir #include <doc.hxx>
38cdf0e10cSrcweir #include <pam.hxx>
39cdf0e10cSrcweir #include <cntfrm.hxx>
40cdf0e10cSrcweir #include <pagefrm.hxx>
41cdf0e10cSrcweir #include <docary.hxx>
42cdf0e10cSrcweir #include <fmtfld.hxx>
43cdf0e10cSrcweir #include <txtfld.hxx>
44cdf0e10cSrcweir #include <txtftn.hxx>
45cdf0e10cSrcweir #include <fmtrfmrk.hxx>
46cdf0e10cSrcweir #include <txtrfmrk.hxx>
47cdf0e10cSrcweir #include <fmtftn.hxx>
48cdf0e10cSrcweir #include <ndtxt.hxx>
49cdf0e10cSrcweir #include <chpfld.hxx>
50cdf0e10cSrcweir #include <reffld.hxx>
51cdf0e10cSrcweir #include <expfld.hxx>
52cdf0e10cSrcweir #include <txtfrm.hxx>
53cdf0e10cSrcweir #include <flyfrm.hxx>
54cdf0e10cSrcweir #include <pagedesc.hxx>
55cdf0e10cSrcweir #include <IMark.hxx>
56cdf0e10cSrcweir #include <crossrefbookmark.hxx>
57cdf0e10cSrcweir #include <ftnidx.hxx>
58cdf0e10cSrcweir #include <viewsh.hxx>
59cdf0e10cSrcweir #include <unofldmid.h>
60cdf0e10cSrcweir #include <SwStyleNameMapper.hxx>
61cdf0e10cSrcweir #include <shellres.hxx>
62cdf0e10cSrcweir #include <poolfmt.hxx>
63cdf0e10cSrcweir #include <poolfmt.hrc>
64cdf0e10cSrcweir #include <comcore.hrc>
65cdf0e10cSrcweir #include <numrule.hxx>
66cdf0e10cSrcweir #include <SwNodeNum.hxx>
67cdf0e10cSrcweir #include <switerator.hxx>
68cdf0e10cSrcweir 
69cdf0e10cSrcweir using namespace ::com::sun::star;
70cdf0e10cSrcweir using namespace ::com::sun::star::text;
71cdf0e10cSrcweir using namespace ::com::sun::star::lang;
72cdf0e10cSrcweir using ::rtl::OUString;
73cdf0e10cSrcweir 
74cdf0e10cSrcweir extern void InsertSort( SvUShorts& rArr, sal_uInt16 nIdx, sal_uInt16* pInsPos = 0 );
75cdf0e10cSrcweir 
lcl_GetLayTree(const SwFrm * pFrm,SvPtrarr & rArr)76cdf0e10cSrcweir void lcl_GetLayTree( const SwFrm* pFrm, SvPtrarr& rArr )
77cdf0e10cSrcweir {
78cdf0e10cSrcweir 	while( pFrm )
79cdf0e10cSrcweir 	{
80cdf0e10cSrcweir 		if( pFrm->IsBodyFrm() )		// soll uns nicht weiter interessieren
81cdf0e10cSrcweir 			pFrm = pFrm->GetUpper();
82cdf0e10cSrcweir 		else
83cdf0e10cSrcweir 		{
84cdf0e10cSrcweir 			void* p = (void*)pFrm;
85cdf0e10cSrcweir 			rArr.Insert( p, rArr.Count() );
86cdf0e10cSrcweir 
87cdf0e10cSrcweir 			// bei der Seite ist schluss
88cdf0e10cSrcweir 			if( pFrm->IsPageFrm() )
89cdf0e10cSrcweir 				break;
90cdf0e10cSrcweir 
91cdf0e10cSrcweir 			if( pFrm->IsFlyFrm() )
92cdf0e10cSrcweir                 pFrm = ((SwFlyFrm*)pFrm)->GetAnchorFrm();
93cdf0e10cSrcweir 			else
94cdf0e10cSrcweir 				pFrm = pFrm->GetUpper();
95cdf0e10cSrcweir 		}
96cdf0e10cSrcweir 	}
97cdf0e10cSrcweir }
98cdf0e10cSrcweir 
99cdf0e10cSrcweir 
IsFrameBehind(const SwTxtNode & rMyNd,sal_uInt16 nMySttPos,const SwTxtNode & rBehindNd,sal_uInt16 nSttPos)100cdf0e10cSrcweir sal_Bool IsFrameBehind( const SwTxtNode& rMyNd, sal_uInt16 nMySttPos,
101cdf0e10cSrcweir 					const SwTxtNode& rBehindNd, sal_uInt16 nSttPos )
102cdf0e10cSrcweir {
103cdf0e10cSrcweir 	const SwTxtFrm *pMyFrm = (SwTxtFrm*)rMyNd.getLayoutFrm( rMyNd.GetDoc()->GetCurrentLayout(), 0,0,sal_False),
104cdf0e10cSrcweir 				   *pFrm = (SwTxtFrm*)rBehindNd.getLayoutFrm( rBehindNd.GetDoc()->GetCurrentLayout(), 0,0,sal_False);
105cdf0e10cSrcweir 
106cdf0e10cSrcweir 	while( pFrm && !pFrm->IsInside( nSttPos ) )
107cdf0e10cSrcweir 		pFrm = (SwTxtFrm*)pFrm->GetFollow();
108cdf0e10cSrcweir 	while( pMyFrm && !pMyFrm->IsInside( nMySttPos ) )
109cdf0e10cSrcweir 		pMyFrm = (SwTxtFrm*)pMyFrm->GetFollow();
110cdf0e10cSrcweir 
111cdf0e10cSrcweir 	if( !pFrm || !pMyFrm || pFrm == pMyFrm )
112cdf0e10cSrcweir 		return sal_False;
113cdf0e10cSrcweir 
114cdf0e10cSrcweir 	SvPtrarr aRefArr( 10, 10 ), aArr( 10, 10 );
115cdf0e10cSrcweir 	::lcl_GetLayTree( pFrm, aRefArr );
116cdf0e10cSrcweir 	::lcl_GetLayTree( pMyFrm, aArr );
117cdf0e10cSrcweir 
118cdf0e10cSrcweir 	sal_uInt16 nRefCnt = aRefArr.Count() - 1, nCnt = aArr.Count() - 1;
119cdf0e10cSrcweir     sal_Bool bVert = sal_False;
120cdf0e10cSrcweir     sal_Bool bR2L = sal_False;
121cdf0e10cSrcweir 
122cdf0e10cSrcweir 	// solange bis ein Frame ungleich ist ?
123cdf0e10cSrcweir 	while( nRefCnt && nCnt && aRefArr[ nRefCnt ] == aArr[ nCnt ] )
124cdf0e10cSrcweir     {
125cdf0e10cSrcweir         const SwFrm* pTmpFrm = (const SwFrm*)aArr[ nCnt ];
126cdf0e10cSrcweir         bVert = pTmpFrm->IsVertical();
127cdf0e10cSrcweir         bR2L = pTmpFrm->IsRightToLeft();
128cdf0e10cSrcweir         --nCnt, --nRefCnt;
129cdf0e10cSrcweir     }
130cdf0e10cSrcweir 
131cdf0e10cSrcweir 	// sollte einer der Counter ueberlaeufen?
132cdf0e10cSrcweir 	if( aRefArr[ nRefCnt ] == aArr[ nCnt ] )
133cdf0e10cSrcweir 	{
134cdf0e10cSrcweir 		if( nCnt )
135cdf0e10cSrcweir 			--nCnt;
136cdf0e10cSrcweir 		else
137cdf0e10cSrcweir 			--nRefCnt;
138cdf0e10cSrcweir 	}
139cdf0e10cSrcweir 
140cdf0e10cSrcweir 	const SwFrm* pRefFrm = (const SwFrm*)aRefArr[ nRefCnt ];
141cdf0e10cSrcweir 	const SwFrm* pFldFrm = (const SwFrm*)aArr[ nCnt ];
142cdf0e10cSrcweir 
143cdf0e10cSrcweir 	// unterschiedliche Frames, dann ueberpruefe deren Y-/X-Position
144cdf0e10cSrcweir 	sal_Bool bRefIsLower = sal_False;
145cdf0e10cSrcweir 	if( ( FRM_COLUMN | FRM_CELL ) & pFldFrm->GetType() ||
146cdf0e10cSrcweir 		( FRM_COLUMN | FRM_CELL ) & pRefFrm->GetType() )
147cdf0e10cSrcweir 	{
148cdf0e10cSrcweir 		if( pFldFrm->GetType() == pRefFrm->GetType() )
149cdf0e10cSrcweir 		{
150cdf0e10cSrcweir 			// hier ist die X-Pos wichtiger!
151cdf0e10cSrcweir             if( bVert )
152cdf0e10cSrcweir             {
153cdf0e10cSrcweir                 if( bR2L )
154cdf0e10cSrcweir                     bRefIsLower = pRefFrm->Frm().Top() < pFldFrm->Frm().Top() ||
155cdf0e10cSrcweir                             ( pRefFrm->Frm().Top() == pFldFrm->Frm().Top() &&
156cdf0e10cSrcweir                               pRefFrm->Frm().Left() < pFldFrm->Frm().Left() );
157cdf0e10cSrcweir                 else
158cdf0e10cSrcweir                     bRefIsLower = pRefFrm->Frm().Top() < pFldFrm->Frm().Top() ||
159cdf0e10cSrcweir                             ( pRefFrm->Frm().Top() == pFldFrm->Frm().Top() &&
160cdf0e10cSrcweir                               pRefFrm->Frm().Left() > pFldFrm->Frm().Left() );
161cdf0e10cSrcweir             }
162cdf0e10cSrcweir             else if( bR2L )
163cdf0e10cSrcweir                 bRefIsLower = pRefFrm->Frm().Left() > pFldFrm->Frm().Left() ||
164cdf0e10cSrcweir                             ( pRefFrm->Frm().Left() == pFldFrm->Frm().Left() &&
165cdf0e10cSrcweir                               pRefFrm->Frm().Top() < pFldFrm->Frm().Top() );
166cdf0e10cSrcweir             else
167cdf0e10cSrcweir                 bRefIsLower = pRefFrm->Frm().Left() < pFldFrm->Frm().Left() ||
168cdf0e10cSrcweir                             ( pRefFrm->Frm().Left() == pFldFrm->Frm().Left() &&
169cdf0e10cSrcweir                               pRefFrm->Frm().Top() < pFldFrm->Frm().Top() );
170cdf0e10cSrcweir             pRefFrm = 0;
171cdf0e10cSrcweir 		}
172cdf0e10cSrcweir 		else if( ( FRM_COLUMN | FRM_CELL ) & pFldFrm->GetType() )
173cdf0e10cSrcweir 			pFldFrm = (const SwFrm*)aArr[ nCnt - 1 ];
174cdf0e10cSrcweir 		else
175cdf0e10cSrcweir 			pRefFrm = (const SwFrm*)aRefArr[ nRefCnt - 1 ];
176cdf0e10cSrcweir 	}
177cdf0e10cSrcweir 
178cdf0e10cSrcweir 	if( pRefFrm ) 				// als Flag missbrauchen
179cdf0e10cSrcweir     {
180cdf0e10cSrcweir         if( bVert )
181cdf0e10cSrcweir         {
182cdf0e10cSrcweir             if( bR2L )
183cdf0e10cSrcweir                 bRefIsLower = pRefFrm->Frm().Left() < pFldFrm->Frm().Left() ||
184cdf0e10cSrcweir                             ( pRefFrm->Frm().Left() == pFldFrm->Frm().Left() &&
185cdf0e10cSrcweir                                 pRefFrm->Frm().Top() < pFldFrm->Frm().Top() );
186cdf0e10cSrcweir             else
187cdf0e10cSrcweir                 bRefIsLower = pRefFrm->Frm().Left() > pFldFrm->Frm().Left() ||
188cdf0e10cSrcweir                             ( pRefFrm->Frm().Left() == pFldFrm->Frm().Left() &&
189cdf0e10cSrcweir                                 pRefFrm->Frm().Top() < pFldFrm->Frm().Top() );
190cdf0e10cSrcweir         }
191cdf0e10cSrcweir         else if( bR2L )
192cdf0e10cSrcweir             bRefIsLower = pRefFrm->Frm().Top() < pFldFrm->Frm().Top() ||
193cdf0e10cSrcweir                         ( pRefFrm->Frm().Top() == pFldFrm->Frm().Top() &&
194cdf0e10cSrcweir                             pRefFrm->Frm().Left() > pFldFrm->Frm().Left() );
195cdf0e10cSrcweir         else
196cdf0e10cSrcweir             bRefIsLower = pRefFrm->Frm().Top() < pFldFrm->Frm().Top() ||
197cdf0e10cSrcweir                         ( pRefFrm->Frm().Top() == pFldFrm->Frm().Top() &&
198cdf0e10cSrcweir                             pRefFrm->Frm().Left() < pFldFrm->Frm().Left() );
199cdf0e10cSrcweir     }
200cdf0e10cSrcweir     return bRefIsLower;
201cdf0e10cSrcweir }
202cdf0e10cSrcweir 
203cdf0e10cSrcweir /*--------------------------------------------------------------------
204cdf0e10cSrcweir 	Beschreibung: Referenzen holen
205cdf0e10cSrcweir  --------------------------------------------------------------------*/
206cdf0e10cSrcweir 
207cdf0e10cSrcweir 
SwGetRefField(SwGetRefFieldType * pFldType,const String & rSetRef,sal_uInt16 nSubTyp,sal_uInt16 nSeqenceNo,sal_uLong nFmt)208cdf0e10cSrcweir SwGetRefField::SwGetRefField( SwGetRefFieldType* pFldType,
209cdf0e10cSrcweir 							  const String& rSetRef, sal_uInt16 nSubTyp,
210cdf0e10cSrcweir 							  sal_uInt16 nSeqenceNo, sal_uLong nFmt )
211cdf0e10cSrcweir     : SwField( pFldType, nFmt ),
212cdf0e10cSrcweir       sSetRefName( rSetRef ),
213cdf0e10cSrcweir       nSubType( nSubTyp ),
214cdf0e10cSrcweir       nSeqNo( nSeqenceNo )
215cdf0e10cSrcweir {
216cdf0e10cSrcweir }
217cdf0e10cSrcweir 
~SwGetRefField()218cdf0e10cSrcweir SwGetRefField::~SwGetRefField()
219cdf0e10cSrcweir {
220cdf0e10cSrcweir }
221cdf0e10cSrcweir 
GetDescription() const222cdf0e10cSrcweir String SwGetRefField::GetDescription() const
223cdf0e10cSrcweir {
224cdf0e10cSrcweir     return SW_RES(STR_REFERENCE);
225cdf0e10cSrcweir }
226cdf0e10cSrcweir 
GetSubType() const227cdf0e10cSrcweir sal_uInt16 SwGetRefField::GetSubType() const
228cdf0e10cSrcweir {
229cdf0e10cSrcweir 	return nSubType;
230cdf0e10cSrcweir }
231cdf0e10cSrcweir 
SetSubType(sal_uInt16 n)232cdf0e10cSrcweir void SwGetRefField::SetSubType( sal_uInt16 n )
233cdf0e10cSrcweir {
234cdf0e10cSrcweir 	nSubType = n;
235cdf0e10cSrcweir }
236cdf0e10cSrcweir 
237cdf0e10cSrcweir // --> OD 2007-11-09 #i81002#
IsRefToHeadingCrossRefBookmark() const238cdf0e10cSrcweir bool SwGetRefField::IsRefToHeadingCrossRefBookmark() const
239cdf0e10cSrcweir {
240cdf0e10cSrcweir     return GetSubType() == REF_BOOKMARK &&
241cdf0e10cSrcweir         ::sw::mark::CrossRefHeadingBookmark::IsLegalName(sSetRefName);
242cdf0e10cSrcweir }
243cdf0e10cSrcweir 
IsRefToNumItemCrossRefBookmark() const244cdf0e10cSrcweir bool SwGetRefField::IsRefToNumItemCrossRefBookmark() const
245cdf0e10cSrcweir {
246cdf0e10cSrcweir     return GetSubType() == REF_BOOKMARK &&
247cdf0e10cSrcweir         ::sw::mark::CrossRefNumItemBookmark::IsLegalName(sSetRefName);
248cdf0e10cSrcweir }
249cdf0e10cSrcweir 
GetReferencedTxtNode() const250cdf0e10cSrcweir const SwTxtNode* SwGetRefField::GetReferencedTxtNode() const
251cdf0e10cSrcweir {
252cdf0e10cSrcweir     SwDoc* pDoc = dynamic_cast<SwGetRefFieldType*>(GetTyp())->GetDoc();
253cdf0e10cSrcweir     sal_uInt16 nDummy = USHRT_MAX;
254cdf0e10cSrcweir     return SwGetRefFieldType::FindAnchor( pDoc, sSetRefName, nSubType, nSeqNo, &nDummy );
255cdf0e10cSrcweir }
256cdf0e10cSrcweir // <--
257cdf0e10cSrcweir // --> OD 2008-01-09 #i85090#
GetExpandedTxtOfReferencedTxtNode() const258cdf0e10cSrcweir String SwGetRefField::GetExpandedTxtOfReferencedTxtNode() const
259cdf0e10cSrcweir {
260cdf0e10cSrcweir     const SwTxtNode* pReferencedTxtNode( GetReferencedTxtNode() );
261cdf0e10cSrcweir     return pReferencedTxtNode
262cdf0e10cSrcweir            ? pReferencedTxtNode->GetExpandTxt( 0, STRING_LEN, true, true )
263cdf0e10cSrcweir            : aEmptyStr;
264cdf0e10cSrcweir }
265cdf0e10cSrcweir 
Expand() const266cdf0e10cSrcweir String SwGetRefField::Expand() const
267cdf0e10cSrcweir {
268cdf0e10cSrcweir 	return sTxt;
269cdf0e10cSrcweir }
270cdf0e10cSrcweir 
271cdf0e10cSrcweir 
GetFieldName() const272cdf0e10cSrcweir String SwGetRefField::GetFieldName() const
273cdf0e10cSrcweir {
274cdf0e10cSrcweir 	String aStr(GetTyp()->GetName());
275cdf0e10cSrcweir 	aStr += ' ';
276cdf0e10cSrcweir 	aStr += sSetRefName;
277cdf0e10cSrcweir 	return aStr;
278cdf0e10cSrcweir }
279cdf0e10cSrcweir 
UpdateField(const SwTxtFld * pFldTxtAttr)280cdf0e10cSrcweir void SwGetRefField::UpdateField( const SwTxtFld* pFldTxtAttr )
281cdf0e10cSrcweir {
28269a74367SOliver-Rainer Wittmann     sTxt.Erase();
283cdf0e10cSrcweir 
284cdf0e10cSrcweir     SwDoc* pDoc = ((SwGetRefFieldType*)GetTyp())->GetDoc();
285cdf0e10cSrcweir     sal_uInt16 nStt = USHRT_MAX;
286cdf0e10cSrcweir     sal_uInt16 nEnd = USHRT_MAX;
28769a74367SOliver-Rainer Wittmann     SwTxtNode* pTxtNd = SwGetRefFieldType::FindAnchor( pDoc, sSetRefName, nSubType, nSeqNo, &nStt, &nEnd );
288cdf0e10cSrcweir     if ( !pTxtNd )
289cdf0e10cSrcweir     {
290cdf0e10cSrcweir         sTxt = ViewShell::GetShellRes()->aGetRefFld_RefItemNotFound;
29169a74367SOliver-Rainer Wittmann         return ;
292cdf0e10cSrcweir     }
293cdf0e10cSrcweir 
294cdf0e10cSrcweir 	switch( GetFormat() )
295cdf0e10cSrcweir 	{
296cdf0e10cSrcweir 	case REF_CONTENT:
297cdf0e10cSrcweir 	case REF_ONLYNUMBER:
298cdf0e10cSrcweir 	case REF_ONLYCAPTION:
299cdf0e10cSrcweir 	case REF_ONLYSEQNO:
300cdf0e10cSrcweir 		{
301cdf0e10cSrcweir 			switch( nSubType )
302cdf0e10cSrcweir 			{
303cdf0e10cSrcweir 			case REF_SEQUENCEFLD:
304cdf0e10cSrcweir 				nEnd = pTxtNd->GetTxt().Len();
305cdf0e10cSrcweir 				switch( GetFormat() )
306cdf0e10cSrcweir 				{
307cdf0e10cSrcweir 				case REF_ONLYNUMBER:
308cdf0e10cSrcweir 					if( nStt + 1 < nEnd )
309cdf0e10cSrcweir 						nEnd = nStt + 1;
310cdf0e10cSrcweir 					nStt = 0;
311cdf0e10cSrcweir 					break;
312cdf0e10cSrcweir 
313*dec99bbdSOliver-Rainer Wittmann                 case REF_ONLYCAPTION:
314*dec99bbdSOliver-Rainer Wittmann                     {
31569a74367SOliver-Rainer Wittmann                         const SwTxtAttr* const pTxtAttr = pTxtNd->GetTxtAttrForCharAt(nStt, RES_TXTATR_FIELD);
316*dec99bbdSOliver-Rainer Wittmann                         if( pTxtAttr != NULL )
317*dec99bbdSOliver-Rainer Wittmann                             nStt = SwGetExpField::GetReferenceTextPos( pTxtAttr->GetFmtFld(), *pDoc );
318*dec99bbdSOliver-Rainer Wittmann                         else if( nStt + 1 < nEnd )
319*dec99bbdSOliver-Rainer Wittmann                             ++nStt;
320*dec99bbdSOliver-Rainer Wittmann                     }
321*dec99bbdSOliver-Rainer Wittmann                     break;
322cdf0e10cSrcweir 
323cdf0e10cSrcweir 				case REF_ONLYSEQNO:
324cdf0e10cSrcweir 					if( nStt + 1 < nEnd )
325cdf0e10cSrcweir 						nEnd = nStt + 1;
326cdf0e10cSrcweir 					break;
327cdf0e10cSrcweir 
328cdf0e10cSrcweir 				default:
329cdf0e10cSrcweir 					nStt = 0;
330cdf0e10cSrcweir 					break;
331cdf0e10cSrcweir 				}
332cdf0e10cSrcweir 				break;
333cdf0e10cSrcweir 
334cdf0e10cSrcweir 			case REF_BOOKMARK:
335cdf0e10cSrcweir 				if( USHRT_MAX == nEnd )
336cdf0e10cSrcweir 				{
337cdf0e10cSrcweir 					// Text steht ueber verschiedene Nodes verteilt.
338cdf0e10cSrcweir 					// Gesamten Text oder nur bis zum Ende vom Node?
339cdf0e10cSrcweir 					nEnd = pTxtNd->GetTxt().Len();
340cdf0e10cSrcweir 				}
341cdf0e10cSrcweir 				break;
342cdf0e10cSrcweir 
343cdf0e10cSrcweir 			case REF_OUTLINE:
344cdf0e10cSrcweir 				break;
345cdf0e10cSrcweir 
346cdf0e10cSrcweir 			case REF_FOOTNOTE:
347cdf0e10cSrcweir 			case REF_ENDNOTE:
348cdf0e10cSrcweir 				{
349cdf0e10cSrcweir 					// die Nummer oder den NumString besorgen
350cdf0e10cSrcweir 					sal_uInt16 n, nFtnCnt = pDoc->GetFtnIdxs().Count();
351cdf0e10cSrcweir 					SwTxtFtn* pFtnIdx;
352cdf0e10cSrcweir 					for( n = 0; n < nFtnCnt; ++n )
353cdf0e10cSrcweir 						if( nSeqNo == (pFtnIdx = pDoc->GetFtnIdxs()[ n ])->GetSeqRefNo() )
354cdf0e10cSrcweir 						{
355cdf0e10cSrcweir 							sTxt = pFtnIdx->GetFtn().GetViewNumStr( *pDoc );
356cdf0e10cSrcweir 							break;
357cdf0e10cSrcweir 						}
358cdf0e10cSrcweir 					nStt = nEnd;		// kein Bereich, der String ist fertig
359cdf0e10cSrcweir 				}
360cdf0e10cSrcweir 				break;
361cdf0e10cSrcweir 			}
362cdf0e10cSrcweir 
363cdf0e10cSrcweir 			if( nStt != nEnd )		// ein Bereich?
364cdf0e10cSrcweir 			{
365cdf0e10cSrcweir                 sTxt = pTxtNd->GetExpandTxt( nStt, nEnd - nStt );
366cdf0e10cSrcweir 
367cdf0e10cSrcweir 				// alle Sonderzeichen entfernen (durch Blanks ersetzen):
368cdf0e10cSrcweir 				if( sTxt.Len() )
369cdf0e10cSrcweir                 {
370cdf0e10cSrcweir                     sTxt.EraseAllChars( 0xad );
371cdf0e10cSrcweir                     for( sal_Unicode* p = sTxt.GetBufferAccess(); *p; ++p )
372cdf0e10cSrcweir 					{
373cdf0e10cSrcweir 						if( *p < 0x20 )
374cdf0e10cSrcweir 							*p = 0x20;
375cdf0e10cSrcweir                         else if(*p == 0x2011)
376cdf0e10cSrcweir 							*p = '-';
377cdf0e10cSrcweir 					}
378cdf0e10cSrcweir                 }
379cdf0e10cSrcweir 			}
380cdf0e10cSrcweir 		}
381cdf0e10cSrcweir 		break;
382cdf0e10cSrcweir 
383cdf0e10cSrcweir 	case REF_PAGE:
384cdf0e10cSrcweir 	case REF_PAGE_PGDESC:
385cdf0e10cSrcweir 		{
386cdf0e10cSrcweir 			const SwTxtFrm* pFrm = (SwTxtFrm*)pTxtNd->getLayoutFrm( pDoc->GetCurrentLayout(), 0,0,sal_False),
387cdf0e10cSrcweir 						*pSave = pFrm;
388cdf0e10cSrcweir 			while( pFrm && !pFrm->IsInside( nStt ) )
389cdf0e10cSrcweir 				pFrm = (SwTxtFrm*)pFrm->GetFollow();
390cdf0e10cSrcweir 
391cdf0e10cSrcweir 			if( pFrm || 0 != ( pFrm = pSave ))
392cdf0e10cSrcweir 			{
393cdf0e10cSrcweir 				sal_uInt16 nPageNo = pFrm->GetVirtPageNum();
394cdf0e10cSrcweir 				const SwPageFrm *pPage;
395cdf0e10cSrcweir 				if( REF_PAGE_PGDESC == GetFormat() &&
396cdf0e10cSrcweir 					0 != ( pPage = pFrm->FindPageFrm() ) &&
397cdf0e10cSrcweir 					pPage->GetPageDesc() )
398cdf0e10cSrcweir 					sTxt = pPage->GetPageDesc()->GetNumType().GetNumStr( nPageNo );
399cdf0e10cSrcweir 				else
400cdf0e10cSrcweir 					sTxt = String::CreateFromInt32(nPageNo);
401cdf0e10cSrcweir 			}
402cdf0e10cSrcweir 		}
403cdf0e10cSrcweir 		break;
404cdf0e10cSrcweir 
405cdf0e10cSrcweir 	case REF_CHAPTER:
406cdf0e10cSrcweir 		{
407cdf0e10cSrcweir 			// ein bischen trickreich: suche irgend einen Frame
408cdf0e10cSrcweir 			const SwFrm* pFrm = pTxtNd->getLayoutFrm( pDoc->GetCurrentLayout() );
409cdf0e10cSrcweir 			if( pFrm )
410cdf0e10cSrcweir 			{
411cdf0e10cSrcweir 				SwChapterFieldType aFldTyp;
412cdf0e10cSrcweir 				SwChapterField aFld( &aFldTyp, 0 );
413cdf0e10cSrcweir 				aFld.SetLevel( MAXLEVEL - 1 );
414cdf0e10cSrcweir 				aFld.ChangeExpansion( pFrm, pTxtNd, sal_True );
415cdf0e10cSrcweir 				sTxt = aFld.GetNumber();
416cdf0e10cSrcweir 			}
417cdf0e10cSrcweir 		}
418cdf0e10cSrcweir 		break;
419cdf0e10cSrcweir 
42069a74367SOliver-Rainer Wittmann     case REF_UPDOWN:
42169a74367SOliver-Rainer Wittmann         {
422cdf0e10cSrcweir             // simplified: use parameter <pFldTxtAttr>
423cdf0e10cSrcweir             if( !pFldTxtAttr || !pFldTxtAttr->GetpTxtNode() )
42469a74367SOliver-Rainer Wittmann                 break;
425cdf0e10cSrcweir 
42669a74367SOliver-Rainer Wittmann             LocaleDataWrapper aLocaleData( ::comphelper::getProcessServiceFactory(), SvxCreateLocale( GetLanguage() ) );
427cdf0e10cSrcweir 
42869a74367SOliver-Rainer Wittmann             // erstmal ein "Kurz" - Test - falls beide im selben
42969a74367SOliver-Rainer Wittmann             // Node stehen!
430cdf0e10cSrcweir             if( pFldTxtAttr->GetpTxtNode() == pTxtNd )
43169a74367SOliver-Rainer Wittmann             {
432cdf0e10cSrcweir                 sTxt = nStt < *pFldTxtAttr->GetStart()
43369a74367SOliver-Rainer Wittmann                     ? aLocaleData.getAboveWord()
43469a74367SOliver-Rainer Wittmann                     : aLocaleData.getBelowWord();
43569a74367SOliver-Rainer Wittmann                 break;
43669a74367SOliver-Rainer Wittmann             }
43769a74367SOliver-Rainer Wittmann 
43869a74367SOliver-Rainer Wittmann             sTxt =
43969a74367SOliver-Rainer Wittmann                 ::IsFrameBehind( *pFldTxtAttr->GetpTxtNode(), *pFldTxtAttr->GetStart(), *pTxtNd, nStt )
44069a74367SOliver-Rainer Wittmann                 ? aLocaleData.getAboveWord()
44169a74367SOliver-Rainer Wittmann                 : aLocaleData.getBelowWord();
44269a74367SOliver-Rainer Wittmann         }
44369a74367SOliver-Rainer Wittmann         break;
444cdf0e10cSrcweir 
445cdf0e10cSrcweir     case REF_NUMBER:
446cdf0e10cSrcweir     case REF_NUMBER_NO_CONTEXT:
447cdf0e10cSrcweir     case REF_NUMBER_FULL_CONTEXT:
448cdf0e10cSrcweir         {
449cdf0e10cSrcweir             if ( pFldTxtAttr && pFldTxtAttr->GetpTxtNode() )
450cdf0e10cSrcweir             {
451cdf0e10cSrcweir                 sTxt = MakeRefNumStr( pFldTxtAttr->GetTxtNode(), *pTxtNd, GetFormat() );
452cdf0e10cSrcweir             }
453cdf0e10cSrcweir         }
454cdf0e10cSrcweir         break;
45569a74367SOliver-Rainer Wittmann 
456cdf0e10cSrcweir     default:
457cdf0e10cSrcweir         DBG_ERROR("<SwGetRefField::UpdateField(..)> - unknown format type");
458cdf0e10cSrcweir 	}
459cdf0e10cSrcweir }
460cdf0e10cSrcweir 
461cdf0e10cSrcweir // --> OD 2007-09-06 #i81002#
MakeRefNumStr(const SwTxtNode & rTxtNodeOfField,const SwTxtNode & rTxtNodeOfReferencedItem,const sal_uInt32 nRefNumFormat) const462cdf0e10cSrcweir String SwGetRefField::MakeRefNumStr( const SwTxtNode& rTxtNodeOfField,
463cdf0e10cSrcweir                                      const SwTxtNode& rTxtNodeOfReferencedItem,
464cdf0e10cSrcweir                                      const sal_uInt32 nRefNumFormat ) const
465cdf0e10cSrcweir {
466cdf0e10cSrcweir     if ( rTxtNodeOfReferencedItem.HasNumber() &&
467cdf0e10cSrcweir          rTxtNodeOfReferencedItem.IsCountedInList() )
468cdf0e10cSrcweir     {
469cdf0e10cSrcweir         ASSERT( rTxtNodeOfReferencedItem.GetNum(),
470cdf0e10cSrcweir                 "<SwGetRefField::MakeRefNumStr(..)> - referenced paragraph has number, but no <SwNodeNum> instance --> please inform OD!" );
471cdf0e10cSrcweir 
472cdf0e10cSrcweir         // Determine, up to which level the superior list labels have to be
473cdf0e10cSrcweir         // included - default is to include all superior list labels.
474cdf0e10cSrcweir         sal_uInt8 nRestrictInclToThisLevel( 0 );
475cdf0e10cSrcweir         // Determine for format REF_NUMBER the level, up to which the superior
476cdf0e10cSrcweir         // list labels have to be restricted, if the text node of the reference
477cdf0e10cSrcweir         // field and the text node of the referenced item are in the same
478cdf0e10cSrcweir         // document context.
479cdf0e10cSrcweir         if ( nRefNumFormat == REF_NUMBER &&
480cdf0e10cSrcweir              rTxtNodeOfField.FindFlyStartNode()
481cdf0e10cSrcweir                             == rTxtNodeOfReferencedItem.FindFlyStartNode() &&
482cdf0e10cSrcweir              rTxtNodeOfField.FindFootnoteStartNode()
483cdf0e10cSrcweir                             == rTxtNodeOfReferencedItem.FindFootnoteStartNode() &&
484cdf0e10cSrcweir              rTxtNodeOfField.FindHeaderStartNode()
485cdf0e10cSrcweir                             == rTxtNodeOfReferencedItem.FindHeaderStartNode() &&
486cdf0e10cSrcweir              rTxtNodeOfField.FindFooterStartNode()
487cdf0e10cSrcweir                             == rTxtNodeOfReferencedItem.FindFooterStartNode() )
488cdf0e10cSrcweir         {
489cdf0e10cSrcweir             const SwNodeNum* pNodeNumForTxtNodeOfField( 0 );
490cdf0e10cSrcweir             if ( rTxtNodeOfField.HasNumber() &&
491cdf0e10cSrcweir                  rTxtNodeOfField.GetNumRule() == rTxtNodeOfReferencedItem.GetNumRule() )
492cdf0e10cSrcweir             {
493cdf0e10cSrcweir                 pNodeNumForTxtNodeOfField = rTxtNodeOfField.GetNum();
494cdf0e10cSrcweir             }
495cdf0e10cSrcweir             else
496cdf0e10cSrcweir             {
497cdf0e10cSrcweir                 pNodeNumForTxtNodeOfField =
498cdf0e10cSrcweir                     rTxtNodeOfReferencedItem.GetNum()->GetPrecedingNodeNumOf( rTxtNodeOfField );
499cdf0e10cSrcweir             }
500cdf0e10cSrcweir             if ( pNodeNumForTxtNodeOfField )
501cdf0e10cSrcweir             {
502cdf0e10cSrcweir                 const SwNumberTree::tNumberVector rFieldNumVec = pNodeNumForTxtNodeOfField->GetNumberVector();
503cdf0e10cSrcweir                 const SwNumberTree::tNumberVector rRefItemNumVec = rTxtNodeOfReferencedItem.GetNum()->GetNumberVector();
504cdf0e10cSrcweir                 sal_uInt8 nLevel( 0 );
505cdf0e10cSrcweir                 while ( nLevel < rFieldNumVec.size() && nLevel < rRefItemNumVec.size() )
506cdf0e10cSrcweir                 {
507cdf0e10cSrcweir                     if ( rRefItemNumVec[nLevel] == rFieldNumVec[nLevel] )
508cdf0e10cSrcweir                     {
509cdf0e10cSrcweir                         nRestrictInclToThisLevel = nLevel + 1;
510cdf0e10cSrcweir                     }
511cdf0e10cSrcweir                     else
512cdf0e10cSrcweir                     {
513cdf0e10cSrcweir                         break;
514cdf0e10cSrcweir                     }
515cdf0e10cSrcweir                     ++nLevel;
516cdf0e10cSrcweir                 }
517cdf0e10cSrcweir             }
518cdf0e10cSrcweir         }
519cdf0e10cSrcweir 
520cdf0e10cSrcweir         // Determine, if superior list labels have to be included
521cdf0e10cSrcweir         const bool bInclSuperiorNumLabels(
522cdf0e10cSrcweir             ( nRestrictInclToThisLevel < rTxtNodeOfReferencedItem.GetActualListLevel() &&
523cdf0e10cSrcweir               ( nRefNumFormat == REF_NUMBER || nRefNumFormat == REF_NUMBER_FULL_CONTEXT ) ) );
524cdf0e10cSrcweir 
525cdf0e10cSrcweir         ASSERT( rTxtNodeOfReferencedItem.GetNumRule(),
526cdf0e10cSrcweir                 "<SwGetRefField::MakeRefNumStr(..)> - referenced numbered paragraph has no numbering rule set --> please inform OD!" );
527cdf0e10cSrcweir         return rTxtNodeOfReferencedItem.GetNumRule()->MakeRefNumString(
528cdf0e10cSrcweir                                             *(rTxtNodeOfReferencedItem.GetNum()),
529cdf0e10cSrcweir                                             bInclSuperiorNumLabels,
530cdf0e10cSrcweir                                             nRestrictInclToThisLevel );
531cdf0e10cSrcweir     }
532cdf0e10cSrcweir 
533cdf0e10cSrcweir     return String();
534cdf0e10cSrcweir }
535cdf0e10cSrcweir // <--
536cdf0e10cSrcweir 
Copy() const537cdf0e10cSrcweir SwField* SwGetRefField::Copy() const
538cdf0e10cSrcweir {
539cdf0e10cSrcweir 	SwGetRefField* pFld = new SwGetRefField( (SwGetRefFieldType*)GetTyp(),
540cdf0e10cSrcweir 												sSetRefName, nSubType,
541cdf0e10cSrcweir 												nSeqNo, GetFormat() );
542cdf0e10cSrcweir 	pFld->sTxt = sTxt;
543cdf0e10cSrcweir 	return pFld;
544cdf0e10cSrcweir }
545cdf0e10cSrcweir 
546cdf0e10cSrcweir /*--------------------------------------------------------------------
547cdf0e10cSrcweir 	Beschreibung: ReferenzName holen
548cdf0e10cSrcweir  --------------------------------------------------------------------*/
549cdf0e10cSrcweir 
550cdf0e10cSrcweir 
GetPar1() const551cdf0e10cSrcweir const String& SwGetRefField::GetPar1() const
552cdf0e10cSrcweir {
553cdf0e10cSrcweir 	return sSetRefName;
554cdf0e10cSrcweir }
555cdf0e10cSrcweir 
556cdf0e10cSrcweir 
SetPar1(const String & rName)557cdf0e10cSrcweir void SwGetRefField::SetPar1( const String& rName )
558cdf0e10cSrcweir {
559cdf0e10cSrcweir 	sSetRefName = rName;
560cdf0e10cSrcweir }
561cdf0e10cSrcweir 
562cdf0e10cSrcweir 
GetPar2() const563cdf0e10cSrcweir String SwGetRefField::GetPar2() const
564cdf0e10cSrcweir {
565cdf0e10cSrcweir 	return Expand();
566cdf0e10cSrcweir }
567cdf0e10cSrcweir 
QueryValue(uno::Any & rAny,sal_uInt16 nWhichId) const568cdf0e10cSrcweir sal_Bool SwGetRefField::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
569cdf0e10cSrcweir {
570cdf0e10cSrcweir     switch( nWhichId )
571cdf0e10cSrcweir 	{
572cdf0e10cSrcweir 	case FIELD_PROP_USHORT1:
573cdf0e10cSrcweir 		{
574cdf0e10cSrcweir 			sal_Int16 nPart = 0;
575cdf0e10cSrcweir 			switch(GetFormat())
576cdf0e10cSrcweir 			{
577cdf0e10cSrcweir 			case REF_PAGE		: nPart = ReferenceFieldPart::PAGE 				  ; break;
578cdf0e10cSrcweir 			case REF_CHAPTER	: nPart = ReferenceFieldPart::CHAPTER	 		  ; break;
579cdf0e10cSrcweir 			case REF_CONTENT	: nPart = ReferenceFieldPart::TEXT 				  ; break;
580cdf0e10cSrcweir 			case REF_UPDOWN		: nPart = ReferenceFieldPart::UP_DOWN 			  ; break;
581cdf0e10cSrcweir 			case REF_PAGE_PGDESC: nPart = ReferenceFieldPart::PAGE_DESC 		  ; break;
582cdf0e10cSrcweir 			case REF_ONLYNUMBER	: nPart = ReferenceFieldPart::CATEGORY_AND_NUMBER ; break;
583cdf0e10cSrcweir 			case REF_ONLYCAPTION: nPart = ReferenceFieldPart::ONLY_CAPTION 		  ; break;
584cdf0e10cSrcweir 			case REF_ONLYSEQNO	: nPart = ReferenceFieldPart::ONLY_SEQUENCE_NUMBER; break;
585cdf0e10cSrcweir             // --> OD 2007-09-06 #i81002#
586cdf0e10cSrcweir             case REF_NUMBER:              nPart = ReferenceFieldPart::NUMBER;              break;
587cdf0e10cSrcweir             case REF_NUMBER_NO_CONTEXT:   nPart = ReferenceFieldPart::NUMBER_NO_CONTEXT;   break;
588cdf0e10cSrcweir             case REF_NUMBER_FULL_CONTEXT: nPart = ReferenceFieldPart::NUMBER_FULL_CONTEXT; break;
589cdf0e10cSrcweir             // <--
590cdf0e10cSrcweir 			}
591cdf0e10cSrcweir 			rAny <<= nPart;
592cdf0e10cSrcweir 		}
593cdf0e10cSrcweir 		break;
594cdf0e10cSrcweir 	case FIELD_PROP_USHORT2:
595cdf0e10cSrcweir 		{
596cdf0e10cSrcweir 			sal_Int16 nSource = 0;
597cdf0e10cSrcweir 			switch(nSubType)
598cdf0e10cSrcweir 			{
599cdf0e10cSrcweir 			case  REF_SETREFATTR : nSource = ReferenceFieldSource::REFERENCE_MARK; break;
600cdf0e10cSrcweir 			case  REF_SEQUENCEFLD: nSource = ReferenceFieldSource::SEQUENCE_FIELD; break;
601cdf0e10cSrcweir 			case  REF_BOOKMARK   : nSource = ReferenceFieldSource::BOOKMARK; break;
602cdf0e10cSrcweir 			case  REF_OUTLINE    : DBG_ERROR("not implemented"); break;
603cdf0e10cSrcweir 			case  REF_FOOTNOTE   : nSource = ReferenceFieldSource::FOOTNOTE; break;
604cdf0e10cSrcweir 			case  REF_ENDNOTE    : nSource = ReferenceFieldSource::ENDNOTE; break;
605cdf0e10cSrcweir 			}
606cdf0e10cSrcweir 			rAny <<= nSource;
607cdf0e10cSrcweir 		}
608cdf0e10cSrcweir 		break;
609cdf0e10cSrcweir 	case FIELD_PROP_PAR1:
610cdf0e10cSrcweir     {
611cdf0e10cSrcweir         String  sTmp(GetPar1());
612cdf0e10cSrcweir         if(REF_SEQUENCEFLD == nSubType)
613cdf0e10cSrcweir         {
614cdf0e10cSrcweir             sal_uInt16 nPoolId = SwStyleNameMapper::GetPoolIdFromUIName( sTmp, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL );
615cdf0e10cSrcweir             switch( nPoolId )
616cdf0e10cSrcweir             {
617cdf0e10cSrcweir                 case RES_POOLCOLL_LABEL_ABB:
618cdf0e10cSrcweir                 case RES_POOLCOLL_LABEL_TABLE:
619cdf0e10cSrcweir                 case RES_POOLCOLL_LABEL_FRAME:
620cdf0e10cSrcweir                 case RES_POOLCOLL_LABEL_DRAWING:
621cdf0e10cSrcweir                     SwStyleNameMapper::FillProgName(nPoolId, sTmp) ;
622cdf0e10cSrcweir                 break;
623cdf0e10cSrcweir             }
624cdf0e10cSrcweir         }
625cdf0e10cSrcweir         rAny <<= rtl::OUString(sTmp);
626cdf0e10cSrcweir     }
627cdf0e10cSrcweir     break;
628cdf0e10cSrcweir 	case FIELD_PROP_PAR3:
629cdf0e10cSrcweir 		rAny <<= rtl::OUString(Expand());
630cdf0e10cSrcweir 		break;
631cdf0e10cSrcweir 	case FIELD_PROP_SHORT1:
632cdf0e10cSrcweir 		rAny <<= (sal_Int16)nSeqNo;
633cdf0e10cSrcweir 		break;
634cdf0e10cSrcweir 	default:
635cdf0e10cSrcweir 		DBG_ERROR("illegal property");
636cdf0e10cSrcweir 	}
637cdf0e10cSrcweir 	return sal_True;
638cdf0e10cSrcweir }
639cdf0e10cSrcweir 
PutValue(const uno::Any & rAny,sal_uInt16 nWhichId)640cdf0e10cSrcweir sal_Bool SwGetRefField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
641cdf0e10cSrcweir {
642cdf0e10cSrcweir 	String sTmp;
643cdf0e10cSrcweir     switch( nWhichId )
644cdf0e10cSrcweir 	{
645cdf0e10cSrcweir 	case FIELD_PROP_USHORT1:
646cdf0e10cSrcweir 		{
647cdf0e10cSrcweir 			sal_Int16 nPart = 0;
648cdf0e10cSrcweir 			rAny >>= nPart;
649cdf0e10cSrcweir 			switch(nPart)
650cdf0e10cSrcweir 			{
651cdf0e10cSrcweir 			case ReferenceFieldPart::PAGE: 					nPart = REF_PAGE; break;
652cdf0e10cSrcweir 			case ReferenceFieldPart::CHAPTER:	 			nPart = REF_CHAPTER; break;
653cdf0e10cSrcweir 			case ReferenceFieldPart::TEXT: 					nPart = REF_CONTENT; break;
654cdf0e10cSrcweir 			case ReferenceFieldPart::UP_DOWN: 				nPart = REF_UPDOWN; break;
655cdf0e10cSrcweir 			case ReferenceFieldPart::PAGE_DESC: 			nPart = REF_PAGE_PGDESC; break;
656cdf0e10cSrcweir 			case ReferenceFieldPart::CATEGORY_AND_NUMBER: 	nPart = REF_ONLYNUMBER; break;
657cdf0e10cSrcweir 			case ReferenceFieldPart::ONLY_CAPTION: 			nPart = REF_ONLYCAPTION; break;
658cdf0e10cSrcweir 			case ReferenceFieldPart::ONLY_SEQUENCE_NUMBER : nPart = REF_ONLYSEQNO; break;
659cdf0e10cSrcweir             // --> OD 2007-09-06 #i81002#
660cdf0e10cSrcweir             case ReferenceFieldPart::NUMBER:              nPart = REF_NUMBER;              break;
661cdf0e10cSrcweir             case ReferenceFieldPart::NUMBER_NO_CONTEXT:   nPart = REF_NUMBER_NO_CONTEXT;   break;
662cdf0e10cSrcweir             case ReferenceFieldPart::NUMBER_FULL_CONTEXT: nPart = REF_NUMBER_FULL_CONTEXT; break;
663cdf0e10cSrcweir             // <--
664cdf0e10cSrcweir 			default: return sal_False;
665cdf0e10cSrcweir 			}
666cdf0e10cSrcweir 			SetFormat(nPart);
667cdf0e10cSrcweir 		}
668cdf0e10cSrcweir 		break;
669cdf0e10cSrcweir 	case FIELD_PROP_USHORT2:
670cdf0e10cSrcweir 		{
671cdf0e10cSrcweir 			sal_Int16 nSource = 0;
672cdf0e10cSrcweir 			rAny >>= nSource;
673cdf0e10cSrcweir 			switch(nSource)
674cdf0e10cSrcweir 			{
675cdf0e10cSrcweir 			case ReferenceFieldSource::REFERENCE_MARK : nSubType = REF_SETREFATTR ; break;
676cdf0e10cSrcweir             case ReferenceFieldSource::SEQUENCE_FIELD :
677cdf0e10cSrcweir             {
678cdf0e10cSrcweir                 if(REF_SEQUENCEFLD == nSubType)
679cdf0e10cSrcweir                     break;
680cdf0e10cSrcweir                 nSubType = REF_SEQUENCEFLD;
681cdf0e10cSrcweir                 ConvertProgrammaticToUIName();
682cdf0e10cSrcweir             }
683cdf0e10cSrcweir             break;
684cdf0e10cSrcweir 			case ReferenceFieldSource::BOOKMARK		  : nSubType = REF_BOOKMARK   ; break;
685cdf0e10cSrcweir 			case ReferenceFieldSource::FOOTNOTE		  : nSubType = REF_FOOTNOTE   ; break;
686cdf0e10cSrcweir 			case ReferenceFieldSource::ENDNOTE		  : nSubType = REF_ENDNOTE    ; break;
687cdf0e10cSrcweir 			}
688cdf0e10cSrcweir 		}
689cdf0e10cSrcweir 		break;
690cdf0e10cSrcweir 	case FIELD_PROP_PAR1:
691cdf0e10cSrcweir     {
692cdf0e10cSrcweir         OUString sTmpStr;
693cdf0e10cSrcweir         rAny >>= sTmpStr;
694cdf0e10cSrcweir         SetPar1(sTmpStr);
695cdf0e10cSrcweir         ConvertProgrammaticToUIName();
696cdf0e10cSrcweir     }
697cdf0e10cSrcweir     break;
698cdf0e10cSrcweir 	case FIELD_PROP_PAR3:
699cdf0e10cSrcweir 		SetExpand( ::GetString( rAny, sTmp ));
700cdf0e10cSrcweir 		break;
701cdf0e10cSrcweir 	case FIELD_PROP_SHORT1:
702cdf0e10cSrcweir 		{
703cdf0e10cSrcweir 			sal_Int16 nSetSeq = 0;
704cdf0e10cSrcweir 			rAny >>= nSetSeq;
705cdf0e10cSrcweir 			if(nSetSeq >= 0)
706cdf0e10cSrcweir 				nSeqNo = nSetSeq;
707cdf0e10cSrcweir 		}
708cdf0e10cSrcweir 		break;
709cdf0e10cSrcweir 	default:
710cdf0e10cSrcweir 		DBG_ERROR("illegal property");
711cdf0e10cSrcweir 	}
712cdf0e10cSrcweir 	return sal_True;
713cdf0e10cSrcweir }
714cdf0e10cSrcweir 
ConvertProgrammaticToUIName()715cdf0e10cSrcweir void SwGetRefField::ConvertProgrammaticToUIName()
716cdf0e10cSrcweir {
717cdf0e10cSrcweir     if(GetTyp() && REF_SEQUENCEFLD == nSubType)
718cdf0e10cSrcweir     {
719cdf0e10cSrcweir         SwDoc* pDoc = ((SwGetRefFieldType*)GetTyp())->GetDoc();
720cdf0e10cSrcweir         const String& rPar1 = GetPar1();
721cdf0e10cSrcweir         //don't convert when the name points to an existing field type
722cdf0e10cSrcweir         if(!pDoc->GetFldType(RES_SETEXPFLD, rPar1, false))
723cdf0e10cSrcweir         {
724cdf0e10cSrcweir             sal_uInt16 nPoolId = SwStyleNameMapper::GetPoolIdFromProgName( rPar1, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL );
725cdf0e10cSrcweir             sal_uInt16 nResId = USHRT_MAX;
726cdf0e10cSrcweir             switch( nPoolId )
727cdf0e10cSrcweir             {
728cdf0e10cSrcweir                 case RES_POOLCOLL_LABEL_ABB:
729cdf0e10cSrcweir                     nResId = STR_POOLCOLL_LABEL_ABB;
730cdf0e10cSrcweir                 break;
731cdf0e10cSrcweir                 case RES_POOLCOLL_LABEL_TABLE:
732cdf0e10cSrcweir                     nResId = STR_POOLCOLL_LABEL_TABLE;
733cdf0e10cSrcweir                 break;
734cdf0e10cSrcweir                 case RES_POOLCOLL_LABEL_FRAME:
735cdf0e10cSrcweir                     nResId = STR_POOLCOLL_LABEL_FRAME;
736cdf0e10cSrcweir                 break;
737cdf0e10cSrcweir                 case RES_POOLCOLL_LABEL_DRAWING:
738cdf0e10cSrcweir                     nResId = STR_POOLCOLL_LABEL_DRAWING;
739cdf0e10cSrcweir                 break;
740cdf0e10cSrcweir             }
741cdf0e10cSrcweir             if( nResId != USHRT_MAX )
742cdf0e10cSrcweir                 SetPar1(SW_RESSTR( nResId ));
743cdf0e10cSrcweir         }
744cdf0e10cSrcweir     }
745cdf0e10cSrcweir }
746cdf0e10cSrcweir 
SwGetRefFieldType(SwDoc * pDc)747cdf0e10cSrcweir SwGetRefFieldType::SwGetRefFieldType( SwDoc* pDc )
748cdf0e10cSrcweir 	: SwFieldType( RES_GETREFFLD ), pDoc( pDc )
749cdf0e10cSrcweir {}
750cdf0e10cSrcweir 
751cdf0e10cSrcweir 
Copy() const752cdf0e10cSrcweir SwFieldType* SwGetRefFieldType::Copy() const
753cdf0e10cSrcweir {
754cdf0e10cSrcweir 	return new SwGetRefFieldType( pDoc );
755cdf0e10cSrcweir }
756cdf0e10cSrcweir 
757cdf0e10cSrcweir 
Modify(const SfxPoolItem * pOld,const SfxPoolItem * pNew)758cdf0e10cSrcweir void SwGetRefFieldType::Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew )
759cdf0e10cSrcweir {
760c0286415SOliver-Rainer Wittmann     // Update auf alle GetReferenz-Felder
761c0286415SOliver-Rainer Wittmann     if( !pNew && !pOld )
762c0286415SOliver-Rainer Wittmann     {
763c0286415SOliver-Rainer Wittmann         SwIterator<SwFmtFld,SwFieldType> aIter( *this );
764c0286415SOliver-Rainer Wittmann         for( SwFmtFld* pFmtFld = aIter.First(); pFmtFld; pFmtFld = aIter.Next() )
765c0286415SOliver-Rainer Wittmann         {
766c0286415SOliver-Rainer Wittmann             // nur die GetRef-Felder Updaten
767c0286415SOliver-Rainer Wittmann             //JP 3.4.2001: Task 71231 - we need the correct language
768c0286415SOliver-Rainer Wittmann             SwGetRefField* pGRef = (SwGetRefField*)pFmtFld->GetField();
769c0286415SOliver-Rainer Wittmann             const SwTxtFld* pTFld;
770c0286415SOliver-Rainer Wittmann             if( !pGRef->GetLanguage() &&
771c0286415SOliver-Rainer Wittmann                 0 != ( pTFld = pFmtFld->GetTxtFld()) &&
772cdf0e10cSrcweir                 pTFld->GetpTxtNode() )
773cdf0e10cSrcweir             {
774c0286415SOliver-Rainer Wittmann                 pGRef->SetLanguage( pTFld->GetpTxtNode()->GetLang(
775c0286415SOliver-Rainer Wittmann                                                 *pTFld->GetStart() ) );
776cdf0e10cSrcweir             }
777cdf0e10cSrcweir 
778c0286415SOliver-Rainer Wittmann             pGRef->UpdateField( pFmtFld->GetTxtFld() );
779c0286415SOliver-Rainer Wittmann         }
780c0286415SOliver-Rainer Wittmann     }
781c0286415SOliver-Rainer Wittmann     // weiter an die Text-Felder, diese "Expandieren" den Text
782c0286415SOliver-Rainer Wittmann     NotifyClients( pOld, pNew );
783cdf0e10cSrcweir }
784cdf0e10cSrcweir 
FindAnchor(SwDoc * pDoc,const String & rRefMark,sal_uInt16 nSubType,sal_uInt16 nSeqNo,sal_uInt16 * pStt,sal_uInt16 * pEnd)785cdf0e10cSrcweir SwTxtNode* SwGetRefFieldType::FindAnchor( SwDoc* pDoc, const String& rRefMark,
786cdf0e10cSrcweir 										sal_uInt16 nSubType, sal_uInt16 nSeqNo,
787cdf0e10cSrcweir 										sal_uInt16* pStt, sal_uInt16* pEnd )
788cdf0e10cSrcweir {
789cdf0e10cSrcweir 	ASSERT( pStt, "warum wird keine StartPos abgefragt?" );
790cdf0e10cSrcweir 
791cdf0e10cSrcweir 	SwTxtNode* pTxtNd = 0;
792cdf0e10cSrcweir 	switch( nSubType )
793cdf0e10cSrcweir 	{
794cdf0e10cSrcweir 	case REF_SETREFATTR:
795cdf0e10cSrcweir 		{
796cdf0e10cSrcweir 			const SwFmtRefMark *pRef = pDoc->GetRefMark( rRefMark );
797cdf0e10cSrcweir 			if( pRef && pRef->GetTxtRefMark() )
798cdf0e10cSrcweir 			{
799cdf0e10cSrcweir 				pTxtNd = (SwTxtNode*)&pRef->GetTxtRefMark()->GetTxtNode();
800cdf0e10cSrcweir 				*pStt = *pRef->GetTxtRefMark()->GetStart();
801cdf0e10cSrcweir 				if( pEnd )
802cdf0e10cSrcweir 					*pEnd = *pRef->GetTxtRefMark()->GetAnyEnd();
803cdf0e10cSrcweir 			}
804cdf0e10cSrcweir 		}
805cdf0e10cSrcweir 		break;
806cdf0e10cSrcweir 
807cdf0e10cSrcweir 	case REF_SEQUENCEFLD:
808cdf0e10cSrcweir 		{
809cdf0e10cSrcweir 			SwFieldType* pFldType = pDoc->GetFldType( RES_SETEXPFLD, rRefMark, false );
810cdf0e10cSrcweir 			if( pFldType && pFldType->GetDepends() &&
811cdf0e10cSrcweir 				nsSwGetSetExpType::GSE_SEQ & ((SwSetExpFieldType*)pFldType)->GetType() )
812cdf0e10cSrcweir 			{
813cdf0e10cSrcweir 				SwIterator<SwFmtFld,SwFieldType> aIter( *pFldType );
814c0286415SOliver-Rainer Wittmann 				for( SwFmtFld* pFmtFld = aIter.First(); pFmtFld; pFmtFld = aIter.Next() )
815cdf0e10cSrcweir 				{
816c0286415SOliver-Rainer Wittmann 					if( pFmtFld->GetTxtFld() && nSeqNo ==
817c0286415SOliver-Rainer Wittmann 						((SwSetExpField*)pFmtFld->GetField())->GetSeqNumber() )
818cdf0e10cSrcweir 					{
819c0286415SOliver-Rainer Wittmann 						SwTxtFld* pTxtFld = pFmtFld->GetTxtFld();
820cdf0e10cSrcweir 						pTxtNd = (SwTxtNode*)pTxtFld->GetpTxtNode();
821cdf0e10cSrcweir 						*pStt = *pTxtFld->GetStart();
822cdf0e10cSrcweir 						if( pEnd )
823cdf0e10cSrcweir 							*pEnd = (*pStt) + 1;
824cdf0e10cSrcweir 						break;
825cdf0e10cSrcweir 					}
826cdf0e10cSrcweir 				}
827cdf0e10cSrcweir 			}
828cdf0e10cSrcweir 		}
829cdf0e10cSrcweir 		break;
830cdf0e10cSrcweir 
831cdf0e10cSrcweir     case REF_BOOKMARK:
832cdf0e10cSrcweir         {
833cdf0e10cSrcweir             IDocumentMarkAccess::const_iterator_t ppMark = pDoc->getIDocumentMarkAccess()->findMark(rRefMark);
834*dec99bbdSOliver-Rainer Wittmann             if(ppMark != pDoc->getIDocumentMarkAccess()->getAllMarksEnd())
835cdf0e10cSrcweir             {
836cdf0e10cSrcweir                 const ::sw::mark::IMark* pBkmk = ppMark->get();
837cdf0e10cSrcweir                 const SwPosition* pPos = &pBkmk->GetMarkStart();
838cdf0e10cSrcweir 
839cdf0e10cSrcweir                 pTxtNd = pPos->nNode.GetNode().GetTxtNode();
840cdf0e10cSrcweir                 *pStt = pPos->nContent.GetIndex();
841cdf0e10cSrcweir                 if(pEnd)
842cdf0e10cSrcweir                 {
843cdf0e10cSrcweir                     if(!pBkmk->IsExpanded())
844cdf0e10cSrcweir                     {
845cdf0e10cSrcweir                         *pEnd = *pStt;
846cdf0e10cSrcweir                         // --> OD 2007-10-18 #i81002#
847cdf0e10cSrcweir                         if(dynamic_cast< ::sw::mark::CrossRefBookmark const *>(pBkmk))
848cdf0e10cSrcweir                         {
849cdf0e10cSrcweir                             ASSERT( pTxtNd,
850cdf0e10cSrcweir                                     "<SwGetRefFieldType::FindAnchor(..)> - node marked by cross-reference bookmark isn't a text node --> crash" );
851cdf0e10cSrcweir                             *pEnd = pTxtNd->Len();
852cdf0e10cSrcweir                         }
853cdf0e10cSrcweir                         // <--
854cdf0e10cSrcweir                     }
855cdf0e10cSrcweir                     else if(pBkmk->GetOtherMarkPos().nNode == pBkmk->GetMarkPos().nNode)
856cdf0e10cSrcweir                         *pEnd = pBkmk->GetMarkEnd().nContent.GetIndex();
857cdf0e10cSrcweir                     else
858cdf0e10cSrcweir                         *pEnd = USHRT_MAX;
859cdf0e10cSrcweir                 }
860cdf0e10cSrcweir             }
861cdf0e10cSrcweir         }
862cdf0e10cSrcweir         break;
863cdf0e10cSrcweir 
864cdf0e10cSrcweir 	case REF_OUTLINE:
865cdf0e10cSrcweir 		break;
866cdf0e10cSrcweir 
867cdf0e10cSrcweir 	case REF_FOOTNOTE:
868cdf0e10cSrcweir 	case REF_ENDNOTE:
869cdf0e10cSrcweir 		{
870cdf0e10cSrcweir 			sal_uInt16 n, nFtnCnt = pDoc->GetFtnIdxs().Count();
871cdf0e10cSrcweir 			SwTxtFtn* pFtnIdx;
872cdf0e10cSrcweir 			for( n = 0; n < nFtnCnt; ++n )
873cdf0e10cSrcweir 				if( nSeqNo == (pFtnIdx = pDoc->GetFtnIdxs()[ n ])->GetSeqRefNo() )
874cdf0e10cSrcweir 				{
875cdf0e10cSrcweir 					SwNodeIndex* pIdx = pFtnIdx->GetStartNode();
876cdf0e10cSrcweir 					if( pIdx )
877cdf0e10cSrcweir 					{
878cdf0e10cSrcweir 						SwNodeIndex aIdx( *pIdx, 1 );
879cdf0e10cSrcweir 						if( 0 == ( pTxtNd = aIdx.GetNode().GetTxtNode()))
880cdf0e10cSrcweir 							pTxtNd = (SwTxtNode*)pDoc->GetNodes().GoNext( &aIdx );
881cdf0e10cSrcweir 					}
882cdf0e10cSrcweir 					*pStt = 0;
883cdf0e10cSrcweir 					if( pEnd )
884cdf0e10cSrcweir 						*pEnd = 0;
885cdf0e10cSrcweir 					break;
886cdf0e10cSrcweir 				}
887cdf0e10cSrcweir 		}
888cdf0e10cSrcweir 		break;
889cdf0e10cSrcweir 	}
890cdf0e10cSrcweir 
891cdf0e10cSrcweir 	return pTxtNd;
892cdf0e10cSrcweir }
893cdf0e10cSrcweir 
894cdf0e10cSrcweir 
895cdf0e10cSrcweir struct _RefIdsMap
896cdf0e10cSrcweir {
897cdf0e10cSrcweir 	String aName;
898cdf0e10cSrcweir 	SvUShortsSort aIds, aDstIds, aIdsMap;
899cdf0e10cSrcweir 	SvUShorts aMap;
900cdf0e10cSrcweir 	sal_Bool bInit;
901cdf0e10cSrcweir 
_RefIdsMap_RefIdsMap902cdf0e10cSrcweir 	_RefIdsMap( const String& rName )
903cdf0e10cSrcweir 		: aName( rName ), aIds( 16, 16 ), aIdsMap( 16, 16 ), aMap( 16, 16 ),
904cdf0e10cSrcweir 		bInit( sal_False )
905cdf0e10cSrcweir 	{}
906cdf0e10cSrcweir 
907cdf0e10cSrcweir 	void Check( SwDoc& rDoc, SwDoc& rDestDoc, SwGetRefField& rFld,
908cdf0e10cSrcweir 					sal_Bool bField = sal_True );
909cdf0e10cSrcweir 
IsInit_RefIdsMap910cdf0e10cSrcweir 	sal_Bool IsInit() const { return bInit; }
911cdf0e10cSrcweir };
912cdf0e10cSrcweir 
913cdf0e10cSrcweir SV_DECL_PTRARR_DEL( _RefIdsMaps, _RefIdsMap*, 5, 5 )
SV_IMPL_PTRARR(_RefIdsMaps,_RefIdsMap *)914cdf0e10cSrcweir SV_IMPL_PTRARR( _RefIdsMaps, _RefIdsMap* )
915cdf0e10cSrcweir 
916cdf0e10cSrcweir void _RefIdsMap::Check( SwDoc& rDoc, SwDoc& rDestDoc, SwGetRefField& rFld,
917cdf0e10cSrcweir 						sal_Bool bField )
918cdf0e10cSrcweir {
919cdf0e10cSrcweir 
920cdf0e10cSrcweir 	if( !bInit )
921cdf0e10cSrcweir 	{
922cdf0e10cSrcweir 		if( bField )
923cdf0e10cSrcweir 		{
924cdf0e10cSrcweir 			const SwTxtNode* pNd;
925cdf0e10cSrcweir 			SwFieldType* pType;
926cdf0e10cSrcweir 			if( 0 != ( pType = rDestDoc.GetFldType( RES_SETEXPFLD, aName, false ) ))
927cdf0e10cSrcweir 			{
928cdf0e10cSrcweir 				SwIterator<SwFmtFld,SwFieldType> aIter( *pType );
929cdf0e10cSrcweir 				for( SwFmtFld* pF = aIter.First(); pF; pF = aIter.Next() )
930cdf0e10cSrcweir 					if( pF->GetTxtFld() &&
931cdf0e10cSrcweir 						0 != ( pNd = pF->GetTxtFld()->GetpTxtNode() ) &&
932cdf0e10cSrcweir 						pNd->GetNodes().IsDocNodes() )
933c0286415SOliver-Rainer Wittmann 						aIds.Insert( ((SwSetExpField*)pF->GetField())->GetSeqNumber() );
934cdf0e10cSrcweir 			}
935cdf0e10cSrcweir 			if( 0 != ( pType = rDoc.GetFldType( RES_SETEXPFLD, aName, false ) ))
936cdf0e10cSrcweir 			{
937cdf0e10cSrcweir 				SwIterator<SwFmtFld,SwFieldType> aIter( *pType );
938cdf0e10cSrcweir 				for( SwFmtFld* pF = aIter.First(); pF; pF = aIter.Next() )
939cdf0e10cSrcweir 					if( pF->GetTxtFld() &&
940cdf0e10cSrcweir 						0 != ( pNd = pF->GetTxtFld()->GetpTxtNode() ) &&
941cdf0e10cSrcweir 						pNd->GetNodes().IsDocNodes() )
942c0286415SOliver-Rainer Wittmann 						aDstIds.Insert( ((SwSetExpField*)pF->GetField())->GetSeqNumber() );
943cdf0e10cSrcweir 			}
944cdf0e10cSrcweir 		}
945cdf0e10cSrcweir 		else
946cdf0e10cSrcweir 		{
947cdf0e10cSrcweir 			sal_uInt16 n;
948cdf0e10cSrcweir 
949cdf0e10cSrcweir 			for( n = rDestDoc.GetFtnIdxs().Count(); n; )
950cdf0e10cSrcweir 				aIds.Insert( rDestDoc.GetFtnIdxs()[ --n ]->GetSeqRefNo() );
951cdf0e10cSrcweir 			for( n = rDoc.GetFtnIdxs().Count(); n; )
952cdf0e10cSrcweir 				aDstIds.Insert( rDoc.GetFtnIdxs()[ --n ]->GetSeqRefNo() );
953cdf0e10cSrcweir 		}
954cdf0e10cSrcweir 		bInit = sal_True;
955cdf0e10cSrcweir 	}
956cdf0e10cSrcweir 
957cdf0e10cSrcweir 	// dann teste mal, ob die Nummer schon vergeben ist
958cdf0e10cSrcweir 	// oder ob eine neue bestimmt werden muss.
959cdf0e10cSrcweir 	sal_uInt16 nPos, nSeqNo = rFld.GetSeqNo();
960cdf0e10cSrcweir 	if( aIds.Seek_Entry( nSeqNo ) && aDstIds.Seek_Entry( nSeqNo ))
961cdf0e10cSrcweir 	{
962cdf0e10cSrcweir 		// ist schon vergeben, also muss eine neue
963cdf0e10cSrcweir 		// erzeugt werden.
964cdf0e10cSrcweir 		if( aIdsMap.Seek_Entry( nSeqNo, &nPos ))
965cdf0e10cSrcweir 			rFld.SetSeqNo( aMap[ nPos ] );
966cdf0e10cSrcweir 		else
967cdf0e10cSrcweir 		{
968cdf0e10cSrcweir 			sal_uInt16 n;
969cdf0e10cSrcweir 
970cdf0e10cSrcweir 			for( n = 0; n < aIds.Count(); ++n )
971cdf0e10cSrcweir 				if( n != aIds[ n ] )
972cdf0e10cSrcweir 					break;
973cdf0e10cSrcweir 
974cdf0e10cSrcweir 			// die neue SeqNo eintragen, damit die "belegt" ist
975cdf0e10cSrcweir 			aIds.Insert( n );
976cdf0e10cSrcweir 			aIdsMap.Insert( nSeqNo, nPos );
977cdf0e10cSrcweir 			aMap.Insert( n, nPos );
978cdf0e10cSrcweir 			rFld.SetSeqNo( n );
979cdf0e10cSrcweir 
980cdf0e10cSrcweir 			// und noch die Felder oder Fuss-/EndNote auf die neue
981cdf0e10cSrcweir 			// Id umsetzen
982cdf0e10cSrcweir 			if( bField )
983cdf0e10cSrcweir 			{
984cdf0e10cSrcweir 				SwFieldType* pType = rDoc.GetFldType( RES_SETEXPFLD, aName, false );
985cdf0e10cSrcweir 				if( pType )
986cdf0e10cSrcweir 				{
987cdf0e10cSrcweir 				    SwIterator<SwFmtFld,SwFieldType> aIter( *pType );
988cdf0e10cSrcweir 				    for( SwFmtFld* pF = aIter.First(); pF; pF = aIter.Next() )
989cdf0e10cSrcweir 						if( pF->GetTxtFld() && nSeqNo ==
990c0286415SOliver-Rainer Wittmann 							((SwSetExpField*)pF->GetField())->GetSeqNumber() )
991c0286415SOliver-Rainer Wittmann 							((SwSetExpField*)pF->GetField())->SetSeqNumber( n );
992cdf0e10cSrcweir 				}
993cdf0e10cSrcweir 			}
994cdf0e10cSrcweir 			else
995cdf0e10cSrcweir 			{
996cdf0e10cSrcweir 				SwTxtFtn* pFtnIdx;
997cdf0e10cSrcweir 				for( sal_uInt16 i = 0, nCnt = rDoc.GetFtnIdxs().Count(); i < nCnt; ++i )
998cdf0e10cSrcweir 					if( nSeqNo == (pFtnIdx = rDoc.GetFtnIdxs()[ i ])->GetSeqRefNo() )
999cdf0e10cSrcweir 					{
1000cdf0e10cSrcweir 						pFtnIdx->SetSeqNo( n );
1001cdf0e10cSrcweir 						break;
1002cdf0e10cSrcweir 					}
1003cdf0e10cSrcweir 			}
1004cdf0e10cSrcweir 		}
1005cdf0e10cSrcweir 	}
1006cdf0e10cSrcweir 	else
1007cdf0e10cSrcweir 	{
1008cdf0e10cSrcweir 		aIds.Insert( nSeqNo );
1009cdf0e10cSrcweir 		aIdsMap.Insert( nSeqNo, nPos );
1010cdf0e10cSrcweir 		aMap.Insert( nSeqNo, nPos );
1011cdf0e10cSrcweir 	}
1012cdf0e10cSrcweir }
1013cdf0e10cSrcweir 
1014cdf0e10cSrcweir 
MergeWithOtherDoc(SwDoc & rDestDoc)1015cdf0e10cSrcweir void SwGetRefFieldType::MergeWithOtherDoc( SwDoc& rDestDoc )
1016cdf0e10cSrcweir {
1017cdf0e10cSrcweir 	if( &rDestDoc != pDoc &&
1018cdf0e10cSrcweir 		rDestDoc.GetSysFldType( RES_GETREFFLD )->GetDepends() )
1019cdf0e10cSrcweir 	{
1020cdf0e10cSrcweir 		// dann gibt es im DestDoc RefFelder, also muessen im SourceDoc
1021cdf0e10cSrcweir 		// alle RefFelder auf einduetige Ids in beiden Docs umgestellt
1022cdf0e10cSrcweir 		// werden.
1023cdf0e10cSrcweir 		_RefIdsMap aFntMap( aEmptyStr );
1024cdf0e10cSrcweir 		_RefIdsMaps aFldMap;
1025cdf0e10cSrcweir 
1026cdf0e10cSrcweir 		SwIterator<SwFmtFld,SwFieldType> aIter( *this );
1027cdf0e10cSrcweir 		for( SwFmtFld* pFld = aIter.First(); pFld; pFld = aIter.Next() )
1028cdf0e10cSrcweir 		{
1029c0286415SOliver-Rainer Wittmann 			SwGetRefField& rRefFld = *(SwGetRefField*)pFld->GetField();
1030cdf0e10cSrcweir 			switch( rRefFld.GetSubType() )
1031cdf0e10cSrcweir 			{
1032cdf0e10cSrcweir 			case REF_SEQUENCEFLD:
1033cdf0e10cSrcweir 				{
1034cdf0e10cSrcweir 					_RefIdsMap* pMap = 0;
1035cdf0e10cSrcweir 					for( sal_uInt16 n = aFldMap.Count(); n; )
1036cdf0e10cSrcweir 						if( aFldMap[ --n ]->aName == rRefFld.GetSetRefName() )
1037cdf0e10cSrcweir 						{
1038cdf0e10cSrcweir 							pMap = aFldMap[ n ];
1039cdf0e10cSrcweir 							break;
1040cdf0e10cSrcweir 						}
1041cdf0e10cSrcweir 					if( !pMap )
1042cdf0e10cSrcweir 					{
1043cdf0e10cSrcweir 						pMap = new _RefIdsMap( rRefFld.GetSetRefName() );
1044cdf0e10cSrcweir 						aFldMap.C40_INSERT( _RefIdsMap, pMap, aFldMap.Count() );
1045cdf0e10cSrcweir 					}
1046cdf0e10cSrcweir 
1047cdf0e10cSrcweir 					pMap->Check( *pDoc, rDestDoc, rRefFld, sal_True );
1048cdf0e10cSrcweir 				}
1049cdf0e10cSrcweir 				break;
1050cdf0e10cSrcweir 
1051cdf0e10cSrcweir 			case REF_FOOTNOTE:
1052cdf0e10cSrcweir 			case REF_ENDNOTE:
1053cdf0e10cSrcweir 				aFntMap.Check( *pDoc, rDestDoc, rRefFld, sal_False );
1054cdf0e10cSrcweir 				break;
1055cdf0e10cSrcweir 			}
1056cdf0e10cSrcweir 		}
1057cdf0e10cSrcweir 	}
1058cdf0e10cSrcweir }
1059cdf0e10cSrcweir 
1060