xref: /trunk/main/sw/source/core/sw3io/sw3convert.cxx (revision efeef26f)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sw.hxx"
26 
27 
28 
29 #include <stdlib.h>
30 
31 #include <stdio.h>
32 #include "hintids.hxx"
33 #include <tools/resid.hxx>
34 #include <svl/macitem.hxx>
35 #include <svl/zforlist.hxx>
36 #include <svl/zformat.hxx>
37 #include <svl/urihelper.hxx>
38 #include <sfx2/linkmgr.hxx>
39 
40 #ifndef _SVSTDARR_USHORTS_DECL
41 #define _SVSTDARR_USHORTS
42 #include <svl/svstdarr.hxx>
43 #endif
44 #include <editeng/lrspitem.hxx>
45 #include <editeng/tstpitem.hxx>
46 #include <fmtinfmt.hxx>
47 #include <fmtfld.hxx>
48 #include <frmatr.hxx>
49 #include "doc.hxx"
50 #include "docary.hxx"
51 #include "fldbas.hxx"
52 #include "flddat.hxx"
53 #include "docufld.hxx"
54 #include "chpfld.hxx"
55 #include "ddefld.hxx"
56 #include "expfld.hxx"
57 #include "reffld.hxx"
58 #include "usrfld.hxx"
59 #include "dbfld.hxx"
60 #include "txtfld.hxx"
61 #include "ndtxt.hxx"
62 
63 //really used ids from old sw3ids.hxx
64 #define SWG_INETBROWSER 0x000e      // URL-Grf-Nodes, Browse-Flag, Format-Ums.
65 #define SWG_NEWFIELDS   0x0200      // Felder mit Numberformatter-Zahlenformat
66 #define SWG_EXPORT40    0x0110      // Version fuer 4.0-Export ab 5.0
67 
68 using namespace nsSwDocInfoSubType;
69 
70 
71 //#include "poolfmt.hxx"        // fuer InSetExpField
72 //#include "poolfmt.hrc"        // fuer InSetExpField
73 
74 //#if !defined(UNX) && !defined(MSC) && !defined(PPC) && !defined(CSET) && !defined(__MWERKS__) && !defined(WTC)
75 
76 //#define FIELDFNTAB_SIZE 37
77 //#if FIELDFNTAB_SIZE != RES_FIELDS_END - RES_FIELDS_BEGIN
78 //#error Feld-Tabelle ist ungueltigt. Wurden neue Hint-IDs zugefuegt ??
79 //#endif
80 
81 //#endif
82 
83 //#define SWG_AUTHORITY_ENTRY_LCL   'E'
84 
85 //sal_Char __FAR_DATA sSW3IO_FixedField[] = "FixedExport";
86 //sal_Char __FAR_DATA sSW3IO_AuthorityField[] = "AuthorityExport";
87 /* #108791# */
88 //sal_Char __FAR_DATA sSW3IO_DropDownField[] = "DropDownExport";
89 
90 struct OldFormats
91 {
92 	NfIndexTableOffset	eFormatIdx;
93 	sal_uInt16				nOldFormat;
94 };
95 
96 static OldFormats aOldDateFmt40[] =
97 {
98 	// Datumsfelder:
99 	{ NF_DATE_SYSTEM_SHORT,			DFF_SSYS },		// Kurzes Systemdatum
100 	{ NF_DATE_SYSTEM_LONG,			DFF_LSYS },		// Langes Systemdatum
101 	{ NF_DATE_SYS_DDMMYY,				DFF_DMY },        // 06.10.64
102 	{ NF_DATE_SYS_DDMMYYYY,			DFF_DMYY },		// 06.10.1964
103 	{ NF_DATE_SYS_DMMMYY,				DFF_DMMY },		// 06. Okt 64
104 	{ NF_DATE_SYS_DMMMYYYY,			DFF_DMMYY },		// 06. Okt 1964
105 	{ NF_DATE_DIN_DMMMMYYYY,			DFF_DMMMYY },		// 06. Oktober 1964
106 	{ NF_DATE_DIN_DMMMMYYYY,			DFF_DMMMY },		// 06. Oktober 64
107 	{ NF_DATE_SYS_NNDMMMYY,			DFF_DDMMY },		// Di, 06. Okt 64
108 	{ NF_DATE_SYS_NNDMMMMYYYY,		DFF_DDMMMY },		// Di, 06. Oktober 64
109 	{ NF_DATE_SYS_NNDMMMMYYYY,		DFF_DDMMMYY },	// Di, 06. Oktober 1964
110 	{ NF_DATE_SYS_NNNNDMMMMYYYY,		DFF_DDDMMMYY },	// Dienstag, 06. Oktober 1964
111 	{ NF_DATE_SYS_NNNNDMMMMYYYY,		DFF_DDDMMMY },	// Dienstag, 06. Oktober 64
112 	{ NF_DATE_SYS_MMYY,				DFF_MY },			// 10.64
113 	{ NF_DATE_DIN_MMDD,				DFF_MD },			// 10-06
114 	{ NF_DATE_DIN_YYMMDD,				DFF_YMD },		// 64-10-06
115 	{ NF_DATE_DIN_YYYYMMDD,			DFF_YYMD },		// 1964-10-06
116 
117 	{ NF_NUMERIC_START,				0  }				// Tabellenende
118 };
119 
120 static OldFormats aOldDateFmt30[] =
121 {
122 	// Datumsfelder:
123 	{ NF_DATE_SYSTEM_SHORT,			DFF_SSYS },		// Kurzes Systemdatum
124 	{ NF_DATE_SYSTEM_LONG,			DFF_LSYS },		// Langes Systemdatum
125 	{ NF_DATE_SYS_DDMMYY,				DFF_DMY },        // 06.10.64
126 	{ NF_DATE_SYS_DDMMYYYY,			DFF_DMYY },		// 06.10.1964
127 	{ NF_DATE_SYS_DMMMYY,				DFF_DMMY },		// 06. Okt 64
128 	{ NF_DATE_SYS_DMMMYYYY,			4 /*DFF_DMMYY*/ },	// 06. Okt 1964
129 	{ NF_DATE_DIN_DMMMMYYYY,			5 /*DFF_DMMMYY*/ },	// 06. Oktober 1964
130 	{ NF_DATE_DIN_DMMMMYYYY,			5 /*DFF_DMMMY*/ },	// 06. Oktober 64
131 	{ NF_DATE_SYS_NNDMMMMYYYY,		6 /*DFF_DDMMMYY*/ },	// Di, 06. Oktober 1964
132 	{ NF_DATE_SYS_NNDMMMYY,			6 /*DFF_DDMMY*/ },	// Di, 06. Okt 64
133 	{ NF_DATE_SYS_NNDMMMMYYYY,		6 /*DFF_DDMMMY*/ },	// Di, 06. Oktober 64
134 	{ NF_DATE_SYS_NNNNDMMMMYYYY,		7 /*DFF_DDDMMMYY*/ },	// Dienstag, 06. Oktober 1964
135 	{ NF_DATE_SYS_NNNNDMMMMYYYY,		7 /*DFF_DDDMMMY*/ },	// Dienstag, 06. Oktober 64
136 	{ NF_DATE_SYS_MMYY,				2 /*DFF_MY*/ },		// 10.64
137 	{ NF_DATE_DIN_MMDD,				DFF_MD },			// 10-06
138 	{ NF_DATE_DIN_YYMMDD,				DFF_YMD },		// 64-10-06
139 	{ NF_DATE_DIN_YYYYMMDD,			DFF_YYMD },		// 1964-10-06
140 
141 	{ NF_NUMERIC_START,				0  }				// Tabellenende
142 };
143 
144 static OldFormats aOldTimeFmt[] =
145 {
146 	// Zeitfelder:
147 	{ NF_TIME_HHMMSS,					TF_SYSTEM },		// Systemzeit
148 	{ NF_TIME_HHMM,					TF_SSMM_24 },		// 23:25
149 	{ NF_TIME_HHMMAMPM,				TF_SSMM_12 },		// 11:25 PM
150 
151 	{ NF_NUMERIC_START,				0 }				// Tabellenende
152 };
153 
154 static OldFormats aOldGetSetExpFmt40[] =
155 {
156 	{ NF_TEXT,						VVF_CMD },		// Kommando anzeigen
157 	{ NF_TEXT,						VVF_INVISIBLE },	// unsichtbar
158 	{ NF_PERCENT_INT,					VVF_XXP },		// 1234%
159 	{ NF_PERCENT_DEC2,				VVF_XX_XXP },   	// 1.234,56%
160 	{ NF_TEXT,						VVF_CLEAR },		// ???
161 
162 	{ NF_NUMBER_SYSTEM,				VVF_SYS }, 		// Zahlenformat aus der
163 													// Systemeinstellung
164 	{ NF_NUMBER_INT,					VVF_X },			// 1234
165 	{ NF_NUMBER_DEC2,					VVF_X_X },   		// 1234,5
166 	{ NF_NUMBER_DEC2,					VVF_X_XX },   	// 1245,56
167 	{ NF_NUMBER_1000DEC2,				VVF_XX_XX },   	// 1.234,56
168 	{ NF_NUMBER_1000DEC2,				VVF_XX_X },   	// 1.234,5
169 	{ NF_NUMBER_1000DEC2,				VVF_XX_XXX },		// 1.234,567
170 	{ NF_CURRENCY_1000DEC2,			VVF_SYS_CUR },	// W?hrungsformat aus der
171 													// Systemeinstellung
172 													// (1.234,00 DM)
173 	{ NF_CURRENCY_1000INT,			VVF_X_CUR },		// 1234 DM
174 	{ NF_CURRENCY_1000DEC2,			VVF_XX_XX_CUR },  // 1234,56 DM 1234,00 DM
175 	{ NF_CURRENCY_1000DEC2_DASHED,	VVF_XX_X0_CUR },  // 1234,56 DM 1234,-- DM
176 	{ NF_CURRENCY_1000INT,			VVF_CUR_X },   	// DM 1234
177 	{ NF_CURRENCY_1000DEC2,			VVF_CUR_XX_XX },  // DM 1234,56 DM 1234,00
178 	{ NF_CURRENCY_1000DEC2_DASHED,	VVF_CUR_XX_X0 },  // DM 1234,56 DM 1234,--
179 
180 	{ NF_NUMERIC_START, 				0  }				// Tabellenende
181 };
182 
183 static OldFormats aOldGetSetExpFmt30[] =
184 {
185 	{ NF_TEXT,						VVF_CMD },		// Kommando anzeigen
186 	{ NF_TEXT,						VVF_INVISIBLE },	// unsichtbar
187 	{ NF_PERCENT_INT,					VVF_XXP },		// 1234%
188 	{ NF_PERCENT_DEC2,				VVF_XX_XXP },   	// 1.234,56%
189 	{ NF_TEXT,						VVF_CLEAR },		// ???
190 
191 	{ NF_NUMBER_SYSTEM,				0x0020 }, 		// Zahlenformat aus der
192 													// Systemeinstellung
193 	{ NF_NUMBER_INT,					0x0080 },			// 1234
194 	{ NF_NUMBER_1000DEC2,				0x0100 },   		// 1.234,56
195 	{ NF_NUMBER_DEC2,					0x0100 },   		// 1234,5
196 	{ NF_NUMBER_DEC2,					0x0100 },  		// 1245,56
197 	{ NF_NUMBER_1000DEC2,				0x0100 },   		// 1.234,5
198 	{ NF_NUMBER_1000DEC2,				0x0100 },			// 1.234,567
199 	{ NF_CURRENCY_1000DEC2,			0x0200 },			// W?hrungsformat aus der
200 													// Systemeinstellung
201 													// (1.234,00 DM)
202 	{ NF_CURRENCY_1000INT,			0x1000 },			// 1234 DM
203 	{ NF_CURRENCY_1000DEC2,			0x1000 },  		// 1234,56 DM 1234,00 DM
204 	{ NF_CURRENCY_1000DEC2_DASHED,	0x1000 },  		// 1234,56 DM 1234,-- DM
205 	{ NF_CURRENCY_1000INT,			0x1000 },   		// DM 1234
206 	{ NF_CURRENCY_1000DEC2,			0x1000 },  		// DM 1234,56 DM 1234,00
207 	{ NF_CURRENCY_1000DEC2_DASHED,	0x1000 }, 		// DM 1234,56 DM 1234,--
208 
209 	{ NF_NUMERIC_START, 				0  }				// Tabellenende
210 };
211 
sw3io_ConvertFromOldField(SwDoc & rDoc,sal_uInt16 & rWhich,sal_uInt16 & rSubType,sal_uLong & rFmt,sal_uInt16 nVersion)212 SW_DLLPUBLIC void sw3io_ConvertFromOldField( SwDoc& rDoc, sal_uInt16& rWhich,
213 								sal_uInt16& rSubType, sal_uLong &rFmt,
214 								sal_uInt16 nVersion )
215 {
216 	const OldFormats *pOldFmt = 0L;
217 
218 	switch( rWhich )
219 	{
220 		case RES_DATEFLD:
221 		case RES_FIXDATEFLD:
222 			if( nVersion < SWG_NEWFIELDS )
223 			{
224 				rSubType = DATEFLD;
225 				if( RES_FIXDATEFLD == rWhich )
226 					rSubType |= FIXEDFLD;
227 				rWhich = RES_DATETIMEFLD;
228 				pOldFmt = nVersion<SWG_INETBROWSER ? aOldDateFmt30
229 												   : aOldDateFmt40;
230 			}
231 			break;
232 
233 		case RES_TIMEFLD:
234 		case RES_FIXTIMEFLD:
235 			if( nVersion < SWG_NEWFIELDS )
236 			{
237 				rSubType = TIMEFLD;
238 				if( RES_FIXTIMEFLD == rWhich )
239 					rSubType |= FIXEDFLD;
240 				rWhich = RES_DATETIMEFLD;
241 				pOldFmt = aOldTimeFmt;
242 			}
243 			break;
244 
245 		case RES_DBFLD:
246 			if( nVersion < SWG_NEWFIELDS )
247 			{
248 				rSubType = nsSwExtendedSubType::SUB_OWN_FMT;
249 				pOldFmt = nVersion<SWG_INETBROWSER ? aOldGetSetExpFmt30
250 													: aOldGetSetExpFmt40;
251 			}
252 			break;
253 
254 		case RES_TABLEFLD:
255 		case RES_GETEXPFLD:
256 		case RES_SETEXPFLD:
257 		case RES_USERFLD:
258 			if( nVersion < SWG_NEWFIELDS )
259 			{
260 				if( rFmt == VVF_INVISIBLE )
261 				{
262 					rSubType = nsSwExtendedSubType::SUB_INVISIBLE;
263 					rFmt = 0;
264 				}
265 				else if( rFmt == VVF_CMD )
266 				{
267 					rSubType = nsSwExtendedSubType::SUB_CMD;
268 					rFmt = 0;
269 				}
270 				else
271 				{
272 					// Kleiner Hack: Bei Numernkreisen wird das
273 					// unkonvertierte Format noch benoetigt. Wir merken es
274 					// uns voruebergehend mal im Subtyp, sofern es
275 					// ueberhaupt als entsprechendes Format in Frage kommt.
276 					if( RES_SETEXPFLD==rWhich &&
277                         /*rFmt >= (sal_uInt16)SVX_NUM_CHARS_UPPER_LETTER && always true*/
278 						rFmt <= (sal_uInt16)SVX_NUM_BITMAP )
279 					{
280 						rSubType = (sal_uInt16)rFmt;
281 					}
282 					pOldFmt = nVersion<SWG_INETBROWSER ? aOldGetSetExpFmt30
283 													   : aOldGetSetExpFmt40;
284 				}
285 			}
286 			break;
287 		case RES_DOCINFOFLD:
288 			if( nVersion < SWG_NEWFIELDS )
289 			{
290 				switch( rFmt )
291 				{
292 				case RF_AUTHOR:	rSubType = DI_SUB_AUTHOR;	break;
293 				case RF_TIME:	rSubType = DI_SUB_TIME;	break;
294 				case RF_DATE:	rSubType = DI_SUB_DATE;	break;
295 				case RF_ALL:	rSubType = DI_SUB_DATE;	break;
296 				}
297 				rFmt = 0;
298 			}
299 			break;
300 	}
301 
302 	if( pOldFmt )
303 	{
304 		SvNumberFormatter *pFormatter = rDoc.GetNumberFormatter();
305 		sal_uInt16 i = 0;
306 
307 		while( pOldFmt[i].eFormatIdx != NF_NUMERIC_START ||
308 			   pOldFmt[i].nOldFormat)
309 		{
310 			if( rFmt == pOldFmt[i].nOldFormat )
311 			{
312 				rFmt = pFormatter->GetFormatIndex(pOldFmt[i].eFormatIdx, LANGUAGE_SYSTEM);
313 				break;
314 			}
315 			i++;
316 		}
317 	}
318 }
sw3io_ConvertToOldField(const SwField * pFld,sal_uInt16 & rWhich,sal_uLong & rFmt,sal_uLong nFFVersion)319 SW_DLLPUBLIC void sw3io_ConvertToOldField( const SwField* pFld, sal_uInt16& rWhich,
320                               sal_uLong& rFmt, sal_uLong nFFVersion )
321 {
322     const OldFormats *pOldFmt = 0L;
323     sal_uLong nOldFmt = rFmt;
324 
325     switch( rWhich )
326     {
327         case RES_DOCINFOFLD:
328             if( SOFFICE_FILEFORMAT_40 >= nFFVersion )
329             {
330                 switch (pFld->GetSubType() & 0xff00)
331                 {
332                 case DI_SUB_AUTHOR: rFmt = RF_AUTHOR;   break;
333                 case DI_SUB_TIME:   rFmt = RF_TIME;     break;
334                 case DI_SUB_DATE:   rFmt = RF_DATE;     break;
335                 }
336             }
337             break;
338 
339         case RES_DATETIMEFLD:
340             if( SOFFICE_FILEFORMAT_40 >= nFFVersion )
341             {
342                 sal_uInt16 nSubType = ((SwDateTimeField*) pFld)->GetSubType();
343                 switch( nSubType )
344                 {
345                 case DATEFLD:           rWhich = RES_DATEFLD;       break;
346                 case TIMEFLD:           rWhich = RES_TIMEFLD;       break;
347                 case DATEFLD|FIXEDFLD:  rWhich = RES_FIXDATEFLD;    break;
348                 case TIMEFLD|FIXEDFLD:  rWhich = RES_FIXTIMEFLD;    break;
349                 }
350 
351                 if( nSubType & DATEFLD )
352                 {
353                     rFmt = DFF_DMY;
354                     pOldFmt = aOldDateFmt40;
355                 }
356                 else
357                 {
358                     rFmt = TF_SYSTEM;
359                     pOldFmt = aOldTimeFmt;
360                 }
361             }
362             break;
363 
364         case RES_DBFLD:
365         case RES_TABLEFLD:
366         case RES_GETEXPFLD:
367         case RES_SETEXPFLD:
368         case RES_USERFLD:
369             if( SOFFICE_FILEFORMAT_40 >= nFFVersion )
370             {
371                 sal_uInt16 nSubType = pFld->GetSubType();
372 
373                 if (nSubType & nsSwExtendedSubType::SUB_INVISIBLE)
374                     rFmt = VVF_INVISIBLE;
375                 else if (nSubType & nsSwExtendedSubType::SUB_CMD)
376                     rFmt = VVF_CMD;
377                 else if( !(nsSwGetSetExpType::GSE_SEQ & nSubType) )
378                 {
379                     pOldFmt = aOldGetSetExpFmt40;
380                     rFmt = VVF_SYS;
381                 }
382             }
383             break;
384 
385         case RES_GETREFFLD:
386             if( SOFFICE_FILEFORMAT_31 == nFFVersion )
387             {
388                 switch( rFmt )
389                 {
390                 case REF_PAGE:
391                 case REF_CHAPTER:
392                 case REF_CONTENT:
393                     break;
394 
395                 default:
396                 // case REF_UPDOWN:
397                 // case REF_PAGE_PGDESC:
398                     rFmt = REF_PAGE;
399                     break;
400                 }
401             }
402             break;
403     }
404 
405     if( pOldFmt && nOldFmt )
406     {
407         sal_uInt16 i = 0;
408 
409         SvNumberFormatter *pFormatter = ((SwValueField*)pFld)->GetDoc()->GetNumberFormatter();
410         const SvNumberformat* pEntry = pFormatter->GetEntry( nOldFmt );
411 
412         if( pEntry )
413         {
414             while( pOldFmt[i].eFormatIdx != NF_NUMERIC_START ||
415                    pOldFmt[i].nOldFormat )
416             {
417                 sal_uLong nKey = pFormatter->GetFormatIndex(
418                             pOldFmt[i].eFormatIdx, pEntry->GetLanguage() );
419 
420                 if( nOldFmt == nKey )
421                 {
422                     rFmt = pOldFmt[i].nOldFormat;
423                     break;
424                 }
425                 i++;
426             }
427         }
428     }
429 }
430