LCOV - code coverage report
Current view: top level - usr/local/src/libreoffice/sw/source/core/unocore - unofield.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 881 1509 58.4 %
Date: 2013-07-09 Functions: 86 111 77.5 %
Legend: Lines: hit not hit

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

Generated by: LCOV version 1.10