summaryrefslogtreecommitdiff
path: root/sw/source/core/sw3io/sw3convert.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sw/source/core/sw3io/sw3convert.cxx')
-rw-r--r--sw/source/core/sw3io/sw3convert.cxx413
1 files changed, 413 insertions, 0 deletions
diff --git a/sw/source/core/sw3io/sw3convert.cxx b/sw/source/core/sw3io/sw3convert.cxx
new file mode 100644
index 000000000000..8605e23f6204
--- /dev/null
+++ b/sw/source/core/sw3io/sw3convert.cxx
@@ -0,0 +1,413 @@
+/* -*- 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 <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;
+
+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:
+ rFmt = REF_PAGE;
+ break;
+ }
+ }
+ break;
+ }
+
+ if( pOldFmt && nOldFmt )
+ {
+ SvNumberFormatter *pFormatter = ((SwValueField*)pFld)->GetDoc()->GetNumberFormatter();
+ const SvNumberformat* pEntry = pFormatter->GetEntry( nOldFmt );
+
+ if( pEntry )
+ {
+ sal_uInt16 i = 0;
+ 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++;
+ }
+ }
+ }
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */