Branch data Line data Source code
1 : : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : : /*************************************************************************
3 : : *
4 : : * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 : : *
6 : : * Copyright 2000, 2010 Oracle and/or its affiliates.
7 : : *
8 : : * OpenOffice.org - a multi-platform office productivity suite
9 : : *
10 : : * This file is part of OpenOffice.org.
11 : : *
12 : : * OpenOffice.org is free software: you can redistribute it and/or modify
13 : : * it under the terms of the GNU Lesser General Public License version 3
14 : : * only, as published by the Free Software Foundation.
15 : : *
16 : : * OpenOffice.org is distributed in the hope that it will be useful,
17 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 : : * GNU Lesser General Public License version 3 for more details
20 : : * (a copy is included in the LICENSE file that accompanied this code).
21 : : *
22 : : * You should have received a copy of the GNU Lesser General Public License
23 : : * version 3 along with OpenOffice.org. If not, see
24 : : * <http://www.openoffice.org/license.html>
25 : : * for a copy of the LGPLv3 License.
26 : : *
27 : : ************************************************************************/
28 : :
29 : : #include <com/sun/star/document/XDocumentPropertiesSupplier.hpp>
30 : : #include <com/sun/star/document/XDocumentProperties.hpp>
31 : :
32 : : #include "docsh.hxx"
33 : : #include <svtools/htmltokn.h>
34 : : #include <svl/zformat.hxx>
35 : : #include <unotools/useroptions.hxx>
36 : : #include <fmtfld.hxx>
37 : : #include <ndtxt.hxx>
38 : : #include <doc.hxx>
39 : : #include <fldbas.hxx>
40 : : #include <docufld.hxx>
41 : : #include <flddat.hxx>
42 : : #include <htmlfld.hxx>
43 : : #include <swhtml.hxx>
44 : :
45 : : using namespace nsSwDocInfoSubType;
46 : : using namespace ::com::sun::star;
47 : :
48 : : struct HTMLNumFmtTblEntry
49 : : {
50 : : const sal_Char *pName;
51 : : NfIndexTableOffset eFmt;
52 : : };
53 : :
54 : : static HTMLOptionEnum aHTMLFldTypeTable[] =
55 : : {
56 : : { OOO_STRING_SW_HTML_FT_author, RES_AUTHORFLD },
57 : : { OOO_STRING_SW_HTML_FT_sender, RES_EXTUSERFLD },
58 : : { "DATE", RES_DATEFLD },
59 : : { "TIME", RES_TIMEFLD },
60 : : { OOO_STRING_SW_HTML_FT_datetime,RES_DATETIMEFLD },
61 : : { OOO_STRING_SW_HTML_FT_page, RES_PAGENUMBERFLD },
62 : : { OOO_STRING_SW_HTML_FT_docinfo, RES_DOCINFOFLD },
63 : : { OOO_STRING_SW_HTML_FT_docstat, RES_DOCSTATFLD },
64 : : { OOO_STRING_SW_HTML_FT_filename,RES_FILENAMEFLD },
65 : : { 0, 0 }
66 : : };
67 : :
68 : : static HTMLNumFmtTblEntry aHTMLDateFldFmtTable[] =
69 : : {
70 : : { "SSYS", NF_DATE_SYSTEM_SHORT },
71 : : { "LSYS", NF_DATE_SYSTEM_LONG },
72 : : { "DMY", NF_DATE_SYS_DDMMYY, },
73 : : { "DMYY", NF_DATE_SYS_DDMMYYYY, },
74 : : { "DMMY", NF_DATE_SYS_DMMMYY, },
75 : : { "DMMYY", NF_DATE_SYS_DMMMYYYY, },
76 : : { "DMMMY", NF_DATE_DIN_DMMMMYYYY },
77 : : { "DMMMYY", NF_DATE_DIN_DMMMMYYYY },
78 : : { "DDMMY", NF_DATE_SYS_NNDMMMYY },
79 : : { "DDMMMY", NF_DATE_SYS_NNDMMMMYYYY },
80 : : { "DDMMMYY", NF_DATE_SYS_NNDMMMMYYYY },
81 : : { "DDDMMMY", NF_DATE_SYS_NNNNDMMMMYYYY },
82 : : { "DDDMMMYY", NF_DATE_SYS_NNNNDMMMMYYYY },
83 : : { "MY", NF_DATE_SYS_MMYY },
84 : : { "MD", NF_DATE_DIN_MMDD },
85 : : { "YMD", NF_DATE_DIN_YYMMDD },
86 : : { "YYMD", NF_DATE_DIN_YYYYMMDD },
87 : : { 0, NF_NUMERIC_START }
88 : : };
89 : :
90 : : static HTMLNumFmtTblEntry aHTMLTimeFldFmtTable[] =
91 : : {
92 : : { "SYS", NF_TIME_HHMMSS },
93 : : { "SSMM24", NF_TIME_HHMM },
94 : : { "SSMM12", NF_TIME_HHMMAMPM },
95 : : { 0, NF_NUMERIC_START }
96 : : };
97 : :
98 : : static HTMLOptionEnum aHTMLPageNumFldFmtTable[] =
99 : : {
100 : : { OOO_STRING_SW_HTML_FF_uletter, SVX_NUM_CHARS_UPPER_LETTER },
101 : : { OOO_STRING_SW_HTML_FF_lletter, SVX_NUM_CHARS_LOWER_LETTER },
102 : : { OOO_STRING_SW_HTML_FF_uroman, SVX_NUM_ROMAN_UPPER },
103 : : { OOO_STRING_SW_HTML_FF_lroman, SVX_NUM_ROMAN_LOWER },
104 : : { OOO_STRING_SW_HTML_FF_arabic, SVX_NUM_ARABIC },
105 : : { OOO_STRING_SW_HTML_FF_none, SVX_NUM_NUMBER_NONE },
106 : : { OOO_STRING_SW_HTML_FF_char, SVX_NUM_CHAR_SPECIAL },
107 : : { OOO_STRING_SW_HTML_FF_page, SVX_NUM_PAGEDESC },
108 : : { OOO_STRING_SW_HTML_FF_ulettern, SVX_NUM_CHARS_UPPER_LETTER_N },
109 : : { OOO_STRING_SW_HTML_FF_llettern, SVX_NUM_CHARS_LOWER_LETTER_N },
110 : : { 0, 0 }
111 : : };
112 : :
113 : :
114 : : static HTMLOptionEnum aHTMLExtUsrFldSubTable[] =
115 : : {
116 : : { OOO_STRING_SW_HTML_FS_company, EU_COMPANY },
117 : : { OOO_STRING_SW_HTML_FS_firstname, EU_FIRSTNAME },
118 : : { OOO_STRING_SW_HTML_FS_name, EU_NAME },
119 : : { OOO_STRING_SW_HTML_FS_shortcut, EU_SHORTCUT },
120 : : { OOO_STRING_SW_HTML_FS_street, EU_STREET },
121 : : { OOO_STRING_SW_HTML_FS_country, EU_COUNTRY },
122 : : { OOO_STRING_SW_HTML_FS_zip, EU_ZIP },
123 : : { OOO_STRING_SW_HTML_FS_city, EU_CITY },
124 : : { OOO_STRING_SW_HTML_FS_title, EU_TITLE },
125 : : { OOO_STRING_SW_HTML_FS_position, EU_POSITION },
126 : : { OOO_STRING_SW_HTML_FS_pphone, EU_PHONE_PRIVATE },
127 : : { OOO_STRING_SW_HTML_FS_cphone, EU_PHONE_COMPANY },
128 : : { OOO_STRING_SW_HTML_FS_fax, EU_FAX },
129 : : { OOO_STRING_SW_HTML_FS_email, EU_EMAIL },
130 : : { OOO_STRING_SW_HTML_FS_state, EU_STATE },
131 : : { 0, 0 }
132 : : };
133 : :
134 : : static HTMLOptionEnum aHTMLAuthorFldFmtTable[] =
135 : : {
136 : : { OOO_STRING_SW_HTML_FF_name, AF_NAME },
137 : : { OOO_STRING_SW_HTML_FF_shortcut, AF_SHORTCUT },
138 : : { 0, 0 }
139 : : };
140 : :
141 : : static HTMLOptionEnum aHTMLPageNumFldSubTable[] =
142 : : {
143 : : { OOO_STRING_SW_HTML_FS_random, PG_RANDOM },
144 : : { OOO_STRING_SW_HTML_FS_next, PG_NEXT },
145 : : { OOO_STRING_SW_HTML_FS_prev, PG_PREV },
146 : : { 0, 0 }
147 : : };
148 : :
149 : : // UGLY: these are extensions of nsSwDocInfoSubType (in inc/docufld.hxx)
150 : : // these are necessary for importing document info fields written by
151 : : // older versions of OOo (< 3.0) which did not have DI_CUSTOM fields
152 : : const SwDocInfoSubType DI_INFO1 = DI_SUBTYPE_END + 1;
153 : : const SwDocInfoSubType DI_INFO2 = DI_SUBTYPE_END + 2;
154 : : const SwDocInfoSubType DI_INFO3 = DI_SUBTYPE_END + 3;
155 : : const SwDocInfoSubType DI_INFO4 = DI_SUBTYPE_END + 4;
156 : :
157 : : static HTMLOptionEnum aHTMLDocInfoFldSubTable[] =
158 : : {
159 : : { OOO_STRING_SW_HTML_FS_title, DI_TITEL },
160 : : { OOO_STRING_SW_HTML_FS_theme, DI_THEMA },
161 : : { OOO_STRING_SW_HTML_FS_keys, DI_KEYS },
162 : : { OOO_STRING_SW_HTML_FS_comment, DI_COMMENT },
163 : : { "INFO1", DI_INFO1 },
164 : : { "INFO2", DI_INFO2 },
165 : : { "INFO3", DI_INFO3 },
166 : : { "INFO4", DI_INFO4 },
167 : : { OOO_STRING_SW_HTML_FS_custom, DI_CUSTOM },
168 : : { OOO_STRING_SW_HTML_FS_create, DI_CREATE },
169 : : { OOO_STRING_SW_HTML_FS_change, DI_CHANGE },
170 : : { 0, 0 }
171 : : };
172 : :
173 : : static HTMLOptionEnum aHTMLDocInfoFldFmtTable[] =
174 : : {
175 : : { OOO_STRING_SW_HTML_FF_author, DI_SUB_AUTHOR },
176 : : { OOO_STRING_SW_HTML_FF_time, DI_SUB_TIME },
177 : : { OOO_STRING_SW_HTML_FF_date, DI_SUB_DATE },
178 : : { 0, 0 }
179 : : };
180 : :
181 : : static HTMLOptionEnum aHTMLDocStatFldSubTable[] =
182 : : {
183 : : { OOO_STRING_SW_HTML_FS_page, DS_PAGE },
184 : : { OOO_STRING_SW_HTML_FS_para, DS_PARA },
185 : : { OOO_STRING_SW_HTML_FS_word, DS_WORD },
186 : : { OOO_STRING_SW_HTML_FS_char, DS_CHAR },
187 : : { OOO_STRING_SW_HTML_FS_tbl, DS_TBL },
188 : : { OOO_STRING_SW_HTML_FS_grf, DS_GRF },
189 : : { OOO_STRING_SW_HTML_FS_ole, DS_OLE },
190 : : { 0, 0 }
191 : : };
192 : :
193 : : static HTMLOptionEnum aHTMLFileNameFldFmtTable[] =
194 : : {
195 : : { OOO_STRING_SW_HTML_FF_name, FF_NAME },
196 : : { OOO_STRING_SW_HTML_FF_pathname, FF_PATHNAME },
197 : : { OOO_STRING_SW_HTML_FF_path, FF_PATH },
198 : : { OOO_STRING_SW_HTML_FF_name_noext, FF_NAME_NOEXT },
199 : : { 0, 0 }
200 : : };
201 : :
202 : :
203 : 0 : sal_uInt16 SwHTMLParser::GetNumType( const String& rStr, sal_uInt16 nDfltType )
204 : : {
205 : 0 : sal_uInt16 nType = nDfltType;
206 : 0 : const HTMLOptionEnum *pOptEnums = aHTMLPageNumFldFmtTable;
207 [ # # ]: 0 : while( pOptEnums->pName )
208 [ # # ]: 0 : if( !rStr.EqualsIgnoreCaseAscii( pOptEnums->pName ) )
209 : 0 : pOptEnums++;
210 : : else
211 : 0 : break;
212 : :
213 [ # # ]: 0 : if( pOptEnums->pName )
214 : 0 : nType = pOptEnums->nValue;
215 : :
216 : 0 : return nType;
217 : : }
218 : :
219 : :
220 : 0 : void SwHTMLParser::NewField()
221 : : {
222 : 0 : sal_Bool bKnownType = sal_False, bFixed = sal_False,
223 : 0 : bHasNumFmt = sal_False, bHasNumValue = sal_False;
224 : 0 : sal_uInt16 nType = 0;
225 [ # # ][ # # ]: 0 : String aValue, aNumFmt, aNumValue, aName;
[ # # ][ # # ]
226 : 0 : const HTMLOption *pSubOption=0, *pFmtOption=0;
227 : :
228 [ # # ]: 0 : const HTMLOptions& rHTMLOptions = GetOptions();
229 : : size_t i;
230 : :
231 [ # # ]: 0 : for ( i = rHTMLOptions.size(); i; )
232 : : {
233 [ # # ]: 0 : const HTMLOption& rOption = rHTMLOptions[--i];
234 [ # # # # : 0 : switch( rOption.GetToken() )
# # # #
# ]
235 : : {
236 : : case HTML_O_TYPE:
237 [ # # ]: 0 : bKnownType = rOption.GetEnum( nType, aHTMLFldTypeTable );
238 : 0 : break;
239 : : case HTML_O_SUBTYPE:
240 : 0 : pSubOption = &rOption;
241 : 0 : break;
242 : : case HTML_O_FORMAT:
243 : 0 : pFmtOption = &rOption;
244 : 0 : break;
245 : : case HTML_O_NAME:
246 [ # # ]: 0 : aName = rOption.GetString();
247 : 0 : break;
248 : : case HTML_O_VALUE:
249 [ # # ]: 0 : aValue = rOption.GetString();
250 : 0 : break;
251 : : case HTML_O_SDNUM:
252 [ # # ]: 0 : aNumFmt = rOption.GetString();
253 : 0 : bHasNumFmt = sal_True;
254 : 0 : break;
255 : : case HTML_O_SDVAL:
256 [ # # ]: 0 : aNumValue = rOption.GetString();
257 : 0 : bHasNumValue = sal_True;
258 : 0 : break;
259 : : case HTML_O_SDFIXED:
260 : 0 : bFixed = sal_True;
261 : 0 : break;
262 : : }
263 : : }
264 : :
265 [ # # ]: 0 : if( !bKnownType )
266 : 0 : return;
267 : :
268 : : // Autor und Absender werden nur als als variables Feld eingefuegt,
269 : : // wenn man das Dok selbst als letztes geaendert hat oder es noch
270 : : // niemend geandert hat und man das Dok erstellt hat. Sonst
271 : : // wird ein Fixed-Feld daraus gemacht.
272 [ # # ][ # # ]: 0 : if( !bFixed &&
[ # # ]
273 : : (RES_EXTUSERFLD == (RES_FIELDS)nType ||
274 : : RES_AUTHORFLD == (RES_FIELDS)nType) )
275 : : {
276 [ # # ]: 0 : SvtUserOptions aOpt;
277 [ # # ][ # # ]: 0 : const String& rUser = aOpt.GetFullName();
278 : 0 : SwDocShell *pDocShell(pDoc->GetDocShell());
279 : : OSL_ENSURE(pDocShell, "no SwDocShell");
280 [ # # ]: 0 : if (pDocShell) {
281 : : uno::Reference<document::XDocumentPropertiesSupplier> xDPS(
282 [ # # ][ # # ]: 0 : pDocShell->GetModel(), uno::UNO_QUERY_THROW);
283 : : uno::Reference<document::XDocumentProperties> xDocProps(
284 [ # # ][ # # ]: 0 : xDPS->getDocumentProperties());
285 : : OSL_ENSURE(xDocProps.is(), "Doc has no DocumentProperties");
286 [ # # ][ # # ]: 0 : const String& rChanged = xDocProps->getModifiedBy();
[ # # ]
287 [ # # ][ # # ]: 0 : const String& rCreated = xDocProps->getAuthor();
[ # # ]
288 [ # # ][ # # ]: 0 : if( !rUser.Len() ||
[ # # # # ]
289 [ # # ][ # # ]: 0 : (rChanged.Len() ? rUser != rChanged : rUser != rCreated) )
[ # # ]
290 [ # # ][ # # ]: 0 : bFixed = sal_True;
291 [ # # ][ # # ]: 0 : }
292 : : }
293 : :
294 : 0 : sal_uInt16 nWhich = nType;
295 [ # # ][ # # ]: 0 : if( RES_DATEFLD==nType || RES_TIMEFLD==nType )
296 : 0 : nWhich = RES_DATETIMEFLD;
297 : :
298 [ # # ]: 0 : SwFieldType* pType = pDoc->GetSysFldType( nWhich );
299 : 0 : SwField *pFld = 0;
300 : 0 : sal_Bool bInsOnEndTag = sal_False;
301 : :
302 [ # # # # : 0 : switch( (RES_FIELDS)nType )
# # # #
# ]
303 : : {
304 : : case RES_EXTUSERFLD:
305 [ # # ]: 0 : if( pSubOption )
306 : : {
307 : : sal_uInt16 nSub;
308 : 0 : sal_uLong nFmt = 0;
309 [ # # ]: 0 : if( bFixed )
310 : : {
311 : 0 : nFmt |= AF_FIXED;
312 : 0 : bInsOnEndTag = sal_True;
313 : : }
314 [ # # ][ # # ]: 0 : if( pSubOption->GetEnum( nSub, aHTMLExtUsrFldSubTable ) )
315 : : pFld = new SwExtUserField( (SwExtUserFieldType*)pType,
316 [ # # ][ # # ]: 0 : nSub, nFmt );
317 : : }
318 : 0 : break;
319 : :
320 : : case RES_AUTHORFLD:
321 : : {
322 : 0 : sal_uInt16 nFmt = AF_NAME;
323 [ # # ]: 0 : if( pFmtOption )
324 [ # # ]: 0 : pFmtOption->GetEnum( nFmt, aHTMLAuthorFldFmtTable );
325 [ # # ]: 0 : if( bFixed )
326 : : {
327 : 0 : nFmt |= AF_FIXED;
328 : 0 : bInsOnEndTag = sal_True;
329 : : }
330 : :
331 [ # # ][ # # ]: 0 : pFld = new SwAuthorField( (SwAuthorFieldType *)pType, nFmt );
332 : : }
333 : 0 : break;
334 : :
335 : : case RES_DATEFLD:
336 : : case RES_TIMEFLD:
337 : : {
338 : 0 : sal_uLong nNumFmt = 0;
339 [ # # ][ # # ]: 0 : sal_uLong nTime = Time( Time::SYSTEM ).GetTime(), nDate = Date( Date::SYSTEM ).GetDate();
340 : 0 : sal_uInt16 nSub = 0;
341 : 0 : sal_Bool bValidFmt = sal_False;
342 : : HTMLNumFmtTblEntry * pFmtTbl;
343 : :
344 [ # # ]: 0 : if( RES_DATEFLD==nType )
345 : : {
346 : 0 : nSub = DATEFLD;
347 : 0 : pFmtTbl = aHTMLDateFldFmtTable;
348 [ # # ]: 0 : if( aValue.Len() )
349 [ # # ]: 0 : nDate = (sal_uLong)aValue.ToInt32();
350 : : }
351 : : else
352 : : {
353 : 0 : nSub = TIMEFLD;
354 : 0 : pFmtTbl = aHTMLTimeFldFmtTable;
355 [ # # ]: 0 : if( aValue.Len() )
356 [ # # ]: 0 : nTime = (sal_uLong)aValue.ToInt32();
357 : : }
358 [ # # ]: 0 : if( aValue.Len() )
359 : 0 : nSub |= FIXEDFLD;
360 : :
361 [ # # ]: 0 : SvNumberFormatter *pFormatter = pDoc->GetNumberFormatter();
362 [ # # ]: 0 : if( pFmtOption )
363 : : {
364 : 0 : const String& rFmt = pFmtOption->GetString();
365 [ # # ]: 0 : for( sal_uInt16 k = 0; pFmtTbl[k].pName; k++ )
366 : : {
367 [ # # ][ # # ]: 0 : if( rFmt.EqualsIgnoreCaseAscii( pFmtTbl[k].pName ) )
368 : : {
369 : : nNumFmt = pFormatter->GetFormatIndex(
370 [ # # ]: 0 : pFmtTbl[k].eFmt, LANGUAGE_SYSTEM);
371 : 0 : bValidFmt = sal_True;
372 : 0 : break;
373 : : }
374 : : }
375 : : }
376 [ # # ]: 0 : if( !bValidFmt )
377 : 0 : nNumFmt = pFormatter->GetFormatIndex( pFmtTbl[i].eFmt,
378 [ # # ]: 0 : LANGUAGE_SYSTEM);
379 : :
380 : : pFld = new SwDateTimeField( (SwDateTimeFieldType *)pType,
381 [ # # ][ # # ]: 0 : nSub, nNumFmt );
382 : :
383 [ # # ]: 0 : if (nSub & FIXEDFLD)
384 [ # # ][ # # ]: 0 : ((SwDateTimeField *)pFld)->SetDateTime( DateTime(Date(nDate), Time(nTime)) );
385 : : }
386 : 0 : break;
387 : :
388 : : case RES_DATETIMEFLD:
389 [ # # ]: 0 : if( bHasNumFmt )
390 : : {
391 : 0 : sal_uInt16 nSub = 0;
392 : :
393 [ # # ]: 0 : SvNumberFormatter *pFormatter = pDoc->GetNumberFormatter();
394 : : sal_uInt32 nNumFmt;
395 : : LanguageType eLang;
396 : : double dValue = GetTableDataOptionsValNum(
397 : : nNumFmt, eLang, aNumValue, aNumFmt,
398 [ # # ][ # # ]: 0 : *pDoc->GetNumberFormatter() );
399 [ # # ]: 0 : short nFmtType = pFormatter->GetType( nNumFmt );
400 [ # # # ]: 0 : switch( nFmtType )
401 : : {
402 : 0 : case NUMBERFORMAT_DATE: nSub = DATEFLD; break;
403 : 0 : case NUMBERFORMAT_TIME: nSub = TIMEFLD; break;
404 : : }
405 : :
406 [ # # ]: 0 : if( nSub )
407 : : {
408 [ # # ]: 0 : if( bHasNumValue )
409 : 0 : nSub |= FIXEDFLD;
410 : :
411 : : pFld = new SwDateTimeField( (SwDateTimeFieldType *)pType,
412 [ # # ][ # # ]: 0 : nSub, nNumFmt );
413 [ # # ]: 0 : if( bHasNumValue )
414 [ # # ]: 0 : ((SwDateTimeField *)pFld)->SetValue( dValue );
415 : : }
416 : : }
417 : 0 : break;
418 : :
419 : : case RES_PAGENUMBERFLD:
420 [ # # ]: 0 : if( pSubOption )
421 : : {
422 : : sal_uInt16 nSub;
423 [ # # ][ # # ]: 0 : if( pSubOption->GetEnum( nSub, aHTMLPageNumFldSubTable ) )
424 : : {
425 : 0 : sal_uInt16 nFmt = SVX_NUM_PAGEDESC;
426 [ # # ]: 0 : if( pFmtOption )
427 [ # # ]: 0 : pFmtOption->GetEnum( nFmt, aHTMLPageNumFldFmtTable );
428 : :
429 : 0 : short nOff = 0;
430 : :
431 [ # # ][ # # ]: 0 : if( (SvxExtNumType)nFmt!=SVX_NUM_CHAR_SPECIAL && aValue.Len() )
[ # # ]
432 [ # # ]: 0 : nOff = (short)aValue.ToInt32();
433 [ # # ]: 0 : else if( (SwPageNumSubType)nSub == PG_NEXT )
434 : 0 : nOff = 1;
435 [ # # ]: 0 : else if( (SwPageNumSubType)nSub == PG_PREV )
436 : 0 : nOff = -1;
437 : :
438 [ # # ][ # # ]: 0 : if( (SvxExtNumType)nFmt==SVX_NUM_CHAR_SPECIAL &&
439 : : (SwPageNumSubType)nSub==PG_RANDOM )
440 : 0 : nFmt = SVX_NUM_PAGEDESC;
441 : :
442 [ # # ][ # # ]: 0 : pFld = new SwPageNumberField( (SwPageNumberFieldType *)pType, nSub, nFmt, nOff );
443 [ # # ]: 0 : if( (SvxExtNumType)nFmt==SVX_NUM_CHAR_SPECIAL )
444 [ # # ]: 0 : ((SwPageNumberField *)pFld)->SetUserString( aValue );
445 : : }
446 : : }
447 : 0 : break;
448 : :
449 : : case RES_DOCINFOFLD:
450 [ # # ]: 0 : if( pSubOption )
451 : : {
452 : : sal_uInt16 nSub;
453 [ # # ][ # # ]: 0 : if( pSubOption->GetEnum( nSub, aHTMLDocInfoFldSubTable ) )
454 : : {
455 : 0 : sal_uInt16 nExtSub = 0;
456 [ # # ][ # # ]: 0 : if( DI_CREATE==(SwDocInfoSubType)nSub ||
457 : : DI_CHANGE==(SwDocInfoSubType)nSub )
458 : : {
459 : 0 : nExtSub = DI_SUB_AUTHOR;
460 [ # # ]: 0 : if( pFmtOption )
461 [ # # ]: 0 : pFmtOption->GetEnum( nExtSub, aHTMLDocInfoFldFmtTable );
462 : 0 : nSub |= nExtSub;
463 : : }
464 : :
465 : 0 : sal_uInt32 nNumFmt = 0;
466 : 0 : double dValue = 0;
467 [ # # ][ # # ]: 0 : if( bHasNumFmt && (DI_SUB_DATE==nExtSub || DI_SUB_TIME==nExtSub) )
[ # # ]
468 : : {
469 : : LanguageType eLang;
470 : : dValue = GetTableDataOptionsValNum(
471 : : nNumFmt, eLang, aNumValue, aNumFmt,
472 [ # # ][ # # ]: 0 : *pDoc->GetNumberFormatter() );
473 : 0 : bFixed &= bHasNumValue;
474 : : }
475 : : else
476 : 0 : bHasNumValue = sal_False;
477 : :
478 [ # # ][ # # ]: 0 : if( nSub >= DI_INFO1 && nSub <= DI_INFO4 && aName.Len() == 0 )
[ # # ][ # # ]
479 : : {
480 : : // backward compatibility for OOo 2:
481 : : // map to names stored in AddMetaUserDefined
482 [ # # ]: 0 : aName = m_InfoNames[nSub - DI_INFO1];
483 : 0 : nSub = DI_CUSTOM;
484 : : }
485 : :
486 [ # # ]: 0 : if( bFixed )
487 : : {
488 : 0 : nSub |= DI_SUB_FIXED;
489 : 0 : bInsOnEndTag = sal_True;
490 : : }
491 : :
492 : : pFld = new SwDocInfoField( (SwDocInfoFieldType *)pType,
493 [ # # ][ # # ]: 0 : nSub, aName, nNumFmt );
494 [ # # ]: 0 : if( bHasNumValue )
495 [ # # ]: 0 : ((SwDocInfoField*)pFld)->SetValue( dValue );
496 : : }
497 : : }
498 : 0 : break;
499 : :
500 : : case RES_DOCSTATFLD:
501 [ # # ]: 0 : if( pSubOption )
502 : : {
503 : : sal_uInt16 nSub;
504 [ # # ][ # # ]: 0 : if( pSubOption->GetEnum( nSub, aHTMLDocStatFldSubTable ) )
505 : : {
506 : 0 : sal_uInt16 nFmt = SVX_NUM_ARABIC;
507 [ # # ]: 0 : if( pFmtOption )
508 [ # # ]: 0 : pFmtOption->GetEnum( nFmt, aHTMLPageNumFldFmtTable );
509 : : pFld = new SwDocStatField( (SwDocStatFieldType *)pType,
510 [ # # ][ # # ]: 0 : nSub, nFmt );
511 : 0 : bUpdateDocStat |= (DS_PAGE != nFmt);
512 : : }
513 : : }
514 : 0 : break;
515 : :
516 : : case RES_FILENAMEFLD:
517 : : {
518 : 0 : sal_uInt16 nFmt = FF_NAME;
519 [ # # ]: 0 : if( pFmtOption )
520 [ # # ]: 0 : pFmtOption->GetEnum( nFmt, aHTMLFileNameFldFmtTable );
521 [ # # ]: 0 : if( bFixed )
522 : : {
523 : 0 : nFmt |= FF_FIXED;
524 : 0 : bInsOnEndTag = sal_True;
525 : : }
526 : :
527 [ # # ][ # # ]: 0 : pFld = new SwFileNameField( (SwFileNameFieldType *)pType, nFmt );
528 : : }
529 : 0 : break;
530 : : default:
531 : : ;
532 : : }
533 : :
534 [ # # ]: 0 : if( pFld )
535 : : {
536 [ # # ]: 0 : if( bInsOnEndTag )
537 : : {
538 : 0 : pField = pFld;
539 : : }
540 : : else
541 : : {
542 [ # # ][ # # ]: 0 : pDoc->InsertPoolItem( *pPam, SwFmtFld(*pFld), 0 );
[ # # ]
543 [ # # ][ # # ]: 0 : delete pFld;
544 : : }
545 : 0 : bInField = sal_True;
546 [ # # ][ # # ]: 0 : }
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
547 : : }
548 : :
549 : 0 : void SwHTMLParser::EndField()
550 : : {
551 [ # # ]: 0 : if( pField )
552 : : {
553 [ # # # # : 0 : switch( pField->Which() )
# ]
554 : : {
555 : : case RES_DOCINFOFLD:
556 : : OSL_ENSURE( ((SwDocInfoField*)pField)->IsFixed(),
557 : : "DokInfo-Feld haette nicht gemerkt werden muessen" );
558 : 0 : ((SwDocInfoField*)pField)->SetExpansion( aContents );
559 : 0 : break;
560 : :
561 : : case RES_EXTUSERFLD:
562 : : OSL_ENSURE( ((SwExtUserField*)pField)->IsFixed(),
563 : : "ExtUser-Feld haette nicht gemerkt werden muessen" );
564 : 0 : ((SwExtUserField*)pField)->SetExpansion( aContents );
565 : 0 : break;
566 : :
567 : : case RES_AUTHORFLD:
568 : : OSL_ENSURE( ((SwAuthorField*)pField)->IsFixed(),
569 : : "Author-Feld haette nicht gemerkt werden muessen" );
570 : 0 : ((SwAuthorField*)pField)->SetExpansion( aContents );
571 : 0 : break;
572 : :
573 : : case RES_FILENAMEFLD:
574 : : OSL_ENSURE( ((SwFileNameField*)pField)->IsFixed(),
575 : : "FileName-Feld haette nicht gemerkt werden muessen" );
576 : 0 : ((SwFileNameField*)pField)->SetExpansion( aContents );
577 : 0 : break;
578 : : }
579 : :
580 [ # # ]: 0 : pDoc->InsertPoolItem( *pPam, SwFmtFld(*pField), 0 );
581 [ # # ]: 0 : delete pField;
582 : 0 : pField = 0;
583 : : }
584 : :
585 : 0 : bInField = sal_False;
586 : 0 : aContents.Erase();
587 : 0 : }
588 : :
589 : 0 : void SwHTMLParser::InsertFieldText()
590 : : {
591 [ # # ]: 0 : if( pField )
592 : : {
593 : : // das aktuelle Textstueck an den Text anhaengen
594 : 0 : aContents += aToken;
595 : : }
596 : 0 : }
597 : :
598 : 0 : void SwHTMLParser::InsertCommentText( const sal_Char *pTag )
599 : : {
600 : 0 : sal_Bool bEmpty = aContents.Len() == 0;
601 [ # # ]: 0 : if( !bEmpty )
602 : 0 : aContents += '\n';
603 : :
604 : 0 : aContents += aToken;
605 [ # # ][ # # ]: 0 : if( bEmpty && pTag )
606 : : {
607 [ # # ]: 0 : String aTmp( aContents );
608 [ # # ]: 0 : aContents.AssignAscii( "HTML: <" );
609 [ # # ]: 0 : aContents.AppendAscii( pTag );
610 [ # # ]: 0 : aContents.Append( '>' );
611 [ # # ][ # # ]: 0 : aContents.Append( aTmp );
612 : : }
613 : 0 : }
614 : :
615 : 0 : void SwHTMLParser::InsertComment( const String& rComment, const sal_Char *pTag )
616 : : {
617 [ # # ]: 0 : String aComment( rComment );
618 [ # # ]: 0 : if( pTag )
619 : : {
620 [ # # ]: 0 : aComment.AppendAscii( "</" );
621 [ # # ]: 0 : aComment.AppendAscii( pTag );
622 [ # # ]: 0 : aComment.Append( '>' );
623 : : }
624 : :
625 : : // MIB 24.06.97: Wenn ein PostIt nach einen Space eingefuegt
626 : : // werden soll, fuegen wir es vor dem Space ein. Dann gibt es
627 : : // weniger Probleme beim Formatieren (bug #40483#)
628 : 0 : xub_StrLen nPos = pPam->GetPoint()->nContent.GetIndex();
629 : 0 : SwTxtNode *pTxtNd = pPam->GetNode()->GetTxtNode();
630 : 0 : sal_Bool bMoveFwd = sal_False;
631 [ # # ][ # # ]: 0 : if( nPos>0 && pTxtNd && ' '==pTxtNd->GetTxt().GetChar(nPos-1) )
[ # # ][ # # ]
632 : : {
633 : 0 : bMoveFwd = sal_True;
634 : :
635 : 0 : sal_uLong nNodeIdx = pPam->GetPoint()->nNode.GetIndex();
636 : 0 : xub_StrLen nIdx = pPam->GetPoint()->nContent.GetIndex();
637 [ # # ]: 0 : for( sal_uInt16 i = aSetAttrTab.size(); i > 0; )
638 : : {
639 [ # # ]: 0 : _HTMLAttr *pAttr = aSetAttrTab[--i];
640 [ # # # # ]: 0 : if( pAttr->GetSttParaIdx() != nNodeIdx ||
[ # # ]
641 : 0 : pAttr->GetSttCnt() != nIdx )
642 : 0 : break;
643 : :
644 [ # # # # ]: 0 : if( RES_TXTATR_FIELD == pAttr->pItem->Which() &&
[ # # ]
645 : : RES_SCRIPTFLD == ((const SwFmtFld *)pAttr->pItem)->GetFld()
646 : 0 : ->GetTyp()->Which() )
647 : : {
648 : 0 : bMoveFwd = sal_False;
649 : 0 : break;
650 : : }
651 : : }
652 : :
653 [ # # ]: 0 : if( bMoveFwd )
654 [ # # ]: 0 : pPam->Move( fnMoveBackward );
655 : : }
656 : :
657 : : SwPostItField aPostItFld(
658 [ # # ]: 0 : (SwPostItFieldType*)pDoc->GetSysFldType( RES_POSTITFLD ),
659 [ # # ][ # # ]: 0 : aEmptyStr, aComment, aEmptyStr, aEmptyStr, DateTime( DateTime::SYSTEM ) );
660 [ # # ][ # # ]: 0 : InsertAttr( SwFmtFld( aPostItFld ) );
[ # # ]
661 : :
662 [ # # ]: 0 : if( bMoveFwd )
663 [ # # ][ # # ]: 0 : pPam->Move( fnMoveForward );
[ # # ]
664 : 0 : }
665 : :
666 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|