xref: /AOO41X/main/sw/source/core/unocore/unofield.cxx (revision 3b32dd21b48084cc91e8cdf23382ce990aee2296)
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 
28 #include <swtypes.hxx>
29 #include <cmdid.h>
30 #include <doc.hxx>
31 #include <hints.hxx>
32 #include <fmtfld.hxx>
33 #include <txtfld.hxx>
34 #include <ndtxt.hxx>
35 #include <unomap.hxx>
36 #include <unoprnms.hxx>
37 #include <unotextrange.hxx>
38 #include <unotextcursor.hxx>
39 #include <unocoll.hxx>
40 #include <sfx2/linkmgr.hxx>
41 #include <docstat.hxx>
42 #include <editsh.hxx>
43 #include <viewsh.hxx>
44 #include <comphelper/types.hxx>
45 #include <comphelper/processfactory.hxx>
46 #include <com/sun/star/util/Time.hpp>
47 #include <com/sun/star/util/DateTimeRange.hpp>
48 #include <com/sun/star/util/DateTime.hpp>
49 #include <com/sun/star/util/Date.hpp>
50 #include <com/sun/star/beans/XFastPropertySet.hpp>
51 #include <com/sun/star/beans/XPropertyStateChangeListener.hpp>
52 #include <com/sun/star/beans/PropertyAttribute.hpp>
53 #include <com/sun/star/beans/XPropertyContainer.hpp>
54 
55 //undef to prevent error (from sfx2/docfile.cxx)
56 #undef SEQUENCE
57 #include <com/sun/star/text/SetVariableType.hpp>
58 #include <com/sun/star/text/WrapTextMode.hpp>
59 #include <com/sun/star/text/TextContentAnchorType.hpp>
60 #include <com/sun/star/text/PageNumberType.hpp>
61 #include <unofield.hxx>
62 #include <unocrsr.hxx>
63 #include <authfld.hxx>
64 #include <flddat.hxx>
65 #include <dbfld.hxx>
66 #include <usrfld.hxx>
67 #include <docufld.hxx>
68 #include <expfld.hxx>
69 #include <chpfld.hxx>
70 #include <flddropdown.hxx>
71 #include <poolfmt.hxx>
72 #include <poolfmt.hrc>
73 #include <pagedesc.hxx>
74 #include <docary.hxx>
75 #include <reffld.hxx>
76 #include <ddefld.hxx>
77 #include <SwStyleNameMapper.hxx>
78 #include <swunohelper.hxx>
79 #include <unofldmid.h>
80 #include <scriptinfo.hxx>
81 #include <tools/datetime.hxx>
82 #include <tools/urlobj.hxx>
83 #include <svx/dataaccessdescriptor.hxx>
84 #define _SVSTDARR_STRINGS
85 #include <svl/svstdarr.hxx>
86 #include <vos/mutex.hxx>
87 #include <vcl/svapp.hxx>
88 #include <textapi.hxx>
89 #include <editeng/outliner.hxx>
90 #include <docsh.hxx>
91 #include <fmtmeta.hxx> // MetaFieldManager
92 #include <switerator.hxx>
93 #include <bookmrk.hxx>
94 #include <xmloff/odffields.hxx>
95 
96 
97 using ::rtl::OUString;
98 using namespace ::com::sun::star;
99 using namespace nsSwDocInfoSubType;
100 
101 #define COM_TEXT_FLDMASTER		"com.sun.star.text.FieldMaster."
102 
103 // case-corrected version of the first part for the service names (see #i67811)
104 #define COM_TEXT_FLDMASTER_CC   "com.sun.star.text.fieldmaster."
105 
106 // note: this thing is indexed as an array, so do not insert/remove entries!
107 static const sal_uInt16 aDocInfoSubTypeFromService[] =
108 {
109 	DI_CHANGE | DI_SUB_AUTHOR,	//PROPERTY_MAP_FLDTYP_DOCINFO_CHANGE_AUTHOR
110 	DI_CHANGE | DI_SUB_DATE,	//PROPERTY_MAP_FLDTYP_DOCINFO_CHANGE_DATE_TIME
111 	DI_EDIT | DI_SUB_TIME,		//PROPERTY_MAP_FLDTYP_DOCINFO_EDIT_TIME
112 	DI_COMMENT,					//PROPERTY_MAP_FLDTYP_DOCINFO_DESCRIPTION
113 	DI_CREATE | DI_SUB_AUTHOR,	//PROPERTY_MAP_FLDTYP_DOCINFO_CREATE_AUTHOR
114 	DI_CREATE | DI_SUB_DATE,	//PROPERTY_MAP_FLDTYP_DOCINFO_CREATE_DATE_TIME
115 	0,       					//DUMMY
116 	0, 		        			//DUMMY
117 	0, 			        		//DUMMY
118 	0, 			        		//DUMMY
119 	DI_CUSTOM,					//PROPERTY_MAP_FLDTYP_DOCINFO_CUSTOM
120 	DI_PRINT | DI_SUB_AUTHOR,	//PROPERTY_MAP_FLDTYP_DOCINFO_PRINT_AUTHOR
121 	DI_PRINT | DI_SUB_DATE,		//PROPERTY_MAP_FLDTYP_DOCINFO_PRINT_DATE_TIME
122 	DI_KEYS,					//PROPERTY_MAP_FLDTYP_DOCINFO_KEY_WORDS
123 	DI_THEMA,					//PROPERTY_MAP_FLDTYP_DOCINFO_SUBJECT
124 	DI_TITEL,					//PROPERTY_MAP_FLDTYP_DOCINFO_TITLE
125 	DI_DOCNO					//PROPERTY_MAP_FLDTYP_DOCINFO_REVISION
126 };
127 struct ServiceIdResId
128 {
129 	sal_uInt16 nResId;
130 	sal_uInt16 nServiceId;
131 };
132 static const ServiceIdResId aServiceToRes[] =
133 {
134 	{RES_DATETIMEFLD, 	SW_SERVICE_FIELDTYPE_DATETIME				},
135 	{RES_USERFLD, 		SW_SERVICE_FIELDTYPE_USER                   },
136 	{RES_SETEXPFLD, 		SW_SERVICE_FIELDTYPE_SET_EXP            }    ,
137 	{RES_GETEXPFLD, 		SW_SERVICE_FIELDTYPE_GET_EXP            }    ,
138 	{RES_FILENAMEFLD, 	SW_SERVICE_FIELDTYPE_FILE_NAME              },
139 	{RES_PAGENUMBERFLD, 	SW_SERVICE_FIELDTYPE_PAGE_NUM           }    ,
140 	{RES_AUTHORFLD, 		SW_SERVICE_FIELDTYPE_AUTHOR             }    ,
141 	{RES_CHAPTERFLD, 	SW_SERVICE_FIELDTYPE_CHAPTER                },
142 	{RES_GETREFFLD, 		SW_SERVICE_FIELDTYPE_GET_REFERENCE      }    ,
143 	{RES_HIDDENTXTFLD, 	SW_SERVICE_FIELDTYPE_CONDITIONED_TEXT       },
144 	{RES_POSTITFLD, 		SW_SERVICE_FIELDTYPE_ANNOTATION         }    ,
145 	{RES_INPUTFLD, 		SW_SERVICE_FIELDTYPE_INPUT                  },
146 	{RES_MACROFLD, 		SW_SERVICE_FIELDTYPE_MACRO                  },
147 	{RES_DDEFLD, 		SW_SERVICE_FIELDTYPE_DDE                    },
148 	{RES_HIDDENPARAFLD, 	SW_SERVICE_FIELDTYPE_HIDDEN_PARA        }    ,
149 	{RES_DOCINFOFLD, 	SW_SERVICE_FIELDTYPE_DOC_INFO               },
150 	{RES_TEMPLNAMEFLD, 	SW_SERVICE_FIELDTYPE_TEMPLATE_NAME          },
151 	{RES_EXTUSERFLD, 	SW_SERVICE_FIELDTYPE_USER_EXT               },
152 	{RES_REFPAGESETFLD, 	SW_SERVICE_FIELDTYPE_REF_PAGE_SET       }    ,
153 	{RES_REFPAGEGETFLD, 	SW_SERVICE_FIELDTYPE_REF_PAGE_GET       }    ,
154 	{RES_JUMPEDITFLD, 	SW_SERVICE_FIELDTYPE_JUMP_EDIT              },
155 	{RES_SCRIPTFLD, 		SW_SERVICE_FIELDTYPE_SCRIPT             }    ,
156 	{RES_DBNEXTSETFLD, 	SW_SERVICE_FIELDTYPE_DATABASE_NEXT_SET      },
157 	{RES_DBNUMSETFLD, 	SW_SERVICE_FIELDTYPE_DATABASE_NUM_SET       },
158 	{RES_DBSETNUMBERFLD, SW_SERVICE_FIELDTYPE_DATABASE_SET_NUM      } ,
159 	{RES_DBFLD, 			SW_SERVICE_FIELDTYPE_DATABASE           }    ,
160 	{RES_DBNAMEFLD,		SW_SERVICE_FIELDTYPE_DATABASE_NAME          },
161 	{RES_DOCSTATFLD, 	SW_SERVICE_FIELDTYPE_PAGE_COUNT             },
162 	{RES_DOCSTATFLD, 	SW_SERVICE_FIELDTYPE_PARAGRAPH_COUNT        },
163 	{RES_DOCSTATFLD, 	SW_SERVICE_FIELDTYPE_WORD_COUNT             },
164 	{RES_DOCSTATFLD, 	SW_SERVICE_FIELDTYPE_CHARACTER_COUNT        },
165 	{RES_DOCSTATFLD, 	SW_SERVICE_FIELDTYPE_TABLE_COUNT            },
166 	{RES_DOCSTATFLD, 	SW_SERVICE_FIELDTYPE_GRAPHIC_OBJECT_COUNT   },
167 	{RES_DOCSTATFLD, 	SW_SERVICE_FIELDTYPE_EMBEDDED_OBJECT_COUNT  },
168 	{RES_DOCINFOFLD, 	SW_SERVICE_FIELDTYPE_DOCINFO_CHANGE_AUTHOR  },
169 	{RES_DOCINFOFLD,		SW_SERVICE_FIELDTYPE_DOCINFO_CHANGE_DATE_TIME},
170 	{RES_DOCINFOFLD,		SW_SERVICE_FIELDTYPE_DOCINFO_EDIT_TIME       },
171 	{RES_DOCINFOFLD,		SW_SERVICE_FIELDTYPE_DOCINFO_DESCRIPTION     },
172 	{RES_DOCINFOFLD,		SW_SERVICE_FIELDTYPE_DOCINFO_CREATE_AUTHOR   },
173 	{RES_DOCINFOFLD,		SW_SERVICE_FIELDTYPE_DOCINFO_CREATE_DATE_TIME},
174 	{RES_DOCINFOFLD,		SW_SERVICE_FIELDTYPE_DOCINFO_CUSTOM          },
175 	{RES_DOCINFOFLD,		SW_SERVICE_FIELDTYPE_DOCINFO_PRINT_AUTHOR    },
176 	{RES_DOCINFOFLD,		SW_SERVICE_FIELDTYPE_DOCINFO_PRINT_DATE_TIME },
177 	{RES_DOCINFOFLD,		SW_SERVICE_FIELDTYPE_DOCINFO_KEY_WORDS       },
178 	{RES_DOCINFOFLD,		SW_SERVICE_FIELDTYPE_DOCINFO_SUBJECT         },
179 	{RES_DOCINFOFLD,		SW_SERVICE_FIELDTYPE_DOCINFO_TITLE           },
180 	{RES_INPUTFLD, 		SW_SERVICE_FIELDTYPE_INPUT_USER                  },
181 	{RES_HIDDENTXTFLD, 	SW_SERVICE_FIELDTYPE_HIDDEN_TEXT                 },
182 	{RES_AUTHORITY, 	SW_SERVICE_FIELDTYPE_BIBLIOGRAPHY                },
183 	{RES_COMBINED_CHARS,	SW_SERVICE_FIELDTYPE_COMBINED_CHARACTERS	 },
184 	{RES_DROPDOWN,	SW_SERVICE_FIELDTYPE_DROPDOWN	                     },
185     {RES_TABLEFLD,      SW_SERVICE_FIELDTYPE_TABLE_FORMULA              },
186 	{USHRT_MAX,			USHRT_MAX                                        }
187 };
188 //-----------------------------------------------------------------
189 sal_uInt16 lcl_ServiceIdToResId(sal_uInt16 nServiceId)
190 {
191 	const ServiceIdResId* pMap = aServiceToRes;
192 	while( USHRT_MAX != pMap->nServiceId && nServiceId != pMap->nServiceId )
193 			++pMap;
194 #ifdef DBG_UTIL
195 	if( USHRT_MAX == pMap->nServiceId )
196 		DBG_ERROR("service id not found");
197 #endif
198 	return pMap->nResId;
199 }
200 //-----------------------------------------------------------------
201 sal_uInt16 lcl_GetServiceForField( const SwField& rFld )
202 {
203 	sal_uInt16 nWhich = rFld.Which(), nSrvId = USHRT_MAX;
204 	//special handling for some fields
205 	switch( nWhich )
206 	{
207 	case RES_INPUTFLD:
208 		if( INP_USR == (rFld.GetSubType() & 0x00ff) )
209 			nSrvId = SW_SERVICE_FIELDTYPE_INPUT_USER;
210 		break;
211 
212 	case RES_DOCINFOFLD:
213 		{
214 			sal_uInt16 nSubType = rFld.GetSubType();
215 			switch( (nSubType & 0xff))
216 			{
217 			case DI_CHANGE:
218 				nSrvId = ((nSubType&0x300) == DI_SUB_AUTHOR)
219 						? SW_SERVICE_FIELDTYPE_DOCINFO_CHANGE_AUTHOR
220 						: SW_SERVICE_FIELDTYPE_DOCINFO_CHANGE_DATE_TIME;
221 				break;
222 			case DI_CREATE:
223 				nSrvId = ((nSubType&0x300) == DI_SUB_AUTHOR)
224 						? SW_SERVICE_FIELDTYPE_DOCINFO_CREATE_AUTHOR
225 						: SW_SERVICE_FIELDTYPE_DOCINFO_CREATE_DATE_TIME;
226 				break;
227 			case DI_PRINT:
228 				nSrvId = ((nSubType&0x300) == DI_SUB_AUTHOR)
229 						? SW_SERVICE_FIELDTYPE_DOCINFO_PRINT_AUTHOR
230 						: SW_SERVICE_FIELDTYPE_DOCINFO_PRINT_DATE_TIME;
231 				break;
232 			case DI_EDIT:	nSrvId = SW_SERVICE_FIELDTYPE_DOCINFO_EDIT_TIME;break;
233 			case DI_COMMENT:nSrvId = SW_SERVICE_FIELDTYPE_DOCINFO_DESCRIPTION;break;
234 			case DI_KEYS:   nSrvId = SW_SERVICE_FIELDTYPE_DOCINFO_KEY_WORDS;break;
235 			case DI_THEMA:  nSrvId = SW_SERVICE_FIELDTYPE_DOCINFO_SUBJECT;	break;
236 			case DI_TITEL:  nSrvId = SW_SERVICE_FIELDTYPE_DOCINFO_TITLE;	break;
237 			case DI_DOCNO:  nSrvId = SW_SERVICE_FIELDTYPE_DOCINFO_REVISION;	break;
238 			case DI_CUSTOM: nSrvId = SW_SERVICE_FIELDTYPE_DOCINFO_CUSTOM;	break;
239 			}
240 		}
241 		break;
242 
243 	case RES_HIDDENTXTFLD:
244 		nSrvId = TYP_CONDTXTFLD == rFld.GetSubType()
245 						? SW_SERVICE_FIELDTYPE_CONDITIONED_TEXT
246 						: SW_SERVICE_FIELDTYPE_HIDDEN_TEXT;
247 		break;
248 
249 	case RES_DOCSTATFLD:
250 		{
251 			switch( rFld.GetSubType() )
252 			{
253 			case DS_PAGE: nSrvId = SW_SERVICE_FIELDTYPE_PAGE_COUNT; break;
254 			case DS_PARA: nSrvId = SW_SERVICE_FIELDTYPE_PARAGRAPH_COUNT; break;
255 			case DS_WORD: nSrvId = SW_SERVICE_FIELDTYPE_WORD_COUNT     ; break;
256 			case DS_CHAR: nSrvId = SW_SERVICE_FIELDTYPE_CHARACTER_COUNT; break;
257 			case DS_TBL:  nSrvId = SW_SERVICE_FIELDTYPE_TABLE_COUNT    ; break;
258 			case DS_GRF:  nSrvId = SW_SERVICE_FIELDTYPE_GRAPHIC_OBJECT_COUNT; break;
259 			case DS_OLE:  nSrvId = SW_SERVICE_FIELDTYPE_EMBEDDED_OBJECT_COUNT; break;
260 			}
261 		}
262 		break;
263 	}
264 	if( USHRT_MAX == nSrvId )
265 	{
266 		for( const ServiceIdResId* pMap = aServiceToRes;
267 				USHRT_MAX != pMap->nResId; ++pMap )
268 			if( nWhich == pMap->nResId )
269 			{
270 				nSrvId = pMap->nServiceId;
271 				break;
272 			}
273 	}
274 #ifdef DBG_UTIL
275 	if( USHRT_MAX == nSrvId )
276 		DBG_ERROR("resid not found");
277 #endif
278 	return nSrvId;
279 }
280 
281 sal_uInt16 lcl_GetPropMapIdForFieldType( sal_uInt16 nWhich )
282 {
283 	sal_uInt16 nId;
284 	switch( nWhich )
285 	{
286 	case RES_USERFLD:	nId = PROPERTY_MAP_FLDMSTR_USER;			break;
287 	case RES_DBFLD:		nId = PROPERTY_MAP_FLDMSTR_DATABASE;		break;
288 	case RES_SETEXPFLD:	nId = PROPERTY_MAP_FLDMSTR_SET_EXP;			break;
289 	case RES_DDEFLD:	nId = PROPERTY_MAP_FLDMSTR_DDE;				break;
290 	case RES_AUTHORITY:	nId = PROPERTY_MAP_FLDMSTR_BIBLIOGRAPHY;	break;
291 	default:			nId = PROPERTY_MAP_FLDMSTR_DUMMY0;
292 	}
293 	return nId;
294 }
295 
296 
297 sal_uInt16 GetFieldTypeMId( const OUString& rProperty, const SwFieldType& rTyp )
298 {
299 	sal_uInt16 nId = lcl_GetPropMapIdForFieldType( rTyp.Which() );
300     const SfxItemPropertySet* pSet = aSwMapProvider.GetPropertySet( nId );
301     if( !pSet )
302 		nId = USHRT_MAX;
303 	else
304     {
305         const SfxItemPropertySimpleEntry* pEntry = pSet->getPropertyMap()->getByName(rProperty);
306         nId = pEntry ? pEntry->nWID : USHRT_MAX;
307     }
308 	return nId;
309 }
310 
311 sal_uInt16 lcl_GetPropertyMapOfService( sal_uInt16 nServiceId )
312 {
313 	sal_uInt16 nRet;
314 	switch ( nServiceId)
315 	{
316 	case SW_SERVICE_FIELDTYPE_DATETIME: nRet = PROPERTY_MAP_FLDTYP_DATETIME; break;
317 	case SW_SERVICE_FIELDTYPE_USER: nRet = PROPERTY_MAP_FLDTYP_USER; break;
318 	case SW_SERVICE_FIELDTYPE_SET_EXP: nRet = PROPERTY_MAP_FLDTYP_SET_EXP; break;
319 	case SW_SERVICE_FIELDTYPE_GET_EXP: nRet = PROPERTY_MAP_FLDTYP_GET_EXP; break;
320 	case SW_SERVICE_FIELDTYPE_FILE_NAME: nRet = PROPERTY_MAP_FLDTYP_FILE_NAME; break;
321 	case SW_SERVICE_FIELDTYPE_PAGE_NUM: nRet = PROPERTY_MAP_FLDTYP_PAGE_NUM; break;
322 	case SW_SERVICE_FIELDTYPE_AUTHOR: nRet = PROPERTY_MAP_FLDTYP_AUTHOR; break;
323 	case SW_SERVICE_FIELDTYPE_CHAPTER: nRet = PROPERTY_MAP_FLDTYP_CHAPTER; break;
324 	case SW_SERVICE_FIELDTYPE_GET_REFERENCE: nRet = PROPERTY_MAP_FLDTYP_GET_REFERENCE; break;
325 	case SW_SERVICE_FIELDTYPE_CONDITIONED_TEXT: nRet = PROPERTY_MAP_FLDTYP_CONDITIONED_TEXT; break;
326 	case SW_SERVICE_FIELDTYPE_ANNOTATION: nRet = PROPERTY_MAP_FLDTYP_ANNOTATION; break;
327 	case SW_SERVICE_FIELDTYPE_INPUT_USER:
328 	case SW_SERVICE_FIELDTYPE_INPUT: nRet = PROPERTY_MAP_FLDTYP_INPUT; break;
329 	case SW_SERVICE_FIELDTYPE_MACRO: nRet = PROPERTY_MAP_FLDTYP_MACRO; break;
330 	case SW_SERVICE_FIELDTYPE_DDE: nRet = PROPERTY_MAP_FLDTYP_DDE; break;
331 	case SW_SERVICE_FIELDTYPE_HIDDEN_PARA: nRet = PROPERTY_MAP_FLDTYP_HIDDEN_PARA; break;
332 	case SW_SERVICE_FIELDTYPE_DOC_INFO: nRet = PROPERTY_MAP_FLDTYP_DOC_INFO; break;
333 	case SW_SERVICE_FIELDTYPE_TEMPLATE_NAME: nRet = PROPERTY_MAP_FLDTYP_TEMPLATE_NAME; break;
334 	case SW_SERVICE_FIELDTYPE_USER_EXT: nRet = PROPERTY_MAP_FLDTYP_USER_EXT; break;
335 	case SW_SERVICE_FIELDTYPE_REF_PAGE_SET: nRet = PROPERTY_MAP_FLDTYP_REF_PAGE_SET; break;
336 	case SW_SERVICE_FIELDTYPE_REF_PAGE_GET: nRet = PROPERTY_MAP_FLDTYP_REF_PAGE_GET; break;
337 	case SW_SERVICE_FIELDTYPE_JUMP_EDIT: nRet = PROPERTY_MAP_FLDTYP_JUMP_EDIT; break;
338 	case SW_SERVICE_FIELDTYPE_SCRIPT: nRet = PROPERTY_MAP_FLDTYP_SCRIPT; break;
339 	case SW_SERVICE_FIELDTYPE_DATABASE_NEXT_SET: nRet = PROPERTY_MAP_FLDTYP_DATABASE_NEXT_SET; break;
340 	case SW_SERVICE_FIELDTYPE_DATABASE_NUM_SET: nRet = PROPERTY_MAP_FLDTYP_DATABASE_NUM_SET; break;
341 	case SW_SERVICE_FIELDTYPE_DATABASE_SET_NUM: nRet = PROPERTY_MAP_FLDTYP_DATABASE_SET_NUM; break;
342 	case SW_SERVICE_FIELDTYPE_DATABASE: nRet = PROPERTY_MAP_FLDTYP_DATABASE; break;
343 	case SW_SERVICE_FIELDTYPE_DATABASE_NAME: nRet = PROPERTY_MAP_FLDTYP_DATABASE_NAME; break;
344 	case SW_SERVICE_FIELDTYPE_TABLE_FORMULA: nRet = PROPERTY_MAP_FLDTYP_TABLE_FORMULA; break;
345 	case SW_SERVICE_FIELDTYPE_PAGE_COUNT:
346 	case SW_SERVICE_FIELDTYPE_PARAGRAPH_COUNT:
347 	case SW_SERVICE_FIELDTYPE_WORD_COUNT:
348 	case SW_SERVICE_FIELDTYPE_CHARACTER_COUNT:
349 	case SW_SERVICE_FIELDTYPE_TABLE_COUNT:
350 	case SW_SERVICE_FIELDTYPE_GRAPHIC_OBJECT_COUNT:
351 	case SW_SERVICE_FIELDTYPE_EMBEDDED_OBJECT_COUNT: nRet = PROPERTY_MAP_FLDTYP_DOCSTAT; break;
352 	case SW_SERVICE_FIELDTYPE_DOCINFO_CHANGE_AUTHOR:
353 	case SW_SERVICE_FIELDTYPE_DOCINFO_CREATE_AUTHOR:
354 	case SW_SERVICE_FIELDTYPE_DOCINFO_PRINT_AUTHOR: nRet = PROPERTY_MAP_FLDTYP_DOCINFO_AUTHOR; break;
355 	case SW_SERVICE_FIELDTYPE_DOCINFO_CHANGE_DATE_TIME:
356 	case SW_SERVICE_FIELDTYPE_DOCINFO_CREATE_DATE_TIME:
357 	case SW_SERVICE_FIELDTYPE_DOCINFO_PRINT_DATE_TIME: nRet = PROPERTY_MAP_FLDTYP_DOCINFO_DATE_TIME; break;
358 	case SW_SERVICE_FIELDTYPE_DOCINFO_EDIT_TIME: nRet = PROPERTY_MAP_FLDTYP_DOCINFO_EDIT_TIME; break;
359 	case SW_SERVICE_FIELDTYPE_DOCINFO_CUSTOM: nRet = PROPERTY_MAP_FLDTYP_DOCINFO_CUSTOM; break;
360 	case SW_SERVICE_FIELDTYPE_DOCINFO_DESCRIPTION:
361 	case SW_SERVICE_FIELDTYPE_DOCINFO_KEY_WORDS:
362 	case SW_SERVICE_FIELDTYPE_DOCINFO_SUBJECT:
363 	case SW_SERVICE_FIELDTYPE_DOCINFO_TITLE: nRet = PROPERTY_MAP_FLDTYP_DOCINFO_MISC; break;
364 	case SW_SERVICE_FIELDTYPE_DOCINFO_REVISION: nRet = PROPERTY_MAP_FLDTYP_DOCINFO_REVISION; break;
365 	case SW_SERVICE_FIELDTYPE_BIBLIOGRAPHY: nRet = PROPERTY_MAP_FLDTYP_BIBLIOGRAPHY; break;
366 	case SW_SERVICE_FIELDTYPE_DUMMY_0:
367 	case SW_SERVICE_FIELDTYPE_COMBINED_CHARACTERS: nRet = PROPERTY_MAP_FLDTYP_COMBINED_CHARACTERS; break;
368 	case SW_SERVICE_FIELDTYPE_DROPDOWN: nRet = PROPERTY_MAP_FLDTYP_DROPDOWN; break;
369 	case SW_SERVICE_FIELDTYPE_DUMMY_4:
370 	case SW_SERVICE_FIELDTYPE_DUMMY_5:
371 	case SW_SERVICE_FIELDTYPE_DUMMY_6:
372 	case SW_SERVICE_FIELDTYPE_DUMMY_7:
373                 nRet = PROPERTY_MAP_FLDTYP_DUMMY_0; break;
374 	case SW_SERVICE_FIELDMASTER_USER: nRet = PROPERTY_MAP_FLDMSTR_USER; break;
375 	case SW_SERVICE_FIELDMASTER_DDE: nRet = PROPERTY_MAP_FLDMSTR_DDE; break;
376 	case SW_SERVICE_FIELDMASTER_SET_EXP: nRet = PROPERTY_MAP_FLDMSTR_SET_EXP; break;
377 	case SW_SERVICE_FIELDMASTER_DATABASE: nRet = PROPERTY_MAP_FLDMSTR_DATABASE; break;
378 	case SW_SERVICE_FIELDMASTER_BIBLIOGRAPHY: nRet = PROPERTY_MAP_FLDMSTR_BIBLIOGRAPHY; break;
379 	case SW_SERVICE_FIELDMASTER_DUMMY2:
380 	case SW_SERVICE_FIELDMASTER_DUMMY3:
381 	case SW_SERVICE_FIELDMASTER_DUMMY4:
382 	case SW_SERVICE_FIELDMASTER_DUMMY5: nRet = PROPERTY_MAP_FLDMSTR_DUMMY0; break;
383 	case SW_SERVICE_FIELDTYPE_HIDDEN_TEXT: nRet = PROPERTY_MAP_FLDTYP_HIDDEN_TEXT; break;
384 	default:
385 		DBG_ERROR( "wrong service id" );
386 		nRet = USHRT_MAX;
387 	}
388 	return nRet;
389 }
390 
391 /******************************************************************
392  * SwXFieldMaster
393  ******************************************************************/
394 TYPEINIT1(SwXFieldMaster, SwClient);
395 
396 const uno::Sequence< sal_Int8 > & SwXFieldMaster::getUnoTunnelId()
397 {
398     static uno::Sequence< sal_Int8 > aSeq = ::CreateUnoTunnelId();
399 	return aSeq;
400 }
401 
402 sal_Int64 SAL_CALL SwXFieldMaster::getSomething( const uno::Sequence< sal_Int8 >& rId )
403 	throw(uno::RuntimeException)
404 {
405     if( rId.getLength() == 16
406         && 0 == rtl_compareMemory( getUnoTunnelId().getConstArray(),
407 										rId.getConstArray(), 16 ) )
408     {
409 		return sal::static_int_cast< sal_Int64 >( reinterpret_cast< sal_IntPtr >(this) );
410     }
411 	return 0;
412 }
413 
414 OUString SwXFieldMaster::getImplementationName(void) throw( uno::RuntimeException )
415 {
416 	return C2U("SwXFieldMaster");
417 }
418 
419 sal_Bool SwXFieldMaster::supportsService(const OUString& rServiceName) throw( uno::RuntimeException )
420 {
421     sal_Bool bRet = sal_False;
422     if(rServiceName.equalsAsciiL(
423 			RTL_CONSTASCII_STRINGPARAM("com.sun.star.text.TextFieldMaster")))
424         bRet = sal_True;
425     else
426     {
427 		const sal_Char* pEntry;
428         switch( nResTypeId )
429         {
430         case RES_USERFLD:	pEntry = "User"; 			break;
431         case RES_DBFLD:		pEntry = "Database"; 		break;
432         case RES_SETEXPFLD:	pEntry = "SetExpression";	break;
433         case RES_DDEFLD:	pEntry = "DDE";				break;
434         case RES_AUTHORITY:	pEntry = "Bibliography"; 	break;
435 		default: pEntry = 0;
436         }
437 		if( pEntry )
438 		{
439 			ByteString aTmp( RTL_CONSTASCII_STRINGPARAM(
440 							"com.sun.star.text.fieldmaster."));
441 			aTmp.Append( pEntry );
442 			bRet = rServiceName.equalsAsciiL(aTmp.GetBuffer(), aTmp.Len());
443 		}
444     }
445     return bRet;
446 }
447 
448 uno::Sequence< OUString > SwXFieldMaster::getSupportedServiceNames(void) throw( uno::RuntimeException )
449 {
450     uno::Sequence< OUString > aRet(2);
451 	OUString* pArray = aRet.getArray();
452     pArray[0] = C2U("com.sun.star.text.TextFieldMaster");
453 
454 	const sal_Char* pEntry1;
455 	switch( nResTypeId )
456 	{
457 	case RES_USERFLD: 	pEntry1 = "User"; 			break;
458     case RES_DBFLD:	  	pEntry1 = "Database";		break;
459     case RES_SETEXPFLD:	pEntry1 = "SetExpression";	break;
460     case RES_DDEFLD:	pEntry1 = "DDE"; 			break;
461     case RES_AUTHORITY:	pEntry1 = "Bibliography";	break;
462 	default: pEntry1 = 0;
463 	}
464 	if( pEntry1 )
465 	{
466 		String s;
467 		s.AppendAscii( "com.sun.star.text.fieldmaster." ).AppendAscii( pEntry1 );
468 	    pArray[1] = s;
469 	}
470 	return aRet;
471 }
472 
473 SwXFieldMaster::SwXFieldMaster(SwDoc* pDoc, sal_uInt16 nResId) :
474 	aLstnrCntnr( (XPropertySet*)this),
475 	nResTypeId(nResId),
476 	m_pDoc(pDoc),
477 	m_bIsDescriptor(sal_True),
478 	fParam1(0.),
479 	nParam1(-1),
480 	bParam1(sal_False),
481 	nParam2(0)
482 {
483     pDoc->GetPageDescFromPool(RES_POOLPAGE_STANDARD)->Add(this);
484 }
485 
486 SwXFieldMaster::SwXFieldMaster(SwFieldType& rType, SwDoc* pDoc) :
487 	SwClient(&rType),
488 	aLstnrCntnr( (XPropertySet*)this),
489 	nResTypeId(rType.Which()),
490 	m_pDoc(pDoc),
491 	m_bIsDescriptor(sal_False),
492 	fParam1(0.),
493 	nParam1(-1),
494 	bParam1(sal_False)
495 {
496 
497 }
498 
499 SwXFieldMaster::~SwXFieldMaster()
500 {
501 
502 }
503 
504 uno::Reference< beans::XPropertySetInfo >  SwXFieldMaster::getPropertySetInfo(void)
505 											throw( uno::RuntimeException )
506 {
507 	vos::OGuard  aGuard(Application::GetSolarMutex());
508     uno::Reference< beans::XPropertySetInfo >  aRef =
509                         aSwMapProvider.GetPropertySet(
510                                 lcl_GetPropMapIdForFieldType( nResTypeId ) )->getPropertySetInfo();
511 	return aRef;
512 }
513 
514 void SwXFieldMaster::setPropertyValue( const OUString& rPropertyName,
515 									const uno::Any& rValue)
516 	throw( beans::UnknownPropertyException, beans::PropertyVetoException,
517 			lang::IllegalArgumentException, lang::WrappedTargetException, uno::RuntimeException)
518 {
519 	vos::OGuard  aGuard(Application::GetSolarMutex());
520     SwFieldType* pType = GetFldType(sal_True);
521 	if(pType)
522 	{
523 		sal_Bool bSetValue = sal_True;
524 		if( rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_SUB_TYPE)))
525 		{
526 			const SvStringsDtor& rExtraArr = SwStyleNameMapper::GetExtraUINameArray();
527 			String sTypeName = pType->GetName();
528 			static sal_uInt16 nIds[] =
529 			{
530 				RES_POOLCOLL_LABEL_DRAWING - RES_POOLCOLL_EXTRA_BEGIN,
531 				RES_POOLCOLL_LABEL_ABB - RES_POOLCOLL_EXTRA_BEGIN,
532 				RES_POOLCOLL_LABEL_TABLE - RES_POOLCOLL_EXTRA_BEGIN,
533 				RES_POOLCOLL_LABEL_FRAME- RES_POOLCOLL_EXTRA_BEGIN,
534 				0
535 			};
536 			for(const sal_uInt16 * pIds = nIds; *pIds; ++pIds)
537 			{
538 				if(sTypeName ==	*rExtraArr[ *pIds ] )
539 				{
540 					bSetValue = sal_False;
541 					break;
542 				}
543 			}
544 		}
545 		if( bSetValue )
546 		{
547             // nothing special to be done here for the properties
548             // UNO_NAME_DATA_BASE_NAME and UNO_NAME_DATA_BASE_URL.
549             // We just call PutValue (empty string is allowed).
550             // Thus the last property set will be used as Data Source.
551 
552             sal_uInt16 nMId = GetFieldTypeMId( rPropertyName, *pType  );
553             if( USHRT_MAX != nMId )
554 				pType->PutValue( rValue, nMId );
555             else
556                 throw beans::UnknownPropertyException(OUString ( RTL_CONSTASCII_USTRINGPARAM ( "Unknown property: " ) ) + rPropertyName, static_cast < cppu::OWeakObject * > ( this ) );
557 		}
558 	}
559 	else if(!pType && m_pDoc &&
560         ( rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_NAME))) )
561 	{
562 		OUString uTmp;
563 		rValue >>= uTmp;
564 		String sTypeName(uTmp);
565 		SwFieldType* pType2 = m_pDoc->GetFldType(nResTypeId, sTypeName, sal_False);
566 
567         String sTable(SW_RES(STR_POOLCOLL_LABEL_TABLE));
568 		String sDrawing(SW_RES(STR_POOLCOLL_LABEL_DRAWING));
569 		String sFrame(SW_RES(STR_POOLCOLL_LABEL_FRAME));
570 		String sIllustration(SW_RES(STR_POOLCOLL_LABEL_ABB));
571 
572 		if(pType2 ||
573 			(RES_SETEXPFLD == nResTypeId &&
574 			( sTypeName == sTable || sTypeName == sDrawing ||
575 			  sTypeName == sFrame || sTypeName == sIllustration )))
576 		{
577 			throw lang::IllegalArgumentException();
578 		}
579 		else
580 		{
581 			switch(nResTypeId)
582 			{
583 				case RES_USERFLD :
584 				{
585 					SwUserFieldType aType(m_pDoc, sTypeName);
586 					pType2 = m_pDoc->InsertFldType(aType);
587 					((SwUserFieldType*)pType2)->SetContent(sParam1);
588 					((SwUserFieldType*)pType2)->SetValue(fParam1);
589 					((SwUserFieldType*)pType2)->SetType(bParam1 ? nsSwGetSetExpType::GSE_EXPR : nsSwGetSetExpType::GSE_STRING);
590 				}
591 				break;
592                 case RES_DDEFLD :
593 				{
594 					SwDDEFieldType aType(sTypeName, sParam1,
595                         sal::static_int_cast< sal_uInt16 >(bParam1 ? sfx2::LINKUPDATE_ALWAYS : sfx2::LINKUPDATE_ONCALL));
596 					pType2 = m_pDoc->InsertFldType(aType);
597 				}
598 				break;
599 				case RES_SETEXPFLD :
600 				{
601 					SwSetExpFieldType aType(m_pDoc, sTypeName);
602 					if(sParam1.Len())
603 						aType.SetDelimiter( sParam1.GetChar(0));
604 					if(nParam1 > -1 && nParam1 < MAXLEVEL)
605 						aType.SetOutlineLvl(nParam1);
606 					pType2 = m_pDoc->InsertFldType(aType);
607 				}
608 				break;
609                 case RES_DBFLD :
610                 {
611                     ::GetString( rValue, sParam3 );
612                     pType = GetFldType();
613                 }
614                 break;
615 			}
616 			if(pType2)
617 			{
618 				pType2->Add(this);
619 				m_bIsDescriptor = sal_False;
620 			}
621 			else
622 				throw uno::RuntimeException();
623 		}
624 
625 		DBG_ASSERT(pType2, "kein FieldType gefunden!" );
626 	}
627 	else
628 	{
629 		switch( nResTypeId )
630 		{
631 		case RES_USERFLD:
632 			if(rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_CONTENT)))
633 				::GetString( rValue, sParam1 );
634 			else if(rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_VALUE )))
635 			{
636 				if(rValue.getValueType() != ::getCppuType(static_cast<const double*>(0)))
637 					throw lang::IllegalArgumentException();
638 				fParam1 = *(double*)rValue.getValue();
639 			}
640 			else if(rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_IS_EXPRESSION )))
641 			{
642 				if(rValue.getValueType() != ::getBooleanCppuType())
643 					throw lang::IllegalArgumentException();
644 				bParam1 = *(sal_Bool*)rValue.getValue();
645 			}
646 
647 			break;
648 		case RES_DBFLD:
649 			if(rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_DATA_BASE_NAME)))
650 				::GetString( rValue, sParam1 );
651             else if(rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_DATA_TABLE_NAME)))
652 				::GetString( rValue, sParam2 );
653             else if(rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_DATA_COLUMN_NAME)))
654 				::GetString( rValue, sParam3 );
655             else if(rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_DATA_COMMAND_TYPE)))
656                 rValue >>= nParam2;
657             if(rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_DATA_BASE_URL)))
658                 ::GetString( rValue, sParam5 );
659 
660             if((sParam1.Len() || sParam5.Len())
661                     && sParam2.Len() && sParam3.Len())
662                 GetFldType();
663 			break;
664 		case  RES_SETEXPFLD:
665 			if(rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_NUMBERING_SEPARATOR)))
666 				::GetString( rValue, sParam1 );
667 			else if(rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_CHAPTER_NUMBERING_LEVEL)))
668 				rValue >>= nParam1;
669 			break;
670 		case RES_DDEFLD:
671 			{
672 				sal_uInt16 nPart = rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_DDE_COMMAND_TYPE))  ? 0 :
673 						rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_DDE_COMMAND_FILE))  ? 1 :
674 						rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_DDE_COMMAND_ELEMENT))  ? 2 :
675 						rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_IS_AUTOMATIC_UPDATE)) ? 3 : USHRT_MAX;
676 				if(nPart  < 3 )
677 				{
678 					String sTmp;
679 					if(!sParam1.Len())
680                         (sParam1 = sfx2::cTokenSeperator)
681                                 += sfx2::cTokenSeperator;
682 
683                     sParam1.SetToken( nPart, sfx2::cTokenSeperator,
684 								::GetString( rValue, sTmp ));
685 				}
686 				else if(3 == nPart)
687 					bParam1 = *(sal_Bool*)rValue.getValue();
688 			}
689 			break;
690 		default:
691         	throw beans::UnknownPropertyException(OUString ( RTL_CONSTASCII_USTRINGPARAM ( "Unknown property: " ) ) + rPropertyName, static_cast < cppu::OWeakObject * > ( this ) );
692 		}
693 	}
694 }
695 
696 SwFieldType* SwXFieldMaster::GetFldType(sal_Bool bDontCreate) const
697 {
698     if(!bDontCreate && RES_DBFLD == nResTypeId && m_bIsDescriptor && m_pDoc)
699     {
700         SwDBData aData;
701 
702         // set DataSource
703         svx::ODataAccessDescriptor aAcc;
704         if( sParam1.Len() > 0 )
705             aAcc[ svx::daDataSource ]       <<= OUString(sParam1); // DataBaseName
706         else if( sParam5.Len() > 0 )
707             aAcc[ svx::daDatabaseLocation]  <<= OUString(sParam5); // DataBaseURL
708         aData.sDataSource = aAcc.getDataSource();
709 
710         aData.sCommand = sParam2;
711         aData.nCommandType = nParam2;
712         SwDBFieldType aType(m_pDoc, sParam3,  aData);
713         SwFieldType* pType = m_pDoc->InsertFldType(aType);
714         SwXFieldMaster* pThis = ((SwXFieldMaster*)this);
715         pType->Add(pThis);
716         pThis->m_bIsDescriptor = sal_False;
717     }
718     if(m_bIsDescriptor)
719         return 0;
720     else
721         return (SwFieldType*)GetRegisteredIn();
722 }
723 
724 
725 typedef SwFmtFld* SwFmtFldPtr;
726 SV_DECL_PTRARR(SwDependentFields, SwFmtFldPtr, 5, 5)
727 SV_IMPL_PTRARR(SwDependentFields, SwFmtFldPtr)
728 
729 uno::Any SwXFieldMaster::getPropertyValue(const OUString& rPropertyName)
730 		throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
731 {
732 	vos::OGuard  aGuard(Application::GetSolarMutex());
733 	uno::Any aRet;
734     SwFieldType* pType = GetFldType(sal_True);
735     if( rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_INSTANCE_NAME)) )
736     {
737         String sName;
738         if(pType)
739             SwXTextFieldMasters::getInstanceName(*pType, sName);
740         aRet <<= OUString(sName);
741     }
742     else if(pType)
743 	{
744 		if(rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_NAME) ))
745 		{
746 			aRet <<= SwXFieldMaster::GetProgrammaticName(*pType, *GetDoc());
747 		}
748         else if(rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_DEPENDENT_TEXT_FIELDS)) )
749 		{
750 			//fill all text fields into a sequence
751 			SwDependentFields aFldArr;
752 			SwIterator<SwFmtFld,SwFieldType> aIter( *pType );
753 			SwFmtFldPtr pFld = aIter.First();
754 			while(pFld)
755 			{
756 				if(pFld->IsFldInDoc())
757 					aFldArr.Insert(pFld, aFldArr.Count());
758 				pFld = aIter.Next();
759 			}
760 
761 			uno::Sequence<uno::Reference <text::XDependentTextField> > aRetSeq(aFldArr.Count());
762 			uno::Reference<text::XDependentTextField>* pRetSeq = aRetSeq.getArray();
763             for(sal_uInt16 i = 0; i < aFldArr.Count(); i++)
764             {
765                 pFld = aFldArr.GetObject(i);
766                 SwXTextField * pInsert = SwXTextField::CreateSwXTextField(*GetDoc(), *pFld);
767 
768                 pRetSeq[i] = uno::Reference<text::XDependentTextField>(pInsert);
769             }
770 			aRet <<= aRetSeq;
771 		}
772 		else if(pType)
773 		{
774 			//TODO: Properties fuer die uebrigen Feldtypen einbauen
775 			sal_uInt16 nMId = GetFieldTypeMId( rPropertyName, *pType );
776 			if( USHRT_MAX != nMId )
777             {
778 				pType->QueryValue( aRet, nMId );
779 
780                 if( rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_DATA_BASE_NAME)) ||
781                     rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_DATA_BASE_URL)))
782                 {
783                     OUString aDataSource;
784                     aRet >>= aDataSource;
785                     aRet <<= OUString();
786 
787                     OUString *pStr = 0;     // only one of this properties will return
788                                             // a non-empty string.
789                     INetURLObject aObj;
790                     aObj.SetURL( aDataSource );
791                     sal_Bool bIsURL = aObj.GetProtocol() != INET_PROT_NOT_VALID;
792                     if (bIsURL && rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_DATA_BASE_URL)))
793                         pStr = &aDataSource;        // DataBaseURL
794                     else if (!bIsURL && rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_DATA_BASE_NAME)))
795                         pStr = &aDataSource;        // DataBaseName
796 
797                     if (pStr)
798                         aRet <<= *pStr;
799                 }
800             }
801             else
802         		throw beans::UnknownPropertyException(OUString ( RTL_CONSTASCII_USTRINGPARAM ( "Unknown property: " ) ) + rPropertyName, static_cast < cppu::OWeakObject * > ( this ) );
803 		}
804 		else
805 		{
806 			if(rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_DATA_COMMAND_TYPE)) )
807 				aRet <<= nParam2;
808 		}
809 	}
810 	else
811 	{
812 		if(rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_DATA_COMMAND_TYPE)) )
813 			aRet <<= nParam2;
814         else if(rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_DEPENDENT_TEXT_FIELDS)) )
815         {
816             uno::Sequence<uno::Reference <text::XDependentTextField> > aRetSeq(0);
817             aRet <<= aRetSeq;
818         }
819         else
820 		{
821 			const String* pStr = 0;
822 			String sStr;
823 			switch ( nResTypeId )
824 			{
825 			case RES_USERFLD:
826 				if( rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_CONTENT)) )
827 					pStr = &sParam1;
828 				else if(rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_VALUE )))
829 					aRet <<= fParam1;
830 				else if(rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_IS_EXPRESSION )))
831 					aRet.setValue(&bParam1, ::getBooleanCppuType());
832 				break;
833 			case RES_DBFLD:
834                 if(rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_DATA_BASE_NAME)) ||
835                    rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_DATA_BASE_URL)))
836                 {
837                     pStr = 0;   // only one of this properties will return
838                                 // a non-empty string.
839                     INetURLObject aObj;
840                     aObj.SetURL( sParam5 );  // SetSmartURL
841                     sal_Bool bIsURL = aObj.GetProtocol() != INET_PROT_NOT_VALID;
842                     if (bIsURL && rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_DATA_BASE_URL)))
843                         pStr = &sParam5;        // DataBaseURL
844                     else if ( rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_DATA_BASE_NAME)))
845                         pStr = &sParam1;            // DataBaseName
846                 }
847 				else if(rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_DATA_TABLE_NAME)))
848 					pStr = &sParam2;
849 				else if(rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_DATA_COLUMN_NAME)))
850 					pStr = &sParam3;
851 				break;
852 			case RES_SETEXPFLD:
853 				if(rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_NUMBERING_SEPARATOR)))
854 					pStr = &sParam1;
855 				else if(rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_CHAPTER_NUMBERING_LEVEL)))
856 					aRet <<= nParam1;
857 				break;
858 			case RES_DDEFLD:
859 				{
860 					sal_uInt16 nPart = rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_DDE_COMMAND_TYPE))  ? 0 :
861 						rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_DDE_COMMAND_FILE)) ? 1 :
862 							rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_DDE_COMMAND_ELEMENT))  ? 2 :
863 							rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_IS_AUTOMATIC_UPDATE)) ? 3 : USHRT_MAX;
864 					if(nPart  < 3 )
865                         pStr = &(sStr = sParam1.GetToken(nPart, sfx2::cTokenSeperator));
866 					else if(3 == nPart)
867 						aRet.setValue(&bParam1, ::getBooleanCppuType());
868 				}
869 				break;
870 			default:
871         		throw beans::UnknownPropertyException(OUString ( RTL_CONSTASCII_USTRINGPARAM ( "Unknown property: " ) ) + rPropertyName, static_cast < cppu::OWeakObject * > ( this ) );
872 			}
873 
874 			if( pStr )
875 				aRet <<= OUString( *pStr );
876 		}
877 	}
878 	return aRet;
879 }
880 
881 void SwXFieldMaster::addPropertyChangeListener(const OUString& /*PropertyName*/, const uno::Reference< beans::XPropertyChangeListener > & /*aListener*/) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
882 {
883 	DBG_WARNING("not implemented");
884 }
885 
886 void SwXFieldMaster::removePropertyChangeListener(const OUString& /*PropertyName*/, const uno::Reference< beans::XPropertyChangeListener > & /*aListener*/) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
887 {
888 	DBG_WARNING("not implemented");
889 }
890 
891 void SwXFieldMaster::addVetoableChangeListener(const OUString& /*PropertyName*/, const uno::Reference< beans::XVetoableChangeListener > & /*aListener*/) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
892 {
893 	DBG_WARNING("not implemented");
894 }
895 
896 void SwXFieldMaster::removeVetoableChangeListener(const OUString& /*PropertyName*/, const uno::Reference< beans::XVetoableChangeListener > & /*aListener*/) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
897 {
898 	DBG_WARNING("not implemented");
899 }
900 
901 
902 void SwXFieldMaster::dispose(void) 			throw( uno::RuntimeException )
903 {
904 	vos::OGuard  aGuard(Application::GetSolarMutex());
905     SwFieldType* pFldType = GetFldType(sal_True);
906 	if(pFldType)
907 	{
908 		sal_uInt16 nTypeIdx = USHRT_MAX;
909 		const SwFldTypes* pTypes = GetDoc()->GetFldTypes();
910 		for( sal_uInt16 i = 0; i < pTypes->Count(); i++ )
911 		{
912 			if((*pTypes)[i] == pFldType)
913 				nTypeIdx = i;
914 		}
915 
916 		// zuerst alle Felder loeschen
917 		SwIterator<SwFmtFld,SwFieldType> aIter( *pFldType );
918 		SwFmtFld* pFld = aIter.First();
919 		while(pFld)
920 		{
921 			// Feld im Undo?
922 			SwTxtFld *pTxtFld = pFld->GetTxtFld();
923 			if(pTxtFld && pTxtFld->GetTxtNode().GetNodes().IsDocNodes() )
924 			{
925 				SwTxtNode& rTxtNode = (SwTxtNode&)*pTxtFld->GetpTxtNode();
926 				SwPaM aPam(rTxtNode, *pTxtFld->GetStart());
927 				aPam.SetMark();
928 				aPam.Move();
929 				GetDoc()->DeleteAndJoin(aPam);
930 			}
931             pFld = aIter.Next();
932 		}
933 		// dann den FieldType loeschen
934 		GetDoc()->RemoveFldType(nTypeIdx);
935 	}
936 	else
937 		throw uno::RuntimeException();
938 }
939 
940 void SwXFieldMaster::addEventListener(const uno::Reference< lang::XEventListener > & aListener)
941 											throw( uno::RuntimeException )
942 {
943 	if(!GetRegisteredIn())
944 		throw uno::RuntimeException();
945 	aLstnrCntnr.AddListener(aListener);
946 }
947 
948 void SwXFieldMaster::removeEventListener(const uno::Reference< lang::XEventListener > & aListener)
949 													throw( uno::RuntimeException )
950 {
951 	if(!GetRegisteredIn() || !aLstnrCntnr.RemoveListener(aListener))
952 		throw uno::RuntimeException();
953 }
954 
955 
956 void SwXFieldMaster::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew)
957 {
958 	ClientModify(this, pOld, pNew);
959 	if(!GetRegisteredIn())
960 	{
961 		aLstnrCntnr.Disposing();
962 		m_pDoc = 0;
963 	}
964 }
965 
966 OUString SwXFieldMaster::GetProgrammaticName(const SwFieldType& rType, SwDoc& rDoc)
967 {
968 	OUString sRet(rType.GetName());
969 	if(RES_SETEXPFLD == rType.Which())
970 	{
971 		const SwFldTypes* pTypes = rDoc.GetFldTypes();
972 		for( sal_uInt16 i = 0; i <= INIT_FLDTYPES; i++ )
973 		{
974 			if((*pTypes)[i] == &rType)
975 			{
976 				sRet = SwStyleNameMapper::GetProgName ( sRet, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL );
977 				break;
978 			}
979 		}
980 	}
981 	return sRet;
982 }
983 
984 OUString SwXFieldMaster::LocalizeFormula(
985 	const SwSetExpField& rFld,
986 	const OUString& rFormula,
987 	sal_Bool bQuery)
988 {
989 	const OUString sTypeName(rFld.GetTyp()->GetName());
990 	OUString sProgName = SwStyleNameMapper::GetProgName(sTypeName, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL );
991 	if(sProgName != sTypeName)
992 	{
993 		OUString sSource = bQuery ? sTypeName : sProgName;
994 		OUString sDest = bQuery ? sProgName : sTypeName;
995 		if(!rFormula.compareTo(sSource, sSource.getLength()))
996 		{
997 			OUString sTmpFormula = sDest;
998 			sTmpFormula += rFormula.copy(sSource.getLength());
999 			return sTmpFormula;
1000 		}
1001 	}
1002 	return rFormula;
1003 }
1004 
1005 
1006 SwXTextField* SwXTextField::CreateSwXTextField(SwDoc & rDoc, SwFmtFld const& rFmt)
1007 {
1008     SwIterator<SwXTextField,SwFieldType> aIter(*rFmt.GetField()->GetTyp());
1009     SwXTextField * pField = 0;
1010     SwXTextField * pTemp = aIter.First();
1011     while (pTemp)
1012     {
1013         if (pTemp->GetFldFmt() == &rFmt)
1014         {
1015             pField = pTemp;
1016             break;
1017         }
1018         pTemp = aIter.Next();
1019     }
1020     return pField ? pField : new SwXTextField( rFmt, &rDoc );
1021 }
1022 
1023 /******************************************************************
1024  *
1025  ******************************************************************/
1026 struct SwFieldProperties_Impl
1027 {
1028 	String 		sPar1;
1029 	String 		sPar2;
1030 	String 		sPar3;
1031 	String 		sPar4;
1032     String      sPar5;
1033     String      sPar6;
1034 	Date 			aDate;
1035 	double 			fDouble;
1036 	uno::Sequence<beans::PropertyValue>	aPropSeq;
1037     uno::Sequence<OUString> aStrings;
1038 	util::DateTime*	pDateTime;
1039 
1040 	sal_Int32 		nSubType;
1041 	sal_Int32 		nFormat;
1042 	sal_uInt16 		nUSHORT1;
1043 	sal_uInt16 		nUSHORT2;
1044 	sal_Int16 		nSHORT1;
1045 	sal_Int8 		nByte1;
1046     sal_Bool        bFormatIsDefault;
1047 	sal_Bool 		bBool1;
1048 	sal_Bool 		bBool2;
1049 	sal_Bool 		bBool3;
1050     sal_Bool        bBool4;
1051 
1052 	SwFieldProperties_Impl():
1053 		fDouble(0.),
1054 		pDateTime(0),
1055 		nSubType(0),
1056 		nFormat(0),
1057 		nUSHORT1(0),
1058 		nUSHORT2(0),
1059 		nSHORT1(0),
1060 		nByte1(0),
1061         bFormatIsDefault(sal_True),
1062 		bBool1(sal_False),
1063 		bBool2(sal_False),
1064 		bBool3(sal_False),
1065         bBool4(sal_True) //Automatic language
1066 		{}
1067 	~SwFieldProperties_Impl()
1068 		{delete pDateTime;}
1069 
1070 };
1071 
1072 TYPEINIT1(SwXTextField, SwClient);
1073 
1074 const uno::Sequence< sal_Int8 > & SwXTextField::getUnoTunnelId()
1075 {
1076     static uno::Sequence< sal_Int8 > aSeq = ::CreateUnoTunnelId();
1077 	return aSeq;
1078 }
1079 
1080 sal_Int64 SAL_CALL SwXTextField::getSomething( const uno::Sequence< sal_Int8 >& rId )
1081 	throw(uno::RuntimeException)
1082 {
1083     if( rId.getLength() == 16
1084         && 0 == rtl_compareMemory( getUnoTunnelId().getConstArray(),
1085 										rId.getConstArray(), 16 ) )
1086     {
1087 		return sal::static_int_cast< sal_Int64 >( reinterpret_cast< sal_IntPtr >(this) );
1088     }
1089 	return 0;
1090 }
1091 
1092 SwXTextField::SwXTextField(sal_uInt16 nServiceId, SwDoc* pDoc) :
1093 	aLstnrCntnr( (XTextContent*)this),
1094 	pFmtFld(0),
1095 	m_pDoc(pDoc),
1096 	m_pTextObject(0),
1097 	m_bIsDescriptor(nServiceId != USHRT_MAX),
1098     m_bCallUpdate(sal_False),
1099 	m_nServiceId(nServiceId),
1100     m_pProps(new SwFieldProperties_Impl)
1101 {
1102 	//Set visible as default!
1103     if(SW_SERVICE_FIELDTYPE_SET_EXP == nServiceId ||
1104             SW_SERVICE_FIELDTYPE_DATABASE_SET_NUM == nServiceId ||
1105             SW_SERVICE_FIELDTYPE_DATABASE == nServiceId ||
1106             SW_SERVICE_FIELDTYPE_DATABASE_NAME == nServiceId  )
1107 		m_pProps->bBool2 = sal_True;
1108     else if(SW_SERVICE_FIELDTYPE_TABLE_FORMULA == nServiceId)
1109         m_pProps->bBool1 = sal_True;
1110     if(SW_SERVICE_FIELDTYPE_SET_EXP == nServiceId)
1111         m_pProps->nUSHORT2 = USHRT_MAX;
1112 
1113 }
1114 
1115 SwXTextField::SwXTextField(const SwFmtFld& rFmt, SwDoc* pDc) :
1116 	aLstnrCntnr( (XTextContent*)this),
1117 	pFmtFld(&rFmt),
1118 	m_pDoc(pDc),
1119 	m_pTextObject(0),
1120 	m_bIsDescriptor(sal_False),
1121     m_bCallUpdate(sal_False),
1122 	m_nServiceId( lcl_GetServiceForField( *pFmtFld->GetField() ) ),
1123     m_pProps(0)
1124 {
1125 	pDc->GetUnoCallBack()->Add(this);
1126 }
1127 
1128 SwXTextField::~SwXTextField()
1129 {
1130 	if ( m_pTextObject )
1131 	{
1132 		m_pTextObject->DisposeEditSource();
1133 		m_pTextObject->release();
1134 	}
1135 
1136 	delete m_pProps;
1137 }
1138 
1139 void SwXTextField::attachTextFieldMaster(const uno::Reference< beans::XPropertySet > & xFieldMaster)
1140 					throw( lang::IllegalArgumentException, uno::RuntimeException )
1141 {
1142 	vos::OGuard  aGuard(Application::GetSolarMutex());
1143 	if(!m_bIsDescriptor)
1144 		throw uno::RuntimeException();
1145 	uno::Reference< lang::XUnoTunnel > xMasterTunnel(xFieldMaster, uno::UNO_QUERY);
1146     if (!xMasterTunnel.is())
1147         throw lang::IllegalArgumentException();
1148 	SwXFieldMaster* pMaster = reinterpret_cast< SwXFieldMaster * >(
1149 			sal::static_int_cast< sal_IntPtr >( xMasterTunnel->getSomething( SwXFieldMaster::getUnoTunnelId()) ));
1150 
1151 	SwFieldType* pFieldType = pMaster ? pMaster->GetFldType() : 0;
1152 	if(pFieldType && pFieldType->Which() == lcl_ServiceIdToResId(m_nServiceId))
1153 	{
1154 		m_sTypeName = pFieldType->GetName();
1155         pFieldType->Add( &m_aFieldTypeClient );
1156 	}
1157 	else
1158 		throw lang::IllegalArgumentException();
1159 
1160 }
1161 
1162 uno::Reference< beans::XPropertySet >  SwXTextField::getTextFieldMaster(void) throw( uno::RuntimeException )
1163 {
1164 	vos::OGuard  aGuard(Application::GetSolarMutex());
1165     SwFieldType* pType = 0;
1166     if( m_bIsDescriptor && m_aFieldTypeClient.GetRegisteredIn() )
1167     {
1168         pType = (SwFieldType*)m_aFieldTypeClient.GetRegisteredIn();
1169     }
1170     else
1171     {
1172         if(!GetRegisteredIn())
1173             throw uno::RuntimeException();
1174         pType = pFmtFld->GetField()->GetTyp();
1175     }
1176 
1177     SwXFieldMaster* pMaster = SwIterator<SwXFieldMaster,SwFieldType>::FirstElement( *pType );
1178 	if(!pMaster)
1179 		pMaster = new SwXFieldMaster(*pType, GetDoc());
1180 
1181 	return pMaster;
1182 }
1183 
1184 OUString SwXTextField::getPresentation(sal_Bool bShowCommand) throw( uno::RuntimeException )
1185 {
1186 	vos::OGuard  aGuard(Application::GetSolarMutex());
1187 
1188     SwField const*const pField = GetField();
1189     if (!pField)
1190     {
1191 		throw uno::RuntimeException();
1192     }
1193     ::rtl::OUString const ret( (bShowCommand)
1194             ? pField->GetFieldName()
1195             : pField->ExpandField(true) );
1196     return ret;
1197 }
1198 
1199 void SwXTextField::attachToRange(
1200 		const uno::Reference< text::XTextRange > & xTextRange)
1201 	throw( lang::IllegalArgumentException, uno::RuntimeException )
1202 {
1203 	vos::OGuard  aGuard(Application::GetSolarMutex());
1204 	if(!m_bIsDescriptor)
1205 		throw uno::RuntimeException();
1206 	uno::Reference<lang::XUnoTunnel> xRangeTunnel( xTextRange, uno::UNO_QUERY);
1207 	SwXTextRange* pRange = 0;
1208 	OTextCursorHelper* pCursor = 0;
1209 	if(xRangeTunnel.is())
1210 	{
1211 		pRange 	= reinterpret_cast< SwXTextRange * >(
1212 				sal::static_int_cast< sal_IntPtr >( xRangeTunnel->getSomething( SwXTextRange::getUnoTunnelId()) ));
1213 		pCursor	= reinterpret_cast< OTextCursorHelper * >(
1214 				sal::static_int_cast< sal_IntPtr >( xRangeTunnel->getSomething( OTextCursorHelper::getUnoTunnelId()) ));
1215 	}
1216 
1217     SwDoc* pDoc = pRange ? (SwDoc*)pRange->GetDoc() : pCursor ? (SwDoc*)pCursor->GetDoc() : 0;
1218     //wurde ein FieldMaster attached, dann ist das Dokument schon festgelegt!
1219     if(pDoc && (!m_pDoc || m_pDoc == pDoc))
1220     {
1221         SwUnoInternalPaM aPam(*pDoc);
1222         //das muss jetzt sal_True liefern
1223         ::sw::XTextRangeToSwPaM(aPam, xTextRange);
1224         SwField* pFld = 0;
1225         switch(m_nServiceId)
1226         {
1227         case SW_SERVICE_FIELDTYPE_ANNOTATION:
1228             {
1229                 SwFieldType* pFldType = pDoc->GetSysFldType(RES_POSTITFLD);
1230 
1231                 DateTime aDateTime;
1232                 if (m_pProps->pDateTime)
1233                 {
1234                     aDateTime.SetYear(m_pProps->pDateTime->Year);
1235                     aDateTime.SetMonth(m_pProps->pDateTime->Month);
1236                     aDateTime.SetDay(m_pProps->pDateTime->Day);
1237                     aDateTime.SetHour(m_pProps->pDateTime->Hours);
1238                     aDateTime.SetMin(m_pProps->pDateTime->Minutes);
1239                     aDateTime.SetSec(m_pProps->pDateTime->Seconds);
1240                 }
1241                 pFld = new SwPostItField(
1242                     (SwPostItFieldType*)pFldType,
1243                     m_pProps->sPar2, // content
1244                     m_pProps->sPar1, // author
1245                     m_pProps->sPar3, // author's initials
1246                     m_pProps->sPar4, // name
1247                     aDateTime );
1248                 if ( m_pTextObject )
1249                 {
1250                     ((SwPostItField*)pFld)->SetTextObject( m_pTextObject->CreateText() );
1251                     ((SwPostItField*)pFld)->SetPar2(m_pTextObject->GetText());
1252                 }
1253             }
1254             break;
1255 
1256         case SW_SERVICE_FIELDTYPE_SCRIPT:
1257             {
1258                 SwFieldType* pFldType = pDoc->GetSysFldType(RES_SCRIPTFLD);
1259                 pFld = new SwScriptField((SwScriptFieldType*)pFldType,
1260                     m_pProps->sPar1, m_pProps->sPar2,
1261                     m_pProps->bBool1);
1262             }
1263             break;
1264 
1265         case SW_SERVICE_FIELDTYPE_DATETIME:
1266             {
1267                 sal_uInt16 nSub = 0;
1268                 if(m_pProps->bBool1)
1269                     nSub |= FIXEDFLD;
1270                 if(m_pProps->bBool2)
1271                     nSub |= DATEFLD;
1272                 else
1273                     nSub |= TIMEFLD;
1274                 SwFieldType* pFldType = pDoc->GetSysFldType(RES_DATETIMEFLD);
1275                 pFld = new SwDateTimeField((SwDateTimeFieldType*)pFldType,
1276                     nSub, m_pProps->nFormat);
1277                 if(m_pProps->fDouble > 0.)
1278                     ((SwDateTimeField*)pFld)->SetValue( m_pProps->fDouble );
1279                 if(m_pProps->pDateTime)
1280                 {
1281                     uno::Any aVal; aVal <<= *m_pProps->pDateTime;
1282                     pFld->PutValue( aVal, FIELD_PROP_DATE_TIME );
1283                 }
1284                 ((SwDateTimeField*)pFld)->SetOffset(m_pProps->nSubType);
1285             }
1286             break;
1287 
1288         case SW_SERVICE_FIELDTYPE_FILE_NAME:
1289             {
1290                 SwFieldType* pFldType = pDoc->GetSysFldType(RES_FILENAMEFLD);
1291                 sal_Int32 nFormat = m_pProps->nFormat;
1292                 if(m_pProps->bBool2)
1293                     nFormat |= FF_FIXED;
1294                 pFld = new SwFileNameField((SwFileNameFieldType*)pFldType, nFormat);
1295                 if(m_pProps->sPar3.Len())
1296                     ((SwFileNameField*)pFld)->SetExpansion(m_pProps->sPar3);
1297                 uno::Any aFormat(&m_pProps->nFormat, ::getCppuType(&m_pProps->nFormat));
1298                 pFld->PutValue( aFormat, FIELD_PROP_FORMAT );
1299             }
1300             break;
1301 
1302         case SW_SERVICE_FIELDTYPE_TEMPLATE_NAME:
1303             {
1304                 SwFieldType* pFldType = pDoc->GetSysFldType(RES_TEMPLNAMEFLD);
1305                 pFld = new SwTemplNameField((SwTemplNameFieldType*)pFldType,
1306                     m_pProps->nFormat);
1307                 uno::Any aFormat(&m_pProps->nFormat, ::getCppuType(&m_pProps->nFormat));
1308                 pFld->PutValue(aFormat, FIELD_PROP_FORMAT);
1309             }
1310             break;
1311 
1312         case SW_SERVICE_FIELDTYPE_CHAPTER:
1313             {
1314                 SwFieldType* pFldType = pDoc->GetSysFldType(RES_CHAPTERFLD);
1315                 pFld = new SwChapterField((SwChapterFieldType*)pFldType, m_pProps->nUSHORT1);
1316                 ((SwChapterField*)pFld)->SetLevel(m_pProps->nByte1);
1317                 uno::Any aVal; aVal <<= (sal_Int16)m_pProps->nUSHORT1;
1318                 pFld->PutValue(aVal, FIELD_PROP_USHORT1 );
1319             }
1320             break;
1321         case SW_SERVICE_FIELDTYPE_AUTHOR:
1322             {
1323                 long nFormat = m_pProps->bBool1 ? AF_NAME : AF_SHORTCUT;
1324                 if(m_pProps->bBool2)
1325                     nFormat |= AF_FIXED;
1326 
1327                 SwFieldType* pFldType = pDoc->GetSysFldType(RES_AUTHORFLD);
1328                 pFld = new SwAuthorField((SwAuthorFieldType*)pFldType, nFormat);
1329                 ((SwAuthorField*)pFld)->SetExpansion(m_pProps->sPar1);
1330             }
1331             break;
1332 
1333         case SW_SERVICE_FIELDTYPE_CONDITIONED_TEXT:
1334         case SW_SERVICE_FIELDTYPE_HIDDEN_TEXT:
1335             {
1336                 SwFieldType* pFldType = pDoc->GetSysFldType(RES_HIDDENTXTFLD);
1337                 pFld = new SwHiddenTxtField(((SwHiddenTxtFieldType*)pFldType),
1338                     m_pProps->sPar1,
1339                     m_pProps->sPar2, m_pProps->sPar3,
1340                     static_cast< sal_uInt16 >(SW_SERVICE_FIELDTYPE_HIDDEN_TEXT == m_nServiceId ? TYP_HIDDENTXTFLD : TYP_CONDTXTFLD));
1341                 ((SwHiddenTxtField*)pFld)->SetValue(m_pProps->bBool1);
1342                 uno::Any aVal; aVal <<= (OUString)m_pProps->sPar4;
1343                 pFld->PutValue(aVal, FIELD_PROP_PAR4 );
1344             }
1345             break;
1346 
1347 			case SW_SERVICE_FIELDTYPE_HIDDEN_PARA:
1348 			{
1349 				SwFieldType* pFldType = pDoc->GetSysFldType(RES_HIDDENPARAFLD);
1350 				pFld = new SwHiddenParaField((SwHiddenParaFieldType*)pFldType,
1351 												m_pProps->sPar1);
1352                 ((SwHiddenParaField*)pFld)->SetHidden(m_pProps->bBool1);
1353 			}
1354 			break;
1355 			case SW_SERVICE_FIELDTYPE_GET_REFERENCE:
1356 			{
1357 				SwFieldType* pFldType = pDoc->GetSysFldType(RES_GETREFFLD);
1358 				pFld = new SwGetRefField((SwGetRefFieldType*)pFldType,
1359 							m_pProps->sPar1,
1360 							0,
1361 							0,
1362 							0);
1363 				if(m_pProps->sPar3.Len())
1364 					((SwGetRefField*)pFld)->SetExpand(m_pProps->sPar3);
1365 				uno::Any aVal; aVal <<=(sal_Int16)m_pProps->nUSHORT1;
1366 				pFld->PutValue(aVal, FIELD_PROP_USHORT1 );
1367 				aVal <<=(sal_Int16)m_pProps->nUSHORT2;
1368 				pFld->PutValue(aVal, FIELD_PROP_USHORT2 );
1369 				aVal <<=(sal_Int16)m_pProps->nSHORT1;
1370 				pFld->PutValue(aVal, FIELD_PROP_SHORT1 );
1371 			}
1372 			break;
1373 			case SW_SERVICE_FIELDTYPE_JUMP_EDIT:
1374 			{
1375 				SwFieldType* pFldType = pDoc->GetSysFldType(RES_JUMPEDITFLD);
1376 				pFld = new SwJumpEditField((SwJumpEditFieldType*)pFldType,
1377 						m_pProps->nUSHORT1, m_pProps->sPar2, m_pProps->sPar1);
1378 			}
1379 			break;
1380 			case SW_SERVICE_FIELDTYPE_DOCINFO_CHANGE_AUTHOR		:
1381 			case SW_SERVICE_FIELDTYPE_DOCINFO_CHANGE_DATE_TIME  :
1382 			case SW_SERVICE_FIELDTYPE_DOCINFO_EDIT_TIME         :
1383 			case SW_SERVICE_FIELDTYPE_DOCINFO_DESCRIPTION       :
1384 			case SW_SERVICE_FIELDTYPE_DOCINFO_CREATE_AUTHOR     :
1385 			case SW_SERVICE_FIELDTYPE_DOCINFO_CREATE_DATE_TIME  :
1386 			case SW_SERVICE_FIELDTYPE_DOCINFO_CUSTOM            :
1387 			case SW_SERVICE_FIELDTYPE_DOCINFO_PRINT_AUTHOR      :
1388 			case SW_SERVICE_FIELDTYPE_DOCINFO_PRINT_DATE_TIME   :
1389 			case SW_SERVICE_FIELDTYPE_DOCINFO_KEY_WORDS         :
1390 			case SW_SERVICE_FIELDTYPE_DOCINFO_SUBJECT           :
1391 			case SW_SERVICE_FIELDTYPE_DOCINFO_TITLE             :
1392 			case SW_SERVICE_FIELDTYPE_DOCINFO_REVISION          :
1393 			case SW_SERVICE_FIELDTYPE_DOC_INFO:
1394 			{
1395 				SwFieldType* pFldType = pDoc->GetSysFldType(RES_DOCINFOFLD);
1396 				sal_uInt16 nSubType = aDocInfoSubTypeFromService[
1397 						m_nServiceId - SW_SERVICE_FIELDTYPE_DOCINFO_CHANGE_AUTHOR];
1398 				if( SW_SERVICE_FIELDTYPE_DOCINFO_CHANGE_DATE_TIME == m_nServiceId ||
1399 					SW_SERVICE_FIELDTYPE_DOCINFO_CREATE_DATE_TIME == m_nServiceId ||
1400 					SW_SERVICE_FIELDTYPE_DOCINFO_PRINT_DATE_TIME == m_nServiceId ||
1401 					SW_SERVICE_FIELDTYPE_DOCINFO_EDIT_TIME == m_nServiceId )
1402 				{
1403 					if(m_pProps->bBool2) //IsDate
1404 					{
1405 						nSubType &= 0xf0ff;
1406 						nSubType |= DI_SUB_DATE;
1407 					}
1408 					else
1409 					{
1410 						nSubType &= 0xf0ff;
1411 						nSubType |= DI_SUB_TIME;
1412 					}
1413 				}
1414 				if(m_pProps->bBool1)
1415 					nSubType |= DI_SUB_FIXED;
1416 				pFld = new SwDocInfoField((SwDocInfoFieldType*)pFldType, nSubType, m_pProps->sPar4, m_pProps->nFormat);
1417 				if(m_pProps->sPar3.Len())
1418 					((SwDocInfoField*)pFld)->SetExpansion(m_pProps->sPar3);
1419 			}
1420 			break;
1421 			case SW_SERVICE_FIELDTYPE_USER_EXT:
1422 			{
1423 				sal_Int32 nFormat = 0;
1424 				if(m_pProps->bBool1)
1425 					nFormat = AF_FIXED;
1426 
1427 				SwFieldType* pFldType = pDoc->GetSysFldType(RES_EXTUSERFLD);
1428 				pFld = new SwExtUserField((SwExtUserFieldType*)pFldType, m_pProps->nUSHORT1, nFormat);
1429 				((SwExtUserField*)pFld)->SetExpansion(m_pProps->sPar1);
1430 			}
1431 			break;
1432 			case SW_SERVICE_FIELDTYPE_USER:
1433 			{
1434 				SwFieldType* pFldType = pDoc->GetFldType(RES_USERFLD, m_sTypeName, sal_True);
1435 				if(!pFldType)
1436 					throw uno::RuntimeException();
1437 				sal_uInt16 nUserSubType = m_pProps->bBool1 ? nsSwExtendedSubType::SUB_INVISIBLE : 0;
1438 				if(m_pProps->bBool2)
1439 					nUserSubType |= nsSwExtendedSubType::SUB_CMD;
1440                 if(m_pProps->bFormatIsDefault &&
1441                     nsSwGetSetExpType::GSE_STRING == ((SwUserFieldType*)pFldType)->GetType())
1442                         m_pProps->nFormat = -1;
1443 				pFld = new SwUserField((SwUserFieldType*)pFldType,
1444 									nUserSubType,
1445 									m_pProps->nFormat);
1446 			}
1447 			break;
1448 			case SW_SERVICE_FIELDTYPE_REF_PAGE_SET:
1449 			{
1450 				SwFieldType* pFldType = pDoc->GetSysFldType(RES_REFPAGESETFLD);
1451 				pFld = new SwRefPageSetField( (SwRefPageSetFieldType*)pFldType,
1452 									m_pProps->nUSHORT1,
1453 									m_pProps->bBool1 );
1454 			}
1455 			break;
1456 			case SW_SERVICE_FIELDTYPE_REF_PAGE_GET:
1457 			{
1458 				SwFieldType* pFldType = pDoc->GetSysFldType(RES_REFPAGEGETFLD);
1459 				pFld = new SwRefPageGetField( (SwRefPageGetFieldType*)pFldType,
1460 												m_pProps->nUSHORT1 );
1461                 ((SwRefPageGetField*)pFld)->SetText(m_pProps->sPar1);
1462 			}
1463 			break;
1464 			case SW_SERVICE_FIELDTYPE_PAGE_NUM:
1465 			{
1466 				SwFieldType* pFldType = pDoc->GetSysFldType(RES_PAGENUMBERFLD);
1467 				pFld = new SwPageNumberField((SwPageNumberFieldType*)pFldType,
1468 												PG_RANDOM,
1469 												m_pProps->nFormat,
1470 												m_pProps->nUSHORT1);
1471 				((SwPageNumberField*)pFld)->SetUserString(m_pProps->sPar1);
1472                 uno::Any aVal; aVal <<= m_pProps->nSubType;
1473                 pFld->PutValue( aVal, FIELD_PROP_SUBTYPE );
1474             }
1475 			break;
1476 			case SW_SERVICE_FIELDTYPE_DDE:
1477 			{
1478 				SwFieldType* pFldType = pDoc->GetFldType(RES_DDEFLD, m_sTypeName, sal_True);
1479 				if(!pFldType)
1480 					throw uno::RuntimeException();
1481 				pFld = new SwDDEField( (SwDDEFieldType*)pFldType );
1482 			}
1483 			break;
1484 			case SW_SERVICE_FIELDTYPE_DATABASE_NAME:
1485 			{
1486 				SwFieldType* pFldType = pDoc->GetSysFldType(RES_DBNAMEFLD);
1487 				SwDBData aData;
1488 				aData.sDataSource = m_pProps->sPar1;
1489 				aData.sCommand = m_pProps->sPar2;
1490 				aData.nCommandType = m_pProps->nSHORT1;
1491 				pFld = new SwDBNameField((SwDBNameFieldType*)pFldType, aData);
1492                 sal_uInt16  nSubType = pFld->GetSubType();
1493                 if(m_pProps->bBool2)
1494                     nSubType &= ~nsSwExtendedSubType::SUB_INVISIBLE;
1495                 else
1496                     nSubType |= nsSwExtendedSubType::SUB_INVISIBLE;
1497                 pFld->SetSubType(nSubType);
1498             }
1499 			break;
1500 			case SW_SERVICE_FIELDTYPE_DATABASE_NEXT_SET:
1501 			{
1502 				SwDBData aData;
1503 				aData.sDataSource = m_pProps->sPar1;
1504 				aData.sCommand = m_pProps->sPar2;
1505 				aData.nCommandType = m_pProps->nSHORT1;
1506 				SwFieldType* pFldType = pDoc->GetSysFldType(RES_DBNEXTSETFLD);
1507 				pFld = new SwDBNextSetField((SwDBNextSetFieldType*)pFldType,
1508 						m_pProps->sPar3, aEmptyStr,
1509 						aData);
1510             }
1511 			break;
1512 			case SW_SERVICE_FIELDTYPE_DATABASE_NUM_SET:
1513 			{
1514 				SwDBData aData;
1515 				aData.sDataSource = m_pProps->sPar1;
1516 				aData.sCommand = m_pProps->sPar2;
1517 				aData.nCommandType = m_pProps->nSHORT1;
1518 				pFld = new SwDBNumSetField( (SwDBNumSetFieldType*)
1519 					pDoc->GetSysFldType(RES_DBNUMSETFLD),
1520 					m_pProps->sPar3,
1521 					String::CreateFromInt32(m_pProps->nFormat),
1522 					aData );
1523             }
1524 			break;
1525 			case SW_SERVICE_FIELDTYPE_DATABASE_SET_NUM:
1526 			{
1527 				SwDBData aData;
1528 				aData.sDataSource = m_pProps->sPar1;
1529 				aData.sCommand = m_pProps->sPar2;
1530 				aData.nCommandType = m_pProps->nSHORT1;
1531 				pFld = new SwDBSetNumberField((SwDBSetNumberFieldType*)
1532 						pDoc->GetSysFldType(RES_DBSETNUMBERFLD),
1533 						aData,
1534 						m_pProps->nUSHORT1);
1535 				((SwDBSetNumberField*)pFld)->SetSetNumber(m_pProps->nFormat);
1536                 sal_uInt16  nSubType = pFld->GetSubType();
1537                 if(m_pProps->bBool2)
1538                     nSubType &= ~nsSwExtendedSubType::SUB_INVISIBLE;
1539                 else
1540                     nSubType |= nsSwExtendedSubType::SUB_INVISIBLE;
1541                 pFld->SetSubType(nSubType);
1542             }
1543 			break;
1544 			case SW_SERVICE_FIELDTYPE_DATABASE:
1545 			{
1546 				SwFieldType* pFldType = pDoc->GetFldType(RES_DBFLD, m_sTypeName, sal_False);
1547 				if(!pFldType)
1548 					throw uno::RuntimeException();
1549 				pFld = new SwDBField((SwDBFieldType*)pFldType, m_pProps->nFormat);
1550 				((SwDBField*)pFld)->InitContent(m_pProps->sPar1);
1551                 sal_uInt16  nSubType = pFld->GetSubType();
1552                 if(m_pProps->bBool2)
1553                     nSubType &= ~nsSwExtendedSubType::SUB_INVISIBLE;
1554                 else
1555                     nSubType |= nsSwExtendedSubType::SUB_INVISIBLE;
1556                 pFld->SetSubType(nSubType);
1557 			}
1558 			break;
1559 			case SW_SERVICE_FIELDTYPE_SET_EXP:
1560 			{
1561 				SwFieldType* pFldType = pDoc->GetFldType(RES_SETEXPFLD, m_sTypeName, sal_True);
1562 				if(!pFldType)
1563 					throw uno::RuntimeException();
1564                 //#93192# detect the field type's sub type and set an appropriate number format
1565                 if(m_pProps->bFormatIsDefault &&
1566                     nsSwGetSetExpType::GSE_STRING == ((SwSetExpFieldType*)pFldType)->GetType())
1567                         m_pProps->nFormat = -1;
1568                 pFld = new SwSetExpField((SwSetExpFieldType*)pFldType,
1569 					m_pProps->sPar2,
1570                     m_pProps->nUSHORT2 != USHRT_MAX ?  //#i79471# the field can have a number format or a number_ing_ format
1571                     m_pProps->nUSHORT2 : m_pProps->nFormat);
1572 
1573 				sal_uInt16	nSubType = pFld->GetSubType();
1574 				if(m_pProps->bBool2)
1575 					nSubType &= ~nsSwExtendedSubType::SUB_INVISIBLE;
1576 				else
1577 					nSubType |= nsSwExtendedSubType::SUB_INVISIBLE;
1578 				if(m_pProps->bBool3)
1579 					nSubType |= nsSwExtendedSubType::SUB_CMD;
1580 				else
1581 					nSubType &= ~nsSwExtendedSubType::SUB_CMD;
1582 				pFld->SetSubType(nSubType);
1583 				((SwSetExpField*)pFld)->SetSeqNumber( m_pProps->nUSHORT1 );
1584 				((SwSetExpField*)pFld)->SetInputFlag(m_pProps->bBool1);
1585 				((SwSetExpField*)pFld)->SetPromptText(m_pProps->sPar3);
1586 				if(m_pProps->sPar4.Len())
1587 					((SwSetExpField*)pFld)->ChgExpStr(m_pProps->sPar4);
1588 
1589 			}
1590 			break;
1591 			case SW_SERVICE_FIELDTYPE_GET_EXP:
1592 			{
1593 				sal_uInt16 nSubType;
1594 				switch(m_pProps->nSubType)
1595 				{
1596                     case text::SetVariableType::STRING: nSubType = nsSwGetSetExpType::GSE_STRING;   break;
1597                     case text::SetVariableType::VAR:        nSubType = nsSwGetSetExpType::GSE_EXPR;  break;
1598 					//case text::SetVariableType::SEQUENCE:   nSubType = nsSwGetSetExpType::GSE_SEQ;  break;
1599                     case text::SetVariableType::FORMULA:    nSubType = nsSwGetSetExpType::GSE_FORMULA; break;
1600 					default:
1601 						DBG_ERROR("wrong value");
1602 						nSubType = nsSwGetSetExpType::GSE_EXPR;
1603 				}
1604                 //make sure the SubType matches the field type
1605                 SwFieldType* pSetExpFld = pDoc->GetFldType(RES_SETEXPFLD, m_pProps->sPar1, sal_False);
1606                 bool bSetGetExpFieldUninitialized = false;
1607                 if( pSetExpFld )
1608                 {
1609                     if( nSubType != nsSwGetSetExpType::GSE_STRING &&
1610                         static_cast< SwSetExpFieldType* >(pSetExpFld)->GetType() == nsSwGetSetExpType::GSE_STRING )
1611                     nSubType = nsSwGetSetExpType::GSE_STRING;
1612 				}
1613 				else
1614                     bSetGetExpFieldUninitialized = true; // #i82544#
1615 
1616 				if(m_pProps->bBool2)
1617 					nSubType |= nsSwExtendedSubType::SUB_CMD;
1618 				else
1619 					nSubType &= ~nsSwExtendedSubType::SUB_CMD;
1620 				pFld = new SwGetExpField((SwGetExpFieldType*)
1621 						pDoc->GetSysFldType(RES_GETEXPFLD),
1622 						m_pProps->sPar1, nSubType, m_pProps->nFormat);
1623 				//TODO: SubType auswerten!
1624 				if(m_pProps->sPar4.Len())
1625 					((SwGetExpField*)pFld)->ChgExpStr(m_pProps->sPar4);
1626 				// #i82544#
1627                 if( bSetGetExpFieldUninitialized )
1628                     ((SwGetExpField*)pFld)->SetLateInitialization();
1629 			}
1630 			break;
1631 			case SW_SERVICE_FIELDTYPE_INPUT_USER:
1632 			case SW_SERVICE_FIELDTYPE_INPUT:
1633 			{
1634 				SwFieldType* pFldType = pDoc->GetFldType(RES_INPUTFLD, m_sTypeName, sal_True);
1635 				if(!pFldType)
1636 					throw uno::RuntimeException();
1637                 sal_uInt16 nInpSubType = sal::static_int_cast< sal_uInt16 >(SW_SERVICE_FIELDTYPE_INPUT_USER == m_nServiceId ? INP_USR : INP_TXT);
1638                 SwInputField * pTxtField =
1639                     new SwInputField( static_cast<SwInputFieldType*>(pFldType),
1640                                       m_pProps->sPar1,
1641                                       m_pProps->sPar2,
1642                                       nInpSubType );
1643                 pTxtField->SetHelp(m_pProps->sPar3);
1644                 pTxtField->SetToolTip(m_pProps->sPar4);
1645 
1646                 pFld = pTxtField;
1647 			}
1648 			break;
1649 			case SW_SERVICE_FIELDTYPE_MACRO:
1650 			{
1651 				SwFieldType* pFldType = pDoc->GetSysFldType(RES_MACROFLD);
1652 				String aName;
1653 
1654 				// support for Scripting Framework macros
1655 				if (m_pProps->sPar4.Len() != 0)
1656 				{
1657 					aName = m_pProps->sPar4;
1658 				}
1659 				else
1660 				{
1661 					SwMacroField::CreateMacroString(
1662 						aName, m_pProps->sPar1, m_pProps->sPar3 );
1663 				}
1664 				pFld = new SwMacroField((SwMacroFieldType*)pFldType, aName,
1665                                         m_pProps->sPar2);
1666 			}
1667 			break;
1668 			case SW_SERVICE_FIELDTYPE_PAGE_COUNT            :
1669 			case SW_SERVICE_FIELDTYPE_PARAGRAPH_COUNT       :
1670 			case SW_SERVICE_FIELDTYPE_WORD_COUNT            :
1671 			case SW_SERVICE_FIELDTYPE_CHARACTER_COUNT       :
1672 			case SW_SERVICE_FIELDTYPE_TABLE_COUNT           :
1673 			case SW_SERVICE_FIELDTYPE_GRAPHIC_OBJECT_COUNT  :
1674 			case SW_SERVICE_FIELDTYPE_EMBEDDED_OBJECT_COUNT :
1675 			{
1676 				sal_uInt16 nSubType = DS_PAGE;
1677 				switch(m_nServiceId)
1678 				{
1679 //					case SW_SERVICE_FIELDTYPE_PAGE_COUNT            : break;
1680 					case SW_SERVICE_FIELDTYPE_PARAGRAPH_COUNT       : nSubType = DS_PARA;break;
1681 					case SW_SERVICE_FIELDTYPE_WORD_COUNT            : nSubType = DS_WORD;break;
1682 					case SW_SERVICE_FIELDTYPE_CHARACTER_COUNT       : nSubType = DS_CHAR;break;
1683 					case SW_SERVICE_FIELDTYPE_TABLE_COUNT           : nSubType = DS_TBL;break;
1684 					case SW_SERVICE_FIELDTYPE_GRAPHIC_OBJECT_COUNT  : nSubType = DS_GRF;break;
1685 					case SW_SERVICE_FIELDTYPE_EMBEDDED_OBJECT_COUNT : nSubType = DS_OLE;break;
1686 				}
1687 				SwFieldType* pFldType = pDoc->GetSysFldType(RES_DOCSTATFLD);
1688 				pFld = new SwDocStatField((SwDocStatFieldType*)pFldType, nSubType, m_pProps->nUSHORT2);
1689 			}
1690 			break;
1691 			case SW_SERVICE_FIELDTYPE_BIBLIOGRAPHY:
1692 				pFld = new SwAuthorityField( (SwAuthorityFieldType*)
1693 						pDoc->InsertFldType(SwAuthorityFieldType(pDoc)),
1694 						aEmptyStr );
1695 				if(m_pProps->aPropSeq.getLength())
1696 				{
1697 					uno::Any aVal; aVal <<= m_pProps->aPropSeq;
1698 					pFld->PutValue( aVal, FIELD_PROP_PROP_SEQ );
1699 				}
1700 				break;
1701 			case SW_SERVICE_FIELDTYPE_COMBINED_CHARACTERS:
1702 				// create field
1703 				pFld = new SwCombinedCharField( (SwCombinedCharFieldType*)
1704 							pDoc->GetSysFldType(RES_COMBINED_CHARS),
1705 							m_pProps->sPar1);
1706 				break;
1707             case SW_SERVICE_FIELDTYPE_DROPDOWN:
1708                 pFld = new SwDropDownField
1709                     ((SwDropDownFieldType *)
1710                      pDoc->GetSysFldType(RES_DROPDOWN));
1711 
1712                 ((SwDropDownField *) pFld)->SetItems(m_pProps->aStrings);
1713                 ((SwDropDownField *) pFld)->SetSelectedItem(m_pProps->sPar1);
1714                 ((SwDropDownField *) pFld)->SetName(m_pProps->sPar2);
1715                 ((SwDropDownField *) pFld)->SetHelp(m_pProps->sPar3);
1716                 ((SwDropDownField *) pFld)->SetToolTip(m_pProps->sPar4);
1717                 break;
1718 
1719             case SW_SERVICE_FIELDTYPE_TABLE_FORMULA :
1720             {
1721 
1722 				// create field
1723                 sal_uInt16 nType = nsSwGetSetExpType::GSE_FORMULA;
1724                 if(m_pProps->bBool1)
1725                 {
1726                     nType |= nsSwExtendedSubType::SUB_CMD;
1727                     if(m_pProps->bFormatIsDefault)
1728                         m_pProps->nFormat = -1;
1729                 }
1730                 pFld = new SwTblField( (SwTblFieldType*)
1731 					pDoc->GetSysFldType(RES_TABLEFLD),
1732 					m_pProps->sPar2,
1733                     nType,
1734                     m_pProps->nFormat);
1735                ((SwTblField*)pFld)->ChgExpStr(m_pProps->sPar1);
1736             }
1737             break;
1738             default: DBG_ERROR("was ist das fuer ein Typ?");
1739         }
1740         if ( pFld )
1741         {
1742             pFld->SetAutomaticLanguage(!m_pProps->bBool4);
1743             SwFmtFld aFmt( *pFld );
1744 
1745             UnoActionContext aCont(pDoc);
1746             SwTxtAttr* pTxtAttr = 0;
1747             if ( aPam.HasMark()
1748                  && m_nServiceId != SW_SERVICE_FIELDTYPE_ANNOTATION )
1749             {
1750                 pDoc->DeleteAndJoin(aPam);
1751             }
1752 
1753             SwXTextCursor const*const pTextCursor( dynamic_cast<SwXTextCursor*>(pCursor) );
1754             const bool bForceExpandHints(
1755                 (pTextCursor)
1756                 ? pTextCursor->IsAtEndOfMeta()
1757                 : false );
1758             const SetAttrMode nInsertFlags =
1759                 (bForceExpandHints)
1760                 ? nsSetAttrMode::SETATTR_FORCEHINTEXPAND
1761                 : nsSetAttrMode::SETATTR_DEFAULT;
1762 
1763             if ( *aPam.GetPoint() != *aPam.GetMark()
1764                  && m_nServiceId == SW_SERVICE_FIELDTYPE_ANNOTATION )
1765             {
1766                 IDocumentMarkAccess* pMarksAccess = pDoc->getIDocumentMarkAccess();
1767                 sw::mark::IFieldmark* pFieldmark =
1768                     pMarksAccess->makeFieldBookmark(
1769                         aPam,
1770                         OUString(),
1771                         ::rtl::OUString::createFromAscii( ODF_COMMENTRANGE ) );
1772                 ASSERT( pFieldmark != NULL, "<SwXTextField::attachToRange(..)> - <IFieldmark> instance for SW_SERVICE_FIELDTYPE_ANNOTATION not created!" );
1773                 if ( pFieldmark != NULL )
1774                 {
1775                     SwPostItField* pPostItField = dynamic_cast<SwPostItField*>(aFmt.GetField());
1776                     ASSERT( pPostItField != NULL, "<SwXTextField::attachToRange(..)> - missing <SwPostItField> instance for SW_SERVICE_FIELDTYPE_ANNOTATION!" );
1777                     if ( pPostItField != NULL )
1778                     {
1779                         if ( pPostItField->GetName().Len() > 0 )
1780                         {
1781                             // The field has a name already, use it.
1782                             pMarksAccess->renameMark(pFieldmark, pPostItField->GetName());
1783                         }
1784                         else
1785                         {
1786                             // The fieldmark always has a (generated) name.
1787                             pPostItField->SetName( pFieldmark->GetName() );
1788                         }
1789                     }
1790                 }
1791 
1792                 // Make sure we always insert the field at the end
1793                 SwPaM aEnd(*aPam.End(), *aPam.End());
1794                 pDoc->InsertPoolItem(aEnd, aFmt, nInsertFlags);
1795             }
1796             else
1797                 pDoc->InsertPoolItem(aPam, aFmt, nInsertFlags);
1798 
1799             pTxtAttr = aPam.GetNode()->GetTxtNode()->GetFldTxtAttrAt( aPam.GetPoint()->nContent.GetIndex()-1, true );
1800             // was passiert mit dem Update der Felder ? (siehe fldmgr.cxx)
1801             if(pTxtAttr)
1802             {
1803                 const SwFmtFld& rFld = pTxtAttr->GetFmtFld();
1804                 pFmtFld = &rFld;
1805             }
1806         }
1807         delete pFld;
1808 
1809         m_pDoc = pDoc;
1810         m_pDoc->GetUnoCallBack()->Add(this);
1811         m_bIsDescriptor = sal_False;
1812         if(m_aFieldTypeClient.GetRegisteredIn())
1813             const_cast<SwModify*>(m_aFieldTypeClient.GetRegisteredIn())->Remove(&m_aFieldTypeClient);
1814         DELETEZ(m_pProps);
1815         if(m_bCallUpdate)
1816             update();
1817     }
1818     else
1819         throw lang::IllegalArgumentException();
1820 }
1821 
1822 void SwXTextField::attach(const uno::Reference< text::XTextRange > & xTextRange)
1823 	throw( lang::IllegalArgumentException, uno::RuntimeException )
1824 {
1825 	vos::OGuard aGuard(Application::GetSolarMutex());
1826     attachToRange( xTextRange );
1827 }
1828 
1829 uno::Reference< text::XTextRange >  SwXTextField::getAnchor(void) throw( uno::RuntimeException )
1830 {
1831 	vos::OGuard  aGuard(Application::GetSolarMutex());
1832 	uno::Reference< text::XTextRange >   aRef;
1833 	SwField* pField = (SwField*)GetField();
1834 	if(pField)
1835 	{
1836 		const SwTxtFld* pTxtFld = pFmtFld->GetTxtFld();
1837 		if(!pTxtFld)
1838 			throw uno::RuntimeException();
1839 		const SwTxtNode& rTxtNode = pTxtFld->GetTxtNode();
1840 
1841 		SwPaM aPam(rTxtNode, *pTxtFld->GetStart() + 1, rTxtNode, *pTxtFld->GetStart());
1842 
1843         aRef = SwXTextRange::CreateXTextRange(
1844                 *m_pDoc, *aPam.GetPoint(), aPam.GetMark());
1845 	}
1846 	return aRef;
1847 
1848 }
1849 
1850 void SwXTextField::dispose(void) throw( uno::RuntimeException )
1851 {
1852 	vos::OGuard  aGuard(Application::GetSolarMutex());
1853 	SwField* pField = (SwField*)GetField();
1854 	if(pField)
1855 	{
1856 		UnoActionContext aContext(GetDoc());
1857 		const SwTxtFld* pTxtFld = pFmtFld->GetTxtFld();
1858 		SwTxtNode& rTxtNode = (SwTxtNode&)*pTxtFld->GetpTxtNode();
1859 		SwPaM aPam(rTxtNode, *pTxtFld->GetStart());
1860 		aPam.SetMark();
1861 		aPam.Move();
1862 		GetDoc()->DeleteAndJoin(aPam);
1863 	}
1864 
1865 	if ( m_pTextObject )
1866 	{
1867 		m_pTextObject->DisposeEditSource();
1868 		m_pTextObject->release();
1869 		m_pTextObject = 0;
1870 	}
1871 }
1872 
1873 void SwXTextField::addEventListener(const uno::Reference< lang::XEventListener > & aListener) throw( uno::RuntimeException )
1874 {
1875 	if(!GetRegisteredIn())
1876 		throw uno::RuntimeException();
1877 	aLstnrCntnr.AddListener(aListener);
1878 }
1879 
1880 void SwXTextField::removeEventListener(const uno::Reference< lang::XEventListener > & aListener) throw( uno::RuntimeException )
1881 {
1882 	if(!GetRegisteredIn() || !aLstnrCntnr.RemoveListener(aListener))
1883 		throw uno::RuntimeException();
1884 }
1885 
1886 uno::Reference< beans::XPropertySetInfo >  SwXTextField::getPropertySetInfo(void)
1887 		throw( uno::RuntimeException )
1888 {
1889 	vos::OGuard  aGuard(Application::GetSolarMutex());
1890 	//kein static
1891 	uno::Reference< beans::XPropertySetInfo >  aRef;
1892 	if(m_nServiceId != USHRT_MAX)
1893 	{
1894         const SfxItemPropertySet* pPropSet = aSwMapProvider.GetPropertySet(
1895 						lcl_GetPropertyMapOfService( m_nServiceId ));
1896         uno::Reference< beans::XPropertySetInfo >  xInfo = pPropSet->getPropertySetInfo();
1897 		// extend PropertySetInfo!
1898 		const uno::Sequence<beans::Property> aPropSeq = xInfo->getProperties();
1899 		aRef = new SfxExtItemPropertySetInfo(
1900             aSwMapProvider.GetPropertyMapEntries(PROPERTY_MAP_PARAGRAPH_EXTENSIONS),
1901 			aPropSeq );
1902 	}
1903 	else
1904 		throw uno::RuntimeException();
1905 	return aRef;
1906 }
1907 
1908 void SwXTextField::setPropertyValue(const OUString& rPropertyName, const uno::Any& rValue)
1909 	throw( beans::UnknownPropertyException, beans::PropertyVetoException, lang::IllegalArgumentException,
1910 		lang::WrappedTargetException, uno::RuntimeException )
1911 {
1912 	vos::OGuard  aGuard(Application::GetSolarMutex());
1913 	SwField* pField = (SwField*)GetField();
1914     const SfxItemPropertySet* _pPropSet = aSwMapProvider.GetPropertySet(
1915 								lcl_GetPropertyMapOfService( m_nServiceId));
1916     const SfxItemPropertySimpleEntry*   pEntry = _pPropSet->getPropertyMap()->getByName(rPropertyName);
1917 
1918     if (!pEntry)
1919         throw beans::UnknownPropertyException(OUString ( RTL_CONSTASCII_USTRINGPARAM ( "Unknown property: " ) ) + rPropertyName, static_cast < cppu::OWeakObject * > ( this ) );
1920     if ( pEntry->nFlags & beans::PropertyAttribute::READONLY)
1921         throw beans::PropertyVetoException ( OUString ( RTL_CONSTASCII_USTRINGPARAM ( "Property is read-only: " ) ) + rPropertyName, static_cast < cppu::OWeakObject * > ( this ) );
1922 
1923 	if(pField)
1924 	{
1925 		// Sonderbehandlung Serienbrieffeld
1926 		sal_uInt16 nWhich = pField->Which();
1927 		if( RES_DBFLD == nWhich &&
1928 			(rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_DATA_BASE_NAME)) ||
1929             rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_DATA_BASE_URL))||
1930 			rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_DATA_TABLE_NAME))||
1931 			rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_DATA_COLUMN_NAME))))
1932 		{
1933 			// hier muss ein neuer Feldtyp angelegt werden und
1934 			// das Feld an den neuen Typ umgehaengt werden
1935 			DBG_WARNING("not implemented");
1936 		}
1937 		else
1938         {
1939             // -> #111840#
1940             SwDoc * pDoc = GetDoc();
1941 
1942             if (NULL != pDoc)
1943             {
1944                 const SwTxtFld* pTxtFld = pFmtFld->GetTxtFld();
1945                 if(!pTxtFld)
1946                     throw uno::RuntimeException();
1947                 SwPosition aPosition( pTxtFld->GetTxtNode() );
1948                 aPosition.nContent = *pTxtFld->GetStart();
1949                 pDoc->PutValueToField( aPosition, rValue, pEntry->nWID);
1950             }
1951             // <- #111840#
1952         }
1953         pField->PutValue( rValue, pEntry->nWID );
1954 
1955 	//#i100374# notify SwPostIt about new field content
1956 	if (RES_POSTITFLD== nWhich && pFmtFld)
1957 	{
1958 		const_cast<SwFmtFld*>(pFmtFld)->Broadcast(SwFmtFldHint( 0, SWFMTFLD_CHANGED ));
1959 	}
1960 
1961         //#114571# changes of the expanded string have to be notified
1962         //#to the SwTxtFld
1963         if(RES_DBFLD == nWhich && pFmtFld->GetTxtFld())
1964         {
1965             pFmtFld->GetTxtFld()->ExpandTxtFld();
1966         }
1967 
1968 	//#i100374# changing a document field should set the modify flag
1969 	SwDoc* pDoc = GetDoc();
1970 	if (pDoc)
1971 		pDoc->SetModified();
1972 
1973 	}
1974 	else if(m_pProps)
1975 	{
1976 		String* pStr = 0;
1977 		sal_Bool* pBool = 0;
1978         switch(pEntry->nWID)
1979 		{
1980 		case FIELD_PROP_PAR1:
1981 			pStr = &m_pProps->sPar1;
1982 			break;
1983 		case FIELD_PROP_PAR2:
1984 			pStr = &m_pProps->sPar2;
1985 			break;
1986 		case FIELD_PROP_PAR3:
1987 			pStr = &m_pProps->sPar3;
1988 			break;
1989 		case FIELD_PROP_PAR4:
1990 			pStr = &m_pProps->sPar4;
1991 			break;
1992 		case FIELD_PROP_FORMAT:
1993 			rValue >>= m_pProps->nFormat;
1994             m_pProps->bFormatIsDefault = sal_False;
1995 			break;
1996 		case FIELD_PROP_SUBTYPE:
1997 			m_pProps->nSubType = SWUnoHelper::GetEnumAsInt32( rValue );
1998 			break;
1999 		case FIELD_PROP_BYTE1 :
2000 			rValue >>= m_pProps->nByte1;
2001 			break;
2002 		case FIELD_PROP_BOOL1 :
2003 			pBool = &m_pProps->bBool1;
2004 			break;
2005 		case FIELD_PROP_BOOL2 :
2006 			pBool = &m_pProps->bBool2;
2007 			break;
2008 		case FIELD_PROP_BOOL3 :
2009 			pBool = &m_pProps->bBool3;
2010 			break;
2011         case FIELD_PROP_BOOL4:
2012             pBool = &m_pProps->bBool4;
2013         break;
2014 		case FIELD_PROP_DATE :
2015 		{
2016 			if(rValue.getValueType() != ::getCppuType(static_cast<const util::Date*>(0)))
2017 				throw lang::IllegalArgumentException();
2018 
2019 			util::Date aTemp = *(const util::Date*)rValue.getValue();
2020 			m_pProps->aDate = Date(aTemp.Day, aTemp.Month, aTemp.Year);
2021 		}
2022 		break;
2023 		case FIELD_PROP_USHORT1:
2024 		case FIELD_PROP_USHORT2:
2025 			{
2026  				sal_Int16 nVal = 0;
2027 				rValue >>= nVal;
2028                 if( FIELD_PROP_USHORT1 == pEntry->nWID)
2029 					m_pProps->nUSHORT1 = nVal;
2030 				else
2031 					m_pProps->nUSHORT2 = nVal;
2032 			}
2033 			break;
2034 		case FIELD_PROP_SHORT1:
2035 			rValue >>= m_pProps->nSHORT1;
2036 			break;
2037 		case FIELD_PROP_DOUBLE:
2038 			if(rValue.getValueType() != ::getCppuType(static_cast<const double*>(0)))
2039 				throw lang::IllegalArgumentException();
2040 			m_pProps->fDouble = *(double*)rValue.getValue();
2041 			break;
2042 
2043 		case FIELD_PROP_DATE_TIME :
2044 			if(!m_pProps->pDateTime)
2045 				m_pProps->pDateTime = new util::DateTime;
2046 			rValue >>= (*m_pProps->pDateTime);
2047 			break;
2048 		case FIELD_PROP_PROP_SEQ:
2049 			rValue >>= m_pProps->aPropSeq;
2050 			break;
2051         case FIELD_PROP_STRINGS:
2052             rValue >>= m_pProps->aStrings;
2053             break;
2054 		}
2055 		if( pStr )
2056 			::GetString( rValue, *pStr );
2057 		else if( pBool )
2058 		{
2059 			if( rValue.getValueType() == getCppuBooleanType() )
2060 				*pBool = *(sal_Bool*)rValue.getValue();
2061 			else
2062 				throw lang::IllegalArgumentException();
2063 		}
2064 	}
2065 	else
2066 		throw uno::RuntimeException();
2067 }
2068 
2069 uno::Any SwXTextField::getPropertyValue(const OUString& rPropertyName)
2070 	throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
2071 {
2072 	vos::OGuard  aGuard(Application::GetSolarMutex());
2073 	uno::Any aRet;
2074 	const SwField* pField = GetField();
2075     const SfxItemPropertySet* _pPropSet = aSwMapProvider.GetPropertySet(
2076                                 lcl_GetPropertyMapOfService( m_nServiceId));
2077     const SfxItemPropertySimpleEntry*   pEntry = _pPropSet->getPropertyMap()->getByName(rPropertyName);
2078     if(!pEntry )
2079 	{
2080         const SfxItemPropertySet* _pParaPropSet = aSwMapProvider.GetPropertySet(PROPERTY_MAP_PARAGRAPH_EXTENSIONS);
2081         pEntry = _pParaPropSet->getPropertyMap()->getByName(rPropertyName);
2082 	}
2083     if (!pEntry)
2084         throw beans::UnknownPropertyException(OUString ( RTL_CONSTASCII_USTRINGPARAM ( "Unknown property: " ) ) + rPropertyName, static_cast < cppu::OWeakObject * > ( this ) );
2085 
2086     switch( pEntry->nWID )
2087 	{
2088 	case FN_UNO_TEXT_WRAP:
2089 		aRet <<= text::WrapTextMode_NONE;
2090 		break;
2091 	case FN_UNO_ANCHOR_TYPE:
2092 		aRet <<= text::TextContentAnchorType_AS_CHARACTER;
2093 		break;
2094 	case FN_UNO_ANCHOR_TYPES:
2095 		{
2096 			uno::Sequence<text::TextContentAnchorType> aTypes(1);
2097 			text::TextContentAnchorType* pArray = aTypes.getArray();
2098 			pArray[0] = text::TextContentAnchorType_AS_CHARACTER;
2099 			aRet.setValue(&aTypes, ::getCppuType(static_cast<uno::Sequence<text::TextContentAnchorType>*>(0)));
2100 		}
2101 		break;
2102 
2103 	default:
2104 		if( pField )
2105         {
2106             if (FIELD_PROP_IS_FIELD_USED      == pEntry->nWID ||
2107                 FIELD_PROP_IS_FIELD_DISPLAYED == pEntry->nWID)
2108             {
2109                 sal_Bool bIsFieldUsed       = sal_False;
2110                 sal_Bool bIsFieldDisplayed  = sal_False;
2111 
2112                 // in order to have the information about fields
2113                 // correctly evaluated the document needs a layout
2114                 // (has to be already formatted)
2115                 SwDoc *pDoc = GetDoc();
2116                 ViewShell *pViewShell = 0;
2117                 SwEditShell *pEditShell = pDoc ? pDoc->GetEditShell( &pViewShell ) : 0;
2118                 if (pEditShell)
2119                     pEditShell->CalcLayout();
2120                 else if (pViewShell) // a page preview has no SwEditShell it should only have a view shell
2121                     pViewShell->CalcLayout();
2122                 else
2123                     throw uno::RuntimeException();
2124 
2125                 // get text node for the text field
2126                 const SwFmtFld *pFldFmt = GetFldFmt();
2127                 const SwTxtFld* pTxtFld = pFldFmt ? pFmtFld->GetTxtFld() : 0;
2128                 if(!pTxtFld)
2129                     throw uno::RuntimeException();
2130                 const SwTxtNode& rTxtNode = pTxtFld->GetTxtNode();
2131 
2132                 // skip fields that are currently not in the document
2133                 // e.g. fields in undo or redo array
2134                 if (rTxtNode.GetNodes().IsDocNodes())
2135                 {
2136                     sal_Bool bFrame = 0 != rTxtNode.FindLayoutRect().Width(); // oder so
2137                     sal_Bool bHidden = rTxtNode.IsHidden();
2138                     if ( !bHidden )
2139                     {
2140                         xub_StrLen nHiddenStart;
2141                         xub_StrLen nHiddenEnd;
2142 
2143                         SwPosition aPosition( pTxtFld->GetTxtNode() );
2144                         aPosition.nContent = *pTxtFld->GetStart();
2145 
2146                         bHidden = SwScriptInfo::GetBoundsOfHiddenRange( pTxtFld->GetTxtNode(),
2147                                         *pTxtFld->GetStart(),
2148                                         nHiddenStart, nHiddenEnd );
2149                     }
2150 
2151                     // !bFrame && !bHidden: aller Wahrscheinlichkeit handelt es
2152                     // sich um ein Feld in einem unbenutzten Seitenstyle
2153                     //
2154                     // bHidden: Feld ist versteckt
2155                     // FME: Problem: Verstecktes Feld in unbenutzter Seitenvorlage =>
2156                     // bIsFieldUsed = true
2157                     // bIsFieldDisplayed = false
2158                     bIsFieldUsed       = bFrame || bHidden;
2159                     bIsFieldDisplayed  = bIsFieldUsed && !bHidden;
2160 				}
2161                 sal_Bool bRetVal = (FIELD_PROP_IS_FIELD_USED == pEntry->nWID) ?
2162 											bIsFieldUsed : bIsFieldDisplayed;
2163                 aRet.setValue( &bRetVal, ::getCppuBooleanType() );
2164 			}
2165             else
2166                 pField->QueryValue( aRet, pEntry->nWID );
2167         }
2168         else if( m_pProps )     // currently just a descriptor...
2169 		{
2170             switch(pEntry->nWID)
2171 			{
2172 			case FIELD_PROP_TEXT:
2173 				{
2174 					if (!m_pTextObject)
2175 					{
2176 						SwTextAPIEditSource* pObj = new SwTextAPIEditSource( m_pDoc );
2177 						m_pTextObject = new SwTextAPIObject( pObj );
2178 						m_pTextObject->acquire();
2179 					}
2180 
2181 					uno::Reference < text::XText > xText( m_pTextObject  );
2182 					aRet <<= xText;
2183 					break;
2184 				}
2185 			case FIELD_PROP_PAR1:
2186 				aRet <<= OUString(m_pProps->sPar1);
2187 				break;
2188 			case FIELD_PROP_PAR2:
2189 				aRet <<= OUString(m_pProps->sPar2);
2190 				break;
2191 			case FIELD_PROP_PAR3:
2192 				aRet <<= OUString(m_pProps->sPar3);
2193 				break;
2194 			case FIELD_PROP_PAR4:
2195 				aRet <<= OUString(m_pProps->sPar4);
2196 				break;
2197 			case FIELD_PROP_FORMAT:
2198 				aRet <<= m_pProps->nFormat;
2199 				break;
2200 			case FIELD_PROP_SUBTYPE:
2201 				aRet <<= m_pProps->nSubType;
2202 				break;
2203 			case FIELD_PROP_BYTE1 :
2204 				aRet <<= m_pProps->nByte1;
2205 				break;
2206 			case FIELD_PROP_BOOL1 :
2207 				aRet.setValue(&m_pProps->bBool1, ::getCppuBooleanType());
2208 				break;
2209 			case FIELD_PROP_BOOL2 :
2210 				aRet.setValue(&m_pProps->bBool2, ::getCppuBooleanType());
2211 				break;
2212             case FIELD_PROP_BOOL3 :
2213                 aRet.setValue(&m_pProps->bBool3, ::getCppuBooleanType());
2214                 break;
2215             case FIELD_PROP_BOOL4 :
2216                 aRet.setValue(&m_pProps->bBool4, ::getCppuBooleanType());
2217                 break;
2218             case FIELD_PROP_DATE :
2219 				aRet.setValue(&m_pProps->aDate, ::getCppuType(static_cast<const util::Date*>(0)));
2220 				break;
2221 			case FIELD_PROP_USHORT1:
2222 				aRet <<= (sal_Int16)m_pProps->nUSHORT1;
2223 				break;
2224 			case FIELD_PROP_USHORT2:
2225 				aRet <<= (sal_Int16)m_pProps->nUSHORT2;
2226 				break;
2227 			case FIELD_PROP_SHORT1:
2228 				aRet <<= m_pProps->nSHORT1;
2229 				break;
2230 			case FIELD_PROP_DOUBLE:
2231 				aRet <<= m_pProps->fDouble;
2232 				break;
2233 			case FIELD_PROP_DATE_TIME :
2234 				if(m_pProps->pDateTime)
2235 					aRet <<= (*m_pProps->pDateTime);
2236 				break;
2237 			case FIELD_PROP_PROP_SEQ:
2238 				aRet <<= m_pProps->aPropSeq;
2239 				break;
2240 			case FIELD_PROP_STRINGS:
2241 				aRet <<= m_pProps->aStrings;
2242 				break;
2243             case FIELD_PROP_IS_FIELD_USED:
2244             case FIELD_PROP_IS_FIELD_DISPLAYED:
2245                 aRet.setValue( NULL, ::getCppuBooleanType() );
2246                 break;
2247             }
2248 		}
2249 		else
2250 			throw uno::RuntimeException();
2251 	}
2252 	return aRet;
2253 }
2254 
2255 void SwXTextField::addPropertyChangeListener(const OUString& /*PropertyName*/, const uno::Reference< beans::XPropertyChangeListener > & /*aListener*/) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
2256 {
2257 	DBG_WARNING("not implemented");
2258 }
2259 
2260 void SwXTextField::removePropertyChangeListener(const OUString& /*PropertyName*/, const uno::Reference< beans::XPropertyChangeListener > & /*aListener*/) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
2261 {
2262 	DBG_WARNING("not implemented");
2263 }
2264 
2265 void SwXTextField::addVetoableChangeListener(const OUString& /*PropertyName*/, const uno::Reference< beans::XVetoableChangeListener > & /*aListener*/) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
2266 {
2267 	DBG_WARNING("not implemented");
2268 }
2269 
2270 void SwXTextField::removeVetoableChangeListener(const OUString& /*PropertyName*/, const uno::Reference< beans::XVetoableChangeListener > & /*aListener*/) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
2271 {
2272 	DBG_WARNING("not implemented");
2273 }
2274 
2275 void SwXTextField::update(  ) throw (uno::RuntimeException)
2276 {
2277     vos::OGuard  aGuard(Application::GetSolarMutex());
2278     const SwField* pFld = GetField();
2279     if(pFld)
2280     {
2281         switch(pFld->Which())
2282         {
2283             case RES_DATETIMEFLD:
2284             ((SwDateTimeField*)pFld)->SetDateTime( ::DateTime() );
2285             break;
2286 
2287             case RES_EXTUSERFLD:
2288             {
2289                 SwExtUserField* pExtUserFld = (SwExtUserField*)pFld;
2290                 pExtUserFld->SetExpansion( ((SwExtUserFieldType*)pFld->GetTyp())->Expand(
2291                                             pExtUserFld->GetSubType(),
2292                                             pExtUserFld->GetFormat() ) );
2293             }
2294             break;
2295 
2296             case RES_AUTHORFLD:
2297             {
2298                 SwAuthorField* pAuthorFld = (SwAuthorField*)pFld;
2299                 pAuthorFld->SetExpansion( ((SwAuthorFieldType*)pFld->GetTyp())->Expand(
2300                                             pAuthorFld->GetFormat() ) );
2301             }
2302             break;
2303 
2304             case RES_FILENAMEFLD:
2305             {
2306                 SwFileNameField* pFileNameFld = (SwFileNameField*)pFld;
2307                 pFileNameFld->SetExpansion( ((SwFileNameFieldType*)pFld->GetTyp())->Expand(
2308                                             pFileNameFld->GetFormat() ) );
2309             }
2310             break;
2311 
2312             case RES_DOCINFOFLD:
2313             {
2314                     SwDocInfoField* pDocInfFld = (SwDocInfoField*)pFld;
2315                     pDocInfFld->SetExpansion( ((SwDocInfoFieldType*)pFld->GetTyp())->Expand(
2316                                                 pDocInfFld->GetSubType(),
2317                                                 pDocInfFld->GetFormat(),
2318                                                 pDocInfFld->GetLanguage(),
2319 												pDocInfFld->GetName() ) );
2320             }
2321             break;
2322         }
2323 		// --> FME 2004-10-06 #116480#
2324 		// Text formatting has to be triggered.
2325 		const_cast<SwFmtFld*>(pFmtFld)->ModifyNotification( 0, 0 );
2326 		// <--
2327     }
2328     else
2329         m_bCallUpdate = sal_True;
2330 }
2331 
2332 OUString SwXTextField::getImplementationName(void) throw( uno::RuntimeException )
2333 {
2334 	return C2U("SwXTextField");
2335 }
2336 
2337 static OUString OldNameToNewName_Impl( const OUString &rOld )
2338 {
2339 	static OUString aOldNamePart1( OUString::createFromAscii(".TextField.DocInfo.") );
2340 	static OUString aOldNamePart2( OUString::createFromAscii(".TextField.") );
2341 	static OUString aNewNamePart1( OUString::createFromAscii(".textfield.docinfo.") );
2342 	static OUString aNewNamePart2( OUString::createFromAscii(".textfield.") );
2343 	OUString sServiceNameCC( rOld );
2344 	sal_Int32 nIdx = sServiceNameCC.indexOf( aOldNamePart1 );
2345 	if (nIdx >= 0)
2346 		sServiceNameCC = sServiceNameCC.replaceAt( nIdx, aOldNamePart1.getLength(), aNewNamePart1 );
2347 	nIdx = sServiceNameCC.indexOf( aOldNamePart2 );
2348 	if (nIdx >= 0)
2349 		sServiceNameCC = sServiceNameCC.replaceAt( nIdx, aOldNamePart2.getLength(), aNewNamePart2 );
2350 	return sServiceNameCC;
2351 }
2352 
2353 sal_Bool SwXTextField::supportsService(const OUString& rServiceName) throw( uno::RuntimeException )
2354 {
2355 	OUString sServiceName = SwXServiceProvider::GetProviderName(m_nServiceId);
2356 
2357 	// case-corected version of service-name (see #i67811)
2358 	// (need to supply both because of compatibility to older versions)
2359 	OUString sServiceNameCC(  OldNameToNewName_Impl( sServiceName ) );
2360 
2361 	return sServiceName == rServiceName || sServiceNameCC == rServiceName ||
2362         rServiceName.equalsAsciiL(
2363 				RTL_CONSTASCII_STRINGPARAM("com.sun.star.text.TextContent"));
2364 }
2365 
2366 uno::Sequence< OUString > SwXTextField::getSupportedServiceNames(void) throw( uno::RuntimeException )
2367 {
2368 	OUString sServiceName = SwXServiceProvider::GetProviderName(m_nServiceId);
2369 
2370 	// case-corected version of service-name (see #i67811)
2371 	// (need to supply both because of compatibility to older versions)
2372 	OUString sServiceNameCC(  OldNameToNewName_Impl( sServiceName ) );
2373 	sal_Int32 nLen = sServiceName == sServiceNameCC ? 2 : 3;
2374 
2375 	uno::Sequence< OUString > aRet( nLen );
2376 	OUString* pArray = aRet.getArray();
2377 	*pArray++ = sServiceName;
2378 	if (nLen == 3)
2379 		*pArray++ = sServiceNameCC;
2380 	*pArray++ = C2U("com.sun.star.text.TextContent");
2381 	return aRet;
2382 }
2383 
2384 
2385 sal_uInt16 SwXTextField::GetServiceId()
2386 {
2387     return m_nServiceId;
2388 }
2389 
2390 
2391     void SwXTextField::Invalidate()
2392 {
2393 	if (GetRegisteredIn())
2394 	{
2395 		((SwModify*)GetRegisteredIn())->Remove(this);
2396 		aLstnrCntnr.Disposing();
2397 		pFmtFld = 0;
2398 		m_pDoc = 0;
2399 	}
2400 }
2401 
2402 
2403 void SwXTextField::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew)
2404 {
2405 	switch( pOld ? pOld->Which() : 0 )
2406 	{
2407 	case RES_REMOVE_UNO_OBJECT:
2408 	case RES_OBJECTDYING:
2409 		if( (void*)GetRegisteredIn() == ((SwPtrMsgPoolItem *)pOld)->pObject )
2410 			Invalidate();
2411 		break;
2412 
2413 	case RES_FMT_CHG:
2414 		// wurden wir an das neue umgehaengt und wird das alte geloscht?
2415 		if( ((SwFmtChg*)pNew)->pChangedFmt == GetRegisteredIn() &&
2416 			((SwFmtChg*)pOld)->pChangedFmt->IsFmtInDTOR() )
2417 			Invalidate();
2418 		break;
2419 	case RES_FIELD_DELETED:
2420 		if( (void*)pFmtFld == ((SwPtrMsgPoolItem *)pOld)->pObject )
2421 			Invalidate();
2422 		break;
2423 	}
2424 }
2425 
2426 const SwField*  SwXTextField::GetField() const
2427 {
2428     if ( GetRegisteredIn() && pFmtFld )
2429     {
2430         return  pFmtFld->GetField();
2431     }
2432     return 0;
2433 }
2434 
2435 /******************************************************************
2436  * SwXTextFieldMasters
2437  ******************************************************************/
2438 OUString SwXTextFieldMasters::getImplementationName(void) throw( uno::RuntimeException )
2439 {
2440 	return C2U("SwXTextFieldMasters");
2441 }
2442 
2443 sal_Bool SwXTextFieldMasters::supportsService(const OUString& rServiceName) throw( uno::RuntimeException )
2444 {
2445 	return rServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(
2446 							"com.sun.star.text.TextFieldMasters" ));
2447 }
2448 
2449 uno::Sequence< OUString > SwXTextFieldMasters::getSupportedServiceNames(void) throw( uno::RuntimeException )
2450 {
2451 	uno::Sequence< OUString > aRet(1);
2452 	OUString* pArray = aRet.getArray();
2453 	pArray[0] = C2U("com.sun.star.text.TextFieldMasters");
2454 	return aRet;
2455 }
2456 
2457 SwXTextFieldMasters::SwXTextFieldMasters(SwDoc* _pDoc) :
2458 	SwUnoCollection(_pDoc)
2459 {
2460 }
2461 
2462 SwXTextFieldMasters::~SwXTextFieldMasters()
2463 {
2464 
2465 }
2466 /*-----------------------------------------------------------------------
2467 	Iteration ueber nicht-Standard Feldtypen
2468 	USER/SETEXP/DDE/DATABASE
2469 	Der Name ist demnach:
2470     "com.sun.star.text.fieldmaster.User" + <Feltypname>
2471     "com.sun.star.text.fieldmaster.DDE" + <Feltypname>
2472     "com.sun.star.text.fieldmaster.SetExpression" + <Feltypname>
2473     "com.sun.star.text.fieldmaster.DataBase" + <Feltypname>
2474 
2475 	Falls wir grosszuegig werden wollen, dann koennte man com.sun.star.text
2476 	auch optional weglassen
2477   -----------------------------------------------------------------------*/
2478 
2479 sal_uInt16 lcl_GetIdByName( String& rName, String& rTypeName )
2480 {
2481     if( rName.EqualsAscii( COM_TEXT_FLDMASTER, 0, RTL_CONSTASCII_LENGTH(COM_TEXT_FLDMASTER ))
2482         ||  rName.EqualsAscii( COM_TEXT_FLDMASTER_CC, 0, RTL_CONSTASCII_LENGTH(COM_TEXT_FLDMASTER_CC )))
2483 		rName.Erase(0, 30);
2484 
2485 	sal_uInt16 nResId = USHRT_MAX;
2486 	xub_StrLen nFound = 0;
2487 	rTypeName = rName.GetToken( 0, '.', nFound );
2488 	if(rTypeName.EqualsAscii("User"))
2489 		nResId = RES_USERFLD;
2490 	else if(rTypeName.EqualsAscii("DDE"))
2491 		nResId = RES_DDEFLD;
2492 	else if(rTypeName.EqualsAscii("SetExpression"))
2493 	{
2494 		nResId = RES_SETEXPFLD;
2495 
2496         String sFldTypName( rName.GetToken( 1, '.' ));
2497         String sUIName( SwStyleNameMapper::GetSpecialExtraUIName( sFldTypName ) );
2498 
2499 		if( sUIName != sFldTypName )
2500 			rName.SetToken( 1, '.', sUIName );
2501 	}
2502 	else if(rTypeName.EqualsAscii("DataBase"))
2503 	{
2504 		rName.Erase( 0, RTL_CONSTASCII_LENGTH( "DataBase." ));
2505 		sal_uInt16 nDotCount = rName.GetTokenCount('.');
2506 		if( 2 <= nDotCount )
2507 		{
2508 			// #i51815#
2509 			//rName.SearchAndReplace('.', DB_DELIM);
2510 			//rName.SetChar( rName.SearchBackward( '.' ), DB_DELIM );
2511 
2512 			rName.InsertAscii( "DataBase.", 0 );
2513 			nResId = RES_DBFLD;
2514 		}
2515 	}
2516 	else if( rTypeName.EqualsAscii("Bibliography"))
2517 		nResId = RES_AUTHORITY;
2518 	return nResId;
2519 }
2520 
2521 //-----------------------------------------------------------------------------
2522 uno::Any SwXTextFieldMasters::getByName(const OUString& rName)
2523 	throw( container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException )
2524 {
2525 	vos::OGuard  aGuard(Application::GetSolarMutex());
2526 	if(!GetDoc())
2527 		throw uno::RuntimeException();
2528 
2529 	String sName(rName), sTypeName;
2530 	sal_uInt16 nResId = lcl_GetIdByName( sName, sTypeName );
2531 	if( USHRT_MAX == nResId )
2532 		throw container::NoSuchElementException();
2533 
2534 	sName.Erase(0, sTypeName.Len()+1);
2535 	SwFieldType* pType = GetDoc()->GetFldType(nResId, sName, sal_True);
2536 	if(!pType)
2537 		throw container::NoSuchElementException();
2538     SwXFieldMaster* pMaster = SwIterator<SwXFieldMaster,SwFieldType>::FirstElement( *pType );
2539 	if(!pMaster)
2540 		pMaster = new SwXFieldMaster(*pType, GetDoc());
2541 	uno::Reference< beans::XPropertySet >  aRef = pMaster;
2542 	uno::Any aRet(&aRef, ::getCppuType( static_cast<const uno::Reference<beans::XPropertySet>* >(0)));
2543 	return aRet;
2544 }
2545 
2546 sal_Bool SwXTextFieldMasters::getInstanceName(
2547 	const SwFieldType& rFldType, String& rName)
2548 {
2549 	sal_Bool bRet = sal_True;
2550 	switch( rFldType.Which() )
2551 	{
2552 	case RES_USERFLD:
2553         rName.AppendAscii( RTL_CONSTASCII_STRINGPARAM( COM_TEXT_FLDMASTER_CC ));
2554 		rName.AppendAscii( RTL_CONSTASCII_STRINGPARAM( "User."));
2555 		rName += rFldType.GetName();
2556 		break;
2557 	case RES_DDEFLD:
2558         rName.AppendAscii( RTL_CONSTASCII_STRINGPARAM( COM_TEXT_FLDMASTER_CC ));
2559 		rName.AppendAscii( RTL_CONSTASCII_STRINGPARAM( "DDE."));
2560 		rName += rFldType.GetName();
2561 		break;
2562 
2563 	case RES_SETEXPFLD:
2564         rName.AppendAscii( RTL_CONSTASCII_STRINGPARAM( COM_TEXT_FLDMASTER_CC ));
2565 		rName.AppendAscii( RTL_CONSTASCII_STRINGPARAM( "SetExpression."));
2566         rName += String( SwStyleNameMapper::GetSpecialExtraProgName( rFldType.GetName() ) );
2567 		break;
2568 
2569 	case RES_DBFLD:
2570 		{
2571             rName.AppendAscii( RTL_CONSTASCII_STRINGPARAM( COM_TEXT_FLDMASTER_CC ));
2572 			rName.AppendAscii( RTL_CONSTASCII_STRINGPARAM( "DataBase."));
2573 			String sDBName(rFldType.GetName());
2574 			sDBName.SearchAndReplaceAll(DB_DELIM, '.');
2575 			rName += sDBName;
2576 		}
2577 		break;
2578 
2579 	case RES_AUTHORITY:
2580         rName.AppendAscii( RTL_CONSTASCII_STRINGPARAM( COM_TEXT_FLDMASTER_CC ));
2581 		rName.AppendAscii( RTL_CONSTASCII_STRINGPARAM( "Bibliography"));
2582 		break;
2583 
2584 	default:
2585 		bRet = sal_False;
2586 	}
2587 
2588 	return bRet;
2589 }
2590 
2591 
2592 uno::Sequence< OUString > SwXTextFieldMasters::getElementNames(void)
2593 	throw( uno::RuntimeException )
2594 {
2595 	vos::OGuard  aGuard(Application::GetSolarMutex());
2596 	if(!GetDoc())
2597 		throw uno::RuntimeException();
2598 
2599 	const SwFldTypes* pFldTypes = GetDoc()->GetFldTypes();
2600 	sal_uInt16 nCount = pFldTypes->Count();
2601 
2602 	SvStrings aFldNames;
2603 	String* pString = new String();
2604 	sal_uInt16 i;
2605 
2606 	for( i = 0; i < nCount; i++)
2607 	{
2608 		SwFieldType& rFldType = *((*pFldTypes)[i]);
2609 
2610 		if (SwXTextFieldMasters::getInstanceName(rFldType, *pString))
2611 		{
2612 			aFldNames.Insert(pString, aFldNames.Count());
2613 			pString = new String();
2614 		}
2615 	}
2616 	delete pString;
2617 
2618 	uno::Sequence< OUString > aSeq(aFldNames.Count());
2619 	OUString* pArray = aSeq.getArray();
2620 	for(i = 0; i < aFldNames.Count();i++)
2621 	{
2622 		pArray[i] = *aFldNames.GetObject(i);
2623 	}
2624 	aFldNames.DeleteAndDestroy(0, aFldNames.Count());
2625 
2626 	return aSeq;
2627 
2628 }
2629 
2630 sal_Bool SwXTextFieldMasters::hasByName(const OUString& rName) throw( uno::RuntimeException )
2631 {
2632 	vos::OGuard  aGuard(Application::GetSolarMutex());
2633 	if(!GetDoc())
2634 		throw uno::RuntimeException();
2635 
2636 	String sName(rName), sTypeName;
2637 	sal_uInt16 nResId = lcl_GetIdByName( sName, sTypeName );
2638     sal_Bool bRet = sal_False;
2639     if( USHRT_MAX != nResId )
2640     {
2641         sName.Erase(0, sTypeName.Len()+1);
2642         bRet = USHRT_MAX != nResId && 0 != GetDoc()->GetFldType(nResId, sName, sal_True);
2643     }
2644 	return bRet;
2645 }
2646 
2647 uno::Type  SwXTextFieldMasters::getElementType(void) throw( uno::RuntimeException )
2648 {
2649 	return ::getCppuType(static_cast<const uno::Reference<beans::XPropertySet>*>(0));
2650 
2651 }
2652 
2653 sal_Bool SwXTextFieldMasters::hasElements(void) throw( uno::RuntimeException )
2654 {
2655 	vos::OGuard  aGuard(Application::GetSolarMutex());
2656 	if(!IsValid())
2657 		throw uno::RuntimeException();
2658 	return sal_True;
2659 }
2660 
2661 /******************************************************************
2662  *
2663  ******************************************************************/
2664 
2665 OUString SwXTextFieldTypes::getImplementationName(void) throw( uno::RuntimeException )
2666 {
2667 	return C2U("SwXTextFieldTypes");
2668 }
2669 
2670 sal_Bool SwXTextFieldTypes::supportsService(const OUString& rServiceName) throw( uno::RuntimeException )
2671 {
2672 	return rServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(
2673 							"com.sun.star.text.TextFields" ));
2674 }
2675 
2676 uno::Sequence< OUString > SwXTextFieldTypes::getSupportedServiceNames(void) throw( uno::RuntimeException )
2677 {
2678 	uno::Sequence< OUString > aRet(1);
2679 	OUString* pArray = aRet.getArray();
2680 	pArray[0] = C2U("com.sun.star.text.TextFields");
2681 	return aRet;
2682 }
2683 
2684 SwXTextFieldTypes::SwXTextFieldTypes(SwDoc* _pDoc) :
2685     SwUnoCollection (_pDoc),
2686     aRefreshCont    ( static_cast< XEnumerationAccess * >(this) )
2687 {
2688 }
2689 
2690 SwXTextFieldTypes::~SwXTextFieldTypes()
2691 {
2692 }
2693 
2694 void SwXTextFieldTypes::Invalidate()
2695 {
2696     SwUnoCollection::Invalidate();
2697 	aRefreshCont.Disposing();
2698 }
2699 
2700 uno::Reference< container::XEnumeration >  SwXTextFieldTypes::createEnumeration(void)
2701 	throw( uno::RuntimeException )
2702 {
2703 	vos::OGuard  aGuard(Application::GetSolarMutex());
2704 	if(!IsValid())
2705 		throw uno::RuntimeException();
2706 	return new SwXFieldEnumeration(GetDoc());
2707 }
2708 
2709 
2710 uno::Type  SwXTextFieldTypes::getElementType(void) throw( uno::RuntimeException )
2711 {
2712 	return ::getCppuType(static_cast<const uno::Reference<text::XDependentTextField>*>(0));
2713 }
2714 
2715 sal_Bool SwXTextFieldTypes::hasElements(void) throw( uno::RuntimeException )
2716 {
2717 	vos::OGuard  aGuard(Application::GetSolarMutex());
2718 	if(!IsValid())
2719 		throw uno::RuntimeException();
2720 	//es gibt sie immer
2721 	return sal_True;
2722 }
2723 
2724 void SwXTextFieldTypes::refresh(void)  throw( uno::RuntimeException )
2725 {
2726 	vos::OGuard  aGuard(Application::GetSolarMutex());
2727 	if(!IsValid())
2728 		throw uno::RuntimeException();
2729 	UnoActionContext aContext(GetDoc());
2730 	SwDocStat aDocStat;
2731 	GetDoc()->UpdateDocStat(aDocStat);
2732 	GetDoc()->UpdateFlds(0, sal_False);
2733 
2734     // call refresh listeners
2735     aRefreshCont.Refreshed();
2736 }
2737 
2738 void SwXTextFieldTypes::addRefreshListener(const uno::Reference< util::XRefreshListener > & l)
2739 	throw( uno::RuntimeException )
2740 {
2741 	::vos::OGuard aGuard(Application::GetSolarMutex());
2742 	if ( !IsValid() )
2743 		throw uno::RuntimeException();
2744 	aRefreshCont.AddListener ( reinterpret_cast < const uno::Reference < lang::XEventListener > &> ( l ));
2745 }
2746 
2747 void SwXTextFieldTypes::removeRefreshListener(const uno::Reference< util::XRefreshListener > & l)
2748 	 throw( uno::RuntimeException )
2749 {
2750 	::vos::OGuard aGuard(Application::GetSolarMutex());
2751 	if ( !IsValid() || !aRefreshCont.RemoveListener ( reinterpret_cast < const uno::Reference < lang::XEventListener > &> ( l ) ) )
2752 		throw uno::RuntimeException();
2753 }
2754 /******************************************************************
2755  * SwXFieldEnumeration
2756  ******************************************************************/
2757 
2758 OUString SwXFieldEnumeration::getImplementationName(void) throw( uno::RuntimeException )
2759 {
2760 	return C2U("SwXFieldEnumeration");
2761 }
2762 
2763 sal_Bool SwXFieldEnumeration::supportsService(const OUString& rServiceName) throw( uno::RuntimeException )
2764 {
2765 	return rServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(
2766 							"com.sun.star.text.FieldEnumeration" ));
2767 }
2768 
2769 uno::Sequence< OUString > SwXFieldEnumeration::getSupportedServiceNames(void) throw( uno::RuntimeException )
2770 {
2771 	uno::Sequence< OUString > aRet(1);
2772 	OUString* pArray = aRet.getArray();
2773 	pArray[0] = C2U("com.sun.star.text.FieldEnumeration");
2774 	return aRet;
2775 }
2776 
2777 SwXFieldEnumeration::SwXFieldEnumeration(SwDoc* pDc) :
2778     nNextIndex(0),
2779 	pDoc(pDc)
2780 {
2781 	pDoc->GetPageDescFromPool(RES_POOLPAGE_STANDARD)->Add(this);
2782 
2783     // build sequence
2784     sal_Int32 nSize = 32;
2785     aItems.realloc( nSize );
2786     uno::Reference< text::XTextField > *pItems = aItems.getArray();
2787     sal_Int32 nFillPos = 0;
2788     //
2789     const SwFldTypes* pFldTypes = pDoc->GetFldTypes();
2790     sal_uInt16 nCount = pFldTypes->Count();
2791     for(sal_uInt16 nType = 0;  nType < nCount;  ++nType)
2792     {
2793         const SwFieldType *pCurType = pFldTypes->GetObject(nType);
2794         SwIterator<SwFmtFld,SwFieldType> aIter( *pCurType );
2795         const SwFmtFld* pCurFldFmt = aIter.First();
2796         while (pCurFldFmt)
2797         {
2798             const SwTxtFld *pTxtFld = pCurFldFmt->GetTxtFld();
2799             // skip fields that are currently not in the document
2800             // e.g. fields in undo or redo array
2801             sal_Bool bSkip = !pTxtFld ||
2802                          !pTxtFld->GetpTxtNode()->GetNodes().IsDocNodes();
2803             if (!bSkip)
2804                 pItems[ nFillPos++ ] = new SwXTextField(*pCurFldFmt, pDoc);
2805             pCurFldFmt = aIter.Next();
2806 
2807             // enlarge sequence if necessary
2808             if (aItems.getLength() == nFillPos)
2809             {
2810                 aItems.realloc( 2 * aItems.getLength() );
2811                 pItems = aItems.getArray();
2812             }
2813         }
2814     }
2815     // now handle meta-fields, which are not SwFields
2816     const ::std::vector< uno::Reference<text::XTextField> > MetaFields(
2817            pDc->GetMetaFieldManager().getMetaFields() );
2818     for (size_t i = 0; i < MetaFields.size(); ++i)
2819     {
2820         pItems[ nFillPos ] = MetaFields[i];
2821         nFillPos++;
2822 
2823         //FIXME UGLY
2824         // enlarge sequence if necessary
2825         if (aItems.getLength() == nFillPos)
2826         {
2827             aItems.realloc( 2 * aItems.getLength() );
2828             pItems = aItems.getArray();
2829         }
2830     }
2831     // resize sequence to actual used size
2832     aItems.realloc( nFillPos );
2833 }
2834 
2835 SwXFieldEnumeration::~SwXFieldEnumeration()
2836 {
2837 
2838 }
2839 
2840 sal_Bool SwXFieldEnumeration::hasMoreElements(void)
2841     throw( uno::RuntimeException )
2842 {
2843 	vos::OGuard  aGuard(Application::GetSolarMutex());
2844     return nNextIndex < aItems.getLength();
2845 }
2846 
2847 uno::Any SwXFieldEnumeration::nextElement(void)
2848 	throw( container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException )
2849 {
2850 	vos::OGuard  aGuard(Application::GetSolarMutex());
2851 
2852     if (!(nNextIndex < aItems.getLength()))
2853         throw container::NoSuchElementException();
2854 
2855 #if OSL_DEBUG_LEVEL > 1
2856     uno::Reference< text::XTextField > *pItems = aItems.getArray();
2857     (void)pItems;
2858 #endif
2859     uno::Reference< text::XTextField >  &rxFld = aItems.getArray()[ nNextIndex++ ];
2860     uno::Any aRet(&rxFld, ::getCppuType(static_cast<const uno::Reference<text::XTextField>*>(0)));
2861     rxFld = 0;  // free memory for item that is not longer used
2862     return aRet;
2863 }
2864 
2865 void SwXFieldEnumeration::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew)
2866 {
2867 	ClientModify(this, pOld, pNew);
2868 	if(!GetRegisteredIn())
2869 		pDoc = 0;
2870 }
2871 
2872 
2873 String& GetString( const uno::Any& rAny, String& rStr )
2874 {
2875 	OUString aStr;
2876 	rAny >>= aStr;
2877 	rStr = String( aStr );
2878 	return rStr;
2879 }
2880