blob: 7022454ed774621b39b3fbc7bf0037c0b397b1a4 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_sw.hxx"
#include <stdlib.h>
#include <stdio.h>
#include "hintids.hxx"
#include <tools/resid.hxx>
#include <svl/macitem.hxx>
#include <svl/zforlist.hxx>
#include <svl/zformat.hxx>
#include <svl/urihelper.hxx>
#include <sfx2/linkmgr.hxx>
#ifndef _SVSTDARR_USHORTS_DECL
#define _SVSTDARR_USHORTS
#include <svl/svstdarr.hxx>
#endif
#include <editeng/lrspitem.hxx>
#include <editeng/tstpitem.hxx>
#include <fmtinfmt.hxx>
#include <fmtfld.hxx>
#include <frmatr.hxx>
#include "doc.hxx"
#include "docary.hxx"
#include "fldbas.hxx"
#include "flddat.hxx"
#include "docufld.hxx"
#include "chpfld.hxx"
#include "ddefld.hxx"
#include "expfld.hxx"
#include "reffld.hxx"
#include "usrfld.hxx"
#include "dbfld.hxx"
#include "txtfld.hxx"
#include "ndtxt.hxx"
//really used ids from old sw3ids.hxx
#define SWG_INETBROWSER 0x000e // URL-Grf-Nodes, Browse-Flag, Format-Ums.
#define SWG_NEWFIELDS 0x0200 // Felder mit Numberformatter-Zahlenformat
#define SWG_EXPORT40 0x0110 // Version fuer 4.0-Export ab 5.0
using namespace nsSwDocInfoSubType;
//#include "poolfmt.hxx" // fuer InSetExpField
//#include "poolfmt.hrc" // fuer InSetExpField
//#if !defined(UNX) && !defined(MSC) && !defined(PPC) && !defined(CSET) && !defined(__MWERKS__) && !defined(WTC)
//#define FIELDFNTAB_SIZE 37
//#if FIELDFNTAB_SIZE != RES_FIELDS_END - RES_FIELDS_BEGIN
//#error Feld-Tabelle ist ungueltigt. Wurden neue Hint-IDs zugefuegt ??
//#endif
//#endif
//#define SWG_AUTHORITY_ENTRY_LCL 'E'
//sal_Char __FAR_DATA sSW3IO_FixedField[] = "FixedExport";
//sal_Char __FAR_DATA sSW3IO_AuthorityField[] = "AuthorityExport";
/* #108791# */
//sal_Char __FAR_DATA sSW3IO_DropDownField[] = "DropDownExport";
struct OldFormats
{
NfIndexTableOffset eFormatIdx;
sal_uInt16 nOldFormat;
};
static OldFormats aOldDateFmt40[] =
{
// Datumsfelder:
{ NF_DATE_SYSTEM_SHORT, DFF_SSYS }, // Kurzes Systemdatum
{ NF_DATE_SYSTEM_LONG, DFF_LSYS }, // Langes Systemdatum
{ NF_DATE_SYS_DDMMYY, DFF_DMY }, // 06.10.64
{ NF_DATE_SYS_DDMMYYYY, DFF_DMYY }, // 06.10.1964
{ NF_DATE_SYS_DMMMYY, DFF_DMMY }, // 06. Okt 64
{ NF_DATE_SYS_DMMMYYYY, DFF_DMMYY }, // 06. Okt 1964
{ NF_DATE_DIN_DMMMMYYYY, DFF_DMMMYY }, // 06. Oktober 1964
{ NF_DATE_DIN_DMMMMYYYY, DFF_DMMMY }, // 06. Oktober 64
{ NF_DATE_SYS_NNDMMMYY, DFF_DDMMY }, // Di, 06. Okt 64
{ NF_DATE_SYS_NNDMMMMYYYY, DFF_DDMMMY }, // Di, 06. Oktober 64
{ NF_DATE_SYS_NNDMMMMYYYY, DFF_DDMMMYY }, // Di, 06. Oktober 1964
{ NF_DATE_SYS_NNNNDMMMMYYYY, DFF_DDDMMMYY }, // Dienstag, 06. Oktober 1964
{ NF_DATE_SYS_NNNNDMMMMYYYY, DFF_DDDMMMY }, // Dienstag, 06. Oktober 64
{ NF_DATE_SYS_MMYY, DFF_MY }, // 10.64
{ NF_DATE_DIN_MMDD, DFF_MD }, // 10-06
{ NF_DATE_DIN_YYMMDD, DFF_YMD }, // 64-10-06
{ NF_DATE_DIN_YYYYMMDD, DFF_YYMD }, // 1964-10-06
{ NF_NUMERIC_START, 0 } // Tabellenende
};
static OldFormats aOldDateFmt30[] =
{
// Datumsfelder:
{ NF_DATE_SYSTEM_SHORT, DFF_SSYS }, // Kurzes Systemdatum
{ NF_DATE_SYSTEM_LONG, DFF_LSYS }, // Langes Systemdatum
{ NF_DATE_SYS_DDMMYY, DFF_DMY }, // 06.10.64
{ NF_DATE_SYS_DDMMYYYY, DFF_DMYY }, // 06.10.1964
{ NF_DATE_SYS_DMMMYY, DFF_DMMY }, // 06. Okt 64
{ NF_DATE_SYS_DMMMYYYY, 4 /*DFF_DMMYY*/ }, // 06. Okt 1964
{ NF_DATE_DIN_DMMMMYYYY, 5 /*DFF_DMMMYY*/ }, // 06. Oktober 1964
{ NF_DATE_DIN_DMMMMYYYY, 5 /*DFF_DMMMY*/ }, // 06. Oktober 64
{ NF_DATE_SYS_NNDMMMMYYYY, 6 /*DFF_DDMMMYY*/ }, // Di, 06. Oktober 1964
{ NF_DATE_SYS_NNDMMMYY, 6 /*DFF_DDMMY*/ }, // Di, 06. Okt 64
{ NF_DATE_SYS_NNDMMMMYYYY, 6 /*DFF_DDMMMY*/ }, // Di, 06. Oktober 64
{ NF_DATE_SYS_NNNNDMMMMYYYY, 7 /*DFF_DDDMMMYY*/ }, // Dienstag, 06. Oktober 1964
{ NF_DATE_SYS_NNNNDMMMMYYYY, 7 /*DFF_DDDMMMY*/ }, // Dienstag, 06. Oktober 64
{ NF_DATE_SYS_MMYY, 2 /*DFF_MY*/ }, // 10.64
{ NF_DATE_DIN_MMDD, DFF_MD }, // 10-06
{ NF_DATE_DIN_YYMMDD, DFF_YMD }, // 64-10-06
{ NF_DATE_DIN_YYYYMMDD, DFF_YYMD }, // 1964-10-06
{ NF_NUMERIC_START, 0 } // Tabellenende
};
static OldFormats aOldTimeFmt[] =
{
// Zeitfelder:
{ NF_TIME_HHMMSS, TF_SYSTEM }, // Systemzeit
{ NF_TIME_HHMM, TF_SSMM_24 }, // 23:25
{ NF_TIME_HHMMAMPM, TF_SSMM_12 }, // 11:25 PM
{ NF_NUMERIC_START, 0 } // Tabellenende
};
static OldFormats aOldGetSetExpFmt40[] =
{
{ NF_TEXT, VVF_CMD }, // Kommando anzeigen
{ NF_TEXT, VVF_INVISIBLE }, // unsichtbar
{ NF_PERCENT_INT, VVF_XXP }, // 1234%
{ NF_PERCENT_DEC2, VVF_XX_XXP }, // 1.234,56%
{ NF_TEXT, VVF_CLEAR }, // ???
{ NF_NUMBER_SYSTEM, VVF_SYS }, // Zahlenformat aus der
// Systemeinstellung
{ NF_NUMBER_INT, VVF_X }, // 1234
{ NF_NUMBER_DEC2, VVF_X_X }, // 1234,5
{ NF_NUMBER_DEC2, VVF_X_XX }, // 1245,56
{ NF_NUMBER_1000DEC2, VVF_XX_XX }, // 1.234,56
{ NF_NUMBER_1000DEC2, VVF_XX_X }, // 1.234,5
{ NF_NUMBER_1000DEC2, VVF_XX_XXX }, // 1.234,567
{ NF_CURRENCY_1000DEC2, VVF_SYS_CUR }, // W?hrungsformat aus der
// Systemeinstellung
// (1.234,00 DM)
{ NF_CURRENCY_1000INT, VVF_X_CUR }, // 1234 DM
{ NF_CURRENCY_1000DEC2, VVF_XX_XX_CUR }, // 1234,56 DM 1234,00 DM
{ NF_CURRENCY_1000DEC2_DASHED, VVF_XX_X0_CUR }, // 1234,56 DM 1234,-- DM
{ NF_CURRENCY_1000INT, VVF_CUR_X }, // DM 1234
{ NF_CURRENCY_1000DEC2, VVF_CUR_XX_XX }, // DM 1234,56 DM 1234,00
{ NF_CURRENCY_1000DEC2_DASHED, VVF_CUR_XX_X0 }, // DM 1234,56 DM 1234,--
{ NF_NUMERIC_START, 0 } // Tabellenende
};
static OldFormats aOldGetSetExpFmt30[] =
{
{ NF_TEXT, VVF_CMD }, // Kommando anzeigen
{ NF_TEXT, VVF_INVISIBLE }, // unsichtbar
{ NF_PERCENT_INT, VVF_XXP }, // 1234%
{ NF_PERCENT_DEC2, VVF_XX_XXP }, // 1.234,56%
{ NF_TEXT, VVF_CLEAR }, // ???
{ NF_NUMBER_SYSTEM, 0x0020 }, // Zahlenformat aus der
// Systemeinstellung
{ NF_NUMBER_INT, 0x0080 }, // 1234
{ NF_NUMBER_1000DEC2, 0x0100 }, // 1.234,56
{ NF_NUMBER_DEC2, 0x0100 }, // 1234,5
{ NF_NUMBER_DEC2, 0x0100 }, // 1245,56
{ NF_NUMBER_1000DEC2, 0x0100 }, // 1.234,5
{ NF_NUMBER_1000DEC2, 0x0100 }, // 1.234,567
{ NF_CURRENCY_1000DEC2, 0x0200 }, // W?hrungsformat aus der
// Systemeinstellung
// (1.234,00 DM)
{ NF_CURRENCY_1000INT, 0x1000 }, // 1234 DM
{ NF_CURRENCY_1000DEC2, 0x1000 }, // 1234,56 DM 1234,00 DM
{ NF_CURRENCY_1000DEC2_DASHED, 0x1000 }, // 1234,56 DM 1234,-- DM
{ NF_CURRENCY_1000INT, 0x1000 }, // DM 1234
{ NF_CURRENCY_1000DEC2, 0x1000 }, // DM 1234,56 DM 1234,00
{ NF_CURRENCY_1000DEC2_DASHED, 0x1000 }, // DM 1234,56 DM 1234,--
{ NF_NUMERIC_START, 0 } // Tabellenende
};
SW_DLLPUBLIC void sw3io_ConvertFromOldField( SwDoc& rDoc, sal_uInt16& rWhich,
sal_uInt16& rSubType, sal_uLong &rFmt,
sal_uInt16 nVersion )
{
const OldFormats *pOldFmt = 0L;
switch( rWhich )
{
case RES_DATEFLD:
case RES_FIXDATEFLD:
if( nVersion < SWG_NEWFIELDS )
{
rSubType = DATEFLD;
if( RES_FIXDATEFLD == rWhich )
rSubType |= FIXEDFLD;
rWhich = RES_DATETIMEFLD;
pOldFmt = nVersion<SWG_INETBROWSER ? aOldDateFmt30
: aOldDateFmt40;
}
break;
case RES_TIMEFLD:
case RES_FIXTIMEFLD:
if( nVersion < SWG_NEWFIELDS )
{
rSubType = TIMEFLD;
if( RES_FIXTIMEFLD == rWhich )
rSubType |= FIXEDFLD;
rWhich = RES_DATETIMEFLD;
pOldFmt = aOldTimeFmt;
}
break;
case RES_DBFLD:
if( nVersion < SWG_NEWFIELDS )
{
rSubType = nsSwExtendedSubType::SUB_OWN_FMT;
pOldFmt = nVersion<SWG_INETBROWSER ? aOldGetSetExpFmt30
: aOldGetSetExpFmt40;
}
break;
case RES_TABLEFLD:
case RES_GETEXPFLD:
case RES_SETEXPFLD:
case RES_USERFLD:
if( nVersion < SWG_NEWFIELDS )
{
if( rFmt == VVF_INVISIBLE )
{
rSubType = nsSwExtendedSubType::SUB_INVISIBLE;
rFmt = 0;
}
else if( rFmt == VVF_CMD )
{
rSubType = nsSwExtendedSubType::SUB_CMD;
rFmt = 0;
}
else
{
// Kleiner Hack: Bei Numernkreisen wird das
// unkonvertierte Format noch benoetigt. Wir merken es
// uns voruebergehend mal im Subtyp, sofern es
// ueberhaupt als entsprechendes Format in Frage kommt.
if( RES_SETEXPFLD==rWhich &&
/*rFmt >= (sal_uInt16)SVX_NUM_CHARS_UPPER_LETTER && always true*/
rFmt <= (sal_uInt16)SVX_NUM_BITMAP )
{
rSubType = (sal_uInt16)rFmt;
}
pOldFmt = nVersion<SWG_INETBROWSER ? aOldGetSetExpFmt30
: aOldGetSetExpFmt40;
}
}
break;
case RES_DOCINFOFLD:
if( nVersion < SWG_NEWFIELDS )
{
switch( rFmt )
{
case RF_AUTHOR: rSubType = DI_SUB_AUTHOR; break;
case RF_TIME: rSubType = DI_SUB_TIME; break;
case RF_DATE: rSubType = DI_SUB_DATE; break;
case RF_ALL: rSubType = DI_SUB_DATE; break;
}
rFmt = 0;
}
break;
}
if( pOldFmt )
{
SvNumberFormatter *pFormatter = rDoc.GetNumberFormatter();
sal_uInt16 i = 0;
while( pOldFmt[i].eFormatIdx != NF_NUMERIC_START ||
pOldFmt[i].nOldFormat)
{
if( rFmt == pOldFmt[i].nOldFormat )
{
rFmt = pFormatter->GetFormatIndex(pOldFmt[i].eFormatIdx, LANGUAGE_SYSTEM);
break;
}
i++;
}
}
}
SW_DLLPUBLIC void sw3io_ConvertToOldField( const SwField* pFld, sal_uInt16& rWhich,
sal_uLong& rFmt, sal_uLong nFFVersion )
{
const OldFormats *pOldFmt = 0L;
sal_uLong nOldFmt = rFmt;
switch( rWhich )
{
case RES_DOCINFOFLD:
if( SOFFICE_FILEFORMAT_40 >= nFFVersion )
{
switch (pFld->GetSubType() & 0xff00)
{
case DI_SUB_AUTHOR: rFmt = RF_AUTHOR; break;
case DI_SUB_TIME: rFmt = RF_TIME; break;
case DI_SUB_DATE: rFmt = RF_DATE; break;
}
}
break;
case RES_DATETIMEFLD:
if( SOFFICE_FILEFORMAT_40 >= nFFVersion )
{
sal_uInt16 nSubType = ((SwDateTimeField*) pFld)->GetSubType();
switch( nSubType )
{
case DATEFLD: rWhich = RES_DATEFLD; break;
case TIMEFLD: rWhich = RES_TIMEFLD; break;
case DATEFLD|FIXEDFLD: rWhich = RES_FIXDATEFLD; break;
case TIMEFLD|FIXEDFLD: rWhich = RES_FIXTIMEFLD; break;
}
if( nSubType & DATEFLD )
{
rFmt = DFF_DMY;
pOldFmt = aOldDateFmt40;
}
else
{
rFmt = TF_SYSTEM;
pOldFmt = aOldTimeFmt;
}
}
break;
case RES_DBFLD:
case RES_TABLEFLD:
case RES_GETEXPFLD:
case RES_SETEXPFLD:
case RES_USERFLD:
if( SOFFICE_FILEFORMAT_40 >= nFFVersion )
{
sal_uInt16 nSubType = pFld->GetSubType();
if (nSubType & nsSwExtendedSubType::SUB_INVISIBLE)
rFmt = VVF_INVISIBLE;
else if (nSubType & nsSwExtendedSubType::SUB_CMD)
rFmt = VVF_CMD;
else if( !(nsSwGetSetExpType::GSE_SEQ & nSubType) )
{
pOldFmt = aOldGetSetExpFmt40;
rFmt = VVF_SYS;
}
}
break;
case RES_GETREFFLD:
if( SOFFICE_FILEFORMAT_31 == nFFVersion )
{
switch( rFmt )
{
case REF_PAGE:
case REF_CHAPTER:
case REF_CONTENT:
break;
default:
// case REF_UPDOWN:
// case REF_PAGE_PGDESC:
rFmt = REF_PAGE;
break;
}
}
break;
}
if( pOldFmt && nOldFmt )
{
sal_uInt16 i = 0;
SvNumberFormatter *pFormatter = ((SwValueField*)pFld)->GetDoc()->GetNumberFormatter();
const SvNumberformat* pEntry = pFormatter->GetEntry( nOldFmt );
if( pEntry )
{
while( pOldFmt[i].eFormatIdx != NF_NUMERIC_START ||
pOldFmt[i].nOldFormat )
{
sal_uLong nKey = pFormatter->GetFormatIndex(
pOldFmt[i].eFormatIdx, pEntry->GetLanguage() );
if( nOldFmt == nKey )
{
rFmt = pOldFmt[i].nOldFormat;
break;
}
i++;
}
}
}
}