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