xref: /aoo41x/main/editeng/source/uno/unofield.cxx (revision 190118d0)
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_editeng.hxx"
26 #include <com/sun/star/util/DateTime.hpp>
27 #include <com/sun/star/text/FilenameDisplayFormat.hpp>
28 #include <com/sun/star/lang/NoSupportException.hpp>
29 #include <com/sun/star/beans/PropertyAttribute.hpp>
30 #include <vcl/svapp.hxx>
31 #include <vos/mutex.hxx>
32 
33 #include <rtl/uuid.h>
34 #include <rtl/memory.h>
35 
36 #include <editeng/eeitem.hxx>
37 #include <editeng/flditem.hxx>
38 #include <editeng/measfld.hxx>
39 #include <editeng/unofield.hxx>
40 #include <editeng/unotext.hxx>
41 #include <comphelper/serviceinfohelper.hxx>
42 
43 using namespace ::rtl;
44 using namespace ::vos;
45 using namespace ::cppu;
46 using namespace ::com::sun::star;
47 
48 #define QUERYINT( xint ) \
49 	if( rType == ::getCppuType((const uno::Reference< xint >*)0) ) \
50 		aAny <<= uno::Reference< xint >(this)
51 
52 
53 #define WID_DATE	0
54 #define WID_BOOL1	1
55 #define WID_BOOL2	2
56 #define WID_INT32	3
57 #define WID_INT16	4
58 #define WID_STRING1	5
59 #define WID_STRING2	6
60 #define WID_STRING3	7
61 
62 class SvxUnoFieldData_Impl
63 {
64 public:
65 	sal_Bool	mbBoolean1;
66 	sal_Bool	mbBoolean2;
67 	sal_Int32	mnInt32;
68 	sal_Int16	mnInt16;
69 	OUString	msString1;
70 	OUString	msString2;
71 	OUString	msString3;
72 	util::DateTime maDateTime;
73 
74 	OUString	msPresentation;
75 };
76 
ImplGetFieldItemPropertySet(sal_Int32 mnId)77 const SfxItemPropertySet* ImplGetFieldItemPropertySet( sal_Int32 mnId )
78 {
79     static SfxItemPropertyMapEntry aExDateTimeFieldPropertyMap_Impl[] =
80 	{
81 		{ MAP_CHAR_LEN("DateTime"),			WID_DATE,		&::getCppuType((const util::DateTime*)0),		0, 0 },
82 		{ MAP_CHAR_LEN("IsFixed"),			WID_BOOL1,		&::getBooleanCppuType(),				0, 0 },
83 		{ MAP_CHAR_LEN("IsDate"),			WID_BOOL2,		&::getBooleanCppuType(),				0, 0 },
84 		{ MAP_CHAR_LEN("NumberFormat"),		WID_INT32,		&::getCppuType((const sal_Int16*)0),	0, 0 },
85 		{0,0,0,0,0,0}
86 	};
87     static SfxItemPropertySet aExDateTimeFieldPropertySet_Impl(aExDateTimeFieldPropertyMap_Impl);
88 
89     static SfxItemPropertyMapEntry aDateTimeFieldPropertyMap_Impl[] =
90 	{
91 		{ MAP_CHAR_LEN("IsDate"),			WID_BOOL2,		&::getBooleanCppuType(),				0, 0 },
92 		{0,0,0,0,0,0}
93 	};
94     static SfxItemPropertySet aDateTimeFieldPropertySet_Impl(aDateTimeFieldPropertyMap_Impl);
95 
96     static SfxItemPropertyMapEntry aUrlFieldPropertyMap_Impl[] =
97 	{
98 
99 		{ MAP_CHAR_LEN("Format"),			WID_INT16,		&::getCppuType((const sal_Int16*)0),	0, 0 },
100 		{ MAP_CHAR_LEN("Representation"),	WID_STRING1,	&::getCppuType((const OUString*)0),		0, 0 },
101 		{ MAP_CHAR_LEN("TargetFrame"),		WID_STRING2,	&::getCppuType((const OUString*)0),		0, 0 },
102 		{ MAP_CHAR_LEN("URL"),				WID_STRING3,	&::getCppuType((const OUString*)0),		0, 0 },
103 		{0,0,0,0,0,0}
104 	};
105     static SfxItemPropertySet aUrlFieldPropertySet_Impl(aUrlFieldPropertyMap_Impl);
106 
107     static SfxItemPropertyMapEntry aEmptyPropertyMap_Impl[] =
108 	{
109 		{0,0,0,0,0,0}
110 	};
111     static SfxItemPropertySet aEmptyPropertySet_Impl(aEmptyPropertyMap_Impl);
112 
113     static SfxItemPropertyMapEntry aExtFileFieldPropertyMap_Impl[] =
114 	{
115 		{ MAP_CHAR_LEN("IsFixed"),				WID_BOOL1,	&::getBooleanCppuType(),				0, 0 },
116 		{ MAP_CHAR_LEN("FileFormat"),			WID_INT16,	&::getCppuType((const sal_Int16*)0),	0, 0 },
117 		{ MAP_CHAR_LEN("CurrentPresentation"),	WID_STRING1,&::getCppuType((const OUString*)0),		0, 0 },
118 		{0,0,0,0,0,0}
119 	};
120     static SfxItemPropertySet aExtFileFieldPropertySet_Impl(aExtFileFieldPropertyMap_Impl);
121 
122     static SfxItemPropertyMapEntry aAuthorFieldPropertyMap_Impl[] =
123 	{
124 		{ MAP_CHAR_LEN("IsFixed"),				WID_BOOL1,	&::getBooleanCppuType(),				0, 0 },
125 		{ MAP_CHAR_LEN("CurrentPresentation"),	WID_STRING1,&::getCppuType((const OUString*)0),		0, 0 },
126 		{ MAP_CHAR_LEN("Content"),				WID_STRING2,&::getCppuType((const OUString*)0),		0, 0 },
127 		{ MAP_CHAR_LEN("AuthorFormat"),			WID_INT16,	&::getCppuType((const sal_Int16*)0),	0, 0 },
128 		{ MAP_CHAR_LEN("FullName"),				WID_BOOL2,	&::getBooleanCppuType(),				0, 0 },
129 		{0,0,0,0,0,0}
130 	};
131     static SfxItemPropertySet aAuthorFieldPropertySet_Impl(aAuthorFieldPropertyMap_Impl);
132 
133     static SfxItemPropertyMapEntry aMeasureFieldPropertyMap_Impl[] =
134 	{
135 		{ MAP_CHAR_LEN("Kind"),					WID_INT16,	&::getCppuType((const sal_Int16*)0),	0, 0 },
136 		{0,0,0,0,0,0}
137 	};
138     static SfxItemPropertySet aMeasureFieldPropertySet_Impl(aMeasureFieldPropertyMap_Impl);
139 
140 	switch( mnId )
141 	{
142 	case ID_EXT_DATEFIELD:
143 	case ID_EXT_TIMEFIELD:
144 		return &aExDateTimeFieldPropertySet_Impl;
145 	case ID_URLFIELD:
146 		return &aUrlFieldPropertySet_Impl;
147 	case ID_DATEFIELD:
148 	case ID_TIMEFIELD:
149 		return &aDateTimeFieldPropertySet_Impl;
150 	case ID_EXT_FILEFIELD:
151 		return &aExtFileFieldPropertySet_Impl;
152 	case ID_AUTHORFIELD:
153 		return &aAuthorFieldPropertySet_Impl;
154 	case ID_MEASUREFIELD:
155 		return &aMeasureFieldPropertySet_Impl;
156 //	case ID_PAGEFIELD:
157 //	case ID_PAGESFIELD:
158 //	case ID_FILEFIELD:
159 //	case ID_TABLEFIELD:
160 //	case ID_HEADERFIELD:
161 //	case ID_FOOTERFIELD:
162 //	case ID_DATETIMEFIELD::
163 	default:
164 		return &aEmptyPropertySet_Impl;
165 	}
166 }
167 
168 static sal_Char const* aFieldItemNameMap_Impl[] =
169 {
170 	"Date",
171 	"URL",
172 	"Page",
173 	"Pages",
174 	"Time",
175 	"File",
176 	"Table",
177 	"ExtTime",
178 	"ExtFile",
179 	"Author",
180 	"Measure",
181 	"ExtDate",
182 	"Header",
183 	"Footer",
184 	"DateTime",
185 	"Unknown"
186 };
187 
188 /* conversion routines */
189 
getFileNameDisplayFormat(SvxFileFormat nFormat)190 static sal_Int16 getFileNameDisplayFormat( SvxFileFormat nFormat )
191 {
192 	switch( nFormat )
193 	{
194 	case SVXFILEFORMAT_NAME_EXT:	return text::FilenameDisplayFormat::NAME_AND_EXT;
195 	case SVXFILEFORMAT_FULLPATH:	return text::FilenameDisplayFormat::FULL;
196 	case SVXFILEFORMAT_PATH:	return text::FilenameDisplayFormat::PATH;
197 //	case SVXFILEFORMAT_NAME:
198 	default: return text::FilenameDisplayFormat::NAME;
199 	}
200 }
201 
setFileNameDisplayFormat(sal_Int16 nFormat)202 static SvxFileFormat setFileNameDisplayFormat( sal_Int16 nFormat )
203 {
204 	switch( nFormat )
205 	{
206 	case text::FilenameDisplayFormat::FULL:	return SVXFILEFORMAT_FULLPATH;
207 	case text::FilenameDisplayFormat::PATH:	return SVXFILEFORMAT_PATH;
208 	case text::FilenameDisplayFormat::NAME:	return SVXFILEFORMAT_NAME;
209 //	case text::FilenameDisplayFormat::NAME_AND_EXT:
210 	default:
211 		return SVXFILEFORMAT_NAME_EXT;
212 	}
213 }
214 
getDate(sal_uLong nDate)215 static util::DateTime getDate( sal_uLong nDate )
216 {
217 	util::DateTime aDate;
218 	memset( &aDate, 0, sizeof( util::DateTime ) );
219 
220 	Date aTempDate( nDate );
221 
222 	aDate.Day = aTempDate.GetDay();
223     aDate.Month = aTempDate.GetMonth();
224     aDate.Year = aTempDate.GetYear();
225 
226 	return aDate;
227 }
228 
setDate(util::DateTime & rDate)229 inline Date setDate( util::DateTime& rDate )
230 {
231 	return Date( rDate.Day, rDate.Month, rDate.Year );
232 }
233 
getTime(long nTime)234 static util::DateTime getTime( long nTime )
235 {
236 	util::DateTime aTime;
237 	memset( &aTime, 0, sizeof( util::DateTime ) );
238 
239 	Time aTempTime( nTime );
240 
241 	aTime.HundredthSeconds = aTempTime.Get100Sec();
242 	aTime.Seconds = aTempTime.GetSec();
243 	aTime.Minutes = aTempTime.GetMin();
244 	aTime.Hours = aTempTime.GetHour();
245 
246 	return aTime;
247 }
248 
setTime(util::DateTime & rDate)249 inline Time setTime( util::DateTime& rDate )
250 {
251 	return Time( rDate.Hours, rDate.Minutes, rDate.Seconds, rDate.HundredthSeconds  );
252 }
253 
254 // ====================================================================
255 // class SvxUnoTextField
256 // ====================================================================
257 UNO3_GETIMPLEMENTATION_IMPL( SvxUnoTextField );
258 
SvxUnoTextField(sal_Int32 nServiceId)259 SvxUnoTextField::SvxUnoTextField( sal_Int32 nServiceId ) throw()
260 :	OComponentHelper( getMutex() )
261 ,	mpPropSet(NULL)
262 ,	mnServiceId(nServiceId)
263 ,	mpImpl( new SvxUnoFieldData_Impl )
264 {
265 	mpPropSet = ImplGetFieldItemPropertySet(mnServiceId);
266 
267 	memset( &(mpImpl->maDateTime), 0, sizeof( util::DateTime ) );
268 
269 	switch( nServiceId )
270 	{
271 	case ID_EXT_DATEFIELD:
272 	case ID_DATEFIELD:
273 		mpImpl->mbBoolean2 = sal_True;
274 		mpImpl->mnInt32 = SVXDATEFORMAT_STDSMALL;
275 		mpImpl->mbBoolean1 = sal_False;
276 		break;
277 
278 	case ID_EXT_TIMEFIELD:
279 	case ID_TIMEFIELD:
280 		mpImpl->mbBoolean2 = sal_False;
281 		mpImpl->mbBoolean1 = sal_False;
282 		mpImpl->mnInt32 = SVXTIMEFORMAT_STANDARD;
283 		break;
284 
285 	case ID_URLFIELD:
286 		mpImpl->mnInt16 = SVXURLFORMAT_REPR;
287 		break;
288 
289 	case ID_EXT_FILEFIELD:
290 		mpImpl->mbBoolean1 = sal_False;
291 		mpImpl->mnInt16 = text::FilenameDisplayFormat::FULL;
292 		break;
293 
294 	case ID_AUTHORFIELD:
295 		mpImpl->mnInt16 = SVXAUTHORFORMAT_FULLNAME;
296 		mpImpl->mbBoolean1 = sal_False;
297 		mpImpl->mbBoolean2 = sal_True;
298 		break;
299 
300 	case ID_MEASUREFIELD:
301 		mpImpl->mnInt16 = SDRMEASUREFIELD_VALUE;
302 		break;
303 
304 	default:
305 		mpImpl->mbBoolean1 = sal_False;
306 		mpImpl->mbBoolean2 = sal_False;
307 		mpImpl->mnInt32 = 0;
308 		mpImpl->mnInt16 = 0;
309 
310 	}
311 }
312 
SvxUnoTextField(uno::Reference<text::XTextRange> xAnchor,const OUString & rPresentation,const SvxFieldData * pData)313 SvxUnoTextField::SvxUnoTextField( uno::Reference< text::XTextRange > xAnchor, const OUString& rPresentation, const SvxFieldData* pData ) throw()
314 :	OComponentHelper( getMutex() )
315 ,	mxAnchor( xAnchor )
316 ,	mpPropSet(NULL)
317 ,	mnServiceId(ID_UNKNOWN)
318 ,	mpImpl( new SvxUnoFieldData_Impl )
319 {
320 	DBG_ASSERT(pData, "pFieldData == NULL! [CL]" );
321 
322 	mpImpl->msPresentation = rPresentation;
323 
324 	if(pData)
325 	{
326 		mnServiceId = GetFieldId(pData);
327 		DBG_ASSERT(mnServiceId != ID_UNKNOWN, "unknown SvxFieldData! [CL]");
328 		if(mnServiceId != ID_UNKNOWN)
329 		{
330 			// extract field properties from data class
331 			switch( mnServiceId )
332 			{
333 			case ID_DATEFIELD:
334 			case ID_EXT_DATEFIELD:
335                 {
336                     mpImpl->mbBoolean2 = sal_True;
337                     // #i35416# for variable date field, don't use invalid "0000-00-00" date,
338                     // use current date instead
339                     sal_Bool bFixed = ((SvxDateField*)pData)->GetType() == SVXDATETYPE_FIX;
340                     mpImpl->maDateTime = getDate( bFixed ?
341                                             ((SvxDateField*)pData)->GetFixDate() :
342                                             Date().GetDate() );
343                     mpImpl->mnInt32 = ((SvxDateField*)pData)->GetFormat();
344                     mpImpl->mbBoolean1 = bFixed;
345                 }
346 				break;
347 
348 			case ID_TIMEFIELD:
349 				mpImpl->mbBoolean2 = sal_False;
350 				mpImpl->mbBoolean1 = sal_False;
351 				mpImpl->mnInt32 = SVXTIMEFORMAT_STANDARD;
352 				break;
353 
354 			case ID_EXT_TIMEFIELD:
355 				mpImpl->mbBoolean2 = sal_False;
356 				mpImpl->maDateTime = getTime( ((SvxExtTimeField*)pData)->GetFixTime() );
357 				mpImpl->mbBoolean1 = ((SvxExtTimeField*)pData)->GetType() == SVXTIMETYPE_FIX;
358 				mpImpl->mnInt32 = ((SvxExtTimeField*)pData)->GetFormat();
359 				break;
360 
361 			case ID_URLFIELD:
362 				mpImpl->msString1 = ((SvxURLField*)pData)->GetRepresentation();
363 				mpImpl->msString2 = ((SvxURLField*)pData)->GetTargetFrame();
364 				mpImpl->msString3 = ((SvxURLField*)pData)->GetURL();
365 				mpImpl->mnInt16 = sal::static_int_cast< sal_Int16 >(
366                     ((SvxURLField*)pData)->GetFormat());
367 				break;
368 
369 			case ID_EXT_FILEFIELD:
370 				mpImpl->msString1 = ((SvxExtFileField*)pData)->GetFile();
371 				mpImpl->mbBoolean1 = ((SvxExtFileField*)pData)->GetType() == SVXFILETYPE_FIX;
372 				mpImpl->mnInt16 = getFileNameDisplayFormat(((SvxExtFileField*)pData)->GetFormat());
373 				break;
374 
375 			case ID_AUTHORFIELD:
376 				mpImpl->msString1  = ((SvxAuthorField*)pData)->GetFormatted();
377 				mpImpl->msString2  = ((SvxAuthorField*)pData)->GetFormatted();
378 				mpImpl->mnInt16	   = sal::static_int_cast< sal_Int16 >(
379                     ((SvxAuthorField*)pData)->GetFormat());
380 				mpImpl->mbBoolean1 = ((SvxAuthorField*)pData)->GetType() == SVXAUTHORTYPE_FIX;
381 				mpImpl->mbBoolean2 = ((SvxAuthorField*)pData)->GetFormat() != SVXAUTHORFORMAT_SHORTNAME;
382 				break;
383 
384 			case ID_MEASUREFIELD:
385 				mpImpl->mnInt16		= sal::static_int_cast< sal_Int16 >(((SdrMeasureField*)pData)->GetMeasureFieldKind());
386 				break;
387 			}
388 		}
389 	}
390 
391 	mpPropSet = ImplGetFieldItemPropertySet(mnServiceId);
392 }
393 
~SvxUnoTextField()394 SvxUnoTextField::~SvxUnoTextField() throw()
395 {
396 	delete mpImpl;
397 }
398 
CreateFieldData() const399 SvxFieldData* SvxUnoTextField::CreateFieldData() const throw()
400 {
401 	SvxFieldData* pData = NULL;
402 
403 	switch( mnServiceId )
404 	{
405 	case ID_TIMEFIELD:
406 	case ID_EXT_TIMEFIELD:
407 	case ID_DATEFIELD:
408 	case ID_EXT_DATEFIELD:
409 	{
410 		if( mpImpl->mbBoolean2 ) // IsDate?
411 		{
412 			Date aDate( setDate( mpImpl->maDateTime ) );
413 			pData = new SvxDateField( aDate, mpImpl->mbBoolean1?SVXDATETYPE_FIX:SVXDATETYPE_VAR );
414 			if( mpImpl->mnInt32 >= SVXDATEFORMAT_APPDEFAULT && mpImpl->mnInt32 <= SVXDATEFORMAT_F )
415 				((SvxDateField*)pData)->SetFormat( (SvxDateFormat)mpImpl->mnInt32 );
416 		}
417 		else
418 		{
419 			if( mnServiceId != ID_TIMEFIELD && mnServiceId != ID_DATEFIELD )
420 			{
421 				Time aTime( setTime( mpImpl->maDateTime ) );
422 				pData = new SvxExtTimeField( aTime, mpImpl->mbBoolean1?SVXTIMETYPE_FIX:SVXTIMETYPE_VAR );
423 
424 				if( mpImpl->mnInt32 >= SVXTIMEFORMAT_APPDEFAULT && mpImpl->mnInt32 <= SVXTIMEFORMAT_AM_HMSH )
425 					((SvxExtTimeField*)pData)->SetFormat( (SvxTimeFormat)mpImpl->mnInt32 );
426 			}
427 			else
428 			{
429 				pData = new SvxTimeField();
430 			}
431 		}
432 
433 	}
434 		break;
435 
436 	case ID_URLFIELD:
437 		pData = new SvxURLField( mpImpl->msString3, mpImpl->msString1, mpImpl->msString1.getLength() ? SVXURLFORMAT_REPR : SVXURLFORMAT_URL );
438 		((SvxURLField*)pData)->SetTargetFrame( mpImpl->msString2 );
439 		if( mpImpl->mnInt16 >= SVXURLFORMAT_APPDEFAULT && mpImpl->mnInt16 <= SVXURLFORMAT_REPR )
440 			((SvxURLField*)pData)->SetFormat( (SvxURLFormat)mpImpl->mnInt16 );
441 		break;
442 
443 	case ID_PAGEFIELD:
444 		pData = new SvxPageField();
445 		break;
446 
447 	case ID_PAGESFIELD:
448 		pData = new SvxPagesField();
449 		break;
450 
451 	case ID_FILEFIELD:
452 		pData = new SvxFileField();
453 		break;
454 
455 	case ID_TABLEFIELD:
456 		pData = new SvxTableField();
457 		break;
458 
459 	case ID_EXT_FILEFIELD:
460 	{
461         // #92009# pass fixed attribute to constructor
462 		pData = new SvxExtFileField( mpImpl->msString1,
463                                      mpImpl->mbBoolean1 ? SVXFILETYPE_FIX : SVXFILETYPE_VAR,
464                                      setFileNameDisplayFormat(mpImpl->mnInt16 ) );
465 		break;
466 	}
467 
468 	case ID_AUTHORFIELD:
469 	{
470 		::rtl::OUString aContent;
471 		String aFirstName;
472 		String aLastName;
473 		String aEmpty;
474 
475         // do we have CurrentPresentation given?
476         // mimic behaviour of writer, which means:
477         // prefer CurrentPresentation over Content
478         // if both are given.
479         if( mpImpl->msString1.getLength() )
480             aContent = mpImpl->msString1;
481         else
482             aContent = mpImpl->msString2;
483 
484         sal_Int32 nPos = aContent.lastIndexOf( sal_Char(' '), 0 );
485         if( nPos > 0 )
486         {
487             aFirstName = aContent.copy( 0, nPos );
488             aLastName = aContent.copy( nPos + 1 );
489         }
490         else
491         {
492             aLastName = aContent;
493         }
494 
495         // #92009# pass fixed attribute to constructor
496         pData = new SvxAuthorField( aFirstName, aLastName, aEmpty,
497                                     mpImpl->mbBoolean1 ? SVXAUTHORTYPE_FIX : SVXAUTHORTYPE_VAR );
498 
499 		if( !mpImpl->mbBoolean2 )
500 		{
501 			((SvxAuthorField*)pData)->SetFormat( SVXAUTHORFORMAT_SHORTNAME );
502 		}
503 		else if( mpImpl->mnInt16 >= SVXAUTHORFORMAT_FULLNAME || mpImpl->mnInt16 <= SVXAUTHORFORMAT_SHORTNAME )
504 		{
505 			((SvxAuthorField*)pData)->SetFormat( (SvxAuthorFormat) mpImpl->mnInt16 );
506 		}
507 
508 		break;
509 	}
510 
511 	case ID_MEASUREFIELD:
512 	{
513 		SdrMeasureFieldKind eKind = SDRMEASUREFIELD_VALUE;
514 		if( mpImpl->mnInt16 == (sal_Int16)SDRMEASUREFIELD_UNIT || mpImpl->mnInt16 == (sal_Int16)SDRMEASUREFIELD_ROTA90BLANCS )
515 			eKind = (SdrMeasureFieldKind) mpImpl->mnInt16;
516 		pData = new SdrMeasureField( eKind);
517 		break;
518 	}
519 	case ID_HEADERFIELD:
520 		pData = new SvxHeaderField();
521 		break;
522 	case ID_FOOTERFIELD:
523 		pData = new SvxFooterField();
524 		break;
525 	case ID_DATETIMEFIELD:
526 		pData = new SvxDateTimeField();
527 		break;
528 	};
529 
530 	return pData;
531 }
532 
533 // uno::XInterface
queryAggregation(const uno::Type & rType)534 uno::Any SAL_CALL SvxUnoTextField::queryAggregation( const uno::Type & rType )
535 	throw(uno::RuntimeException)
536 {
537 	uno::Any aAny;
538 
539 	QUERYINT( beans::XPropertySet );
540 	else QUERYINT( text::XTextContent );
541 	else QUERYINT( text::XTextField );
542 	else QUERYINT( lang::XServiceInfo );
543 	else QUERYINT( lang::XUnoTunnel );
544 	else
545 		return OComponentHelper::queryAggregation( rType );
546 
547 	return aAny;
548 }
549 
550 // XTypeProvider
551 
getTypes()552 uno::Sequence< uno::Type > SAL_CALL SvxUnoTextField::getTypes()
553 	throw (uno::RuntimeException)
554 {
555 	if( maTypeSequence.getLength() == 0 )
556 	{
557 		maTypeSequence = OComponentHelper::getTypes();
558 		sal_Int32 nOldCount = maTypeSequence.getLength();
559 
560 		maTypeSequence.realloc( nOldCount + 4 ); // !DANGER! keep this updated
561 		uno::Type* pTypes = &maTypeSequence.getArray()[nOldCount];
562 
563 		*pTypes++ = ::getCppuType(( const uno::Reference< text::XTextField >*)0);
564 		*pTypes++ = ::getCppuType(( const uno::Reference< beans::XPropertySet >*)0);
565 		*pTypes++ = ::getCppuType(( const uno::Reference< lang::XServiceInfo >*)0);
566 		*pTypes++ = ::getCppuType(( const uno::Reference< lang::XUnoTunnel >*)0);
567 	}
568 	return maTypeSequence;
569 }
570 
getImplementationId()571 uno::Sequence< sal_Int8 > SAL_CALL SvxUnoTextField::getImplementationId()
572 	throw (uno::RuntimeException)
573 {
574 	static uno::Sequence< sal_Int8 > aId;
575 	if( aId.getLength() == 0 )
576 	{
577 		aId.realloc( 16 );
578 		rtl_createUuid( (sal_uInt8 *)aId.getArray(), 0, sal_True );
579 	}
580 	return aId;
581 }
582 
queryInterface(const uno::Type & rType)583 uno::Any SAL_CALL SvxUnoTextField::queryInterface( const uno::Type & rType )
584 	throw(uno::RuntimeException)
585 {
586 	return OComponentHelper::queryInterface(rType);
587 }
588 
acquire()589 void SAL_CALL SvxUnoTextField::acquire() throw( )
590 {
591 	OComponentHelper::acquire();
592 }
593 
release()594 void SAL_CALL SvxUnoTextField::release() throw( )
595 {
596 	OComponentHelper::release();
597 }
598 
599 // Interface text::XTextField
getPresentation(sal_Bool bShowCommand)600 OUString SAL_CALL SvxUnoTextField::getPresentation( sal_Bool bShowCommand )
601 	throw(uno::RuntimeException)
602 {
603 	OGuard aGuard( Application::GetSolarMutex() );
604 
605 	if(bShowCommand)
606 	{
607 		DBG_ASSERT( ((sal_uInt32)mnServiceId) < ID_UNKNOWN, "Unknown field type" );
608 		return OUString::createFromAscii( aFieldItemNameMap_Impl[(((sal_uInt32)mnServiceId) > ID_UNKNOWN)? ID_UNKNOWN : mnServiceId ] );
609 	}
610 	else
611 	{
612 		return mpImpl->msPresentation;
613 	}
614 }
615 
616 // Interface text::XTextContent
attach(const uno::Reference<text::XTextRange> & xTextRange)617 void SAL_CALL SvxUnoTextField::attach( const uno::Reference< text::XTextRange >& xTextRange )
618 	throw(lang::IllegalArgumentException, uno::RuntimeException)
619 {
620 	SvxUnoTextRangeBase* pRange = SvxUnoTextRange::getImplementation( xTextRange );
621 	if(pRange == NULL)
622 		throw lang::IllegalArgumentException();
623 
624 	SvxFieldData* pData = CreateFieldData();
625 	if( pData )
626 		pRange->attachField( pData );
627 
628 	delete pData;
629 }
630 
getAnchor()631 uno::Reference< text::XTextRange > SAL_CALL SvxUnoTextField::getAnchor()
632 	throw(uno::RuntimeException)
633 {
634 	return mxAnchor;
635 }
636 
637 // lang::XComponent
dispose()638 void SAL_CALL SvxUnoTextField::dispose()
639 	throw(uno::RuntimeException)
640 {
641 	OComponentHelper::dispose();
642 }
643 
addEventListener(const uno::Reference<lang::XEventListener> & xListener)644 void SAL_CALL SvxUnoTextField::addEventListener( const uno::Reference< lang::XEventListener >& xListener )
645 	throw(uno::RuntimeException)
646 {
647 	OComponentHelper::addEventListener(xListener);
648 }
649 
removeEventListener(const uno::Reference<lang::XEventListener> & aListener)650 void SAL_CALL SvxUnoTextField::removeEventListener( const uno::Reference< lang::XEventListener >& aListener )
651 	throw(uno::RuntimeException)
652 {
653 	OComponentHelper::removeEventListener(aListener);
654 }
655 
656 
657 // Interface beans::XPropertySet
getPropertySetInfo()658 uno::Reference< beans::XPropertySetInfo > SAL_CALL SvxUnoTextField::getPropertySetInfo(  )
659 	throw(uno::RuntimeException)
660 {
661 	OGuard aGuard( Application::GetSolarMutex() );
662 	return mpPropSet->getPropertySetInfo();
663 }
664 
setPropertyValue(const OUString & aPropertyName,const uno::Any & aValue)665 void SAL_CALL SvxUnoTextField::setPropertyValue( const OUString& aPropertyName, const uno::Any& aValue )
666 	throw(beans::UnknownPropertyException, beans::PropertyVetoException, lang::IllegalArgumentException, lang::WrappedTargetException, uno::RuntimeException)
667 {
668 	OGuard aGuard( Application::GetSolarMutex() );
669 
670 	if( mpImpl == NULL )
671 		throw uno::RuntimeException();
672 
673     const SfxItemPropertySimpleEntry* pMap = mpPropSet->getPropertyMap()->getByName( aPropertyName );
674 	if ( !pMap )
675 		throw beans::UnknownPropertyException();
676 
677 	switch( pMap->nWID )
678 	{
679 	case WID_DATE:
680 		if(aValue >>= mpImpl->maDateTime)
681 			return;
682 		break;
683 	case WID_BOOL1:
684 		if(aValue >>= mpImpl->mbBoolean1)
685 			return;
686 		break;
687 	case WID_BOOL2:
688 		if(aValue >>= mpImpl->mbBoolean2)
689 			return;
690 		break;
691 	case WID_INT16:
692 		if(aValue >>= mpImpl->mnInt16)
693 			return;
694 		break;
695 	case WID_INT32:
696 		if(aValue >>= mpImpl->mnInt32)
697 			return;
698 		break;
699 	case WID_STRING1:
700 		if(aValue >>= mpImpl->msString1)
701 			return;
702 		break;
703 	case WID_STRING2:
704 		if(aValue >>= mpImpl->msString2)
705 			return;
706 		break;
707 	case WID_STRING3:
708 		if(aValue >>= mpImpl->msString3)
709 			return;
710 		break;
711 	}
712 
713 	throw lang::IllegalArgumentException();
714 
715 /*
716 	case WID_FORMAT:
717 		{
718 		sal_Int32 nFormat;
719 
720 		switch( mnId )
721 		{
722 		case ID_DATEFIELD:
723 		{
724 			SvxDateField* pDate = PTR_CAST( SvxDateField, aFieldItem.GetField() );
725 			if(pDate)
726 				pDate->SetFormat( (SvxDateFormat)nFormat );
727 			break;
728 		}
729 		case ID_URLFIELD:
730 		{
731 			SvxURLField* pURL = PTR_CAST( SvxURLField, aFieldItem.GetField() );
732 			if(pURL)
733 				pURL->SetFormat( (SvxURLFormat)nFormat );
734 			break;
735 		}
736 		case ID_EXT_TIMEFIELD:
737 		{
738 			SvxExtTimeField* pTime = PTR_CAST( SvxExtTimeField, aFieldItem.GetField() );
739 			if(pTime)
740 				pTime->SetFormat( (SvxTimeFormat)nFormat );
741 			break;
742 		}
743 		case ID_EXT_FILEFIELD:
744 		{
745 			SvxExtFileField* pFile = PTR_CAST( SvxExtFileField, aFieldItem.GetField() );
746 			if(pFile)
747 				pFile->SetFormat( (SvxFileFormat)nFormat );
748 			break;
749 		}
750 		case ID_AUTHORFIELD:
751 		{
752 			SvxAuthorField* pAuthor = PTR_CAST( SvxAuthorField, aFieldItem.GetField() );
753 			if(pAuthor)
754 				pAuthor->SetFormat( (SvxAuthorFormat)nFormat );
755 			break;
756 		}
757 		default:
758 			throw beans::UnknownPropertyException();
759 		}
760 		}
761 		break;
762 	case WID_FIX:
763 		{
764 		if( aValue.hasValue() || aValue.getValueType() != ::getCppuBooleanType() )
765 			throw lang::IllegalArgumentException();
766 		sal_Bool bFix( *(sal_Bool*)aValue.getValue() );
767 		switch( mnId )
768 		{
769 		case ID_EXT_TIMEFIELD:
770 		{
771 			SvxExtTimeField* pTime = PTR_CAST( SvxExtTimeField, aFieldItem.GetField() );
772 			if(pTime)
773 				pTime->SetType( (SvxTimeType)bFix?SVXTIMETYPE_FIX:SVXTIMETYPE_VAR );
774 			break;
775 		}
776 		case ID_DATEFIELD:
777 		{
778 			SvxDateField* pDate = PTR_CAST( SvxDateField, aFieldItem.GetField() );
779 			if(pDate)
780 				pDate->SetType( (SvxDateType)bFix?SVXDATETYPE_FIX:SVXDATETYPE_VAR );
781 			break;
782 		}
783 		case ID_EXT_FILEFIELD:
784 		{
785 			SvxExtFileField* pFile = PTR_CAST( SvxExtFileField, aFieldItem.GetField() );
786 			if(pFile)
787 				pFile->SetType( (SvxFileType)bFix?SVXFILETYPE_FIX:SVXFILETYPE_VAR );
788 			break;
789 		}
790 		case ID_AUTHORFIELD:
791 		{
792 			SvxAuthorField* pAuthor = PTR_CAST( SvxAuthorField, aFieldItem.GetField() );
793 			if(pAuthor)
794 				pAuthor->SetType( (SvxAuthorType)bFix?SVXAUTHORTYPE_FIX:SVXAUTHORTYPE_VAR );
795 			break;
796 		}
797 		default:
798 			throw beans::UnknownPropertyException();
799 		}
800 		}
801 		break;
802 	case WID_PRES:
803 	case WID_URL:
804 	case WID_TARGET:
805 	{
806 		SvxURLField* pURL = PTR_CAST( SvxURLField, aFieldItem.GetField() );
807 		if(pURL)
808 		{
809 			OUString aUnoStr;
810 			if(!(aValue >>= aUnoStr))
811 				throw lang::IllegalArgumentException();
812 
813 			switch( pMap->nWID )
814 			{
815 			case WID_PRES:
816 				pURL->SetRepresentation( aUnoStr );
817 				break;
818 			case WID_URL:
819 				pURL->SetURL( aUnoStr );
820 				break;
821 			case WID_TARGET:
822 				pURL->SetTargetFrame( aUnoStr );
823 				break;
824 			}
825 		}
826 		break;
827 	}
828 	}
829 
830 	SfxItemSet aSet = pForwarder->GetAttribs( GetSelection() );
831 	aSet.Put( aFieldItem );
832 */
833 }
834 
getPropertyValue(const OUString & PropertyName)835 uno::Any SAL_CALL SvxUnoTextField::getPropertyValue( const OUString& PropertyName )
836 	throw(beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException)
837 {
838 	OGuard aGuard( Application::GetSolarMutex() );
839 
840 	uno::Any aValue;
841 
842     const SfxItemPropertySimpleEntry* pMap = mpPropSet->getPropertyMap()->getByName( PropertyName );
843 	if ( !pMap )
844 		throw beans::UnknownPropertyException();
845 
846 	switch( pMap->nWID )
847 	{
848 	case WID_DATE:
849 		aValue <<= mpImpl->maDateTime;
850 		break;
851 	case WID_BOOL1:
852 		aValue <<= mpImpl->mbBoolean1;
853 		break;
854 	case WID_BOOL2:
855 		aValue <<= mpImpl->mbBoolean2;
856 		break;
857 	case WID_INT16:
858 		aValue <<= mpImpl->mnInt16;
859 		break;
860 	case WID_INT32:
861 		aValue <<= mpImpl->mnInt32;
862 		break;
863 	case WID_STRING1:
864 		aValue <<= mpImpl->msString1;
865 		break;
866 	case WID_STRING2:
867 		aValue <<= mpImpl->msString2;
868 		break;
869 	case WID_STRING3:
870 		aValue <<= mpImpl->msString3;
871 		break;
872 	}
873 
874 	return aValue;
875 
876 /*
877 	switch(pMap->nWID)
878 	{
879 	case WID_FORMAT:
880 		switch( mnId )
881 		{
882 		case ID_DATEFIELD:
883 		{
884 			SvxDateField* pDate = PTR_CAST( SvxDateField, pFieldItem->GetField() );
885 			if(pDate)
886 				aValue <<= (sal_Int32)pDate->GetFormat();
887 			break;
888 		}
889 		case ID_URLFIELD:
890 		{
891 			SvxURLField* pURL = PTR_CAST( SvxURLField, pFieldItem->GetField() );
892 			if(pURL)
893 				aValue <<= (sal_Int32)pURL->GetFormat();
894 			break;
895 		}
896 		case ID_EXT_TIMEFIELD:
897 		{
898 			SvxExtTimeField* pTime = PTR_CAST( SvxExtTimeField, pFieldItem->GetField() );
899 			if(pTime)
900 				aValue <<= (sal_Int32)pTime->GetFormat();
901 			break;
902 		}
903 		case ID_EXT_FILEFIELD:
904 		{
905 			SvxExtFileField* pFile = PTR_CAST( SvxExtFileField, pFieldItem->GetField() );
906 			if(pFile)
907 				aValue <<= (sal_Int32)pFile->GetFormat();
908 			break;
909 		}
910 		case ID_AUTHORFIELD:
911 		{
912 			SvxAuthorField* pAuthor = PTR_CAST( SvxAuthorField, pFieldItem->GetField() );
913 			if(pAuthor)
914 				aValue <<= (sal_Int32)pAuthor->GetFormat();
915 			break;
916 		}
917 		default:
918 			throw beans::UnknownPropertyException();
919 		}
920 		break;
921 	case WID_FIX:
922 		{
923 			sal_Bool bFix = sal_False;
924 		switch( mnId )
925 		{
926 		case ID_EXT_TIMEFIELD:
927 		{
928 			SvxExtTimeField* pTime = PTR_CAST( SvxExtTimeField, pFieldItem->GetField() );
929 			if(pTime)
930 				bFix = pTime->GetType() == SVXTIMETYPE_FIX;
931 			break;
932 		}
933 		case ID_DATEFIELD:
934 		{
935 			SvxDateField* pDate = PTR_CAST( SvxDateField, pFieldItem->GetField() );
936 			if(pDate)
937 				bFix = pDate->GetType() == SVXDATETYPE_FIX;
938 			break;
939 		}
940 		case ID_EXT_FILEFIELD:
941 		{
942 			SvxExtFileField* pFile = PTR_CAST( SvxExtFileField, pFieldItem->GetField() );
943 			if(pFile)
944 				bFix = pFile->GetType() == SVXFILETYPE_FIX;
945 			break;
946 		}
947 		case ID_AUTHORFIELD:
948 		{
949 			SvxAuthorField* pAuthor = PTR_CAST( SvxAuthorField, pFieldItem->GetField() );
950 			if(pAuthor)
951 				bFix = pAuthor->GetType() == SVXAUTHORTYPE_FIX;
952 			break;
953 		}
954 		default:
955 			throw beans::UnknownPropertyException();
956 		}
957 		aValue.setValue( &bFix, ::getCppuBooleanType() );
958 		}
959 		break;
960 	case WID_PRES:
961 	case WID_URL:
962 	case WID_TARGET:
963 	{
964 		SvxURLField* pURL = PTR_CAST( SvxURLField, pFieldItem->GetField() );
965 		if(pURL)
966 		{
967 			OUString aStr;
968 			switch( pMap->nWID )
969 			{
970 			case WID_PRES:
971 				aStr = pURL->GetRepresentation();
972 				break;
973 			case WID_URL:
974 				aStr = pURL->GetURL();
975 				break;
976 			case WID_TARGET:
977 				aStr = pURL->GetTargetFrame();
978 				break;
979 			}
980 			aValue <<= aStr;
981 		}
982 		break;
983 	}
984 	case WID_FCOLOR:
985 	case WID_TCOLOR:
986 	{
987 		Color* pFColor = NULL;
988 		Color* pTColor = NULL;
989 		const ESelection aSel = GetSelection();
990 
991 		pForwarder->CalcFieldValue( *pFieldItem, aSel.nStartPara, aSel.nStartPos, pTColor, pFColor );
992 
993 		if( pMap->nWID == WID_FCOLOR )
994 			aValue <<= (sal_Int32)pFColor->GetColor();
995 		else
996 			aValue <<= (sal_Int32)pTColor->GetColor();
997 		break;
998 
999 		delete pTColor;
1000 		delete pFColor;
1001 	}
1002 	}
1003 	return aValue;
1004 */
1005 }
1006 
addPropertyChangeListener(const OUString &,const uno::Reference<beans::XPropertyChangeListener> &)1007 void SAL_CALL SvxUnoTextField::addPropertyChangeListener( const OUString&, const uno::Reference< beans::XPropertyChangeListener >& ) throw(::com::sun::star::beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException) {}
removePropertyChangeListener(const OUString &,const uno::Reference<beans::XPropertyChangeListener> &)1008 void SAL_CALL SvxUnoTextField::removePropertyChangeListener( const OUString&, const uno::Reference< beans::XPropertyChangeListener >& ) throw(::com::sun::star::beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException) {}
addVetoableChangeListener(const OUString &,const uno::Reference<beans::XVetoableChangeListener> &)1009 void SAL_CALL SvxUnoTextField::addVetoableChangeListener( const OUString&, const uno::Reference< beans::XVetoableChangeListener >& ) throw(::com::sun::star::beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException) {}
removeVetoableChangeListener(const OUString &,const uno::Reference<beans::XVetoableChangeListener> &)1010 void SAL_CALL SvxUnoTextField::removeVetoableChangeListener( const OUString&, const uno::Reference< beans::XVetoableChangeListener >& ) throw(::com::sun::star::beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException) {}
1011 
1012 // OComponentHelper
disposing()1013 void SvxUnoTextField::disposing()
1014 {
1015 	// nothing to do
1016 }
1017 
GetFieldId(const SvxFieldData * pFieldData) const1018 sal_Int32 SvxUnoTextField::GetFieldId( const SvxFieldData* pFieldData ) const throw()
1019 {
1020 	if( pFieldData->ISA( SvxURLField ) )
1021 		return ID_URLFIELD;
1022 	else if( pFieldData->ISA( SvxPageField ) )
1023 		return ID_PAGEFIELD;
1024 	else if( pFieldData->ISA( SvxPagesField ) )
1025 		return ID_PAGESFIELD;
1026 	else if( pFieldData->ISA( SvxTimeField )	)
1027 		return ID_TIMEFIELD;
1028 	else if( pFieldData->ISA( SvxFileField )	)
1029 		return ID_FILEFIELD;
1030 	else if( pFieldData->ISA( SvxTableField ) )
1031 		return ID_TABLEFIELD;
1032 	else if( pFieldData->ISA( SvxExtTimeField ) )
1033 		return ID_EXT_TIMEFIELD;
1034 	else if( pFieldData->ISA( SvxExtFileField ) )
1035 		return ID_EXT_FILEFIELD;
1036 	else if( pFieldData->ISA( SvxAuthorField ) )
1037 		return ID_AUTHORFIELD;
1038 	else if( pFieldData->ISA( SvxDateField ) )
1039 		return ID_EXT_DATEFIELD;
1040 	else if( pFieldData->ISA( SdrMeasureField )	)
1041 		return ID_MEASUREFIELD;
1042 	else if( pFieldData->ISA( SvxHeaderField ) )
1043 		return ID_HEADERFIELD;
1044 	else if( pFieldData->ISA( SvxFooterField ) )
1045 		return ID_FOOTERFIELD;
1046 	else if( pFieldData->ISA( SvxDateTimeField ) )
1047 		return ID_DATETIMEFIELD;
1048 
1049 	return ID_UNKNOWN;
1050 }
1051 
1052 // lang::XServiceInfo
getImplementationName()1053 OUString SAL_CALL SvxUnoTextField::getImplementationName() throw(uno::RuntimeException)
1054 {
1055 	return OUString(RTL_CONSTASCII_USTRINGPARAM("SvxUnoTextField"));
1056 }
1057 
1058 static const sal_Char* pOldServiceNames[] =
1059 {
1060 	"com.sun.star.text.TextField.DateTime",
1061 	"com.sun.star.text.TextField.URL",
1062 	"com.sun.star.text.TextField.PageNumber",
1063 	"com.sun.star.text.TextField.PageCount",
1064 	"com.sun.star.text.TextField.DateTime",
1065 	"com.sun.star.text.TextField.DocInfo.Title",	// SvxFileField is used for title
1066 	"com.sun.star.text.TextField.SheetName",
1067 	"com.sun.star.text.TextField.DateTime",
1068 	"com.sun.star.text.TextField.FileName",
1069 	"com.sun.star.text.TextField.Author",
1070 	"com.sun.star.text.TextField.Measure",
1071 	"com.sun.star.text.TextField.DateTime",
1072 	"com.sun.star.presentation.TextField.Header",
1073 	"com.sun.star.presentation.TextField.Footer",
1074 	"com.sun.star.presentation.TextField.DateTime"
1075 };
1076 
1077 static const sal_Char* pNewServiceNames[] =
1078 {
1079     "com.sun.star.text.textfield.DateTime",
1080     "com.sun.star.text.textfield.URL",
1081     "com.sun.star.text.textfield.PageNumber",
1082     "com.sun.star.text.textfield.PageCount",
1083     "com.sun.star.text.textfield.DateTime",
1084     "com.sun.star.text.textfield.docinfo.Title",    // SvxFileField is used for title
1085     "com.sun.star.text.textfield.SheetName",
1086     "com.sun.star.text.textfield.DateTime",
1087     "com.sun.star.text.textfield.FileName",
1088     "com.sun.star.text.textfield.Author",
1089     "com.sun.star.text.textfield.Measure",
1090     "com.sun.star.text.textfield.DateTime",
1091     "com.sun.star.presentation.textfield.Header",
1092     "com.sun.star.presentation.textfield.Footer",
1093     "com.sun.star.presentation.textfield.DateTime"
1094 };
1095 
getSupportedServiceNames()1096 uno::Sequence< OUString > SAL_CALL SvxUnoTextField::getSupportedServiceNames()
1097 	throw(uno::RuntimeException)
1098 {
1099     uno::Sequence< OUString > aSeq( 4 );
1100 	OUString* pServices = aSeq.getArray();
1101     pServices[0] = OUString::createFromAscii( pNewServiceNames[mnServiceId] );
1102     pServices[1] = OUString::createFromAscii( pOldServiceNames[mnServiceId] );
1103     pServices[2] = OUString::createFromAscii( "com.sun.star.text.TextContent" ),
1104     pServices[3] = OUString::createFromAscii( "com.sun.star.text.TextField" );
1105 
1106 	return aSeq;
1107 }
1108 
supportsService(const OUString & ServiceName)1109 sal_Bool SAL_CALL SvxUnoTextField::supportsService( const OUString& ServiceName ) throw( uno::RuntimeException )
1110 {
1111 	return comphelper::ServiceInfoHelper::supportsService( ServiceName, getSupportedServiceNames() );
1112 }
1113 
SvxUnoTextCreateTextField(const::rtl::OUString & ServiceSpecifier)1114 uno::Reference< uno::XInterface > SAL_CALL SvxUnoTextCreateTextField( const ::rtl::OUString& ServiceSpecifier ) throw(::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException)
1115 {
1116 	uno::Reference< uno::XInterface > xRet;
1117 
1118 	const OUString aTextFieldPrexit( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.text.textfield.") );
1119 
1120 	// #i93308# up to OOo 3.2 we used this wrong namespace name with the capital T & F. This is
1121 	// fixed since OOo 3.2 but for compatibility we will still provide support for the wrong notation.
1122 	const OUString aTextFieldPrexit2( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.text.TextField.") );
1123 
1124 	if( (ServiceSpecifier.compareTo( aTextFieldPrexit, aTextFieldPrexit.getLength() ) == 0) ||
1125 	    (ServiceSpecifier.compareTo( aTextFieldPrexit2, aTextFieldPrexit2.getLength() ) == 0) )
1126 	{
1127 		OUString aFieldType( ServiceSpecifier.copy( aTextFieldPrexit.getLength() ) );
1128 
1129 		sal_Int32 nId = ID_UNKNOWN;
1130 
1131 		if( aFieldType.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("DateTime") ) )
1132 		{
1133 			nId = ID_DATEFIELD;
1134 		}
1135 		else if( aFieldType.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("URL") ) )
1136 		{
1137 			nId = ID_URLFIELD;
1138 		}
1139 		else if( aFieldType.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("PageNumber") ) )
1140 		{
1141 			nId = ID_PAGEFIELD;
1142 		}
1143 		else if( aFieldType.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("PageCount") ) )
1144 		{
1145 			nId = ID_PAGESFIELD;
1146 		}
1147 		else if( aFieldType.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("SheetName") ) )
1148 		{
1149 			nId = ID_TABLEFIELD;
1150 		}
1151 		else if( aFieldType.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("FileName") ) )
1152 		{
1153 			nId = ID_EXT_FILEFIELD;
1154 		}
1155         else if (aFieldType.equalsAsciiL(
1156                     RTL_CONSTASCII_STRINGPARAM("docinfo.Title") ) ||
1157                  aFieldType.equalsAsciiL(
1158                     RTL_CONSTASCII_STRINGPARAM("DocInfo.Title") ) )
1159 		{
1160 			nId = ID_FILEFIELD;
1161 		}
1162 		else if( aFieldType.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Author") ) )
1163 		{
1164 			nId = ID_AUTHORFIELD;
1165 		}
1166 		else if( aFieldType.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Measure") ) )
1167 		{
1168 			nId = ID_MEASUREFIELD;
1169 		}
1170 
1171 		if( nId != ID_UNKNOWN )
1172 			xRet = (::cppu::OWeakObject * )new SvxUnoTextField( nId );
1173 	}
1174 
1175 	return xRet;
1176 }
1177