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 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 } 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