summaryrefslogtreecommitdiff
path: root/sw/source/core/unocore/unofield.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sw/source/core/unocore/unofield.cxx')
-rw-r--r--sw/source/core/unocore/unofield.cxx2806
1 files changed, 2806 insertions, 0 deletions
diff --git a/sw/source/core/unocore/unofield.cxx b/sw/source/core/unocore/unofield.cxx
new file mode 100644
index 000000000000..93126e71ab9d
--- /dev/null
+++ b/sw/source/core/unocore/unofield.cxx
@@ -0,0 +1,2806 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sw.hxx"
+
+
+#include <swtypes.hxx>
+#include <cmdid.h>
+#include <doc.hxx>
+#include <hints.hxx>
+#include <fmtfld.hxx>
+#include <txtfld.hxx>
+#include <ndtxt.hxx>
+#include <unomap.hxx>
+#include <unoprnms.hxx>
+#include <unotextrange.hxx>
+#include <unotextcursor.hxx>
+#include <unocoll.hxx>
+#include <sfx2/linkmgr.hxx>
+#include <docstat.hxx>
+#include <editsh.hxx>
+#include <viewsh.hxx>
+#include <comphelper/types.hxx>
+#include <comphelper/processfactory.hxx>
+#include <com/sun/star/util/Time.hpp>
+#include <com/sun/star/util/DateTimeRange.hpp>
+#include <com/sun/star/util/DateTime.hpp>
+#include <com/sun/star/util/Date.hpp>
+#include <com/sun/star/beans/XFastPropertySet.hpp>
+#include <com/sun/star/beans/XPropertyStateChangeListener.hpp>
+#include <com/sun/star/beans/PropertyAttribute.hpp>
+#include <com/sun/star/beans/XPropertyContainer.hpp>
+
+//undef to prevent error (from sfx2/docfile.cxx)
+#undef SEQUENCE
+#include <com/sun/star/text/SetVariableType.hpp>
+#include <com/sun/star/text/WrapTextMode.hpp>
+#include <com/sun/star/text/TextContentAnchorType.hpp>
+#include <com/sun/star/text/PageNumberType.hpp>
+#include <unofield.hxx>
+#include <unocrsr.hxx>
+#include <authfld.hxx>
+#include <flddat.hxx>
+#include <dbfld.hxx>
+#include <usrfld.hxx>
+#include <docufld.hxx>
+#include <expfld.hxx>
+#include <chpfld.hxx>
+#include <flddropdown.hxx>
+#include <poolfmt.hxx>
+#include <poolfmt.hrc>
+#include <pagedesc.hxx>
+#include <docary.hxx>
+#include <reffld.hxx>
+#include <ddefld.hxx>
+#include <SwStyleNameMapper.hxx>
+#include <swunohelper.hxx>
+#include <unofldmid.h>
+#include <scriptinfo.hxx>
+#include <tools/datetime.hxx>
+#include <tools/urlobj.hxx>
+#include <svx/dataaccessdescriptor.hxx>
+#define _SVSTDARR_STRINGS
+#include <svl/svstdarr.hxx>
+#include <osl/mutex.hxx>
+#include <vcl/svapp.hxx>
+#include <textapi.hxx>
+#include <editeng/outliner.hxx>
+#include <docsh.hxx>
+#include <fmtmeta.hxx> // MetaFieldManager
+#include <switerator.hxx>
+
+using ::rtl::OUString;
+using namespace ::com::sun::star;
+using namespace nsSwDocInfoSubType;
+
+#define COM_TEXT_FLDMASTER "com.sun.star.text.FieldMaster."
+
+// case-corrected version of the first part for the service names (see #i67811)
+#define COM_TEXT_FLDMASTER_CC "com.sun.star.text.fieldmaster."
+
+// note: this thing is indexed as an array, so do not insert/remove entries!
+static const sal_uInt16 aDocInfoSubTypeFromService[] =
+{
+ DI_CHANGE | DI_SUB_AUTHOR, //PROPERTY_MAP_FLDTYP_DOCINFO_CHANGE_AUTHOR
+ DI_CHANGE | DI_SUB_DATE, //PROPERTY_MAP_FLDTYP_DOCINFO_CHANGE_DATE_TIME
+ DI_EDIT | DI_SUB_TIME, //PROPERTY_MAP_FLDTYP_DOCINFO_EDIT_TIME
+ DI_COMMENT, //PROPERTY_MAP_FLDTYP_DOCINFO_DESCRIPTION
+ DI_CREATE | DI_SUB_AUTHOR, //PROPERTY_MAP_FLDTYP_DOCINFO_CREATE_AUTHOR
+ DI_CREATE | DI_SUB_DATE, //PROPERTY_MAP_FLDTYP_DOCINFO_CREATE_DATE_TIME
+ 0, //DUMMY
+ 0, //DUMMY
+ 0, //DUMMY
+ 0, //DUMMY
+ DI_CUSTOM, //PROPERTY_MAP_FLDTYP_DOCINFO_CUSTOM
+ DI_PRINT | DI_SUB_AUTHOR, //PROPERTY_MAP_FLDTYP_DOCINFO_PRINT_AUTHOR
+ DI_PRINT | DI_SUB_DATE, //PROPERTY_MAP_FLDTYP_DOCINFO_PRINT_DATE_TIME
+ DI_KEYS, //PROPERTY_MAP_FLDTYP_DOCINFO_KEY_WORDS
+ DI_THEMA, //PROPERTY_MAP_FLDTYP_DOCINFO_SUBJECT
+ DI_TITEL, //PROPERTY_MAP_FLDTYP_DOCINFO_TITLE
+ DI_DOCNO //PROPERTY_MAP_FLDTYP_DOCINFO_REVISION
+};
+
+struct ServiceIdResId
+{
+ sal_uInt16 nResId;
+ sal_uInt16 nServiceId;
+};
+
+static const ServiceIdResId aServiceToRes[] =
+{
+ {RES_DATETIMEFLD, SW_SERVICE_FIELDTYPE_DATETIME },
+ {RES_USERFLD, SW_SERVICE_FIELDTYPE_USER },
+ {RES_SETEXPFLD, SW_SERVICE_FIELDTYPE_SET_EXP } ,
+ {RES_GETEXPFLD, SW_SERVICE_FIELDTYPE_GET_EXP } ,
+ {RES_FILENAMEFLD, SW_SERVICE_FIELDTYPE_FILE_NAME },
+ {RES_PAGENUMBERFLD, SW_SERVICE_FIELDTYPE_PAGE_NUM } ,
+ {RES_AUTHORFLD, SW_SERVICE_FIELDTYPE_AUTHOR } ,
+ {RES_CHAPTERFLD, SW_SERVICE_FIELDTYPE_CHAPTER },
+ {RES_GETREFFLD, SW_SERVICE_FIELDTYPE_GET_REFERENCE } ,
+ {RES_HIDDENTXTFLD, SW_SERVICE_FIELDTYPE_CONDITIONED_TEXT },
+ {RES_POSTITFLD, SW_SERVICE_FIELDTYPE_ANNOTATION } ,
+ {RES_INPUTFLD, SW_SERVICE_FIELDTYPE_INPUT },
+ {RES_MACROFLD, SW_SERVICE_FIELDTYPE_MACRO },
+ {RES_DDEFLD, SW_SERVICE_FIELDTYPE_DDE },
+ {RES_HIDDENPARAFLD, SW_SERVICE_FIELDTYPE_HIDDEN_PARA } ,
+ {RES_DOCINFOFLD, SW_SERVICE_FIELDTYPE_DOC_INFO },
+ {RES_TEMPLNAMEFLD, SW_SERVICE_FIELDTYPE_TEMPLATE_NAME },
+ {RES_EXTUSERFLD, SW_SERVICE_FIELDTYPE_USER_EXT },
+ {RES_REFPAGESETFLD, SW_SERVICE_FIELDTYPE_REF_PAGE_SET } ,
+ {RES_REFPAGEGETFLD, SW_SERVICE_FIELDTYPE_REF_PAGE_GET } ,
+ {RES_JUMPEDITFLD, SW_SERVICE_FIELDTYPE_JUMP_EDIT },
+ {RES_SCRIPTFLD, SW_SERVICE_FIELDTYPE_SCRIPT } ,
+ {RES_DBNEXTSETFLD, SW_SERVICE_FIELDTYPE_DATABASE_NEXT_SET },
+ {RES_DBNUMSETFLD, SW_SERVICE_FIELDTYPE_DATABASE_NUM_SET },
+ {RES_DBSETNUMBERFLD, SW_SERVICE_FIELDTYPE_DATABASE_SET_NUM } ,
+ {RES_DBFLD, SW_SERVICE_FIELDTYPE_DATABASE } ,
+ {RES_DBNAMEFLD, SW_SERVICE_FIELDTYPE_DATABASE_NAME },
+ {RES_DOCSTATFLD, SW_SERVICE_FIELDTYPE_PAGE_COUNT },
+ {RES_DOCSTATFLD, SW_SERVICE_FIELDTYPE_PARAGRAPH_COUNT },
+ {RES_DOCSTATFLD, SW_SERVICE_FIELDTYPE_WORD_COUNT },
+ {RES_DOCSTATFLD, SW_SERVICE_FIELDTYPE_CHARACTER_COUNT },
+ {RES_DOCSTATFLD, SW_SERVICE_FIELDTYPE_TABLE_COUNT },
+ {RES_DOCSTATFLD, SW_SERVICE_FIELDTYPE_GRAPHIC_OBJECT_COUNT },
+ {RES_DOCSTATFLD, SW_SERVICE_FIELDTYPE_EMBEDDED_OBJECT_COUNT },
+ {RES_DOCINFOFLD, SW_SERVICE_FIELDTYPE_DOCINFO_CHANGE_AUTHOR },
+ {RES_DOCINFOFLD, SW_SERVICE_FIELDTYPE_DOCINFO_CHANGE_DATE_TIME},
+ {RES_DOCINFOFLD, SW_SERVICE_FIELDTYPE_DOCINFO_EDIT_TIME },
+ {RES_DOCINFOFLD, SW_SERVICE_FIELDTYPE_DOCINFO_DESCRIPTION },
+ {RES_DOCINFOFLD, SW_SERVICE_FIELDTYPE_DOCINFO_CREATE_AUTHOR },
+ {RES_DOCINFOFLD, SW_SERVICE_FIELDTYPE_DOCINFO_CREATE_DATE_TIME},
+ {RES_DOCINFOFLD, SW_SERVICE_FIELDTYPE_DOCINFO_CUSTOM },
+ {RES_DOCINFOFLD, SW_SERVICE_FIELDTYPE_DOCINFO_PRINT_AUTHOR },
+ {RES_DOCINFOFLD, SW_SERVICE_FIELDTYPE_DOCINFO_PRINT_DATE_TIME },
+ {RES_DOCINFOFLD, SW_SERVICE_FIELDTYPE_DOCINFO_KEY_WORDS },
+ {RES_DOCINFOFLD, SW_SERVICE_FIELDTYPE_DOCINFO_SUBJECT },
+ {RES_DOCINFOFLD, SW_SERVICE_FIELDTYPE_DOCINFO_TITLE },
+ {RES_INPUTFLD, SW_SERVICE_FIELDTYPE_INPUT_USER },
+ {RES_HIDDENTXTFLD, SW_SERVICE_FIELDTYPE_HIDDEN_TEXT },
+ {RES_AUTHORITY, SW_SERVICE_FIELDTYPE_BIBLIOGRAPHY },
+ {RES_COMBINED_CHARS, SW_SERVICE_FIELDTYPE_COMBINED_CHARACTERS },
+ {RES_DROPDOWN, SW_SERVICE_FIELDTYPE_DROPDOWN },
+ {RES_TABLEFLD, SW_SERVICE_FIELDTYPE_TABLE_FORMULA },
+ {USHRT_MAX, USHRT_MAX }
+};
+
+sal_uInt16 lcl_ServiceIdToResId(sal_uInt16 nServiceId)
+{
+ const ServiceIdResId* pMap = aServiceToRes;
+ while( USHRT_MAX != pMap->nServiceId && nServiceId != pMap->nServiceId )
+ ++pMap;
+#if OSL_DEBUG_LEVEL > 1
+ if( USHRT_MAX == pMap->nServiceId )
+ OSL_FAIL("service id not found");
+#endif
+ return pMap->nResId;
+}
+
+sal_uInt16 lcl_GetServiceForField( const SwField& rFld )
+{
+ sal_uInt16 nWhich = rFld.Which(), nSrvId = USHRT_MAX;
+ //special handling for some fields
+ switch( nWhich )
+ {
+ case RES_INPUTFLD:
+ if( INP_USR == (rFld.GetSubType() & 0x00ff) )
+ nSrvId = SW_SERVICE_FIELDTYPE_INPUT_USER;
+ break;
+
+ case RES_DOCINFOFLD:
+ {
+ sal_uInt16 nSubType = rFld.GetSubType();
+ switch( (nSubType & 0xff))
+ {
+ case DI_CHANGE:
+ nSrvId = ((nSubType&0x300) == DI_SUB_AUTHOR)
+ ? SW_SERVICE_FIELDTYPE_DOCINFO_CHANGE_AUTHOR
+ : SW_SERVICE_FIELDTYPE_DOCINFO_CHANGE_DATE_TIME;
+ break;
+ case DI_CREATE:
+ nSrvId = ((nSubType&0x300) == DI_SUB_AUTHOR)
+ ? SW_SERVICE_FIELDTYPE_DOCINFO_CREATE_AUTHOR
+ : SW_SERVICE_FIELDTYPE_DOCINFO_CREATE_DATE_TIME;
+ break;
+ case DI_PRINT:
+ nSrvId = ((nSubType&0x300) == DI_SUB_AUTHOR)
+ ? SW_SERVICE_FIELDTYPE_DOCINFO_PRINT_AUTHOR
+ : SW_SERVICE_FIELDTYPE_DOCINFO_PRINT_DATE_TIME;
+ break;
+ case DI_EDIT: nSrvId = SW_SERVICE_FIELDTYPE_DOCINFO_EDIT_TIME;break;
+ case DI_COMMENT:nSrvId = SW_SERVICE_FIELDTYPE_DOCINFO_DESCRIPTION;break;
+ case DI_KEYS: nSrvId = SW_SERVICE_FIELDTYPE_DOCINFO_KEY_WORDS;break;
+ case DI_THEMA: nSrvId = SW_SERVICE_FIELDTYPE_DOCINFO_SUBJECT; break;
+ case DI_TITEL: nSrvId = SW_SERVICE_FIELDTYPE_DOCINFO_TITLE; break;
+ case DI_DOCNO: nSrvId = SW_SERVICE_FIELDTYPE_DOCINFO_REVISION; break;
+ case DI_CUSTOM: nSrvId = SW_SERVICE_FIELDTYPE_DOCINFO_CUSTOM; break;
+ }
+ }
+ break;
+
+ case RES_HIDDENTXTFLD:
+ nSrvId = TYP_CONDTXTFLD == rFld.GetSubType()
+ ? SW_SERVICE_FIELDTYPE_CONDITIONED_TEXT
+ : SW_SERVICE_FIELDTYPE_HIDDEN_TEXT;
+ break;
+
+ case RES_DOCSTATFLD:
+ {
+ switch( rFld.GetSubType() )
+ {
+ case DS_PAGE: nSrvId = SW_SERVICE_FIELDTYPE_PAGE_COUNT; break;
+ case DS_PARA: nSrvId = SW_SERVICE_FIELDTYPE_PARAGRAPH_COUNT; break;
+ case DS_WORD: nSrvId = SW_SERVICE_FIELDTYPE_WORD_COUNT ; break;
+ case DS_CHAR: nSrvId = SW_SERVICE_FIELDTYPE_CHARACTER_COUNT; break;
+ case DS_TBL: nSrvId = SW_SERVICE_FIELDTYPE_TABLE_COUNT ; break;
+ case DS_GRF: nSrvId = SW_SERVICE_FIELDTYPE_GRAPHIC_OBJECT_COUNT; break;
+ case DS_OLE: nSrvId = SW_SERVICE_FIELDTYPE_EMBEDDED_OBJECT_COUNT; break;
+ }
+ }
+ break;
+ }
+ if( USHRT_MAX == nSrvId )
+ {
+ for( const ServiceIdResId* pMap = aServiceToRes;
+ USHRT_MAX != pMap->nResId; ++pMap )
+ if( nWhich == pMap->nResId )
+ {
+ nSrvId = pMap->nServiceId;
+ break;
+ }
+ }
+#if OSL_DEBUG_LEVEL > 1
+ if( USHRT_MAX == nSrvId )
+ OSL_FAIL("resid not found");
+#endif
+ return nSrvId;
+}
+
+sal_uInt16 lcl_GetPropMapIdForFieldType( sal_uInt16 nWhich )
+{
+ sal_uInt16 nId;
+ switch( nWhich )
+ {
+ case RES_USERFLD: nId = PROPERTY_MAP_FLDMSTR_USER; break;
+ case RES_DBFLD: nId = PROPERTY_MAP_FLDMSTR_DATABASE; break;
+ case RES_SETEXPFLD: nId = PROPERTY_MAP_FLDMSTR_SET_EXP; break;
+ case RES_DDEFLD: nId = PROPERTY_MAP_FLDMSTR_DDE; break;
+ case RES_AUTHORITY: nId = PROPERTY_MAP_FLDMSTR_BIBLIOGRAPHY; break;
+ default: nId = PROPERTY_MAP_FLDMSTR_DUMMY0;
+ }
+ return nId;
+}
+
+sal_uInt16 GetFieldTypeMId( const OUString& rProperty, const SwFieldType& rTyp )
+{
+ sal_uInt16 nId = lcl_GetPropMapIdForFieldType( rTyp.Which() );
+ const SfxItemPropertySet* pSet = aSwMapProvider.GetPropertySet( nId );
+ if( !pSet )
+ nId = USHRT_MAX;
+ else
+ {
+ const SfxItemPropertySimpleEntry* pEntry = pSet->getPropertyMap()->getByName(rProperty);
+ nId = pEntry ? pEntry->nWID : USHRT_MAX;
+ }
+ return nId;
+}
+
+sal_uInt16 lcl_GetPropertyMapOfService( sal_uInt16 nServiceId )
+{
+ sal_uInt16 nRet;
+ switch ( nServiceId)
+ {
+ case SW_SERVICE_FIELDTYPE_DATETIME: nRet = PROPERTY_MAP_FLDTYP_DATETIME; break;
+ case SW_SERVICE_FIELDTYPE_USER: nRet = PROPERTY_MAP_FLDTYP_USER; break;
+ case SW_SERVICE_FIELDTYPE_SET_EXP: nRet = PROPERTY_MAP_FLDTYP_SET_EXP; break;
+ case SW_SERVICE_FIELDTYPE_GET_EXP: nRet = PROPERTY_MAP_FLDTYP_GET_EXP; break;
+ case SW_SERVICE_FIELDTYPE_FILE_NAME: nRet = PROPERTY_MAP_FLDTYP_FILE_NAME; break;
+ case SW_SERVICE_FIELDTYPE_PAGE_NUM: nRet = PROPERTY_MAP_FLDTYP_PAGE_NUM; break;
+ case SW_SERVICE_FIELDTYPE_AUTHOR: nRet = PROPERTY_MAP_FLDTYP_AUTHOR; break;
+ case SW_SERVICE_FIELDTYPE_CHAPTER: nRet = PROPERTY_MAP_FLDTYP_CHAPTER; break;
+ case SW_SERVICE_FIELDTYPE_GET_REFERENCE: nRet = PROPERTY_MAP_FLDTYP_GET_REFERENCE; break;
+ case SW_SERVICE_FIELDTYPE_CONDITIONED_TEXT: nRet = PROPERTY_MAP_FLDTYP_CONDITIONED_TEXT; break;
+ case SW_SERVICE_FIELDTYPE_ANNOTATION: nRet = PROPERTY_MAP_FLDTYP_ANNOTATION; break;
+ case SW_SERVICE_FIELDTYPE_INPUT_USER:
+ case SW_SERVICE_FIELDTYPE_INPUT: nRet = PROPERTY_MAP_FLDTYP_INPUT; break;
+ case SW_SERVICE_FIELDTYPE_MACRO: nRet = PROPERTY_MAP_FLDTYP_MACRO; break;
+ case SW_SERVICE_FIELDTYPE_DDE: nRet = PROPERTY_MAP_FLDTYP_DDE; break;
+ case SW_SERVICE_FIELDTYPE_HIDDEN_PARA: nRet = PROPERTY_MAP_FLDTYP_HIDDEN_PARA; break;
+ case SW_SERVICE_FIELDTYPE_DOC_INFO: nRet = PROPERTY_MAP_FLDTYP_DOC_INFO; break;
+ case SW_SERVICE_FIELDTYPE_TEMPLATE_NAME: nRet = PROPERTY_MAP_FLDTYP_TEMPLATE_NAME; break;
+ case SW_SERVICE_FIELDTYPE_USER_EXT: nRet = PROPERTY_MAP_FLDTYP_USER_EXT; break;
+ case SW_SERVICE_FIELDTYPE_REF_PAGE_SET: nRet = PROPERTY_MAP_FLDTYP_REF_PAGE_SET; break;
+ case SW_SERVICE_FIELDTYPE_REF_PAGE_GET: nRet = PROPERTY_MAP_FLDTYP_REF_PAGE_GET; break;
+ case SW_SERVICE_FIELDTYPE_JUMP_EDIT: nRet = PROPERTY_MAP_FLDTYP_JUMP_EDIT; break;
+ case SW_SERVICE_FIELDTYPE_SCRIPT: nRet = PROPERTY_MAP_FLDTYP_SCRIPT; break;
+ case SW_SERVICE_FIELDTYPE_DATABASE_NEXT_SET: nRet = PROPERTY_MAP_FLDTYP_DATABASE_NEXT_SET; break;
+ case SW_SERVICE_FIELDTYPE_DATABASE_NUM_SET: nRet = PROPERTY_MAP_FLDTYP_DATABASE_NUM_SET; break;
+ case SW_SERVICE_FIELDTYPE_DATABASE_SET_NUM: nRet = PROPERTY_MAP_FLDTYP_DATABASE_SET_NUM; break;
+ case SW_SERVICE_FIELDTYPE_DATABASE: nRet = PROPERTY_MAP_FLDTYP_DATABASE; break;
+ case SW_SERVICE_FIELDTYPE_DATABASE_NAME: nRet = PROPERTY_MAP_FLDTYP_DATABASE_NAME; break;
+ case SW_SERVICE_FIELDTYPE_TABLE_FORMULA: nRet = PROPERTY_MAP_FLDTYP_TABLE_FORMULA; break;
+ case SW_SERVICE_FIELDTYPE_PAGE_COUNT:
+ case SW_SERVICE_FIELDTYPE_PARAGRAPH_COUNT:
+ case SW_SERVICE_FIELDTYPE_WORD_COUNT:
+ case SW_SERVICE_FIELDTYPE_CHARACTER_COUNT:
+ case SW_SERVICE_FIELDTYPE_TABLE_COUNT:
+ case SW_SERVICE_FIELDTYPE_GRAPHIC_OBJECT_COUNT:
+ case SW_SERVICE_FIELDTYPE_EMBEDDED_OBJECT_COUNT: nRet = PROPERTY_MAP_FLDTYP_DOCSTAT; break;
+ case SW_SERVICE_FIELDTYPE_DOCINFO_CHANGE_AUTHOR:
+ case SW_SERVICE_FIELDTYPE_DOCINFO_CREATE_AUTHOR:
+ case SW_SERVICE_FIELDTYPE_DOCINFO_PRINT_AUTHOR: nRet = PROPERTY_MAP_FLDTYP_DOCINFO_AUTHOR; break;
+ case SW_SERVICE_FIELDTYPE_DOCINFO_CHANGE_DATE_TIME:
+ case SW_SERVICE_FIELDTYPE_DOCINFO_CREATE_DATE_TIME:
+ case SW_SERVICE_FIELDTYPE_DOCINFO_PRINT_DATE_TIME: nRet = PROPERTY_MAP_FLDTYP_DOCINFO_DATE_TIME; break;
+ case SW_SERVICE_FIELDTYPE_DOCINFO_EDIT_TIME: nRet = PROPERTY_MAP_FLDTYP_DOCINFO_EDIT_TIME; break;
+ case SW_SERVICE_FIELDTYPE_DOCINFO_CUSTOM: nRet = PROPERTY_MAP_FLDTYP_DOCINFO_CUSTOM; break;
+ case SW_SERVICE_FIELDTYPE_DOCINFO_DESCRIPTION:
+ case SW_SERVICE_FIELDTYPE_DOCINFO_KEY_WORDS:
+ case SW_SERVICE_FIELDTYPE_DOCINFO_SUBJECT:
+ case SW_SERVICE_FIELDTYPE_DOCINFO_TITLE: nRet = PROPERTY_MAP_FLDTYP_DOCINFO_MISC; break;
+ case SW_SERVICE_FIELDTYPE_DOCINFO_REVISION: nRet = PROPERTY_MAP_FLDTYP_DOCINFO_REVISION; break;
+ case SW_SERVICE_FIELDTYPE_BIBLIOGRAPHY: nRet = PROPERTY_MAP_FLDTYP_BIBLIOGRAPHY; break;
+ case SW_SERVICE_FIELDTYPE_DUMMY_0:
+ case SW_SERVICE_FIELDTYPE_COMBINED_CHARACTERS: nRet = PROPERTY_MAP_FLDTYP_COMBINED_CHARACTERS; break;
+ case SW_SERVICE_FIELDTYPE_DROPDOWN: nRet = PROPERTY_MAP_FLDTYP_DROPDOWN; break;
+ case SW_SERVICE_FIELDTYPE_DUMMY_4:
+ case SW_SERVICE_FIELDTYPE_DUMMY_5:
+ case SW_SERVICE_FIELDTYPE_DUMMY_6:
+ case SW_SERVICE_FIELDTYPE_DUMMY_7:
+ nRet = PROPERTY_MAP_FLDTYP_DUMMY_0; break;
+ case SW_SERVICE_FIELDMASTER_USER: nRet = PROPERTY_MAP_FLDMSTR_USER; break;
+ case SW_SERVICE_FIELDMASTER_DDE: nRet = PROPERTY_MAP_FLDMSTR_DDE; break;
+ case SW_SERVICE_FIELDMASTER_SET_EXP: nRet = PROPERTY_MAP_FLDMSTR_SET_EXP; break;
+ case SW_SERVICE_FIELDMASTER_DATABASE: nRet = PROPERTY_MAP_FLDMSTR_DATABASE; break;
+ case SW_SERVICE_FIELDMASTER_BIBLIOGRAPHY: nRet = PROPERTY_MAP_FLDMSTR_BIBLIOGRAPHY; break;
+ case SW_SERVICE_FIELDMASTER_DUMMY2:
+ case SW_SERVICE_FIELDMASTER_DUMMY3:
+ case SW_SERVICE_FIELDMASTER_DUMMY4:
+ case SW_SERVICE_FIELDMASTER_DUMMY5: nRet = PROPERTY_MAP_FLDMSTR_DUMMY0; break;
+ case SW_SERVICE_FIELDTYPE_HIDDEN_TEXT: nRet = PROPERTY_MAP_FLDTYP_HIDDEN_TEXT; break;
+ default:
+ OSL_FAIL( "wrong service id" );
+ nRet = USHRT_MAX;
+ }
+ return nRet;
+}
+
+/******************************************************************
+ * SwXFieldMaster
+ ******************************************************************/
+TYPEINIT1(SwXFieldMaster, SwClient);
+
+const uno::Sequence< sal_Int8 > & SwXFieldMaster::getUnoTunnelId()
+{
+ static uno::Sequence< sal_Int8 > aSeq = ::CreateUnoTunnelId();
+ return aSeq;
+}
+
+sal_Int64 SAL_CALL SwXFieldMaster::getSomething( const uno::Sequence< sal_Int8 >& rId )
+ throw(uno::RuntimeException)
+{
+ if( rId.getLength() == 16
+ && 0 == rtl_compareMemory( getUnoTunnelId().getConstArray(),
+ rId.getConstArray(), 16 ) )
+ {
+ return sal::static_int_cast< sal_Int64 >( reinterpret_cast< sal_IntPtr >(this) );
+ }
+ return 0;
+}
+
+OUString SwXFieldMaster::getImplementationName(void) throw( uno::RuntimeException )
+{
+ return C2U("SwXFieldMaster");
+}
+
+sal_Bool SwXFieldMaster::supportsService(const OUString& rServiceName) throw( uno::RuntimeException )
+{
+ sal_Bool bRet = sal_False;
+ if(rServiceName.equalsAsciiL(
+ RTL_CONSTASCII_STRINGPARAM("com.sun.star.text.TextFieldMaster")))
+ bRet = sal_True;
+ else
+ {
+ const sal_Char* pEntry;
+ switch( nResTypeId )
+ {
+ case RES_USERFLD: pEntry = "User"; break;
+ case RES_DBFLD: pEntry = "Database"; break;
+ case RES_SETEXPFLD: pEntry = "SetExpression"; break;
+ case RES_DDEFLD: pEntry = "DDE"; break;
+ case RES_AUTHORITY: pEntry = "Bibliography"; break;
+ default: pEntry = 0;
+ }
+ if( pEntry )
+ {
+ ByteString aTmp( RTL_CONSTASCII_STRINGPARAM(
+ "com.sun.star.text.fieldmaster."));
+ aTmp.Append( pEntry );
+ bRet = rServiceName.equalsAsciiL(aTmp.GetBuffer(), aTmp.Len());
+ }
+ }
+ return bRet;
+}
+
+uno::Sequence< OUString > SwXFieldMaster::getSupportedServiceNames(void) throw( uno::RuntimeException )
+{
+ uno::Sequence< OUString > aRet(2);
+ OUString* pArray = aRet.getArray();
+ pArray[0] = C2U("com.sun.star.text.TextFieldMaster");
+
+ const sal_Char* pEntry1;
+ switch( nResTypeId )
+ {
+ case RES_USERFLD: pEntry1 = "User"; break;
+ case RES_DBFLD: pEntry1 = "Database"; break;
+ case RES_SETEXPFLD: pEntry1 = "SetExpression"; break;
+ case RES_DDEFLD: pEntry1 = "DDE"; break;
+ case RES_AUTHORITY: pEntry1 = "Bibliography"; break;
+ default: pEntry1 = 0;
+ }
+ if( pEntry1 )
+ {
+ String s;
+ s.AppendAscii( "com.sun.star.text.fieldmaster." ).AppendAscii( pEntry1 );
+ pArray[1] = s;
+ }
+ return aRet;
+}
+
+SwXFieldMaster::SwXFieldMaster(SwDoc* pDoc, sal_uInt16 nResId) :
+ aLstnrCntnr( (XPropertySet*)this),
+ nResTypeId(nResId),
+ m_pDoc(pDoc),
+ m_bIsDescriptor(sal_True),
+ fParam1(0.),
+ nParam1(-1),
+ bParam1(sal_False),
+ nParam2(0)
+{
+ pDoc->GetPageDescFromPool(RES_POOLPAGE_STANDARD)->Add(this);
+}
+
+SwXFieldMaster::SwXFieldMaster(SwFieldType& rType, SwDoc* pDoc) :
+ SwClient(&rType),
+ aLstnrCntnr( (XPropertySet*)this),
+ nResTypeId(rType.Which()),
+ m_pDoc(pDoc),
+ m_bIsDescriptor(sal_False),
+ fParam1(0.),
+ nParam1(-1),
+ bParam1(sal_False)
+{
+
+}
+
+SwXFieldMaster::~SwXFieldMaster()
+{
+
+}
+
+uno::Reference< beans::XPropertySetInfo > SwXFieldMaster::getPropertySetInfo(void)
+ throw( uno::RuntimeException )
+{
+ SolarMutexGuard aGuard;
+ uno::Reference< beans::XPropertySetInfo > aRef =
+ aSwMapProvider.GetPropertySet(
+ lcl_GetPropMapIdForFieldType( nResTypeId ) )->getPropertySetInfo();
+ return aRef;
+}
+
+void SwXFieldMaster::setPropertyValue( const OUString& rPropertyName,
+ const uno::Any& rValue)
+ throw( beans::UnknownPropertyException, beans::PropertyVetoException,
+ lang::IllegalArgumentException, lang::WrappedTargetException, uno::RuntimeException)
+{
+ SolarMutexGuard aGuard;
+ SwFieldType* pType = GetFldType(sal_True);
+ if(pType)
+ {
+ sal_Bool bSetValue = sal_True;
+ if( rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_SUB_TYPE)))
+ {
+ const SvStringsDtor& rExtraArr = SwStyleNameMapper::GetExtraUINameArray();
+ String sTypeName = pType->GetName();
+ static sal_uInt16 nIds[] =
+ {
+ RES_POOLCOLL_LABEL_DRAWING - RES_POOLCOLL_EXTRA_BEGIN,
+ RES_POOLCOLL_LABEL_ABB - RES_POOLCOLL_EXTRA_BEGIN,
+ RES_POOLCOLL_LABEL_TABLE - RES_POOLCOLL_EXTRA_BEGIN,
+ RES_POOLCOLL_LABEL_FRAME- RES_POOLCOLL_EXTRA_BEGIN,
+ 0
+ };
+ for(const sal_uInt16 * pIds = nIds; *pIds; ++pIds)
+ {
+ if(sTypeName == *rExtraArr[ *pIds ] )
+ {
+ bSetValue = sal_False;
+ break;
+ }
+ }
+ }
+ if( bSetValue )
+ {
+ // nothing special to be done here for the properties
+ // UNO_NAME_DATA_BASE_NAME and UNO_NAME_DATA_BASE_URL.
+ // We just call PutValue (empty string is allowed).
+ // Thus the last property set will be used as Data Source.
+
+ sal_uInt16 nMId = GetFieldTypeMId( rPropertyName, *pType );
+ if( USHRT_MAX != nMId )
+ pType->PutValue( rValue, nMId );
+ else
+ throw beans::UnknownPropertyException(OUString ( RTL_CONSTASCII_USTRINGPARAM ( "Unknown property: " ) ) + rPropertyName, static_cast < cppu::OWeakObject * > ( this ) );
+ }
+ }
+ else if(!pType && m_pDoc &&
+ ( rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_NAME))) )
+ {
+ OUString uTmp;
+ rValue >>= uTmp;
+ String sTypeName(uTmp);
+ SwFieldType* pType2 = m_pDoc->GetFldType(nResTypeId, sTypeName, sal_False);
+
+ String sTable(SW_RES(STR_POOLCOLL_LABEL_TABLE));
+ String sDrawing(SW_RES(STR_POOLCOLL_LABEL_DRAWING));
+ String sFrame(SW_RES(STR_POOLCOLL_LABEL_FRAME));
+ String sIllustration(SW_RES(STR_POOLCOLL_LABEL_ABB));
+
+ if(pType2 ||
+ (RES_SETEXPFLD == nResTypeId &&
+ ( sTypeName == sTable || sTypeName == sDrawing ||
+ sTypeName == sFrame || sTypeName == sIllustration )))
+ {
+ throw lang::IllegalArgumentException();
+ }
+ else
+ {
+ switch(nResTypeId)
+ {
+ case RES_USERFLD :
+ {
+ SwUserFieldType aType(m_pDoc, sTypeName);
+ pType2 = m_pDoc->InsertFldType(aType);
+ ((SwUserFieldType*)pType2)->SetContent(sParam1);
+ ((SwUserFieldType*)pType2)->SetValue(fParam1);
+ ((SwUserFieldType*)pType2)->SetType(bParam1 ? nsSwGetSetExpType::GSE_EXPR : nsSwGetSetExpType::GSE_STRING);
+ }
+ break;
+ case RES_DDEFLD :
+ {
+ SwDDEFieldType aType(sTypeName, sParam1,
+ sal::static_int_cast< sal_uInt16 >(bParam1 ? sfx2::LINKUPDATE_ALWAYS : sfx2::LINKUPDATE_ONCALL));
+ pType2 = m_pDoc->InsertFldType(aType);
+ }
+ break;
+ case RES_SETEXPFLD :
+ {
+ SwSetExpFieldType aType(m_pDoc, sTypeName);
+ if(sParam1.Len())
+ aType.SetDelimiter( sParam1.GetChar(0));
+ if(nParam1 > -1 && nParam1 < MAXLEVEL)
+ aType.SetOutlineLvl(nParam1);
+ pType2 = m_pDoc->InsertFldType(aType);
+ }
+ break;
+ case RES_DBFLD :
+ {
+ ::GetString( rValue, sParam3 );
+ pType = GetFldType();
+ }
+ break;
+ }
+ if(pType2)
+ {
+ pType2->Add(this);
+ m_bIsDescriptor = sal_False;
+ }
+ else
+ throw uno::RuntimeException();
+ }
+
+ DBG_ASSERT(pType2, "kein FieldType gefunden!" );
+ }
+ else
+ {
+ switch( nResTypeId )
+ {
+ case RES_USERFLD:
+ if(rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_CONTENT)))
+ ::GetString( rValue, sParam1 );
+ else if(rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_VALUE )))
+ {
+ if(rValue.getValueType() != ::getCppuType(static_cast<const double*>(0)))
+ throw lang::IllegalArgumentException();
+ fParam1 = *(double*)rValue.getValue();
+ }
+ else if(rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_IS_EXPRESSION )))
+ {
+ if(rValue.getValueType() != ::getBooleanCppuType())
+ throw lang::IllegalArgumentException();
+ bParam1 = *(sal_Bool*)rValue.getValue();
+ }
+
+ break;
+ case RES_DBFLD:
+ if(rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_DATA_BASE_NAME)))
+ ::GetString( rValue, sParam1 );
+ else if(rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_DATA_TABLE_NAME)))
+ ::GetString( rValue, sParam2 );
+ else if(rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_DATA_COLUMN_NAME)))
+ ::GetString( rValue, sParam3 );
+ else if(rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_DATA_COMMAND_TYPE)))
+ rValue >>= nParam2;
+ if(rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_DATA_BASE_URL)))
+ ::GetString( rValue, sParam5 );
+
+ if((sParam1.Len() || sParam5.Len())
+ && sParam2.Len() && sParam3.Len())
+ GetFldType();
+ break;
+ case RES_SETEXPFLD:
+ if(rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_NUMBERING_SEPARATOR)))
+ ::GetString( rValue, sParam1 );
+ else if(rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_CHAPTER_NUMBERING_LEVEL)))
+ rValue >>= nParam1;
+ break;
+ case RES_DDEFLD:
+ {
+ sal_uInt16 nPart = rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_DDE_COMMAND_TYPE)) ? 0 :
+ rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_DDE_COMMAND_FILE)) ? 1 :
+ rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_DDE_COMMAND_ELEMENT)) ? 2 :
+ rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_IS_AUTOMATIC_UPDATE)) ? 3 : USHRT_MAX;
+ if(nPart < 3 )
+ {
+ String sTmp;
+ if(!sParam1.Len())
+ (sParam1 = sfx2::cTokenSeperator)
+ += sfx2::cTokenSeperator;
+
+ sParam1.SetToken( nPart, sfx2::cTokenSeperator,
+ ::GetString( rValue, sTmp ));
+ }
+ else if(3 == nPart)
+ bParam1 = *(sal_Bool*)rValue.getValue();
+ }
+ break;
+ default:
+ throw beans::UnknownPropertyException(OUString ( RTL_CONSTASCII_USTRINGPARAM ( "Unknown property: " ) ) + rPropertyName, static_cast < cppu::OWeakObject * > ( this ) );
+ }
+ }
+}
+
+SwFieldType* SwXFieldMaster::GetFldType(sal_Bool bDontCreate) const
+{
+ if(!bDontCreate && RES_DBFLD == nResTypeId && m_bIsDescriptor && m_pDoc)
+ {
+ SwDBData aData;
+
+ // set DataSource
+ svx::ODataAccessDescriptor aAcc;
+ if( sParam1.Len() > 0 )
+ aAcc[ svx::daDataSource ] <<= OUString(sParam1); // DataBaseName
+ else if( sParam5.Len() > 0 )
+ aAcc[ svx::daDatabaseLocation] <<= OUString(sParam5); // DataBaseURL
+ aData.sDataSource = aAcc.getDataSource();
+
+ aData.sCommand = sParam2;
+ aData.nCommandType = nParam2;
+ SwDBFieldType aType(m_pDoc, sParam3, aData);
+ SwFieldType* pType = m_pDoc->InsertFldType(aType);
+ SwXFieldMaster* pThis = ((SwXFieldMaster*)this);
+ pType->Add(pThis);
+ pThis->m_bIsDescriptor = sal_False;
+ }
+ if(m_bIsDescriptor)
+ return 0;
+ else
+ return (SwFieldType*)GetRegisteredIn();
+}
+
+typedef SwFmtFld* SwFmtFldPtr;
+SV_DECL_PTRARR(SwDependentFields, SwFmtFldPtr, 5, 5)
+SV_IMPL_PTRARR(SwDependentFields, SwFmtFldPtr)
+
+uno::Any SwXFieldMaster::getPropertyValue(const OUString& rPropertyName)
+ throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
+{
+ SolarMutexGuard aGuard;
+ uno::Any aRet;
+ SwFieldType* pType = GetFldType(sal_True);
+ if( rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_INSTANCE_NAME)) )
+ {
+ String sName;
+ if(pType)
+ SwXTextFieldMasters::getInstanceName(*pType, sName);
+ aRet <<= OUString(sName);
+ }
+ else if(pType)
+ {
+ if(rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_NAME) ))
+ {
+ aRet <<= SwXFieldMaster::GetProgrammaticName(*pType, *GetDoc());
+ }
+ else if(rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_DEPENDENT_TEXT_FIELDS)) )
+ {
+ //fill all text fields into a sequence
+ SwDependentFields aFldArr;
+ SwIterator<SwFmtFld,SwFieldType> aIter( *pType );
+ SwFmtFldPtr pFld = aIter.First();
+ while(pFld)
+ {
+ if(pFld->IsFldInDoc())
+ aFldArr.Insert(pFld, aFldArr.Count());
+ pFld = aIter.Next();
+ }
+
+ uno::Sequence<uno::Reference <text::XDependentTextField> > aRetSeq(aFldArr.Count());
+ uno::Reference<text::XDependentTextField>* pRetSeq = aRetSeq.getArray();
+ for(sal_uInt16 i = 0; i < aFldArr.Count(); i++)
+ {
+ pFld = aFldArr.GetObject(i);
+ SwXTextField * pInsert = SwXTextField::CreateSwXTextField(*GetDoc(), *pFld);
+
+ pRetSeq[i] = uno::Reference<text::XDependentTextField>(pInsert);
+ }
+ aRet <<= aRetSeq;
+ }
+ else if(pType)
+ {
+ //TODO: Properties fuer die uebrigen Feldtypen einbauen
+ sal_uInt16 nMId = GetFieldTypeMId( rPropertyName, *pType );
+ if( USHRT_MAX != nMId )
+ {
+ pType->QueryValue( aRet, nMId );
+
+ if( rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_DATA_BASE_NAME)) ||
+ rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_DATA_BASE_URL)))
+ {
+ OUString aDataSource;
+ aRet >>= aDataSource;
+ aRet <<= OUString();
+
+ OUString *pStr = 0; // only one of this properties will return
+ // a non-empty string.
+ INetURLObject aObj;
+ aObj.SetURL( aDataSource );
+ sal_Bool bIsURL = aObj.GetProtocol() != INET_PROT_NOT_VALID;
+ if (bIsURL && rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_DATA_BASE_URL)))
+ pStr = &aDataSource; // DataBaseURL
+ else if (!bIsURL && rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_DATA_BASE_NAME)))
+ pStr = &aDataSource; // DataBaseName
+
+ if (pStr)
+ aRet <<= *pStr;
+ }
+ }
+ else
+ throw beans::UnknownPropertyException(OUString ( RTL_CONSTASCII_USTRINGPARAM ( "Unknown property: " ) ) + rPropertyName, static_cast < cppu::OWeakObject * > ( this ) );
+ }
+ else
+ {
+ if(rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_DATA_COMMAND_TYPE)) )
+ aRet <<= nParam2;
+ }
+ }
+ else
+ {
+ if(rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_DATA_COMMAND_TYPE)) )
+ aRet <<= nParam2;
+ else if(rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_DEPENDENT_TEXT_FIELDS)) )
+ {
+ uno::Sequence<uno::Reference <text::XDependentTextField> > aRetSeq(0);
+ aRet <<= aRetSeq;
+ }
+ else
+ {
+ const String* pStr = 0;
+ String sStr;
+ switch ( nResTypeId )
+ {
+ case RES_USERFLD:
+ if( rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_CONTENT)) )
+ pStr = &sParam1;
+ else if(rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_VALUE )))
+ aRet <<= fParam1;
+ else if(rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_IS_EXPRESSION )))
+ aRet.setValue(&bParam1, ::getBooleanCppuType());
+ break;
+ case RES_DBFLD:
+ if(rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_DATA_BASE_NAME)) ||
+ rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_DATA_BASE_URL)))
+ {
+ pStr = 0; // only one of this properties will return
+ // a non-empty string.
+ INetURLObject aObj;
+ aObj.SetURL( sParam5 ); // SetSmartURL
+ sal_Bool bIsURL = aObj.GetProtocol() != INET_PROT_NOT_VALID;
+ if (bIsURL && rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_DATA_BASE_URL)))
+ pStr = &sParam5; // DataBaseURL
+ else if ( rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_DATA_BASE_NAME)))
+ pStr = &sParam1; // DataBaseName
+ }
+ else if(rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_DATA_TABLE_NAME)))
+ pStr = &sParam2;
+ else if(rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_DATA_COLUMN_NAME)))
+ pStr = &sParam3;
+ break;
+ case RES_SETEXPFLD:
+ if(rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_NUMBERING_SEPARATOR)))
+ pStr = &sParam1;
+ else if(rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_CHAPTER_NUMBERING_LEVEL)))
+ aRet <<= nParam1;
+ break;
+ case RES_DDEFLD:
+ {
+ sal_uInt16 nPart = rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_DDE_COMMAND_TYPE)) ? 0 :
+ rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_DDE_COMMAND_FILE)) ? 1 :
+ rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_DDE_COMMAND_ELEMENT)) ? 2 :
+ rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_IS_AUTOMATIC_UPDATE)) ? 3 : USHRT_MAX;
+ if(nPart < 3 )
+ pStr = &(sStr = sParam1.GetToken(nPart, sfx2::cTokenSeperator));
+ else if(3 == nPart)
+ aRet.setValue(&bParam1, ::getBooleanCppuType());
+ }
+ break;
+ default:
+ throw beans::UnknownPropertyException(OUString ( RTL_CONSTASCII_USTRINGPARAM ( "Unknown property: " ) ) + rPropertyName, static_cast < cppu::OWeakObject * > ( this ) );
+ }
+
+ if( pStr )
+ aRet <<= OUString( *pStr );
+ }
+ }
+ return aRet;
+}
+
+void SwXFieldMaster::addPropertyChangeListener(const OUString& /*PropertyName*/, const uno::Reference< beans::XPropertyChangeListener > & /*aListener*/) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
+{
+ DBG_WARNING("not implemented");
+}
+
+void SwXFieldMaster::removePropertyChangeListener(const OUString& /*PropertyName*/, const uno::Reference< beans::XPropertyChangeListener > & /*aListener*/) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
+{
+ DBG_WARNING("not implemented");
+}
+
+void SwXFieldMaster::addVetoableChangeListener(const OUString& /*PropertyName*/, const uno::Reference< beans::XVetoableChangeListener > & /*aListener*/) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
+{
+ DBG_WARNING("not implemented");
+}
+
+void SwXFieldMaster::removeVetoableChangeListener(const OUString& /*PropertyName*/, const uno::Reference< beans::XVetoableChangeListener > & /*aListener*/) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
+{
+ DBG_WARNING("not implemented");
+}
+
+void SwXFieldMaster::dispose(void) throw( uno::RuntimeException )
+{
+ SolarMutexGuard aGuard;
+ SwFieldType* pFldType = GetFldType(sal_True);
+ if(pFldType)
+ {
+ sal_uInt16 nTypeIdx = USHRT_MAX;
+ const SwFldTypes* pTypes = GetDoc()->GetFldTypes();
+ for( sal_uInt16 i = 0; i < pTypes->Count(); i++ )
+ {
+ if((*pTypes)[i] == pFldType)
+ nTypeIdx = i;
+ }
+
+ // zuerst alle Felder loeschen
+ SwIterator<SwFmtFld,SwFieldType> aIter( *pFldType );
+ SwFmtFld* pFld = aIter.First();
+ while(pFld)
+ {
+ // Feld im Undo?
+ SwTxtFld *pTxtFld = pFld->GetTxtFld();
+ if(pTxtFld && pTxtFld->GetTxtNode().GetNodes().IsDocNodes() )
+ {
+ SwTxtNode& rTxtNode = (SwTxtNode&)*pTxtFld->GetpTxtNode();
+ SwPaM aPam(rTxtNode, *pTxtFld->GetStart());
+ aPam.SetMark();
+ aPam.Move();
+ GetDoc()->DeleteAndJoin(aPam);
+ }
+ pFld = aIter.Next();
+ }
+ // dann den FieldType loeschen
+ GetDoc()->RemoveFldType(nTypeIdx);
+ }
+ else
+ throw uno::RuntimeException();
+}
+
+void SwXFieldMaster::addEventListener(const uno::Reference< lang::XEventListener > & aListener)
+ throw( uno::RuntimeException )
+{
+ if(!GetRegisteredIn())
+ throw uno::RuntimeException();
+ aLstnrCntnr.AddListener(aListener);
+}
+
+void SwXFieldMaster::removeEventListener(const uno::Reference< lang::XEventListener > & aListener)
+ throw( uno::RuntimeException )
+{
+ if(!GetRegisteredIn() || !aLstnrCntnr.RemoveListener(aListener))
+ throw uno::RuntimeException();
+}
+
+void SwXFieldMaster::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew)
+{
+ ClientModify(this, pOld, pNew);
+ if(!GetRegisteredIn())
+ {
+ aLstnrCntnr.Disposing();
+ m_pDoc = 0;
+ }
+}
+OUString SwXFieldMaster::GetProgrammaticName(const SwFieldType& rType, SwDoc& rDoc)
+{
+ OUString sRet(rType.GetName());
+ if(RES_SETEXPFLD == rType.Which())
+ {
+ const SwFldTypes* pTypes = rDoc.GetFldTypes();
+ for( sal_uInt16 i = 0; i <= INIT_FLDTYPES; i++ )
+ {
+ if((*pTypes)[i] == &rType)
+ {
+ sRet = SwStyleNameMapper::GetProgName ( sRet, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL );
+ break;
+ }
+ }
+ }
+ return sRet;
+}
+
+OUString SwXFieldMaster::LocalizeFormula(
+ const SwSetExpField& rFld,
+ const OUString& rFormula,
+ sal_Bool bQuery)
+{
+ const OUString sTypeName(rFld.GetTyp()->GetName());
+ OUString sProgName = SwStyleNameMapper::GetProgName(sTypeName, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL );
+ if(sProgName != sTypeName)
+ {
+ OUString sSource = bQuery ? sTypeName : sProgName;
+ OUString sDest = bQuery ? sProgName : sTypeName;
+ if(!rFormula.compareTo(sSource, sSource.getLength()))
+ {
+ OUString sTmpFormula = sDest;
+ sTmpFormula += rFormula.copy(sSource.getLength());
+ return sTmpFormula;
+ }
+ }
+ return rFormula;
+}
+
+SwXTextField* SwXTextField::CreateSwXTextField(SwDoc & rDoc, SwFmtFld const& rFmt)
+{
+ SwIterator<SwXTextField,SwFieldType> aIter(*rFmt.GetFld()->GetTyp());
+ SwXTextField * pField = 0;
+ SwXTextField * pTemp = aIter.First();
+ while (pTemp)
+ {
+ if (pTemp->GetFldFmt() == &rFmt)
+ {
+ pField = pTemp;
+ break;
+ }
+ pTemp = aIter.Next();
+ }
+ return pField ? pField : new SwXTextField( rFmt, &rDoc );
+}
+
+struct SwFieldProperties_Impl
+{
+ String sPar1;
+ String sPar2;
+ String sPar3;
+ String sPar4;
+ String sPar5;
+ String sPar6;
+ Date aDate;
+ double fDouble;
+ uno::Sequence<beans::PropertyValue> aPropSeq;
+ uno::Sequence<OUString> aStrings;
+ util::DateTime* pDateTime;
+
+ sal_Int32 nSubType;
+ sal_Int32 nFormat;
+ sal_uInt16 nUSHORT1;
+ sal_uInt16 nUSHORT2;
+ sal_Int16 nSHORT1;
+ sal_Int8 nByte1;
+ sal_Bool bFormatIsDefault;
+ sal_Bool bBool1;
+ sal_Bool bBool2;
+ sal_Bool bBool3;
+ sal_Bool bBool4;
+
+ SwFieldProperties_Impl():
+ fDouble(0.),
+ pDateTime(0),
+ nSubType(0),
+ nFormat(0),
+ nUSHORT1(0),
+ nUSHORT2(0),
+ nSHORT1(0),
+ nByte1(0),
+ bFormatIsDefault(sal_True),
+ bBool1(sal_False),
+ bBool2(sal_False),
+ bBool3(sal_False),
+ bBool4(sal_True) //Automatic language
+ {}
+ ~SwFieldProperties_Impl()
+ {delete pDateTime;}
+
+};
+
+TYPEINIT1(SwXTextField, SwClient);
+
+const uno::Sequence< sal_Int8 > & SwXTextField::getUnoTunnelId()
+{
+ static uno::Sequence< sal_Int8 > aSeq = ::CreateUnoTunnelId();
+ return aSeq;
+}
+
+sal_Int64 SAL_CALL SwXTextField::getSomething( const uno::Sequence< sal_Int8 >& rId )
+ throw(uno::RuntimeException)
+{
+ if( rId.getLength() == 16
+ && 0 == rtl_compareMemory( getUnoTunnelId().getConstArray(),
+ rId.getConstArray(), 16 ) )
+ {
+ return sal::static_int_cast< sal_Int64 >( reinterpret_cast< sal_IntPtr >(this) );
+ }
+ return 0;
+}
+
+SwXTextField::SwXTextField(sal_uInt16 nServiceId, SwDoc* pDoc) :
+ aLstnrCntnr( (XTextContent*)this),
+ pFmtFld(0),
+ m_pDoc(pDoc),
+ m_pTextObject(0),
+ m_bIsDescriptor(nServiceId != USHRT_MAX),
+ m_bCallUpdate(sal_False),
+ m_nServiceId(nServiceId),
+ m_pProps(new SwFieldProperties_Impl)
+{
+ //Set visible as default!
+ if(SW_SERVICE_FIELDTYPE_SET_EXP == nServiceId ||
+ SW_SERVICE_FIELDTYPE_DATABASE_SET_NUM == nServiceId ||
+ SW_SERVICE_FIELDTYPE_DATABASE == nServiceId ||
+ SW_SERVICE_FIELDTYPE_DATABASE_NAME == nServiceId )
+ m_pProps->bBool2 = sal_True;
+ else if(SW_SERVICE_FIELDTYPE_TABLE_FORMULA == nServiceId)
+ m_pProps->bBool1 = sal_True;
+ if(SW_SERVICE_FIELDTYPE_SET_EXP == nServiceId)
+ m_pProps->nUSHORT2 = USHRT_MAX;
+
+}
+
+SwXTextField::SwXTextField(const SwFmtFld& rFmt, SwDoc* pDc) :
+ aLstnrCntnr( (XTextContent*)this),
+ pFmtFld(&rFmt),
+ m_pDoc(pDc),
+ m_pTextObject(0),
+ m_bIsDescriptor(sal_False),
+ m_bCallUpdate(sal_False),
+ m_nServiceId( lcl_GetServiceForField( *pFmtFld->GetFld() ) ),
+ m_pProps(0)
+{
+ pDc->GetUnoCallBack()->Add(this);
+}
+
+SwXTextField::~SwXTextField()
+{
+ if ( m_pTextObject )
+ {
+ m_pTextObject->DisposeEditSource();
+ m_pTextObject->release();
+ }
+
+ delete m_pProps;
+}
+
+void SwXTextField::attachTextFieldMaster(const uno::Reference< beans::XPropertySet > & xFieldMaster)
+ throw( lang::IllegalArgumentException, uno::RuntimeException )
+{
+ SolarMutexGuard aGuard;
+ if(!m_bIsDescriptor)
+ throw uno::RuntimeException();
+ uno::Reference< lang::XUnoTunnel > xMasterTunnel(xFieldMaster, uno::UNO_QUERY);
+ if (!xMasterTunnel.is())
+ throw lang::IllegalArgumentException();
+ SwXFieldMaster* pMaster = reinterpret_cast< SwXFieldMaster * >(
+ sal::static_int_cast< sal_IntPtr >( xMasterTunnel->getSomething( SwXFieldMaster::getUnoTunnelId()) ));
+
+ SwFieldType* pFieldType = pMaster ? pMaster->GetFldType() : 0;
+ if(pFieldType && pFieldType->Which() == lcl_ServiceIdToResId(m_nServiceId))
+ {
+ m_sTypeName = pFieldType->GetName();
+ pFieldType->Add( &m_aFieldTypeClient );
+ }
+ else
+ throw lang::IllegalArgumentException();
+
+}
+
+uno::Reference< beans::XPropertySet > SwXTextField::getTextFieldMaster(void) throw( uno::RuntimeException )
+{
+ SolarMutexGuard aGuard;
+ SwFieldType* pType = 0;
+ if( m_bIsDescriptor && m_aFieldTypeClient.GetRegisteredIn() )
+ {
+ pType = (SwFieldType*)m_aFieldTypeClient.GetRegisteredIn();
+ }
+ else
+ {
+ if(!GetRegisteredIn())
+ throw uno::RuntimeException();
+ pType = pFmtFld->GetFld()->GetTyp();
+ }
+
+ SwXFieldMaster* pMaster = SwIterator<SwXFieldMaster,SwFieldType>::FirstElement( *pType );
+ if(!pMaster)
+ pMaster = new SwXFieldMaster(*pType, GetDoc());
+
+ return pMaster;
+}
+
+OUString SwXTextField::getPresentation(sal_Bool bShowCommand) throw( uno::RuntimeException )
+{
+ SolarMutexGuard aGuard;
+
+ SwField const*const pField = GetField();
+ if (!pField)
+ {
+ throw uno::RuntimeException();
+ }
+ ::rtl::OUString const ret( (bShowCommand)
+ ? pField->GetFieldName()
+ : pField->ExpandField(true) );
+ return ret;
+}
+
+void SwXTextField::attachToRange(
+ const uno::Reference< text::XTextRange > & xTextRange)
+ throw( lang::IllegalArgumentException, uno::RuntimeException )
+{
+ SolarMutexGuard aGuard;
+ if(!m_bIsDescriptor)
+ throw uno::RuntimeException();
+ uno::Reference<lang::XUnoTunnel> xRangeTunnel( xTextRange, uno::UNO_QUERY);
+ SwXTextRange* pRange = 0;
+ OTextCursorHelper* pCursor = 0;
+ if(xRangeTunnel.is())
+ {
+ pRange = reinterpret_cast< SwXTextRange * >(
+ sal::static_int_cast< sal_IntPtr >( xRangeTunnel->getSomething( SwXTextRange::getUnoTunnelId()) ));
+ pCursor = reinterpret_cast< OTextCursorHelper * >(
+ sal::static_int_cast< sal_IntPtr >( xRangeTunnel->getSomething( OTextCursorHelper::getUnoTunnelId()) ));
+ }
+
+ SwDoc* pDoc = pRange ? (SwDoc*)pRange->GetDoc() : pCursor ? (SwDoc*)pCursor->GetDoc() : 0;
+ //wurde ein FieldMaster attached, dann ist das Dokument schon festgelegt!
+ if(pDoc && (!m_pDoc || m_pDoc == pDoc))
+ {
+ SwUnoInternalPaM aPam(*pDoc);
+ //das muss jetzt sal_True liefern
+ ::sw::XTextRangeToSwPaM(aPam, xTextRange);
+ SwField* pFld = 0;
+ switch(m_nServiceId)
+ {
+ case SW_SERVICE_FIELDTYPE_ANNOTATION:
+ {
+ SwFieldType* pFldType = pDoc->GetSysFldType(RES_POSTITFLD);
+
+ DateTime aDateTime;
+ if (m_pProps->pDateTime)
+ {
+ aDateTime.SetYear(m_pProps->pDateTime->Year);
+ aDateTime.SetMonth(m_pProps->pDateTime->Month);
+ aDateTime.SetDay(m_pProps->pDateTime->Day);
+ aDateTime.SetHour(m_pProps->pDateTime->Hours);
+ aDateTime.SetMin(m_pProps->pDateTime->Minutes);
+ aDateTime.SetSec(m_pProps->pDateTime->Seconds);
+ }
+ pFld = new SwPostItField((SwPostItFieldType*)pFldType,
+ m_pProps->sPar1, m_pProps->sPar2,aDateTime);
+ if ( m_pTextObject )
+ {
+ ((SwPostItField*)pFld)->SetTextObject( m_pTextObject->CreateText() );
+ ((SwPostItField*)pFld)->SetPar2(m_pTextObject->GetText());
+ }
+ }
+ break;
+ case SW_SERVICE_FIELDTYPE_SCRIPT:
+ {
+ SwFieldType* pFldType = pDoc->GetSysFldType(RES_SCRIPTFLD);
+ pFld = new SwScriptField((SwScriptFieldType*)pFldType,
+ m_pProps->sPar1, m_pProps->sPar2,
+ m_pProps->bBool1);
+ }
+ break;
+ case SW_SERVICE_FIELDTYPE_DATETIME:
+ {
+ sal_uInt16 nSub = 0;
+ if(m_pProps->bBool1)
+ nSub |= FIXEDFLD;
+ if(m_pProps->bBool2)
+ nSub |= DATEFLD;
+ else
+ nSub |= TIMEFLD;
+ SwFieldType* pFldType = pDoc->GetSysFldType(RES_DATETIMEFLD);
+ pFld = new SwDateTimeField((SwDateTimeFieldType*)pFldType,
+ nSub, m_pProps->nFormat);
+ if(m_pProps->fDouble > 0.)
+ ((SwDateTimeField*)pFld)->SetValue( m_pProps->fDouble );
+ if(m_pProps->pDateTime)
+ {
+ uno::Any aVal; aVal <<= *m_pProps->pDateTime;
+ pFld->PutValue( aVal, FIELD_PROP_DATE_TIME );
+ }
+ ((SwDateTimeField*)pFld)->SetOffset(m_pProps->nSubType);
+ }
+ break;
+ case SW_SERVICE_FIELDTYPE_FILE_NAME:
+ {
+ SwFieldType* pFldType = pDoc->GetSysFldType(RES_FILENAMEFLD);
+ sal_Int32 nFormat = m_pProps->nFormat;
+ if(m_pProps->bBool2)
+ nFormat |= FF_FIXED;
+ pFld = new SwFileNameField((SwFileNameFieldType*)pFldType, nFormat);
+ if(m_pProps->sPar3.Len())
+ ((SwFileNameField*)pFld)->SetExpansion(m_pProps->sPar3);
+ uno::Any aFormat(&m_pProps->nFormat, ::getCppuType(&m_pProps->nFormat));
+ pFld->PutValue( aFormat, FIELD_PROP_FORMAT );
+ }
+ break;
+ case SW_SERVICE_FIELDTYPE_TEMPLATE_NAME:
+ {
+ SwFieldType* pFldType = pDoc->GetSysFldType(RES_TEMPLNAMEFLD);
+ pFld = new SwTemplNameField((SwTemplNameFieldType*)pFldType,
+ m_pProps->nFormat);
+ uno::Any aFormat(&m_pProps->nFormat, ::getCppuType(&m_pProps->nFormat));
+ pFld->PutValue(aFormat, FIELD_PROP_FORMAT);
+ }
+ break;
+ case SW_SERVICE_FIELDTYPE_CHAPTER:
+ {
+ SwFieldType* pFldType = pDoc->GetSysFldType(RES_CHAPTERFLD);
+ pFld = new SwChapterField((SwChapterFieldType*)pFldType, m_pProps->nUSHORT1);
+ ((SwChapterField*)pFld)->SetLevel(m_pProps->nByte1);
+ uno::Any aVal; aVal <<= (sal_Int16)m_pProps->nUSHORT1;
+ pFld->PutValue(aVal, FIELD_PROP_USHORT1 );
+ }
+ break;
+ case SW_SERVICE_FIELDTYPE_AUTHOR:
+ {
+ long nFormat = m_pProps->bBool1 ? AF_NAME : AF_SHORTCUT;
+ if(m_pProps->bBool2)
+ nFormat |= AF_FIXED;
+
+ SwFieldType* pFldType = pDoc->GetSysFldType(RES_AUTHORFLD);
+ pFld = new SwAuthorField((SwAuthorFieldType*)pFldType, nFormat);
+ ((SwAuthorField*)pFld)->SetExpansion(m_pProps->sPar1);
+ }
+ break;
+ case SW_SERVICE_FIELDTYPE_CONDITIONED_TEXT:
+ case SW_SERVICE_FIELDTYPE_HIDDEN_TEXT:
+ {
+ SwFieldType* pFldType = pDoc->GetSysFldType(RES_HIDDENTXTFLD);
+ pFld = new SwHiddenTxtField(((SwHiddenTxtFieldType*)pFldType),
+ m_pProps->sPar1,
+ m_pProps->sPar2, m_pProps->sPar3,
+ static_cast< sal_uInt16 >(SW_SERVICE_FIELDTYPE_HIDDEN_TEXT == m_nServiceId ?
+ TYP_HIDDENTXTFLD : TYP_CONDTXTFLD));
+ ((SwHiddenTxtField*)pFld)->SetValue(m_pProps->bBool1);
+ uno::Any aVal; aVal <<= (OUString)m_pProps->sPar4;
+ pFld->PutValue(aVal, FIELD_PROP_PAR4 );
+ }
+ break;
+ case SW_SERVICE_FIELDTYPE_HIDDEN_PARA:
+ {
+ SwFieldType* pFldType = pDoc->GetSysFldType(RES_HIDDENPARAFLD);
+ pFld = new SwHiddenParaField((SwHiddenParaFieldType*)pFldType,
+ m_pProps->sPar1);
+ ((SwHiddenParaField*)pFld)->SetHidden(m_pProps->bBool1);
+ }
+ break;
+ case SW_SERVICE_FIELDTYPE_GET_REFERENCE:
+ {
+ SwFieldType* pFldType = pDoc->GetSysFldType(RES_GETREFFLD);
+ pFld = new SwGetRefField((SwGetRefFieldType*)pFldType,
+ m_pProps->sPar1,
+ 0,
+ 0,
+ 0);
+ if(m_pProps->sPar3.Len())
+ ((SwGetRefField*)pFld)->SetExpand(m_pProps->sPar3);
+ uno::Any aVal; aVal <<=(sal_Int16)m_pProps->nUSHORT1;
+ pFld->PutValue(aVal, FIELD_PROP_USHORT1 );
+ aVal <<=(sal_Int16)m_pProps->nUSHORT2;
+ pFld->PutValue(aVal, FIELD_PROP_USHORT2 );
+ aVal <<=(sal_Int16)m_pProps->nSHORT1;
+ pFld->PutValue(aVal, FIELD_PROP_SHORT1 );
+ }
+ break;
+ case SW_SERVICE_FIELDTYPE_JUMP_EDIT:
+ {
+ SwFieldType* pFldType = pDoc->GetSysFldType(RES_JUMPEDITFLD);
+ pFld = new SwJumpEditField((SwJumpEditFieldType*)pFldType,
+ m_pProps->nUSHORT1, m_pProps->sPar2, m_pProps->sPar1);
+ }
+ break;
+ case SW_SERVICE_FIELDTYPE_DOCINFO_CHANGE_AUTHOR :
+ case SW_SERVICE_FIELDTYPE_DOCINFO_CHANGE_DATE_TIME :
+ case SW_SERVICE_FIELDTYPE_DOCINFO_EDIT_TIME :
+ case SW_SERVICE_FIELDTYPE_DOCINFO_DESCRIPTION :
+ case SW_SERVICE_FIELDTYPE_DOCINFO_CREATE_AUTHOR :
+ case SW_SERVICE_FIELDTYPE_DOCINFO_CREATE_DATE_TIME :
+ case SW_SERVICE_FIELDTYPE_DOCINFO_CUSTOM :
+ case SW_SERVICE_FIELDTYPE_DOCINFO_PRINT_AUTHOR :
+ case SW_SERVICE_FIELDTYPE_DOCINFO_PRINT_DATE_TIME :
+ case SW_SERVICE_FIELDTYPE_DOCINFO_KEY_WORDS :
+ case SW_SERVICE_FIELDTYPE_DOCINFO_SUBJECT :
+ case SW_SERVICE_FIELDTYPE_DOCINFO_TITLE :
+ case SW_SERVICE_FIELDTYPE_DOCINFO_REVISION :
+ case SW_SERVICE_FIELDTYPE_DOC_INFO:
+ {
+ SwFieldType* pFldType = pDoc->GetSysFldType(RES_DOCINFOFLD);
+ sal_uInt16 nSubType = aDocInfoSubTypeFromService[
+ m_nServiceId - SW_SERVICE_FIELDTYPE_DOCINFO_CHANGE_AUTHOR];
+ if( SW_SERVICE_FIELDTYPE_DOCINFO_CHANGE_DATE_TIME == m_nServiceId ||
+ SW_SERVICE_FIELDTYPE_DOCINFO_CREATE_DATE_TIME == m_nServiceId ||
+ SW_SERVICE_FIELDTYPE_DOCINFO_PRINT_DATE_TIME == m_nServiceId ||
+ SW_SERVICE_FIELDTYPE_DOCINFO_EDIT_TIME == m_nServiceId )
+ {
+ if(m_pProps->bBool2) //IsDate
+ {
+ nSubType &= 0xf0ff;
+ nSubType |= DI_SUB_DATE;
+ }
+ else
+ {
+ nSubType &= 0xf0ff;
+ nSubType |= DI_SUB_TIME;
+ }
+ }
+ if(m_pProps->bBool1)
+ nSubType |= DI_SUB_FIXED;
+ pFld = new SwDocInfoField((SwDocInfoFieldType*)pFldType, nSubType, m_pProps->sPar4, m_pProps->nFormat);
+ if(m_pProps->sPar3.Len())
+ ((SwDocInfoField*)pFld)->SetExpansion(m_pProps->sPar3);
+ }
+ break;
+ case SW_SERVICE_FIELDTYPE_USER_EXT:
+ {
+ sal_Int32 nFormat = 0;
+ if(m_pProps->bBool1)
+ nFormat = AF_FIXED;
+
+ SwFieldType* pFldType = pDoc->GetSysFldType(RES_EXTUSERFLD);
+ pFld = new SwExtUserField((SwExtUserFieldType*)pFldType, m_pProps->nUSHORT1, nFormat);
+ ((SwExtUserField*)pFld)->SetExpansion(m_pProps->sPar1);
+ }
+ break;
+ case SW_SERVICE_FIELDTYPE_USER:
+ {
+ SwFieldType* pFldType = pDoc->GetFldType(RES_USERFLD, m_sTypeName, sal_True);
+ if(!pFldType)
+ throw uno::RuntimeException();
+ sal_uInt16 nUserSubType = m_pProps->bBool1 ? nsSwExtendedSubType::SUB_INVISIBLE : 0;
+ if(m_pProps->bBool2)
+ nUserSubType |= nsSwExtendedSubType::SUB_CMD;
+ if(m_pProps->bFormatIsDefault &&
+ nsSwGetSetExpType::GSE_STRING == ((SwUserFieldType*)pFldType)->GetType())
+ m_pProps->nFormat = -1;
+ pFld = new SwUserField((SwUserFieldType*)pFldType,
+ nUserSubType,
+ m_pProps->nFormat);
+ }
+ break;
+ case SW_SERVICE_FIELDTYPE_REF_PAGE_SET:
+ {
+ SwFieldType* pFldType = pDoc->GetSysFldType(RES_REFPAGESETFLD);
+ pFld = new SwRefPageSetField( (SwRefPageSetFieldType*)pFldType,
+ m_pProps->nUSHORT1,
+ m_pProps->bBool1 );
+ }
+ break;
+ case SW_SERVICE_FIELDTYPE_REF_PAGE_GET:
+ {
+ SwFieldType* pFldType = pDoc->GetSysFldType(RES_REFPAGEGETFLD);
+ pFld = new SwRefPageGetField( (SwRefPageGetFieldType*)pFldType,
+ m_pProps->nUSHORT1 );
+ ((SwRefPageGetField*)pFld)->SetText(m_pProps->sPar1);
+ }
+ break;
+ case SW_SERVICE_FIELDTYPE_PAGE_NUM:
+ {
+ SwFieldType* pFldType = pDoc->GetSysFldType(RES_PAGENUMBERFLD);
+ pFld = new SwPageNumberField((SwPageNumberFieldType*)pFldType,
+ PG_RANDOM,
+ m_pProps->nFormat,
+ m_pProps->nUSHORT1);
+ ((SwPageNumberField*)pFld)->SetUserString(m_pProps->sPar1);
+ uno::Any aVal; aVal <<= m_pProps->nSubType;
+ pFld->PutValue( aVal, FIELD_PROP_SUBTYPE );
+ }
+ break;
+ case SW_SERVICE_FIELDTYPE_DDE:
+ {
+ SwFieldType* pFldType = pDoc->GetFldType(RES_DDEFLD, m_sTypeName, sal_True);
+ if(!pFldType)
+ throw uno::RuntimeException();
+ pFld = new SwDDEField( (SwDDEFieldType*)pFldType );
+ }
+ break;
+ case SW_SERVICE_FIELDTYPE_DATABASE_NAME:
+ {
+ SwFieldType* pFldType = pDoc->GetSysFldType(RES_DBNAMEFLD);
+ SwDBData aData;
+ aData.sDataSource = m_pProps->sPar1;
+ aData.sCommand = m_pProps->sPar2;
+ aData.nCommandType = m_pProps->nSHORT1;
+ pFld = new SwDBNameField((SwDBNameFieldType*)pFldType, aData);
+ sal_uInt16 nSubType = pFld->GetSubType();
+ if(m_pProps->bBool2)
+ nSubType &= ~nsSwExtendedSubType::SUB_INVISIBLE;
+ else
+ nSubType |= nsSwExtendedSubType::SUB_INVISIBLE;
+ pFld->SetSubType(nSubType);
+ }
+ break;
+ case SW_SERVICE_FIELDTYPE_DATABASE_NEXT_SET:
+ {
+ SwDBData aData;
+ aData.sDataSource = m_pProps->sPar1;
+ aData.sCommand = m_pProps->sPar2;
+ aData.nCommandType = m_pProps->nSHORT1;
+ SwFieldType* pFldType = pDoc->GetSysFldType(RES_DBNEXTSETFLD);
+ pFld = new SwDBNextSetField((SwDBNextSetFieldType*)pFldType,
+ m_pProps->sPar3, aEmptyStr,
+ aData);
+ }
+ break;
+ case SW_SERVICE_FIELDTYPE_DATABASE_NUM_SET:
+ {
+ SwDBData aData;
+ aData.sDataSource = m_pProps->sPar1;
+ aData.sCommand = m_pProps->sPar2;
+ aData.nCommandType = m_pProps->nSHORT1;
+ pFld = new SwDBNumSetField( (SwDBNumSetFieldType*)
+ pDoc->GetSysFldType(RES_DBNUMSETFLD),
+ m_pProps->sPar3,
+ String::CreateFromInt32(m_pProps->nFormat),
+ aData );
+ }
+ break;
+ case SW_SERVICE_FIELDTYPE_DATABASE_SET_NUM:
+ {
+ SwDBData aData;
+ aData.sDataSource = m_pProps->sPar1;
+ aData.sCommand = m_pProps->sPar2;
+ aData.nCommandType = m_pProps->nSHORT1;
+ pFld = new SwDBSetNumberField((SwDBSetNumberFieldType*)
+ pDoc->GetSysFldType(RES_DBSETNUMBERFLD),
+ aData,
+ m_pProps->nUSHORT1);
+ ((SwDBSetNumberField*)pFld)->SetSetNumber(m_pProps->nFormat);
+ sal_uInt16 nSubType = pFld->GetSubType();
+ if(m_pProps->bBool2)
+ nSubType &= ~nsSwExtendedSubType::SUB_INVISIBLE;
+ else
+ nSubType |= nsSwExtendedSubType::SUB_INVISIBLE;
+ pFld->SetSubType(nSubType);
+ }
+ break;
+ case SW_SERVICE_FIELDTYPE_DATABASE:
+ {
+ SwFieldType* pFldType = pDoc->GetFldType(RES_DBFLD, m_sTypeName, sal_False);
+ if(!pFldType)
+ throw uno::RuntimeException();
+ pFld = new SwDBField((SwDBFieldType*)pFldType, m_pProps->nFormat);
+ ((SwDBField*)pFld)->InitContent(m_pProps->sPar1);
+ sal_uInt16 nSubType = pFld->GetSubType();
+ if(m_pProps->bBool2)
+ nSubType &= ~nsSwExtendedSubType::SUB_INVISIBLE;
+ else
+ nSubType |= nsSwExtendedSubType::SUB_INVISIBLE;
+ pFld->SetSubType(nSubType);
+ }
+ break;
+ case SW_SERVICE_FIELDTYPE_SET_EXP:
+ {
+ SwFieldType* pFldType = pDoc->GetFldType(RES_SETEXPFLD, m_sTypeName, sal_True);
+ if(!pFldType)
+ throw uno::RuntimeException();
+ // detect the field type's sub type and set an appropriate number format
+ if(m_pProps->bFormatIsDefault &&
+ nsSwGetSetExpType::GSE_STRING == ((SwSetExpFieldType*)pFldType)->GetType())
+ m_pProps->nFormat = -1;
+ pFld = new SwSetExpField((SwSetExpFieldType*)pFldType,
+ m_pProps->sPar2,
+ m_pProps->nUSHORT2 != USHRT_MAX ? //#i79471# the field can have a number format or a number_ing_ format
+ m_pProps->nUSHORT2 : m_pProps->nFormat);
+
+ sal_uInt16 nSubType = pFld->GetSubType();
+ if(m_pProps->bBool2)
+ nSubType &= ~nsSwExtendedSubType::SUB_INVISIBLE;
+ else
+ nSubType |= nsSwExtendedSubType::SUB_INVISIBLE;
+ if(m_pProps->bBool3)
+ nSubType |= nsSwExtendedSubType::SUB_CMD;
+ else
+ nSubType &= ~nsSwExtendedSubType::SUB_CMD;
+ pFld->SetSubType(nSubType);
+ ((SwSetExpField*)pFld)->SetSeqNumber( m_pProps->nUSHORT1 );
+ ((SwSetExpField*)pFld)->SetInputFlag(m_pProps->bBool1);
+ ((SwSetExpField*)pFld)->SetPromptText(m_pProps->sPar3);
+ if(m_pProps->sPar4.Len())
+ ((SwSetExpField*)pFld)->ChgExpStr(m_pProps->sPar4);
+
+ }
+ break;
+ case SW_SERVICE_FIELDTYPE_GET_EXP:
+ {
+ sal_uInt16 nSubType;
+ switch(m_pProps->nSubType)
+ {
+ case text::SetVariableType::STRING: nSubType = nsSwGetSetExpType::GSE_STRING; break;
+ case text::SetVariableType::VAR: nSubType = nsSwGetSetExpType::GSE_EXPR; break;
+ //case text::SetVariableType::SEQUENCE: nSubType = nsSwGetSetExpType::GSE_SEQ; break;
+ case text::SetVariableType::FORMULA: nSubType = nsSwGetSetExpType::GSE_FORMULA; break;
+ default:
+ OSL_FAIL("wrong value");
+ nSubType = nsSwGetSetExpType::GSE_EXPR;
+ }
+ //make sure the SubType matches the field type
+ SwFieldType* pSetExpFld = pDoc->GetFldType(RES_SETEXPFLD, m_pProps->sPar1, sal_False);
+ bool bSetGetExpFieldUninitialized = false;
+ if( pSetExpFld )
+ {
+ if( nSubType != nsSwGetSetExpType::GSE_STRING &&
+ static_cast< SwSetExpFieldType* >(pSetExpFld)->GetType() == nsSwGetSetExpType::GSE_STRING )
+ nSubType = nsSwGetSetExpType::GSE_STRING;
+ }
+ else
+ bSetGetExpFieldUninitialized = true; // #i82544#
+
+ if(m_pProps->bBool2)
+ nSubType |= nsSwExtendedSubType::SUB_CMD;
+ else
+ nSubType &= ~nsSwExtendedSubType::SUB_CMD;
+ pFld = new SwGetExpField((SwGetExpFieldType*)
+ pDoc->GetSysFldType(RES_GETEXPFLD),
+ m_pProps->sPar1, nSubType, m_pProps->nFormat);
+ //TODO: SubType auswerten!
+ if(m_pProps->sPar4.Len())
+ ((SwGetExpField*)pFld)->ChgExpStr(m_pProps->sPar4);
+ // #i82544#
+ if( bSetGetExpFieldUninitialized )
+ ((SwGetExpField*)pFld)->SetLateInitialization();
+ }
+ break;
+ case SW_SERVICE_FIELDTYPE_INPUT_USER:
+ case SW_SERVICE_FIELDTYPE_INPUT:
+ {
+ SwFieldType* pFldType = pDoc->GetFldType(RES_INPUTFLD, m_sTypeName, sal_True);
+ if(!pFldType)
+ throw uno::RuntimeException();
+ sal_uInt16 nInpSubType = sal::static_int_cast< sal_uInt16 >(SW_SERVICE_FIELDTYPE_INPUT_USER == m_nServiceId ? INP_USR : INP_TXT);
+ SwInputField * pTxtField =
+ new SwInputField((SwInputFieldType*)pFldType,
+ m_pProps->sPar1, m_pProps->sPar2,
+ nInpSubType);
+ pTxtField->SetHelp(m_pProps->sPar3);
+ pTxtField->SetToolTip(m_pProps->sPar4);
+
+ pFld = pTxtField;
+ }
+ break;
+ case SW_SERVICE_FIELDTYPE_MACRO:
+ {
+ SwFieldType* pFldType = pDoc->GetSysFldType(RES_MACROFLD);
+ String aName;
+
+ // support for Scripting Framework macros
+ if (m_pProps->sPar4.Len() != 0)
+ {
+ aName = m_pProps->sPar4;
+ }
+ else
+ {
+ SwMacroField::CreateMacroString(
+ aName, m_pProps->sPar1, m_pProps->sPar3 );
+ }
+ pFld = new SwMacroField((SwMacroFieldType*)pFldType, aName,
+ m_pProps->sPar2);
+ }
+ break;
+ case SW_SERVICE_FIELDTYPE_PAGE_COUNT :
+ case SW_SERVICE_FIELDTYPE_PARAGRAPH_COUNT :
+ case SW_SERVICE_FIELDTYPE_WORD_COUNT :
+ case SW_SERVICE_FIELDTYPE_CHARACTER_COUNT :
+ case SW_SERVICE_FIELDTYPE_TABLE_COUNT :
+ case SW_SERVICE_FIELDTYPE_GRAPHIC_OBJECT_COUNT :
+ case SW_SERVICE_FIELDTYPE_EMBEDDED_OBJECT_COUNT :
+ {
+ sal_uInt16 nSubType = DS_PAGE;
+ switch(m_nServiceId)
+ {
+// case SW_SERVICE_FIELDTYPE_PAGE_COUNT : break;
+ case SW_SERVICE_FIELDTYPE_PARAGRAPH_COUNT : nSubType = DS_PARA;break;
+ case SW_SERVICE_FIELDTYPE_WORD_COUNT : nSubType = DS_WORD;break;
+ case SW_SERVICE_FIELDTYPE_CHARACTER_COUNT : nSubType = DS_CHAR;break;
+ case SW_SERVICE_FIELDTYPE_TABLE_COUNT : nSubType = DS_TBL;break;
+ case SW_SERVICE_FIELDTYPE_GRAPHIC_OBJECT_COUNT : nSubType = DS_GRF;break;
+ case SW_SERVICE_FIELDTYPE_EMBEDDED_OBJECT_COUNT : nSubType = DS_OLE;break;
+ }
+ SwFieldType* pFldType = pDoc->GetSysFldType(RES_DOCSTATFLD);
+ pFld = new SwDocStatField((SwDocStatFieldType*)pFldType, nSubType, m_pProps->nUSHORT2);
+ }
+ break;
+ case SW_SERVICE_FIELDTYPE_BIBLIOGRAPHY:
+ pFld = new SwAuthorityField( (SwAuthorityFieldType*)
+ pDoc->InsertFldType(SwAuthorityFieldType(pDoc)),
+ aEmptyStr );
+ if(m_pProps->aPropSeq.getLength())
+ {
+ uno::Any aVal; aVal <<= m_pProps->aPropSeq;
+ pFld->PutValue( aVal, FIELD_PROP_PROP_SEQ );
+ }
+ break;
+ case SW_SERVICE_FIELDTYPE_COMBINED_CHARACTERS:
+ // create field
+ pFld = new SwCombinedCharField( (SwCombinedCharFieldType*)
+ pDoc->GetSysFldType(RES_COMBINED_CHARS),
+ m_pProps->sPar1);
+ break;
+ case SW_SERVICE_FIELDTYPE_DROPDOWN:
+ pFld = new SwDropDownField
+ ((SwDropDownFieldType *)
+ pDoc->GetSysFldType(RES_DROPDOWN));
+
+ ((SwDropDownField *) pFld)->SetItems(m_pProps->aStrings);
+ ((SwDropDownField *) pFld)->SetSelectedItem(m_pProps->sPar1);
+ ((SwDropDownField *) pFld)->SetName(m_pProps->sPar2);
+ ((SwDropDownField *) pFld)->SetHelp(m_pProps->sPar3);
+ ((SwDropDownField *) pFld)->SetToolTip(m_pProps->sPar4);
+ break;
+
+ case SW_SERVICE_FIELDTYPE_TABLE_FORMULA :
+ {
+
+ // create field
+ sal_uInt16 nType = nsSwGetSetExpType::GSE_FORMULA;
+ if(m_pProps->bBool1)
+ {
+ nType |= nsSwExtendedSubType::SUB_CMD;
+ if(m_pProps->bFormatIsDefault)
+ m_pProps->nFormat = -1;
+ }
+ pFld = new SwTblField( (SwTblFieldType*)
+ pDoc->GetSysFldType(RES_TABLEFLD),
+ m_pProps->sPar2,
+ nType,
+ m_pProps->nFormat);
+ ((SwTblField*)pFld)->ChgExpStr(m_pProps->sPar1);
+ }
+ break;
+ default: OSL_FAIL("was ist das fuer ein Typ?");
+ }
+ if(pFld)
+ {
+ pFld->SetAutomaticLanguage(!m_pProps->bBool4);
+ SwFmtFld aFmt( *pFld );
+
+ UnoActionContext aCont(pDoc);
+ SwTxtAttr* pTxtAttr = 0;
+ if(aPam.HasMark())
+ pDoc->DeleteAndJoin(aPam);
+
+ SwXTextCursor const*const pTextCursor(
+ dynamic_cast<SwXTextCursor*>(pCursor));
+ const bool bForceExpandHints( (pTextCursor)
+ ? pTextCursor->IsAtEndOfMeta() : false );
+ const SetAttrMode nInsertFlags = (bForceExpandHints)
+ ? nsSetAttrMode::SETATTR_FORCEHINTEXPAND
+ : nsSetAttrMode::SETATTR_DEFAULT;
+
+ pDoc->InsertPoolItem(aPam, aFmt, nInsertFlags);
+
+ pTxtAttr = aPam.GetNode()->GetTxtNode()->GetTxtAttrForCharAt(
+ aPam.GetPoint()->nContent.GetIndex()-1, RES_TXTATR_FIELD);
+
+ // was passiert mit dem Update der Felder ? (siehe fldmgr.cxx)
+ if(pTxtAttr)
+ {
+ const SwFmtFld& rFld = pTxtAttr->GetFld();
+ pFmtFld = &rFld;
+ }
+ }
+ delete pFld;
+
+ m_pDoc = pDoc;
+ m_pDoc->GetUnoCallBack()->Add(this);
+ m_bIsDescriptor = sal_False;
+ if(m_aFieldTypeClient.GetRegisteredIn())
+ const_cast<SwModify*>(m_aFieldTypeClient.GetRegisteredIn())->Remove(&m_aFieldTypeClient);
+ DELETEZ(m_pProps);
+ if(m_bCallUpdate)
+ update();
+ }
+ else
+ throw lang::IllegalArgumentException();
+}
+
+void SwXTextField::attach(const uno::Reference< text::XTextRange > & xTextRange)
+ throw( lang::IllegalArgumentException, uno::RuntimeException )
+{
+ SolarMutexGuard aGuard;
+ attachToRange( xTextRange );
+}
+
+uno::Reference< text::XTextRange > SwXTextField::getAnchor(void) throw( uno::RuntimeException )
+{
+ SolarMutexGuard aGuard;
+ uno::Reference< text::XTextRange > aRef;
+ SwField* pField = (SwField*)GetField();
+ if(pField)
+ {
+ const SwTxtFld* pTxtFld = pFmtFld->GetTxtFld();
+ if(!pTxtFld)
+ throw uno::RuntimeException();
+ const SwTxtNode& rTxtNode = pTxtFld->GetTxtNode();
+
+ SwPaM aPam(rTxtNode, *pTxtFld->GetStart() + 1, rTxtNode, *pTxtFld->GetStart());
+
+ aRef = SwXTextRange::CreateXTextRange(
+ *m_pDoc, *aPam.GetPoint(), aPam.GetMark());
+ }
+ return aRef;
+
+}
+
+void SwXTextField::dispose(void) throw( uno::RuntimeException )
+{
+ SolarMutexGuard aGuard;
+ SwField* pField = (SwField*)GetField();
+ if(pField)
+ {
+ UnoActionContext aContext(GetDoc());
+ const SwTxtFld* pTxtFld = pFmtFld->GetTxtFld();
+ SwTxtNode& rTxtNode = (SwTxtNode&)*pTxtFld->GetpTxtNode();
+ SwPaM aPam(rTxtNode, *pTxtFld->GetStart());
+ aPam.SetMark();
+ aPam.Move();
+ GetDoc()->DeleteAndJoin(aPam);
+ }
+
+ if ( m_pTextObject )
+ {
+ m_pTextObject->DisposeEditSource();
+ m_pTextObject->release();
+ m_pTextObject = 0;
+ }
+}
+
+void SwXTextField::addEventListener(const uno::Reference< lang::XEventListener > & aListener) throw( uno::RuntimeException )
+{
+ if(!GetRegisteredIn())
+ throw uno::RuntimeException();
+ aLstnrCntnr.AddListener(aListener);
+}
+
+void SwXTextField::removeEventListener(const uno::Reference< lang::XEventListener > & aListener) throw( uno::RuntimeException )
+{
+ if(!GetRegisteredIn() || !aLstnrCntnr.RemoveListener(aListener))
+ throw uno::RuntimeException();
+}
+
+uno::Reference< beans::XPropertySetInfo > SwXTextField::getPropertySetInfo(void)
+ throw( uno::RuntimeException )
+{
+ SolarMutexGuard aGuard;
+ //kein static
+ uno::Reference< beans::XPropertySetInfo > aRef;
+ if(m_nServiceId != USHRT_MAX)
+ {
+ const SfxItemPropertySet* pPropSet = aSwMapProvider.GetPropertySet(
+ lcl_GetPropertyMapOfService( m_nServiceId ));
+ uno::Reference< beans::XPropertySetInfo > xInfo = pPropSet->getPropertySetInfo();
+ // extend PropertySetInfo!
+ const uno::Sequence<beans::Property> aPropSeq = xInfo->getProperties();
+ aRef = new SfxExtItemPropertySetInfo(
+ aSwMapProvider.GetPropertyMapEntries(PROPERTY_MAP_PARAGRAPH_EXTENSIONS),
+ aPropSeq );
+ }
+ else
+ throw uno::RuntimeException();
+ return aRef;
+}
+
+void SwXTextField::setPropertyValue(const OUString& rPropertyName, const uno::Any& rValue)
+ throw( beans::UnknownPropertyException, beans::PropertyVetoException, lang::IllegalArgumentException,
+ lang::WrappedTargetException, uno::RuntimeException )
+{
+ SolarMutexGuard aGuard;
+ SwField* pField = (SwField*)GetField();
+ const SfxItemPropertySet* _pPropSet = aSwMapProvider.GetPropertySet(
+ lcl_GetPropertyMapOfService( m_nServiceId));
+ const SfxItemPropertySimpleEntry* pEntry = _pPropSet->getPropertyMap()->getByName(rPropertyName);
+
+ if (!pEntry)
+ throw beans::UnknownPropertyException(OUString ( RTL_CONSTASCII_USTRINGPARAM ( "Unknown property: " ) ) + rPropertyName, static_cast < cppu::OWeakObject * > ( this ) );
+ if ( pEntry->nFlags & beans::PropertyAttribute::READONLY)
+ throw beans::PropertyVetoException ( OUString ( RTL_CONSTASCII_USTRINGPARAM ( "Property is read-only: " ) ) + rPropertyName, static_cast < cppu::OWeakObject * > ( this ) );
+
+ if(pField)
+ {
+ // Sonderbehandlung Serienbrieffeld
+ sal_uInt16 nWhich = pField->Which();
+ if( RES_DBFLD == nWhich &&
+ (rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_DATA_BASE_NAME)) ||
+ rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_DATA_BASE_URL))||
+ rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_DATA_TABLE_NAME))||
+ rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_NAME_DATA_COLUMN_NAME))))
+ {
+ // hier muss ein neuer Feldtyp angelegt werden und
+ // das Feld an den neuen Typ umgehaengt werden
+ DBG_WARNING("not implemented");
+ }
+ else
+ {
+ SwDoc * pDoc = GetDoc();
+
+ if (NULL != pDoc)
+ {
+ const SwTxtFld* pTxtFld = pFmtFld->GetTxtFld();
+ if(!pTxtFld)
+ throw uno::RuntimeException();
+ SwPosition aPosition( pTxtFld->GetTxtNode() );
+ aPosition.nContent = *pTxtFld->GetStart();
+ pDoc->PutValueToField( aPosition, rValue, pEntry->nWID);
+ }
+ }
+ pField->PutValue( rValue, pEntry->nWID );
+
+ //#i100374# notify SwPostIt about new field content
+ if (RES_POSTITFLD== nWhich && pFmtFld)
+ {
+ const_cast<SwFmtFld*>(pFmtFld)->Broadcast(SwFmtFldHint( 0, SWFMTFLD_CHANGED ));
+ }
+
+ // changes of the expanded string have to be notified
+ //#to the SwTxtFld
+ if(RES_DBFLD == nWhich && pFmtFld->GetTxtFld())
+ {
+ pFmtFld->GetTxtFld()->Expand();
+ }
+
+ //#i100374# changing a document field should set the modify flag
+ SwDoc* pDoc = GetDoc();
+ if (pDoc)
+ pDoc->SetModified();
+
+ }
+ else if(m_pProps)
+ {
+ String* pStr = 0;
+ sal_Bool* pBool = 0;
+ switch(pEntry->nWID)
+ {
+ case FIELD_PROP_PAR1:
+ pStr = &m_pProps->sPar1;
+ break;
+ case FIELD_PROP_PAR2:
+ pStr = &m_pProps->sPar2;
+ break;
+ case FIELD_PROP_PAR3:
+ pStr = &m_pProps->sPar3;
+ break;
+ case FIELD_PROP_PAR4:
+ pStr = &m_pProps->sPar4;
+ break;
+ case FIELD_PROP_FORMAT:
+ rValue >>= m_pProps->nFormat;
+ m_pProps->bFormatIsDefault = sal_False;
+ break;
+ case FIELD_PROP_SUBTYPE:
+ m_pProps->nSubType = SWUnoHelper::GetEnumAsInt32( rValue );
+ break;
+ case FIELD_PROP_BYTE1 :
+ rValue >>= m_pProps->nByte1;
+ break;
+ case FIELD_PROP_BOOL1 :
+ pBool = &m_pProps->bBool1;
+ break;
+ case FIELD_PROP_BOOL2 :
+ pBool = &m_pProps->bBool2;
+ break;
+ case FIELD_PROP_BOOL3 :
+ pBool = &m_pProps->bBool3;
+ break;
+ case FIELD_PROP_BOOL4:
+ pBool = &m_pProps->bBool4;
+ break;
+ case FIELD_PROP_DATE :
+ {
+ if(rValue.getValueType() != ::getCppuType(static_cast<const util::Date*>(0)))
+ throw lang::IllegalArgumentException();
+
+ util::Date aTemp = *(const util::Date*)rValue.getValue();
+ m_pProps->aDate = Date(aTemp.Day, aTemp.Month, aTemp.Year);
+ }
+ break;
+ case FIELD_PROP_USHORT1:
+ case FIELD_PROP_USHORT2:
+ {
+ sal_Int16 nVal = 0;
+ rValue >>= nVal;
+ if( FIELD_PROP_USHORT1 == pEntry->nWID)
+ m_pProps->nUSHORT1 = nVal;
+ else
+ m_pProps->nUSHORT2 = nVal;
+ }
+ break;
+ case FIELD_PROP_SHORT1:
+ rValue >>= m_pProps->nSHORT1;
+ break;
+ case FIELD_PROP_DOUBLE:
+ if(rValue.getValueType() != ::getCppuType(static_cast<const double*>(0)))
+ throw lang::IllegalArgumentException();
+ m_pProps->fDouble = *(double*)rValue.getValue();
+ break;
+
+ case FIELD_PROP_DATE_TIME :
+ if(!m_pProps->pDateTime)
+ m_pProps->pDateTime = new util::DateTime;
+ rValue >>= (*m_pProps->pDateTime);
+ break;
+ case FIELD_PROP_PROP_SEQ:
+ rValue >>= m_pProps->aPropSeq;
+ break;
+ case FIELD_PROP_STRINGS:
+ rValue >>= m_pProps->aStrings;
+ break;
+ }
+ if( pStr )
+ ::GetString( rValue, *pStr );
+ else if( pBool )
+ {
+ if( rValue.getValueType() == getCppuBooleanType() )
+ *pBool = *(sal_Bool*)rValue.getValue();
+ else
+ throw lang::IllegalArgumentException();
+ }
+ }
+ else
+ throw uno::RuntimeException();
+}
+
+uno::Any SwXTextField::getPropertyValue(const OUString& rPropertyName)
+ throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
+{
+ SolarMutexGuard aGuard;
+ uno::Any aRet;
+ const SwField* pField = GetField();
+ const SfxItemPropertySet* _pPropSet = aSwMapProvider.GetPropertySet(
+ lcl_GetPropertyMapOfService( m_nServiceId));
+ const SfxItemPropertySimpleEntry* pEntry = _pPropSet->getPropertyMap()->getByName(rPropertyName);
+ if(!pEntry )
+ {
+ const SfxItemPropertySet* _pParaPropSet = aSwMapProvider.GetPropertySet(PROPERTY_MAP_PARAGRAPH_EXTENSIONS);
+ pEntry = _pParaPropSet->getPropertyMap()->getByName(rPropertyName);
+ }
+ if (!pEntry)
+ throw beans::UnknownPropertyException(OUString ( RTL_CONSTASCII_USTRINGPARAM ( "Unknown property: " ) ) + rPropertyName, static_cast < cppu::OWeakObject * > ( this ) );
+
+ switch( pEntry->nWID )
+ {
+ case FN_UNO_TEXT_WRAP:
+ aRet <<= text::WrapTextMode_NONE;
+ break;
+ case FN_UNO_ANCHOR_TYPE:
+ aRet <<= text::TextContentAnchorType_AS_CHARACTER;
+ break;
+ case FN_UNO_ANCHOR_TYPES:
+ {
+ uno::Sequence<text::TextContentAnchorType> aTypes(1);
+ text::TextContentAnchorType* pArray = aTypes.getArray();
+ pArray[0] = text::TextContentAnchorType_AS_CHARACTER;
+ aRet.setValue(&aTypes, ::getCppuType(static_cast<uno::Sequence<text::TextContentAnchorType>*>(0)));
+ }
+ break;
+
+ default:
+ if( pField )
+ {
+ if (FIELD_PROP_IS_FIELD_USED == pEntry->nWID ||
+ FIELD_PROP_IS_FIELD_DISPLAYED == pEntry->nWID)
+ {
+ sal_Bool bIsFieldUsed = sal_False;
+ sal_Bool bIsFieldDisplayed = sal_False;
+
+ // in order to have the information about fields
+ // correctly evaluated the document needs a layout
+ // (has to be already formatted)
+ SwDoc *pDoc = GetDoc();
+ ViewShell *pViewShell = 0;
+ SwEditShell *pEditShell = pDoc ? pDoc->GetEditShell( &pViewShell ) : 0;
+ if (pEditShell)
+ pEditShell->CalcLayout();
+ else if (pViewShell) // a page preview has no SwEditShell it should only have a view shell
+ pViewShell->CalcLayout();
+ else
+ throw uno::RuntimeException();
+
+ // get text node for the text field
+ const SwFmtFld *pFldFmt = GetFldFmt();
+ const SwTxtFld* pTxtFld = pFldFmt ? pFmtFld->GetTxtFld() : 0;
+ if(!pTxtFld)
+ throw uno::RuntimeException();
+ const SwTxtNode& rTxtNode = pTxtFld->GetTxtNode();
+
+ // skip fields that are currently not in the document
+ // e.g. fields in undo or redo array
+ if (rTxtNode.GetNodes().IsDocNodes())
+ {
+ sal_Bool bFrame = 0 != rTxtNode.FindLayoutRect().Width(); // oder so
+ sal_Bool bHidden = rTxtNode.IsHidden();
+ if ( !bHidden )
+ {
+ xub_StrLen nHiddenStart;
+ xub_StrLen nHiddenEnd;
+
+ SwPosition aPosition( pTxtFld->GetTxtNode() );
+ aPosition.nContent = *pTxtFld->GetStart();
+
+ bHidden = SwScriptInfo::GetBoundsOfHiddenRange( pTxtFld->GetTxtNode(),
+ *pTxtFld->GetStart(),
+ nHiddenStart, nHiddenEnd );
+ }
+
+ // !bFrame && !bHidden: aller Wahrscheinlichkeit handelt es
+ // sich um ein Feld in einem unbenutzten Seitenstyle
+ //
+ // bHidden: Feld ist versteckt
+ // FME: Problem: Verstecktes Feld in unbenutzter Seitenvorlage =>
+ // bIsFieldUsed = true
+ // bIsFieldDisplayed = false
+ bIsFieldUsed = bFrame || bHidden;
+ bIsFieldDisplayed = bIsFieldUsed && !bHidden;
+ }
+ sal_Bool bRetVal = (FIELD_PROP_IS_FIELD_USED == pEntry->nWID) ?
+ bIsFieldUsed : bIsFieldDisplayed;
+ aRet.setValue( &bRetVal, ::getCppuBooleanType() );
+ }
+ else
+ pField->QueryValue( aRet, pEntry->nWID );
+ }
+ else if( m_pProps ) // currently just a descriptor...
+ {
+ switch(pEntry->nWID)
+ {
+ case FIELD_PROP_TEXT:
+ {
+ if (!m_pTextObject)
+ {
+ SwTextAPIEditSource* pObj = new SwTextAPIEditSource( m_pDoc );
+ m_pTextObject = new SwTextAPIObject( pObj );
+ m_pTextObject->acquire();
+ }
+
+ uno::Reference < text::XText > xText( m_pTextObject );
+ aRet <<= xText;
+ break;
+ }
+ case FIELD_PROP_PAR1:
+ aRet <<= OUString(m_pProps->sPar1);
+ break;
+ case FIELD_PROP_PAR2:
+ aRet <<= OUString(m_pProps->sPar2);
+ break;
+ case FIELD_PROP_PAR3:
+ aRet <<= OUString(m_pProps->sPar3);
+ break;
+ case FIELD_PROP_PAR4:
+ aRet <<= OUString(m_pProps->sPar4);
+ break;
+ case FIELD_PROP_FORMAT:
+ aRet <<= m_pProps->nFormat;
+ break;
+ case FIELD_PROP_SUBTYPE:
+ aRet <<= m_pProps->nSubType;
+ break;
+ case FIELD_PROP_BYTE1 :
+ aRet <<= m_pProps->nByte1;
+ break;
+ case FIELD_PROP_BOOL1 :
+ aRet.setValue(&m_pProps->bBool1, ::getCppuBooleanType());
+ break;
+ case FIELD_PROP_BOOL2 :
+ aRet.setValue(&m_pProps->bBool2, ::getCppuBooleanType());
+ break;
+ case FIELD_PROP_BOOL3 :
+ aRet.setValue(&m_pProps->bBool3, ::getCppuBooleanType());
+ break;
+ case FIELD_PROP_BOOL4 :
+ aRet.setValue(&m_pProps->bBool4, ::getCppuBooleanType());
+ break;
+ case FIELD_PROP_DATE :
+ aRet.setValue(&m_pProps->aDate, ::getCppuType(static_cast<const util::Date*>(0)));
+ break;
+ case FIELD_PROP_USHORT1:
+ aRet <<= (sal_Int16)m_pProps->nUSHORT1;
+ break;
+ case FIELD_PROP_USHORT2:
+ aRet <<= (sal_Int16)m_pProps->nUSHORT2;
+ break;
+ case FIELD_PROP_SHORT1:
+ aRet <<= m_pProps->nSHORT1;
+ break;
+ case FIELD_PROP_DOUBLE:
+ aRet <<= m_pProps->fDouble;
+ break;
+ case FIELD_PROP_DATE_TIME :
+ if(m_pProps->pDateTime)
+ aRet <<= (*m_pProps->pDateTime);
+ break;
+ case FIELD_PROP_PROP_SEQ:
+ aRet <<= m_pProps->aPropSeq;
+ break;
+ case FIELD_PROP_STRINGS:
+ aRet <<= m_pProps->aStrings;
+ break;
+ case FIELD_PROP_IS_FIELD_USED:
+ case FIELD_PROP_IS_FIELD_DISPLAYED:
+ aRet.setValue( sal_False, ::getCppuBooleanType() );
+ break;
+ }
+ }
+ else
+ throw uno::RuntimeException();
+ }
+ return aRet;
+}
+
+void SwXTextField::addPropertyChangeListener(const OUString& /*PropertyName*/, const uno::Reference< beans::XPropertyChangeListener > & /*aListener*/) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
+{
+ DBG_WARNING("not implemented");
+}
+
+void SwXTextField::removePropertyChangeListener(const OUString& /*PropertyName*/, const uno::Reference< beans::XPropertyChangeListener > & /*aListener*/) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
+{
+ DBG_WARNING("not implemented");
+}
+
+void SwXTextField::addVetoableChangeListener(const OUString& /*PropertyName*/, const uno::Reference< beans::XVetoableChangeListener > & /*aListener*/) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
+{
+ DBG_WARNING("not implemented");
+}
+
+void SwXTextField::removeVetoableChangeListener(const OUString& /*PropertyName*/, const uno::Reference< beans::XVetoableChangeListener > & /*aListener*/) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
+{
+ DBG_WARNING("not implemented");
+}
+
+void SwXTextField::update( ) throw (uno::RuntimeException)
+{
+ SolarMutexGuard aGuard;
+ const SwField* pFld = GetField();
+ if(pFld)
+ {
+ switch(pFld->Which())
+ {
+ case RES_DATETIMEFLD:
+ ((SwDateTimeField*)pFld)->SetDateTime( ::DateTime() );
+ break;
+
+ case RES_EXTUSERFLD:
+ {
+ SwExtUserField* pExtUserFld = (SwExtUserField*)pFld;
+ pExtUserFld->SetExpansion( ((SwExtUserFieldType*)pFld->GetTyp())->Expand(
+ pExtUserFld->GetSubType(),
+ pExtUserFld->GetFormat() ) );
+ }
+ break;
+
+ case RES_AUTHORFLD:
+ {
+ SwAuthorField* pAuthorFld = (SwAuthorField*)pFld;
+ pAuthorFld->SetExpansion( ((SwAuthorFieldType*)pFld->GetTyp())->Expand(
+ pAuthorFld->GetFormat() ) );
+ }
+ break;
+
+ case RES_FILENAMEFLD:
+ {
+ SwFileNameField* pFileNameFld = (SwFileNameField*)pFld;
+ pFileNameFld->SetExpansion( ((SwFileNameFieldType*)pFld->GetTyp())->Expand(
+ pFileNameFld->GetFormat() ) );
+ }
+ break;
+
+ case RES_DOCINFOFLD:
+ {
+ SwDocInfoField* pDocInfFld = (SwDocInfoField*)pFld;
+ pDocInfFld->SetExpansion( ((SwDocInfoFieldType*)pFld->GetTyp())->Expand(
+ pDocInfFld->GetSubType(),
+ pDocInfFld->GetFormat(),
+ pDocInfFld->GetLanguage(),
+ pDocInfFld->GetName() ) );
+ }
+ break;
+ }
+ // Text formatting has to be triggered.
+ const_cast<SwFmtFld*>(pFmtFld)->ModifyNotification( 0, 0 );
+ }
+ else
+ m_bCallUpdate = sal_True;
+}
+
+OUString SwXTextField::getImplementationName(void) throw( uno::RuntimeException )
+{
+ return C2U("SwXTextField");
+}
+
+static OUString OldNameToNewName_Impl( const OUString &rOld )
+{
+ static OUString aOldNamePart1(RTL_CONSTASCII_USTRINGPARAM(".TextField.DocInfo."));
+ static OUString aOldNamePart2(RTL_CONSTASCII_USTRINGPARAM(".TextField."));
+ static OUString aNewNamePart1(RTL_CONSTASCII_USTRINGPARAM(".textfield.docinfo."));
+ static OUString aNewNamePart2(RTL_CONSTASCII_USTRINGPARAM(".textfield."));
+ OUString sServiceNameCC( rOld );
+ sal_Int32 nIdx = sServiceNameCC.indexOf( aOldNamePart1 );
+ if (nIdx >= 0)
+ sServiceNameCC = sServiceNameCC.replaceAt( nIdx, aOldNamePart1.getLength(), aNewNamePart1 );
+ nIdx = sServiceNameCC.indexOf( aOldNamePart2 );
+ if (nIdx >= 0)
+ sServiceNameCC = sServiceNameCC.replaceAt( nIdx, aOldNamePart2.getLength(), aNewNamePart2 );
+ return sServiceNameCC;
+}
+
+sal_Bool SwXTextField::supportsService(const OUString& rServiceName) throw( uno::RuntimeException )
+{
+ OUString sServiceName = SwXServiceProvider::GetProviderName(m_nServiceId);
+
+ // case-corected version of service-name (see #i67811)
+ // (need to supply both because of compatibility to older versions)
+ OUString sServiceNameCC( OldNameToNewName_Impl( sServiceName ) );
+
+ return sServiceName == rServiceName || sServiceNameCC == rServiceName ||
+ rServiceName.equalsAsciiL(
+ RTL_CONSTASCII_STRINGPARAM("com.sun.star.text.TextContent"));
+}
+
+uno::Sequence< OUString > SwXTextField::getSupportedServiceNames(void) throw( uno::RuntimeException )
+{
+ OUString sServiceName = SwXServiceProvider::GetProviderName(m_nServiceId);
+
+ // case-corected version of service-name (see #i67811)
+ // (need to supply both because of compatibility to older versions)
+ OUString sServiceNameCC( OldNameToNewName_Impl( sServiceName ) );
+ sal_Int32 nLen = sServiceName == sServiceNameCC ? 2 : 3;
+
+ uno::Sequence< OUString > aRet( nLen );
+ OUString* pArray = aRet.getArray();
+ *pArray++ = sServiceName;
+ if (nLen == 3)
+ *pArray++ = sServiceNameCC;
+ *pArray++ = C2U("com.sun.star.text.TextContent");
+ return aRet;
+}
+
+void SwXTextField::Invalidate()
+{
+ if (GetRegisteredIn())
+ {
+ ((SwModify*)GetRegisteredIn())->Remove(this);
+ aLstnrCntnr.Disposing();
+ pFmtFld = 0;
+ m_pDoc = 0;
+ }
+}
+
+
+void SwXTextField::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew)
+{
+ switch( pOld ? pOld->Which() : 0 )
+ {
+ case RES_REMOVE_UNO_OBJECT:
+ case RES_OBJECTDYING:
+ if( (void*)GetRegisteredIn() == ((SwPtrMsgPoolItem *)pOld)->pObject )
+ Invalidate();
+ break;
+
+ case RES_FMT_CHG:
+ // wurden wir an das neue umgehaengt und wird das alte geloscht?
+ if( ((SwFmtChg*)pNew)->pChangedFmt == GetRegisteredIn() &&
+ ((SwFmtChg*)pOld)->pChangedFmt->IsFmtInDTOR() )
+ Invalidate();
+ break;
+ case RES_FIELD_DELETED:
+ if( (void*)pFmtFld == ((SwPtrMsgPoolItem *)pOld)->pObject )
+ Invalidate();
+ break;
+ }
+}
+
+const SwField* SwXTextField::GetField() const
+{
+ if(GetRegisteredIn() && pFmtFld)
+ return pFmtFld->GetFld();
+ return 0;
+}
+
+/******************************************************************
+ * SwXTextFieldMasters
+ ******************************************************************/
+OUString SwXTextFieldMasters::getImplementationName(void) throw( uno::RuntimeException )
+{
+ return C2U("SwXTextFieldMasters");
+}
+
+sal_Bool SwXTextFieldMasters::supportsService(const OUString& rServiceName) throw( uno::RuntimeException )
+{
+ return rServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(
+ "com.sun.star.text.TextFieldMasters" ));
+}
+
+uno::Sequence< OUString > SwXTextFieldMasters::getSupportedServiceNames(void) throw( uno::RuntimeException )
+{
+ uno::Sequence< OUString > aRet(1);
+ OUString* pArray = aRet.getArray();
+ pArray[0] = C2U("com.sun.star.text.TextFieldMasters");
+ return aRet;
+}
+
+SwXTextFieldMasters::SwXTextFieldMasters(SwDoc* _pDoc) :
+ SwUnoCollection(_pDoc)
+{
+}
+
+SwXTextFieldMasters::~SwXTextFieldMasters()
+{
+
+}
+
+/*-----------------------------------------------------------------------
+ Iteration ueber nicht-Standard Feldtypen
+ USER/SETEXP/DDE/DATABASE
+ Der Name ist demnach:
+ "com.sun.star.text.fieldmaster.User" + <Feltypname>
+ "com.sun.star.text.fieldmaster.DDE" + <Feltypname>
+ "com.sun.star.text.fieldmaster.SetExpression" + <Feltypname>
+ "com.sun.star.text.fieldmaster.DataBase" + <Feltypname>
+
+ Falls wir grosszuegig werden wollen, dann koennte man com.sun.star.text
+ auch optional weglassen
+ -----------------------------------------------------------------------*/
+sal_uInt16 lcl_GetIdByName( String& rName, String& rTypeName )
+{
+ if( rName.EqualsAscii( COM_TEXT_FLDMASTER, 0, RTL_CONSTASCII_LENGTH(COM_TEXT_FLDMASTER ))
+ || rName.EqualsAscii( COM_TEXT_FLDMASTER_CC, 0, RTL_CONSTASCII_LENGTH(COM_TEXT_FLDMASTER_CC )))
+ rName.Erase(0, 30);
+
+ sal_uInt16 nResId = USHRT_MAX;
+ xub_StrLen nFound = 0;
+ rTypeName = rName.GetToken( 0, '.', nFound );
+ if(rTypeName.EqualsAscii("User"))
+ nResId = RES_USERFLD;
+ else if(rTypeName.EqualsAscii("DDE"))
+ nResId = RES_DDEFLD;
+ else if(rTypeName.EqualsAscii("SetExpression"))
+ {
+ nResId = RES_SETEXPFLD;
+
+ String sFldTypName( rName.GetToken( 1, '.' ));
+ String sUIName( SwStyleNameMapper::GetSpecialExtraUIName( sFldTypName ) );
+
+ if( sUIName != sFldTypName )
+ rName.SetToken( 1, '.', sUIName );
+ }
+ else if(rTypeName.EqualsAscii("DataBase"))
+ {
+ rName.Erase( 0, RTL_CONSTASCII_LENGTH( "DataBase." ));
+ sal_uInt16 nDotCount = rName.GetTokenCount('.');
+ if( 2 <= nDotCount )
+ {
+ // #i51815#
+ //rName.SearchAndReplace('.', DB_DELIM);
+ //rName.SetChar( rName.SearchBackward( '.' ), DB_DELIM );
+
+ rName.InsertAscii( "DataBase.", 0 );
+ nResId = RES_DBFLD;
+ }
+ }
+ else if( rTypeName.EqualsAscii("Bibliography"))
+ nResId = RES_AUTHORITY;
+ return nResId;
+}
+
+uno::Any SwXTextFieldMasters::getByName(const OUString& rName)
+ throw( container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException )
+{
+ SolarMutexGuard aGuard;
+ if(!GetDoc())
+ throw uno::RuntimeException();
+
+ String sName(rName), sTypeName;
+ sal_uInt16 nResId = lcl_GetIdByName( sName, sTypeName );
+ if( USHRT_MAX == nResId )
+ throw container::NoSuchElementException();
+
+ sName.Erase(0, sTypeName.Len()+1);
+ SwFieldType* pType = GetDoc()->GetFldType(nResId, sName, sal_True);
+ if(!pType)
+ throw container::NoSuchElementException();
+ SwXFieldMaster* pMaster = SwIterator<SwXFieldMaster,SwFieldType>::FirstElement( *pType );
+ if(!pMaster)
+ pMaster = new SwXFieldMaster(*pType, GetDoc());
+ uno::Reference< beans::XPropertySet > aRef = pMaster;
+ uno::Any aRet(&aRef, ::getCppuType( static_cast<const uno::Reference<beans::XPropertySet>* >(0)));
+ return aRet;
+}
+
+sal_Bool SwXTextFieldMasters::getInstanceName(
+ const SwFieldType& rFldType, String& rName)
+{
+ sal_Bool bRet = sal_True;
+ switch( rFldType.Which() )
+ {
+ case RES_USERFLD:
+ rName.AppendAscii( RTL_CONSTASCII_STRINGPARAM( COM_TEXT_FLDMASTER_CC ));
+ rName.AppendAscii( RTL_CONSTASCII_STRINGPARAM( "User."));
+ rName += rFldType.GetName();
+ break;
+ case RES_DDEFLD:
+ rName.AppendAscii( RTL_CONSTASCII_STRINGPARAM( COM_TEXT_FLDMASTER_CC ));
+ rName.AppendAscii( RTL_CONSTASCII_STRINGPARAM( "DDE."));
+ rName += rFldType.GetName();
+ break;
+
+ case RES_SETEXPFLD:
+ rName.AppendAscii( RTL_CONSTASCII_STRINGPARAM( COM_TEXT_FLDMASTER_CC ));
+ rName.AppendAscii( RTL_CONSTASCII_STRINGPARAM( "SetExpression."));
+ rName += String( SwStyleNameMapper::GetSpecialExtraProgName( rFldType.GetName() ) );
+ break;
+
+ case RES_DBFLD:
+ {
+ rName.AppendAscii( RTL_CONSTASCII_STRINGPARAM( COM_TEXT_FLDMASTER_CC ));
+ rName.AppendAscii( RTL_CONSTASCII_STRINGPARAM( "DataBase."));
+ String sDBName(rFldType.GetName());
+ sDBName.SearchAndReplaceAll(DB_DELIM, '.');
+ rName += sDBName;
+ }
+ break;
+
+ case RES_AUTHORITY:
+ rName.AppendAscii( RTL_CONSTASCII_STRINGPARAM( COM_TEXT_FLDMASTER_CC ));
+ rName.AppendAscii( RTL_CONSTASCII_STRINGPARAM( "Bibliography"));
+ break;
+
+ default:
+ bRet = sal_False;
+ }
+
+ return bRet;
+}
+
+uno::Sequence< OUString > SwXTextFieldMasters::getElementNames(void)
+ throw( uno::RuntimeException )
+{
+ SolarMutexGuard aGuard;
+ if(!GetDoc())
+ throw uno::RuntimeException();
+
+ const SwFldTypes* pFldTypes = GetDoc()->GetFldTypes();
+ sal_uInt16 nCount = pFldTypes->Count();
+
+ SvStrings aFldNames;
+ String* pString = new String();
+ sal_uInt16 i;
+
+ for( i = 0; i < nCount; i++)
+ {
+ SwFieldType& rFldType = *((*pFldTypes)[i]);
+
+ if (SwXTextFieldMasters::getInstanceName(rFldType, *pString))
+ {
+ aFldNames.Insert(pString, aFldNames.Count());
+ pString = new String();
+ }
+ }
+ delete pString;
+
+ uno::Sequence< OUString > aSeq(aFldNames.Count());
+ OUString* pArray = aSeq.getArray();
+ for(i = 0; i < aFldNames.Count();i++)
+ {
+ pArray[i] = *aFldNames.GetObject(i);
+ }
+ aFldNames.DeleteAndDestroy(0, aFldNames.Count());
+
+ return aSeq;
+
+}
+
+sal_Bool SwXTextFieldMasters::hasByName(const OUString& rName) throw( uno::RuntimeException )
+{
+ SolarMutexGuard aGuard;
+ if(!GetDoc())
+ throw uno::RuntimeException();
+
+ String sName(rName), sTypeName;
+ sal_uInt16 nResId = lcl_GetIdByName( sName, sTypeName );
+ sal_Bool bRet = sal_False;
+ if( USHRT_MAX != nResId )
+ {
+ sName.Erase(0, sTypeName.Len()+1);
+ bRet = USHRT_MAX != nResId && 0 != GetDoc()->GetFldType(nResId, sName, sal_True);
+ }
+ return bRet;
+}
+
+uno::Type SwXTextFieldMasters::getElementType(void) throw( uno::RuntimeException )
+{
+ return ::getCppuType(static_cast<const uno::Reference<beans::XPropertySet>*>(0));
+
+}
+
+sal_Bool SwXTextFieldMasters::hasElements(void) throw( uno::RuntimeException )
+{
+ SolarMutexGuard aGuard;
+ if(!IsValid())
+ throw uno::RuntimeException();
+ return sal_True;
+}
+
+OUString SwXTextFieldTypes::getImplementationName(void) throw( uno::RuntimeException )
+{
+ return C2U("SwXTextFieldTypes");
+}
+
+sal_Bool SwXTextFieldTypes::supportsService(const OUString& rServiceName) throw( uno::RuntimeException )
+{
+ return rServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(
+ "com.sun.star.text.TextFields" ));
+}
+
+uno::Sequence< OUString > SwXTextFieldTypes::getSupportedServiceNames(void) throw( uno::RuntimeException )
+{
+ uno::Sequence< OUString > aRet(1);
+ OUString* pArray = aRet.getArray();
+ pArray[0] = C2U("com.sun.star.text.TextFields");
+ return aRet;
+}
+
+SwXTextFieldTypes::SwXTextFieldTypes(SwDoc* _pDoc) :
+ SwUnoCollection (_pDoc),
+ aRefreshCont ( static_cast< XEnumerationAccess * >(this) )
+{
+}
+
+SwXTextFieldTypes::~SwXTextFieldTypes()
+{
+}
+
+void SwXTextFieldTypes::Invalidate()
+{
+ SwUnoCollection::Invalidate();
+ aRefreshCont.Disposing();
+}
+
+uno::Reference< container::XEnumeration > SwXTextFieldTypes::createEnumeration(void)
+ throw( uno::RuntimeException )
+{
+ SolarMutexGuard aGuard;
+ if(!IsValid())
+ throw uno::RuntimeException();
+ return new SwXFieldEnumeration(GetDoc());
+}
+
+uno::Type SwXTextFieldTypes::getElementType(void) throw( uno::RuntimeException )
+{
+ return ::getCppuType(static_cast<const uno::Reference<text::XDependentTextField>*>(0));
+}
+
+sal_Bool SwXTextFieldTypes::hasElements(void) throw( uno::RuntimeException )
+{
+ SolarMutexGuard aGuard;
+ if(!IsValid())
+ throw uno::RuntimeException();
+ //es gibt sie immer
+ return sal_True;
+}
+
+void SwXTextFieldTypes::refresh(void) throw( uno::RuntimeException )
+{
+ SolarMutexGuard aGuard;
+ if(!IsValid())
+ throw uno::RuntimeException();
+ UnoActionContext aContext(GetDoc());
+ SwDocStat aDocStat;
+ GetDoc()->UpdateDocStat(aDocStat);
+ GetDoc()->UpdateFlds(0, sal_False);
+
+ // call refresh listeners
+ aRefreshCont.Refreshed();
+}
+
+void SwXTextFieldTypes::addRefreshListener(const uno::Reference< util::XRefreshListener > & l)
+ throw( uno::RuntimeException )
+{
+ SolarMutexGuard aGuard;
+ if ( !IsValid() )
+ throw uno::RuntimeException();
+ aRefreshCont.AddListener ( reinterpret_cast < const uno::Reference < lang::XEventListener > &> ( l ));
+}
+
+void SwXTextFieldTypes::removeRefreshListener(const uno::Reference< util::XRefreshListener > & l)
+ throw( uno::RuntimeException )
+{
+ SolarMutexGuard aGuard;
+ if ( !IsValid() || !aRefreshCont.RemoveListener ( reinterpret_cast < const uno::Reference < lang::XEventListener > &> ( l ) ) )
+ throw uno::RuntimeException();
+}
+
+/******************************************************************
+ * SwXFieldEnumeration
+ ******************************************************************/
+OUString SwXFieldEnumeration::getImplementationName(void) throw( uno::RuntimeException )
+{
+ return C2U("SwXFieldEnumeration");
+}
+
+sal_Bool SwXFieldEnumeration::supportsService(const OUString& rServiceName) throw( uno::RuntimeException )
+{
+ return rServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(
+ "com.sun.star.text.FieldEnumeration" ));
+}
+
+uno::Sequence< OUString > SwXFieldEnumeration::getSupportedServiceNames(void) throw( uno::RuntimeException )
+{
+ uno::Sequence< OUString > aRet(1);
+ OUString* pArray = aRet.getArray();
+ pArray[0] = C2U("com.sun.star.text.FieldEnumeration");
+ return aRet;
+}
+
+SwXFieldEnumeration::SwXFieldEnumeration(SwDoc* pDc) :
+ nNextIndex(0),
+ pDoc(pDc)
+{
+ pDoc->GetPageDescFromPool(RES_POOLPAGE_STANDARD)->Add(this);
+
+ // build sequence
+ sal_Int32 nSize = 32;
+ aItems.realloc( nSize );
+ uno::Reference< text::XTextField > *pItems = aItems.getArray();
+ sal_Int32 nFillPos = 0;
+ //
+ const SwFldTypes* pFldTypes = pDoc->GetFldTypes();
+ sal_uInt16 nCount = pFldTypes->Count();
+ for(sal_uInt16 nType = 0; nType < nCount; ++nType)
+ {
+ const SwFieldType *pCurType = pFldTypes->GetObject(nType);
+ SwIterator<SwFmtFld,SwFieldType> aIter( *pCurType );
+ const SwFmtFld* pCurFldFmt = aIter.First();
+ while (pCurFldFmt)
+ {
+ const SwTxtFld *pTxtFld = pCurFldFmt->GetTxtFld();
+ // skip fields that are currently not in the document
+ // e.g. fields in undo or redo array
+ sal_Bool bSkip = !pTxtFld ||
+ !pTxtFld->GetpTxtNode()->GetNodes().IsDocNodes();
+ if (!bSkip)
+ pItems[ nFillPos++ ] = new SwXTextField(*pCurFldFmt, pDoc);
+ pCurFldFmt = aIter.Next();
+
+ // enlarge sequence if necessary
+ if (aItems.getLength() == nFillPos)
+ {
+ aItems.realloc( 2 * aItems.getLength() );
+ pItems = aItems.getArray();
+ }
+ }
+ }
+ // now handle meta-fields, which are not SwFields
+ const ::std::vector< uno::Reference<text::XTextField> > MetaFields(
+ pDc->GetMetaFieldManager().getMetaFields() );
+ for (size_t i = 0; i < MetaFields.size(); ++i)
+ {
+ pItems[ nFillPos ] = MetaFields[i];
+ nFillPos++;
+
+ //FIXME UGLY
+ // enlarge sequence if necessary
+ if (aItems.getLength() == nFillPos)
+ {
+ aItems.realloc( 2 * aItems.getLength() );
+ pItems = aItems.getArray();
+ }
+ }
+ // resize sequence to actual used size
+ aItems.realloc( nFillPos );
+}
+
+SwXFieldEnumeration::~SwXFieldEnumeration()
+{
+
+}
+
+sal_Bool SwXFieldEnumeration::hasMoreElements(void)
+ throw( uno::RuntimeException )
+{
+ SolarMutexGuard aGuard;
+ return nNextIndex < aItems.getLength();
+}
+
+uno::Any SwXFieldEnumeration::nextElement(void)
+ throw( container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException )
+{
+ SolarMutexGuard aGuard;
+
+ if (!(nNextIndex < aItems.getLength()))
+ throw container::NoSuchElementException();
+
+#if OSL_DEBUG_LEVEL > 1
+ uno::Reference< text::XTextField > *pItems = aItems.getArray();
+ (void)pItems;
+#endif
+ uno::Reference< text::XTextField > &rxFld = aItems.getArray()[ nNextIndex++ ];
+ uno::Any aRet(&rxFld, ::getCppuType(static_cast<const uno::Reference<text::XTextField>*>(0)));
+ rxFld = 0; // free memory for item that is not longer used
+ return aRet;
+}
+
+void SwXFieldEnumeration::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew)
+{
+ ClientModify(this, pOld, pNew);
+ if(!GetRegisteredIn())
+ pDoc = 0;
+}
+
+String& GetString( const uno::Any& rAny, String& rStr )
+{
+ OUString aStr;
+ rAny >>= aStr;
+ rStr = String( aStr );
+ return rStr;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */