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

Generated by: LCOV version 1.10