xref: /AOO41X/main/sw/source/core/unocore/unofield.cxx (revision 54628ca40d27d15cc98fe861da7fff7e60c2f7d6)
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.GetFld()->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->GetFld() ) ),
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->GetFld()->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((SwInputFieldType*)pFldType,
1626                                      m_pProps->sPar1, m_pProps->sPar2,
1627                                      nInpSubType);
1628                 pTxtField->SetHelp(m_pProps->sPar3);
1629                 pTxtField->SetToolTip(m_pProps->sPar4);
1630 
1631                 pFld = pTxtField;
1632             }
1633             break;
1634             case SW_SERVICE_FIELDTYPE_MACRO:
1635             {
1636                 SwFieldType* pFldType = pDoc->GetSysFldType(RES_MACROFLD);
1637                 String aName;
1638 
1639                 // support for Scripting Framework macros
1640                 if (m_pProps->sPar4.Len() != 0)
1641                 {
1642                     aName = m_pProps->sPar4;
1643                 }
1644                 else
1645                 {
1646                     SwMacroField::CreateMacroString(
1647                         aName, m_pProps->sPar1, m_pProps->sPar3 );
1648                 }
1649                 pFld = new SwMacroField((SwMacroFieldType*)pFldType, aName,
1650                                         m_pProps->sPar2);
1651             }
1652             break;
1653             case SW_SERVICE_FIELDTYPE_PAGE_COUNT            :
1654             case SW_SERVICE_FIELDTYPE_PARAGRAPH_COUNT       :
1655             case SW_SERVICE_FIELDTYPE_WORD_COUNT            :
1656             case SW_SERVICE_FIELDTYPE_CHARACTER_COUNT       :
1657             case SW_SERVICE_FIELDTYPE_TABLE_COUNT           :
1658             case SW_SERVICE_FIELDTYPE_GRAPHIC_OBJECT_COUNT  :
1659             case SW_SERVICE_FIELDTYPE_EMBEDDED_OBJECT_COUNT :
1660             {
1661                 sal_uInt16 nSubType = DS_PAGE;
1662                 switch(m_nServiceId)
1663                 {
1664 //                  case SW_SERVICE_FIELDTYPE_PAGE_COUNT            : break;
1665                     case SW_SERVICE_FIELDTYPE_PARAGRAPH_COUNT       : nSubType = DS_PARA;break;
1666                     case SW_SERVICE_FIELDTYPE_WORD_COUNT            : nSubType = DS_WORD;break;
1667                     case SW_SERVICE_FIELDTYPE_CHARACTER_COUNT       : nSubType = DS_CHAR;break;
1668                     case SW_SERVICE_FIELDTYPE_TABLE_COUNT           : nSubType = DS_TBL;break;
1669                     case SW_SERVICE_FIELDTYPE_GRAPHIC_OBJECT_COUNT  : nSubType = DS_GRF;break;
1670                     case SW_SERVICE_FIELDTYPE_EMBEDDED_OBJECT_COUNT : nSubType = DS_OLE;break;
1671                 }
1672                 SwFieldType* pFldType = pDoc->GetSysFldType(RES_DOCSTATFLD);
1673                 pFld = new SwDocStatField((SwDocStatFieldType*)pFldType, nSubType, m_pProps->nUSHORT2);
1674             }
1675             break;
1676             case SW_SERVICE_FIELDTYPE_BIBLIOGRAPHY:
1677                 pFld = new SwAuthorityField( (SwAuthorityFieldType*)
1678                         pDoc->InsertFldType(SwAuthorityFieldType(pDoc)),
1679                         aEmptyStr );
1680                 if(m_pProps->aPropSeq.getLength())
1681                 {
1682                     uno::Any aVal; aVal <<= m_pProps->aPropSeq;
1683                     pFld->PutValue( aVal, FIELD_PROP_PROP_SEQ );
1684                 }
1685                 break;
1686             case SW_SERVICE_FIELDTYPE_COMBINED_CHARACTERS:
1687                 // create field
1688                 pFld = new SwCombinedCharField( (SwCombinedCharFieldType*)
1689                             pDoc->GetSysFldType(RES_COMBINED_CHARS),
1690                             m_pProps->sPar1);
1691                 break;
1692             case SW_SERVICE_FIELDTYPE_DROPDOWN:
1693                 pFld = new SwDropDownField
1694                     ((SwDropDownFieldType *)
1695                      pDoc->GetSysFldType(RES_DROPDOWN));
1696 
1697                 ((SwDropDownField *) pFld)->SetItems(m_pProps->aStrings);
1698                 ((SwDropDownField *) pFld)->SetSelectedItem(m_pProps->sPar1);
1699                 ((SwDropDownField *) pFld)->SetName(m_pProps->sPar2);
1700                 ((SwDropDownField *) pFld)->SetHelp(m_pProps->sPar3);
1701                 ((SwDropDownField *) pFld)->SetToolTip(m_pProps->sPar4);
1702                 break;
1703 
1704             case SW_SERVICE_FIELDTYPE_TABLE_FORMULA :
1705             {
1706 
1707                 // create field
1708                 sal_uInt16 nType = nsSwGetSetExpType::GSE_FORMULA;
1709                 if(m_pProps->bBool1)
1710                 {
1711                     nType |= nsSwExtendedSubType::SUB_CMD;
1712                     if(m_pProps->bFormatIsDefault)
1713                         m_pProps->nFormat = -1;
1714                 }
1715                 pFld = new SwTblField( (SwTblFieldType*)
1716                     pDoc->GetSysFldType(RES_TABLEFLD),
1717                     m_pProps->sPar2,
1718                     nType,
1719                     m_pProps->nFormat);
1720                ((SwTblField*)pFld)->ChgExpStr(m_pProps->sPar1);
1721             }
1722             break;
1723             default: DBG_ERROR("was ist das fuer ein Typ?");
1724         }
1725         if(pFld)
1726         {
1727             pFld->SetAutomaticLanguage(!m_pProps->bBool4);
1728             SwFmtFld aFmt( *pFld );
1729 
1730             UnoActionContext aCont(pDoc);
1731             SwTxtAttr* pTxtAttr = 0;
1732             if(aPam.HasMark())
1733                 pDoc->DeleteAndJoin(aPam);
1734 
1735             SwXTextCursor const*const pTextCursor(
1736                     dynamic_cast<SwXTextCursor*>(pCursor));
1737             const bool bForceExpandHints( (pTextCursor)
1738                     ? pTextCursor->IsAtEndOfMeta() : false );
1739             const SetAttrMode nInsertFlags = (bForceExpandHints)
1740                 ? nsSetAttrMode::SETATTR_FORCEHINTEXPAND
1741                 : nsSetAttrMode::SETATTR_DEFAULT;
1742 
1743             pDoc->InsertPoolItem(aPam, aFmt, nInsertFlags);
1744 
1745             pTxtAttr = aPam.GetNode()->GetTxtNode()->GetTxtAttrForCharAt(
1746                     aPam.GetPoint()->nContent.GetIndex()-1, RES_TXTATR_FIELD);
1747 
1748             // was passiert mit dem Update der Felder ? (siehe fldmgr.cxx)
1749             if(pTxtAttr)
1750             {
1751                 const SwFmtFld& rFld = pTxtAttr->GetFld();
1752                 pFmtFld = &rFld;
1753             }
1754         }
1755         delete pFld;
1756 
1757         m_pDoc = pDoc;
1758         m_pDoc->GetUnoCallBack()->Add(this);
1759         m_bIsDescriptor = sal_False;
1760         if(m_aFieldTypeClient.GetRegisteredIn())
1761             const_cast<SwModify*>(m_aFieldTypeClient.GetRegisteredIn())->Remove(&m_aFieldTypeClient);
1762         DELETEZ(m_pProps);
1763         if(m_bCallUpdate)
1764             update();
1765     }
1766     else
1767         throw lang::IllegalArgumentException();
1768 }
1769 
1770 void SwXTextField::attach(const uno::Reference< text::XTextRange > & xTextRange)
1771     throw( lang::IllegalArgumentException, uno::RuntimeException )
1772 {
1773     vos::OGuard aGuard(Application::GetSolarMutex());
1774     attachToRange( xTextRange );
1775 }
1776 
1777 uno::Reference< text::XTextRange >  SwXTextField::getAnchor(void) throw( uno::RuntimeException )
1778 {
1779     vos::OGuard  aGuard(Application::GetSolarMutex());
1780     uno::Reference< text::XTextRange >   aRef;
1781     SwField* pField = (SwField*)GetField();
1782     if(pField)
1783     {
1784         const SwTxtFld* pTxtFld = pFmtFld->GetTxtFld();
1785         if(!pTxtFld)
1786             throw uno::RuntimeException();
1787         const SwTxtNode& rTxtNode = pTxtFld->GetTxtNode();
1788 
1789         SwPaM aPam(rTxtNode, *pTxtFld->GetStart() + 1, rTxtNode, *pTxtFld->GetStart());
1790 
1791         aRef = SwXTextRange::CreateXTextRange(
1792                 *m_pDoc, *aPam.GetPoint(), aPam.GetMark());
1793     }
1794     return aRef;
1795 
1796 }
1797 
1798 void SwXTextField::dispose(void) throw( uno::RuntimeException )
1799 {
1800     vos::OGuard  aGuard(Application::GetSolarMutex());
1801     SwField* pField = (SwField*)GetField();
1802     if(pField)
1803     {
1804         UnoActionContext aContext(GetDoc());
1805         const SwTxtFld* pTxtFld = pFmtFld->GetTxtFld();
1806         SwTxtNode& rTxtNode = (SwTxtNode&)*pTxtFld->GetpTxtNode();
1807         SwPaM aPam(rTxtNode, *pTxtFld->GetStart());
1808         aPam.SetMark();
1809         aPam.Move();
1810         GetDoc()->DeleteAndJoin(aPam);
1811     }
1812 
1813     if ( m_pTextObject )
1814     {
1815         m_pTextObject->DisposeEditSource();
1816         m_pTextObject->release();
1817         m_pTextObject = 0;
1818     }
1819 }
1820 
1821 void SwXTextField::addEventListener(const uno::Reference< lang::XEventListener > & aListener) throw( uno::RuntimeException )
1822 {
1823     if(!GetRegisteredIn())
1824         throw uno::RuntimeException();
1825     aLstnrCntnr.AddListener(aListener);
1826 }
1827 
1828 void SwXTextField::removeEventListener(const uno::Reference< lang::XEventListener > & aListener) throw( uno::RuntimeException )
1829 {
1830     if(!GetRegisteredIn() || !aLstnrCntnr.RemoveListener(aListener))
1831         throw uno::RuntimeException();
1832 }
1833 
1834 uno::Reference< beans::XPropertySetInfo >  SwXTextField::getPropertySetInfo(void)
1835         throw( uno::RuntimeException )
1836 {
1837     vos::OGuard  aGuard(Application::GetSolarMutex());
1838     //kein static
1839     uno::Reference< beans::XPropertySetInfo >  aRef;
1840     if(m_nServiceId != USHRT_MAX)
1841     {
1842         const SfxItemPropertySet* pPropSet = aSwMapProvider.GetPropertySet(
1843                         lcl_GetPropertyMapOfService( m_nServiceId ));
1844         uno::Reference< beans::XPropertySetInfo >  xInfo = pPropSet->getPropertySetInfo();
1845         // extend PropertySetInfo!
1846         const uno::Sequence<beans::Property> aPropSeq = xInfo->getProperties();
1847         aRef = new SfxExtItemPropertySetInfo(
1848             aSwMapProvider.GetPropertyMapEntries(PROPERTY_MAP_PARAGRAPH_EXTENSIONS),
1849             aPropSeq );
1850     }
1851     else
1852         throw uno::RuntimeException();
1853     return aRef;
1854 }
1855 
1856 void SwXTextField::setPropertyValue(const OUString& rPropertyName, const uno::Any& rValue)
1857     throw( beans::UnknownPropertyException, beans::PropertyVetoException, lang::IllegalArgumentException,
1858         lang::WrappedTargetException, uno::RuntimeException )
1859 {
1860     vos::OGuard  aGuard(Application::GetSolarMutex());
1861     SwField* pField = (SwField*)GetField();
1862     const SfxItemPropertySet* _pPropSet = aSwMapProvider.GetPropertySet(
1863                                 lcl_GetPropertyMapOfService( m_nServiceId));
1864     const SfxItemPropertySimpleEntry*   pEntry = _pPropSet->getPropertyMap()->getByName(rPropertyName);
1865 
1866     if (!pEntry)
1867         throw beans::UnknownPropertyException(OUString ( RTL_CONSTASCII_USTRINGPARAM ( "Unknown property: " ) ) + rPropertyName, static_cast < cppu::OWeakObject * > ( this ) );
1868     if ( pEntry->nFlags & beans::PropertyAttribute::READONLY)
1869         throw beans::PropertyVetoException ( OUString ( RTL_CONSTASCII_USTRINGPARAM ( "Property is read-only: " ) ) + rPropertyName, static_cast < cppu::OWeakObject * > ( this ) );
1870 
1871     if(pField)
1872     {
1873         // Sonderbehandlung Serienbrieffeld
1874         sal_uInt16 nWhich = pField->Which();
1875         if( RES_DBFLD == nWhich &&
1876             (rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_DATA_BASE_NAME)) ||
1877             rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_DATA_BASE_URL))||
1878             rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_DATA_TABLE_NAME))||
1879             rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_DATA_COLUMN_NAME))))
1880         {
1881             // hier muss ein neuer Feldtyp angelegt werden und
1882             // das Feld an den neuen Typ umgehaengt werden
1883             DBG_WARNING("not implemented");
1884         }
1885         else
1886         {
1887             // -> #111840#
1888             SwDoc * pDoc = GetDoc();
1889 
1890             if (NULL != pDoc)
1891             {
1892                 const SwTxtFld* pTxtFld = pFmtFld->GetTxtFld();
1893                 if(!pTxtFld)
1894                     throw uno::RuntimeException();
1895                 SwPosition aPosition( pTxtFld->GetTxtNode() );
1896                 aPosition.nContent = *pTxtFld->GetStart();
1897                 pDoc->PutValueToField( aPosition, rValue, pEntry->nWID);
1898             }
1899             // <- #111840#
1900         }
1901         pField->PutValue( rValue, pEntry->nWID );
1902 
1903     //#i100374# notify SwPostIt about new field content
1904     if (RES_POSTITFLD== nWhich && pFmtFld)
1905     {
1906         const_cast<SwFmtFld*>(pFmtFld)->Broadcast(SwFmtFldHint( 0, SWFMTFLD_CHANGED ));
1907     }
1908 
1909         //#114571# changes of the expanded string have to be notified
1910         //#to the SwTxtFld
1911         if(RES_DBFLD == nWhich && pFmtFld->GetTxtFld())
1912         {
1913             pFmtFld->GetTxtFld()->Expand();
1914         }
1915 
1916     //#i100374# changing a document field should set the modify flag
1917     SwDoc* pDoc = GetDoc();
1918     if (pDoc)
1919         pDoc->SetModified();
1920 
1921     }
1922     else if(m_pProps)
1923     {
1924         String* pStr = 0;
1925         sal_Bool* pBool = 0;
1926         switch(pEntry->nWID)
1927         {
1928         case FIELD_PROP_PAR1:
1929             pStr = &m_pProps->sPar1;
1930             break;
1931         case FIELD_PROP_PAR2:
1932             pStr = &m_pProps->sPar2;
1933             break;
1934         case FIELD_PROP_PAR3:
1935             pStr = &m_pProps->sPar3;
1936             break;
1937         case FIELD_PROP_PAR4:
1938             pStr = &m_pProps->sPar4;
1939             break;
1940         case FIELD_PROP_FORMAT:
1941             rValue >>= m_pProps->nFormat;
1942             m_pProps->bFormatIsDefault = sal_False;
1943             break;
1944         case FIELD_PROP_SUBTYPE:
1945             m_pProps->nSubType = SWUnoHelper::GetEnumAsInt32( rValue );
1946             break;
1947         case FIELD_PROP_BYTE1 :
1948             rValue >>= m_pProps->nByte1;
1949             break;
1950         case FIELD_PROP_BOOL1 :
1951             pBool = &m_pProps->bBool1;
1952             break;
1953         case FIELD_PROP_BOOL2 :
1954             pBool = &m_pProps->bBool2;
1955             break;
1956         case FIELD_PROP_BOOL3 :
1957             pBool = &m_pProps->bBool3;
1958             break;
1959         case FIELD_PROP_BOOL4:
1960             pBool = &m_pProps->bBool4;
1961         break;
1962         case FIELD_PROP_DATE :
1963         {
1964             if(rValue.getValueType() != ::getCppuType(static_cast<const util::Date*>(0)))
1965                 throw lang::IllegalArgumentException();
1966 
1967             util::Date aTemp = *(const util::Date*)rValue.getValue();
1968             m_pProps->aDate = Date(aTemp.Day, aTemp.Month, aTemp.Year);
1969         }
1970         break;
1971         case FIELD_PROP_USHORT1:
1972         case FIELD_PROP_USHORT2:
1973             {
1974                 sal_Int16 nVal = 0;
1975                 rValue >>= nVal;
1976                 if( FIELD_PROP_USHORT1 == pEntry->nWID)
1977                     m_pProps->nUSHORT1 = nVal;
1978                 else
1979                     m_pProps->nUSHORT2 = nVal;
1980             }
1981             break;
1982         case FIELD_PROP_SHORT1:
1983             rValue >>= m_pProps->nSHORT1;
1984             break;
1985         case FIELD_PROP_DOUBLE:
1986             if(rValue.getValueType() != ::getCppuType(static_cast<const double*>(0)))
1987                 throw lang::IllegalArgumentException();
1988             m_pProps->fDouble = *(double*)rValue.getValue();
1989             break;
1990 
1991         case FIELD_PROP_DATE_TIME :
1992             if(!m_pProps->pDateTime)
1993                 m_pProps->pDateTime = new util::DateTime;
1994             rValue >>= (*m_pProps->pDateTime);
1995             break;
1996         case FIELD_PROP_PROP_SEQ:
1997             rValue >>= m_pProps->aPropSeq;
1998             break;
1999         case FIELD_PROP_STRINGS:
2000             rValue >>= m_pProps->aStrings;
2001             break;
2002         }
2003         if( pStr )
2004             ::GetString( rValue, *pStr );
2005         else if( pBool )
2006         {
2007             if( rValue.getValueType() == getCppuBooleanType() )
2008                 *pBool = *(sal_Bool*)rValue.getValue();
2009             else
2010                 throw lang::IllegalArgumentException();
2011         }
2012     }
2013     else
2014         throw uno::RuntimeException();
2015 }
2016 
2017 uno::Any SwXTextField::getPropertyValue(const OUString& rPropertyName)
2018     throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
2019 {
2020     vos::OGuard  aGuard(Application::GetSolarMutex());
2021     uno::Any aRet;
2022     const SwField* pField = GetField();
2023     const SfxItemPropertySet* _pPropSet = aSwMapProvider.GetPropertySet(
2024                                 lcl_GetPropertyMapOfService( m_nServiceId));
2025     const SfxItemPropertySimpleEntry*   pEntry = _pPropSet->getPropertyMap()->getByName(rPropertyName);
2026     if(!pEntry )
2027     {
2028         const SfxItemPropertySet* _pParaPropSet = aSwMapProvider.GetPropertySet(PROPERTY_MAP_PARAGRAPH_EXTENSIONS);
2029         pEntry = _pParaPropSet->getPropertyMap()->getByName(rPropertyName);
2030     }
2031     if (!pEntry)
2032         throw beans::UnknownPropertyException(OUString ( RTL_CONSTASCII_USTRINGPARAM ( "Unknown property: " ) ) + rPropertyName, static_cast < cppu::OWeakObject * > ( this ) );
2033 
2034     switch( pEntry->nWID )
2035     {
2036     case FN_UNO_TEXT_WRAP:
2037         aRet <<= text::WrapTextMode_NONE;
2038         break;
2039     case FN_UNO_ANCHOR_TYPE:
2040         aRet <<= text::TextContentAnchorType_AS_CHARACTER;
2041         break;
2042     case FN_UNO_ANCHOR_TYPES:
2043         {
2044             uno::Sequence<text::TextContentAnchorType> aTypes(1);
2045             text::TextContentAnchorType* pArray = aTypes.getArray();
2046             pArray[0] = text::TextContentAnchorType_AS_CHARACTER;
2047             aRet.setValue(&aTypes, ::getCppuType(static_cast<uno::Sequence<text::TextContentAnchorType>*>(0)));
2048         }
2049         break;
2050 
2051     default:
2052         if( pField )
2053         {
2054             if (FIELD_PROP_IS_FIELD_USED      == pEntry->nWID ||
2055                 FIELD_PROP_IS_FIELD_DISPLAYED == pEntry->nWID)
2056             {
2057                 sal_Bool bIsFieldUsed       = sal_False;
2058                 sal_Bool bIsFieldDisplayed  = sal_False;
2059 
2060                 // in order to have the information about fields
2061                 // correctly evaluated the document needs a layout
2062                 // (has to be already formatted)
2063                 SwDoc *pDoc = GetDoc();
2064                 ViewShell *pViewShell = 0;
2065                 SwEditShell *pEditShell = pDoc ? pDoc->GetEditShell( &pViewShell ) : 0;
2066                 if (pEditShell)
2067                     pEditShell->CalcLayout();
2068                 else if (pViewShell) // a page preview has no SwEditShell it should only have a view shell
2069                     pViewShell->CalcLayout();
2070                 else
2071                     throw uno::RuntimeException();
2072 
2073                 // get text node for the text field
2074                 const SwFmtFld *pFldFmt = GetFldFmt();
2075                 const SwTxtFld* pTxtFld = pFldFmt ? pFmtFld->GetTxtFld() : 0;
2076                 if(!pTxtFld)
2077                     throw uno::RuntimeException();
2078                 const SwTxtNode& rTxtNode = pTxtFld->GetTxtNode();
2079 
2080                 // skip fields that are currently not in the document
2081                 // e.g. fields in undo or redo array
2082                 if (rTxtNode.GetNodes().IsDocNodes())
2083                 {
2084                     sal_Bool bFrame = 0 != rTxtNode.FindLayoutRect().Width(); // oder so
2085                     sal_Bool bHidden = rTxtNode.IsHidden();
2086                     if ( !bHidden )
2087                     {
2088                         xub_StrLen nHiddenStart;
2089                         xub_StrLen nHiddenEnd;
2090 
2091                         SwPosition aPosition( pTxtFld->GetTxtNode() );
2092                         aPosition.nContent = *pTxtFld->GetStart();
2093 
2094                         bHidden = SwScriptInfo::GetBoundsOfHiddenRange( pTxtFld->GetTxtNode(),
2095                                         *pTxtFld->GetStart(),
2096                                         nHiddenStart, nHiddenEnd );
2097                     }
2098 
2099                     // !bFrame && !bHidden: aller Wahrscheinlichkeit handelt es
2100                     // sich um ein Feld in einem unbenutzten Seitenstyle
2101                     //
2102                     // bHidden: Feld ist versteckt
2103                     // FME: Problem: Verstecktes Feld in unbenutzter Seitenvorlage =>
2104                     // bIsFieldUsed = true
2105                     // bIsFieldDisplayed = false
2106                     bIsFieldUsed       = bFrame || bHidden;
2107                     bIsFieldDisplayed  = bIsFieldUsed && !bHidden;
2108                 }
2109                 sal_Bool bRetVal = (FIELD_PROP_IS_FIELD_USED == pEntry->nWID) ?
2110                                             bIsFieldUsed : bIsFieldDisplayed;
2111                 aRet.setValue( &bRetVal, ::getCppuBooleanType() );
2112             }
2113             else
2114                 pField->QueryValue( aRet, pEntry->nWID );
2115         }
2116         else if( m_pProps )     // currently just a descriptor...
2117         {
2118             switch(pEntry->nWID)
2119             {
2120             case FIELD_PROP_TEXT:
2121                 {
2122                     if (!m_pTextObject)
2123                     {
2124                         SwTextAPIEditSource* pObj = new SwTextAPIEditSource( m_pDoc );
2125                         m_pTextObject = new SwTextAPIObject( pObj );
2126                         m_pTextObject->acquire();
2127                     }
2128 
2129                     uno::Reference < text::XText > xText( m_pTextObject  );
2130                     aRet <<= xText;
2131                     break;
2132                 }
2133             case FIELD_PROP_PAR1:
2134                 aRet <<= OUString(m_pProps->sPar1);
2135                 break;
2136             case FIELD_PROP_PAR2:
2137                 aRet <<= OUString(m_pProps->sPar2);
2138                 break;
2139             case FIELD_PROP_PAR3:
2140                 aRet <<= OUString(m_pProps->sPar3);
2141                 break;
2142             case FIELD_PROP_PAR4:
2143                 aRet <<= OUString(m_pProps->sPar4);
2144                 break;
2145             case FIELD_PROP_FORMAT:
2146                 aRet <<= m_pProps->nFormat;
2147                 break;
2148             case FIELD_PROP_SUBTYPE:
2149                 aRet <<= m_pProps->nSubType;
2150                 break;
2151             case FIELD_PROP_BYTE1 :
2152                 aRet <<= m_pProps->nByte1;
2153                 break;
2154             case FIELD_PROP_BOOL1 :
2155                 aRet.setValue(&m_pProps->bBool1, ::getCppuBooleanType());
2156                 break;
2157             case FIELD_PROP_BOOL2 :
2158                 aRet.setValue(&m_pProps->bBool2, ::getCppuBooleanType());
2159                 break;
2160             case FIELD_PROP_BOOL3 :
2161                 aRet.setValue(&m_pProps->bBool3, ::getCppuBooleanType());
2162                 break;
2163             case FIELD_PROP_BOOL4 :
2164                 aRet.setValue(&m_pProps->bBool4, ::getCppuBooleanType());
2165                 break;
2166             case FIELD_PROP_DATE :
2167                 aRet.setValue(&m_pProps->aDate, ::getCppuType(static_cast<const util::Date*>(0)));
2168                 break;
2169             case FIELD_PROP_USHORT1:
2170                 aRet <<= (sal_Int16)m_pProps->nUSHORT1;
2171                 break;
2172             case FIELD_PROP_USHORT2:
2173                 aRet <<= (sal_Int16)m_pProps->nUSHORT2;
2174                 break;
2175             case FIELD_PROP_SHORT1:
2176                 aRet <<= m_pProps->nSHORT1;
2177                 break;
2178             case FIELD_PROP_DOUBLE:
2179                 aRet <<= m_pProps->fDouble;
2180                 break;
2181             case FIELD_PROP_DATE_TIME :
2182                 if(m_pProps->pDateTime)
2183                     aRet <<= (*m_pProps->pDateTime);
2184                 break;
2185             case FIELD_PROP_PROP_SEQ:
2186                 aRet <<= m_pProps->aPropSeq;
2187                 break;
2188             case FIELD_PROP_STRINGS:
2189                 aRet <<= m_pProps->aStrings;
2190                 break;
2191             case FIELD_PROP_IS_FIELD_USED:
2192             case FIELD_PROP_IS_FIELD_DISPLAYED:
2193                 aRet.setValue( sal_False, ::getCppuBooleanType() );
2194                 break;
2195             }
2196         }
2197         else
2198             throw uno::RuntimeException();
2199     }
2200     return aRet;
2201 }
2202 
2203 void SwXTextField::addPropertyChangeListener(const OUString& /*PropertyName*/, const uno::Reference< beans::XPropertyChangeListener > & /*aListener*/) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
2204 {
2205     DBG_WARNING("not implemented");
2206 }
2207 
2208 void SwXTextField::removePropertyChangeListener(const OUString& /*PropertyName*/, const uno::Reference< beans::XPropertyChangeListener > & /*aListener*/) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
2209 {
2210     DBG_WARNING("not implemented");
2211 }
2212 
2213 void SwXTextField::addVetoableChangeListener(const OUString& /*PropertyName*/, const uno::Reference< beans::XVetoableChangeListener > & /*aListener*/) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
2214 {
2215     DBG_WARNING("not implemented");
2216 }
2217 
2218 void SwXTextField::removeVetoableChangeListener(const OUString& /*PropertyName*/, const uno::Reference< beans::XVetoableChangeListener > & /*aListener*/) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
2219 {
2220     DBG_WARNING("not implemented");
2221 }
2222 
2223 void SwXTextField::update(  ) throw (uno::RuntimeException)
2224 {
2225     vos::OGuard  aGuard(Application::GetSolarMutex());
2226     const SwField* pFld = GetField();
2227     if(pFld)
2228     {
2229         switch(pFld->Which())
2230         {
2231             case RES_DATETIMEFLD:
2232             ((SwDateTimeField*)pFld)->SetDateTime( ::DateTime() );
2233             break;
2234 
2235             case RES_EXTUSERFLD:
2236             {
2237                 SwExtUserField* pExtUserFld = (SwExtUserField*)pFld;
2238                 pExtUserFld->SetExpansion( ((SwExtUserFieldType*)pFld->GetTyp())->Expand(
2239                                             pExtUserFld->GetSubType(),
2240                                             pExtUserFld->GetFormat() ) );
2241             }
2242             break;
2243 
2244             case RES_AUTHORFLD:
2245             {
2246                 SwAuthorField* pAuthorFld = (SwAuthorField*)pFld;
2247                 pAuthorFld->SetExpansion( ((SwAuthorFieldType*)pFld->GetTyp())->Expand(
2248                                             pAuthorFld->GetFormat() ) );
2249             }
2250             break;
2251 
2252             case RES_FILENAMEFLD:
2253             {
2254                 SwFileNameField* pFileNameFld = (SwFileNameField*)pFld;
2255                 pFileNameFld->SetExpansion( ((SwFileNameFieldType*)pFld->GetTyp())->Expand(
2256                                             pFileNameFld->GetFormat() ) );
2257             }
2258             break;
2259 
2260             case RES_DOCINFOFLD:
2261             {
2262                     SwDocInfoField* pDocInfFld = (SwDocInfoField*)pFld;
2263                     pDocInfFld->SetExpansion( ((SwDocInfoFieldType*)pFld->GetTyp())->Expand(
2264                                                 pDocInfFld->GetSubType(),
2265                                                 pDocInfFld->GetFormat(),
2266                                                 pDocInfFld->GetLanguage(),
2267                                                 pDocInfFld->GetName() ) );
2268             }
2269             break;
2270         }
2271         // --> FME 2004-10-06 #116480#
2272         // Text formatting has to be triggered.
2273         const_cast<SwFmtFld*>(pFmtFld)->ModifyNotification( 0, 0 );
2274         // <--
2275     }
2276     else
2277         m_bCallUpdate = sal_True;
2278 }
2279 
2280 OUString SwXTextField::getImplementationName(void) throw( uno::RuntimeException )
2281 {
2282     return C2U("SwXTextField");
2283 }
2284 
2285 static OUString OldNameToNewName_Impl( const OUString &rOld )
2286 {
2287     static OUString aOldNamePart1( OUString::createFromAscii(".TextField.DocInfo.") );
2288     static OUString aOldNamePart2( OUString::createFromAscii(".TextField.") );
2289     static OUString aNewNamePart1( OUString::createFromAscii(".textfield.docinfo.") );
2290     static OUString aNewNamePart2( OUString::createFromAscii(".textfield.") );
2291     OUString sServiceNameCC( rOld );
2292     sal_Int32 nIdx = sServiceNameCC.indexOf( aOldNamePart1 );
2293     if (nIdx >= 0)
2294         sServiceNameCC = sServiceNameCC.replaceAt( nIdx, aOldNamePart1.getLength(), aNewNamePart1 );
2295     nIdx = sServiceNameCC.indexOf( aOldNamePart2 );
2296     if (nIdx >= 0)
2297         sServiceNameCC = sServiceNameCC.replaceAt( nIdx, aOldNamePart2.getLength(), aNewNamePart2 );
2298     return sServiceNameCC;
2299 }
2300 
2301 sal_Bool SwXTextField::supportsService(const OUString& rServiceName) throw( uno::RuntimeException )
2302 {
2303     OUString sServiceName = SwXServiceProvider::GetProviderName(m_nServiceId);
2304 
2305     // case-corected version of service-name (see #i67811)
2306     // (need to supply both because of compatibility to older versions)
2307     OUString sServiceNameCC(  OldNameToNewName_Impl( sServiceName ) );
2308 
2309     return sServiceName == rServiceName || sServiceNameCC == rServiceName ||
2310         rServiceName.equalsAsciiL(
2311                 RTL_CONSTASCII_STRINGPARAM("com.sun.star.text.TextContent"));
2312 }
2313 
2314 uno::Sequence< OUString > SwXTextField::getSupportedServiceNames(void) throw( uno::RuntimeException )
2315 {
2316     OUString sServiceName = SwXServiceProvider::GetProviderName(m_nServiceId);
2317 
2318     // case-corected version of service-name (see #i67811)
2319     // (need to supply both because of compatibility to older versions)
2320     OUString sServiceNameCC(  OldNameToNewName_Impl( sServiceName ) );
2321     sal_Int32 nLen = sServiceName == sServiceNameCC ? 2 : 3;
2322 
2323     uno::Sequence< OUString > aRet( nLen );
2324     OUString* pArray = aRet.getArray();
2325     *pArray++ = sServiceName;
2326     if (nLen == 3)
2327         *pArray++ = sServiceNameCC;
2328     *pArray++ = C2U("com.sun.star.text.TextContent");
2329     return aRet;
2330 }
2331 
2332 void SwXTextField::Invalidate()
2333 {
2334     if (GetRegisteredIn())
2335     {
2336         ((SwModify*)GetRegisteredIn())->Remove(this);
2337         aLstnrCntnr.Disposing();
2338         pFmtFld = 0;
2339         m_pDoc = 0;
2340     }
2341 }
2342 
2343 
2344 void SwXTextField::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew)
2345 {
2346     switch( pOld ? pOld->Which() : 0 )
2347     {
2348     case RES_REMOVE_UNO_OBJECT:
2349     case RES_OBJECTDYING:
2350         if( (void*)GetRegisteredIn() == ((SwPtrMsgPoolItem *)pOld)->pObject )
2351             Invalidate();
2352         break;
2353 
2354     case RES_FMT_CHG:
2355         // wurden wir an das neue umgehaengt und wird das alte geloscht?
2356         if( ((SwFmtChg*)pNew)->pChangedFmt == GetRegisteredIn() &&
2357             ((SwFmtChg*)pOld)->pChangedFmt->IsFmtInDTOR() )
2358             Invalidate();
2359         break;
2360     case RES_FIELD_DELETED:
2361         if( (void*)pFmtFld == ((SwPtrMsgPoolItem *)pOld)->pObject )
2362             Invalidate();
2363         break;
2364     }
2365 }
2366 
2367 const SwField*  SwXTextField::GetField() const
2368 {
2369     if(GetRegisteredIn() && pFmtFld)
2370         return  pFmtFld->GetFld();
2371     return 0;
2372 }
2373 
2374 /******************************************************************
2375  * SwXTextFieldMasters
2376  ******************************************************************/
2377 OUString SwXTextFieldMasters::getImplementationName(void) throw( uno::RuntimeException )
2378 {
2379     return C2U("SwXTextFieldMasters");
2380 }
2381 
2382 sal_Bool SwXTextFieldMasters::supportsService(const OUString& rServiceName) throw( uno::RuntimeException )
2383 {
2384     return rServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(
2385                             "com.sun.star.text.TextFieldMasters" ));
2386 }
2387 
2388 uno::Sequence< OUString > SwXTextFieldMasters::getSupportedServiceNames(void) throw( uno::RuntimeException )
2389 {
2390     uno::Sequence< OUString > aRet(1);
2391     OUString* pArray = aRet.getArray();
2392     pArray[0] = C2U("com.sun.star.text.TextFieldMasters");
2393     return aRet;
2394 }
2395 
2396 SwXTextFieldMasters::SwXTextFieldMasters(SwDoc* _pDoc) :
2397     SwUnoCollection(_pDoc)
2398 {
2399 }
2400 
2401 SwXTextFieldMasters::~SwXTextFieldMasters()
2402 {
2403 
2404 }
2405 /*-----------------------------------------------------------------------
2406     Iteration ueber nicht-Standard Feldtypen
2407     USER/SETEXP/DDE/DATABASE
2408     Der Name ist demnach:
2409     "com.sun.star.text.fieldmaster.User" + <Feltypname>
2410     "com.sun.star.text.fieldmaster.DDE" + <Feltypname>
2411     "com.sun.star.text.fieldmaster.SetExpression" + <Feltypname>
2412     "com.sun.star.text.fieldmaster.DataBase" + <Feltypname>
2413 
2414     Falls wir grosszuegig werden wollen, dann koennte man com.sun.star.text
2415     auch optional weglassen
2416   -----------------------------------------------------------------------*/
2417 
2418 sal_uInt16 lcl_GetIdByName( String& rName, String& rTypeName )
2419 {
2420     if( rName.EqualsAscii( COM_TEXT_FLDMASTER, 0, RTL_CONSTASCII_LENGTH(COM_TEXT_FLDMASTER ))
2421         ||  rName.EqualsAscii( COM_TEXT_FLDMASTER_CC, 0, RTL_CONSTASCII_LENGTH(COM_TEXT_FLDMASTER_CC )))
2422         rName.Erase(0, 30);
2423 
2424     sal_uInt16 nResId = USHRT_MAX;
2425     xub_StrLen nFound = 0;
2426     rTypeName = rName.GetToken( 0, '.', nFound );
2427     if(rTypeName.EqualsAscii("User"))
2428         nResId = RES_USERFLD;
2429     else if(rTypeName.EqualsAscii("DDE"))
2430         nResId = RES_DDEFLD;
2431     else if(rTypeName.EqualsAscii("SetExpression"))
2432     {
2433         nResId = RES_SETEXPFLD;
2434 
2435         String sFldTypName( rName.GetToken( 1, '.' ));
2436         String sUIName( SwStyleNameMapper::GetSpecialExtraUIName( sFldTypName ) );
2437 
2438         if( sUIName != sFldTypName )
2439             rName.SetToken( 1, '.', sUIName );
2440     }
2441     else if(rTypeName.EqualsAscii("DataBase"))
2442     {
2443         rName.Erase( 0, RTL_CONSTASCII_LENGTH( "DataBase." ));
2444         sal_uInt16 nDotCount = rName.GetTokenCount('.');
2445         if( 2 <= nDotCount )
2446         {
2447             // #i51815#
2448             //rName.SearchAndReplace('.', DB_DELIM);
2449             //rName.SetChar( rName.SearchBackward( '.' ), DB_DELIM );
2450 
2451             rName.InsertAscii( "DataBase.", 0 );
2452             nResId = RES_DBFLD;
2453         }
2454     }
2455     else if( rTypeName.EqualsAscii("Bibliography"))
2456         nResId = RES_AUTHORITY;
2457     return nResId;
2458 }
2459 
2460 //-----------------------------------------------------------------------------
2461 uno::Any SwXTextFieldMasters::getByName(const OUString& rName)
2462     throw( container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException )
2463 {
2464     vos::OGuard  aGuard(Application::GetSolarMutex());
2465     if(!GetDoc())
2466         throw uno::RuntimeException();
2467 
2468     String sName(rName), sTypeName;
2469     sal_uInt16 nResId = lcl_GetIdByName( sName, sTypeName );
2470     if( USHRT_MAX == nResId )
2471         throw container::NoSuchElementException();
2472 
2473     sName.Erase(0, sTypeName.Len()+1);
2474     SwFieldType* pType = GetDoc()->GetFldType(nResId, sName, sal_True);
2475     if(!pType)
2476         throw container::NoSuchElementException();
2477     SwXFieldMaster* pMaster = SwIterator<SwXFieldMaster,SwFieldType>::FirstElement( *pType );
2478     if(!pMaster)
2479         pMaster = new SwXFieldMaster(*pType, GetDoc());
2480     uno::Reference< beans::XPropertySet >  aRef = pMaster;
2481     uno::Any aRet(&aRef, ::getCppuType( static_cast<const uno::Reference<beans::XPropertySet>* >(0)));
2482     return aRet;
2483 }
2484 
2485 sal_Bool SwXTextFieldMasters::getInstanceName(
2486     const SwFieldType& rFldType, String& rName)
2487 {
2488     sal_Bool bRet = sal_True;
2489     switch( rFldType.Which() )
2490     {
2491     case RES_USERFLD:
2492         rName.AppendAscii( RTL_CONSTASCII_STRINGPARAM( COM_TEXT_FLDMASTER_CC ));
2493         rName.AppendAscii( RTL_CONSTASCII_STRINGPARAM( "User."));
2494         rName += rFldType.GetName();
2495         break;
2496     case RES_DDEFLD:
2497         rName.AppendAscii( RTL_CONSTASCII_STRINGPARAM( COM_TEXT_FLDMASTER_CC ));
2498         rName.AppendAscii( RTL_CONSTASCII_STRINGPARAM( "DDE."));
2499         rName += rFldType.GetName();
2500         break;
2501 
2502     case RES_SETEXPFLD:
2503         rName.AppendAscii( RTL_CONSTASCII_STRINGPARAM( COM_TEXT_FLDMASTER_CC ));
2504         rName.AppendAscii( RTL_CONSTASCII_STRINGPARAM( "SetExpression."));
2505         rName += String( SwStyleNameMapper::GetSpecialExtraProgName( rFldType.GetName() ) );
2506         break;
2507 
2508     case RES_DBFLD:
2509         {
2510             rName.AppendAscii( RTL_CONSTASCII_STRINGPARAM( COM_TEXT_FLDMASTER_CC ));
2511             rName.AppendAscii( RTL_CONSTASCII_STRINGPARAM( "DataBase."));
2512             String sDBName(rFldType.GetName());
2513             sDBName.SearchAndReplaceAll(DB_DELIM, '.');
2514             rName += sDBName;
2515         }
2516         break;
2517 
2518     case RES_AUTHORITY:
2519         rName.AppendAscii( RTL_CONSTASCII_STRINGPARAM( COM_TEXT_FLDMASTER_CC ));
2520         rName.AppendAscii( RTL_CONSTASCII_STRINGPARAM( "Bibliography"));
2521         break;
2522 
2523     default:
2524         bRet = sal_False;
2525     }
2526 
2527     return bRet;
2528 }
2529 
2530 
2531 uno::Sequence< OUString > SwXTextFieldMasters::getElementNames(void)
2532     throw( uno::RuntimeException )
2533 {
2534     vos::OGuard  aGuard(Application::GetSolarMutex());
2535     if(!GetDoc())
2536         throw uno::RuntimeException();
2537 
2538     const SwFldTypes* pFldTypes = GetDoc()->GetFldTypes();
2539     sal_uInt16 nCount = pFldTypes->Count();
2540 
2541     SvStrings aFldNames;
2542     String* pString = new String();
2543     sal_uInt16 i;
2544 
2545     for( i = 0; i < nCount; i++)
2546     {
2547         SwFieldType& rFldType = *((*pFldTypes)[i]);
2548 
2549         if (SwXTextFieldMasters::getInstanceName(rFldType, *pString))
2550         {
2551             aFldNames.Insert(pString, aFldNames.Count());
2552             pString = new String();
2553         }
2554     }
2555     delete pString;
2556 
2557     uno::Sequence< OUString > aSeq(aFldNames.Count());
2558     OUString* pArray = aSeq.getArray();
2559     for(i = 0; i < aFldNames.Count();i++)
2560     {
2561         pArray[i] = *aFldNames.GetObject(i);
2562     }
2563     aFldNames.DeleteAndDestroy(0, aFldNames.Count());
2564 
2565     return aSeq;
2566 
2567 }
2568 
2569 sal_Bool SwXTextFieldMasters::hasByName(const OUString& rName) throw( uno::RuntimeException )
2570 {
2571     vos::OGuard  aGuard(Application::GetSolarMutex());
2572     if(!GetDoc())
2573         throw uno::RuntimeException();
2574 
2575     String sName(rName), sTypeName;
2576     sal_uInt16 nResId = lcl_GetIdByName( sName, sTypeName );
2577     sal_Bool bRet = sal_False;
2578     if( USHRT_MAX != nResId )
2579     {
2580         sName.Erase(0, sTypeName.Len()+1);
2581         bRet = USHRT_MAX != nResId && 0 != GetDoc()->GetFldType(nResId, sName, sal_True);
2582     }
2583     return bRet;
2584 }
2585 
2586 uno::Type  SwXTextFieldMasters::getElementType(void) throw( uno::RuntimeException )
2587 {
2588     return ::getCppuType(static_cast<const uno::Reference<beans::XPropertySet>*>(0));
2589 
2590 }
2591 
2592 sal_Bool SwXTextFieldMasters::hasElements(void) throw( uno::RuntimeException )
2593 {
2594     vos::OGuard  aGuard(Application::GetSolarMutex());
2595     if(!IsValid())
2596         throw uno::RuntimeException();
2597     return sal_True;
2598 }
2599 
2600 /******************************************************************
2601  *
2602  ******************************************************************/
2603 
2604 OUString SwXTextFieldTypes::getImplementationName(void) throw( uno::RuntimeException )
2605 {
2606     return C2U("SwXTextFieldTypes");
2607 }
2608 
2609 sal_Bool SwXTextFieldTypes::supportsService(const OUString& rServiceName) throw( uno::RuntimeException )
2610 {
2611     return rServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(
2612                             "com.sun.star.text.TextFields" ));
2613 }
2614 
2615 uno::Sequence< OUString > SwXTextFieldTypes::getSupportedServiceNames(void) throw( uno::RuntimeException )
2616 {
2617     uno::Sequence< OUString > aRet(1);
2618     OUString* pArray = aRet.getArray();
2619     pArray[0] = C2U("com.sun.star.text.TextFields");
2620     return aRet;
2621 }
2622 
2623 SwXTextFieldTypes::SwXTextFieldTypes(SwDoc* _pDoc) :
2624     SwUnoCollection (_pDoc),
2625     aRefreshCont    ( static_cast< XEnumerationAccess * >(this) )
2626 {
2627 }
2628 
2629 SwXTextFieldTypes::~SwXTextFieldTypes()
2630 {
2631 }
2632 
2633 void SwXTextFieldTypes::Invalidate()
2634 {
2635     SwUnoCollection::Invalidate();
2636     aRefreshCont.Disposing();
2637 }
2638 
2639 uno::Reference< container::XEnumeration >  SwXTextFieldTypes::createEnumeration(void)
2640     throw( uno::RuntimeException )
2641 {
2642     vos::OGuard  aGuard(Application::GetSolarMutex());
2643     if(!IsValid())
2644         throw uno::RuntimeException();
2645     return new SwXFieldEnumeration(GetDoc());
2646 }
2647 
2648 
2649 uno::Type  SwXTextFieldTypes::getElementType(void) throw( uno::RuntimeException )
2650 {
2651     return ::getCppuType(static_cast<const uno::Reference<text::XDependentTextField>*>(0));
2652 }
2653 
2654 sal_Bool SwXTextFieldTypes::hasElements(void) throw( uno::RuntimeException )
2655 {
2656     vos::OGuard  aGuard(Application::GetSolarMutex());
2657     if(!IsValid())
2658         throw uno::RuntimeException();
2659     //es gibt sie immer
2660     return sal_True;
2661 }
2662 
2663 void SwXTextFieldTypes::refresh(void)  throw( uno::RuntimeException )
2664 {
2665     vos::OGuard  aGuard(Application::GetSolarMutex());
2666     if(!IsValid())
2667         throw uno::RuntimeException();
2668     UnoActionContext aContext(GetDoc());
2669     SwDocStat aDocStat;
2670     GetDoc()->UpdateDocStat(aDocStat);
2671     GetDoc()->UpdateFlds(0, sal_False);
2672 
2673     // call refresh listeners
2674     aRefreshCont.Refreshed();
2675 }
2676 
2677 void SwXTextFieldTypes::addRefreshListener(const uno::Reference< util::XRefreshListener > & l)
2678     throw( uno::RuntimeException )
2679 {
2680     ::vos::OGuard aGuard(Application::GetSolarMutex());
2681     if ( !IsValid() )
2682         throw uno::RuntimeException();
2683     aRefreshCont.AddListener ( reinterpret_cast < const uno::Reference < lang::XEventListener > &> ( l ));
2684 }
2685 
2686 void SwXTextFieldTypes::removeRefreshListener(const uno::Reference< util::XRefreshListener > & l)
2687      throw( uno::RuntimeException )
2688 {
2689     ::vos::OGuard aGuard(Application::GetSolarMutex());
2690     if ( !IsValid() || !aRefreshCont.RemoveListener ( reinterpret_cast < const uno::Reference < lang::XEventListener > &> ( l ) ) )
2691         throw uno::RuntimeException();
2692 }
2693 /******************************************************************
2694  * SwXFieldEnumeration
2695  ******************************************************************/
2696 
2697 OUString SwXFieldEnumeration::getImplementationName(void) throw( uno::RuntimeException )
2698 {
2699     return C2U("SwXFieldEnumeration");
2700 }
2701 
2702 sal_Bool SwXFieldEnumeration::supportsService(const OUString& rServiceName) throw( uno::RuntimeException )
2703 {
2704     return rServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(
2705                             "com.sun.star.text.FieldEnumeration" ));
2706 }
2707 
2708 uno::Sequence< OUString > SwXFieldEnumeration::getSupportedServiceNames(void) throw( uno::RuntimeException )
2709 {
2710     uno::Sequence< OUString > aRet(1);
2711     OUString* pArray = aRet.getArray();
2712     pArray[0] = C2U("com.sun.star.text.FieldEnumeration");
2713     return aRet;
2714 }
2715 
2716 SwXFieldEnumeration::SwXFieldEnumeration(SwDoc* pDc) :
2717     nNextIndex(0),
2718     pDoc(pDc)
2719 {
2720     pDoc->GetPageDescFromPool(RES_POOLPAGE_STANDARD)->Add(this);
2721 
2722     // build sequence
2723     sal_Int32 nSize = 32;
2724     aItems.realloc( nSize );
2725     uno::Reference< text::XTextField > *pItems = aItems.getArray();
2726     sal_Int32 nFillPos = 0;
2727     //
2728     const SwFldTypes* pFldTypes = pDoc->GetFldTypes();
2729     sal_uInt16 nCount = pFldTypes->Count();
2730     for(sal_uInt16 nType = 0;  nType < nCount;  ++nType)
2731     {
2732         const SwFieldType *pCurType = pFldTypes->GetObject(nType);
2733         SwIterator<SwFmtFld,SwFieldType> aIter( *pCurType );
2734         const SwFmtFld* pCurFldFmt = aIter.First();
2735         while (pCurFldFmt)
2736         {
2737             const SwTxtFld *pTxtFld = pCurFldFmt->GetTxtFld();
2738             // skip fields that are currently not in the document
2739             // e.g. fields in undo or redo array
2740             sal_Bool bSkip = !pTxtFld ||
2741                          !pTxtFld->GetpTxtNode()->GetNodes().IsDocNodes();
2742             if (!bSkip)
2743                 pItems[ nFillPos++ ] = new SwXTextField(*pCurFldFmt, pDoc);
2744             pCurFldFmt = aIter.Next();
2745 
2746             // enlarge sequence if necessary
2747             if (aItems.getLength() == nFillPos)
2748             {
2749                 aItems.realloc( 2 * aItems.getLength() );
2750                 pItems = aItems.getArray();
2751             }
2752         }
2753     }
2754     // now handle meta-fields, which are not SwFields
2755     const ::std::vector< uno::Reference<text::XTextField> > MetaFields(
2756            pDc->GetMetaFieldManager().getMetaFields() );
2757     for (size_t i = 0; i < MetaFields.size(); ++i)
2758     {
2759         pItems[ nFillPos ] = MetaFields[i];
2760         nFillPos++;
2761 
2762         //FIXME UGLY
2763         // enlarge sequence if necessary
2764         if (aItems.getLength() == nFillPos)
2765         {
2766             aItems.realloc( 2 * aItems.getLength() );
2767             pItems = aItems.getArray();
2768         }
2769     }
2770     // resize sequence to actual used size
2771     aItems.realloc( nFillPos );
2772 }
2773 
2774 SwXFieldEnumeration::~SwXFieldEnumeration()
2775 {
2776 
2777 }
2778 
2779 sal_Bool SwXFieldEnumeration::hasMoreElements(void)
2780     throw( uno::RuntimeException )
2781 {
2782     vos::OGuard  aGuard(Application::GetSolarMutex());
2783     return nNextIndex < aItems.getLength();
2784 }
2785 
2786 uno::Any SwXFieldEnumeration::nextElement(void)
2787     throw( container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException )
2788 {
2789     vos::OGuard  aGuard(Application::GetSolarMutex());
2790 
2791     if (!(nNextIndex < aItems.getLength()))
2792         throw container::NoSuchElementException();
2793 
2794 #if OSL_DEBUG_LEVEL > 1
2795     uno::Reference< text::XTextField > *pItems = aItems.getArray();
2796     (void)pItems;
2797 #endif
2798     uno::Reference< text::XTextField >  &rxFld = aItems.getArray()[ nNextIndex++ ];
2799     uno::Any aRet(&rxFld, ::getCppuType(static_cast<const uno::Reference<text::XTextField>*>(0)));
2800     rxFld = 0;  // free memory for item that is not longer used
2801     return aRet;
2802 }
2803 
2804 void SwXFieldEnumeration::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew)
2805 {
2806     ClientModify(this, pOld, pNew);
2807     if(!GetRegisteredIn())
2808         pDoc = 0;
2809 }
2810 
2811 
2812 String& GetString( const uno::Any& rAny, String& rStr )
2813 {
2814     OUString aStr;
2815     rAny >>= aStr;
2816     rStr = String( aStr );
2817     return rStr;
2818 }
2819