xref: /trunk/main/sw/source/core/fields/docufld.cxx (revision 870262e3)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sw.hxx"
26 
27 #include <textapi.hxx>
28 
29 #include <tools/pstm.hxx>
30 #include <hintids.hxx>
31 #include <com/sun/star/text/XText.hpp>
32 #include <com/sun/star/script/XTypeConverter.hpp>
33 #include <com/sun/star/text/SetVariableType.hpp>
34 #include <com/sun/star/text/XTextFieldsSupplier.hpp>
35 #include <com/sun/star/text/UserDataPart.hpp>
36 #include <com/sun/star/text/ChapterFormat.hpp>
37 #include <com/sun/star/text/XTextField.hpp>
38 #include <com/sun/star/text/PlaceholderType.hpp>
39 #include <com/sun/star/text/TemplateDisplayFormat.hpp>
40 #include <com/sun/star/text/UserFieldFormat.hpp>
41 #include <com/sun/star/text/PageNumberType.hpp>
42 #include <com/sun/star/text/ReferenceFieldPart.hpp>
43 #include <com/sun/star/text/FilenameDisplayFormat.hpp>
44 #include <com/sun/star/text/XDependentTextField.hpp>
45 #include <com/sun/star/text/DocumentStatistic.hpp>
46 #include <com/sun/star/document/XDocumentPropertiesSupplier.hpp>
47 #include <com/sun/star/document/XDocumentProperties.hpp>
48 #include <com/sun/star/util/Date.hpp>
49 #include <com/sun/star/util/Duration.hpp>
50 #include <unotools/localedatawrapper.hxx>
51 #include <editeng/unolingu.hxx>
52 #include <comphelper/processfactory.hxx>
53 #include <comphelper/types.hxx>
54 #include <comphelper/string.hxx>
55 #include <tools/urlobj.hxx>
56 #include <vcl/svapp.hxx>
57 #include <svl/urihelper.hxx>
58 #include <unotools/useroptions.hxx>
59 #include <unotools/syslocale.hxx>
60 #include <svl/zforlist.hxx>
61 
62 #include <tools/time.hxx>
63 #include <tools/datetime.hxx>
64 
65 #include <com/sun/star/beans/PropertyAttribute.hpp>
66 #include <com/sun/star/util/Date.hpp>
67 #include <com/sun/star/util/DateTime.hpp>
68 #include <com/sun/star/util/Time.hpp>
69 
70 #include <tools/shl.hxx>
71 #include <swmodule.hxx>
72 #include <sfx2/app.hxx>
73 #include <sfx2/docfile.hxx>
74 #include <sfx2/doctempl.hxx>
75 #include <fmtfld.hxx>
76 #include <txtfld.hxx>
77 #include <charfmt.hxx>
78 #include <docstat.hxx>
79 #include <pagedesc.hxx>
80 #include <fmtpdsc.hxx>
81 #include <doc.hxx>
82 #include <rootfrm.hxx>		// AuthorField
83 #include <pagefrm.hxx>		//
84 #include <cntfrm.hxx>		//
85 #include <pam.hxx>
86 #include <viewsh.hxx>
87 #include <dbmgr.hxx>
88 #include <shellres.hxx>
89 #include <docufld.hxx>
90 #include <flddat.hxx>
91 #include <docfld.hxx>
92 #include <ndtxt.hxx>
93 #include <expfld.hxx>
94 #include <poolfmt.hxx>
95 #include <docsh.hxx>
96 #include <unofldmid.h>
97 #include <swunohelper.hxx>
98 #include <comcore.hrc>
99 
100 #include <editeng/outliner.hxx>
101 #include <editeng/outlobj.hxx>
102 #include <switerator.hxx>
103 
104 #define URL_DECODE 	INetURLObject::DECODE_UNAMBIGUOUS
105 
106 using ::rtl::OUString;
107 using namespace ::com::sun::star;
108 using namespace ::com::sun::star::uno;
109 using namespace nsSwDocInfoSubType;
110 
111 /*--------------------------------------------------------------------
112 	Beschreibung: SwPageNumberFieldType
113  --------------------------------------------------------------------*/
114 
SwPageNumberFieldType()115 SwPageNumberFieldType::SwPageNumberFieldType()
116 	: SwFieldType( RES_PAGENUMBERFLD ),
117 	nNumberingType( SVX_NUM_ARABIC ),
118 	nNum( 0 ),
119 	nMax( USHRT_MAX ),
120 	bVirtuell( sal_False )
121 {
122 }
123 
Expand(sal_uInt32 nFmt,short nOff,const String & rUserStr,String & rRet) const124 String& SwPageNumberFieldType::Expand( sal_uInt32 nFmt, short nOff,
125 								const String& rUserStr, String& rRet ) const
126 {
127 	sal_uInt32 nTmpFmt = (SVX_NUM_PAGEDESC == nFmt) ? (sal_uInt32)nNumberingType : nFmt;
128 	long nTmp = nNum + nOff;
129 
130 	if( 0 >= nTmp || SVX_NUM_NUMBER_NONE == nTmpFmt || (!bVirtuell && nTmp > nMax) )
131 		rRet = aEmptyStr;
132 	else if( SVX_NUM_CHAR_SPECIAL == nTmpFmt )
133 		rRet = rUserStr;
134 	else
135 		rRet = FormatNumber( (sal_uInt16)nTmp, nTmpFmt );
136 	return rRet;
137 }
138 
Copy() const139 SwFieldType* SwPageNumberFieldType::Copy() const
140 {
141 	SwPageNumberFieldType *pTmp = new SwPageNumberFieldType();
142 
143 	pTmp->nNum 		 = nNum;
144 	pTmp->nMax 		 = nMax;
145 	pTmp->nNumberingType = nNumberingType;
146 	pTmp->bVirtuell  = bVirtuell;
147 
148 	return pTmp;
149 }
150 
151 /*--------------------------------------------------------------------
152 	Beschreibung: Verschiedene Expandierung
153  --------------------------------------------------------------------*/
154 
ChangeExpansion(SwDoc * pDoc,sal_uInt16 nPage,sal_uInt16 nNumPages,sal_Bool bVirt,const sal_Int16 * pNumFmt)155 void SwPageNumberFieldType::ChangeExpansion( SwDoc* pDoc, sal_uInt16 nPage,
156 											sal_uInt16 nNumPages, sal_Bool bVirt,
157 											const sal_Int16* pNumFmt )
158 {
159 	nNum = nPage;
160 	nMax = nNumPages;
161 	if( pNumFmt )
162 		nNumberingType = *pNumFmt;
163 
164 	bVirtuell = sal_False;
165 	if( bVirt )
166 	{
167 		// dann muss das Flag ueberprueft werden, denn das Layout setzt
168 		// es NIE zurueck
169 		const SfxItemPool &rPool = pDoc->GetAttrPool();
170 		const SwFmtPageDesc *pDesc;
171 		sal_uInt32 nMaxItems = rPool.GetItemCount2( RES_PAGEDESC );
172 		for( sal_uInt32 n = 0; n < nMaxItems; ++n )
173 			if( 0 != (pDesc = (SwFmtPageDesc*)rPool.GetItem2( RES_PAGEDESC, n ) )
174 				&& pDesc->GetNumOffset() && pDesc->GetDefinedIn() )
175 			{
176                 SwCntntNode* pNd = PTR_CAST( SwCntntNode, pDesc->GetDefinedIn() );
177 				if( pNd )
178 				{
179                     if ( SwIterator<SwFrm,SwCntntNode>::FirstElement(*pNd) )
180 						bVirtuell = sal_True;
181 				}
182 				else if( pDesc->GetDefinedIn()->ISA( SwFmt ))
183 				{
184 					SwAutoFmtGetDocNode aGetHt( &pDoc->GetNodes() );
185 					bVirtuell = !pDesc->GetDefinedIn()->GetInfo( aGetHt );
186 					break;
187 				}
188 			}
189 	}
190 }
191 
192 /*--------------------------------------------------------------------
193 	Beschreibung: SwPageNumberField
194  --------------------------------------------------------------------*/
195 
SwPageNumberField(SwPageNumberFieldType * pTyp,sal_uInt16 nSub,sal_uInt32 nFmt,short nOff)196 SwPageNumberField::SwPageNumberField(SwPageNumberFieldType* pTyp,
197 									 sal_uInt16 nSub, sal_uInt32 nFmt, short nOff)
198 	: SwField(pTyp, nFmt), nSubType(nSub), nOffset(nOff)
199 {
200 }
201 
Expand() const202 String SwPageNumberField::Expand() const
203 {
204 	String sRet;
205 	SwPageNumberFieldType* pFldType = (SwPageNumberFieldType*)GetTyp();
206 
207 	if( PG_NEXT == nSubType && 1 != nOffset )
208 	{
209 		if( pFldType->Expand( GetFormat(), 1, sUserStr, sRet ).Len() )
210 			pFldType->Expand( GetFormat(), nOffset, sUserStr, sRet );
211 	}
212 	else if( PG_PREV == nSubType && -1 != nOffset )
213 	{
214 		if( pFldType->Expand( GetFormat(), -1, sUserStr, sRet ).Len() )
215 			pFldType->Expand( GetFormat(), nOffset, sUserStr, sRet );
216 	}
217 	else
218 		pFldType->Expand( GetFormat(), nOffset, sUserStr, sRet );
219 	return sRet;
220 }
221 
Copy() const222 SwField* SwPageNumberField::Copy() const
223 {
224 	SwPageNumberField *pTmp =
225 		new SwPageNumberField((SwPageNumberFieldType*)GetTyp(), nSubType, GetFormat(), nOffset);
226 	pTmp->SetLanguage( GetLanguage() );
227 	pTmp->SetUserString( sUserStr );
228 	return pTmp;
229 }
230 
GetPar2() const231 String SwPageNumberField::GetPar2() const
232 {
233 	return String::CreateFromInt32(nOffset);
234 }
235 
SetPar2(const String & rStr)236 void SwPageNumberField::SetPar2(const String& rStr)
237 {
238 	nOffset = (short)rStr.ToInt32();
239 }
240 
GetSubType() const241 sal_uInt16 SwPageNumberField::GetSubType() const
242 {
243 	return nSubType;
244 }
245 
QueryValue(uno::Any & rAny,sal_uInt16 nWhichId) const246 sal_Bool SwPageNumberField::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
247 {
248     switch( nWhichId )
249 	{
250 	case FIELD_PROP_FORMAT:
251 		rAny <<= (sal_Int16)GetFormat();
252 		break;
253 	case FIELD_PROP_USHORT1:
254 		rAny <<= nOffset;
255 		break;
256 	case FIELD_PROP_SUBTYPE:
257 		{
258 	 		text::PageNumberType eType;
259 			eType = text::PageNumberType_CURRENT;
260 			if(nSubType == PG_PREV)
261 				eType = text::PageNumberType_PREV;
262 			else if(nSubType == PG_NEXT)
263 				eType = text::PageNumberType_NEXT;
264 			rAny.setValue(&eType, ::getCppuType((const text::PageNumberType*)0));
265 		}
266 		break;
267 	case FIELD_PROP_PAR1:
268 		rAny <<= OUString(sUserStr);
269 		break;
270 
271 	default:
272 		DBG_ERROR("illegal property");
273 	}
274 	return sal_True;
275 }
276 
PutValue(const uno::Any & rAny,sal_uInt16 nWhichId)277 sal_Bool SwPageNumberField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
278 {
279     sal_Bool bRet = sal_True;
280 	sal_Int16 nSet = 0;
281     switch( nWhichId )
282 	{
283 	case FIELD_PROP_FORMAT:
284 		rAny >>= nSet;
285 
286 		// TODO: woher kommen die defines?
287 		if(nSet <= SVX_NUM_PAGEDESC )
288 			SetFormat(nSet);
289 		else {
290 			//exception(wrong_value)
291 			;
292         }
293 		break;
294 	case FIELD_PROP_USHORT1:
295 		rAny >>= nSet;
296 		nOffset = nSet;
297 		break;
298 	case FIELD_PROP_SUBTYPE:
299         switch( SWUnoHelper::GetEnumAsInt32( rAny ) )
300 		{
301 			case text::PageNumberType_CURRENT:
302 				nSubType = PG_RANDOM;
303 			break;
304 			case text::PageNumberType_PREV:
305 				nSubType = PG_PREV;
306 			break;
307             case text::PageNumberType_NEXT:
308                 nSubType = PG_NEXT;
309 			break;
310 			default:
311                 bRet = sal_False;
312 		}
313 		break;
314 	case FIELD_PROP_PAR1:
315 		::GetString( rAny, sUserStr );
316 		break;
317 
318 	default:
319 		DBG_ERROR("illegal property");
320 	}
321     return bRet;
322 }
323 /*--------------------------------------------------------------------
324 	Beschreibung: SwAuthorFieldType
325  --------------------------------------------------------------------*/
326 
SwAuthorFieldType()327 SwAuthorFieldType::SwAuthorFieldType()
328 	: SwFieldType( RES_AUTHORFLD )
329 {
330 }
331 
Expand(sal_uLong nFmt) const332 String SwAuthorFieldType::Expand(sal_uLong nFmt) const
333 {
334 	String sRet;
335     SvtUserOptions&  rOpt = SW_MOD()->GetUserOptions();
336 	if((nFmt & 0xff) == AF_NAME)
337         sRet = rOpt.GetFullName();
338 	else
339         sRet = rOpt.GetID();
340 	return sRet;
341 }
342 
Copy() const343 SwFieldType* SwAuthorFieldType::Copy() const
344 {
345 	return new SwAuthorFieldType;
346 }
347 
348 /*--------------------------------------------------------------------
349 	Beschreibung: SwAuthorField
350  --------------------------------------------------------------------*/
351 
SwAuthorField(SwAuthorFieldType * pTyp,sal_uInt32 nFmt)352 SwAuthorField::SwAuthorField(SwAuthorFieldType* pTyp, sal_uInt32 nFmt)
353 	: SwField(pTyp, nFmt)
354 {
355 	aContent = ((SwAuthorFieldType*)GetTyp())->Expand(GetFormat());
356 }
357 
Expand() const358 String SwAuthorField::Expand() const
359 {
360 	if (!IsFixed())
361 		((SwAuthorField*)this)->aContent =
362 					((SwAuthorFieldType*)GetTyp())->Expand(GetFormat());
363 
364 	return aContent;
365 }
366 
Copy() const367 SwField* SwAuthorField::Copy() const
368 {
369 	SwAuthorField *pTmp = new SwAuthorField( (SwAuthorFieldType*)GetTyp(),
370 												GetFormat());
371 	pTmp->SetExpansion(aContent);
372 	return pTmp;
373 }
374 
QueryValue(uno::Any & rAny,sal_uInt16 nWhichId) const375 sal_Bool SwAuthorField::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
376 {
377 	sal_Bool bVal;
378     switch( nWhichId )
379 	{
380 	case FIELD_PROP_BOOL1:
381 		bVal = (GetFormat() & 0xff) == AF_NAME;
382 		rAny.setValue(&bVal, ::getBooleanCppuType());
383 		break;
384 
385 	case FIELD_PROP_BOOL2:
386 		bVal = IsFixed();
387 		rAny.setValue(&bVal, ::getBooleanCppuType());
388 		break;
389 
390 	case FIELD_PROP_PAR1:
391 		rAny <<= rtl::OUString(GetContent());
392 		break;
393 
394 	default:
395 		DBG_ERROR("illegal property");
396 	}
397 	return sal_True;
398 }
399 
PutValue(const uno::Any & rAny,sal_uInt16 nWhichId)400 sal_Bool SwAuthorField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
401 {
402     switch( nWhichId )
403 	{
404 	case FIELD_PROP_BOOL1:
405 		SetFormat( *(sal_Bool*)rAny.getValue() ? AF_NAME : AF_SHORTCUT );
406 		break;
407 
408 	case FIELD_PROP_BOOL2:
409 		if( *(sal_Bool*)rAny.getValue() )
410 			SetFormat( GetFormat() | AF_FIXED);
411 		else
412 			SetFormat( GetFormat() & ~AF_FIXED);
413 		break;
414 
415 	case FIELD_PROP_PAR1:
416 		::GetString( rAny, aContent );
417 		break;
418 
419 	default:
420 		DBG_ERROR("illegal property");
421 	}
422 	return sal_True;
423 }
424 
425 /*--------------------------------------------------------------------
426 	Beschreibung: SwFileNameFieldType
427  --------------------------------------------------------------------*/
428 
SwFileNameFieldType(SwDoc * pDocument)429 SwFileNameFieldType::SwFileNameFieldType(SwDoc *pDocument)
430 	: SwFieldType( RES_FILENAMEFLD )
431 {
432 	pDoc = pDocument;
433 }
434 
Expand(sal_uLong nFmt) const435 String SwFileNameFieldType::Expand(sal_uLong nFmt) const
436 {
437 	String aRet;
438 	const SwDocShell* pDShell = pDoc->GetDocShell();
439 	if( pDShell && pDShell->HasName() )
440 	{
441 		const INetURLObject& rURLObj = pDShell->GetMedium()->GetURLObject();
442 		switch( nFmt & ~FF_FIXED )
443 		{
444 			case FF_PATH:
445 				{
446 					if( INET_PROT_FILE == rURLObj.GetProtocol() )
447 					{
448 						INetURLObject aTemp(rURLObj);
449 						aTemp.removeSegment();
450                         // #101947# last slash should belong to the pathname
451 						aRet = aTemp.PathToFileName();//GetFull();
452 					}
453 					else
454 					{
455 						aRet = URIHelper::removePassword(
456 									rURLObj.GetMainURL( INetURLObject::NO_DECODE ),
457 									INetURLObject::WAS_ENCODED, URL_DECODE );
458 						aRet.Erase( aRet.Search( String(rURLObj.GetLastName(
459 													URL_DECODE )) ) );
460 					}
461 				}
462 				break;
463 
464 			case FF_NAME:
465 				aRet = rURLObj.GetLastName( URL_DECODE );
466 				break;
467 
468 			case FF_NAME_NOEXT:
469 				aRet = rURLObj.GetBase();
470 				break;
471 
472 			default:
473 				if( INET_PROT_FILE == rURLObj.GetProtocol() )
474 					aRet = rURLObj.GetFull();
475 				else
476 					aRet = URIHelper::removePassword(
477 									rURLObj.GetMainURL( INetURLObject::NO_DECODE ),
478 									INetURLObject::WAS_ENCODED, URL_DECODE );
479 		}
480 	}
481 	return aRet;
482 }
483 
Copy() const484 SwFieldType* SwFileNameFieldType::Copy() const
485 {
486 	SwFieldType *pTmp = new SwFileNameFieldType(pDoc);
487 	return pTmp;
488 }
489 /*--------------------------------------------------------------------
490 	Beschreibung: SwFileNameField
491  --------------------------------------------------------------------*/
492 
SwFileNameField(SwFileNameFieldType * pTyp,sal_uInt32 nFmt)493 SwFileNameField::SwFileNameField(SwFileNameFieldType* pTyp, sal_uInt32 nFmt)
494 	: SwField(pTyp, nFmt)
495 {
496 	aContent = ((SwFileNameFieldType*)GetTyp())->Expand(GetFormat());
497 }
498 
Expand() const499 String SwFileNameField::Expand() const
500 {
501 	if (!IsFixed())
502 		((SwFileNameField*)this)->aContent = ((SwFileNameFieldType*)GetTyp())->Expand(GetFormat());
503 
504 	return aContent;
505 }
506 
Copy() const507 SwField* SwFileNameField::Copy() const
508 {
509 	SwFileNameField *pTmp =
510 		new SwFileNameField((SwFileNameFieldType*)GetTyp(), GetFormat());
511 	pTmp->SetExpansion(aContent);
512 
513 	return pTmp;
514 }
515 
QueryValue(uno::Any & rAny,sal_uInt16 nWhichId) const516 sal_Bool SwFileNameField::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
517 {
518     switch( nWhichId )
519 	{
520 	case FIELD_PROP_FORMAT:
521 		{
522         	sal_Int16 nRet;
523 			switch( GetFormat() &(~FF_FIXED) )
524 			{
525 				case FF_PATH:
526 					nRet = text::FilenameDisplayFormat::PATH;
527 				break;
528 				case FF_NAME_NOEXT:
529 					nRet = text::FilenameDisplayFormat::NAME;
530 				break;
531 				case FF_NAME:
532 					nRet = text::FilenameDisplayFormat::NAME_AND_EXT;
533 				break;
534 				default:	nRet = text::FilenameDisplayFormat::FULL;
535 			}
536 			rAny <<= nRet;
537 		}
538 		break;
539 
540 	case FIELD_PROP_BOOL2:
541 		{
542 			sal_Bool bVal = IsFixed();
543 			rAny.setValue(&bVal, ::getBooleanCppuType());
544 		}
545 		break;
546 
547 	case FIELD_PROP_PAR3:
548 		rAny <<= OUString(GetContent());
549 		break;
550 	default:
551 		DBG_ERROR("illegal property");
552 	}
553 	return sal_True;
554 }
555 
PutValue(const uno::Any & rAny,sal_uInt16 nWhichId)556 sal_Bool SwFileNameField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
557 {
558     switch( nWhichId )
559 	{
560 	case FIELD_PROP_FORMAT:
561 		{
562 			//JP 24.10.2001: int32 because in UnoField.cxx a putvalue is
563 			//				called with a int32 value! But normally we need
564 			//				here only a int16
565 			sal_Int32 nType = 0;
566 			rAny >>= nType;
567 			sal_Bool bFixed = IsFixed();
568 			switch( nType )
569 			{
570 				case text::FilenameDisplayFormat::PATH:
571 					nType = FF_PATH;
572 				break;
573 				case text::FilenameDisplayFormat::NAME:
574 					nType = FF_NAME_NOEXT;
575 				break;
576 				case text::FilenameDisplayFormat::NAME_AND_EXT:
577 					nType = FF_NAME;
578 				break;
579 				default:	nType = FF_PATHNAME;
580 			}
581 			if(bFixed)
582 				nType |= FF_FIXED;
583 			SetFormat(nType);
584 		}
585 		break;
586 
587 	case FIELD_PROP_BOOL2:
588 		if( *(sal_Bool*)rAny.getValue() )
589 			SetFormat( GetFormat() | FF_FIXED);
590 		else
591 			SetFormat( GetFormat() & ~FF_FIXED);
592 		break;
593 
594 	case FIELD_PROP_PAR3:
595 		::GetString( rAny, aContent );
596 		break;
597 
598 	default:
599 		DBG_ERROR("illegal property");
600 	}
601 	return sal_True;
602 }
603 /*--------------------------------------------------------------------
604 	Beschreibung: SwTemplNameFieldType
605  --------------------------------------------------------------------*/
606 
SwTemplNameFieldType(SwDoc * pDocument)607 SwTemplNameFieldType::SwTemplNameFieldType(SwDoc *pDocument)
608 	: SwFieldType( RES_TEMPLNAMEFLD )
609 {
610 	pDoc = pDocument;
611 }
612 
Expand(sal_uLong nFmt) const613 String SwTemplNameFieldType::Expand(sal_uLong nFmt) const
614 {
615 	ASSERT( nFmt < FF_END, "Expand: kein guelt. Fmt!" );
616 
617 	String aRet;
618     SwDocShell *pDocShell(pDoc->GetDocShell());
619     DBG_ASSERT(pDocShell, "no SwDocShell");
620     if (pDocShell) {
621         uno::Reference<document::XDocumentPropertiesSupplier> xDPS(
622             pDocShell->GetModel(), uno::UNO_QUERY_THROW);
623         uno::Reference<document::XDocumentProperties> xDocProps(
624             xDPS->getDocumentProperties());
625         DBG_ASSERT(xDocProps.is(), "Doc has no DocumentProperties");
626 
627 		if( FF_UI_NAME == nFmt )
628 			aRet = xDocProps->getTemplateName();
629 		else if( !xDocProps->getTemplateURL().equalsAscii("") )
630 		{
631 			if( FF_UI_RANGE == nFmt )
632 			{
633 				// fuers besorgen vom RegionNamen !!
634 				SfxDocumentTemplates aFac;
635 				aFac.Construct();
636 				String sTmp;
637 				aFac.GetLogicNames( xDocProps->getTemplateURL(), aRet, sTmp );
638 			}
639 			else
640 			{
641 				INetURLObject aPathName( xDocProps->getTemplateURL() );
642 				if( FF_NAME == nFmt )
643 					aRet = aPathName.GetName(URL_DECODE);
644 				else if( FF_NAME_NOEXT == nFmt )
645 					aRet = aPathName.GetBase();
646 				else
647 				{
648 					if( FF_PATH == nFmt )
649 					{
650 						aPathName.removeSegment();
651 						aRet = aPathName.GetFull();
652 					}
653 					else
654 						aRet = aPathName.GetFull();
655 				}
656 			}
657 		}
658 	}
659 	return aRet;
660 }
661 
Copy() const662 SwFieldType* SwTemplNameFieldType::Copy() const
663 {
664 	SwFieldType *pTmp = new SwTemplNameFieldType(pDoc);
665 	return pTmp;
666 }
667 /*--------------------------------------------------------------------
668 	Beschreibung: SwTemplNameField
669  --------------------------------------------------------------------*/
670 
SwTemplNameField(SwTemplNameFieldType * pTyp,sal_uInt32 nFmt)671 SwTemplNameField::SwTemplNameField(SwTemplNameFieldType* pTyp, sal_uInt32 nFmt)
672 	: SwField(pTyp, nFmt)
673 {}
674 
Expand() const675 String SwTemplNameField::Expand() const
676 {
677 	return((SwTemplNameFieldType*)GetTyp())->Expand(GetFormat());
678 }
679 
Copy() const680 SwField* SwTemplNameField::Copy() const
681 {
682 	SwTemplNameField *pTmp =
683 		new SwTemplNameField((SwTemplNameFieldType*)GetTyp(), GetFormat());
684 	return pTmp;
685 }
686 
QueryValue(uno::Any & rAny,sal_uInt16 nWhichId) const687 sal_Bool SwTemplNameField::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
688 {
689     switch ( nWhichId )
690 	{
691 	case FIELD_PROP_FORMAT:
692 		{
693         	sal_Int16 nRet;
694 			switch( GetFormat() )
695 			{
696 				case FF_PATH:		nRet = text::FilenameDisplayFormat::PATH; break;
697 				case FF_NAME_NOEXT: nRet = text::FilenameDisplayFormat::NAME; break;
698 				case FF_NAME: 		nRet = text::FilenameDisplayFormat::NAME_AND_EXT; break;
699 				case FF_UI_RANGE: 	nRet = text::TemplateDisplayFormat::AREA; break;
700 				case FF_UI_NAME:    nRet = text::TemplateDisplayFormat::TITLE;  break;
701 				default:	nRet = text::FilenameDisplayFormat::FULL;
702 
703 			}
704 			rAny <<= nRet;
705 		}
706 		break;
707 	default:
708 		DBG_ERROR("illegal property");
709 	}
710 	return sal_True;
711 }
712 
PutValue(const uno::Any & rAny,sal_uInt16 nWhichId)713 sal_Bool SwTemplNameField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
714 {
715     switch ( nWhichId )
716 	{
717 	case FIELD_PROP_FORMAT:
718 		{
719 			//JP 24.10.2001: int32 because in UnoField.cxx a putvalue is
720 			//				called with a int32 value! But normally we need
721 			//				here only a int16
722 			sal_Int32 nType = 0;
723 			rAny >>= nType;
724 			switch( nType )
725 			{
726 			case text::FilenameDisplayFormat::PATH:
727 				SetFormat(FF_PATH);
728 			break;
729 			case text::FilenameDisplayFormat::NAME:
730 				SetFormat(FF_NAME_NOEXT);
731 			break;
732 			case text::FilenameDisplayFormat::NAME_AND_EXT:
733 				SetFormat(FF_NAME);
734 			break;
735 			case text::TemplateDisplayFormat::AREA	:
736 				SetFormat(FF_UI_RANGE);
737 			break;
738 			case text::TemplateDisplayFormat::TITLE  :
739 				SetFormat(FF_UI_NAME);
740 			break;
741 			default:	SetFormat(FF_PATHNAME);
742 			}
743 		}
744 		break;
745 	default:
746 		DBG_ERROR("illegal property");
747 	}
748 	return sal_True;
749 }
750 /*--------------------------------------------------------------------
751 	Beschreibung: SwDocStatFieldType
752  --------------------------------------------------------------------*/
753 
SwDocStatFieldType(SwDoc * pDocument)754 SwDocStatFieldType::SwDocStatFieldType(SwDoc* pDocument)
755 	: SwFieldType( RES_DOCSTATFLD ), nNumberingType( SVX_NUM_ARABIC )
756 {
757 	pDoc = pDocument;
758 }
759 
Expand(sal_uInt16 nSubType,sal_uInt32 nFmt) const760 String SwDocStatFieldType::Expand(sal_uInt16 nSubType, sal_uInt32 nFmt) const
761 {
762 	sal_uInt32 nVal = 0;
763 	const SwDocStat& rDStat = pDoc->GetDocStat();
764 	switch( nSubType )
765 	{
766 		case DS_TBL:  nVal = rDStat.nTbl;   break;
767 		case DS_GRF:  nVal = rDStat.nGrf;   break;
768 		case DS_OLE:  nVal = rDStat.nOLE;   break;
769 		case DS_PARA: nVal = rDStat.nPara;  break;
770 		case DS_WORD: nVal = rDStat.nWord;  break;
771 		case DS_CHAR: nVal = rDStat.nChar;  break;
772 		case DS_PAGE:
773 			if( pDoc->GetCurrentLayout() )//swmod 080218
774 				((SwDocStat	&)rDStat).nPage = pDoc->GetCurrentLayout()->GetPageNum();	//swmod 080218
775 			nVal = rDStat.nPage;
776 			if( SVX_NUM_PAGEDESC == nFmt )
777 				nFmt = (sal_uInt32)nNumberingType;
778 			break;
779 		default:
780 			ASSERT( sal_False, "SwDocStatFieldType::Expand: unbekannter SubType" );
781 	}
782 
783 	String sRet;
784 	if( nVal <= SHRT_MAX )
785 		sRet = FormatNumber( (sal_uInt16)nVal, nFmt );
786 	else
787 		sRet = String::CreateFromInt32( nVal );
788 	return sRet;
789 }
790 
Copy() const791 SwFieldType* SwDocStatFieldType::Copy() const
792 {
793 	SwDocStatFieldType *pTmp = new SwDocStatFieldType(pDoc);
794 	return pTmp;
795 }
796 
797 /*--------------------------------------------------------------------
798 	Beschreibung: SwDocStatFieldType
799 				  Aus historischen Gruenden steht in nFormat der
800 				  SubType
801  --------------------------------------------------------------------*/
802 
SwDocStatField(SwDocStatFieldType * pTyp,sal_uInt16 nSub,sal_uInt32 nFmt)803 SwDocStatField::SwDocStatField(SwDocStatFieldType* pTyp, sal_uInt16 nSub, sal_uInt32 nFmt)
804 	: SwField(pTyp, nFmt),
805 	nSubType(nSub)
806 {}
807 
Expand() const808 String SwDocStatField::Expand() const
809 {
810 	return((SwDocStatFieldType*)GetTyp())->Expand(nSubType, GetFormat());
811 }
812 
Copy() const813 SwField* SwDocStatField::Copy() const
814 {
815 	SwDocStatField *pTmp = new SwDocStatField(
816 					(SwDocStatFieldType*)GetTyp(), nSubType, GetFormat() );
817 	return pTmp;
818 }
819 
GetSubType() const820 sal_uInt16 SwDocStatField::GetSubType() const
821 {
822 	return nSubType;
823 }
824 
SetSubType(sal_uInt16 nSub)825 void SwDocStatField::SetSubType(sal_uInt16 nSub)
826 {
827 	nSubType = nSub;
828 }
829 
ChangeExpansion(const SwFrm * pFrm)830 void SwDocStatField::ChangeExpansion( const SwFrm* pFrm )
831 {
832 	if( DS_PAGE == nSubType && SVX_NUM_PAGEDESC == GetFormat() )
833 		((SwDocStatFieldType*)GetTyp())->SetNumFormat(
834 				pFrm->FindPageFrm()->GetPageDesc()->GetNumType().GetNumberingType() );
835 }
836 
QueryValue(uno::Any & rAny,sal_uInt16 nWhichId) const837 sal_Bool SwDocStatField::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
838 {
839     switch ( nWhichId )
840 	{
841 	case FIELD_PROP_USHORT2:
842 		rAny <<= (sal_Int16)GetFormat();
843 		break;
844 	default:
845 		DBG_ERROR("illegal property");
846 	}
847 	return sal_True;
848 }
849 
PutValue(const uno::Any & rAny,sal_uInt16 nWhichId)850 sal_Bool SwDocStatField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
851 {
852 	sal_Bool bRet = sal_False;
853     switch ( nWhichId )
854 	{
855 	case FIELD_PROP_USHORT2:
856 		{
857 			sal_Int16 nSet = 0;
858 			rAny >>= nSet;
859 			if(nSet <= SVX_NUM_CHARS_LOWER_LETTER_N &&
860 				nSet != SVX_NUM_CHAR_SPECIAL &&
861 					nSet != SVX_NUM_BITMAP)
862 			{
863 				SetFormat(nSet);
864 				bRet = sal_True;
865 			}
866 		}
867 		break;
868 
869 	default:
870 		DBG_ERROR("illegal property");
871 	}
872 	return bRet;
873 }
874 
875 /*--------------------------------------------------------------------
876 	Beschreibung: DokumentinfoFields
877  --------------------------------------------------------------------*/
878 
SwDocInfoFieldType(SwDoc * pDc)879 SwDocInfoFieldType::SwDocInfoFieldType(SwDoc* pDc)
880 	: SwValueFieldType( pDc, RES_DOCINFOFLD )
881 {
882 }
883 
884 // ---------------------------------------------------------------------------
Copy() const885 SwFieldType* SwDocInfoFieldType::Copy() const
886 {
887 	SwDocInfoFieldType* pTyp = new SwDocInfoFieldType(GetDoc());
888 	return pTyp;
889 }
890 
lcl_GetLocalDataWrapper(sal_uLong nLang,const LocaleDataWrapper ** ppAppLocalData,const LocaleDataWrapper ** ppLocalData)891 void lcl_GetLocalDataWrapper( sal_uLong nLang,
892 							  const LocaleDataWrapper **ppAppLocalData,
893 							  const LocaleDataWrapper **ppLocalData )
894 {
895     SvtSysLocale aLocale;
896 	*ppAppLocalData = &aLocale.GetLocaleData();
897 	*ppLocalData = *ppAppLocalData;
898 	if( nLang != SvxLocaleToLanguage( (*ppLocalData)->getLocale() ) )
899 		*ppLocalData = new LocaleDataWrapper(
900 						::comphelper::getProcessServiceFactory(),
901 						SvxCreateLocale( static_cast<LanguageType>(nLang) ) );
902 }
903 
904 // ---------------------------------------------------------------------------
Expand(sal_uInt16 nSub,sal_uInt32 nFormat,sal_uInt16 nLang,const String & rName) const905 String SwDocInfoFieldType::Expand( sal_uInt16 nSub, sal_uInt32 nFormat,
906 									sal_uInt16 nLang, const String& rName ) const
907 {
908 	String aStr;
909 	const LocaleDataWrapper *pAppLocalData = 0, *pLocalData = 0;
910     SwDocShell *pDocShell(GetDoc()->GetDocShell());
911     DBG_ASSERT(pDocShell, "no SwDocShell");
912     if (!pDocShell) { return aStr; }
913 
914     uno::Reference<document::XDocumentPropertiesSupplier> xDPS(
915         pDocShell->GetModel(), uno::UNO_QUERY_THROW);
916     uno::Reference<document::XDocumentProperties> xDocProps(
917         xDPS->getDocumentProperties());
918     DBG_ASSERT(xDocProps.is(), "Doc has no DocumentProperties");
919 
920 	sal_uInt16 nExtSub = nSub & 0xff00;
921 	nSub &= 0xff;	// ExtendedSubTypes nicht beachten
922 
923 	switch(nSub)
924 	{
925 	case DI_TITEL:	aStr = xDocProps->getTitle();	    break;
926 	case DI_THEMA:	aStr = xDocProps->getSubject();	    break;
927 	case DI_KEYS:	aStr = ::comphelper::string::convertCommaSeparated(
928                                 xDocProps->getKeywords());
929                     break;
930 	case DI_COMMENT:aStr = xDocProps->getDescription();	break;
931 	case DI_DOCNO:	aStr = String::CreateFromInt32(
932 										xDocProps->getEditingCycles() );
933 					break;
934 	case DI_EDIT:
935 		if ( !nFormat )
936 		{
937 			lcl_GetLocalDataWrapper( nLang, &pAppLocalData, &pLocalData );
938             sal_Int32 dur = xDocProps->getEditingDuration();
939 			aStr = pLocalData->getTime( Time(dur/3600, (dur%3600)/60, dur%60),
940                                         sal_False, sal_False);
941 		}
942 		else
943 		{
944             sal_Int32 dur = xDocProps->getEditingDuration();
945             double fVal = Time(dur/3600, (dur%3600)/60, dur%60).GetTimeInDays();
946 			aStr = ExpandValue(fVal, nFormat, nLang);
947 		}
948 		break;
949 	case DI_CUSTOM:
950 		{
951 			::rtl::OUString sVal;
952 			try
953 			{
954 				uno::Any aAny;
955 				uno::Reference < beans::XPropertySet > xSet(
956                     xDocProps->getUserDefinedProperties(),
957                     uno::UNO_QUERY_THROW);
958 				aAny = xSet->getPropertyValue( rName );
959 
960 				uno::Reference < script::XTypeConverter > xConverter( comphelper::getProcessServiceFactory()
961 					->createInstance(::rtl::OUString::createFromAscii("com.sun.star.script.Converter")), uno::UNO_QUERY );
962 				uno::Any aNew;
963 					aNew = xConverter->convertToSimpleType( aAny, uno::TypeClass_STRING );
964 				aNew >>= sVal;
965 			}
966 			catch (uno::Exception&) {}
967 			return sVal;
968 		}
969 
970 	default:
971 		{
972 			String aName( xDocProps->getAuthor() );
973 			util::DateTime uDT( xDocProps->getCreationDate() );
974             Date aD(uDT.Day, uDT.Month, uDT.Year);
975             Time aT(uDT.Hours, uDT.Minutes, uDT.Seconds, uDT.HundredthSeconds);
976             DateTime aDate(aD,aT);
977 			if( nSub == DI_CREATE )
978 				;		// das wars schon!!
979 			else if( nSub == DI_CHANGE )
980 			{
981 				aName = xDocProps->getModifiedBy();
982 				uDT = xDocProps->getModificationDate();
983                 Date bD(uDT.Day, uDT.Month, uDT.Year);
984                 Time bT(uDT.Hours, uDT.Minutes, uDT.Seconds, uDT.HundredthSeconds);
985                 DateTime bDate(bD,bT);
986                 aDate = bDate;
987             }
988 			else if( nSub == DI_PRINT )
989 			{
990 				aName = xDocProps->getPrintedBy();
991 				uDT = xDocProps->getPrintDate();
992                 Date bD(uDT.Day, uDT.Month, uDT.Year);
993                 Time bT(uDT.Hours, uDT.Minutes, uDT.Seconds, uDT.HundredthSeconds);
994                 DateTime bDate(bD,bT);
995                 aDate = bDate;
996 			}
997 			else
998 				break;
999 
1000 			if (aDate.IsValid())
1001 			{
1002 				switch (nExtSub & ~DI_SUB_FIXED)
1003 				{
1004 				case DI_SUB_AUTHOR:
1005 					aStr = aName;
1006 					break;
1007 
1008 				case DI_SUB_TIME:
1009 					if (!nFormat)
1010 					{
1011 						lcl_GetLocalDataWrapper( nLang, &pAppLocalData,
1012 														&pLocalData );
1013 						aStr = pLocalData->getTime( aDate,
1014 													sal_False, sal_False);
1015 					}
1016 					else
1017 					{
1018 						// Numberformatter anwerfen!
1019 						double fVal = SwDateTimeField::GetDateTime( GetDoc(),
1020                                                     aDate);
1021 						aStr = ExpandValue(fVal, nFormat, nLang);
1022 					}
1023 					break;
1024 
1025 				case DI_SUB_DATE:
1026 					if (!nFormat)
1027 					{
1028 						lcl_GetLocalDataWrapper( nLang, &pAppLocalData,
1029 												 &pLocalData );
1030 						aStr = pLocalData->getDate( aDate );
1031 					}
1032 					else
1033 					{
1034 						// Numberformatter anwerfen!
1035 						double fVal = SwDateTimeField::GetDateTime( GetDoc(),
1036                                                     aDate);
1037 						aStr = ExpandValue(fVal, nFormat, nLang);
1038 					}
1039 					break;
1040 				}
1041 			}
1042 		}
1043 		break;
1044 	}
1045 
1046 	if( pAppLocalData != pLocalData )
1047 		delete pLocalData;
1048 
1049 	return aStr;
1050 }
1051 
1052 // ---------------------------------------------------------------------------
SwDocInfoField(SwDocInfoFieldType * pTyp,sal_uInt16 nSub,const String & rName,sal_uInt32 nFmt)1053 SwDocInfoField::SwDocInfoField(SwDocInfoFieldType* pTyp, sal_uInt16 nSub, const String& rName, sal_uInt32 nFmt) :
1054 	SwValueField(pTyp, nFmt), nSubType(nSub)
1055 {
1056 	aName = rName;
1057 	aContent = ((SwDocInfoFieldType*)GetTyp())->Expand(nSubType, nFmt, GetLanguage(), aName);
1058 }
1059 
SwDocInfoField(SwDocInfoFieldType * pTyp,sal_uInt16 nSub,const String & rName,const String & rValue,sal_uInt32 nFmt)1060 SwDocInfoField::SwDocInfoField(SwDocInfoFieldType* pTyp, sal_uInt16 nSub, const String& rName, const String& rValue, sal_uInt32 nFmt) :
1061     SwValueField(pTyp, nFmt), nSubType(nSub)
1062 {
1063     aName = rName;
1064     aContent = rValue;
1065 }
1066 
1067 // ---------------------------------------------------------------------------
1068 
1069 template<class T>
lcl_TimeToDouble(const T & rTime)1070 double lcl_TimeToDouble( const T& rTime )
1071 {
1072     const double fMilliSecondsPerDay = 86400000.0;
1073     return ((rTime.Hours*3600000)+(rTime.Minutes*60000)+(rTime.Seconds*1000)+(rTime.HundredthSeconds*10)) / fMilliSecondsPerDay;
1074 }
1075 
1076 template<class D>
lcl_DateToDouble(const D & rDate,const Date & rNullDate)1077 double lcl_DateToDouble( const D& rDate, const Date& rNullDate )
1078 {
1079     long nDate = Date::DateToDays( rDate.Day, rDate.Month, rDate.Year );
1080     long nNullDate = Date::DateToDays( rNullDate.GetDay(), rNullDate.GetMonth(), rNullDate.GetYear() );
1081     return double( nDate - nNullDate );
1082 }
1083 
Expand() const1084 String SwDocInfoField::Expand() const
1085 {
1086     if ( ( nSubType & 0xFF ) == DI_CUSTOM )
1087     {
1088          // custom properties currently need special treatment
1089          // we don't have a secure way to detect "real" custom properties in Word  Import of text fields
1090         // so we treat *every* unknown property as a custom property, even the "built-in" section in Word's document summary information stream
1091         // as these properties have not been inserted when the document summary information was imported, we do it here
1092         // this approach is still a lot better than the old one to import such fields as "user fields" and simple text
1093         SwDocShell* pDocShell = GetDoc()->GetDocShell();
1094         if( !pDocShell )
1095             return aContent;
1096         try
1097         {
1098             uno::Reference<document::XDocumentPropertiesSupplier> xDPS( pDocShell->GetModel(), uno::UNO_QUERY_THROW);
1099             uno::Reference<document::XDocumentProperties> xDocProps( xDPS->getDocumentProperties());
1100             uno::Reference < beans::XPropertySet > xSet( xDocProps->getUserDefinedProperties(), uno::UNO_QUERY_THROW);
1101             uno::Reference < beans::XPropertySetInfo > xSetInfo = xSet->getPropertySetInfo();
1102 
1103             uno::Any aAny;
1104             if( xSetInfo->hasPropertyByName( aName ) )
1105                 aAny = xSet->getPropertyValue( aName );
1106             if ( aAny.getValueType() != ::getVoidCppuType() )
1107             {
1108                 // "void" type means that the property has not been inserted until now
1109                 if ( !IsFixed() )
1110                 {
1111                     // if the field is "fixed" we don't update it from the property
1112                     ::rtl::OUString sVal;
1113                     uno::Reference < script::XTypeConverter > xConverter( comphelper::getProcessServiceFactory()
1114                         ->createInstance(::rtl::OUString::createFromAscii("com.sun.star.script.Converter")), uno::UNO_QUERY );
1115                     util::Date aDate;
1116                     util::DateTime aDateTime;
1117                     util::Duration aDuration;
1118                     if( aAny >>= aDate)
1119                     {
1120                         SvNumberFormatter* pFormatter = pDocShell->GetDoc()->GetNumberFormatter();
1121                         Date* pNullDate = pFormatter->GetNullDate();
1122                         sVal = ExpandValue( lcl_DateToDouble<util::Date>( aDate, *pNullDate ), GetFormat(), GetLanguage());
1123                     }
1124                     else if( aAny >>= aDateTime )
1125                     {
1126                         double fDateTime = lcl_TimeToDouble<util::DateTime>( aDateTime );
1127                         SvNumberFormatter* pFormatter = pDocShell->GetDoc()->GetNumberFormatter();
1128                         Date* pNullDate = pFormatter->GetNullDate();
1129                         fDateTime += lcl_DateToDouble<util::DateTime>( aDateTime, *pNullDate );
1130                         sVal = ExpandValue( fDateTime, GetFormat(), GetLanguage());
1131                     }
1132                     else if( aAny >>= aDuration )
1133                     {
1134                         String sText(aDuration.Negative ? '-' : '+');
1135                         sText += ViewShell::GetShellRes()->sDurationFormat;
1136                         sText.SearchAndReplace(String::CreateFromAscii( "%1"), String::CreateFromInt32( aDuration.Years ) );
1137                         sText.SearchAndReplace(String::CreateFromAscii( "%2"), String::CreateFromInt32( aDuration.Months ) );
1138                         sText.SearchAndReplace(String::CreateFromAscii( "%3"), String::CreateFromInt32( aDuration.Days   ) );
1139                         sText.SearchAndReplace(String::CreateFromAscii( "%4"), String::CreateFromInt32( aDuration.Hours  ) );
1140                         sText.SearchAndReplace(String::CreateFromAscii( "%5"), String::CreateFromInt32( aDuration.Minutes) );
1141                         sText.SearchAndReplace(String::CreateFromAscii( "%6"), String::CreateFromInt32( aDuration.Seconds) );
1142                         sVal = sText;
1143                     }
1144                     else
1145                     {
1146                         uno::Any aNew = xConverter->convertToSimpleType( aAny, uno::TypeClass_STRING );
1147                         aNew >>= sVal;
1148                     }
1149                     ((SwDocInfoField*)this)->aContent = sVal;
1150                 }
1151             }
1152         }
1153         catch (uno::Exception&) {}
1154     }
1155     else if ( !IsFixed() )
1156 		((SwDocInfoField*)this)->aContent = ((SwDocInfoFieldType*)GetTyp())->Expand(nSubType, GetFormat(), GetLanguage(), aName);
1157 
1158 	return aContent;
1159 }
1160 /* ---------------------------------------------------------------------------
1161 
1162  ---------------------------------------------------------------------------*/
GetFieldName() const1163 String SwDocInfoField::GetFieldName() const
1164 {
1165     String aStr(SwFieldType::GetTypeStr(GetTypeId()));
1166     aStr += ':';
1167 
1168     sal_uInt16 const nSub = nSubType & 0xff;
1169 
1170     switch (nSub)
1171     {
1172         case DI_CUSTOM:
1173             aStr += aName;
1174             break;
1175 
1176         default:
1177             aStr += *ViewShell::GetShellRes()
1178                         ->aDocInfoLst[ nSub - DI_SUBTYPE_BEGIN ];
1179             break;
1180     }
1181     if (IsFixed())
1182     {
1183         aStr += ' ';
1184         aStr += ViewShell::GetShellRes()->aFixedStr;
1185     }
1186     return aStr;
1187 }
1188 /* ---------------------------------------------------------------------------
1189 
1190  ---------------------------------------------------------------------------*/
Copy() const1191 SwField* SwDocInfoField::Copy() const
1192 {
1193 	SwDocInfoField* pFld = new SwDocInfoField((SwDocInfoFieldType*)GetTyp(), nSubType, aName, GetFormat());
1194     pFld->SetAutomaticLanguage(IsAutomaticLanguage());
1195 	pFld->aContent = aContent;
1196 
1197 	return pFld;
1198 }
1199 /* ---------------------------------------------------------------------------
1200 
1201  ---------------------------------------------------------------------------*/
GetSubType() const1202 sal_uInt16 SwDocInfoField::GetSubType() const
1203 {
1204 	return nSubType;
1205 }
1206 /* ---------------------------------------------------------------------------
1207 
1208  ---------------------------------------------------------------------------*/
SetSubType(sal_uInt16 nSub)1209 void SwDocInfoField::SetSubType(sal_uInt16 nSub)
1210 {
1211 	nSubType = nSub;
1212 }
1213 /* ---------------------------------------------------------------------------
1214 
1215  ---------------------------------------------------------------------------*/
SetLanguage(sal_uInt16 nLng)1216 void SwDocInfoField::SetLanguage(sal_uInt16 nLng)
1217 {
1218 	if (!GetFormat())
1219 		SwField::SetLanguage(nLng);
1220 	else
1221 		SwValueField::SetLanguage(nLng);
1222 }
1223 /* ---------------------------------------------------------------------------
1224 
1225  ---------------------------------------------------------------------------*/
QueryValue(uno::Any & rAny,sal_uInt16 nWhichId) const1226 sal_Bool SwDocInfoField::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
1227 {
1228     switch( nWhichId )
1229 	{
1230 	case FIELD_PROP_PAR1:
1231 		rAny <<= OUString(aContent);
1232 		break;
1233 
1234 	case FIELD_PROP_PAR4:
1235 		rAny <<= OUString(aName);
1236 		break;
1237 
1238 	case FIELD_PROP_USHORT1:
1239 		rAny  <<= (sal_Int16)aContent.ToInt32();
1240 		break;
1241 
1242 	case FIELD_PROP_BOOL1:
1243 		{
1244 			sal_Bool bVal = 0 != (nSubType & DI_SUB_FIXED);
1245 			rAny.setValue(&bVal, ::getBooleanCppuType());
1246 		}
1247 		break;
1248 	case FIELD_PROP_FORMAT:
1249 		rAny  <<= (sal_Int32)GetFormat();
1250 		break;
1251 
1252 	case FIELD_PROP_DOUBLE:
1253 		{
1254 			double fVal = GetValue();
1255 			rAny.setValue(&fVal, ::getCppuType(&fVal));
1256 		}
1257 		break;
1258 	case FIELD_PROP_PAR3:
1259 		rAny <<= rtl::OUString(Expand());
1260 		break;
1261 	case FIELD_PROP_BOOL2:
1262 		{
1263 			sal_uInt16 nExtSub = (nSubType & 0xff00) & ~DI_SUB_FIXED;
1264 			sal_Bool bVal = (nExtSub == DI_SUB_DATE);
1265 			rAny.setValue(&bVal, ::getBooleanCppuType());
1266 		}
1267 		break;
1268 	default:
1269         return SwField::QueryValue(rAny, nWhichId);
1270     }
1271 	return sal_True;
1272 }
1273 /* ---------------------------------------------------------------------------
1274 
1275  ---------------------------------------------------------------------------*/
PutValue(const uno::Any & rAny,sal_uInt16 nWhichId)1276 sal_Bool SwDocInfoField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
1277 {
1278 	sal_Int32 nValue = 0;
1279     switch( nWhichId )
1280 	{
1281 	case FIELD_PROP_PAR1:
1282 		if( nSubType & DI_SUB_FIXED )
1283 			::GetString( rAny, aContent );
1284 		break;
1285 
1286 	case FIELD_PROP_USHORT1:
1287 		if( nSubType & DI_SUB_FIXED )
1288 		{
1289 			rAny >>= nValue;
1290 			aContent = String::CreateFromInt32(nValue);
1291 		}
1292 		break;
1293 
1294 	case FIELD_PROP_BOOL1:
1295 		if(*(sal_Bool*)rAny.getValue())
1296 			nSubType |= DI_SUB_FIXED;
1297 		else
1298 			nSubType &= ~DI_SUB_FIXED;
1299 		break;
1300 	case FIELD_PROP_FORMAT:
1301 		{
1302 			rAny >>= nValue;
1303 			if( nValue >= 0)
1304 				SetFormat(nValue);
1305 		}
1306 		break;
1307 
1308 	case FIELD_PROP_PAR3:
1309 		::GetString( rAny, aContent );
1310 		break;
1311 	case FIELD_PROP_BOOL2:
1312 		nSubType &= 0xf0ff;
1313 		if(*(sal_Bool*)rAny.getValue())
1314 			nSubType |= DI_SUB_DATE;
1315 		else
1316 			nSubType |= DI_SUB_TIME;
1317 		break;
1318 	default:
1319         return SwField::PutValue(rAny, nWhichId);
1320     }
1321 	return sal_True;
1322 }
1323 
1324 /*--------------------------------------------------------------------
1325 	Beschreibung: SwHiddenTxtFieldType by JP
1326  --------------------------------------------------------------------*/
1327 
SwHiddenTxtFieldType(sal_Bool bSetHidden)1328 SwHiddenTxtFieldType::SwHiddenTxtFieldType( sal_Bool bSetHidden )
1329 	: SwFieldType( RES_HIDDENTXTFLD ), bHidden( bSetHidden )
1330 {
1331 }
1332 
Copy() const1333 SwFieldType* SwHiddenTxtFieldType::Copy() const
1334 {
1335 	return new SwHiddenTxtFieldType( bHidden );
1336 }
1337 /* ---------------------------------------------------------------------------
1338 
1339  ---------------------------------------------------------------------------*/
SetHiddenFlag(sal_Bool bSetHidden)1340 void SwHiddenTxtFieldType::SetHiddenFlag( sal_Bool bSetHidden )
1341 {
1342 	if( bHidden != bSetHidden )
1343 	{
1344 		bHidden = bSetHidden;
1345 		UpdateFlds();		// alle HiddenText benachrichtigen
1346 	}
1347 }
1348 /* ---------------------------------------------------------------------------
1349 
1350  ---------------------------------------------------------------------------*/
SwHiddenTxtField(SwHiddenTxtFieldType * pFldType,sal_Bool bConditional,const String & rCond,const String & rStr,sal_Bool bHidden,sal_uInt16 nSub)1351 SwHiddenTxtField::SwHiddenTxtField( SwHiddenTxtFieldType* pFldType,
1352 									sal_Bool 	bConditional,
1353 									const 	String& rCond,
1354 									const	String& rStr,
1355 									sal_Bool 	bHidden,
1356 									sal_uInt16  nSub) :
1357 	SwField( pFldType ), aCond(rCond), nSubType(nSub),
1358 	bCanToggle(bConditional), bIsHidden(bHidden), bValid(sal_False)
1359 {
1360 	if(nSubType == TYP_CONDTXTFLD)
1361 	{
1362 		sal_uInt16 nPos = 0;
1363 		aTRUETxt = rStr.GetToken(0, '|', nPos);
1364 
1365 		if(nPos != STRING_NOTFOUND)
1366 		{
1367 			aFALSETxt = rStr.GetToken(0, '|', nPos);
1368 			if(nPos != STRING_NOTFOUND)
1369 			{
1370 				aContent = rStr.GetToken(0, '|', nPos);
1371 				bValid = sal_True;
1372 			}
1373 		}
1374 	}
1375 	else
1376 		aTRUETxt = rStr;
1377 }
1378 /* ---------------------------------------------------------------------------
1379 
1380  ---------------------------------------------------------------------------*/
SwHiddenTxtField(SwHiddenTxtFieldType * pFldType,const String & rCond,const String & rTrue,const String & rFalse,sal_uInt16 nSub)1381 SwHiddenTxtField::SwHiddenTxtField( SwHiddenTxtFieldType* pFldType,
1382 									const String& rCond,
1383 									const String& rTrue,
1384 									const String& rFalse,
1385 									sal_uInt16 nSub)
1386 	: SwField( pFldType ), aTRUETxt(rTrue), aFALSETxt(rFalse), aCond(rCond), nSubType(nSub),
1387 	  bIsHidden(sal_True), bValid(sal_False)
1388 {
1389 	bCanToggle	= aCond.Len() > 0;
1390 }
1391 /* ---------------------------------------------------------------------------
1392 
1393  ---------------------------------------------------------------------------*/
Expand() const1394 String SwHiddenTxtField::Expand() const
1395 {
1396 	// Type: !Hidden  -> immer anzeigen
1397 	// 		  Hide	  -> Werte die Bedingung aus
1398 
1399 	if( TYP_CONDTXTFLD == nSubType )
1400 	{
1401 		if( bValid )
1402 			return aContent;
1403 
1404 		if( bCanToggle && !bIsHidden )
1405 			return aTRUETxt;
1406 	}
1407 	else if( !((SwHiddenTxtFieldType*)GetTyp())->GetHiddenFlag() ||
1408 		( bCanToggle && bIsHidden ))
1409 		return aTRUETxt;
1410 
1411 	return aFALSETxt;
1412 }
1413 
1414 /*--------------------------------------------------------------------
1415 	Beschreibung: Aktuellen Field-Value holen und cachen
1416  --------------------------------------------------------------------*/
1417 
Evaluate(SwDoc * pDoc)1418 void SwHiddenTxtField::Evaluate(SwDoc* pDoc)
1419 {
1420 	ASSERT(pDoc, Wo ist das Dokument Seniore);
1421 
1422 	if( TYP_CONDTXTFLD == nSubType )
1423 	{
1424 		SwNewDBMgr* pMgr = pDoc->GetNewDBMgr();
1425 
1426 		bValid = sal_False;
1427 		String sTmpName;
1428 
1429 		if (bCanToggle && !bIsHidden)
1430 			sTmpName = aTRUETxt;
1431 		else
1432 			sTmpName = aFALSETxt;
1433 
1434 // OS 21.08.97: #42943# Datenbankausdruecke muessen sich von
1435 // 				einfachem Text unterscheiden. also wird der einfache Text
1436 // 				bevorzugt in Anfuehrungszeichen gesetzt.
1437 // 				Sind diese vorhanden werden umschliessende entfernt.
1438 //				Wenn nicht, dann wird auf die Tauglichkeit als Datenbankname
1439 //				geprueft. Nur wenn zwei oder mehr Punkte vorhanden sind und kein
1440 //				Anfuehrungszeichen enthalten ist, gehen wir von einer DB aus.
1441 		if(sTmpName.Len() > 1 && sTmpName.GetChar(0) == '\"' &&
1442 			sTmpName.GetChar((sTmpName.Len() - 1))== '\"')
1443 		{
1444 			aContent = sTmpName.Copy(1, sTmpName.Len() - 2);
1445 			bValid = sal_True;
1446 		}
1447 		else if(sTmpName.Search('\"') == STRING_NOTFOUND &&
1448 			sTmpName.GetTokenCount('.') > 2)
1449 		{
1450 			::ReplacePoint(sTmpName);
1451 			if(sTmpName.GetChar(0) == '[' && sTmpName.GetChar(sTmpName.Len()-1) == ']')
1452 			{	// Eckige Klammern entfernen
1453 				sTmpName.Erase(0, 1);
1454 				sTmpName.Erase(sTmpName.Len()-1, 1);
1455 			}
1456 
1457 			if( pMgr)
1458 			{
1459 				String sDBName( GetDBName( sTmpName, pDoc ));
1460 				String sDataSource(sDBName.GetToken(0, DB_DELIM));
1461 				String sDataTableOrQuery(sDBName.GetToken(1, DB_DELIM));
1462 				if( pMgr->IsInMerge() && sDBName.Len() &&
1463 					pMgr->IsDataSourceOpen( sDataSource,
1464 												sDataTableOrQuery, sal_False))
1465 				{
1466 					double fNumber;
1467 					sal_uInt32 nTmpFormat;
1468 					pMgr->GetMergeColumnCnt(GetColumnName( sTmpName ),
1469                         GetLanguage(), aContent, &fNumber, &nTmpFormat );
1470 					bValid = sal_True;
1471 				}
1472 				else if( sDBName.Len() && sDataSource.Len() &&
1473 						 sDataTableOrQuery.Len() )
1474 					bValid = sal_True;
1475 			}
1476 		}
1477 	}
1478 }
1479 /* ---------------------------------------------------------------------------
1480 
1481  ---------------------------------------------------------------------------*/
GetFieldName() const1482 String SwHiddenTxtField::GetFieldName() const
1483 {
1484     String aStr(SwFieldType::GetTypeStr(nSubType));
1485     aStr += ' ';
1486     aStr += aCond;
1487     aStr += ' ';
1488     aStr += aTRUETxt;
1489 
1490     if (nSubType == TYP_CONDTXTFLD)
1491     {
1492         aStr.AppendAscii(" : ");
1493         aStr += aFALSETxt;
1494     }
1495     return aStr;
1496 }
1497 /* ---------------------------------------------------------------------------
1498 
1499  ---------------------------------------------------------------------------*/
Copy() const1500 SwField* SwHiddenTxtField::Copy() const
1501 {
1502 	SwHiddenTxtField* pFld =
1503 		new SwHiddenTxtField((SwHiddenTxtFieldType*)GetTyp(), aCond,
1504 							  aTRUETxt, aFALSETxt);
1505 	pFld->bIsHidden = bIsHidden;
1506 	pFld->bValid	= bValid;
1507 	pFld->aContent	= aContent;
1508 	pFld->SetFormat(GetFormat());
1509 	pFld->nSubType 	= nSubType;
1510 	return pFld;
1511 }
1512 
1513 
1514 /*--------------------------------------------------------------------
1515 	Beschreibung: Bedingung setzen
1516  --------------------------------------------------------------------*/
1517 
SetPar1(const String & rStr)1518 void SwHiddenTxtField::SetPar1(const String& rStr)
1519 {
1520 	aCond = rStr;
1521 	bCanToggle = aCond.Len() > 0;
1522 }
1523 /* ---------------------------------------------------------------------------
1524 
1525  ---------------------------------------------------------------------------*/
GetPar1() const1526 const String& SwHiddenTxtField::GetPar1() const
1527 {
1528 	return aCond;
1529 }
1530 
1531 /*--------------------------------------------------------------------
1532 	Beschreibung: True/False Text
1533  --------------------------------------------------------------------*/
1534 
SetPar2(const String & rStr)1535 void SwHiddenTxtField::SetPar2(const String& rStr)
1536 {
1537 	if(nSubType == TYP_CONDTXTFLD)
1538 	{
1539 		sal_uInt16 nPos = rStr.Search('|');
1540 		aTRUETxt = rStr.Copy(0, nPos);
1541 
1542 		if(nPos != STRING_NOTFOUND)
1543 			aFALSETxt = rStr.Copy(nPos + 1);
1544 	}
1545 	else
1546 		aTRUETxt = rStr;
1547 }
1548 /* ---------------------------------------------------------------------------
1549 
1550  ---------------------------------------------------------------------------*/
GetPar2() const1551 String SwHiddenTxtField::GetPar2() const
1552 {
1553 	String aRet(aTRUETxt);
1554 	if(nSubType == TYP_CONDTXTFLD)
1555 	{
1556 		aRet += '|';
1557 		aRet += aFALSETxt;
1558 	}
1559 	return aRet;
1560 }
1561 /* ---------------------------------------------------------------------------
1562 
1563  ---------------------------------------------------------------------------*/
GetSubType() const1564 sal_uInt16 SwHiddenTxtField::GetSubType() const
1565 {
1566 	return nSubType;
1567 }
1568 /* ---------------------------------------------------------------------------
1569 
1570  ---------------------------------------------------------------------------*/
QueryValue(uno::Any & rAny,sal_uInt16 nWhichId) const1571 sal_Bool SwHiddenTxtField::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
1572 {
1573 	const String* pOut = 0;
1574     switch( nWhichId )
1575 	{
1576 	case FIELD_PROP_PAR1:
1577 		pOut = &aCond;
1578 		break;
1579 	case FIELD_PROP_PAR2:
1580 		pOut = &aTRUETxt;
1581 		break;
1582 	case FIELD_PROP_PAR3:
1583 		pOut = &aFALSETxt;
1584 		break;
1585     case FIELD_PROP_PAR4 :
1586         pOut = &aContent;
1587     break;
1588     case FIELD_PROP_BOOL1:
1589 		{
1590         	sal_Bool bHidden = bIsHidden;
1591         	rAny.setValue(&bHidden, ::getBooleanCppuType());
1592 		}
1593 		break;
1594 	default:
1595 		DBG_ERROR("illegal property");
1596 	}
1597 	if( pOut )
1598 		rAny <<= OUString( *pOut );
1599 	return sal_True;
1600 }
1601 /* ---------------------------------------------------------------------------
1602 
1603  ---------------------------------------------------------------------------*/
PutValue(const uno::Any & rAny,sal_uInt16 nWhichId)1604 sal_Bool SwHiddenTxtField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
1605 {
1606     switch( nWhichId )
1607 	{
1608 	case FIELD_PROP_PAR1:
1609 		{
1610 			String sVal;
1611 			SetPar1(::GetString( rAny, sVal ));
1612 		}
1613 		break;
1614 	case FIELD_PROP_PAR2:
1615 		::GetString( rAny, aTRUETxt );
1616 		break;
1617 	case FIELD_PROP_PAR3:
1618 		::GetString( rAny, aFALSETxt );
1619 		break;
1620 	case FIELD_PROP_BOOL1:
1621         bIsHidden = *(sal_Bool*)rAny.getValue();
1622 		break;
1623     case FIELD_PROP_PAR4:
1624         ::GetString( rAny, aContent);
1625         bValid = sal_True;
1626     break;
1627     default:
1628 		DBG_ERROR("illegal property");
1629 	}
1630 	return sal_True;
1631 }
1632 
1633 //------------------------------------------------------------------------------
1634 
GetColumnName(const String & rName)1635 String SwHiddenTxtField::GetColumnName(const String& rName)
1636 {
1637 	sal_uInt16 nPos = rName.Search(DB_DELIM);
1638 	if( STRING_NOTFOUND != nPos )
1639 	{
1640 		nPos = rName.Search(DB_DELIM, nPos + 1);
1641 
1642 		if( STRING_NOTFOUND != nPos )
1643 			return rName.Copy(nPos + 1);
1644 	}
1645 	return rName;
1646 }
1647 
1648 //------------------------------------------------------------------------------
1649 
GetDBName(const String & rName,SwDoc * pDoc)1650 String SwHiddenTxtField::GetDBName(const String& rName, SwDoc *pDoc)
1651 {
1652 	sal_uInt16 nPos = rName.Search(DB_DELIM);
1653 	if( STRING_NOTFOUND != nPos )
1654 	{
1655 		nPos = rName.Search(DB_DELIM, nPos + 1);
1656 
1657 		if( STRING_NOTFOUND != nPos )
1658 			return rName.Copy( 0, nPos );
1659 	}
1660 	SwDBData aData = pDoc->GetDBData();
1661 	String sRet = aData.sDataSource;
1662 	sRet += DB_DELIM;
1663 	sRet += String(aData.sCommand);
1664 	return sRet;
1665 }
1666 
1667 /*--------------------------------------------------------------------
1668 	Beschreibung: Der Feldtyp fuer Zeilenhoehe 0
1669  --------------------------------------------------------------------*/
1670 
SwHiddenParaFieldType()1671 SwHiddenParaFieldType::SwHiddenParaFieldType()
1672 	: SwFieldType( RES_HIDDENPARAFLD )
1673 {
1674 }
1675 
Copy() const1676 SwFieldType* SwHiddenParaFieldType::Copy() const
1677 {
1678 	SwHiddenParaFieldType* pTyp = new SwHiddenParaFieldType();
1679 	return pTyp;
1680 }
1681 
1682 /*--------------------------------------------------------------------
1683 	Beschreibung: Das Feld Zeilenhoehe 0
1684  --------------------------------------------------------------------*/
1685 
SwHiddenParaField(SwHiddenParaFieldType * pTyp,const String & rStr)1686 SwHiddenParaField::SwHiddenParaField(SwHiddenParaFieldType* pTyp, const String& rStr)
1687 	: SwField(pTyp), aCond(rStr)
1688 {
1689 	bIsHidden = sal_False;
1690 }
1691 /* ---------------------------------------------------------------------------
1692 
1693  ---------------------------------------------------------------------------*/
Expand() const1694 String SwHiddenParaField::Expand() const
1695 {
1696 	return aEmptyStr;
1697 }
1698 /* ---------------------------------------------------------------------------
1699 
1700  ---------------------------------------------------------------------------*/
Copy() const1701 SwField* SwHiddenParaField::Copy() const
1702 {
1703 	SwHiddenParaField* pFld = new SwHiddenParaField((SwHiddenParaFieldType*)GetTyp(), aCond);
1704 	pFld->bIsHidden = bIsHidden;
1705 
1706 	return pFld;
1707 }
1708 
QueryValue(uno::Any & rAny,sal_uInt16 nWhichId) const1709 sal_Bool SwHiddenParaField::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
1710 {
1711     switch ( nWhichId )
1712 	{
1713 	case FIELD_PROP_PAR1:
1714 		rAny <<= OUString(aCond);
1715 		break;
1716 	case  FIELD_PROP_BOOL1:
1717 		{
1718         	sal_Bool bHidden = bIsHidden;
1719         	rAny.setValue(&bHidden, ::getBooleanCppuType());
1720 		}
1721 		break;
1722 
1723 	default:
1724 		DBG_ERROR("illegal property");
1725 	}
1726 	return sal_True;
1727 }
1728 
PutValue(const uno::Any & rAny,sal_uInt16 nWhichId)1729 sal_Bool SwHiddenParaField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
1730 {
1731     switch ( nWhichId )
1732 	{
1733 	case FIELD_PROP_PAR1:
1734 		::GetString( rAny, aCond );
1735 		break;
1736 	case FIELD_PROP_BOOL1:
1737         bIsHidden = *(sal_Bool*)rAny.getValue();
1738 		break;
1739 
1740 	default:
1741 		DBG_ERROR("illegal property");
1742 	}
1743 	return sal_True;
1744 }
1745 
1746 /*--------------------------------------------------------------------
1747 	Beschreibung: Bedingung setzen
1748  --------------------------------------------------------------------*/
1749 
SetPar1(const String & rStr)1750 void SwHiddenParaField::SetPar1(const String& rStr)
1751 {
1752 	aCond = rStr;
1753 }
1754 /* ---------------------------------------------------------------------------
1755 
1756  ---------------------------------------------------------------------------*/
GetPar1() const1757 const String& SwHiddenParaField::GetPar1() const
1758 {
1759 	return aCond;
1760 }
1761 
1762 /*--------------------------------------------------------------------
1763 	Beschreibung: PostIt
1764  --------------------------------------------------------------------*/
1765 
SwPostItFieldType(SwDoc * pDoc)1766 SwPostItFieldType::SwPostItFieldType(SwDoc *pDoc)
1767     : SwFieldType( RES_POSTITFLD )
1768     , mpDoc(pDoc)
1769 {}
1770 /* ---------------------------------------------------------------------------
1771 
1772  ---------------------------------------------------------------------------*/
Copy() const1773 SwFieldType* SwPostItFieldType::Copy() const
1774 {
1775     return new SwPostItFieldType(mpDoc);
1776 }
1777 
1778 
1779 
1780 
SwPostItField(SwPostItFieldType * pT,const String & rCommentContent,const String & rAuthor,const String & rAuthorInitials,const String & rName,const DateTime & rDateTime)1781 SwPostItField::SwPostItField(
1782     SwPostItFieldType* pT,
1783     const String& rCommentContent,
1784     const String& rAuthor,
1785     const String& rAuthorInitials,
1786     const String& rName,
1787     const DateTime& rDateTime )
1788     : SwField( pT )
1789     , msCommentContent( rCommentContent )
1790     , msAuthor( rAuthor )
1791     , msAuthorInitials( rAuthorInitials )
1792     , msName( rName )
1793     , maDateTime( rDateTime )
1794     , mpText( NULL )
1795     , m_pTextObject( NULL )
1796 {
1797 }
1798 
1799 
~SwPostItField()1800 SwPostItField::~SwPostItField()
1801 {
1802     if ( m_pTextObject != NULL )
1803     {
1804         m_pTextObject->DisposeEditSource();
1805         m_pTextObject->release();
1806     }
1807 
1808     delete mpText;
1809 }
1810 
1811 
Expand() const1812 String SwPostItField::Expand() const
1813 {
1814     return aEmptyStr;
1815 }
1816 
1817 
GetDescription() const1818 String SwPostItField::GetDescription() const
1819 {
1820     return SW_RES(STR_NOTE);
1821 }
1822 
1823 
Copy() const1824 SwField* SwPostItField::Copy() const
1825 {
1826     SwPostItField* pRet =
1827         new SwPostItField(
1828             (SwPostItFieldType*)GetTyp(),
1829             msCommentContent,
1830             msAuthor,
1831             msAuthorInitials,
1832             msName,
1833             maDateTime);
1834     if ( mpText != NULL )
1835     {
1836         pRet->SetTextObject( new OutlinerParaObject(*mpText) );
1837     }
1838 
1839     // Note: member <m_pTextObject> not copied.
1840 
1841     return pRet;
1842 }
1843 
1844 
SetPar1(const String & rStr)1845 void SwPostItField::SetPar1(const String& rStr)
1846 {
1847     msAuthor = rStr;
1848 }
1849 
GetPar1() const1850 const String& SwPostItField::GetPar1() const
1851 {
1852     return msAuthor;
1853 }
1854 
1855 
SetPar2(const String & rStr)1856 void SwPostItField::SetPar2(const String& rStr)
1857 {
1858     msCommentContent = rStr;
1859 }
1860 
GetPar2() const1861 String SwPostItField::GetPar2() const
1862 {
1863     return msCommentContent;
1864 }
1865 
1866 
SetName(const String & rName)1867 void SwPostItField::SetName(const String& rName)
1868 {
1869     msName = rName;
1870 }
1871 
GetName() const1872 const String& SwPostItField::GetName() const
1873 {
1874     return msName;
1875 }
1876 
1877 
GetTextObject() const1878 const OutlinerParaObject* SwPostItField::GetTextObject() const
1879 {
1880     return mpText;
1881 }
1882 
SetTextObject(OutlinerParaObject * pText)1883 void SwPostItField::SetTextObject( OutlinerParaObject* pText )
1884 {
1885     delete mpText;
1886     mpText = pText;
1887 }
1888 
1889 
GetNumberOfParagraphs() const1890 sal_uInt32 SwPostItField::GetNumberOfParagraphs() const
1891 {
1892     return (mpText) ? mpText->Count() : 1;
1893 }
1894 
1895 
QueryValue(uno::Any & rAny,sal_uInt16 nWhichId) const1896 sal_Bool SwPostItField::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
1897 {
1898     switch( nWhichId )
1899     {
1900     case FIELD_PROP_PAR1:
1901         rAny <<= OUString(msAuthor);
1902         break;
1903     case FIELD_PROP_PAR2:
1904         {
1905             rAny <<= OUString(msCommentContent);
1906             break;
1907         }
1908     case FIELD_PROP_PAR3:
1909         rAny <<= OUString(msAuthorInitials);
1910         break;
1911     case FIELD_PROP_PAR4:
1912         rAny <<= OUString(msName);
1913         break;
1914     case FIELD_PROP_TEXT:
1915         {
1916             if ( !m_pTextObject )
1917             {
1918                 SwPostItFieldType* pGetType = (SwPostItFieldType*)GetTyp();
1919                 SwDoc* pDoc = pGetType->GetDoc();
1920                 SwTextAPIEditSource* pObj = new SwTextAPIEditSource( pDoc );
1921                 const_cast <SwPostItField*> (this)->m_pTextObject = new SwTextAPIObject( pObj );
1922                 m_pTextObject->acquire();
1923             }
1924 
1925             if ( mpText )
1926                 m_pTextObject->SetText( *mpText );
1927             else
1928                 m_pTextObject->SetString( msCommentContent );
1929 
1930             uno::Reference < text::XText > xText( m_pTextObject );
1931             rAny <<= xText;
1932             break;
1933         }
1934     case FIELD_PROP_DATE:
1935         {
1936             util::Date aSetDate;
1937             aSetDate.Day = maDateTime.GetDay();
1938             aSetDate.Month = maDateTime.GetMonth();
1939             aSetDate.Year = maDateTime.GetYear();
1940             rAny.setValue(&aSetDate, ::getCppuType((util::Date*)0));
1941         }
1942         break;
1943     case FIELD_PROP_DATE_TIME:
1944         {
1945             util::DateTime DateTimeValue;
1946             DateTimeValue.HundredthSeconds = maDateTime.Get100Sec();
1947             DateTimeValue.Seconds = maDateTime.GetSec();
1948             DateTimeValue.Minutes = maDateTime.GetMin();
1949             DateTimeValue.Hours = maDateTime.GetHour();
1950             DateTimeValue.Day = maDateTime.GetDay();
1951             DateTimeValue.Month = maDateTime.GetMonth();
1952             DateTimeValue.Year = maDateTime.GetYear();
1953             rAny <<= DateTimeValue;
1954         }
1955         break;
1956     default:
1957         DBG_ERROR("illegal property");
1958     }
1959     return sal_True;
1960 }
1961 
1962 
PutValue(const uno::Any & rAny,sal_uInt16 nWhichId)1963 sal_Bool SwPostItField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
1964 {
1965     switch( nWhichId )
1966     {
1967     case FIELD_PROP_PAR1:
1968         ::GetString( rAny, msAuthor );
1969         break;
1970     case FIELD_PROP_PAR2:
1971         ::GetString( rAny, msCommentContent );
1972         //#i100374# new string via api, delete complex text object so SwPostItNote picks up the new string
1973         if (mpText)
1974         {
1975             delete mpText;
1976             mpText = 0;
1977         }
1978         break;
1979     case FIELD_PROP_PAR3:
1980         ::GetString( rAny, msAuthorInitials );
1981         break;
1982     case FIELD_PROP_PAR4:
1983         ::GetString( rAny, msName );
1984         break;
1985     case FIELD_PROP_TEXT:
1986         DBG_ERROR("Not implemented!");
1987         // ::GetString( rAny, msCommentContent );
1988         break;
1989     case FIELD_PROP_DATE:
1990         if( rAny.getValueType() == ::getCppuType((util::Date*)0) )
1991         {
1992             util::Date aSetDate = *(util::Date*)rAny.getValue();
1993             maDateTime = Date(aSetDate.Day, aSetDate.Month, aSetDate.Year);
1994         }
1995         break;
1996     case FIELD_PROP_DATE_TIME:
1997         {
1998             util::DateTime aDateTimeValue;
1999             if(!(rAny >>= aDateTimeValue))
2000                 return sal_False;
2001             maDateTime.Set100Sec(aDateTimeValue.HundredthSeconds);
2002             maDateTime.SetSec(aDateTimeValue.Seconds);
2003             maDateTime.SetMin(aDateTimeValue.Minutes);
2004             maDateTime.SetHour(aDateTimeValue.Hours);
2005             maDateTime.SetDay(aDateTimeValue.Day);
2006             maDateTime.SetMonth(aDateTimeValue.Month);
2007             maDateTime.SetYear(aDateTimeValue.Year);
2008         }
2009         break;
2010     default:
2011         DBG_ERROR("illegal property");
2012     }
2013     return sal_True;
2014 }
2015 
2016 
2017 /*--------------------------------------------------------------------
2018 	Beschreibung: DokumentinfoFields
2019  --------------------------------------------------------------------*/
2020 
SwExtUserFieldType()2021 SwExtUserFieldType::SwExtUserFieldType()
2022 	: SwFieldType( RES_EXTUSERFLD )
2023 {
2024 }
2025 /* ---------------------------------------------------------------------------
2026 
2027  ---------------------------------------------------------------------------*/
Copy() const2028 SwFieldType* SwExtUserFieldType::Copy() const
2029 {
2030 	SwExtUserFieldType* pTyp = new SwExtUserFieldType;
2031 	return pTyp;
2032 }
2033 /* ---------------------------------------------------------------------------
2034 
2035  ---------------------------------------------------------------------------*/
Expand(sal_uInt16 nSub,sal_uInt32) const2036 String SwExtUserFieldType::Expand(sal_uInt16 nSub, sal_uInt32 ) const
2037 {
2038     String aRet;
2039 	sal_uInt16 nRet = USHRT_MAX;
2040 	switch(nSub)
2041 	{
2042     case EU_FIRSTNAME:      nRet = USER_OPT_FIRSTNAME; break;
2043     case EU_NAME:           nRet = USER_OPT_LASTNAME;  break;
2044     case EU_SHORTCUT:       nRet = USER_OPT_ID; break;
2045 
2046     case EU_COMPANY:        nRet = USER_OPT_COMPANY;        break;
2047     case EU_STREET:         nRet = USER_OPT_STREET;         break;
2048     case EU_TITLE:          nRet = USER_OPT_TITLE;          break;
2049     case EU_POSITION:       nRet = USER_OPT_POSITION;       break;
2050     case EU_PHONE_PRIVATE:  nRet = USER_OPT_TELEPHONEHOME;    break;
2051     case EU_PHONE_COMPANY:  nRet = USER_OPT_TELEPHONEWORK;    break;
2052     case EU_FAX:            nRet = USER_OPT_FAX;            break;
2053     case EU_EMAIL:          nRet = USER_OPT_EMAIL;          break;
2054     case EU_COUNTRY:        nRet = USER_OPT_COUNTRY;        break;
2055     case EU_ZIP:            nRet = USER_OPT_ZIP;            break;
2056     case EU_CITY:           nRet = USER_OPT_CITY;           break;
2057     case EU_STATE:          nRet = USER_OPT_STATE;          break;
2058     case EU_FATHERSNAME:    nRet = USER_OPT_FATHERSNAME;    break;
2059     case EU_APARTMENT:      nRet = USER_OPT_APARTMENT;      break;
2060     default:                ASSERT( sal_False, "Field unknown");
2061 	}
2062 	if( USHRT_MAX != nRet )
2063     {
2064         SvtUserOptions&  rUserOpt = SW_MOD()->GetUserOptions();
2065         aRet = rUserOpt.GetToken( nRet );
2066     }
2067 	return aRet;
2068 }
2069 /* ---------------------------------------------------------------------------
2070 
2071  ---------------------------------------------------------------------------*/
SwExtUserField(SwExtUserFieldType * pTyp,sal_uInt16 nSubTyp,sal_uInt32 nFmt)2072 SwExtUserField::SwExtUserField(SwExtUserFieldType* pTyp, sal_uInt16 nSubTyp, sal_uInt32 nFmt) :
2073 	SwField(pTyp, nFmt), nType(nSubTyp)
2074 {
2075 	aContent = ((SwExtUserFieldType*)GetTyp())->Expand(nType, GetFormat());
2076 }
2077 /* ---------------------------------------------------------------------------
2078 
2079  ---------------------------------------------------------------------------*/
Expand() const2080 String SwExtUserField::Expand() const
2081 {
2082 	if (!IsFixed())
2083 		((SwExtUserField*)this)->aContent = ((SwExtUserFieldType*)GetTyp())->Expand(nType, GetFormat());
2084 
2085 	return aContent;
2086 }
2087 /* ---------------------------------------------------------------------------
2088 
2089  ---------------------------------------------------------------------------*/
Copy() const2090 SwField* SwExtUserField::Copy() const
2091 {
2092 	SwExtUserField* pFld = new SwExtUserField((SwExtUserFieldType*)GetTyp(), nType, GetFormat());
2093 	pFld->SetExpansion(aContent);
2094 
2095 	return pFld;
2096 }
2097 /* ---------------------------------------------------------------------------
2098 
2099  ---------------------------------------------------------------------------*/
GetSubType() const2100 sal_uInt16 SwExtUserField::GetSubType() const
2101 {
2102 	return nType;
2103 }
2104 /* ---------------------------------------------------------------------------
2105 
2106  ---------------------------------------------------------------------------*/
SetSubType(sal_uInt16 nSub)2107 void SwExtUserField::SetSubType(sal_uInt16 nSub)
2108 {
2109 	nType = nSub;
2110 }
2111 
QueryValue(uno::Any & rAny,sal_uInt16 nWhichId) const2112 sal_Bool SwExtUserField::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
2113 {
2114     switch( nWhichId )
2115 	{
2116 	case FIELD_PROP_PAR1:
2117 		rAny <<= OUString(aContent);
2118 		break;
2119 
2120 	case FIELD_PROP_USHORT1:
2121 		{
2122 			sal_Int16 nTmp = nType;
2123 			rAny <<= nTmp;
2124 		}
2125 		break;
2126 	case FIELD_PROP_BOOL1:
2127 		{
2128 			sal_Bool bTmp = IsFixed();
2129 			rAny.setValue(&bTmp, ::getBooleanCppuType());
2130 		}
2131 		break;
2132 	default:
2133 		DBG_ERROR("illegal property");
2134 	}
2135 	return sal_True;
2136 }
2137 
PutValue(const uno::Any & rAny,sal_uInt16 nWhichId)2138 sal_Bool SwExtUserField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
2139 {
2140     switch( nWhichId )
2141 	{
2142 	case FIELD_PROP_PAR1:
2143 		::GetString( rAny, aContent );
2144 		break;
2145 
2146 	case FIELD_PROP_USHORT1:
2147 		{
2148 			sal_Int16 nTmp = 0;
2149 			rAny >>= nTmp;
2150 			nType = nTmp;
2151 		}
2152 		break;
2153 	case FIELD_PROP_BOOL1:
2154 		if( *(sal_Bool*)rAny.getValue() )
2155 			SetFormat(GetFormat() | AF_FIXED);
2156 		else
2157 			SetFormat(GetFormat() & ~AF_FIXED);
2158 		break;
2159 	default:
2160 		DBG_ERROR("illegal property");
2161 	}
2162 	return sal_True;
2163 }
2164 //-------------------------------------------------------------------------
2165 
2166 /*--------------------------------------------------------------------
2167 	Beschreibung: Relatives Seitennummern - Feld
2168  --------------------------------------------------------------------*/
2169 
SwRefPageSetFieldType()2170 SwRefPageSetFieldType::SwRefPageSetFieldType()
2171 	: SwFieldType( RES_REFPAGESETFLD )
2172 {
2173 }
2174 /* ---------------------------------------------------------------------------
2175 
2176  ---------------------------------------------------------------------------*/
Copy() const2177 SwFieldType* SwRefPageSetFieldType::Copy() const
2178 {
2179 	return new SwRefPageSetFieldType;
2180 }
2181 /* ---------------------------------------------------------------------------
2182 
2183  ---------------------------------------------------------------------------*/
2184 // ueberlagert, weil es nichts zum Updaten gibt!
Modify(const SfxPoolItem *,const SfxPoolItem *)2185 void SwRefPageSetFieldType::Modify( const SfxPoolItem*, const SfxPoolItem * )
2186 {
2187 }
2188 
2189 /*--------------------------------------------------------------------
2190 	Beschreibung: Relative Seitennummerierung
2191  --------------------------------------------------------------------*/
2192 
SwRefPageSetField(SwRefPageSetFieldType * pTyp,short nOff,sal_Bool bFlag)2193 SwRefPageSetField::SwRefPageSetField( SwRefPageSetFieldType* pTyp,
2194 					short nOff, sal_Bool bFlag )
2195 	: SwField( pTyp ), nOffset( nOff ), bOn( bFlag )
2196 {
2197 }
2198 /* ---------------------------------------------------------------------------
2199 
2200  ---------------------------------------------------------------------------*/
Expand() const2201 String SwRefPageSetField::Expand() const
2202 {
2203 	return aEmptyStr;
2204 }
2205 /* ---------------------------------------------------------------------------
2206 
2207  ---------------------------------------------------------------------------*/
Copy() const2208 SwField* SwRefPageSetField::Copy() const
2209 {
2210 	return new SwRefPageSetField( (SwRefPageSetFieldType*)GetTyp(), nOffset, bOn );
2211 }
2212 /* ---------------------------------------------------------------------------
2213 
2214  ---------------------------------------------------------------------------*/
GetPar2() const2215 String SwRefPageSetField::GetPar2() const
2216 {
2217 	return String::CreateFromInt32( GetOffset() );
2218 }
2219 /* ---------------------------------------------------------------------------
2220 
2221  ---------------------------------------------------------------------------*/
SetPar2(const String & rStr)2222 void SwRefPageSetField::SetPar2(const String& rStr)
2223 {
2224 	SetOffset( (short) rStr.ToInt32() );
2225 }
2226 
QueryValue(uno::Any & rAny,sal_uInt16 nWhichId) const2227 sal_Bool SwRefPageSetField::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
2228 {
2229     switch( nWhichId )
2230 	{
2231 	case FIELD_PROP_BOOL1:
2232 		rAny.setValue(&bOn, ::getBooleanCppuType());
2233 		break;
2234 	case FIELD_PROP_USHORT1:
2235 		rAny <<= (sal_Int16)nOffset;
2236 		break;
2237 	default:
2238 		DBG_ERROR("illegal property");
2239 	}
2240 	return sal_True;
2241 }
2242 
PutValue(const uno::Any & rAny,sal_uInt16 nWhichId)2243 sal_Bool SwRefPageSetField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
2244 {
2245     switch( nWhichId )
2246 	{
2247 	case FIELD_PROP_BOOL1:
2248 		bOn = *(sal_Bool*)rAny.getValue();
2249 		break;
2250 	case FIELD_PROP_USHORT1:
2251 		rAny >>=nOffset;
2252 		break;
2253 	default:
2254 		DBG_ERROR("illegal property");
2255 	}
2256 	return sal_True;
2257 }
2258 /*--------------------------------------------------------------------
2259 	Beschreibung: relatives Seitennummern - Abfrage Feld
2260  --------------------------------------------------------------------*/
2261 
SwRefPageGetFieldType(SwDoc * pDc)2262 SwRefPageGetFieldType::SwRefPageGetFieldType( SwDoc* pDc )
2263 	: SwFieldType( RES_REFPAGEGETFLD ), pDoc( pDc ), nNumberingType( SVX_NUM_ARABIC )
2264 {
2265 }
2266 /* ---------------------------------------------------------------------------
2267 
2268  ---------------------------------------------------------------------------*/
Copy() const2269 SwFieldType* SwRefPageGetFieldType::Copy() const
2270 {
2271 	SwRefPageGetFieldType* pNew = new SwRefPageGetFieldType( pDoc );
2272 	pNew->nNumberingType = nNumberingType;
2273 	return pNew;
2274 }
2275 /* ---------------------------------------------------------------------------
2276 
2277  ---------------------------------------------------------------------------*/
Modify(const SfxPoolItem * pOld,const SfxPoolItem * pNew)2278 void SwRefPageGetFieldType::Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew )
2279 {
2280 	// Update auf alle GetReferenz-Felder
2281 	if( !pNew && !pOld && GetDepends() )
2282 	{
2283 		// sammel erstmal alle SetPageRefFelder ein.
2284 		_SetGetExpFlds aTmpLst( 10, 5 );
2285 		if( MakeSetList( aTmpLst ) )
2286 		{
2287 			SwIterator<SwFmtFld,SwFieldType> aIter( *this );
2288             for ( SwFmtFld* pFmtFld = aIter.First(); pFmtFld; pFmtFld = aIter.Next() )
2289 					// nur die GetRef-Felder Updaten
2290 					if( pFmtFld->GetTxtFld() )
2291 						UpdateField( pFmtFld->GetTxtFld(), aTmpLst );
2292 		}
2293 	}
2294 
2295 	// weiter an die Text-Felder, diese "Expandieren" den Text
2296 	NotifyClients( pOld, pNew );
2297 }
2298 /* ---------------------------------------------------------------------------
2299 
2300  ---------------------------------------------------------------------------*/
MakeSetList(_SetGetExpFlds & rTmpLst)2301 sal_uInt16 SwRefPageGetFieldType::MakeSetList( _SetGetExpFlds& rTmpLst )
2302 {
2303 	SwIterator<SwFmtFld,SwFieldType> aIter(*pDoc->GetSysFldType( RES_REFPAGESETFLD));
2304     for ( SwFmtFld* pFmtFld = aIter.First(); pFmtFld; pFmtFld = aIter.Next() )
2305     {
2306 			// nur die GetRef-Felder Updaten
2307 			const SwTxtFld* pTFld = pFmtFld->GetTxtFld();
2308 			if( pTFld )
2309 			{
2310 				const SwTxtNode& rTxtNd = pTFld->GetTxtNode();
2311 
2312 				// immer den ersten !! (in Tab-Headline, Kopf-/Fuss )
2313 				Point aPt;
2314 				const SwCntntFrm* pFrm = rTxtNd.getLayoutFrm( rTxtNd.GetDoc()->GetCurrentLayout(), &aPt, 0, sal_False );
2315 
2316 				_SetGetExpFld* pNew;
2317 
2318                 if( !pFrm ||
2319                      pFrm->IsInDocBody() ||
2320                     // --> FME 2004-07-27 #i31868#
2321                     // Check if pFrm is not yet connected to the layout.
2322                     !pFrm->FindPageFrm() )
2323                     // <--
2324                 {
2325 					// einen sdbcx::Index fuers bestimmen vom TextNode anlegen
2326 					SwNodeIndex aIdx( rTxtNd );
2327 					pNew = new _SetGetExpFld( aIdx, pTFld );
2328 				}
2329 				else
2330 				{
2331 					// einen sdbcx::Index fuers bestimmen vom TextNode anlegen
2332 					SwPosition aPos( pDoc->GetNodes().GetEndOfPostIts() );
2333 #ifdef DBG_UTIL
2334 					ASSERT( GetBodyTxtNode( *pDoc, aPos, *pFrm ),
2335 							"wo steht das Feld" );
2336 #else
2337 					GetBodyTxtNode( *pDoc, aPos, *pFrm );
2338 #endif
2339 					pNew = new _SetGetExpFld( aPos.nNode, pTFld,
2340 												&aPos.nContent );
2341 				}
2342 
2343 				if( !rTmpLst.Insert( pNew ))
2344 					delete pNew;
2345 			}
2346 	}
2347 
2348 	return rTmpLst.Count();
2349 }
2350 /* ---------------------------------------------------------------------------
2351 
2352  ---------------------------------------------------------------------------*/
UpdateField(SwTxtFld * pTxtFld,_SetGetExpFlds & rSetList)2353 void SwRefPageGetFieldType::UpdateField( SwTxtFld* pTxtFld,
2354 										_SetGetExpFlds& rSetList )
2355 {
2356 	SwRefPageGetField* pGetFld = (SwRefPageGetField*)pTxtFld->GetFmtFld().GetField();
2357 	pGetFld->SetText( aEmptyStr );
2358 
2359 	// dann suche mal das richtige RefPageSet-Field
2360 	SwTxtNode* pTxtNode = (SwTxtNode*)&pTxtFld->GetTxtNode();
2361 	if( pTxtNode->StartOfSectionIndex() >
2362 		pDoc->GetNodes().GetEndOfExtras().GetIndex() )
2363 	{
2364 		SwNodeIndex aIdx( *pTxtNode );
2365 		_SetGetExpFld aEndFld( aIdx, pTxtFld );
2366 
2367 		sal_uInt16 nLast;
2368 		rSetList.Seek_Entry( &aEndFld, &nLast );
2369 
2370 		if( nLast-- )
2371 		{
2372 			const SwTxtFld* pRefTxtFld = rSetList[ nLast ]->GetTxtFld();
2373 			const SwRefPageSetField* pSetFld =
2374 						(SwRefPageSetField*)pRefTxtFld->GetFmtFld().GetField();
2375 			if( pSetFld->IsOn() )
2376 			{
2377 				// dann bestimme mal den entsp. Offset
2378 				Point aPt;
2379 				const SwCntntFrm* pFrm = pTxtNode->getLayoutFrm( pTxtNode->GetDoc()->GetCurrentLayout(), &aPt, 0, sal_False );
2380 				const SwCntntFrm* pRefFrm = pRefTxtFld->GetTxtNode().getLayoutFrm( pRefTxtFld->GetTxtNode().GetDoc()->GetCurrentLayout(), &aPt, 0, sal_False );
2381 				const SwPageFrm* pPgFrm = 0;
2382 				sal_uInt16 nDiff = ( pFrm && pRefFrm )
2383 						? 	(pPgFrm = pFrm->FindPageFrm())->GetPhyPageNum() -
2384 							pRefFrm->FindPageFrm()->GetPhyPageNum() + 1
2385 						: 1;
2386 
2387 				sal_uInt32 nTmpFmt = SVX_NUM_PAGEDESC == pGetFld->GetFormat()
2388 						? ( !pPgFrm
2389 								? (sal_uInt32)SVX_NUM_ARABIC
2390 								: pPgFrm->GetPageDesc()->GetNumType().GetNumberingType() )
2391 						: pGetFld->GetFormat();
2392 				short nPageNum = static_cast<short>(Max(0, pSetFld->GetOffset() + (short)nDiff));
2393 				pGetFld->SetText( FormatNumber( nPageNum, nTmpFmt ) );
2394 			}
2395 		}
2396 	}
2397 	// dann die Formatierung anstossen
2398 	((SwFmtFld&)pTxtFld->GetFmtFld()).ModifyNotification( 0, 0 );
2399 }
2400 
2401 /*--------------------------------------------------------------------
2402 	Beschreibung: Relative Seitennummerierung Abfragen
2403  --------------------------------------------------------------------*/
2404 
SwRefPageGetField(SwRefPageGetFieldType * pTyp,sal_uInt32 nFmt)2405 SwRefPageGetField::SwRefPageGetField( SwRefPageGetFieldType* pTyp,
2406 									sal_uInt32 nFmt )
2407 	: SwField( pTyp, nFmt )
2408 {
2409 }
2410 /* ---------------------------------------------------------------------------
2411 
2412  ---------------------------------------------------------------------------*/
Expand() const2413 String SwRefPageGetField::Expand() const
2414 {
2415 	return sTxt;
2416 }
2417 /* ---------------------------------------------------------------------------
2418 
2419  ---------------------------------------------------------------------------*/
Copy() const2420 SwField* SwRefPageGetField::Copy() const
2421 {
2422 	SwRefPageGetField* pCpy = new SwRefPageGetField(
2423 						(SwRefPageGetFieldType*)GetTyp(), GetFormat() );
2424 	pCpy->SetText( sTxt );
2425 	return pCpy;
2426 }
2427 /* ---------------------------------------------------------------------------
2428 
2429  ---------------------------------------------------------------------------*/
ChangeExpansion(const SwFrm * pFrm,const SwTxtFld * pFld)2430 void SwRefPageGetField::ChangeExpansion( const SwFrm* pFrm,
2431 										const SwTxtFld* pFld )
2432 {
2433 	// nur Felder in Footer, Header, FootNote, Flys
2434 	SwTxtNode* pTxtNode = (SwTxtNode*)&pFld->GetTxtNode();
2435 	SwRefPageGetFieldType* pGetType = (SwRefPageGetFieldType*)GetTyp();
2436 	SwDoc* pDoc = pGetType->GetDoc();
2437 	if( pFld->GetTxtNode().StartOfSectionIndex() >
2438 		pDoc->GetNodes().GetEndOfExtras().GetIndex() )
2439 		return;
2440 
2441 	sTxt.Erase();
2442 
2443 	ASSERT( !pFrm->IsInDocBody(), "Flag ist nicht richtig, Frame steht im DocBody" );
2444 
2445 	// sammel erstmal alle SetPageRefFelder ein.
2446 	_SetGetExpFlds aTmpLst( 10, 5 );
2447 	if( !pGetType->MakeSetList( aTmpLst ) )
2448 		return ;
2449 
2450 	// einen sdbcx::Index fuers bestimmen vom TextNode anlegen
2451 	SwPosition aPos( SwNodeIndex( pDoc->GetNodes() ) );
2452 	pTxtNode = (SwTxtNode*) GetBodyTxtNode( *pDoc, aPos, *pFrm );
2453 
2454 	// Wenn kein Layout vorhanden, kommt es in Kopf und Fusszeilen dazu
2455 	// das ChangeExpansion uebers Layout-Formatieren aufgerufen wird
2456 	// aber kein TxtNode vorhanden ist
2457 	//
2458 	if(!pTxtNode)
2459 		return;
2460 
2461 	_SetGetExpFld aEndFld( aPos.nNode, pFld, &aPos.nContent );
2462 
2463 	sal_uInt16 nLast;
2464 	aTmpLst.Seek_Entry( &aEndFld, &nLast );
2465 
2466 	if( !nLast-- )
2467 		return ;		// es gibt kein entsprechendes Set - Feld vor mir
2468 
2469 	const SwTxtFld* pRefTxtFld = aTmpLst[ nLast ]->GetTxtFld();
2470 	const SwRefPageSetField* pSetFld =
2471 						(SwRefPageSetField*)pRefTxtFld->GetFmtFld().GetField();
2472     Point aPt;
2473     const SwCntntFrm* pRefFrm = pRefTxtFld ? pRefTxtFld->GetTxtNode().getLayoutFrm( pFrm->getRootFrm(), &aPt, 0, sal_False ) : 0;
2474     if( pSetFld->IsOn() && pRefFrm )
2475 	{
2476 		// dann bestimme mal den entsp. Offset
2477         const SwPageFrm* pPgFrm = pFrm->FindPageFrm();
2478 		sal_uInt16 nDiff = pPgFrm->GetPhyPageNum() -
2479 							pRefFrm->FindPageFrm()->GetPhyPageNum() + 1;
2480 
2481 		SwRefPageGetField* pGetFld = (SwRefPageGetField*)pFld->GetFmtFld().GetField();
2482 		sal_uInt32 nTmpFmt = SVX_NUM_PAGEDESC == pGetFld->GetFormat()
2483 							? pPgFrm->GetPageDesc()->GetNumType().GetNumberingType()
2484 							: pGetFld->GetFormat();
2485 		short nPageNum = static_cast<short>(Max(0, pSetFld->GetOffset() + (short)nDiff ));
2486 		pGetFld->SetText( FormatNumber( nPageNum, nTmpFmt ) );
2487 	}
2488 }
2489 
QueryValue(uno::Any & rAny,sal_uInt16 nWhichId) const2490 sal_Bool SwRefPageGetField::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
2491 {
2492     switch( nWhichId )
2493 	{
2494         case FIELD_PROP_USHORT1:
2495             rAny <<= (sal_Int16)GetFormat();
2496         break;
2497         case FIELD_PROP_PAR1:
2498             rAny <<= OUString(sTxt);
2499         break;
2500         default:
2501             DBG_ERROR("illegal property");
2502 	}
2503 	return sal_True;
2504 }
2505 
PutValue(const uno::Any & rAny,sal_uInt16 nWhichId)2506 sal_Bool SwRefPageGetField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
2507 {
2508     switch( nWhichId )
2509 	{
2510         case FIELD_PROP_USHORT1:
2511 		{
2512 			sal_Int16 nSet = 0;
2513 			rAny >>= nSet;
2514 			if(nSet <= SVX_NUM_PAGEDESC )
2515 				SetFormat(nSet);
2516 			else {
2517 				//exception(wrong_value)
2518 				;
2519             }
2520 		}
2521 		break;
2522         case FIELD_PROP_PAR1:
2523         {
2524             OUString sTmp;
2525             rAny >>= sTmp;
2526             sTxt = sTmp;
2527         }
2528         break;
2529     default:
2530 		DBG_ERROR("illegal property");
2531 	}
2532 	return sal_True;
2533 }
2534 
2535 /*--------------------------------------------------------------------
2536 	Beschreibung: Feld zum Anspringen und Editieren
2537  --------------------------------------------------------------------*/
2538 
SwJumpEditFieldType(SwDoc * pD)2539 SwJumpEditFieldType::SwJumpEditFieldType( SwDoc* pD )
2540 	: SwFieldType( RES_JUMPEDITFLD ), pDoc( pD ), aDep( this, 0 )
2541 {
2542 }
2543 /* ---------------------------------------------------------------------------
2544 
2545  ---------------------------------------------------------------------------*/
Copy() const2546 SwFieldType* SwJumpEditFieldType::Copy() const
2547 {
2548 	return new SwJumpEditFieldType( pDoc );
2549 }
2550 /* ---------------------------------------------------------------------------
2551 
2552  ---------------------------------------------------------------------------*/
GetCharFmt()2553 SwCharFmt* SwJumpEditFieldType::GetCharFmt()
2554 {
2555 	SwCharFmt* pFmt = pDoc->GetCharFmtFromPool( RES_POOLCHR_JUMPEDIT );
2556 
2557 	// noch nicht registriert ?
2558 	if( !aDep.GetRegisteredIn() )
2559 		pFmt->Add( &aDep );		// anmelden
2560 
2561 	return pFmt;
2562 }
2563 /* ---------------------------------------------------------------------------
2564 
2565  ---------------------------------------------------------------------------*/
SwJumpEditField(SwJumpEditFieldType * pTyp,sal_uInt32 nForm,const String & rTxt,const String & rHelp)2566 SwJumpEditField::SwJumpEditField( SwJumpEditFieldType* pTyp, sal_uInt32 nForm,
2567 								const String& rTxt, const String& rHelp )
2568 	: SwField( pTyp, nForm ), sTxt( rTxt ), sHelp( rHelp )
2569 {
2570 }
2571 /* ---------------------------------------------------------------------------
2572 
2573  ---------------------------------------------------------------------------*/
Expand() const2574 String SwJumpEditField::Expand() const
2575 {
2576 	String sTmp( '<' );
2577 	sTmp += sTxt;
2578 	return sTmp += '>';
2579 }
2580 /* ---------------------------------------------------------------------------
2581 
2582  ---------------------------------------------------------------------------*/
Copy() const2583 SwField* SwJumpEditField::Copy() const
2584 {
2585 	return new SwJumpEditField( (SwJumpEditFieldType*)GetTyp(), GetFormat(),
2586 								sTxt, sHelp );
2587 }
2588 /* ---------------------------------------------------------------------------
2589 
2590  ---------------------------------------------------------------------------*/
2591 // Platzhalter-Text
2592 
GetPar1() const2593 const String& SwJumpEditField::GetPar1() const
2594 {
2595 	return sTxt;
2596 }
2597 /* ---------------------------------------------------------------------------
2598 
2599  ---------------------------------------------------------------------------*/
SetPar1(const String & rStr)2600 void SwJumpEditField::SetPar1(const String& rStr)
2601 {
2602 	sTxt = rStr;
2603 }
2604 
2605 // HinweisText
2606 /* ---------------------------------------------------------------------------
2607 
2608  ---------------------------------------------------------------------------*/
GetPar2() const2609 String SwJumpEditField::GetPar2() const
2610 {
2611 	return sHelp;
2612 }
2613 /* ---------------------------------------------------------------------------
2614 
2615  ---------------------------------------------------------------------------*/
SetPar2(const String & rStr)2616 void SwJumpEditField::SetPar2(const String& rStr)
2617 {
2618 	sHelp = rStr;
2619 }
2620 
QueryValue(uno::Any & rAny,sal_uInt16 nWhichId) const2621 sal_Bool SwJumpEditField::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
2622 {
2623     switch( nWhichId )
2624 	{
2625 	case FIELD_PROP_USHORT1:
2626 		{
2627 			sal_Int16 nRet;
2628 			switch( GetFormat() )
2629 			{
2630 			case JE_FMT_TABLE:  nRet = text::PlaceholderType::TABLE; break;
2631 			case JE_FMT_FRAME:  nRet = text::PlaceholderType::TEXTFRAME; break;
2632 			case JE_FMT_GRAPHIC:nRet = text::PlaceholderType::GRAPHIC; break;
2633 			case JE_FMT_OLE:	nRet = text::PlaceholderType::OBJECT; break;
2634 //			case JE_FMT_TEXT:
2635 			default:
2636 				nRet = text::PlaceholderType::TEXT; break;
2637 			}
2638 			rAny <<= nRet;
2639 		}
2640 		break;
2641 	case FIELD_PROP_PAR1 :
2642 		rAny <<= OUString(sHelp);
2643 		break;
2644 	case FIELD_PROP_PAR2 :
2645 		 rAny <<= OUString(sTxt);
2646 		 break;
2647 	default:
2648 		DBG_ERROR("illegal property");
2649 	}
2650 	return sal_True;
2651 }
2652 
PutValue(const uno::Any & rAny,sal_uInt16 nWhichId)2653 sal_Bool SwJumpEditField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
2654 {
2655     switch( nWhichId )
2656 	{
2657 	case FIELD_PROP_USHORT1:
2658 		{
2659 			//JP 24.10.2001: int32 because in UnoField.cxx a putvalue is
2660 			//				called with a int32 value! But normally we need
2661 			//				here only a int16
2662 			sal_Int32 nSet = 0;
2663 			rAny >>= nSet;
2664 			switch( nSet )
2665 			{
2666 				case text::PlaceholderType::TEXT 	 : SetFormat(JE_FMT_TEXT); break;
2667 				case text::PlaceholderType::TABLE 	 : SetFormat(JE_FMT_TABLE); break;
2668 				case text::PlaceholderType::TEXTFRAME: SetFormat(JE_FMT_FRAME); break;
2669 				case text::PlaceholderType::GRAPHIC  : SetFormat(JE_FMT_GRAPHIC); break;
2670 				case text::PlaceholderType::OBJECT 	 : SetFormat(JE_FMT_OLE); break;
2671 			}
2672 		}
2673 		break;
2674 	case FIELD_PROP_PAR1 :
2675 		::GetString( rAny, sHelp );
2676 		break;
2677 	case FIELD_PROP_PAR2 :
2678 		 ::GetString( rAny, sTxt);
2679 		 break;
2680 	default:
2681 		DBG_ERROR("illegal property");
2682 	}
2683 	return sal_True;
2684 }
2685 
2686 
2687 /*--------------------------------------------------------------------
2688 	Beschreibung: Combined Character Fieldtype / Field
2689  --------------------------------------------------------------------*/
2690 
SwCombinedCharFieldType()2691 SwCombinedCharFieldType::SwCombinedCharFieldType()
2692 	: SwFieldType( RES_COMBINED_CHARS )
2693 {
2694 }
2695 
Copy() const2696 SwFieldType* SwCombinedCharFieldType::Copy() const
2697 {
2698 	return new SwCombinedCharFieldType;
2699 }
2700 
2701 /* --------------------------------------------------------------------*/
2702 
SwCombinedCharField(SwCombinedCharFieldType * pFTyp,const String & rChars)2703 SwCombinedCharField::SwCombinedCharField( SwCombinedCharFieldType* pFTyp,
2704 											const String& rChars )
2705 	: SwField( pFTyp, 0 ),
2706 	sCharacters( rChars.Copy( 0, MAX_COMBINED_CHARACTERS ))
2707 {
2708 }
2709 
Expand() const2710 String	SwCombinedCharField::Expand() const
2711 {
2712 	return sCharacters;
2713 }
2714 
Copy() const2715 SwField* SwCombinedCharField::Copy() const
2716 {
2717 	return new SwCombinedCharField( (SwCombinedCharFieldType*)GetTyp(),
2718 										sCharacters );
2719 }
2720 
GetPar1() const2721 const String& SwCombinedCharField::GetPar1() const
2722 {
2723 	return sCharacters;
2724 }
2725 
SetPar1(const String & rStr)2726 void SwCombinedCharField::SetPar1(const String& rStr)
2727 {
2728 	sCharacters = rStr.Copy( 0, MAX_COMBINED_CHARACTERS );
2729 }
2730 
QueryValue(uno::Any & rAny,sal_uInt16 nWhichId) const2731 sal_Bool SwCombinedCharField::QueryValue( uno::Any& rAny,
2732                                         sal_uInt16 nWhichId ) const
2733 {
2734     switch( nWhichId )
2735 	{
2736 	case FIELD_PROP_PAR1:
2737 		rAny <<= rtl::OUString( sCharacters );
2738 		break;
2739 	default:
2740 		DBG_ERROR("illegal property");
2741 	}
2742 	return sal_True;
2743 }
2744 
PutValue(const uno::Any & rAny,sal_uInt16 nWhichId)2745 sal_Bool SwCombinedCharField::PutValue( const uno::Any& rAny,
2746                                         sal_uInt16 nWhichId )
2747 {
2748     switch( nWhichId )
2749 	{
2750 	case FIELD_PROP_PAR1:
2751 		::GetString( rAny, sCharacters ).Erase( MAX_COMBINED_CHARACTERS );
2752 		break;
2753 	default:
2754 		DBG_ERROR("illegal property");
2755 	}
2756 	return sal_True;
2757 }
2758 
2759