| /************************************************************** |
| * |
| * 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++; |
| } |
| } |
| } |
| } |