diff options
Diffstat (limited to 'sw/source/ui/fldui/fldmgr.cxx')
-rw-r--r-- | sw/source/ui/fldui/fldmgr.cxx | 1793 |
1 files changed, 1793 insertions, 0 deletions
diff --git a/sw/source/ui/fldui/fldmgr.cxx b/sw/source/ui/fldui/fldmgr.cxx new file mode 100644 index 000000000000..95001f897702 --- /dev/null +++ b/sw/source/ui/fldui/fldmgr.cxx @@ -0,0 +1,1793 @@ +/************************************************************************* + * + * 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 <cmdid.h> +#include <hintids.hxx> +#include <svl/stritem.hxx> +#include <com/sun/star/lang/XMultiServiceFactory.hpp> +#include <com/sun/star/container/XNameAccess.hpp> +#include <com/sun/star/text/XDefaultNumberingProvider.hpp> +#include <com/sun/star/text/XNumberingTypeInfo.hpp> +#include <com/sun/star/style/NumberingType.hpp> +#include <com/sun/star/beans/XPropertySet.hpp> +#include <com/sun/star/sdbc/XConnection.hpp> +#include <com/sun/star/sdbc/XDataSource.hpp> +#include <com/sun/star/uri/XUriReferenceFactory.hpp> +#include <com/sun/star/uri/XVndSunStarScriptUrl.hpp> +#include <comphelper/processfactory.hxx> +#include <editeng/unolingu.hxx> +#include <unotools/localedatawrapper.hxx> +#include <sfx2/dispatch.hxx> +#include <sfx2/objsh.hxx> +#include <sfx2/linkmgr.hxx> +#include <sfx2/app.hxx> +#include <basic/basmgr.hxx> +#include <editeng/langitem.hxx> +#include <svl/macitem.hxx> +#include <basic/sbmod.hxx> +#include <fmtrfmrk.hxx> +#include <basic/sbmeth.hxx> +#include <basic/sbx.hxx> +#include <svl/zforlist.hxx> +#include <svl/zformat.hxx> +#include <vcl/mnemonic.hxx> +#include <view.hxx> +#include <wrtsh.hxx> // Actives Fenster +#include <doc.hxx> // Actives Fenster +#include <docsh.hxx> // Actives Fenster +#include <swmodule.hxx> +#include <charatr.hxx> +#include <fmtinfmt.hxx> +#include <cellatr.hxx> +#include <dbmgr.hxx> +#include <shellres.hxx> +#include <fldbas.hxx> +#include <docufld.hxx> +#include <chpfld.hxx> +#include <ddefld.hxx> +#include <expfld.hxx> +#include <reffld.hxx> +#include <usrfld.hxx> +#include <dbfld.hxx> +#include <authfld.hxx> +#include <flddat.hxx> +#include <fldmgr.hxx> +#include <crsskip.hxx> +#include <flddropdown.hxx> +#include <fldui.hrc> +#include <tox.hxx> + +using rtl::OUString; +using namespace com::sun::star::uno; +using namespace com::sun::star::container; +using namespace com::sun::star::lang; +using namespace com::sun::star::beans; +using namespace com::sun::star::text; +using namespace com::sun::star::style; +using namespace com::sun::star::sdbc; +using namespace ::com::sun::star; +using namespace nsSwDocInfoSubType; + +/*-------------------------------------------------------------------- + Beschreibung: Gruppen der Felder + --------------------------------------------------------------------*/ +enum +{ + GRP_DOC_BEGIN = 0, + GRP_DOC_END = GRP_DOC_BEGIN + 11, + + GRP_FKT_BEGIN = GRP_DOC_END, + GRP_FKT_END = GRP_FKT_BEGIN + 8, + + GRP_REF_BEGIN = GRP_FKT_END, + GRP_REF_END = GRP_REF_BEGIN + 2, + + GRP_REG_BEGIN = GRP_REF_END, + GRP_REG_END = GRP_REG_BEGIN + 1, + + GRP_DB_BEGIN = GRP_REG_END, + GRP_DB_END = GRP_DB_BEGIN + 5, + + GRP_VAR_BEGIN = GRP_DB_END, + GRP_VAR_END = GRP_VAR_BEGIN + 9 +}; + +enum +{ + GRP_WEB_DOC_BEGIN = 0, + GRP_WEB_DOC_END = GRP_WEB_DOC_BEGIN + 9, + + GRP_WEB_FKT_BEGIN = GRP_WEB_DOC_END + 2, + GRP_WEB_FKT_END = GRP_WEB_FKT_BEGIN + 0, // Die Gruppe ist leer! + + GRP_WEB_REF_BEGIN = GRP_WEB_FKT_END + 6, // Die Gruppe ist leer! + GRP_WEB_REF_END = GRP_WEB_REF_BEGIN + 0, + + GRP_WEB_REG_BEGIN = GRP_WEB_REF_END + 2, + GRP_WEB_REG_END = GRP_WEB_REG_BEGIN + 1, + + GRP_WEB_DB_BEGIN = GRP_WEB_REG_END, // Die Gruppe ist leer! + GRP_WEB_DB_END = GRP_WEB_DB_BEGIN + 0, + + GRP_WEB_VAR_BEGIN = GRP_WEB_DB_END + 5, + GRP_WEB_VAR_END = GRP_WEB_VAR_BEGIN + 1 +}; + +/*-------------------------------------------------------------------- + Beschreibung: Formate in der richtigen Reihenfolge + --------------------------------------------------------------------*/ +static const USHORT __FAR_DATA aSetFmt[] = +{ +// die Reihenfolge muss zu Beginn mit den ResourceIds fuer FMT_SETVAR_??? +// uebereinstimmen + 0, + 0 +}; + +static const USHORT __FAR_DATA aGetFmt[] = +{ +// die Reihenfolge muss zu Beginn mit den ResourceIds fuer FMT_GETVAR_??? +// uebereinstimmen + 0 +}; + +static const USHORT __FAR_DATA aUsrFmt[] = +{ +// die Reihenfolge muss zu Beginn mit den ResourceIds fuer FMT_SETVAR_??? +// uebereinstimmen + 0, + nsSwExtendedSubType::SUB_CMD +}; + +static const USHORT __FAR_DATA aDBFmt[] = +{ +// die Reihenfolge muss zu Beginn mit den ResourceIds fuer FMT_DBFLD_??? +// uebereinstimmen + nsSwExtendedSubType::SUB_OWN_FMT +}; + +static const USHORT VF_COUNT = sizeof(aGetFmt) / sizeof(USHORT); +static const USHORT VF_USR_COUNT = sizeof(aUsrFmt) / sizeof(USHORT); +static const USHORT VF_DB_COUNT = sizeof(aDBFmt) / sizeof(USHORT); + +/*-------------------------------------------------------------------- + Beschreibung: Feldtypen und Subtypes + --------------------------------------------------------------------*/ +struct SwFldPack +{ + USHORT nTypeId; + + USHORT nSubTypeStart; + USHORT nSubTypeEnd; + + ULONG nFmtBegin; + ULONG nFmtEnd; +}; + +/*-------------------------------------------------------------------- + Beschreibung: Strings und Formate + --------------------------------------------------------------------*/ +static const SwFldPack __FAR_DATA aSwFlds[] = +{ + // Dokument + { TYP_EXTUSERFLD, FLD_EU_BEGIN, FLD_EU_END, 0, 0 }, + { TYP_AUTHORFLD, 0, 0, FMT_AUTHOR_BEGIN, FMT_AUTHOR_END }, + { TYP_DATEFLD, FLD_DATE_BEGIN, FLD_DATE_END, 0, 0 }, + { TYP_TIMEFLD, FLD_TIME_BEGIN, FLD_TIME_END, 0, 0 }, + { TYP_PAGENUMBERFLD, 0, 0, FMT_NUM_BEGIN, FMT_NUM_END-1 }, + { TYP_NEXTPAGEFLD, 0, 0, FMT_NUM_BEGIN, FMT_NUM_END }, + { TYP_PREVPAGEFLD, 0, 0, FMT_NUM_BEGIN, FMT_NUM_END }, + { TYP_FILENAMEFLD, 0, 0, FMT_FF_BEGIN, FMT_FF_END }, + { TYP_DOCSTATFLD, FLD_STAT_BEGIN, FLD_STAT_END, FMT_NUM_BEGIN, FMT_NUM_END-1 }, + + { TYP_CHAPTERFLD, 0, 0, FMT_CHAPTER_BEGIN, FMT_CHAPTER_END }, + { TYP_TEMPLNAMEFLD, 0, 0, FMT_FF_BEGIN, FMT_FF_END }, + + // Funktion + { TYP_CONDTXTFLD, 0, 0, 0, 0 }, + { TYP_DROPDOWN, 0, 0, 0, 0 }, + { TYP_INPUTFLD, FLD_INPUT_BEGIN, FLD_INPUT_END, 0, 0 }, + { TYP_MACROFLD, 0, 0, 0, 0 }, + { TYP_JUMPEDITFLD, 0, 0, FMT_MARK_BEGIN, FMT_MARK_END }, + { TYP_COMBINED_CHARS, 0, 0, 0, 0 }, + { TYP_HIDDENTXTFLD, 0, 0, 0, 0 }, + { TYP_HIDDENPARAFLD, 0, 0, 0, 0 }, + + // Referenzen + { TYP_SETREFFLD, 0, 0, 0, 0 }, + { TYP_GETREFFLD, 0, 0, FMT_REF_BEGIN, FMT_REF_END }, + + // Ablage + { TYP_DOCINFOFLD, 0, 0, FMT_REG_BEGIN, FMT_REG_END }, + + // Datenbank + { TYP_DBFLD, 0, 0, FMT_DBFLD_BEGIN, FMT_DBFLD_END }, + { TYP_DBNEXTSETFLD, 0, 0, 0, 0 }, + { TYP_DBNUMSETFLD, 0, 0, 0, 0 }, + { TYP_DBSETNUMBERFLD, 0, 0, FMT_NUM_BEGIN, FMT_NUM_END-2 }, + { TYP_DBNAMEFLD, 0, 0, 0, 0 }, + + // Variablen + { TYP_SETFLD, 0, 0, FMT_SETVAR_BEGIN, FMT_SETVAR_END }, + + { TYP_GETFLD, 0, 0, FMT_GETVAR_BEGIN, FMT_GETVAR_END }, + { TYP_DDEFLD, 0, 0, FMT_DDE_BEGIN, FMT_DDE_END }, + { TYP_FORMELFLD, 0, 0, FMT_GETVAR_BEGIN, FMT_GETVAR_END }, + { TYP_INPUTFLD, FLD_INPUT_BEGIN, FLD_INPUT_END, 0, 0 }, + { TYP_SEQFLD, 0, 0, FMT_NUM_BEGIN, FMT_NUM_END-2 }, + { TYP_SETREFPAGEFLD, FLD_PAGEREF_BEGIN, FLD_PAGEREF_END,0, 0 }, + { TYP_GETREFPAGEFLD, 0, 0, FMT_NUM_BEGIN, FMT_NUM_END-1 }, + { TYP_USERFLD, 0, 0, FMT_USERVAR_BEGIN, FMT_USERVAR_END } +}; + +/*-------------------------------------------------------------------- + Beschreibung: Zugriff auf die Shell + --------------------------------------------------------------------*/ + +static SwWrtShell* lcl_GetShell() +{ + SwView* pView; + if ( 0 != (pView = ::GetActiveView()) ) + return pView->GetWrtShellPtr(); + DBG_ERROR("no current shell found!"); + return 0; +} + +inline USHORT GetPackCount() { return sizeof(aSwFlds) / sizeof(SwFldPack); } + +/*-------------------------------------------------------------------- + Beschreibung: FieldManager regelt das Einfuegen und Updaten + von Feldern + --------------------------------------------------------------------*/ + +SwFldMgr::SwFldMgr(SwWrtShell* pSh ) : + pModule(0), + pMacroItem(0), + pWrtShell(pSh), + bEvalExp(TRUE) +{ + // aktuelles Feld ermitteln falls vorhanden + GetCurFld(); +} + + +SwFldMgr::~SwFldMgr() +{ +} + +/*-------------------------------------------------------------------- + Beschreibung: RefMark ueber Namen organisieren + --------------------------------------------------------------------*/ + +BOOL SwFldMgr::CanInsertRefMark( const String& rStr ) +{ + BOOL bRet = FALSE; + SwWrtShell *pSh = pWrtShell ? pWrtShell : lcl_GetShell(); + DBG_ASSERT(pSh, "no SwWrtShell found"); + if(pSh) + { + USHORT nCnt = pSh->GetCrsrCnt(); + + // der letzte Crsr muss keine aufgespannte Selektion + if( 1 < nCnt && !pSh->SwCrsrShell::HasSelection() ) + --nCnt; + + bRet = 2 > nCnt && 0 == pSh->GetRefMark( rStr ); + } + return bRet; +} + +/*-------------------------------------------------------------------- + Beschreibung: Zugriff ueber ResIds + --------------------------------------------------------------------*/ + +void SwFldMgr::RemoveFldType(USHORT nResId, const String& rName ) +{ + SwWrtShell * pSh = pWrtShell ? pWrtShell : lcl_GetShell(); + DBG_ASSERT(pSh, "no SwWrtShell found"); + if( pSh ) + pSh->RemoveFldType(nResId, rName); +} + +USHORT SwFldMgr::GetFldTypeCount(USHORT nResId) const +{ + SwWrtShell * pSh = pWrtShell ? pWrtShell : lcl_GetShell(); + DBG_ASSERT(pSh, "no SwWrtShell found"); + return pSh ? pSh->GetFldTypeCount(nResId) : 0; +} + + +SwFieldType* SwFldMgr::GetFldType(USHORT nResId, USHORT nId) const +{ + SwWrtShell * pSh = pWrtShell ? pWrtShell : lcl_GetShell(); + DBG_ASSERT(pSh, "no SwWrtShell found"); + return pSh ? pSh->GetFldType(nId, nResId) : 0; +} + + +SwFieldType* SwFldMgr::GetFldType(USHORT nResId, const String& rName) const +{ + SwWrtShell * pSh = pWrtShell ? pWrtShell : lcl_GetShell(); + DBG_ASSERT(pSh, "no SwWrtShell found"); + return pSh ? pSh->GetFldType(nResId, rName) : 0; +} + + +/*-------------------------------------------------------------------- + Beschreibung: Aktuelles Feld ermitteln + --------------------------------------------------------------------*/ +SwField* SwFldMgr::GetCurFld() +{ + SwWrtShell *pSh = pWrtShell ? pWrtShell : ::lcl_GetShell(); + if ( pSh ) + pCurFld = pSh->GetCurFld(); + else + pCurFld = NULL; + + // Strings und Format initialisieren + // + aCurPar1.Erase(); + aCurPar2.Erase(); + sCurFrame.Erase(); + nCurFmt = 0; + + if(!pCurFld) + return 0; + + // Aktuelle Werte aufbereiten Parameter 1 und Parameter 2 + // als auch das Format ermitteln + // + const USHORT nTypeId = pCurFld->GetTypeId(); + + nCurFmt = pCurFld->GetFormat(); + aCurPar1 = pCurFld->GetPar1(); + aCurPar2 = pCurFld->GetPar2(); + + switch( nTypeId ) + { + case TYP_PAGENUMBERFLD: + case TYP_NEXTPAGEFLD: + case TYP_PREVPAGEFLD: + case TYP_GETREFPAGEFLD: + if( nCurFmt == SVX_NUM_PAGEDESC ) + nCurFmt -= 2; + break; + } + return pCurFld; +} + +/*-------------------------------------------------------------------- + Beschreibung: Gruppen-Bereich liefern + --------------------------------------------------------------------*/ + + +const SwFldGroupRgn& SwFldMgr::GetGroupRange(BOOL bHtmlMode, USHORT nGrpId) const +{ +static SwFldGroupRgn __READONLY_DATA aRanges[] = +{ + { /* Dokument */ GRP_DOC_BEGIN, GRP_DOC_END }, + { /* Funktionen */ GRP_FKT_BEGIN, GRP_FKT_END }, + { /* Referenzen */ GRP_REF_BEGIN, GRP_REF_END }, + { /* Ablage */ GRP_REG_BEGIN, GRP_REG_END }, + { /* DB */ GRP_DB_BEGIN, GRP_DB_END }, + { /* User */ GRP_VAR_BEGIN, GRP_VAR_END } +}; +static SwFldGroupRgn __READONLY_DATA aWebRanges[] = +{ + { /* Dokument */ GRP_WEB_DOC_BEGIN, GRP_WEB_DOC_END }, + { /* Funktionen */ GRP_WEB_FKT_BEGIN, GRP_WEB_FKT_END }, + { /* Referenzen */ GRP_WEB_REF_BEGIN, GRP_WEB_REF_END }, + { /* Ablage */ GRP_WEB_REG_BEGIN, GRP_WEB_REG_END }, + { /* DB */ GRP_WEB_DB_BEGIN, GRP_WEB_DB_END }, + { /* User */ GRP_WEB_VAR_BEGIN, GRP_WEB_VAR_END } +}; + + if (bHtmlMode) + return aWebRanges[(USHORT)nGrpId]; + else + return aRanges[(USHORT)nGrpId]; +} + +/*-------------------------------------------------------------------- + Beschreibung: GroupId bestimmen + --------------------------------------------------------------------*/ + +USHORT SwFldMgr::GetGroup(BOOL bHtmlMode, USHORT nTypeId, USHORT nSubType) const +{ + if (nTypeId == TYP_SETINPFLD) + nTypeId = TYP_SETFLD; + + if (nTypeId == TYP_INPUTFLD && (nSubType & INP_USR)) + nTypeId = TYP_USERFLD; + + if (nTypeId == TYP_FIXDATEFLD) + nTypeId = TYP_DATEFLD; + + if (nTypeId == TYP_FIXTIMEFLD) + nTypeId = TYP_TIMEFLD; + + for (USHORT i = GRP_DOC; i <= GRP_VAR; i++) + { + const SwFldGroupRgn& rRange = GetGroupRange(bHtmlMode, i); + for (USHORT nPos = rRange.nStart; nPos < rRange.nEnd; nPos++) + { + if (aSwFlds[nPos].nTypeId == nTypeId) + return i; + } + } + return USHRT_MAX; +} + +/*-------------------------------------------------------------------- + Beschreibung: Namen zur TypeId ermitteln + ZUGRIFF ueber TYP_.... + --------------------------------------------------------------------*/ + + +USHORT SwFldMgr::GetTypeId(USHORT nPos) +{ + ASSERT(nPos < ::GetPackCount(), "unzulaessige Pos"); + return aSwFlds[ nPos ].nTypeId; +} + + +const String& SwFldMgr::GetTypeStr(USHORT nPos) +{ + ASSERT(nPos < ::GetPackCount(), "unzulaessige TypeId"); + + USHORT nFldWh = aSwFlds[ nPos ].nTypeId; + + // Sonderbehandlung fuer Datum/Zeit Felder (ohne var/fix) + if( TYP_DATEFLD == nFldWh ) + { + static String g_aDate( SW_RES( STR_DATEFLD ) ); + return g_aDate; + } + if( TYP_TIMEFLD == nFldWh ) + { + static String g_aTime( SW_RES( STR_TIMEFLD ) ); + return g_aTime; + } + + return SwFieldType::GetTypeStr( nFldWh ); +} + +/*-------------------------------------------------------------------- + Beschreibung: Pos in der Liste bestimmen + --------------------------------------------------------------------*/ + + +USHORT SwFldMgr::GetPos(USHORT nTypeId) +{ + switch( nTypeId ) + { + case TYP_FIXDATEFLD: nTypeId = TYP_DATEFLD; break; + case TYP_FIXTIMEFLD: nTypeId = TYP_TIMEFLD; break; + case TYP_SETINPFLD: nTypeId = TYP_SETFLD; break; + case TYP_USRINPFLD: nTypeId = TYP_USERFLD; break; + } + + for(USHORT i = 0; i < GetPackCount(); i++) + if(aSwFlds[i].nTypeId == nTypeId) + return i; + + return USHRT_MAX; +} + +/*-------------------------------------------------------------------- + Beschreibung: Subtypen eines Feldes lokalisieren + --------------------------------------------------------------------*/ + +BOOL SwFldMgr::GetSubTypes(USHORT nTypeId, SvStringsDtor& rToFill) +{ + BOOL bRet = FALSE; + SwWrtShell *pSh = pWrtShell ? pWrtShell : lcl_GetShell(); + DBG_ASSERT(pSh, "no SwWrtShell found"); + if(pSh) + { + const USHORT nPos = GetPos(nTypeId); + + switch(nTypeId) + { + case TYP_SETREFFLD: + case TYP_GETREFFLD: + { + // Referenzen sind keine Felder + pSh->GetRefMarks( &rToFill ); + break; + } + case TYP_MACROFLD: + { + break; + } + case TYP_INPUTFLD: + { String* pNew = new SW_RESSTR(aSwFlds[nPos].nSubTypeStart); + rToFill.Insert(pNew, rToFill.Count()); + // Weiter bei generischen Typen + } + case TYP_DDEFLD: + case TYP_SEQFLD: + case TYP_FORMELFLD: + case TYP_GETFLD: + case TYP_SETFLD: + case TYP_USERFLD: + { + + const USHORT nCount = pSh->GetFldTypeCount(); + for(USHORT i = 0; i < nCount; ++i) + { + SwFieldType* pFldType = pSh->GetFldType( i ); + const USHORT nWhich = pFldType->Which(); + + if((nTypeId == TYP_DDEFLD && pFldType->Which() == RES_DDEFLD) || + + (nTypeId == TYP_USERFLD && nWhich == RES_USERFLD) || + + (nTypeId == TYP_GETFLD && nWhich == RES_SETEXPFLD && + !(((SwSetExpFieldType*)pFldType)->GetType() & nsSwGetSetExpType::GSE_SEQ)) || + + (nTypeId == TYP_SETFLD && nWhich == RES_SETEXPFLD && + !(((SwSetExpFieldType*)pFldType)->GetType() & nsSwGetSetExpType::GSE_SEQ)) || + + (nTypeId == TYP_SEQFLD && nWhich == RES_SETEXPFLD && + (((SwSetExpFieldType*)pFldType)->GetType() & nsSwGetSetExpType::GSE_SEQ)) || + + ((nTypeId == TYP_INPUTFLD || nTypeId == TYP_FORMELFLD) && + (nWhich == RES_USERFLD || + nWhich == RES_SETEXPFLD && + !(((SwSetExpFieldType*)pFldType)->GetType() & nsSwGetSetExpType::GSE_SEQ)) ) ) + { + String* pNew = new String(pFldType->GetName()); + rToFill.Insert(pNew, rToFill.Count()); + } + } + break; + } + case TYP_DBNEXTSETFLD: + case TYP_DBNUMSETFLD: + case TYP_DBNAMEFLD: + case TYP_DBSETNUMBERFLD: + break; + + default: + { + // statische SubTypes + if(nPos != USHRT_MAX) + { + USHORT nCount; + if (nTypeId == TYP_DOCINFOFLD) + nCount = DI_SUBTYPE_END - DI_SUBTYPE_BEGIN; + else + nCount = aSwFlds[nPos].nSubTypeEnd - aSwFlds[nPos].nSubTypeStart; + + for(USHORT i = 0; i < nCount; ++i) + { + String* pNew; + if (nTypeId == TYP_DOCINFOFLD) + { + if ( i == DI_CUSTOM ) + pNew = new String( String(SW_RES( STR_CUSTOM )) ); + else + pNew = new String(*ViewShell::GetShellRes()->aDocInfoLst[i]); + } + else + pNew = new SW_RESSTR(aSwFlds[nPos].nSubTypeStart + i); + + rToFill.Insert(pNew, rToFill.Count()); + } + } + } + } + bRet = TRUE; + } + return bRet; +} + +/*-------------------------------------------------------------------- + Beschreibung: Format ermitteln + ZUGRIFF ueber TYP_.... + --------------------------------------------------------------------*/ + + +USHORT SwFldMgr::GetFormatCount(USHORT nTypeId, BOOL bIsText, BOOL bHtmlMode) const +{ + ASSERT(nTypeId < TYP_END, "unzulaessige TypeId"); + + { + const USHORT nPos = GetPos(nTypeId); + + if(nPos == USHRT_MAX || (bHtmlMode && nTypeId == TYP_SETFLD)) + return 0; + + ULONG nStart = aSwFlds[nPos].nFmtBegin; + ULONG nEnd = aSwFlds[nPos].nFmtEnd; + + if (bIsText && nEnd - nStart >= 2) + return 2; + + if (nTypeId == TYP_FILENAMEFLD) + nEnd -= 2; // Kein Bereich oder Vorlage + + switch(nStart) + { + case FMT_GETVAR_BEGIN: + case FMT_SETVAR_BEGIN: return VF_COUNT; + case FMT_USERVAR_BEGIN: return VF_USR_COUNT; + case FMT_DBFLD_BEGIN: return VF_DB_COUNT; + case FMT_NUM_BEGIN: + { + USHORT nCount = (USHORT)(nEnd - nStart); + GetNumberingInfo(); + if(xNumberingInfo.is()) + { + Sequence<sal_Int16> aTypes = xNumberingInfo->getSupportedNumberingTypes(); + const sal_Int16* pTypes = aTypes.getConstArray(); + for(sal_Int32 nType = 0; nType < aTypes.getLength(); nType++) + { + sal_Int16 nCurrent = pTypes[nType]; + //skip all values below or equal to CHARS_LOWER_LETTER_N + if(nCurrent > NumberingType::CHARS_LOWER_LETTER_N) + { + // #i28073# it's not necessarily a sorted sequence + ++nCount; + } + } + } + return nCount; + } + + } + return (USHORT)(nEnd - nStart); + } +} + +/*-------------------------------------------------------------------- + Beschreibung: FormatString zu einem Typ ermitteln + --------------------------------------------------------------------*/ + + +String SwFldMgr::GetFormatStr(USHORT nTypeId, ULONG nFormatId) const +{ + String aRet; + ASSERT(nTypeId < TYP_END, "unzulaessige TypeId"); + + const USHORT nPos = GetPos(nTypeId); + + if(nPos == USHRT_MAX) + return aRet; + + ULONG nStart; + + nStart = aSwFlds[nPos].nFmtBegin; + + if (TYP_AUTHORFLD == nTypeId|| TYP_FILENAMEFLD == nTypeId) + nFormatId &= ~FF_FIXED; // Fixed-Flag ausmaskieren + + if((nStart + nFormatId) < aSwFlds[nPos].nFmtEnd) + aRet = SW_RESSTR((USHORT)(nStart + nFormatId)); + else if( FMT_NUM_BEGIN == nStart) + { + if(xNumberingInfo.is()) + { + Sequence<sal_Int16> aTypes = xNumberingInfo->getSupportedNumberingTypes(); + const sal_Int16* pTypes = aTypes.getConstArray(); + sal_Int32 nOffset = aSwFlds[nPos].nFmtEnd - nStart; + sal_Int32 nValidEntry = 0; + for(sal_Int32 nType = 0; nType < aTypes.getLength(); nType++) + { + sal_Int16 nCurrent = pTypes[nType]; + if(nCurrent > NumberingType::CHARS_LOWER_LETTER_N) + { + if(nValidEntry == ((sal_Int32)nFormatId) - nOffset) + { + aRet = xNumberingInfo->getNumberingIdentifier( pTypes[nType] ); + break; + } + ++nValidEntry; + } + } + } + } + + return aRet; +} + +/*-------------------------------------------------------------------- + Beschreibung: FormatId aus Pseudo-ID ermitteln + --------------------------------------------------------------------*/ + +USHORT SwFldMgr::GetFormatId(USHORT nTypeId, ULONG nFormatId) const +{ + USHORT nId = (USHORT)nFormatId; + + switch( nTypeId ) + { + case TYP_DOCINFOFLD: + switch( aSwFlds[ GetPos( nTypeId ) ].nFmtBegin + nFormatId ) + { + case FMT_REG_AUTHOR: nId = DI_SUB_AUTHOR; break; + case FMT_REG_TIME: nId = DI_SUB_TIME; break; + case FMT_REG_DATE: nId = DI_SUB_DATE; break; + } + break; + + case TYP_PAGENUMBERFLD: + case TYP_NEXTPAGEFLD: + case TYP_PREVPAGEFLD: + case TYP_DOCSTATFLD: + case TYP_DBSETNUMBERFLD: + case TYP_SEQFLD: + case TYP_GETREFPAGEFLD: + { + USHORT nPos = GetPos( nTypeId ); + ULONG nBegin = aSwFlds[ nPos ].nFmtBegin; + ULONG nEnd = aSwFlds[nPos].nFmtEnd; + if((nBegin + nFormatId) < nEnd) + { + switch( nBegin + nFormatId ) + { + case FMT_NUM_ABC: nId = SVX_NUM_CHARS_UPPER_LETTER; break; + case FMT_NUM_SABC: nId = SVX_NUM_CHARS_LOWER_LETTER; break; + case FMT_NUM_ROMAN: nId = SVX_NUM_ROMAN_UPPER; break; + case FMT_NUM_SROMAN: nId = SVX_NUM_ROMAN_LOWER; break; + case FMT_NUM_ARABIC: nId = SVX_NUM_ARABIC; break; + case FMT_NUM_PAGEDESC: nId = SVX_NUM_PAGEDESC; break; + case FMT_NUM_PAGESPECIAL: nId = SVX_NUM_CHAR_SPECIAL; break; + case FMT_NUM_ABC_N: nId = SVX_NUM_CHARS_UPPER_LETTER_N; break; + case FMT_NUM_SABC_N: nId = SVX_NUM_CHARS_LOWER_LETTER_N; break; + } + } + else if(xNumberingInfo.is()) + { + Sequence<sal_Int16> aTypes = xNumberingInfo->getSupportedNumberingTypes(); + const sal_Int16* pTypes = aTypes.getConstArray(); + sal_Int32 nOffset = nEnd - nBegin; + sal_Int32 nValidEntry = 0; + for(sal_Int32 nType = 0; nType < aTypes.getLength(); nType++) + { + sal_Int16 nCurrent = pTypes[nType]; + if(nCurrent > NumberingType::CHARS_LOWER_LETTER_N) + { + if(nValidEntry == ((sal_Int32)nFormatId) - nOffset) + { + nId = pTypes[nType]; + break; + } + ++nValidEntry; + } + } + } + } + break; + case TYP_DDEFLD: + switch ( aSwFlds[ GetPos( nTypeId ) ].nFmtBegin + nFormatId ) + { + case FMT_DDE_NORMAL: nId = sfx2::LINKUPDATE_ONCALL; break; + case FMT_DDE_HOT: nId = sfx2::LINKUPDATE_ALWAYS; break; + } + break; + } + + return nId; + +} + +/*-------------------------------------------------------------------- + Beschreibung: Traveling + --------------------------------------------------------------------*/ + + +BOOL SwFldMgr::GoNextPrev( BOOL bNext, SwFieldType* pTyp ) +{ + SwWrtShell* pSh = pWrtShell ? pWrtShell : ::lcl_GetShell(); + if(!pSh) + return FALSE; + + if( !pTyp && pCurFld ) + { + const USHORT nTypeId = pCurFld->GetTypeId(); + if( TYP_SETINPFLD == nTypeId || TYP_USRINPFLD == nTypeId ) + pTyp = pSh->GetFldType( 0, RES_INPUTFLD ); + else + pTyp = pCurFld->GetTyp(); + } + + if (pTyp && pTyp->Which() == RES_DBFLD) + { + // Fuer Feldbefehl-bearbeiten (alle DB-Felder anspringen) + return pSh->MoveFldType( 0, bNext, USHRT_MAX, RES_DBFLD ); + } + + return pTyp && pSh ? pSh->MoveFldType( pTyp, bNext ) : FALSE; +} + +/*-------------------------------------------------------------------- + Beschreibung: Feldtypen einfuegen + --------------------------------------------------------------------*/ + + +void SwFldMgr::InsertFldType(SwFieldType& rType) +{ + SwWrtShell* pSh = pWrtShell ? pWrtShell : ::lcl_GetShell(); + DBG_ASSERT(pSh, "no SwWrtShell found"); + if(pSh) + pSh->InsertFldType(rType); +} + +/*-------------------------------------------------------------------- + Beschreibung: Aktuelle TypeId ermitteln + --------------------------------------------------------------------*/ + + +USHORT SwFldMgr::GetCurTypeId() const +{ + return pCurFld ? pCurFld->GetTypeId() : USHRT_MAX; +} + +/*-------------------------------------------------------------------- + Beschreibung: Ueber String Feld einfuegen oder Update + --------------------------------------------------------------------*/ + + +BOOL SwFldMgr::InsertFld( const SwInsertFld_Data& rData ) +{ + SwField* pFld = 0; + BOOL bExp = FALSE; + BOOL bTbl = FALSE; + BOOL bPageVar = FALSE; + ULONG nFormatId = rData.nFormatId; + USHORT nSubType = rData.nSubType; + sal_Unicode cSeparator = rData.cSeparator; + SwWrtShell* pCurShell = rData.pSh; + if(!pCurShell) + pCurShell = pWrtShell ? pWrtShell : ::lcl_GetShell(); + DBG_ASSERT(pCurShell, "no SwWrtShell found"); + if(!pCurShell) + return FALSE; + + switch(rData.nTypeId) + { // ACHTUNG dieses Feld wird ueber einen gesonderten Dialog eingefuegt + case TYP_POSTITFLD: + { + SwPostItFieldType* pType = (SwPostItFieldType*)pCurShell->GetFldType(0, RES_POSTITFLD); + pFld = new SwPostItField(pType, rData.sPar1, rData.sPar2, DateTime()); + break; + } + case TYP_SCRIPTFLD: + { + SwScriptFieldType* pType = + (SwScriptFieldType*)pCurShell->GetFldType(0, RES_SCRIPTFLD); + pFld = new SwScriptField(pType, rData.sPar1, rData.sPar2, (BOOL)nFormatId); + break; + } + case TYP_COMBINED_CHARS: + { + SwCombinedCharFieldType* pType = (SwCombinedCharFieldType*) + pCurShell->GetFldType( 0, RES_COMBINED_CHARS ); + pFld = new SwCombinedCharField( pType, rData.sPar1 ); + } + break; + case TYP_AUTHORITY: + { + SwAuthorityFieldType* pType = + (SwAuthorityFieldType*)pCurShell->GetFldType(0, RES_AUTHORITY); + if(!pType) + { + pType = + (SwAuthorityFieldType*)pCurShell->InsertFldType( + SwAuthorityFieldType(pCurShell->GetDoc())); + } + pFld = new SwAuthorityField(pType, rData.sPar1); + } + break; + case TYP_DATEFLD: + case TYP_TIMEFLD: + { + USHORT nSub = static_cast< USHORT >(rData.nTypeId == TYP_DATEFLD ? DATEFLD : TIMEFLD); + nSub |= nSubType == DATE_VAR ? 0 : FIXEDFLD; + + SwDateTimeFieldType* pTyp = + (SwDateTimeFieldType*)pCurShell->GetFldType(0, RES_DATETIMEFLD); + pFld = new SwDateTimeField(pTyp, nSub, nFormatId); + pFld->SetPar2(rData.sPar2); + break; + } + case TYP_FILENAMEFLD: + { + SwFileNameFieldType* pTyp = + (SwFileNameFieldType*)pCurShell->GetFldType(0, RES_FILENAMEFLD); + pFld = new SwFileNameField(pTyp, nFormatId); + break; + } + case TYP_TEMPLNAMEFLD: + { + SwTemplNameFieldType* pTyp = + (SwTemplNameFieldType*)pCurShell->GetFldType(0, RES_TEMPLNAMEFLD); + pFld = new SwTemplNameField(pTyp, nFormatId); + break; + } + case TYP_CHAPTERFLD: + { + USHORT nByte = (USHORT)rData.sPar2.ToInt32(); + SwChapterFieldType* pTyp = + (SwChapterFieldType*)pCurShell->GetFldType(0, RES_CHAPTERFLD); + pFld = new SwChapterField(pTyp, nFormatId); + nByte = Max(USHORT(1), nByte); + nByte = Min(nByte, USHORT(MAXLEVEL)); + nByte -= 1; + ((SwChapterField*)pFld)->SetLevel((BYTE)nByte); + break; + } + case TYP_NEXTPAGEFLD: + case TYP_PREVPAGEFLD: + case TYP_PAGENUMBERFLD: + { + short nOff = (short)rData.sPar2.ToInt32(); + + if(rData.nTypeId == TYP_NEXTPAGEFLD) + { + if( SVX_NUM_CHAR_SPECIAL == nFormatId ) + nOff = 1; + else + nOff += 1; + nSubType = PG_NEXT; + } + else if(rData.nTypeId == TYP_PREVPAGEFLD) + { + if( SVX_NUM_CHAR_SPECIAL == nFormatId ) + nOff = -1; + else + nOff -= 1; + nSubType = PG_PREV; + } + else + nSubType = PG_RANDOM; + + SwPageNumberFieldType* pTyp = + (SwPageNumberFieldType*)pCurShell->GetFldType(0, RES_PAGENUMBERFLD); + pFld = new SwPageNumberField(pTyp, nSubType, nFormatId, nOff); + + if( SVX_NUM_CHAR_SPECIAL == nFormatId && + ( PG_PREV == nSubType || PG_NEXT == nSubType ) ) + ((SwPageNumberField*)pFld)->SetUserString( rData.sPar2 ); + break; + } + case TYP_DOCSTATFLD: + { SwDocStatFieldType* pTyp = + (SwDocStatFieldType*)pCurShell->GetFldType(0, RES_DOCSTATFLD); + pFld = new SwDocStatField(pTyp, nSubType, nFormatId); + break; + } + case TYP_AUTHORFLD: + { SwAuthorFieldType* pTyp = + (SwAuthorFieldType*)pCurShell->GetFldType(0, RES_AUTHORFLD); + pFld = new SwAuthorField(pTyp, nFormatId); + break; + } + case TYP_CONDTXTFLD: + case TYP_HIDDENTXTFLD: + { + SwHiddenTxtFieldType* pTyp = + (SwHiddenTxtFieldType*)pCurShell->GetFldType(0, RES_HIDDENTXTFLD); + pFld = new SwHiddenTxtField(pTyp, TRUE, rData.sPar1, rData.sPar2, FALSE, rData.nTypeId); + bExp = TRUE; + break; + } + case TYP_HIDDENPARAFLD: + { + SwHiddenParaFieldType* pTyp = + (SwHiddenParaFieldType*)pCurShell->GetFldType(0, RES_HIDDENPARAFLD); + pFld = new SwHiddenParaField(pTyp, rData.sPar1); + bExp = TRUE; + break; + } + case TYP_SETREFFLD: + { + if( rData.sPar1.Len() > 0 && CanInsertRefMark( rData.sPar1 ) ) + { + pCurShell->SetAttr( SwFmtRefMark( rData.sPar1 ) ); + return TRUE; + } + return FALSE; + } + case TYP_GETREFFLD: + { + SwGetRefFieldType* pTyp = + (SwGetRefFieldType*)pCurShell->GetFldType(0, RES_GETREFFLD); + USHORT nSeqNo = (USHORT)rData.sPar2.ToInt32(); + pFld = new SwGetRefField(pTyp, rData.sPar1, nSubType, nSeqNo, nFormatId); + bExp = TRUE; + break; + } + case TYP_DDEFLD: + { + //JP 28.08.95: DDE-Topics/-Items koennen Blanks in ihren + // Namen haben! Wird hier noch nicht beachtet. + String sCmd( rData.sPar2 ); + USHORT nTmpPos = sCmd.SearchAndReplace( ' ', sfx2::cTokenSeperator ); + sCmd.SearchAndReplace( ' ', sfx2::cTokenSeperator, nTmpPos ); + + SwDDEFieldType* pTyp = (SwDDEFieldType*)pCurShell->InsertFldType( + SwDDEFieldType( rData.sPar1, sCmd, (USHORT)nFormatId )); + pFld = new SwDDEField( pTyp ); + break; + } + case TYP_MACROFLD: + { + SwMacroFieldType* pTyp = + (SwMacroFieldType*)pCurShell->GetFldType(0, RES_MACROFLD); + + pFld = new SwMacroField(pTyp, rData.sPar1, rData.sPar2); + + break; + } + case TYP_INTERNETFLD: + { + SwFmtINetFmt aFmt( rData.sPar1, sCurFrame ); + if( pMacroItem ) + aFmt.SetMacroTbl( &pMacroItem->GetMacroTable() ); + return pCurShell->InsertURL( aFmt, rData.sPar2 ); + } + case TYP_JUMPEDITFLD: + { + SwJumpEditFieldType* pTyp = + (SwJumpEditFieldType*)pCurShell->GetFldType(0, RES_JUMPEDITFLD); + + pFld = new SwJumpEditField(pTyp, nFormatId, rData.sPar1, rData.sPar2 ); + break; + } + case TYP_DOCINFOFLD: + { + SwDocInfoFieldType* pTyp = (SwDocInfoFieldType*)pCurShell->GetFldType( + 0, RES_DOCINFOFLD ); + pFld = new SwDocInfoField(pTyp, nSubType, rData.sPar1, nFormatId); + break; + } + case TYP_EXTUSERFLD: + { + SwExtUserFieldType* pTyp = (SwExtUserFieldType*)pCurShell->GetFldType( + 0, RES_EXTUSERFLD); + pFld = new SwExtUserField(pTyp, nSubType, nFormatId); + break; + } + case TYP_DBFLD: + { + SwDBData aDBData; + String sPar1; + + if (rData.sPar1.Search(DB_DELIM) == STRING_NOTFOUND) + { + aDBData = pCurShell->GetDBData(); + sPar1 = rData.sPar1; + } + else + { + aDBData.sDataSource = rData.sPar1.GetToken(0, DB_DELIM); + aDBData.sCommand = rData.sPar1.GetToken(1, DB_DELIM); + aDBData.nCommandType = rData.sPar1.GetToken(2, DB_DELIM).ToInt32(); + sPar1 = rData.sPar1.GetToken(3, DB_DELIM); + } + + if(aDBData.sDataSource.getLength() && pCurShell->GetDBData() != aDBData) + pCurShell->ChgDBData(aDBData); + + SwDBFieldType* pTyp = (SwDBFieldType*)pCurShell->InsertFldType( + SwDBFieldType(pCurShell->GetDoc(), sPar1, aDBData) ); + pFld = new SwDBField(pTyp); + pFld->SetSubType(nSubType); + + if( !(nSubType & nsSwExtendedSubType::SUB_OWN_FMT) ) // Datenbankformat ermitteln + { + Reference< XDataSource> xSource; + rData.aDBDataSource >>= xSource; + Reference<XConnection> xConnection; + rData.aDBConnection >>= xConnection; + Reference<XPropertySet> xColumn; + rData.aDBColumn >>= xColumn; + if(xColumn.is()) + { + nFormatId = pCurShell->GetNewDBMgr()->GetColumnFmt(xSource, xConnection, xColumn, + pCurShell->GetNumberFormatter(), GetCurrLanguage() ); + } + else + nFormatId = pCurShell->GetNewDBMgr()->GetColumnFmt( + aDBData.sDataSource, aDBData.sCommand, sPar1, + pCurShell->GetNumberFormatter(), GetCurrLanguage() ); + } + pFld->ChangeFormat( nFormatId ); + + bExp = TRUE; + break; + } + case TYP_DBSETNUMBERFLD: + case TYP_DBNUMSETFLD: + case TYP_DBNEXTSETFLD: + case TYP_DBNAMEFLD: + { + USHORT nPos, nTablePos, nCmdTypePos, nExpPos; + String sPar1; + SwDBData aDBData; + + // DBName aus rData.sPar1 extrahieren. Format: DBName.TableName.CommandType.ExpStrg + if ((nTablePos = rData.sPar1.Search(DB_DELIM)) != STRING_NOTFOUND) + aDBData.sDataSource = rData.sPar1.Copy(0, nTablePos++); + if ((nCmdTypePos = rData.sPar1.Search(DB_DELIM, nTablePos)) != STRING_NOTFOUND) + { + aDBData.sCommand = rData.sPar1.Copy(nTablePos, nCmdTypePos++ - nTablePos); + } + if ((nExpPos = rData.sPar1.Search(DB_DELIM, nCmdTypePos)) != STRING_NOTFOUND) + { + aDBData.nCommandType = rData.sPar1.Copy(nCmdTypePos, nExpPos++ - nCmdTypePos).ToInt32(); + } + if (nExpPos != STRING_NOTFOUND) + nPos = nExpPos; + else if (nTablePos != STRING_NOTFOUND) + nPos = nTablePos; + else + nPos = 0; + sPar1 = rData.sPar1.Copy(nPos); + + if (aDBData.sDataSource.getLength() && pCurShell->GetDBData() != aDBData) + pCurShell->ChgDBData(aDBData); + + switch(rData.nTypeId) + { + case TYP_DBNAMEFLD: + { + SwDBNameFieldType* pTyp = + (SwDBNameFieldType*)pCurShell->GetFldType(0, RES_DBNAMEFLD); + pFld = new SwDBNameField(pTyp, aDBData); + + break; + } + case TYP_DBNEXTSETFLD: + { + SwDBNextSetFieldType* pTyp = (SwDBNextSetFieldType*)pCurShell->GetFldType( + 0, RES_DBNEXTSETFLD); + pFld = new SwDBNextSetField(pTyp, sPar1, rData.sPar2, aDBData); + bExp = TRUE; + break; + } + case TYP_DBNUMSETFLD: + { + SwDBNumSetFieldType* pTyp = (SwDBNumSetFieldType*)pCurShell->GetFldType( + 0, RES_DBNUMSETFLD); + pFld = new SwDBNumSetField( pTyp, sPar1, rData.sPar2, aDBData); + bExp = TRUE; + break; + } + case TYP_DBSETNUMBERFLD: + { + SwDBSetNumberFieldType* pTyp = (SwDBSetNumberFieldType*) + pCurShell->GetFldType(0, RES_DBSETNUMBERFLD); + pFld = new SwDBSetNumberField( pTyp, aDBData, nFormatId); + bExp = TRUE; + break; + } + } + break; + } + case TYP_USERFLD: + { + SwUserFieldType* pTyp = + (SwUserFieldType*)pCurShell->GetFldType(RES_USERFLD, rData.sPar1); + + // nur wenn vorhanden + if(!pTyp) + { + pTyp = (SwUserFieldType*)pCurShell->InsertFldType( + SwUserFieldType(pCurShell->GetDoc(), rData.sPar1)); + } + if (pTyp->GetContent(nFormatId) != rData.sPar2) + pTyp->SetContent(rData.sPar2, nFormatId); + pFld = new SwUserField(pTyp, 0, nFormatId); + if (pFld->GetSubType() != nSubType) + pFld->SetSubType(nSubType); + bTbl = TRUE; + break; + } + case TYP_INPUTFLD: + { + if ((nSubType & 0x00ff) == INP_VAR) + { + SwSetExpFieldType* pTyp = (SwSetExpFieldType*) + pCurShell->GetFldType(RES_SETEXPFLD, rData.sPar1); + + // kein Experssion Type mit dem Namen vorhanden -> anlegen + if(pTyp) + { + SwSetExpField* pExpFld = + new SwSetExpField(pTyp, aEmptyStr, nFormatId); + + // Typ vom SwSetExpFieldType nicht veraendern: + USHORT nOldSubType = pExpFld->GetSubType(); + pExpFld->SetSubType(nOldSubType | (nSubType & 0xff00)); + + pExpFld->SetPromptText(rData.sPar2); + pExpFld->SetInputFlag(TRUE) ; + bExp = TRUE; + pFld = pExpFld; + } + else + return FALSE; + } + else + { + SwInputFieldType* pTyp = + (SwInputFieldType*)pCurShell->GetFldType(0, RES_INPUTFLD); + + SwInputField* pInpFld = + new SwInputField(pTyp, rData.sPar1, rData.sPar2, nSubType|nsSwExtendedSubType::SUB_INVISIBLE, nFormatId); + pFld = pInpFld; + } + + // Dialog starten + // + pCurShell->StartInputFldDlg(pFld, FALSE, rData.pParent); + break; + } + case TYP_SETFLD: + { + if (!rData.sPar2.Len()) // Leere Variablen sind nicht erlaubt + return FALSE; + + SwSetExpFieldType* pTyp = (SwSetExpFieldType*)pCurShell->InsertFldType( + SwSetExpFieldType(pCurShell->GetDoc(), rData.sPar1) ); + + SwSetExpField* pExpFld = new SwSetExpField( pTyp, rData.sPar2, nFormatId); + pExpFld->SetSubType(nSubType); + pExpFld->SetPar2(rData.sPar2); + bExp = TRUE; + pFld = pExpFld; + break; + } + case TYP_SEQFLD: + { + SwSetExpFieldType* pTyp = (SwSetExpFieldType*)pCurShell->InsertFldType( + SwSetExpFieldType(pCurShell->GetDoc(), rData.sPar1, nsSwGetSetExpType::GSE_SEQ)); + + BYTE nLevel = static_cast< BYTE >(nSubType & 0xff); + + pTyp->SetOutlineLvl(nLevel); + if (nLevel != 0x7f && cSeparator == 0) + cSeparator = '.'; + + pTyp->SetDelimiter(cSeparator); + SwSetExpField* pExpFld = new SwSetExpField(pTyp, rData.sPar2, nFormatId); + bExp = TRUE; + pFld = pExpFld; + nSubType = nsSwGetSetExpType::GSE_SEQ; + break; + } + case TYP_GETFLD: + { + // gibt es ein entprechendes SetField + SwSetExpFieldType* pSetTyp = (SwSetExpFieldType*) + pCurShell->GetFldType(RES_SETEXPFLD, rData.sPar1); + + if(pSetTyp) + { + SwGetExpFieldType* pTyp = (SwGetExpFieldType*)pCurShell->GetFldType( + 0, RES_GETEXPFLD); + pFld = new SwGetExpField(pTyp, rData.sPar1, pSetTyp->GetType(), nFormatId); + pFld->SetSubType(nSubType | pSetTyp->GetType()); + bExp = TRUE; + } + else + return FALSE; + break; + } + case TYP_FORMELFLD: + { + if(pCurShell->GetFrmType(0,FALSE) & FRMTYPE_TABLE) + { + pCurShell->StartAllAction(); + + SvNumberFormatter* pFormatter = pCurShell->GetDoc()->GetNumberFormatter(); + const SvNumberformat* pEntry = pFormatter->GetEntry(nFormatId); + + if (pEntry) + { + SfxStringItem aFormat(FN_NUMBER_FORMAT, pEntry->GetFormatstring()); + pCurShell->GetView().GetViewFrame()->GetDispatcher()-> + Execute(FN_NUMBER_FORMAT, SFX_CALLMODE_SYNCHRON, &aFormat, 0L); + } + + SfxItemSet aBoxSet( pCurShell->GetAttrPool(), + RES_BOXATR_FORMULA, RES_BOXATR_FORMULA ); + + String sFml( rData.sPar2 ); + if( sFml.EraseLeadingChars().Len() && + '=' == sFml.GetChar( 0 ) ) + sFml.Erase( 0, 1 ); + + aBoxSet.Put( SwTblBoxFormula( sFml )); + pCurShell->SetTblBoxFormulaAttrs( aBoxSet ); + pCurShell->UpdateTable(); + + pCurShell->EndAllAction(); + return TRUE; + +/* // In der Tabelle Tabellenformeln einfuegen + SwTblFieldType* pTyp = (SwTblFieldType*)pCurShell->GetFldType( + 0, RES_TABLEFLD); + pFld = new SwTblField(pTyp, rData.sPar2, nsSwGetSetExpType::GSE_EXPR, nFormatId); + bTbl = TRUE;*/ + } + else + { + SwGetExpFieldType* pTyp = (SwGetExpFieldType*) + pCurShell->GetFldType(0, RES_GETEXPFLD); + pFld = new SwGetExpField(pTyp, rData.sPar2, nsSwGetSetExpType::GSE_FORMULA, nFormatId); + pFld->SetSubType(nSubType); + bExp = TRUE; + } + break; + } + case TYP_SETREFPAGEFLD: + pFld = new SwRefPageSetField( (SwRefPageSetFieldType*) + pCurShell->GetFldType( 0, RES_REFPAGESETFLD ), + (short)rData.sPar2.ToInt32(), 0 != nSubType ); + bPageVar = TRUE; + break; + + case TYP_GETREFPAGEFLD: + pFld = new SwRefPageGetField( (SwRefPageGetFieldType*) + pCurShell->GetFldType( 0, RES_REFPAGEGETFLD ), nFormatId ); + bPageVar = TRUE; + break; + case TYP_DROPDOWN : + { + pFld = new SwDropDownField(pCurShell->GetFldType( 0, RES_DROPDOWN )); + xub_StrLen nTokenCount = rData.sPar2.Len() ? rData.sPar2.GetTokenCount(DB_DELIM) : 0; + Sequence<OUString> aEntries(nTokenCount); + OUString* pArray = aEntries.getArray(); + for(xub_StrLen nToken = 0; nToken < nTokenCount; nToken++) + pArray[nToken] = rData.sPar2.GetToken(nToken, DB_DELIM); + ((SwDropDownField*)pFld)->SetItems(aEntries); + ((SwDropDownField*)pFld)->SetName(rData.sPar1); + } + break; + default: + { ASSERT(!this, "Falscher Feldtyp"); + return FALSE; + } + } + ASSERT(pFld, "Feld nicht vorhanden"); + + + //the auto language flag has to be set prior to the language! + pFld->SetAutomaticLanguage(rData.bIsAutomaticLanguage); + USHORT nLang = GetCurrLanguage(); + pFld->SetLanguage(nLang); + + // Einfuegen + pCurShell->StartAllAction(); + + pCurShell->Insert(*pFld); + + if(bExp && bEvalExp) + pCurShell->UpdateExpFlds(TRUE); + + if(bTbl) + { + pCurShell->Left(CRSR_SKIP_CHARS, FALSE, 1, FALSE ); + pCurShell->UpdateFlds(*pFld); + pCurShell->Right(CRSR_SKIP_CHARS, FALSE, 1, FALSE ); + } + else if( bPageVar ) + ((SwRefPageGetFieldType*)pCurShell->GetFldType( 0, RES_REFPAGEGETFLD ))->UpdateFlds(); + else if( TYP_GETREFFLD == rData.nTypeId ) + pFld->GetTyp()->Modify( 0, 0 ); + + // temporaeres Feld loeschen + delete pFld; + + pCurShell->EndAllAction(); + return TRUE; +} + +/*-------------------------------------------------------------------- + Beschreibung: Felder Update + --------------------------------------------------------------------*/ + + +void SwFldMgr::UpdateCurFld(ULONG nFormat, + const String& rPar1, + const String& rPar2, + SwField * _pTmpFld) // #111840# +{ + // Format aendern + ASSERT(pCurFld, "kein Feld an der CursorPos"); + + bool bDelete = false; + SwField *pTmpFld; // mb: fixed memory leak + if (NULL != _pTmpFld) + { + pTmpFld = _pTmpFld; + } + else + { + pTmpFld = pCurFld->CopyField(); + bDelete = true; + } + + SwFieldType* pType = pTmpFld->GetTyp(); + const USHORT nTypeId = pTmpFld->GetTypeId(); + + SwWrtShell* pSh = pWrtShell ? pWrtShell : ::lcl_GetShell(); + DBG_ASSERT(pSh, "no SwWrtShell found"); + if(!pSh) + return; + pSh->StartAllAction(); + + BOOL bSetPar2 = TRUE; + BOOL bSetPar1 = TRUE; + String sPar1( rPar1 ); + String sPar2( rPar2 ); + + // Order to Format + switch( nTypeId ) + { + case TYP_DDEFLD: + { + //JP 28.08.95: DDE-Topics/-Items koennen Blanks in ihren + // Namen haben! Wird hier noch nicht beachtet. + USHORT nTmpPos = sPar2.SearchAndReplace( ' ', sfx2::cTokenSeperator ); + sPar2.SearchAndReplace( ' ', sfx2::cTokenSeperator, nTmpPos ); + break; + } + + case TYP_CHAPTERFLD: + { + USHORT nByte = (USHORT)rPar2.ToInt32(); + nByte = Max(USHORT(1), nByte); + nByte = Min(nByte, USHORT(MAXLEVEL)); + nByte -= 1; + ((SwChapterField*)pTmpFld)->SetLevel((BYTE)nByte); + bSetPar2 = FALSE; + break; + } + + case TYP_SCRIPTFLD: + ((SwScriptField*)pTmpFld)->SetCodeURL((BOOL)nFormat); + break; + + case TYP_NEXTPAGEFLD: + if( SVX_NUM_CHAR_SPECIAL == nFormat ) + { + ((SwPageNumberField*)pCurFld)->SetUserString( sPar2 ); + sPar2 = '1'; + } + else + { + if( nFormat + 2 == SVX_NUM_PAGEDESC ) + nFormat = SVX_NUM_PAGEDESC; + short nOff = (short)sPar2.ToInt32(); + nOff += 1; + sPar2 = String::CreateFromInt32(nOff); + } + break; + + case TYP_PREVPAGEFLD: + if( SVX_NUM_CHAR_SPECIAL == nFormat ) + { + ((SwPageNumberField*)pCurFld)->SetUserString( sPar2 ); + sPar2 = String::CreateFromAscii( + RTL_CONSTASCII_STRINGPARAM("-1")); + } + else + { + if( nFormat + 2 == SVX_NUM_PAGEDESC ) + nFormat = SVX_NUM_PAGEDESC; + short nOff = (short)sPar2.ToInt32(); + nOff -= 1; + sPar2 = String::CreateFromInt32(nOff); + } + break; + + case TYP_PAGENUMBERFLD: + case TYP_GETREFPAGEFLD: + if( nFormat + 2 == SVX_NUM_PAGEDESC ) + nFormat = SVX_NUM_PAGEDESC; + break; + + case TYP_GETREFFLD: + { + bSetPar2 = FALSE; + ((SwGetRefField*)pTmpFld)->SetSubType( (USHORT)rPar2.ToInt32() ); + USHORT nPos = rPar2.Search( '|' ); + if( STRING_NOTFOUND != nPos ) + ((SwGetRefField*)pTmpFld)->SetSeqNo( (USHORT)rPar2.Copy( nPos + 1 ).ToInt32()); + } + break; + case TYP_DROPDOWN: + { + xub_StrLen nTokenCount = sPar2.Len() ? sPar2.GetTokenCount(DB_DELIM) : 0; + Sequence<OUString> aEntries(nTokenCount); + OUString* pArray = aEntries.getArray(); + for(xub_StrLen nToken = 0; nToken < nTokenCount; nToken++) + pArray[nToken] = sPar2.GetToken(nToken, DB_DELIM); + ((SwDropDownField*)pTmpFld)->SetItems(aEntries); + ((SwDropDownField*)pTmpFld)->SetName(sPar1); + bSetPar1 = bSetPar2 = FALSE; + } + break; + case TYP_AUTHORITY : + { + //#i99069# changes to a bibliography field should change the field type + SwAuthorityField* pAuthorityField = static_cast<SwAuthorityField*>(pTmpFld); + SwAuthorityFieldType* pAuthorityType = static_cast<SwAuthorityFieldType*>(pType); + SwAuthEntry aTempEntry; + for( USHORT i = 0; i < AUTH_FIELD_END; ++i ) + aTempEntry.SetAuthorField( (ToxAuthorityField)i, + rPar1.GetToken( i, TOX_STYLE_DELIMITER )); + if( pAuthorityType->ChangeEntryContent( &aTempEntry ) ) + { + pType->UpdateFlds(); + pSh->SetModified(); + } + + if( aTempEntry.GetAuthorField( AUTH_FIELD_IDENTIFIER ) == + pAuthorityField->GetFieldText( AUTH_FIELD_IDENTIFIER ) ) + bSetPar1 = FALSE; //otherwise it's a new or changed entry, the field needs to be updated + bSetPar2 = FALSE; + } + break; + } + + // Format setzen + // Format wegen NumberFormatter vor SetPar2 einstellen! + pTmpFld->ChangeFormat(nFormat); + + if(bSetPar1) + pTmpFld->SetPar1( sPar1 ); + if( bSetPar2 ) + pTmpFld->SetPar2( sPar2 ); + + // Update anschmeissen + if(nTypeId == TYP_DDEFLD || + nTypeId == TYP_USERFLD || + nTypeId == TYP_USRINPFLD) + { + pType->UpdateFlds(); + pSh->SetModified(); + } + else { + // mb: #32157 + pSh->SwEditShell::UpdateFlds(*pTmpFld); + GetCurFld(); + } + + if (bDelete) + delete pTmpFld; + + pSh->EndAllAction(); +} + +/*-------------------------------------------------------------------- + Beschreibung: ExpressionFields explizit evaluieren + --------------------------------------------------------------------*/ +void SwFldMgr::EvalExpFlds(SwWrtShell* pSh) +{ + if (pSh == NULL) + pSh = pWrtShell ? pWrtShell : ::lcl_GetShell(); + + if(pSh) + { + pSh->StartAllAction(); + pSh->UpdateExpFlds(TRUE); + pSh->EndAllAction(); + } +} +USHORT SwFldMgr::GetCurrLanguage() const +{ + SwWrtShell* pSh = pWrtShell ? pWrtShell : ::lcl_GetShell(); + if( pSh ) + return pSh->GetCurLang(); + return SvxLocaleToLanguage( SvtSysLocale().GetLocaleData().getLocale() ); +} + +void SwFieldType::_GetFldName() +{ + static const USHORT coFldCnt = STR_TYPE_END - STR_TYPE_BEGIN; + + static USHORT __READONLY_DATA coFldNms[ coFldCnt ] = { + FLD_DATE_STD, + FLD_TIME_STD, + STR_FILENAMEFLD, + STR_DBNAMEFLD, + STR_CHAPTERFLD, + STR_PAGENUMBERFLD, + STR_DOCSTATFLD, + STR_AUTHORFLD, + STR_SETFLD, + STR_GETFLD, + STR_FORMELFLD, + STR_HIDDENTXTFLD, + STR_SETREFFLD, + STR_GETREFFLD, + STR_DDEFLD, + STR_MACROFLD, + STR_INPUTFLD, + STR_HIDDENPARAFLD, + STR_DOCINFOFLD, + STR_DBFLD, + STR_USERFLD, + STR_POSTITFLD, + STR_TEMPLNAMEFLD, + STR_SEQFLD, + STR_DBNEXTSETFLD, + STR_DBNUMSETFLD, + STR_DBSETNUMBERFLD, + STR_CONDTXTFLD, + STR_NEXTPAGEFLD, + STR_PREVPAGEFLD, + STR_EXTUSERFLD, + FLD_DATE_FIX, + FLD_TIME_FIX, + STR_SETINPUTFLD, + STR_USRINPUTFLD, + STR_SETREFPAGEFLD, + STR_GETREFPAGEFLD, + STR_INTERNETFLD, + STR_JUMPEDITFLD, + STR_SCRIPTFLD, + STR_AUTHORITY, + STR_COMBINED_CHARS, + STR_DROPDOWN + }; + + // Infos fuer Felder einfuegen + SwFieldType::pFldNames = new SvStringsDtor( (BYTE)coFldCnt, 2 ); + for( USHORT nIdx = 0; nIdx < coFldCnt; ++nIdx ) + { + String* pTmp = new SW_RESSTR( coFldNms[ nIdx ] ); + pTmp->Assign( MnemonicGenerator::EraseAllMnemonicChars( *pTmp ) ); + SwFieldType::pFldNames->Insert(pTmp, nIdx ); + } +} + +/*-------------------------------------------------------------------- + Beschreibung: + --------------------------------------------------------------------*/ + +BOOL SwFldMgr::ChooseMacro(const String&) +{ + BOOL bRet = FALSE; + + // choose script dialog + ::rtl::OUString aScriptURL = SfxApplication::ChooseScript(); + + // the script selector dialog returns a valid script URL + if ( aScriptURL.getLength() != 0 ) + { + SetMacroPath( aScriptURL ); + bRet = TRUE; + } + + return bRet; +} + +void SwFldMgr::SetMacroPath(const String& rPath) +{ + sMacroPath = rPath; + sMacroName = rPath; + + // try to set sMacroName member variable by parsing the macro path + // using the new URI parsing services + + Reference< XMultiServiceFactory > xSMgr = + ::comphelper::getProcessServiceFactory(); + + Reference< uri::XUriReferenceFactory > + xFactory( xSMgr->createInstance( + ::rtl::OUString::createFromAscii( + "com.sun.star.uri.UriReferenceFactory" ) ), UNO_QUERY ); + + if ( xFactory.is() ) + { + Reference< uri::XVndSunStarScriptUrl > + xUrl( xFactory->parse( sMacroPath ), UNO_QUERY ); + + if ( xUrl.is() ) + { + sMacroName = xUrl->getName(); + } + } +} + +/*-------------------------------------------------------------------- + Beschreibung: + --------------------------------------------------------------------*/ + +ULONG SwFldMgr::GetDefaultFormat(USHORT nTypeId, BOOL bIsText, SvNumberFormatter* pFormatter, double* pVal) +{ + double fValue; + short nDefFormat; + + switch (nTypeId) + { + case TYP_TIMEFLD: + case TYP_DATEFLD: + { + Date aDate; + Date* pNullDate = pFormatter->GetNullDate(); + + fValue = aDate - *pNullDate; + + Time aTime; + + ULONG nNumFmtTime = (ULONG)aTime.GetSec() + (ULONG)aTime.GetMin() * 60L + + (ULONG)aTime.GetHour() * 3600L; + + fValue += (double)nNumFmtTime / 86400.0; + + nDefFormat = (nTypeId == TYP_DATEFLD) ? NUMBERFORMAT_DATE : NUMBERFORMAT_TIME; + } + break; + + default: + if (bIsText) + { + fValue = 0.0; + nDefFormat = NUMBERFORMAT_TEXT; + } + else + { + fValue = 0.0; + nDefFormat = NUMBERFORMAT_ALL; + } + break; + } + + if (pVal) + *pVal = fValue; + + return pFormatter->GetStandardFormat(nDefFormat, GetCurrLanguage()); +} + +/* -----------------------------01.03.01 16:46-------------------------------- + + ---------------------------------------------------------------------------*/ +Reference<XNumberingTypeInfo> SwFldMgr::GetNumberingInfo() const +{ + if(!xNumberingInfo.is()) + { + Reference< XMultiServiceFactory > xMSF = ::comphelper::getProcessServiceFactory(); + Reference < XInterface > xI = xMSF->createInstance( + ::rtl::OUString::createFromAscii( + "com.sun.star.text.DefaultNumberingProvider" )); + Reference<XDefaultNumberingProvider> xDefNum(xI, UNO_QUERY); + DBG_ASSERT(xDefNum.is(), "service missing: \"com.sun.star.text.DefaultNumberingProvider\""); + ((SwFldMgr*)this)->xNumberingInfo = Reference<XNumberingTypeInfo>(xDefNum, UNO_QUERY); + } + return xNumberingInfo; +} |