Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <stdlib.h>
21 :
22 : #include <svx/svxids.hrc>
23 : #include <i18npool/languagetag.hxx>
24 : #include <svtools/ctrltool.hxx>
25 : #include <svl/urihelper.hxx>
26 : #include <editeng/udlnitem.hxx>
27 : #include <editeng/adjitem.hxx>
28 : #include <editeng/blnkitem.hxx>
29 : #include <editeng/crsditem.hxx>
30 : #include <editeng/kernitem.hxx>
31 : #include <editeng/lspcitem.hxx>
32 : #include <editeng/fontitem.hxx>
33 : #include <editeng/postitem.hxx>
34 : #include <editeng/colritem.hxx>
35 : #include <editeng/cmapitem.hxx>
36 : #include <editeng/brshitem.hxx>
37 : #include <editeng/wghtitem.hxx>
38 : #include <editeng/fhgtitem.hxx>
39 : #include <editeng/boxitem.hxx>
40 : #include <editeng/ulspitem.hxx>
41 : #include <editeng/lrspitem.hxx>
42 : #include <editeng/langitem.hxx>
43 : #include <svl/itempool.hxx>
44 : #include <editeng/spltitem.hxx>
45 : #include <editeng/widwitem.hxx>
46 : #include <editeng/frmdiritem.hxx>
47 : #include <editeng/orphitem.hxx>
48 : #include <svtools/svparser.hxx>
49 : #include <vcl/svapp.hxx>
50 : #include <vcl/wrkwin.hxx>
51 :
52 : #include "css1kywd.hxx"
53 : #include "svxcss1.hxx"
54 :
55 : #include <memory>
56 :
57 :
58 : using namespace ::com::sun::star;
59 :
60 : // die Funktionen zum Parsen einer CSS1-Property sind von folgendem Typ:
61 : typedef void (*FnParseCSS1Prop)( const CSS1Expression *pExpr,
62 : SfxItemSet& rItemSet,
63 : SvxCSS1PropertyInfo& rPropInfo,
64 : const SvxCSS1Parser& rParser );
65 :
66 : static CSS1PropertyEnum const aFontSizeTable[] =
67 : {
68 : { sCSS1_PV_xx_small, 0 },
69 : { sCSS1_PV_x_small, 1 },
70 : { sCSS1_PV_small, 2 },
71 : { sCSS1_PV_medium, 3 },
72 : { sCSS1_PV_large, 4 },
73 : { sCSS1_PV_x_large, 5 },
74 : { sCSS1_PV_xx_large, 6 },
75 : { 0, 0 }
76 : };
77 :
78 : static CSS1PropertyEnum const aFontFamilyTable[] =
79 : {
80 : { sCSS1_PV_serif, FAMILY_ROMAN },
81 : { sCSS1_PV_sans_serif, FAMILY_SWISS },
82 : { sCSS1_PV_cursive, FAMILY_SCRIPT },
83 : { sCSS1_PV_fantasy, FAMILY_DECORATIVE },
84 : { sCSS1_PV_monospace, FAMILY_MODERN },
85 : { 0, 0 }
86 : };
87 :
88 : static CSS1PropertyEnum const aFontWeightTable[] =
89 : {
90 : { sCSS1_PV_extra_light, WEIGHT_NORMAL }, // WEIGHT_ULTRALIGHT (OBS)
91 : { sCSS1_PV_light, WEIGHT_NORMAL }, // WEIGHT_LIGHT (OBSOLETE)
92 : { sCSS1_PV_demi_light, WEIGHT_NORMAL }, // WEIGHT_SEMILIGHT (OBS)
93 : { sCSS1_PV_medium, WEIGHT_NORMAL }, // WEIGHT_MEDIUM (OBS)
94 : { sCSS1_PV_normal, WEIGHT_NORMAL }, // WEIGHT_MEDIUM
95 : { sCSS1_PV_demi_bold, WEIGHT_NORMAL }, // WEIGHT_SEMIBOLD (OBS)
96 : { sCSS1_PV_bold, WEIGHT_BOLD }, // WEIGHT_BOLD (OBSOLETE)
97 : { sCSS1_PV_extra_bold, WEIGHT_BOLD }, // WEIGHT_ULTRABOLD (OBS)
98 : { sCSS1_PV_bolder, WEIGHT_BOLD },
99 : { sCSS1_PV_lighter, WEIGHT_NORMAL },
100 : { 0, 0 }
101 : };
102 :
103 : static CSS1PropertyEnum const aFontStyleTable[] =
104 : {
105 : { sCSS1_PV_normal, ITALIC_NONE },
106 : { sCSS1_PV_italic, ITALIC_NORMAL },
107 : { sCSS1_PV_oblique, ITALIC_NORMAL },
108 : { 0, 0 }
109 : };
110 :
111 : static CSS1PropertyEnum const aFontVariantTable[] =
112 : {
113 : { sCSS1_PV_normal, SVX_CASEMAP_NOT_MAPPED },
114 : { sCSS1_PV_small_caps, SVX_CASEMAP_KAPITAELCHEN },
115 : { 0, 0 }
116 : };
117 :
118 : static CSS1PropertyEnum const aTextTransformTable[] =
119 : {
120 : { sCSS1_PV_uppercase, SVX_CASEMAP_VERSALIEN },
121 : { sCSS1_PV_lowercase, SVX_CASEMAP_GEMEINE },
122 : { sCSS1_PV_capitalize, SVX_CASEMAP_TITEL },
123 : { 0, 0 }
124 : };
125 :
126 : static CSS1PropertyEnum const aDirectionTable[] =
127 : {
128 : { sCSS1_PV_ltr, FRMDIR_HORI_LEFT_TOP },
129 : { sCSS1_PV_rtl, FRMDIR_HORI_RIGHT_TOP },
130 : { sCSS1_PV_inherit, FRMDIR_ENVIRONMENT },
131 : { 0, 0 }
132 : };
133 :
134 : static CSS1PropertyEnum const aBGRepeatTable[] =
135 : {
136 : { sCSS1_PV_repeat, GPOS_TILED },
137 : { sCSS1_PV_repeat_x, GPOS_TILED },
138 : { sCSS1_PV_repeat_y, GPOS_TILED },
139 : { sCSS1_PV_no_repeat, GPOS_NONE },
140 : { 0, 0 }
141 : };
142 :
143 : static CSS1PropertyEnum const aBGHoriPosTable[] =
144 : {
145 : { sCSS1_PV_left, GPOS_LT },
146 : { sCSS1_PV_center, GPOS_MT },
147 : { sCSS1_PV_right, GPOS_RT },
148 : { 0, 0 }
149 : };
150 :
151 : static CSS1PropertyEnum const aBGVertPosTable[] =
152 : {
153 : { sCSS1_PV_top, GPOS_LT },
154 : { sCSS1_PV_middle, GPOS_LM },
155 : { sCSS1_PV_bottom, GPOS_LB },
156 : { 0, 0 }
157 : };
158 :
159 : static CSS1PropertyEnum const aTextAlignTable[] =
160 : {
161 : { sCSS1_PV_left, SVX_ADJUST_LEFT },
162 : { sCSS1_PV_center, SVX_ADJUST_CENTER },
163 : { sCSS1_PV_right, SVX_ADJUST_RIGHT },
164 : { sCSS1_PV_justify, SVX_ADJUST_BLOCK },
165 : { 0, 0 }
166 : };
167 :
168 : static CSS1PropertyEnum const aBorderWidthTable[] =
169 : {
170 : { sCSS1_PV_thin, 0 }, // DEF_LINE_WIDTH_0 / DEF_DOUBLE_LINE0
171 : { sCSS1_PV_medium, 1 }, // DEF_LINE_WIDTH_1 / DEF_DOUBLE_LINE1
172 : { sCSS1_PV_thick, 2 }, // DEF_LINE_WIDTH_2 / DEF_DOUBLE_LINE2
173 : { 0, 0 }
174 : };
175 :
176 : enum CSS1BorderStyle { CSS1_BS_NONE, CSS1_BS_SINGLE, CSS1_BS_DOUBLE, CSS1_BS_DOTTED, CSS1_BS_DASHED, CSS1_BS_GROOVE, CSS1_BS_RIDGE, CSS1_BS_INSET, CSS1_BS_OUTSET };
177 :
178 : static CSS1PropertyEnum const aBorderStyleTable[] =
179 : {
180 : { sCSS1_PV_none, CSS1_BS_NONE },
181 : { sCSS1_PV_dotted, CSS1_BS_DOTTED },
182 : { sCSS1_PV_dashed, CSS1_BS_DASHED },
183 : { sCSS1_PV_solid, CSS1_BS_SINGLE },
184 : { sCSS1_PV_double, CSS1_BS_DOUBLE },
185 : { sCSS1_PV_groove, CSS1_BS_GROOVE },
186 : { sCSS1_PV_ridge, CSS1_BS_RIDGE },
187 : { sCSS1_PV_inset, CSS1_BS_INSET },
188 : { sCSS1_PV_outset, CSS1_BS_OUTSET },
189 : { 0, 0 }
190 : };
191 :
192 : static CSS1PropertyEnum const aFloatTable[] =
193 : {
194 : { sCSS1_PV_left, SVX_ADJUST_LEFT },
195 : { sCSS1_PV_right, SVX_ADJUST_RIGHT },
196 : { sCSS1_PV_none, SVX_ADJUST_END },
197 : { 0, 0 }
198 : };
199 :
200 : static CSS1PropertyEnum const aPositionTable[] =
201 : {
202 : { sCSS1_PV_absolute, SVX_CSS1_POS_ABSOLUTE },
203 : { sCSS1_PV_relative, SVX_CSS1_POS_RELATIVE },
204 : { sCSS1_PV_static, SVX_CSS1_POS_STATIC },
205 : { 0, 0 }
206 : };
207 :
208 : // Feature: PrintExt
209 : static CSS1PropertyEnum const aSizeTable[] =
210 : {
211 : { sCSS1_PV_auto, SVX_CSS1_STYPE_AUTO },
212 : { sCSS1_PV_landscape, SVX_CSS1_STYPE_LANDSCAPE },
213 : { sCSS1_PV_portrait, SVX_CSS1_STYPE_PORTRAIT },
214 : { 0, 0 }
215 : };
216 :
217 : static CSS1PropertyEnum const aPageBreakTable[] =
218 : {
219 : { sCSS1_PV_auto, SVX_CSS1_PBREAK_AUTO },
220 : { sCSS1_PV_always, SVX_CSS1_PBREAK_ALWAYS },
221 : { sCSS1_PV_avoid, SVX_CSS1_PBREAK_AVOID },
222 : { sCSS1_PV_left, SVX_CSS1_PBREAK_LEFT },
223 : { sCSS1_PV_right, SVX_CSS1_PBREAK_RIGHT },
224 : { 0, 0 }
225 : };
226 :
227 : // /Feature: PrintExt
228 :
229 : static sal_uInt16 const aBorderWidths[] =
230 : {
231 : DEF_LINE_WIDTH_0,
232 : DEF_LINE_WIDTH_5,
233 : DEF_LINE_WIDTH_1
234 : };
235 :
236 : #undef SBORDER_ENTRY
237 : #undef DBORDER_ENTRY
238 :
239 : struct SvxCSS1ItemIds
240 : {
241 : sal_uInt16 nFont;
242 : sal_uInt16 nFontCJK;
243 : sal_uInt16 nFontCTL;
244 : sal_uInt16 nPosture;
245 : sal_uInt16 nPostureCJK;
246 : sal_uInt16 nPostureCTL;
247 : sal_uInt16 nWeight;
248 : sal_uInt16 nWeightCJK;
249 : sal_uInt16 nWeightCTL;
250 : sal_uInt16 nFontHeight;
251 : sal_uInt16 nFontHeightCJK;
252 : sal_uInt16 nFontHeightCTL;
253 : sal_uInt16 nUnderline;
254 : sal_uInt16 nOverline;
255 : sal_uInt16 nCrossedOut;
256 : sal_uInt16 nColor;
257 : sal_uInt16 nKerning;
258 : sal_uInt16 nCaseMap;
259 : sal_uInt16 nBlink;
260 :
261 : sal_uInt16 nLineSpacing;
262 : sal_uInt16 nAdjust;
263 : sal_uInt16 nWidows;
264 : sal_uInt16 nOrphans;
265 : sal_uInt16 nFmtSplit;
266 :
267 : sal_uInt16 nLRSpace;
268 : sal_uInt16 nULSpace;
269 : sal_uInt16 nBox;
270 : sal_uInt16 nBrush;
271 :
272 : sal_uInt16 nLanguage;
273 : sal_uInt16 nLanguageCJK;
274 : sal_uInt16 nLanguageCTL;
275 : sal_uInt16 nDirection;
276 : };
277 :
278 :
279 : static SvxCSS1ItemIds aItemIds;
280 :
281 :
282 :
283 : struct SvxCSS1BorderInfo
284 : {
285 : Color aColor;
286 : sal_uInt16 nAbsWidth;
287 : sal_uInt16 nNamedWidth;
288 : CSS1BorderStyle eStyle;
289 :
290 0 : SvxCSS1BorderInfo() :
291 : aColor( COL_BLACK ), nAbsWidth( USHRT_MAX ),
292 0 : nNamedWidth( USHRT_MAX ), eStyle( CSS1_BS_NONE )
293 0 : {}
294 :
295 0 : SvxCSS1BorderInfo( const SvxCSS1BorderInfo& rInfo ) :
296 : aColor( rInfo.aColor ), nAbsWidth( rInfo.nAbsWidth ),
297 0 : nNamedWidth( rInfo.nNamedWidth ), eStyle( rInfo.eStyle )
298 0 : {}
299 :
300 : void SetBorderLine( sal_uInt16 nLine, SvxBoxItem &rBoxItem ) const;
301 : };
302 :
303 0 : void SvxCSS1BorderInfo::SetBorderLine( sal_uInt16 nLine, SvxBoxItem &rBoxItem ) const
304 : {
305 0 : if( CSS1_BS_NONE==eStyle || nAbsWidth==0 ||
306 : (nAbsWidth==USHRT_MAX && nNamedWidth==USHRT_MAX) )
307 : {
308 0 : rBoxItem.SetLine( 0, nLine );
309 0 : return;
310 : }
311 :
312 0 : ::editeng::SvxBorderLine aBorderLine( &aColor );
313 :
314 : // Linien-Stil doppelt oder einfach?
315 0 : switch ( eStyle )
316 : {
317 : case CSS1_BS_SINGLE:
318 0 : aBorderLine.SetBorderLineStyle(table::BorderLineStyle::SOLID);
319 0 : break;
320 : case CSS1_BS_DOUBLE:
321 0 : aBorderLine.SetBorderLineStyle(table::BorderLineStyle::DOUBLE);
322 0 : break;
323 : case CSS1_BS_DOTTED:
324 0 : aBorderLine.SetBorderLineStyle(table::BorderLineStyle::DOTTED);
325 0 : break;
326 : case CSS1_BS_DASHED:
327 0 : aBorderLine.SetBorderLineStyle(table::BorderLineStyle::DASHED);
328 0 : break;
329 : case CSS1_BS_GROOVE:
330 0 : aBorderLine.SetBorderLineStyle(table::BorderLineStyle::ENGRAVED);
331 0 : break;
332 : case CSS1_BS_RIDGE:
333 0 : aBorderLine.SetBorderLineStyle(table::BorderLineStyle::EMBOSSED);
334 0 : break;
335 : case CSS1_BS_INSET:
336 0 : aBorderLine.SetBorderLineStyle(table::BorderLineStyle::INSET);
337 0 : break;
338 : case CSS1_BS_OUTSET:
339 0 : aBorderLine.SetBorderLineStyle(table::BorderLineStyle::OUTSET);
340 0 : break;
341 : default:
342 0 : aBorderLine.SetBorderLineStyle(table::BorderLineStyle::NONE);
343 0 : break;
344 : }
345 :
346 : // benannte Breite umrechnenen, wenn keine absolute gegeben ist
347 0 : if( nAbsWidth==USHRT_MAX )
348 0 : aBorderLine.SetWidth( aBorderWidths[ nNamedWidth ] );
349 : else
350 0 : aBorderLine.SetWidth( nAbsWidth );
351 :
352 0 : rBoxItem.SetLine( &aBorderLine, nLine );
353 : }
354 :
355 0 : SvxCSS1PropertyInfo::SvxCSS1PropertyInfo()
356 : {
357 0 : for( sal_uInt16 i=0; i<4; i++ )
358 0 : aBorderInfos[i] = 0;
359 :
360 0 : Clear();
361 0 : }
362 :
363 0 : SvxCSS1PropertyInfo::SvxCSS1PropertyInfo( const SvxCSS1PropertyInfo& rProp ) :
364 : aId( rProp.aId ),
365 : bTopMargin( rProp.bTopMargin ),
366 : bBottomMargin( rProp.bBottomMargin ),
367 : bLeftMargin( rProp.bLeftMargin ),
368 : bRightMargin( rProp.bRightMargin ),
369 : bTextIndent( rProp.bTextIndent ),
370 : eFloat( rProp.eFloat ),
371 : ePosition( rProp.ePosition ),
372 : nTopBorderDistance( rProp.nTopBorderDistance ),
373 : nBottomBorderDistance( rProp.nBottomBorderDistance ),
374 : nLeftBorderDistance( rProp.nLeftBorderDistance ),
375 : nRightBorderDistance( rProp.nRightBorderDistance ),
376 : nLeft( rProp.nLeft ),
377 : nTop( rProp.nTop ),
378 : nWidth( rProp.nWidth ),
379 : nHeight( rProp.nHeight ),
380 : nLeftMargin( rProp.nLeftMargin ),
381 : nRightMargin( rProp.nRightMargin ),
382 : eLeftType( rProp.eLeftType ),
383 : eTopType( rProp.eTopType ),
384 : eWidthType( rProp.eWidthType ),
385 : eHeightType( rProp.eHeightType ),
386 : // Feature: PrintExt
387 : eSizeType( rProp.eSizeType ),
388 : ePageBreakBefore( rProp.ePageBreakBefore ),
389 0 : ePageBreakAfter( rProp.ePageBreakAfter )
390 : // /Feature: PrintExt
391 : {
392 0 : for( sal_uInt16 i=0; i<4; i++ )
393 0 : aBorderInfos[i] = rProp.aBorderInfos[i]
394 0 : ? new SvxCSS1BorderInfo( *rProp.aBorderInfos[i] )
395 0 : : 0;
396 0 : }
397 :
398 0 : SvxCSS1PropertyInfo::~SvxCSS1PropertyInfo()
399 : {
400 0 : DestroyBorderInfos();
401 0 : }
402 :
403 0 : void SvxCSS1PropertyInfo::DestroyBorderInfos()
404 : {
405 0 : for( sal_uInt16 i=0; i<4; i++ )
406 : {
407 0 : delete aBorderInfos[i];
408 0 : aBorderInfos[i] = 0;
409 : }
410 0 : }
411 :
412 0 : void SvxCSS1PropertyInfo::Clear()
413 : {
414 0 : aId.Erase();
415 0 : bTopMargin = bBottomMargin = sal_False;
416 0 : bLeftMargin = bRightMargin = bTextIndent = sal_False;
417 0 : nLeftMargin = nRightMargin = 0;
418 0 : eFloat = SVX_ADJUST_END;
419 :
420 0 : ePosition = SVX_CSS1_POS_NONE;
421 : nTopBorderDistance = nBottomBorderDistance =
422 0 : nLeftBorderDistance = nRightBorderDistance = USHRT_MAX;
423 0 : nLeft = nTop = nWidth = nHeight = 0;
424 0 : eLeftType = eTopType = eWidthType = eHeightType = SVX_CSS1_LTYPE_NONE;
425 :
426 : // Feature: PrintExt
427 0 : eSizeType = SVX_CSS1_STYPE_NONE;
428 0 : ePageBreakBefore = SVX_CSS1_PBREAK_NONE;
429 0 : ePageBreakAfter = SVX_CSS1_PBREAK_NONE;
430 :
431 0 : DestroyBorderInfos();
432 0 : }
433 :
434 0 : void SvxCSS1PropertyInfo::Merge( const SvxCSS1PropertyInfo& rProp )
435 : {
436 0 : if( rProp.bTopMargin )
437 0 : bTopMargin = sal_True;
438 0 : if( rProp.bBottomMargin )
439 0 : bBottomMargin = sal_True;
440 :
441 0 : if( rProp.bLeftMargin )
442 : {
443 0 : bLeftMargin = sal_True;
444 0 : nLeftMargin = rProp.nLeftMargin;
445 : }
446 0 : if( rProp.bRightMargin )
447 : {
448 0 : bRightMargin = sal_True;
449 0 : nRightMargin = rProp.nRightMargin;
450 : }
451 0 : if( rProp.bTextIndent )
452 0 : bTextIndent = sal_True;
453 :
454 0 : for( sal_uInt16 i=0; i<4; i++ )
455 : {
456 0 : if( rProp.aBorderInfos[i] )
457 : {
458 0 : if( aBorderInfos[i] )
459 0 : delete aBorderInfos[i];
460 :
461 0 : aBorderInfos[i] = new SvxCSS1BorderInfo( *rProp.aBorderInfos[i] );
462 : }
463 : }
464 :
465 0 : if( USHRT_MAX != rProp.nTopBorderDistance )
466 0 : nTopBorderDistance = rProp.nTopBorderDistance;
467 0 : if( USHRT_MAX != rProp.nBottomBorderDistance )
468 0 : nBottomBorderDistance = rProp.nBottomBorderDistance;
469 0 : if( USHRT_MAX != rProp.nLeftBorderDistance )
470 0 : nLeftBorderDistance = rProp.nLeftBorderDistance;
471 0 : if( USHRT_MAX != rProp.nRightBorderDistance )
472 0 : nRightBorderDistance = rProp.nRightBorderDistance;
473 :
474 0 : if( rProp.eFloat != SVX_ADJUST_END )
475 0 : eFloat = rProp.eFloat;
476 :
477 0 : if( rProp.ePosition != SVX_CSS1_POS_NONE )
478 0 : ePosition = rProp.ePosition;
479 :
480 : // Feature: PrintExt
481 0 : if( rProp.eSizeType != SVX_CSS1_STYPE_NONE )
482 : {
483 0 : eSizeType = rProp.eSizeType;
484 0 : nWidth = rProp.nWidth;
485 0 : nHeight = rProp.nHeight;
486 : }
487 :
488 0 : if( rProp.ePageBreakBefore != SVX_CSS1_PBREAK_NONE )
489 0 : ePageBreakBefore = rProp.ePageBreakBefore;
490 :
491 0 : if( rProp.ePageBreakAfter != SVX_CSS1_PBREAK_NONE )
492 0 : ePageBreakAfter = rProp.ePageBreakAfter;
493 :
494 : // /Feature: PrintExt
495 :
496 0 : if( rProp.eLeftType != SVX_CSS1_LTYPE_NONE )
497 : {
498 0 : eLeftType = rProp.eLeftType;
499 0 : nLeft = rProp.nLeft;
500 : }
501 :
502 0 : if( rProp.eTopType != SVX_CSS1_LTYPE_NONE )
503 : {
504 0 : eTopType = rProp.eTopType;
505 0 : nTop = rProp.nTop;
506 : }
507 :
508 0 : if( rProp.eWidthType != SVX_CSS1_LTYPE_NONE )
509 : {
510 0 : eWidthType = rProp.eWidthType;
511 0 : nWidth = rProp.nWidth;
512 : }
513 :
514 0 : if( rProp.eHeightType != SVX_CSS1_LTYPE_NONE )
515 : {
516 0 : eHeightType = rProp.eHeightType;
517 0 : nHeight = rProp.nHeight;
518 : }
519 0 : }
520 :
521 0 : SvxCSS1BorderInfo *SvxCSS1PropertyInfo::GetBorderInfo( sal_uInt16 nLine, sal_Bool bCreate )
522 : {
523 0 : sal_uInt16 nPos = 0;
524 0 : switch( nLine )
525 : {
526 0 : case BOX_LINE_TOP: nPos = 0; break;
527 0 : case BOX_LINE_BOTTOM: nPos = 1; break;
528 0 : case BOX_LINE_LEFT: nPos = 2; break;
529 0 : case BOX_LINE_RIGHT: nPos = 3; break;
530 : }
531 :
532 0 : if( !aBorderInfos[nPos] && bCreate )
533 0 : aBorderInfos[nPos] = new SvxCSS1BorderInfo;
534 :
535 0 : return aBorderInfos[nPos];
536 : }
537 :
538 0 : void SvxCSS1PropertyInfo::CopyBorderInfo( sal_uInt16 nSrcLine, sal_uInt16 nDstLine,
539 : sal_uInt16 nWhat )
540 : {
541 0 : SvxCSS1BorderInfo *pSrcInfo = GetBorderInfo( nSrcLine, sal_False );
542 0 : if( !pSrcInfo )
543 0 : return;
544 :
545 0 : SvxCSS1BorderInfo *pDstInfo = GetBorderInfo( nDstLine );
546 0 : if( (nWhat & SVX_CSS1_BORDERINFO_WIDTH) != 0 )
547 : {
548 0 : pDstInfo->nAbsWidth = pSrcInfo->nAbsWidth;
549 0 : pDstInfo->nNamedWidth = pSrcInfo->nNamedWidth;
550 : }
551 :
552 0 : if( (nWhat & SVX_CSS1_BORDERINFO_COLOR) != 0 )
553 0 : pDstInfo->aColor = pSrcInfo->aColor;
554 :
555 0 : if( (nWhat & SVX_CSS1_BORDERINFO_STYLE) != 0 )
556 0 : pDstInfo->eStyle = pSrcInfo->eStyle;
557 : }
558 :
559 0 : void SvxCSS1PropertyInfo::CopyBorderInfo( sal_uInt16 nCount, sal_uInt16 nWhat )
560 : {
561 0 : if( nCount==0 )
562 : {
563 0 : CopyBorderInfo( BOX_LINE_BOTTOM, BOX_LINE_TOP, nWhat );
564 0 : CopyBorderInfo( BOX_LINE_TOP, BOX_LINE_LEFT, nWhat );
565 : }
566 0 : if( nCount<=1 )
567 : {
568 0 : CopyBorderInfo( BOX_LINE_LEFT, BOX_LINE_RIGHT, nWhat );
569 : }
570 0 : }
571 :
572 0 : void SvxCSS1PropertyInfo::SetBoxItem( SfxItemSet& rItemSet,
573 : sal_uInt16 nMinBorderDist,
574 : const SvxBoxItem *pDfltItem,
575 : bool bTable )
576 : {
577 : bool bChg = nTopBorderDistance != USHRT_MAX ||
578 : nBottomBorderDistance != USHRT_MAX ||
579 : nLeftBorderDistance != USHRT_MAX ||
580 0 : nRightBorderDistance != USHRT_MAX;
581 : sal_uInt16 i;
582 :
583 0 : for( i = 0; !bChg && i < 4; i++ )
584 0 : bChg = aBorderInfos[i]!=0;
585 :
586 0 : if( !bChg )
587 0 : return;
588 :
589 0 : SvxBoxItem aBoxItem( aItemIds.nBox );
590 0 : if( pDfltItem )
591 0 : aBoxItem = *pDfltItem;
592 :
593 0 : SvxCSS1BorderInfo *pInfo = GetBorderInfo( BOX_LINE_TOP, sal_False );
594 0 : if( pInfo )
595 0 : pInfo->SetBorderLine( BOX_LINE_TOP, aBoxItem );
596 :
597 0 : pInfo = GetBorderInfo( BOX_LINE_BOTTOM, sal_False );
598 0 : if( pInfo )
599 0 : pInfo->SetBorderLine( BOX_LINE_BOTTOM, aBoxItem );
600 :
601 0 : pInfo = GetBorderInfo( BOX_LINE_LEFT, sal_False );
602 0 : if( pInfo )
603 0 : pInfo->SetBorderLine( BOX_LINE_LEFT, aBoxItem );
604 :
605 0 : pInfo = GetBorderInfo( BOX_LINE_RIGHT, sal_False );
606 0 : if( pInfo )
607 0 : pInfo->SetBorderLine( BOX_LINE_RIGHT, aBoxItem );
608 :
609 0 : for( i=0; i<4; i++ )
610 : {
611 0 : sal_uInt16 nLine = BOX_LINE_TOP, nDist = 0;
612 0 : switch( i )
613 : {
614 0 : case 0: nLine = BOX_LINE_TOP;
615 0 : nDist = nTopBorderDistance;
616 0 : nTopBorderDistance = USHRT_MAX;
617 0 : break;
618 0 : case 1: nLine = BOX_LINE_BOTTOM;
619 0 : nDist = nBottomBorderDistance;
620 0 : nBottomBorderDistance = USHRT_MAX;
621 0 : break;
622 0 : case 2: nLine = BOX_LINE_LEFT;
623 0 : nDist = nLeftBorderDistance;
624 0 : nLeftBorderDistance = USHRT_MAX;
625 0 : break;
626 0 : case 3: nLine = BOX_LINE_RIGHT;
627 0 : nDist = nRightBorderDistance;
628 0 : nRightBorderDistance = USHRT_MAX;
629 0 : break;
630 : }
631 :
632 0 : if( aBoxItem.GetLine( nLine ) )
633 : {
634 0 : if( USHRT_MAX == nDist )
635 0 : nDist = aBoxItem.GetDistance( nLine );
636 :
637 0 : if( nDist < nMinBorderDist )
638 0 : nDist = nMinBorderDist;
639 : }
640 : else
641 : {
642 0 : if( USHRT_MAX == nDist )
643 0 : nDist = aBoxItem.GetDistance( nLine );
644 :
645 0 : if( !bTable )
646 0 : nDist = 0U;
647 0 : else if( nDist && nDist < nMinBorderDist )
648 0 : nDist = nMinBorderDist;
649 : }
650 :
651 0 : aBoxItem.SetDistance( nDist, nLine );
652 : }
653 :
654 0 : rItemSet.Put( aBoxItem );
655 :
656 0 : DestroyBorderInfos();
657 : }
658 :
659 0 : SvxCSS1MapEntry::SvxCSS1MapEntry( const String& rKey, const SfxItemSet& rItemSet,
660 : const SvxCSS1PropertyInfo& rProp ) :
661 : aKey( rKey ),
662 : aItemSet( rItemSet ),
663 0 : aPropInfo( rProp )
664 : {
665 : // TODO: ToUpperAscii
666 0 : aKey.ToUpperAscii();
667 0 : }
668 :
669 0 : sal_Bool SvxCSS1Parser::StyleParsed( const CSS1Selector * /*pSelector*/,
670 : SfxItemSet& /*rItemSet*/,
671 : SvxCSS1PropertyInfo& /*rPropInfo*/ )
672 : {
673 : // wie man sieht passiert hier gar nichts
674 0 : return sal_True;
675 : }
676 :
677 0 : bool SvxCSS1Parser::SelectorParsed( CSS1Selector *pSelector, bool bFirst )
678 : {
679 0 : if( bFirst )
680 : {
681 : OSL_ENSURE( pSheetItemSet, "Where is the Item-Set for Style-Sheets?" );
682 :
683 0 : for (size_t i = 0; i < aSelectors.size(); ++i)
684 : {
685 0 : StyleParsed( &aSelectors[i], *pSheetItemSet, *pSheetPropInfo );
686 : }
687 0 : pSheetItemSet->ClearItem();
688 0 : pSheetPropInfo->Clear();
689 :
690 : // und die naechste Rule vorbereiten
691 0 : aSelectors.clear();
692 : }
693 :
694 0 : aSelectors.push_back(pSelector);
695 :
696 0 : return false; // den Selektor haben wir gespeichert. Loeschen toedlich!
697 : }
698 :
699 :
700 0 : sal_Bool SvxCSS1Parser::DeclarationParsed( const String& rProperty,
701 : const CSS1Expression *pExpr )
702 : {
703 : OSL_ENSURE( pExpr, "DeclarationParsed() without Expression" );
704 :
705 0 : if( !pExpr )
706 0 : return sal_True;
707 :
708 0 : ParseProperty( rProperty, pExpr );
709 :
710 0 : return sal_True; // die Deklaration brauchen wir nicht mehr. Loeschen!
711 : }
712 :
713 :
714 0 : SvxCSS1Parser::SvxCSS1Parser( SfxItemPool& rPool, const String& rBaseURL, sal_uInt16 nMinFixLineSp,
715 : sal_uInt16 *pWhichIds, sal_uInt16 nWhichIds ) :
716 : CSS1Parser(),
717 : sBaseURL( rBaseURL ),
718 : pSheetItemSet(0),
719 : pItemSet(0),
720 : pSearchEntry( 0 ),
721 : nMinFixLineSpace( nMinFixLineSp ),
722 : eDfltEnc( RTL_TEXTENCODING_DONTKNOW ),
723 : nScriptFlags( CSS1_SCRIPT_ALL ),
724 0 : bIgnoreFontFamily( sal_False )
725 : {
726 : // Item-Ids auch initialisieren
727 0 : aItemIds.nFont = rPool.GetTrueWhich( SID_ATTR_CHAR_FONT, sal_False );
728 0 : aItemIds.nFontCJK = rPool.GetTrueWhich( SID_ATTR_CHAR_CJK_FONT, sal_False );
729 0 : aItemIds.nFontCTL = rPool.GetTrueWhich( SID_ATTR_CHAR_CTL_FONT, sal_False );
730 0 : aItemIds.nPosture = rPool.GetTrueWhich( SID_ATTR_CHAR_POSTURE, sal_False );
731 0 : aItemIds.nPostureCJK = rPool.GetTrueWhich( SID_ATTR_CHAR_CJK_POSTURE, sal_False );
732 0 : aItemIds.nPostureCTL = rPool.GetTrueWhich( SID_ATTR_CHAR_CTL_POSTURE, sal_False );
733 0 : aItemIds.nWeight = rPool.GetTrueWhich( SID_ATTR_CHAR_WEIGHT, sal_False );
734 0 : aItemIds.nWeightCJK = rPool.GetTrueWhich( SID_ATTR_CHAR_CJK_WEIGHT, sal_False );
735 0 : aItemIds.nWeightCTL = rPool.GetTrueWhich( SID_ATTR_CHAR_CTL_WEIGHT, sal_False );
736 0 : aItemIds.nFontHeight = rPool.GetTrueWhich( SID_ATTR_CHAR_FONTHEIGHT, sal_False );
737 0 : aItemIds.nFontHeightCJK = rPool.GetTrueWhich( SID_ATTR_CHAR_CJK_FONTHEIGHT, sal_False );
738 0 : aItemIds.nFontHeightCTL = rPool.GetTrueWhich( SID_ATTR_CHAR_CTL_FONTHEIGHT, sal_False );
739 0 : aItemIds.nUnderline = rPool.GetTrueWhich( SID_ATTR_CHAR_UNDERLINE, sal_False );
740 0 : aItemIds.nOverline = rPool.GetTrueWhich( SID_ATTR_CHAR_OVERLINE, sal_False );
741 0 : aItemIds.nCrossedOut = rPool.GetTrueWhich( SID_ATTR_CHAR_STRIKEOUT, sal_False );
742 0 : aItemIds.nColor = rPool.GetTrueWhich( SID_ATTR_CHAR_COLOR, sal_False );
743 0 : aItemIds.nKerning = rPool.GetTrueWhich( SID_ATTR_CHAR_KERNING, sal_False );
744 0 : aItemIds.nCaseMap = rPool.GetTrueWhich( SID_ATTR_CHAR_CASEMAP, sal_False );
745 0 : aItemIds.nBlink = rPool.GetTrueWhich( SID_ATTR_FLASH, sal_False );
746 :
747 0 : aItemIds.nLineSpacing = rPool.GetTrueWhich( SID_ATTR_PARA_LINESPACE, sal_False );
748 0 : aItemIds.nAdjust = rPool.GetTrueWhich( SID_ATTR_PARA_ADJUST, sal_False );
749 0 : aItemIds.nWidows = rPool.GetTrueWhich( SID_ATTR_PARA_WIDOWS, sal_False );
750 0 : aItemIds.nOrphans = rPool.GetTrueWhich( SID_ATTR_PARA_ORPHANS, sal_False );
751 0 : aItemIds.nFmtSplit = rPool.GetTrueWhich( SID_ATTR_PARA_SPLIT, sal_False );
752 :
753 0 : aItemIds.nLRSpace = rPool.GetTrueWhich( SID_ATTR_LRSPACE, sal_False );
754 0 : aItemIds.nULSpace = rPool.GetTrueWhich( SID_ATTR_ULSPACE, sal_False );
755 0 : aItemIds.nBox = rPool.GetTrueWhich( SID_ATTR_BORDER_OUTER, sal_False );
756 0 : aItemIds.nBrush = rPool.GetTrueWhich( SID_ATTR_BRUSH, sal_False );
757 :
758 0 : aItemIds.nLanguage = rPool.GetTrueWhich( SID_ATTR_CHAR_LANGUAGE, sal_False );
759 0 : aItemIds.nLanguageCJK = rPool.GetTrueWhich( SID_ATTR_CHAR_CJK_LANGUAGE, sal_False );
760 0 : aItemIds.nLanguageCTL = rPool.GetTrueWhich( SID_ATTR_CHAR_CTL_LANGUAGE, sal_False );
761 0 : aItemIds.nDirection = rPool.GetTrueWhich( SID_ATTR_FRAMEDIRECTION, sal_False );
762 :
763 0 : aWhichMap.insert( aWhichMap.begin(), 0 );
764 : SvParser::BuildWhichTbl( aWhichMap, (sal_uInt16 *)&aItemIds,
765 0 : sizeof(aItemIds) / sizeof(sal_uInt16) );
766 0 : if( pWhichIds && nWhichIds )
767 0 : SvParser::BuildWhichTbl( aWhichMap, pWhichIds, nWhichIds );
768 :
769 0 : pSheetItemSet = new SfxItemSet( rPool, &aWhichMap[0] );
770 0 : pSheetPropInfo = new SvxCSS1PropertyInfo;
771 0 : pSearchEntry = new SvxCSS1MapEntry( rPool, &aWhichMap[0] );
772 0 : }
773 :
774 0 : SvxCSS1Parser::~SvxCSS1Parser()
775 : {
776 0 : delete pSheetItemSet;
777 0 : delete pSheetPropInfo;
778 0 : delete pSearchEntry;
779 0 : }
780 :
781 0 : void SvxCSS1Parser::InsertId( const String& rId,
782 : const SfxItemSet& rItemSet,
783 : const SvxCSS1PropertyInfo& rProp )
784 : {
785 0 : InsertMapEntry( rId, rItemSet, rProp, aIds );
786 0 : }
787 :
788 0 : const SvxCSS1MapEntry* SvxCSS1Parser::GetId( const String& rId ) const
789 : {
790 0 : CSS1Map::const_iterator itr = aIds.find(rId);
791 0 : return itr == aIds.end() ? NULL : itr->second;
792 : }
793 :
794 0 : void SvxCSS1Parser::InsertClass( const String& rClass,
795 : const SfxItemSet& rItemSet,
796 : const SvxCSS1PropertyInfo& rProp )
797 : {
798 0 : InsertMapEntry( rClass, rItemSet, rProp, aClasses );
799 0 : }
800 :
801 0 : const SvxCSS1MapEntry* SvxCSS1Parser::GetClass( const String& rClass ) const
802 : {
803 0 : CSS1Map::const_iterator itr = aClasses.find(rClass);
804 0 : return itr == aClasses.end() ? NULL : itr->second;
805 : }
806 :
807 0 : void SvxCSS1Parser::InsertPage( const String& rPage,
808 : sal_Bool bPseudo,
809 : const SfxItemSet& rItemSet,
810 : const SvxCSS1PropertyInfo& rProp )
811 : {
812 0 : String aKey( rPage );
813 0 : if( bPseudo )
814 0 : aKey.Insert( ':', 0 );
815 0 : InsertMapEntry( aKey, rItemSet, rProp, aPages );
816 0 : }
817 :
818 0 : SvxCSS1MapEntry* SvxCSS1Parser::GetPage( const String& rPage, bool bPseudo )
819 : {
820 0 : String aKey( rPage );
821 0 : if( bPseudo )
822 0 : aKey.Insert( ':', 0 );
823 :
824 0 : CSS1Map::iterator itr = aPages.find(aKey);
825 0 : return itr == aPages.end() ? NULL : itr->second;
826 : }
827 :
828 0 : void SvxCSS1Parser::InsertTag( const String& rTag,
829 : const SfxItemSet& rItemSet,
830 : const SvxCSS1PropertyInfo& rProp )
831 : {
832 0 : InsertMapEntry( rTag, rItemSet, rProp, aTags );
833 0 : }
834 :
835 0 : SvxCSS1MapEntry* SvxCSS1Parser::GetTag( const String& rTag )
836 : {
837 0 : CSS1Map::iterator itr = aTags.find(rTag);
838 0 : return itr == aTags.end() ? NULL : itr->second;
839 : }
840 :
841 0 : sal_Bool SvxCSS1Parser::ParseStyleSheet( const String& rIn )
842 : {
843 0 : pItemSet = pSheetItemSet;
844 0 : pPropInfo = pSheetPropInfo;
845 :
846 0 : sal_Bool bSuccess = CSS1Parser::ParseStyleSheet( rIn );
847 :
848 0 : for (size_t i = 0; i < aSelectors.size(); ++i)
849 : {
850 0 : StyleParsed( &aSelectors[i], *pSheetItemSet, *pSheetPropInfo );
851 : }
852 :
853 : // und etwas aufrauemen
854 0 : aSelectors.clear();
855 0 : pSheetItemSet->ClearItem();
856 0 : pSheetPropInfo->Clear();
857 :
858 0 : pItemSet = 0;
859 0 : pPropInfo = 0;
860 :
861 0 : return bSuccess;
862 : }
863 :
864 0 : sal_Bool SvxCSS1Parser::ParseStyleOption( const String& rIn,
865 : SfxItemSet& rItemSet,
866 : SvxCSS1PropertyInfo& rPropInfo )
867 : {
868 0 : pItemSet = &rItemSet;
869 0 : pPropInfo = &rPropInfo;
870 :
871 0 : sal_Bool bSuccess = CSS1Parser::ParseStyleOption( rIn );
872 0 : rItemSet.ClearItem( aItemIds.nDirection );
873 :
874 0 : pItemSet = 0;
875 0 : pPropInfo = 0;
876 :
877 0 : return bSuccess;
878 : }
879 :
880 :
881 0 : sal_Bool SvxCSS1Parser::GetEnum( const CSS1PropertyEnum *pPropTable,
882 : const String &rValue, sal_uInt16& rEnum )
883 : {
884 0 : String aValue( rValue );
885 0 : aValue.ToLowerAscii();
886 0 : while( pPropTable->pName )
887 : {
888 0 : if( !rValue.EqualsIgnoreCaseAscii( pPropTable->pName ) )
889 0 : pPropTable++;
890 : else
891 0 : break;
892 : }
893 :
894 0 : if( pPropTable->pName )
895 0 : rEnum = pPropTable->nEnum;
896 :
897 0 : return (pPropTable->pName != 0);
898 : }
899 :
900 0 : void SvxCSS1Parser::PixelToTwip( long &rWidth, long &rHeight )
901 : {
902 0 : if( Application::GetDefaultDevice() )
903 : {
904 0 : Size aTwipSz( rWidth, rHeight );
905 : aTwipSz = Application::GetDefaultDevice()->PixelToLogic( aTwipSz,
906 0 : MapMode(MAP_TWIP) );
907 :
908 0 : rWidth = aTwipSz.Width();
909 0 : rHeight = aTwipSz.Height();
910 : }
911 0 : }
912 :
913 0 : sal_uInt32 SvxCSS1Parser::GetFontHeight( sal_uInt16 nSize ) const
914 : {
915 : sal_uInt16 nHeight;
916 :
917 0 : switch( nSize )
918 : {
919 0 : case 0: nHeight = 8*20; break;
920 0 : case 1: nHeight = 10*20; break;
921 0 : case 2: nHeight = 11*20; break;
922 0 : case 3: nHeight = 12*20; break;
923 0 : case 4: nHeight = 17*20; break;
924 0 : case 5: nHeight = 20*20; break;
925 : case 6:
926 0 : default: nHeight = 32*20; break;
927 : }
928 :
929 0 : return nHeight;
930 : }
931 :
932 0 : const FontList *SvxCSS1Parser::GetFontList() const
933 : {
934 0 : return 0;
935 : }
936 :
937 0 : void SvxCSS1Parser::InsertMapEntry( const String& rKey,
938 : const SfxItemSet& rItemSet,
939 : const SvxCSS1PropertyInfo& rProp,
940 : CSS1Map& rMap )
941 : {
942 0 : CSS1Map::iterator itr = rMap.find(rKey);
943 0 : if (itr == rMap.end())
944 : {
945 0 : std::auto_ptr<SvxCSS1MapEntry> p(new SvxCSS1MapEntry(rKey, rItemSet, rProp));
946 0 : rMap.insert(rKey, p);
947 : }
948 : else
949 : {
950 0 : SvxCSS1MapEntry* p = itr->second;
951 : MergeStyles( rItemSet, rProp,
952 0 : p->GetItemSet(), p->GetPropertyInfo(), sal_True );
953 : }
954 0 : }
955 :
956 0 : void SvxCSS1Parser::MergeStyles( const SfxItemSet& rSrcSet,
957 : const SvxCSS1PropertyInfo& rSrcInfo,
958 : SfxItemSet& rTargetSet,
959 : SvxCSS1PropertyInfo& rTargetInfo,
960 : sal_Bool bSmart )
961 : {
962 0 : if( !bSmart )
963 : {
964 0 : rTargetSet.Put( rSrcSet );
965 : }
966 : else
967 : {
968 0 : SvxLRSpaceItem aLRSpace( (const SvxLRSpaceItem&)rTargetSet.Get(aItemIds.nLRSpace) );
969 0 : SvxULSpaceItem aULSpace( (const SvxULSpaceItem&)rTargetSet.Get(aItemIds.nULSpace) );
970 0 : SvxBoxItem aBox( (const SvxBoxItem&)rTargetSet.Get(aItemIds.nBox) );
971 :
972 0 : rTargetSet.Put( rSrcSet );
973 :
974 0 : if( rSrcInfo.bLeftMargin || rSrcInfo.bRightMargin ||
975 : rSrcInfo.bTextIndent )
976 : {
977 : const SvxLRSpaceItem& rNewLRSpace =
978 0 : (const SvxLRSpaceItem&)rSrcSet.Get( aItemIds.nLRSpace );
979 :
980 0 : if( rSrcInfo.bLeftMargin )
981 0 : aLRSpace.SetLeft( rNewLRSpace.GetLeft() );
982 0 : if( rSrcInfo.bRightMargin )
983 0 : aLRSpace.SetRight( rNewLRSpace.GetRight() );
984 0 : if( rSrcInfo.bTextIndent )
985 0 : aLRSpace.SetTxtFirstLineOfst( rNewLRSpace.GetTxtFirstLineOfst() );
986 :
987 0 : rTargetSet.Put( aLRSpace );
988 : }
989 :
990 0 : if( rSrcInfo.bTopMargin || rSrcInfo.bBottomMargin )
991 : {
992 : const SvxULSpaceItem& rNewULSpace =
993 0 : (const SvxULSpaceItem&)rSrcSet.Get( aItemIds.nULSpace );
994 :
995 0 : if( rSrcInfo.bTopMargin )
996 0 : aULSpace.SetUpper( rNewULSpace.GetUpper() );
997 0 : if( rSrcInfo.bBottomMargin )
998 0 : aULSpace.SetLower( rNewULSpace.GetLower() );
999 :
1000 0 : rTargetSet.Put( aULSpace );
1001 0 : }
1002 : }
1003 :
1004 0 : rTargetInfo.Merge( rSrcInfo );
1005 0 : }
1006 :
1007 0 : void SvxCSS1Parser::SetDfltEncoding( rtl_TextEncoding eEnc )
1008 : {
1009 0 : eDfltEnc = eEnc;
1010 0 : }
1011 :
1012 :
1013 0 : static void ParseCSS1_font_size( const CSS1Expression *pExpr,
1014 : SfxItemSet &rItemSet,
1015 : SvxCSS1PropertyInfo& /*rPropInfo*/,
1016 : const SvxCSS1Parser& rParser )
1017 : {
1018 : OSL_ENSURE( pExpr, "no expression" );
1019 :
1020 0 : sal_uLong nHeight = 0;
1021 0 : sal_uInt16 nPropHeight = 100;
1022 :
1023 0 : switch( pExpr->GetType() )
1024 : {
1025 : case CSS1_LENGTH:
1026 0 : nHeight = pExpr->GetULength();
1027 0 : break;
1028 : case CSS1_PIXLENGTH:
1029 : {
1030 0 : long nPWidth = 0;
1031 0 : long nPHeight = (long)pExpr->GetNumber();
1032 0 : SvxCSS1Parser::PixelToTwip( nPWidth, nPHeight );
1033 0 : nHeight = (sal_uLong)nPHeight;
1034 : }
1035 0 : break;
1036 : case CSS1_PERCENTAGE:
1037 : // nur fuer Drop-Caps!
1038 0 : nPropHeight = (sal_uInt16)pExpr->GetNumber();
1039 0 : break;
1040 : case CSS1_IDENT:
1041 : {
1042 : sal_uInt16 nSize;
1043 :
1044 0 : if( SvxCSS1Parser::GetEnum( aFontSizeTable, pExpr->GetString(),
1045 0 : nSize ) )
1046 : {
1047 0 : nHeight = rParser.GetFontHeight( nSize );
1048 : }
1049 : }
1050 0 : break;
1051 :
1052 : default:
1053 : ;
1054 : }
1055 :
1056 0 : if( nHeight || nPropHeight!=100 )
1057 : {
1058 : SvxFontHeightItem aFontHeight( nHeight, nPropHeight,
1059 0 : aItemIds.nFontHeight );
1060 0 : if( rParser.IsSetWesternProps() )
1061 0 : rItemSet.Put( aFontHeight );
1062 0 : if( rParser.IsSetCJKProps() )
1063 : {
1064 0 : aFontHeight.SetWhich( aItemIds.nFontHeightCJK );
1065 0 : rItemSet.Put( aFontHeight );
1066 : }
1067 0 : if( rParser.IsSetCTLProps() )
1068 : {
1069 0 : aFontHeight.SetWhich( aItemIds.nFontHeightCTL );
1070 0 : rItemSet.Put( aFontHeight );
1071 0 : }
1072 : }
1073 0 : }
1074 :
1075 :
1076 :
1077 0 : static void ParseCSS1_font_family( const CSS1Expression *pExpr,
1078 : SfxItemSet &rItemSet,
1079 : SvxCSS1PropertyInfo& /*rPropInfo*/,
1080 : const SvxCSS1Parser& rParser )
1081 : {
1082 : OSL_ENSURE( pExpr, "no expression" );
1083 :
1084 0 : String aName, aStyleName;
1085 0 : FontFamily eFamily = FAMILY_DONTKNOW;
1086 0 : FontPitch ePitch = PITCH_DONTKNOW;
1087 0 : rtl_TextEncoding eEnc = rParser.GetDfltEncoding();
1088 0 : const FontList *pFList = rParser.GetFontList();
1089 0 : sal_Bool bFirst = sal_True;
1090 0 : sal_Bool bFound = sal_False;
1091 0 : while( pExpr && (bFirst || ','==pExpr->GetOp() || !pExpr->GetOp()) )
1092 : {
1093 0 : CSS1Token eType = pExpr->GetType();
1094 0 : if( CSS1_IDENT==eType || CSS1_STRING==eType )
1095 : {
1096 0 : String aIdent( pExpr->GetString() );
1097 :
1098 0 : if( CSS1_IDENT==eType )
1099 : {
1100 : // Alle nachfolgenden id's sammeln und mit einem
1101 : // Space getrennt hintendranhaengen
1102 0 : const CSS1Expression *pNext = pExpr->GetNext();
1103 0 : while( pNext && !pNext->GetOp() &&
1104 0 : CSS1_IDENT==pNext->GetType() )
1105 : {
1106 0 : (aIdent += ' ') += pNext->GetString();
1107 0 : pExpr = pNext;
1108 0 : pNext = pExpr->GetNext();
1109 : }
1110 : }
1111 0 : if( aIdent.Len() )
1112 : {
1113 0 : if( !bFound && pFList )
1114 : {
1115 0 : sal_Handle hFont = pFList->GetFirstFontInfo( aIdent );
1116 0 : if( 0 != hFont )
1117 : {
1118 0 : const FontInfo& rFInfo = pFList->GetFontInfo( hFont );
1119 0 : if( RTL_TEXTENCODING_DONTKNOW != rFInfo.GetCharSet() )
1120 : {
1121 0 : bFound = sal_True;
1122 0 : if( RTL_TEXTENCODING_SYMBOL == rFInfo.GetCharSet() )
1123 0 : eEnc = RTL_TEXTENCODING_SYMBOL;
1124 : }
1125 : }
1126 : }
1127 0 : if( !bFirst )
1128 0 : aName += ';';
1129 0 : aName += aIdent;
1130 0 : }
1131 : }
1132 :
1133 0 : pExpr = pExpr->GetNext();
1134 0 : bFirst = sal_False;
1135 : }
1136 :
1137 0 : if( aName.Len() && !rParser.IsIgnoreFontFamily() )
1138 : {
1139 : SvxFontItem aFont( eFamily, aName, aStyleName, ePitch,
1140 0 : eEnc, aItemIds.nFont );
1141 0 : if( rParser.IsSetWesternProps() )
1142 0 : rItemSet.Put( aFont );
1143 0 : if( rParser.IsSetCJKProps() )
1144 : {
1145 0 : aFont.SetWhich( aItemIds.nFontCJK );
1146 0 : rItemSet.Put( aFont );
1147 : }
1148 0 : if( rParser.IsSetCTLProps() )
1149 : {
1150 0 : aFont.SetWhich( aItemIds.nFontCTL );
1151 0 : rItemSet.Put( aFont );
1152 0 : }
1153 0 : }
1154 0 : }
1155 :
1156 :
1157 0 : static void ParseCSS1_font_weight( const CSS1Expression *pExpr,
1158 : SfxItemSet &rItemSet,
1159 : SvxCSS1PropertyInfo& /*rPropInfo*/,
1160 : const SvxCSS1Parser& rParser )
1161 : {
1162 : OSL_ENSURE( pExpr, "no expression" );
1163 :
1164 0 : switch( pExpr->GetType() )
1165 : {
1166 : case CSS1_IDENT:
1167 : case CSS1_STRING: // MS-IE, was sonst
1168 : {
1169 : sal_uInt16 nWeight;
1170 0 : if( SvxCSS1Parser::GetEnum( aFontWeightTable, pExpr->GetString(),
1171 0 : nWeight ) )
1172 : {
1173 0 : SvxWeightItem aWeight( (FontWeight)nWeight, aItemIds.nWeight );
1174 0 : if( rParser.IsSetWesternProps() )
1175 0 : rItemSet.Put( aWeight );
1176 0 : if( rParser.IsSetCJKProps() )
1177 : {
1178 0 : aWeight.SetWhich( aItemIds.nWeightCJK );
1179 0 : rItemSet.Put( aWeight );
1180 : }
1181 0 : if( rParser.IsSetCTLProps() )
1182 : {
1183 0 : aWeight.SetWhich( aItemIds.nWeightCTL );
1184 0 : rItemSet.Put( aWeight );
1185 0 : }
1186 : }
1187 : }
1188 0 : break;
1189 : case CSS1_NUMBER:
1190 : {
1191 0 : sal_uInt16 nWeight = (sal_uInt16)pExpr->GetNumber();
1192 : SvxWeightItem aWeight( nWeight>400 ? WEIGHT_BOLD : WEIGHT_NORMAL,
1193 0 : aItemIds.nWeight );
1194 0 : if( rParser.IsSetWesternProps() )
1195 0 : rItemSet.Put( aWeight );
1196 0 : if( rParser.IsSetCJKProps() )
1197 : {
1198 0 : aWeight.SetWhich( aItemIds.nWeightCJK );
1199 0 : rItemSet.Put( aWeight );
1200 : }
1201 0 : if( rParser.IsSetCTLProps() )
1202 : {
1203 0 : aWeight.SetWhich( aItemIds.nWeightCTL );
1204 0 : rItemSet.Put( aWeight );
1205 0 : }
1206 : }
1207 0 : break;
1208 :
1209 : default:
1210 : ;
1211 : }
1212 0 : }
1213 :
1214 :
1215 0 : static void ParseCSS1_font_style( const CSS1Expression *pExpr,
1216 : SfxItemSet &rItemSet,
1217 : SvxCSS1PropertyInfo& /*rPropInfo*/,
1218 : const SvxCSS1Parser& rParser )
1219 : {
1220 : OSL_ENSURE( pExpr, "no expression" );
1221 :
1222 0 : sal_Bool bPosture = sal_False;
1223 0 : sal_Bool bCaseMap = sal_False;
1224 0 : FontItalic eItalic = ITALIC_NONE;
1225 0 : SvxCaseMap eCaseMap = SVX_CASEMAP_NOT_MAPPED;
1226 :
1227 : // normal | italic || small-caps | oblique || small-caps | small-caps
1228 : // (wobei nor noch normal | italic und oblique zulaessig sind
1229 :
1230 : // der Wert kann zwei Werte enthalten!
1231 0 : for( sal_uInt16 i=0; pExpr && i<2; i++ )
1232 : {
1233 : // Auch hier hinterlaesst MS-IEs Parser seine Spuren
1234 0 : if( (CSS1_IDENT==pExpr->GetType() || CSS1_STRING==pExpr->GetType()) &&
1235 0 : !pExpr->GetOp() )
1236 : {
1237 0 : const String& rValue = pExpr->GetString();
1238 : // erstmal pruefen, ob es ein Italic-Wert oder 'normal' ist
1239 : sal_uInt16 nItalic;
1240 0 : if( SvxCSS1Parser::GetEnum( aFontStyleTable, rValue, nItalic ) )
1241 : {
1242 0 : eItalic = (FontItalic)nItalic;
1243 0 : if( !bCaseMap && ITALIC_NONE==eItalic )
1244 : {
1245 : // fuer 'normal' muessen wir auch die case-map aussch.
1246 0 : eCaseMap = SVX_CASEMAP_NOT_MAPPED;
1247 0 : bCaseMap = sal_True;
1248 : }
1249 0 : bPosture = sal_True;
1250 : }
1251 0 : else if( !bCaseMap &&
1252 0 : rValue.EqualsIgnoreCaseAscii(sCSS1_PV_small_caps) )
1253 : {
1254 0 : eCaseMap = SVX_CASEMAP_KAPITAELCHEN;
1255 0 : bCaseMap = sal_True;
1256 : }
1257 : }
1258 :
1259 : // den naechsten Ausdruck holen
1260 0 : pExpr = pExpr->GetNext();
1261 : }
1262 :
1263 0 : if( bPosture )
1264 : {
1265 0 : SvxPostureItem aPosture( eItalic, aItemIds.nPosture );
1266 0 : if( rParser.IsSetWesternProps() )
1267 0 : rItemSet.Put( aPosture );
1268 0 : if( rParser.IsSetCJKProps() )
1269 : {
1270 0 : aPosture.SetWhich( aItemIds.nPostureCJK );
1271 0 : rItemSet.Put( aPosture );
1272 : }
1273 0 : if( rParser.IsSetCTLProps() )
1274 : {
1275 0 : aPosture.SetWhich( aItemIds.nPostureCTL );
1276 0 : rItemSet.Put( aPosture );
1277 0 : }
1278 : }
1279 :
1280 0 : if( bCaseMap )
1281 0 : rItemSet.Put( SvxCaseMapItem( eCaseMap, aItemIds.nCaseMap ) );
1282 0 : }
1283 :
1284 :
1285 0 : static void ParseCSS1_font_variant( const CSS1Expression *pExpr,
1286 : SfxItemSet &rItemSet,
1287 : SvxCSS1PropertyInfo& /*rPropInfo*/,
1288 : const SvxCSS1Parser& /*rParser*/ )
1289 : {
1290 : OSL_ENSURE( pExpr, "no expression" );
1291 :
1292 : // normal | small-caps
1293 :
1294 0 : switch( pExpr->GetType() )
1295 : {
1296 : case CSS1_IDENT:
1297 : {
1298 : sal_uInt16 nCaseMap;
1299 0 : if( SvxCSS1Parser::GetEnum( aFontVariantTable, pExpr->GetString(),
1300 0 : nCaseMap ) )
1301 : {
1302 : rItemSet.Put( SvxCaseMapItem( (SvxCaseMap)nCaseMap,
1303 0 : aItemIds.nCaseMap ) );
1304 : }
1305 : }
1306 : default:
1307 : ;
1308 : }
1309 0 : }
1310 :
1311 0 : static void ParseCSS1_text_transform( const CSS1Expression *pExpr,
1312 : SfxItemSet &rItemSet,
1313 : SvxCSS1PropertyInfo& /*rPropInfo*/,
1314 : const SvxCSS1Parser& /*rParser*/ )
1315 : {
1316 : OSL_ENSURE( pExpr, "no expression" );
1317 :
1318 : // none | capitalize | uppercase | lowercase
1319 :
1320 0 : switch( pExpr->GetType() )
1321 : {
1322 : case CSS1_IDENT:
1323 : {
1324 : sal_uInt16 nCaseMap;
1325 0 : if( SvxCSS1Parser::GetEnum( aTextTransformTable, pExpr->GetString(),
1326 0 : nCaseMap ) )
1327 : {
1328 : rItemSet.Put( SvxCaseMapItem( (SvxCaseMap)nCaseMap,
1329 0 : aItemIds.nCaseMap ) );
1330 : }
1331 : }
1332 : default:
1333 : ;
1334 : }
1335 0 : }
1336 :
1337 :
1338 0 : static void ParseCSS1_color( const CSS1Expression *pExpr,
1339 : SfxItemSet &rItemSet,
1340 : SvxCSS1PropertyInfo& /*rPropInfo*/,
1341 : const SvxCSS1Parser& /*rParser*/ )
1342 : {
1343 : OSL_ENSURE( pExpr, "no expression" );
1344 :
1345 0 : switch( pExpr->GetType() )
1346 : {
1347 : case CSS1_IDENT:
1348 : case CSS1_RGB:
1349 : case CSS1_HEXCOLOR:
1350 : case CSS1_STRING: // Wegen MS-IE
1351 : {
1352 0 : Color aColor;
1353 0 : if( pExpr->GetColor( aColor ) )
1354 0 : rItemSet.Put( SvxColorItem( aColor, aItemIds.nColor ) );
1355 : }
1356 0 : break;
1357 : default:
1358 : ;
1359 : }
1360 0 : }
1361 :
1362 0 : static void ParseCSS1_direction( const CSS1Expression *pExpr,
1363 : SfxItemSet &rItemSet,
1364 : SvxCSS1PropertyInfo& /*rPropInfo*/,
1365 : const SvxCSS1Parser& /*rParser*/ )
1366 : {
1367 : OSL_ENSURE( pExpr, "no expression" );
1368 :
1369 : sal_uInt16 nDir;
1370 0 : switch( pExpr->GetType() )
1371 : {
1372 : case CSS1_IDENT:
1373 : case CSS1_STRING:
1374 0 : if( SvxCSS1Parser::GetEnum( aDirectionTable, pExpr->GetString(),
1375 0 : nDir ) )
1376 : {
1377 : rItemSet.Put( SvxFrameDirectionItem(
1378 : static_cast < SvxFrameDirection >( nDir ),
1379 0 : aItemIds.nDirection ) );
1380 : }
1381 0 : break;
1382 : default:
1383 : ;
1384 : }
1385 0 : }
1386 :
1387 :
1388 0 : static void MergeHori( SvxGraphicPosition& ePos, SvxGraphicPosition eHori )
1389 : {
1390 : OSL_ENSURE( GPOS_LT==eHori || GPOS_MT==eHori || GPOS_RT==eHori,
1391 : "vertical position not at the top" );
1392 :
1393 0 : switch( ePos )
1394 : {
1395 : case GPOS_LT:
1396 : case GPOS_MT:
1397 : case GPOS_RT:
1398 0 : ePos = eHori;
1399 0 : break;
1400 :
1401 : case GPOS_LM:
1402 : case GPOS_MM:
1403 : case GPOS_RM:
1404 0 : ePos = GPOS_LT==eHori ? GPOS_LM : (GPOS_MT==eHori ? GPOS_MM : GPOS_RM);
1405 0 : break;
1406 :
1407 : case GPOS_LB:
1408 : case GPOS_MB:
1409 : case GPOS_RB:
1410 0 : ePos = GPOS_LT==eHori ? GPOS_LB : (GPOS_MT==eHori ? GPOS_MB : GPOS_RB);
1411 0 : break;
1412 :
1413 : default:
1414 : ;
1415 : }
1416 0 : }
1417 :
1418 0 : static void MergeVert( SvxGraphicPosition& ePos, SvxGraphicPosition eVert )
1419 : {
1420 : OSL_ENSURE( GPOS_LT==eVert || GPOS_LM==eVert || GPOS_LB==eVert,
1421 : "horizontal position not on the left side" );
1422 :
1423 0 : switch( ePos )
1424 : {
1425 : case GPOS_LT:
1426 : case GPOS_LM:
1427 : case GPOS_LB:
1428 0 : ePos = eVert;
1429 0 : break;
1430 :
1431 : case GPOS_MT:
1432 : case GPOS_MM:
1433 : case GPOS_MB:
1434 0 : ePos = GPOS_LT==eVert ? GPOS_MT : (GPOS_LM==eVert ? GPOS_MM : GPOS_MB);
1435 0 : break;
1436 :
1437 : case GPOS_RT:
1438 : case GPOS_RM:
1439 : case GPOS_RB:
1440 0 : ePos = GPOS_LT==eVert ? GPOS_RT : (GPOS_LM==eVert ? GPOS_RM : GPOS_RB);
1441 0 : break;
1442 :
1443 : default:
1444 : ;
1445 : }
1446 0 : }
1447 :
1448 0 : static void ParseCSS1_background( const CSS1Expression *pExpr,
1449 : SfxItemSet &rItemSet,
1450 : SvxCSS1PropertyInfo& /*rPropInfo*/,
1451 : const SvxCSS1Parser& rParser )
1452 : {
1453 : OSL_ENSURE( pExpr, "no expression" );
1454 :
1455 0 : Color aColor;
1456 0 : String aURL;
1457 :
1458 0 : sal_Bool bColor = sal_False, bTransparent = sal_False;
1459 0 : SvxGraphicPosition eRepeat = GPOS_TILED;
1460 0 : SvxGraphicPosition ePos = GPOS_LT;
1461 0 : sal_Bool bHori = sal_False, bVert = sal_False;
1462 :
1463 0 : while( pExpr && !pExpr->GetOp() )
1464 : {
1465 0 : switch( pExpr->GetType() )
1466 : {
1467 : case CSS1_URL:
1468 0 : pExpr->GetURL( aURL );
1469 0 : break;
1470 :
1471 : case CSS1_RGB:
1472 0 : bColor = pExpr->GetColor( aColor );
1473 0 : break;
1474 :
1475 : case CSS1_LENGTH:
1476 : case CSS1_PIXLENGTH:
1477 : {
1478 : // da wir keine absolute Positionierung koennen,
1479 : // unterscheiden wir nur zwischen 0 und !0. Deshalb
1480 : // koennen Pixel auch wie alle anderen Einheiten behandelt
1481 : // werden.
1482 :
1483 0 : sal_uLong nLength = (sal_uLong)pExpr->GetNumber();
1484 0 : if( !bHori )
1485 : {
1486 0 : ePos = nLength ? GPOS_MM : GPOS_LT;
1487 0 : bHori = sal_True;
1488 : }
1489 0 : else if( !bVert )
1490 : {
1491 0 : MergeVert( ePos, (nLength ? GPOS_LM : GPOS_LT) );
1492 0 : bVert = sal_True;
1493 : }
1494 : }
1495 0 : break;
1496 :
1497 : case CSS1_PERCENTAGE:
1498 : {
1499 : // die %-Angabe wird auf den enum abgebildet
1500 :
1501 0 : sal_uInt16 nPerc = (sal_uInt16)pExpr->GetNumber();
1502 0 : if( !bHori )
1503 : {
1504 : ePos = nPerc < 25 ? GPOS_LT
1505 : : (nPerc < 75 ? GPOS_MM
1506 0 : : GPOS_RB);
1507 : }
1508 0 : else if( !bVert )
1509 : {
1510 : SvxGraphicPosition eVert =
1511 : nPerc < 25 ? GPOS_LT: (nPerc < 75 ? GPOS_LM
1512 0 : : GPOS_LB);
1513 0 : MergeVert( ePos, eVert );
1514 : }
1515 : }
1516 0 : break;
1517 :
1518 : case CSS1_IDENT:
1519 : case CSS1_HEXCOLOR:
1520 : case CSS1_STRING: // Wegen MS-IE
1521 : {
1522 : sal_uInt16 nEnum;
1523 0 : const String &rValue = pExpr->GetString();
1524 0 : if( rValue.EqualsIgnoreCaseAscii( sCSS1_PV_transparent ) )
1525 : {
1526 0 : bTransparent = sal_True;
1527 : }
1528 0 : if( SvxCSS1Parser::GetEnum( aBGRepeatTable, rValue, nEnum ) )
1529 : {
1530 0 : eRepeat = (SvxGraphicPosition)nEnum;
1531 : }
1532 0 : else if( SvxCSS1Parser::GetEnum( aBGHoriPosTable, rValue, nEnum ) )
1533 : {
1534 : // <position>, horizontal
1535 0 : MergeHori( ePos, (SvxGraphicPosition)nEnum );
1536 : }
1537 0 : else if( SvxCSS1Parser::GetEnum( aBGVertPosTable, rValue, nEnum ) )
1538 : {
1539 : // <position>, vertikal
1540 0 : MergeVert( ePos, (SvxGraphicPosition)nEnum );
1541 : }
1542 0 : else if( !bColor )
1543 : {
1544 : // <color>
1545 0 : bColor = pExpr->GetColor( aColor );
1546 : }
1547 : // <scroll> kennen wir nicht
1548 : }
1549 0 : break;
1550 :
1551 : default:
1552 : ;
1553 : }
1554 :
1555 0 : pExpr = pExpr->GetNext();
1556 : }
1557 :
1558 : // transparent schlaegt alles
1559 0 : if( bTransparent )
1560 : {
1561 0 : bColor = sal_False;
1562 0 : aURL.Erase();
1563 : }
1564 :
1565 : // repeat hat prio gegenueber einer Position
1566 0 : if( GPOS_NONE == eRepeat )
1567 0 : eRepeat = ePos;
1568 :
1569 0 : if( bTransparent || bColor || aURL.Len() )
1570 : {
1571 0 : SvxBrushItem aBrushItem( aItemIds.nBrush );
1572 :
1573 0 : if( bTransparent )
1574 0 : aBrushItem.SetColor( Color(COL_TRANSPARENT));
1575 0 : else if( bColor )
1576 0 : aBrushItem.SetColor( aColor );
1577 :
1578 0 : if( aURL.Len() )
1579 : {
1580 0 : aBrushItem.SetGraphicLink( URIHelper::SmartRel2Abs( INetURLObject( rParser.GetBaseURL()), aURL, Link(), false ) );
1581 0 : aBrushItem.SetGraphicPos( eRepeat );
1582 : }
1583 :
1584 0 : rItemSet.Put( aBrushItem );
1585 0 : }
1586 0 : }
1587 :
1588 0 : static void ParseCSS1_background_color( const CSS1Expression *pExpr,
1589 : SfxItemSet &rItemSet,
1590 : SvxCSS1PropertyInfo& /*rPropInfo*/,
1591 : const SvxCSS1Parser& /*rParser*/ )
1592 : {
1593 : OSL_ENSURE( pExpr, "no expression" );
1594 :
1595 0 : Color aColor;
1596 :
1597 0 : sal_Bool bColor = sal_False, bTransparent = sal_False;
1598 :
1599 0 : switch( pExpr->GetType() )
1600 : {
1601 : case CSS1_RGB:
1602 0 : bColor = pExpr->GetColor( aColor );
1603 0 : break;
1604 : case CSS1_IDENT:
1605 : case CSS1_HEXCOLOR:
1606 : case CSS1_STRING: // Wegen MS-IE
1607 0 : if( pExpr->GetString().EqualsIgnoreCaseAscii( sCSS1_PV_transparent ) )
1608 : {
1609 0 : bTransparent = sal_True;
1610 : }
1611 : else
1612 : {
1613 : // <color>
1614 0 : bColor = pExpr->GetColor( aColor );
1615 : }
1616 0 : break;
1617 : default:
1618 : ;
1619 : }
1620 :
1621 0 : if( bTransparent || bColor )
1622 : {
1623 0 : SvxBrushItem aBrushItem( aItemIds.nBrush );
1624 :
1625 0 : if( bTransparent )
1626 0 : aBrushItem.SetColor( Color(COL_TRANSPARENT) );
1627 0 : else if( bColor )
1628 0 : aBrushItem.SetColor( aColor);
1629 :
1630 0 : rItemSet.Put( aBrushItem );
1631 : }
1632 0 : }
1633 :
1634 :
1635 0 : static void ParseCSS1_line_height( const CSS1Expression *pExpr,
1636 : SfxItemSet &rItemSet,
1637 : SvxCSS1PropertyInfo& /*rPropInfo*/,
1638 : const SvxCSS1Parser& rParser )
1639 : {
1640 : OSL_ENSURE( pExpr, "no expression" );
1641 :
1642 0 : sal_uInt16 nHeight = 0;
1643 0 : sal_uInt8 nPropHeight = 0;
1644 :
1645 0 : switch( pExpr->GetType() )
1646 : {
1647 : case CSS1_LENGTH:
1648 0 : nHeight = (sal_uInt16)pExpr->GetULength();
1649 0 : break;
1650 : case CSS1_PIXLENGTH:
1651 : {
1652 0 : long nPWidth = 0;
1653 0 : long nPHeight = (long)pExpr->GetNumber();
1654 0 : SvxCSS1Parser::PixelToTwip( nPWidth, nPHeight );
1655 0 : nHeight = (sal_uInt16)nPHeight;
1656 : }
1657 0 : break;
1658 : case CSS1_PERCENTAGE:
1659 : {
1660 0 : sal_uInt16 nPHeight = (sal_uInt16)pExpr->GetNumber();
1661 0 : nPropHeight = nPHeight <= 200 ? (sal_uInt8)nPHeight : 200;
1662 : }
1663 0 : break;
1664 : case CSS1_NUMBER:
1665 : {
1666 0 : sal_uInt16 nPHeight = (sal_uInt16)(pExpr->GetNumber() * 100);
1667 0 : nPropHeight = nPHeight <= 200 ? (sal_uInt8)nPHeight : 200;
1668 : }
1669 0 : break;
1670 : default:
1671 : ;
1672 : }
1673 :
1674 0 : if( nHeight )
1675 : {
1676 0 : if( nHeight < rParser.GetMinFixLineSpace() )
1677 0 : nHeight = rParser.GetMinFixLineSpace();
1678 0 : SvxLineSpacingItem aLSItem( nHeight, aItemIds.nLineSpacing );
1679 0 : aLSItem.SetLineHeight( nHeight );
1680 : // interpret <line-height> attribute as minimum line height
1681 0 : aLSItem.GetLineSpaceRule() = SVX_LINE_SPACE_MIN;
1682 0 : aLSItem.GetInterLineSpaceRule() = SVX_INTER_LINE_SPACE_OFF;
1683 0 : rItemSet.Put( aLSItem );
1684 : }
1685 0 : else if( nPropHeight )
1686 : {
1687 0 : SvxLineSpacingItem aLSItem( nPropHeight, aItemIds.nLineSpacing );
1688 0 : aLSItem.GetLineSpaceRule() = SVX_LINE_SPACE_AUTO;
1689 0 : if( 100 == nPropHeight )
1690 0 : aLSItem.GetInterLineSpaceRule() = SVX_INTER_LINE_SPACE_OFF;
1691 : else
1692 0 : aLSItem.SetPropLineSpace( nPropHeight );
1693 0 : rItemSet.Put( aLSItem );
1694 : }
1695 :
1696 0 : }
1697 :
1698 :
1699 0 : static void ParseCSS1_font( const CSS1Expression *pExpr,
1700 : SfxItemSet &rItemSet,
1701 : SvxCSS1PropertyInfo& rPropInfo,
1702 : const SvxCSS1Parser& rParser )
1703 : {
1704 : OSL_ENSURE( pExpr, "no expression" );
1705 :
1706 0 : FontItalic eItalic = ITALIC_NONE;
1707 0 : SvxCaseMap eCaseMap = SVX_CASEMAP_NOT_MAPPED;
1708 0 : FontWeight eWeight = WEIGHT_NORMAL;
1709 :
1710 : // [ <font-style> || <font-variant> || <font-weight> ] ?
1711 0 : while( pExpr && !pExpr->GetOp() &&
1712 0 : (CSS1_IDENT==pExpr->GetType() ||
1713 0 : CSS1_STRING==pExpr->GetType() ||
1714 0 : CSS1_NUMBER==pExpr->GetType()) )
1715 : {
1716 0 : if( CSS1_IDENT==pExpr->GetType() ||
1717 0 : CSS1_STRING==pExpr->GetType() )
1718 : {
1719 0 : const String& rValue = pExpr->GetString();
1720 :
1721 : sal_uInt16 nEnum;
1722 :
1723 0 : if( SvxCSS1Parser::GetEnum( aFontStyleTable, rValue, nEnum ) )
1724 : {
1725 0 : eItalic = (FontItalic)nEnum;
1726 : }
1727 0 : else if( SvxCSS1Parser::GetEnum( aFontVariantTable, rValue, nEnum ) )
1728 : {
1729 0 : eCaseMap = (SvxCaseMap)nEnum;
1730 : }
1731 0 : else if( SvxCSS1Parser::GetEnum( aFontWeightTable, rValue, nEnum ) )
1732 : {
1733 0 : eWeight = (FontWeight)nEnum;
1734 : }
1735 : }
1736 : else
1737 : {
1738 0 : eWeight = (sal_uInt16)pExpr->GetNumber() > 400 ? WEIGHT_BOLD
1739 0 : : WEIGHT_NORMAL;
1740 : }
1741 :
1742 0 : pExpr = pExpr->GetNext();
1743 : }
1744 :
1745 0 : if( !pExpr || pExpr->GetOp() )
1746 : return;
1747 :
1748 : // Da "font" alle Werte zurecksetzt, fuer die nichts angegeben ist,
1749 : // tun wir das hier.
1750 0 : SvxPostureItem aPosture( eItalic, aItemIds.nPosture );
1751 0 : if( rParser.IsSetWesternProps() )
1752 0 : rItemSet.Put( aPosture );
1753 0 : if( rParser.IsSetCJKProps() )
1754 : {
1755 0 : aPosture.SetWhich( aItemIds.nPostureCJK );
1756 0 : rItemSet.Put( aPosture );
1757 : }
1758 0 : if( rParser.IsSetCTLProps() )
1759 : {
1760 0 : aPosture.SetWhich( aItemIds.nPostureCTL );
1761 0 : rItemSet.Put( aPosture );
1762 : }
1763 :
1764 0 : rItemSet.Put( SvxCaseMapItem( eCaseMap, aItemIds.nCaseMap ) );
1765 :
1766 0 : SvxWeightItem aWeight( eWeight, aItemIds.nWeight );
1767 0 : if( rParser.IsSetWesternProps() )
1768 0 : rItemSet.Put( aWeight );
1769 0 : if( rParser.IsSetCJKProps() )
1770 : {
1771 0 : aWeight.SetWhich( aItemIds.nWeightCJK );
1772 0 : rItemSet.Put( aWeight );
1773 : }
1774 0 : if( rParser.IsSetCTLProps() )
1775 : {
1776 0 : aWeight.SetWhich( aItemIds.nWeightCTL );
1777 0 : rItemSet.Put( aWeight );
1778 : }
1779 :
1780 :
1781 : // font-size
1782 0 : CSS1Expression aExpr( pExpr->GetType(), pExpr->GetString(),
1783 0 : pExpr->GetNumber() );
1784 0 : ParseCSS1_font_size( &aExpr, rItemSet, rPropInfo, rParser );
1785 0 : pExpr = pExpr->GetNext();
1786 :
1787 0 : if( !pExpr )
1788 : return;
1789 :
1790 : // [ '/' line-height ]?
1791 0 : if( '/' == pExpr->GetOp() )
1792 : {
1793 : // '/' line-height
1794 0 : aExpr.Set( pExpr->GetType(), pExpr->GetString(), pExpr->GetNumber() );
1795 0 : ParseCSS1_line_height( &aExpr, rItemSet, rPropInfo, rParser );
1796 :
1797 0 : pExpr = pExpr->GetNext();
1798 : }
1799 :
1800 0 : if( !pExpr || pExpr->GetOp() )
1801 : return;
1802 :
1803 : // font-family
1804 0 : ParseCSS1_font_family( pExpr, rItemSet, rPropInfo, rParser );
1805 : }
1806 :
1807 :
1808 0 : static void ParseCSS1_letter_spacing( const CSS1Expression *pExpr,
1809 : SfxItemSet &rItemSet,
1810 : SvxCSS1PropertyInfo& /*rPropInfo*/,
1811 : const SvxCSS1Parser& /*rParser*/ )
1812 : {
1813 : OSL_ENSURE( pExpr, "no expression" );
1814 :
1815 0 : switch( pExpr->GetType() )
1816 : {
1817 : case CSS1_LENGTH:
1818 0 : rItemSet.Put( SvxKerningItem( (short)pExpr->GetSLength(),
1819 0 : aItemIds.nKerning ) );
1820 0 : break;
1821 :
1822 : case CSS1_PIXLENGTH:
1823 : {
1824 0 : long nPWidth = (long)pExpr->GetNumber();
1825 0 : long nPHeight = 0;
1826 0 : SvxCSS1Parser::PixelToTwip( nPWidth, nPHeight );
1827 0 : rItemSet.Put( SvxKerningItem( (short)nPWidth, aItemIds.nKerning ) );
1828 : }
1829 0 : break;
1830 :
1831 : case CSS1_NUMBER:
1832 0 : if( pExpr->GetNumber() == 0 )
1833 : {
1834 : // eigentlich unnoetig, aber wir sind ja tollerant
1835 0 : rItemSet.Put( SvxKerningItem( (short)0, aItemIds.nKerning ) );
1836 : }
1837 0 : break;
1838 :
1839 : case CSS1_IDENT:
1840 : case CSS1_STRING: // Vorschtshalber auch MS-IE
1841 0 : if( pExpr->GetString().EqualsIgnoreCaseAscii(sCSS1_PV_normal) )
1842 : {
1843 0 : rItemSet.Put( SvxKerningItem( (short)0, aItemIds.nKerning ) );
1844 : }
1845 0 : break;
1846 : default:
1847 : ;
1848 : }
1849 0 : }
1850 :
1851 :
1852 0 : static void ParseCSS1_text_decoration( const CSS1Expression *pExpr,
1853 : SfxItemSet &rItemSet,
1854 : SvxCSS1PropertyInfo& /*rPropInfo*/,
1855 : const SvxCSS1Parser& /*rParser*/ )
1856 : {
1857 : OSL_ENSURE( pExpr, "no expression" );
1858 :
1859 0 : sal_Bool bUnderline = sal_False;
1860 0 : sal_Bool bOverline = sal_False;
1861 0 : sal_Bool bCrossedOut = sal_False;
1862 0 : sal_Bool bBlink = sal_False;
1863 0 : sal_Bool bBlinkOn = sal_False;
1864 0 : FontUnderline eUnderline = UNDERLINE_NONE;
1865 0 : FontUnderline eOverline = UNDERLINE_NONE;
1866 0 : FontStrikeout eCrossedOut = STRIKEOUT_NONE;
1867 :
1868 : // der Wert kann zwei Werte enthalten! Und MS-IE auch Strings
1869 0 : while( pExpr && (pExpr->GetType() == CSS1_IDENT ||
1870 0 : pExpr->GetType() == CSS1_STRING) && !pExpr->GetOp() )
1871 : {
1872 0 : String aValue = pExpr->GetString();
1873 0 : aValue.ToLowerAscii();
1874 0 : sal_Bool bKnown = sal_False;
1875 :
1876 0 : switch( aValue.GetChar( 0 ) )
1877 : {
1878 : case 'n':
1879 0 : if( aValue.EqualsAscii( sCSS1_PV_none ) )
1880 : {
1881 0 : bUnderline = sal_True;
1882 0 : eUnderline = UNDERLINE_NONE;
1883 :
1884 0 : bOverline = sal_True;
1885 0 : eOverline = UNDERLINE_NONE;
1886 :
1887 0 : bCrossedOut = sal_True;
1888 0 : eCrossedOut = STRIKEOUT_NONE;
1889 :
1890 0 : bBlink = sal_True;
1891 0 : bBlinkOn = sal_False;
1892 :
1893 0 : bKnown = sal_True;
1894 : }
1895 0 : break;
1896 :
1897 : case 'u':
1898 0 : if( aValue.EqualsAscii( sCSS1_PV_underline ) )
1899 : {
1900 0 : bUnderline = sal_True;
1901 0 : eUnderline = UNDERLINE_SINGLE;
1902 :
1903 0 : bKnown = sal_True;
1904 : }
1905 0 : break;
1906 :
1907 : case 'o':
1908 0 : if( aValue.EqualsAscii( sCSS1_PV_overline ) )
1909 : {
1910 0 : bOverline = sal_True;
1911 0 : eOverline = UNDERLINE_SINGLE;
1912 :
1913 0 : bKnown = sal_True;
1914 : }
1915 0 : break;
1916 :
1917 : case 'l':
1918 0 : if( aValue.EqualsAscii( sCSS1_PV_line_through ) )
1919 : {
1920 0 : bCrossedOut = sal_True;
1921 0 : eCrossedOut = STRIKEOUT_SINGLE;
1922 :
1923 0 : bKnown = sal_True;
1924 : }
1925 0 : break;
1926 :
1927 : case 'b':
1928 0 : if( aValue.EqualsAscii( sCSS1_PV_blink ) )
1929 : {
1930 0 : bBlink = sal_True;
1931 0 : bBlinkOn = sal_True;
1932 :
1933 0 : bKnown = sal_True;
1934 : }
1935 0 : break;
1936 : }
1937 :
1938 0 : if( !bKnown )
1939 : {
1940 0 : bUnderline = sal_True;
1941 0 : eUnderline = UNDERLINE_SINGLE;
1942 : }
1943 :
1944 0 : pExpr = pExpr->GetNext();
1945 0 : }
1946 :
1947 0 : if( bUnderline )
1948 0 : rItemSet.Put( SvxUnderlineItem( eUnderline, aItemIds.nUnderline ) );
1949 :
1950 0 : if( bOverline )
1951 0 : rItemSet.Put( SvxOverlineItem( eOverline, aItemIds.nOverline ) );
1952 :
1953 0 : if( bCrossedOut )
1954 0 : rItemSet.Put( SvxCrossedOutItem( eCrossedOut, aItemIds.nCrossedOut ) );
1955 :
1956 0 : if( bBlink )
1957 0 : rItemSet.Put( SvxBlinkItem( bBlinkOn, aItemIds.nBlink ) );
1958 0 : }
1959 :
1960 :
1961 0 : static void ParseCSS1_text_align( const CSS1Expression *pExpr,
1962 : SfxItemSet &rItemSet,
1963 : SvxCSS1PropertyInfo& /*rPropInfo*/,
1964 : const SvxCSS1Parser& /*rParser*/ )
1965 : {
1966 : OSL_ENSURE( pExpr, "no expression" );
1967 :
1968 0 : if( CSS1_IDENT==pExpr->GetType() ||
1969 0 : CSS1_STRING==pExpr->GetType() ) // MS-IE, mal wieder
1970 : {
1971 : sal_uInt16 nAdjust;
1972 0 : if( SvxCSS1Parser::GetEnum( aTextAlignTable, pExpr->GetString(),
1973 0 : nAdjust ) )
1974 : {
1975 : rItemSet.Put( SvxAdjustItem( (SvxAdjust)nAdjust,
1976 0 : aItemIds.nAdjust ) );
1977 : }
1978 : }
1979 0 : }
1980 :
1981 :
1982 0 : static void ParseCSS1_text_indent( const CSS1Expression *pExpr,
1983 : SfxItemSet &rItemSet,
1984 : SvxCSS1PropertyInfo& rPropInfo,
1985 : const SvxCSS1Parser& /*rParser*/ )
1986 : {
1987 : OSL_ENSURE( pExpr, "no expression" );
1988 :
1989 0 : short nIndent = 0;
1990 0 : sal_Bool bSet = sal_False;
1991 0 : switch( pExpr->GetType() )
1992 : {
1993 : case CSS1_LENGTH:
1994 0 : nIndent = (short)pExpr->GetSLength();
1995 0 : bSet = sal_True;
1996 0 : break;
1997 : case CSS1_PIXLENGTH:
1998 : {
1999 0 : long nPWidth = (long)pExpr->GetNumber();
2000 0 : long nPHeight = 0;
2001 0 : SvxCSS1Parser::PixelToTwip( nPWidth, nPHeight );
2002 0 : nIndent = (short)nPWidth;
2003 0 : bSet = sal_True;
2004 : }
2005 0 : break;
2006 : case CSS1_PERCENTAGE:
2007 : // koennen wir nicht
2008 0 : break;
2009 : default:
2010 : ;
2011 : }
2012 :
2013 0 : if( bSet )
2014 : {
2015 : const SfxPoolItem* pItem;
2016 0 : if( SFX_ITEM_SET == rItemSet.GetItemState( aItemIds.nLRSpace, sal_False,
2017 0 : &pItem ) )
2018 : {
2019 0 : SvxLRSpaceItem aLRItem( *((const SvxLRSpaceItem*)pItem) );
2020 0 : aLRItem.SetTxtFirstLineOfst( nIndent );
2021 0 : rItemSet.Put( aLRItem );
2022 : }
2023 : else
2024 : {
2025 0 : SvxLRSpaceItem aLRItem( aItemIds.nLRSpace );
2026 0 : aLRItem.SetTxtFirstLineOfst( nIndent );
2027 0 : rItemSet.Put( aLRItem );
2028 : }
2029 0 : rPropInfo.bTextIndent = sal_True;
2030 : }
2031 0 : }
2032 :
2033 :
2034 0 : static void ParseCSS1_margin_left( const CSS1Expression *pExpr,
2035 : SfxItemSet &rItemSet,
2036 : SvxCSS1PropertyInfo& rPropInfo,
2037 : const SvxCSS1Parser& /*rParser*/ )
2038 : {
2039 : OSL_ENSURE( pExpr, "no expression" );
2040 :
2041 0 : long nLeft = 0;
2042 0 : sal_Bool bSet = sal_False;
2043 0 : switch( pExpr->GetType() )
2044 : {
2045 : case CSS1_LENGTH:
2046 : {
2047 0 : nLeft = pExpr->GetSLength();
2048 0 : bSet = sal_True;
2049 : }
2050 0 : break;
2051 : case CSS1_PIXLENGTH:
2052 : {
2053 0 : nLeft = (long)pExpr->GetNumber();
2054 0 : long nPHeight = 0;
2055 0 : SvxCSS1Parser::PixelToTwip( nLeft, nPHeight );
2056 0 : bSet = sal_True;
2057 : }
2058 0 : break;
2059 : case CSS1_PERCENTAGE:
2060 : // koennen wir nicht
2061 0 : break;
2062 : default:
2063 : ;
2064 : }
2065 :
2066 0 : if( bSet )
2067 : {
2068 0 : rPropInfo.nLeftMargin = nLeft;
2069 0 : if( nLeft < 0 )
2070 0 : nLeft = 0;
2071 : const SfxPoolItem* pItem;
2072 0 : if( SFX_ITEM_SET == rItemSet.GetItemState( aItemIds.nLRSpace, sal_False,
2073 0 : &pItem ) )
2074 : {
2075 0 : SvxLRSpaceItem aLRItem( *((const SvxLRSpaceItem*)pItem) );
2076 0 : aLRItem.SetTxtLeft( (sal_uInt16)nLeft );
2077 0 : rItemSet.Put( aLRItem );
2078 : }
2079 : else
2080 : {
2081 0 : SvxLRSpaceItem aLRItem( aItemIds.nLRSpace );
2082 0 : aLRItem.SetTxtLeft( (sal_uInt16)nLeft );
2083 0 : rItemSet.Put( aLRItem );
2084 : }
2085 0 : rPropInfo.bLeftMargin = sal_True;
2086 : }
2087 0 : }
2088 :
2089 :
2090 0 : static void ParseCSS1_margin_right( const CSS1Expression *pExpr,
2091 : SfxItemSet &rItemSet,
2092 : SvxCSS1PropertyInfo& rPropInfo,
2093 : const SvxCSS1Parser& /*rParser*/ )
2094 : {
2095 : OSL_ENSURE( pExpr, "no expression" );
2096 :
2097 0 : long nRight = 0;
2098 0 : sal_Bool bSet = sal_False;
2099 0 : switch( pExpr->GetType() )
2100 : {
2101 : case CSS1_LENGTH:
2102 : {
2103 0 : nRight = pExpr->GetSLength();
2104 0 : bSet = sal_True;
2105 : }
2106 0 : break;
2107 : case CSS1_PIXLENGTH:
2108 : {
2109 0 : nRight = (long)pExpr->GetNumber();
2110 0 : long nPHeight = 0;
2111 0 : SvxCSS1Parser::PixelToTwip( nRight, nPHeight );
2112 0 : bSet = sal_True;
2113 : }
2114 0 : break;
2115 : case CSS1_PERCENTAGE:
2116 : // koennen wir nicht
2117 0 : break;
2118 : default:
2119 : ;
2120 : }
2121 :
2122 0 : if( bSet )
2123 : {
2124 0 : rPropInfo.nRightMargin = nRight;
2125 0 : if( nRight < 0 )
2126 0 : nRight = 0;
2127 : const SfxPoolItem* pItem;
2128 0 : if( SFX_ITEM_SET == rItemSet.GetItemState( aItemIds.nLRSpace, sal_False,
2129 0 : &pItem ) )
2130 : {
2131 0 : SvxLRSpaceItem aLRItem( *((const SvxLRSpaceItem*)pItem) );
2132 0 : aLRItem.SetRight( (sal_uInt16)nRight );
2133 0 : rItemSet.Put( aLRItem );
2134 : }
2135 : else
2136 : {
2137 0 : SvxLRSpaceItem aLRItem( aItemIds.nLRSpace );
2138 0 : aLRItem.SetRight( (sal_uInt16)nRight );
2139 0 : rItemSet.Put( aLRItem );
2140 : }
2141 0 : rPropInfo.bRightMargin = sal_True;
2142 : }
2143 0 : }
2144 :
2145 :
2146 0 : static void ParseCSS1_margin_top( const CSS1Expression *pExpr,
2147 : SfxItemSet &rItemSet,
2148 : SvxCSS1PropertyInfo& rPropInfo,
2149 : const SvxCSS1Parser& /*rParser*/ )
2150 : {
2151 : OSL_ENSURE( pExpr, "no expression" );
2152 :
2153 0 : sal_uInt16 nUpper = 0;
2154 0 : sal_Bool bSet = sal_False;
2155 0 : switch( pExpr->GetType() )
2156 : {
2157 : case CSS1_LENGTH:
2158 : {
2159 0 : long nTmp = pExpr->GetSLength();
2160 0 : if( nTmp < 0 )
2161 0 : nTmp = 0;
2162 0 : nUpper = (sal_uInt16)nTmp;
2163 0 : bSet = sal_True;
2164 : }
2165 0 : break;
2166 : case CSS1_PIXLENGTH:
2167 : {
2168 0 : long nPWidth = 0;
2169 0 : long nPHeight = (long)pExpr->GetNumber();
2170 0 : if( nPHeight < 0 )
2171 0 : nPHeight = 0;
2172 0 : SvxCSS1Parser::PixelToTwip( nPWidth, nPHeight );
2173 0 : nUpper = (sal_uInt16)nPHeight;
2174 0 : bSet = sal_True;
2175 : }
2176 0 : break;
2177 : case CSS1_PERCENTAGE:
2178 : // koennen wir nicht
2179 0 : break;
2180 : default:
2181 : ;
2182 : }
2183 :
2184 0 : if( bSet )
2185 : {
2186 : const SfxPoolItem* pItem;
2187 0 : if( SFX_ITEM_SET == rItemSet.GetItemState( aItemIds.nULSpace, sal_False,
2188 0 : &pItem ) )
2189 : {
2190 0 : SvxULSpaceItem aULItem( *((const SvxULSpaceItem*)pItem) );
2191 0 : aULItem.SetUpper( nUpper );
2192 0 : rItemSet.Put( aULItem );
2193 : }
2194 : else
2195 : {
2196 0 : SvxULSpaceItem aULItem( aItemIds.nULSpace );
2197 0 : aULItem.SetUpper( nUpper );
2198 0 : rItemSet.Put( aULItem );
2199 : }
2200 0 : rPropInfo.bTopMargin = sal_True;
2201 : }
2202 0 : }
2203 :
2204 :
2205 0 : static void ParseCSS1_margin_bottom( const CSS1Expression *pExpr,
2206 : SfxItemSet &rItemSet,
2207 : SvxCSS1PropertyInfo& rPropInfo,
2208 : const SvxCSS1Parser& /*rParser*/ )
2209 : {
2210 : OSL_ENSURE( pExpr, "no expression" );
2211 :
2212 0 : sal_uInt16 nLower = 0;
2213 0 : sal_Bool bSet = sal_False;
2214 0 : switch( pExpr->GetType() )
2215 : {
2216 : case CSS1_LENGTH:
2217 : {
2218 0 : long nTmp = pExpr->GetSLength();
2219 0 : if( nTmp < 0 )
2220 0 : nTmp = 0;
2221 0 : nLower = (sal_uInt16)nTmp;
2222 0 : bSet = sal_True;
2223 : }
2224 0 : break;
2225 : case CSS1_PIXLENGTH:
2226 : {
2227 0 : long nPWidth = 0;
2228 0 : long nPHeight = (long)pExpr->GetNumber();
2229 0 : if( nPHeight < 0 )
2230 0 : nPHeight = 0;
2231 0 : SvxCSS1Parser::PixelToTwip( nPWidth, nPHeight );
2232 0 : nLower = (sal_uInt16)nPHeight;
2233 0 : bSet = sal_True;
2234 : }
2235 0 : break;
2236 : case CSS1_PERCENTAGE:
2237 : // koennen wir nicht
2238 0 : break;
2239 : default:
2240 : ;
2241 : }
2242 :
2243 0 : if( bSet )
2244 : {
2245 : const SfxPoolItem* pItem;
2246 0 : if( SFX_ITEM_SET == rItemSet.GetItemState( aItemIds.nULSpace, sal_False,
2247 0 : &pItem ) )
2248 : {
2249 0 : SvxULSpaceItem aULItem( *((const SvxULSpaceItem*)pItem) );
2250 0 : aULItem.SetLower( nLower );
2251 0 : rItemSet.Put( aULItem );
2252 : }
2253 : else
2254 : {
2255 0 : SvxULSpaceItem aULItem( aItemIds.nULSpace );
2256 0 : aULItem.SetLower( nLower );
2257 0 : rItemSet.Put( aULItem );
2258 : }
2259 0 : rPropInfo.bBottomMargin = sal_True;
2260 : }
2261 0 : }
2262 :
2263 :
2264 0 : static void ParseCSS1_margin( const CSS1Expression *pExpr,
2265 : SfxItemSet &rItemSet,
2266 : SvxCSS1PropertyInfo& rPropInfo,
2267 : const SvxCSS1Parser& /*rParser*/ )
2268 : {
2269 : OSL_ENSURE( pExpr, "no expression" );
2270 :
2271 0 : long nMargins[4] = { 0, 0, 0, 0 };
2272 0 : sal_Bool bSetMargins[4] = { sal_False, sal_False, sal_False, sal_False };
2273 :
2274 0 : for( sal_uInt16 i=0; pExpr && i<4 && !pExpr->GetOp(); i++ )
2275 : {
2276 0 : sal_Bool bSetThis = sal_False;
2277 0 : long nMargin = 0;
2278 :
2279 0 : switch( pExpr->GetType() )
2280 : {
2281 : case CSS1_LENGTH:
2282 : {
2283 0 : nMargin = pExpr->GetSLength();
2284 0 : bSetThis = sal_True;
2285 : }
2286 0 : break;
2287 : case CSS1_PIXLENGTH:
2288 : {
2289 0 : long nPWidth = 0;
2290 0 : nMargin = (long)pExpr->GetNumber();
2291 0 : SvxCSS1Parser::PixelToTwip( nPWidth, nMargin );
2292 0 : bSetThis = sal_True;
2293 : }
2294 0 : break;
2295 : case CSS1_PERCENTAGE:
2296 : // koennen wir nicht
2297 0 : break;
2298 : default:
2299 : ;
2300 : }
2301 :
2302 0 : if( bSetThis )
2303 : {
2304 : // 0 = top
2305 : // 1 = right
2306 : // 2 = bottom
2307 : // 3 = left
2308 0 : switch( i )
2309 : {
2310 : case 0:
2311 0 : nMargins[0] = nMargins[1] =nMargins[2] = nMargins[3] = nMargin;
2312 0 : bSetMargins[0] = bSetMargins[1] =
2313 0 : bSetMargins[2] = bSetMargins[3] = sal_True;
2314 0 : break;
2315 : case 1:
2316 0 : nMargins[1] = nMargins[3] = nMargin; // right + left
2317 0 : bSetMargins[1] = bSetMargins[3] = sal_True;
2318 0 : break;
2319 : case 2:
2320 0 : nMargins[2] = nMargin; // bottom
2321 0 : bSetMargins[2] = sal_True;
2322 0 : break;
2323 : case 3:
2324 0 : nMargins[3] = nMargin; // left
2325 0 : bSetMargins[3] = sal_True;
2326 0 : break;
2327 : }
2328 : }
2329 0 : pExpr = pExpr->GetNext();
2330 : }
2331 :
2332 0 : if( bSetMargins[3] || bSetMargins[1] )
2333 : {
2334 0 : if( bSetMargins[3] )
2335 : {
2336 0 : rPropInfo.bLeftMargin = sal_True;
2337 0 : rPropInfo.nLeftMargin = nMargins[3];
2338 0 : if( nMargins[3] < 0 )
2339 0 : nMargins[3] = 0;
2340 : }
2341 0 : if( bSetMargins[1] )
2342 : {
2343 0 : rPropInfo.bRightMargin = sal_True;
2344 0 : rPropInfo.nRightMargin = nMargins[1];
2345 0 : if( nMargins[1] < 0 )
2346 0 : nMargins[1] = 0;
2347 : }
2348 :
2349 : const SfxPoolItem* pItem;
2350 0 : if( SFX_ITEM_SET == rItemSet.GetItemState( aItemIds.nLRSpace, sal_False,
2351 0 : &pItem ) )
2352 : {
2353 0 : SvxLRSpaceItem aLRItem( *((const SvxLRSpaceItem*)pItem) );
2354 0 : if( bSetMargins[3] )
2355 0 : aLRItem.SetLeft( (sal_uInt16)nMargins[3] );
2356 0 : if( bSetMargins[1] )
2357 0 : aLRItem.SetRight( (sal_uInt16)nMargins[1] );
2358 0 : rItemSet.Put( aLRItem );
2359 : }
2360 : else
2361 : {
2362 0 : SvxLRSpaceItem aLRItem( aItemIds.nLRSpace );
2363 0 : if( bSetMargins[3] )
2364 0 : aLRItem.SetLeft( (sal_uInt16)nMargins[3] );
2365 0 : if( bSetMargins[1] )
2366 0 : aLRItem.SetRight( (sal_uInt16)nMargins[1] );
2367 0 : rItemSet.Put( aLRItem );
2368 : }
2369 : }
2370 :
2371 0 : if( bSetMargins[0] || bSetMargins[2] )
2372 : {
2373 0 : if( nMargins[0] < 0 )
2374 0 : nMargins[0] = 0;
2375 0 : if( nMargins[2] < 0 )
2376 0 : nMargins[2] = 0;
2377 :
2378 : const SfxPoolItem* pItem;
2379 0 : if( SFX_ITEM_SET == rItemSet.GetItemState( aItemIds.nULSpace, sal_False,
2380 0 : &pItem ) )
2381 : {
2382 0 : SvxULSpaceItem aULItem( *((const SvxULSpaceItem*)pItem) );
2383 0 : if( bSetMargins[0] )
2384 0 : aULItem.SetUpper( (sal_uInt16)nMargins[0] );
2385 0 : if( bSetMargins[2] )
2386 0 : aULItem.SetLower( (sal_uInt16)nMargins[2] );
2387 0 : rItemSet.Put( aULItem );
2388 : }
2389 : else
2390 : {
2391 0 : SvxULSpaceItem aULItem( aItemIds.nULSpace );
2392 0 : if( bSetMargins[0] )
2393 0 : aULItem.SetUpper( (sal_uInt16)nMargins[0] );
2394 0 : if( bSetMargins[2] )
2395 0 : aULItem.SetLower( (sal_uInt16)nMargins[2] );
2396 0 : rItemSet.Put( aULItem );
2397 : }
2398 :
2399 0 : rPropInfo.bTopMargin |= bSetMargins[0];
2400 0 : rPropInfo.bBottomMargin |= bSetMargins[2];
2401 : }
2402 0 : }
2403 :
2404 :
2405 0 : static sal_Bool ParseCSS1_padding_xxx( const CSS1Expression *pExpr,
2406 : SfxItemSet & /*rItemSet*/,
2407 : SvxCSS1PropertyInfo& rPropInfo,
2408 : const SvxCSS1Parser& /*rParser*/,
2409 : sal_uInt16 nWhichLine )
2410 : {
2411 : OSL_ENSURE( pExpr, "no expression" );
2412 :
2413 0 : sal_Bool bSet = sal_False;
2414 0 : sal_uInt16 nDist = 0;
2415 :
2416 0 : switch( pExpr->GetType() )
2417 : {
2418 : case CSS1_LENGTH:
2419 : {
2420 0 : long nTmp = pExpr->GetSLength();
2421 0 : if( nTmp < 0 )
2422 0 : nTmp = 0;
2423 0 : else if( nTmp > USHRT_MAX-1 )
2424 0 : nTmp = USHRT_MAX-1;
2425 0 : nDist = (sal_uInt16)nTmp;
2426 0 : bSet = sal_True;
2427 : }
2428 0 : break;
2429 : case CSS1_PIXLENGTH:
2430 : {
2431 0 : long nPWidth = (long)pExpr->GetNumber();
2432 0 : long nPHeight = 0;
2433 0 : if( nPWidth < 0 )
2434 0 : nPWidth = 0;
2435 0 : SvxCSS1Parser::PixelToTwip( nPWidth, nPHeight );
2436 0 : if( nPWidth > USHRT_MAX-1 )
2437 0 : nPWidth = USHRT_MAX-1;
2438 0 : nDist = (sal_uInt16)nPWidth;
2439 0 : bSet = sal_True;
2440 : }
2441 0 : break;
2442 : case CSS1_PERCENTAGE:
2443 : // koennen wir nicht
2444 0 : break;
2445 : default:
2446 : ;
2447 : }
2448 :
2449 0 : if( bSet )
2450 : {
2451 0 : switch( nWhichLine )
2452 : {
2453 0 : case BOX_LINE_TOP: rPropInfo.nTopBorderDistance = nDist; break;
2454 0 : case BOX_LINE_BOTTOM: rPropInfo.nBottomBorderDistance = nDist;break;
2455 0 : case BOX_LINE_LEFT: rPropInfo.nLeftBorderDistance = nDist; break;
2456 0 : case BOX_LINE_RIGHT: rPropInfo.nRightBorderDistance = nDist; break;
2457 : }
2458 : }
2459 :
2460 0 : return bSet;
2461 : }
2462 :
2463 :
2464 0 : static void ParseCSS1_padding_top( const CSS1Expression *pExpr,
2465 : SfxItemSet &rItemSet,
2466 : SvxCSS1PropertyInfo& rPropInfo,
2467 : const SvxCSS1Parser& rParser )
2468 : {
2469 0 : ParseCSS1_padding_xxx( pExpr, rItemSet, rPropInfo, rParser, BOX_LINE_TOP );
2470 0 : }
2471 :
2472 0 : static void ParseCSS1_padding_bottom( const CSS1Expression *pExpr,
2473 : SfxItemSet &rItemSet,
2474 : SvxCSS1PropertyInfo& rPropInfo,
2475 : const SvxCSS1Parser& rParser )
2476 : {
2477 : ParseCSS1_padding_xxx( pExpr, rItemSet, rPropInfo, rParser,
2478 0 : BOX_LINE_BOTTOM );
2479 0 : }
2480 :
2481 0 : static void ParseCSS1_padding_left( const CSS1Expression *pExpr,
2482 : SfxItemSet &rItemSet,
2483 : SvxCSS1PropertyInfo& rPropInfo,
2484 : const SvxCSS1Parser& rParser )
2485 : {
2486 0 : ParseCSS1_padding_xxx( pExpr, rItemSet, rPropInfo, rParser, BOX_LINE_LEFT );
2487 0 : }
2488 :
2489 0 : static void ParseCSS1_padding_right( const CSS1Expression *pExpr,
2490 : SfxItemSet &rItemSet,
2491 : SvxCSS1PropertyInfo& rPropInfo,
2492 : const SvxCSS1Parser& rParser )
2493 : {
2494 : ParseCSS1_padding_xxx( pExpr, rItemSet, rPropInfo, rParser,
2495 0 : BOX_LINE_RIGHT );
2496 0 : }
2497 :
2498 0 : static void ParseCSS1_padding( const CSS1Expression *pExpr,
2499 : SfxItemSet &rItemSet,
2500 : SvxCSS1PropertyInfo& rPropInfo,
2501 : const SvxCSS1Parser& rParser )
2502 : {
2503 0 : sal_uInt16 n=0;
2504 0 : while( n<4 && pExpr && !pExpr->GetOp() )
2505 : {
2506 0 : sal_uInt16 nLine = n==0 || n==2 ? BOX_LINE_BOTTOM : BOX_LINE_LEFT;
2507 0 : if( ParseCSS1_padding_xxx( pExpr, rItemSet, rPropInfo, rParser,
2508 0 : nLine ) )
2509 : {
2510 0 : if( n==0 )
2511 : {
2512 0 : rPropInfo.nTopBorderDistance = rPropInfo.nBottomBorderDistance;
2513 0 : rPropInfo.nLeftBorderDistance = rPropInfo.nTopBorderDistance;
2514 : }
2515 0 : if( n <= 1 )
2516 0 : rPropInfo.nRightBorderDistance = rPropInfo.nLeftBorderDistance;
2517 : }
2518 :
2519 0 : pExpr = pExpr->GetNext();
2520 0 : n++;
2521 : }
2522 0 : }
2523 :
2524 :
2525 0 : static void ParseCSS1_border_xxx( const CSS1Expression *pExpr,
2526 : SfxItemSet & /*rItemSet*/,
2527 : SvxCSS1PropertyInfo& rPropInfo,
2528 : const SvxCSS1Parser& /*rParser*/,
2529 : sal_uInt16 nWhichLine, sal_Bool bAll )
2530 : {
2531 : OSL_ENSURE( pExpr, "no expression" );
2532 :
2533 0 : sal_uInt16 nWidth = USHRT_MAX; // die Linien-Dicke
2534 0 : sal_uInt16 nNWidth = 1; // benannte Linien-Dicke (und default)
2535 0 : CSS1BorderStyle eStyle = CSS1_BS_NONE; // Linien-Style
2536 0 : Color aColor;
2537 0 : sal_Bool bColor = sal_False;
2538 :
2539 0 : while( pExpr && !pExpr->GetOp() )
2540 : {
2541 0 : switch( pExpr->GetType() )
2542 : {
2543 : case CSS1_RGB:
2544 : case CSS1_HEXCOLOR:
2545 0 : if( pExpr->GetColor( aColor ) )
2546 0 : bColor = sal_True;
2547 0 : break;
2548 :
2549 : case CSS1_IDENT:
2550 : {
2551 0 : const String& rValue = pExpr->GetString();
2552 : sal_uInt16 nValue;
2553 0 : if( SvxCSS1Parser::GetEnum( aBorderWidthTable, rValue, nValue ) )
2554 : {
2555 0 : nNWidth = nValue;
2556 : }
2557 0 : else if( SvxCSS1Parser::GetEnum( aBorderStyleTable, rValue, nValue ) )
2558 : {
2559 0 : eStyle = (CSS1BorderStyle)nValue;
2560 : }
2561 0 : else if( pExpr->GetColor( aColor ) )
2562 : {
2563 0 : bColor = sal_True;
2564 : }
2565 : }
2566 0 : break;
2567 :
2568 : case CSS1_LENGTH:
2569 0 : nWidth = (sal_uInt16)pExpr->GetULength();
2570 0 : break;
2571 :
2572 : case CSS1_PIXLENGTH:
2573 : {
2574 : sal_Bool bHori = nWhichLine == BOX_LINE_TOP ||
2575 0 : nWhichLine == BOX_LINE_BOTTOM;
2576 : // Ein Pixel wird zur Haarlinie (ist huebscher)
2577 0 : long nWidthL = (long)pExpr->GetNumber();
2578 0 : if( nWidthL > 1 )
2579 : {
2580 0 : long nPWidth = bHori ? 0 : nWidthL;
2581 0 : long nPHeight = bHori ? nWidthL : 0;
2582 0 : SvxCSS1Parser::PixelToTwip( nPWidth, nPHeight );
2583 0 : nWidth = (sal_uInt16)(bHori ? nPHeight : nPWidth);
2584 : }
2585 : else
2586 0 : nWidth = 1;
2587 : }
2588 0 : break;
2589 :
2590 : default:
2591 : ;
2592 : }
2593 :
2594 0 : pExpr = pExpr->GetNext();
2595 : }
2596 :
2597 0 : for( sal_uInt16 i=0; i<4; i++ )
2598 : {
2599 0 : sal_uInt16 nLine = 0;
2600 0 : switch( i )
2601 : {
2602 0 : case 0: nLine = BOX_LINE_TOP; break;
2603 0 : case 1: nLine = BOX_LINE_BOTTOM; break;
2604 0 : case 2: nLine = BOX_LINE_LEFT; break;
2605 0 : case 3: nLine = BOX_LINE_RIGHT; break;
2606 : }
2607 :
2608 0 : if( bAll || nLine == nWhichLine )
2609 : {
2610 0 : SvxCSS1BorderInfo *pInfo = rPropInfo.GetBorderInfo( nLine );
2611 0 : pInfo->eStyle = eStyle;
2612 0 : pInfo->nAbsWidth = nWidth;
2613 0 : pInfo->nNamedWidth = nNWidth;
2614 0 : if( bColor )
2615 0 : pInfo->aColor = aColor;
2616 : }
2617 : }
2618 0 : }
2619 :
2620 0 : static void ParseCSS1_border_xxx_width( const CSS1Expression *pExpr,
2621 : SfxItemSet & /*rItemSet*/,
2622 : SvxCSS1PropertyInfo& rPropInfo,
2623 : const SvxCSS1Parser& /*rParser*/,
2624 : sal_uInt16 nWhichLine )
2625 : {
2626 : OSL_ENSURE( pExpr, "no expression" );
2627 :
2628 0 : sal_uInt16 nWidth = USHRT_MAX; // die Linien-Dicke
2629 0 : sal_uInt16 nNWidth = 1; // benannte Linien-Dicke (und default)
2630 :
2631 0 : switch( pExpr->GetType() )
2632 : {
2633 : case CSS1_IDENT:
2634 : {
2635 : sal_uInt16 nValue;
2636 0 : if( SvxCSS1Parser::GetEnum( aBorderWidthTable, pExpr->GetString(), nValue ) )
2637 : {
2638 0 : nNWidth = nValue;
2639 : }
2640 : }
2641 0 : break;
2642 :
2643 : case CSS1_LENGTH:
2644 0 : nWidth = (sal_uInt16)pExpr->GetULength();
2645 0 : break;
2646 :
2647 : case CSS1_PIXLENGTH:
2648 : {
2649 : sal_Bool bHori = nWhichLine == BOX_LINE_TOP ||
2650 0 : nWhichLine == BOX_LINE_BOTTOM;
2651 0 : long nWidthL = (long)pExpr->GetNumber();
2652 0 : long nPWidth = bHori ? 0 : nWidthL;
2653 0 : long nPHeight = bHori ? nWidthL : 0;
2654 0 : SvxCSS1Parser::PixelToTwip( nPWidth, nPHeight );
2655 0 : nWidth = (sal_uInt16)(bHori ? nPHeight : nPWidth);
2656 : }
2657 0 : break;
2658 :
2659 : default:
2660 : ;
2661 : }
2662 :
2663 0 : SvxCSS1BorderInfo *pInfo = rPropInfo.GetBorderInfo( nWhichLine );
2664 0 : pInfo->nAbsWidth = nWidth;
2665 0 : pInfo->nNamedWidth = nNWidth;
2666 0 : }
2667 :
2668 :
2669 0 : static void ParseCSS1_border_top_width( const CSS1Expression *pExpr,
2670 : SfxItemSet &rItemSet,
2671 : SvxCSS1PropertyInfo& rPropInfo,
2672 : const SvxCSS1Parser& rParser )
2673 : {
2674 0 : ParseCSS1_border_xxx_width( pExpr, rItemSet, rPropInfo, rParser, BOX_LINE_TOP );
2675 0 : }
2676 :
2677 0 : static void ParseCSS1_border_right_width( const CSS1Expression *pExpr,
2678 : SfxItemSet &rItemSet,
2679 : SvxCSS1PropertyInfo& rPropInfo,
2680 : const SvxCSS1Parser& rParser )
2681 : {
2682 0 : ParseCSS1_border_xxx_width( pExpr, rItemSet, rPropInfo, rParser, BOX_LINE_RIGHT );
2683 0 : }
2684 :
2685 0 : static void ParseCSS1_border_bottom_width( const CSS1Expression *pExpr,
2686 : SfxItemSet &rItemSet,
2687 : SvxCSS1PropertyInfo& rPropInfo,
2688 : const SvxCSS1Parser& rParser )
2689 : {
2690 0 : ParseCSS1_border_xxx_width( pExpr, rItemSet, rPropInfo, rParser, BOX_LINE_BOTTOM );
2691 0 : }
2692 :
2693 0 : static void ParseCSS1_border_left_width( const CSS1Expression *pExpr,
2694 : SfxItemSet &rItemSet,
2695 : SvxCSS1PropertyInfo& rPropInfo,
2696 : const SvxCSS1Parser& rParser )
2697 : {
2698 0 : ParseCSS1_border_xxx_width( pExpr, rItemSet, rPropInfo, rParser, BOX_LINE_LEFT );
2699 0 : }
2700 :
2701 0 : static void ParseCSS1_border_width( const CSS1Expression *pExpr,
2702 : SfxItemSet &rItemSet,
2703 : SvxCSS1PropertyInfo& rPropInfo,
2704 : const SvxCSS1Parser& rParser )
2705 : {
2706 0 : sal_uInt16 n=0;
2707 0 : while( n<4 && pExpr && !pExpr->GetOp() )
2708 : {
2709 0 : sal_uInt16 nLine = n==0 || n==2 ? BOX_LINE_BOTTOM : BOX_LINE_LEFT;
2710 0 : ParseCSS1_border_xxx_width( pExpr, rItemSet, rPropInfo, rParser, nLine );
2711 0 : rPropInfo.CopyBorderInfo( n, SVX_CSS1_BORDERINFO_WIDTH );
2712 :
2713 0 : pExpr = pExpr->GetNext();
2714 0 : n++;
2715 : }
2716 0 : }
2717 :
2718 0 : static void ParseCSS1_border_color( const CSS1Expression *pExpr,
2719 : SfxItemSet & /*rItemSet*/,
2720 : SvxCSS1PropertyInfo& rPropInfo,
2721 : const SvxCSS1Parser& /*rParser*/ )
2722 : {
2723 0 : sal_uInt16 n=0;
2724 0 : while( n<4 && pExpr && !pExpr->GetOp() )
2725 : {
2726 0 : sal_uInt16 nLine = n==0 || n==2 ? BOX_LINE_BOTTOM : BOX_LINE_LEFT;
2727 0 : Color aColor;
2728 0 : switch( pExpr->GetType() )
2729 : {
2730 : case CSS1_RGB:
2731 : case CSS1_HEXCOLOR:
2732 : case CSS1_IDENT:
2733 0 : if( pExpr->GetColor( aColor ) )
2734 0 : rPropInfo.GetBorderInfo( nLine )->aColor = aColor;
2735 0 : break;
2736 : default:
2737 : ;
2738 : }
2739 0 : rPropInfo.CopyBorderInfo( n, SVX_CSS1_BORDERINFO_COLOR );
2740 :
2741 0 : pExpr = pExpr->GetNext();
2742 0 : n++;
2743 : }
2744 0 : }
2745 :
2746 0 : static void ParseCSS1_border_style( const CSS1Expression *pExpr,
2747 : SfxItemSet & /*rItemSet*/,
2748 : SvxCSS1PropertyInfo& rPropInfo,
2749 : const SvxCSS1Parser& /*rParser*/ )
2750 : {
2751 0 : sal_uInt16 n=0;
2752 0 : while( n<4 && pExpr && !pExpr->GetOp() )
2753 : {
2754 0 : sal_uInt16 nLine = n==0 || n==2 ? BOX_LINE_BOTTOM : BOX_LINE_LEFT;
2755 : sal_uInt16 nValue;
2756 0 : if( CSS1_IDENT==pExpr->GetType() &&
2757 0 : SvxCSS1Parser::GetEnum( aBorderStyleTable, pExpr->GetString(),
2758 0 : nValue ) )
2759 : {
2760 0 : rPropInfo.GetBorderInfo( nLine )->eStyle = (CSS1BorderStyle)nValue;
2761 : }
2762 0 : rPropInfo.CopyBorderInfo( n, SVX_CSS1_BORDERINFO_STYLE );
2763 :
2764 0 : pExpr = pExpr->GetNext();
2765 0 : n++;
2766 : }
2767 0 : }
2768 :
2769 :
2770 0 : static void ParseCSS1_border_top( const CSS1Expression *pExpr,
2771 : SfxItemSet &rItemSet,
2772 : SvxCSS1PropertyInfo& rPropInfo,
2773 : const SvxCSS1Parser& rParser )
2774 : {
2775 0 : ParseCSS1_border_xxx( pExpr, rItemSet, rPropInfo, rParser, BOX_LINE_TOP, sal_False );
2776 0 : }
2777 :
2778 0 : static void ParseCSS1_border_right( const CSS1Expression *pExpr,
2779 : SfxItemSet &rItemSet,
2780 : SvxCSS1PropertyInfo& rPropInfo,
2781 : const SvxCSS1Parser& rParser )
2782 : {
2783 0 : ParseCSS1_border_xxx( pExpr, rItemSet, rPropInfo, rParser, BOX_LINE_RIGHT, sal_False );
2784 0 : }
2785 :
2786 0 : static void ParseCSS1_border_bottom( const CSS1Expression *pExpr,
2787 : SfxItemSet &rItemSet,
2788 : SvxCSS1PropertyInfo& rPropInfo,
2789 : const SvxCSS1Parser& rParser )
2790 : {
2791 0 : ParseCSS1_border_xxx( pExpr, rItemSet, rPropInfo, rParser, BOX_LINE_BOTTOM, sal_False );
2792 0 : }
2793 :
2794 0 : static void ParseCSS1_border_left( const CSS1Expression *pExpr,
2795 : SfxItemSet &rItemSet,
2796 : SvxCSS1PropertyInfo& rPropInfo,
2797 : const SvxCSS1Parser& rParser )
2798 : {
2799 0 : ParseCSS1_border_xxx( pExpr, rItemSet, rPropInfo, rParser, BOX_LINE_LEFT, sal_False );
2800 0 : }
2801 :
2802 0 : static void ParseCSS1_border( const CSS1Expression *pExpr,
2803 : SfxItemSet &rItemSet,
2804 : SvxCSS1PropertyInfo& rPropInfo,
2805 : const SvxCSS1Parser& rParser )
2806 : {
2807 0 : ParseCSS1_border_xxx( pExpr, rItemSet, rPropInfo, rParser, 0, sal_True );
2808 0 : }
2809 :
2810 :
2811 0 : static void ParseCSS1_float( const CSS1Expression *pExpr,
2812 : SfxItemSet & /*rItemSet*/,
2813 : SvxCSS1PropertyInfo& rPropInfo,
2814 : const SvxCSS1Parser& /*rParser*/ )
2815 : {
2816 : OSL_ENSURE( pExpr, "no expression" );
2817 :
2818 0 : if( CSS1_IDENT==pExpr->GetType() )
2819 : {
2820 : sal_uInt16 nFloat;
2821 0 : if( SvxCSS1Parser::GetEnum( aFloatTable, pExpr->GetString(), nFloat ) )
2822 0 : rPropInfo.eFloat = (SvxAdjust)nFloat;
2823 : }
2824 0 : }
2825 :
2826 :
2827 :
2828 0 : static void ParseCSS1_position( const CSS1Expression *pExpr,
2829 : SfxItemSet & /*rItemSet*/,
2830 : SvxCSS1PropertyInfo& rPropInfo,
2831 : const SvxCSS1Parser& /*rParser*/ )
2832 : {
2833 : OSL_ENSURE( pExpr, "no expression" );
2834 :
2835 0 : if( CSS1_IDENT==pExpr->GetType() )
2836 : {
2837 : sal_uInt16 nPos;
2838 0 : if( SvxCSS1Parser::GetEnum( aPositionTable, pExpr->GetString(), nPos ) )
2839 0 : rPropInfo.ePosition = (SvxCSS1Position)nPos;
2840 : }
2841 0 : }
2842 :
2843 :
2844 0 : static void ParseCSS1_length( const CSS1Expression *pExpr,
2845 : long& rLength,
2846 : SvxCSS1LengthType& rLengthType,
2847 : sal_Bool bHori )
2848 : {
2849 0 : switch( pExpr->GetType() )
2850 : {
2851 : case CSS1_IDENT:
2852 0 : if( pExpr->GetString().EqualsIgnoreCaseAscii( sCSS1_PV_auto ) )
2853 : {
2854 0 : rLength = 0;
2855 0 : rLengthType = SVX_CSS1_LTYPE_AUTO;
2856 : }
2857 0 : break;
2858 :
2859 : case CSS1_LENGTH:
2860 0 : rLength = pExpr->GetSLength();
2861 0 : rLengthType = SVX_CSS1_LTYPE_TWIP;
2862 0 : break;
2863 :
2864 : case CSS1_PIXLENGTH:
2865 : case CSS1_NUMBER: // wegen Netscape und IE
2866 : {
2867 0 : long nWidthL = (long)pExpr->GetNumber();
2868 0 : long nPWidth = bHori ? 0 : nWidthL;
2869 0 : long nPHeight = bHori ? nWidthL : 0;
2870 0 : SvxCSS1Parser::PixelToTwip( nPWidth, nPHeight );
2871 0 : rLength = (bHori ? nPHeight : nPWidth);
2872 0 : rLengthType = SVX_CSS1_LTYPE_TWIP;
2873 : }
2874 0 : break;
2875 :
2876 : case CSS1_PERCENTAGE:
2877 0 : rLength = (long)pExpr->GetNumber();
2878 0 : if( rLength > 100 )
2879 0 : rLength = 100;
2880 0 : rLengthType = SVX_CSS1_LTYPE_PERCENTAGE;
2881 0 : break;
2882 :
2883 : default:
2884 : ;
2885 : }
2886 0 : }
2887 :
2888 :
2889 0 : static void ParseCSS1_width( const CSS1Expression *pExpr,
2890 : SfxItemSet & /*rItemSet*/,
2891 : SvxCSS1PropertyInfo& rPropInfo,
2892 : const SvxCSS1Parser& /*rParser*/ )
2893 : {
2894 0 : ParseCSS1_length( pExpr, rPropInfo.nWidth, rPropInfo.eWidthType, sal_True );
2895 0 : }
2896 :
2897 0 : static void ParseCSS1_height( const CSS1Expression *pExpr,
2898 : SfxItemSet & /*rItemSet*/,
2899 : SvxCSS1PropertyInfo& rPropInfo,
2900 : const SvxCSS1Parser& /*rParser*/ )
2901 : {
2902 0 : ParseCSS1_length( pExpr, rPropInfo.nHeight, rPropInfo.eHeightType, sal_False );
2903 0 : }
2904 :
2905 0 : static void ParseCSS1_left( const CSS1Expression *pExpr,
2906 : SfxItemSet & /*rItemSet*/,
2907 : SvxCSS1PropertyInfo& rPropInfo,
2908 : const SvxCSS1Parser& /*rParser*/ )
2909 : {
2910 0 : ParseCSS1_length( pExpr, rPropInfo.nLeft, rPropInfo.eLeftType, sal_True );
2911 0 : }
2912 :
2913 0 : static void ParseCSS1_top( const CSS1Expression *pExpr,
2914 : SfxItemSet & /*rItemSet*/,
2915 : SvxCSS1PropertyInfo& rPropInfo,
2916 : const SvxCSS1Parser& /*rParser*/ )
2917 : {
2918 0 : ParseCSS1_length( pExpr, rPropInfo.nTop, rPropInfo.eTopType, sal_False );
2919 0 : }
2920 :
2921 :
2922 : // Feature: PrintExt
2923 0 : static void ParseCSS1_size( const CSS1Expression *pExpr,
2924 : SfxItemSet & /*rItemSet*/,
2925 : SvxCSS1PropertyInfo& rPropInfo,
2926 : const SvxCSS1Parser& /*rParser*/ )
2927 : {
2928 0 : sal_uInt16 n=0;
2929 0 : while( n<2 && pExpr && !pExpr->GetOp() )
2930 : {
2931 0 : switch( pExpr->GetType() )
2932 : {
2933 : case CSS1_IDENT:
2934 : {
2935 : sal_uInt16 nValue;
2936 0 : if( SvxCSS1Parser::GetEnum( aSizeTable, pExpr->GetString(),
2937 0 : nValue ) )
2938 : {
2939 0 : rPropInfo.eSizeType = (SvxCSS1SizeType)nValue;
2940 : }
2941 : }
2942 0 : break;
2943 :
2944 : case CSS1_LENGTH:
2945 0 : rPropInfo.nHeight = pExpr->GetSLength();
2946 0 : if( n==0 )
2947 0 : rPropInfo.nWidth = rPropInfo.nHeight;
2948 0 : rPropInfo.eSizeType = SVX_CSS1_STYPE_TWIP;
2949 0 : break;
2950 :
2951 : case CSS1_PIXLENGTH:
2952 : {
2953 0 : long nPHeight = (long)pExpr->GetNumber();
2954 0 : long nPWidth = n==0 ? nPHeight : 0;
2955 0 : SvxCSS1Parser::PixelToTwip( nPWidth, nPHeight );
2956 0 : rPropInfo.nHeight = nPHeight;
2957 0 : if( n==0 )
2958 0 : rPropInfo.nWidth = nPWidth;
2959 0 : rPropInfo.eSizeType = SVX_CSS1_STYPE_TWIP;
2960 : }
2961 0 : break;
2962 :
2963 : default:
2964 : ;
2965 : }
2966 :
2967 0 : pExpr = pExpr->GetNext();
2968 0 : n++;
2969 : }
2970 0 : }
2971 :
2972 : // /Feature: PrintExt
2973 :
2974 :
2975 : // Feature: PrintExt
2976 :
2977 0 : static void ParseCSS1_page_break_xxx( const CSS1Expression *pExpr,
2978 : SvxCSS1PageBreak& rPBreak )
2979 : {
2980 0 : if( CSS1_IDENT == pExpr->GetType() )
2981 : {
2982 : sal_uInt16 nValue;
2983 0 : if( SvxCSS1Parser::GetEnum( aPageBreakTable, pExpr->GetString(),
2984 0 : nValue ) )
2985 : {
2986 0 : rPBreak = (SvxCSS1PageBreak)nValue;
2987 : }
2988 : }
2989 0 : }
2990 :
2991 0 : static void ParseCSS1_page_break_before( const CSS1Expression *pExpr,
2992 : SfxItemSet & /*rItemSet*/,
2993 : SvxCSS1PropertyInfo& rPropInfo,
2994 : const SvxCSS1Parser& /*rParser*/ )
2995 : {
2996 0 : ParseCSS1_page_break_xxx( pExpr, rPropInfo.ePageBreakBefore );
2997 0 : }
2998 :
2999 0 : static void ParseCSS1_page_break_after( const CSS1Expression *pExpr,
3000 : SfxItemSet & /*rItemSet*/,
3001 : SvxCSS1PropertyInfo& rPropInfo,
3002 : const SvxCSS1Parser& /*rParser*/ )
3003 : {
3004 0 : ParseCSS1_page_break_xxx( pExpr, rPropInfo.ePageBreakAfter );
3005 0 : }
3006 :
3007 0 : static void ParseCSS1_page_break_inside( const CSS1Expression *pExpr,
3008 : SfxItemSet &rItemSet,
3009 : SvxCSS1PropertyInfo& /*rPropInfo*/,
3010 : const SvxCSS1Parser& /*rParser*/ )
3011 : {
3012 0 : SvxCSS1PageBreak eBreak(SVX_CSS1_PBREAK_NONE);
3013 0 : ParseCSS1_page_break_xxx( pExpr, eBreak );
3014 :
3015 0 : sal_Bool bSetSplit = sal_False, bSplit = sal_True;
3016 0 : switch( eBreak )
3017 : {
3018 : case SVX_CSS1_PBREAK_AUTO:
3019 0 : bSetSplit = sal_True;
3020 0 : break;
3021 : case SVX_CSS1_PBREAK_AVOID:
3022 0 : bSplit = sal_False;
3023 0 : bSetSplit = sal_True;
3024 0 : break;
3025 : default:
3026 : ;
3027 : }
3028 :
3029 0 : if( bSetSplit )
3030 0 : rItemSet.Put( SvxFmtSplitItem( bSplit, aItemIds.nFmtSplit ) );
3031 0 : }
3032 :
3033 0 : static void ParseCSS1_widows( const CSS1Expression *pExpr,
3034 : SfxItemSet &rItemSet,
3035 : SvxCSS1PropertyInfo& /*rPropInfo*/,
3036 : const SvxCSS1Parser& /*rParser*/ )
3037 : {
3038 0 : if( CSS1_NUMBER == pExpr->GetType() )
3039 : {
3040 0 : sal_uInt8 nVal = pExpr->GetNumber() <= 255
3041 0 : ? (sal_uInt8)pExpr->GetNumber()
3042 0 : : 255;
3043 0 : SvxWidowsItem aWidowsItem( nVal, aItemIds.nWidows );
3044 0 : rItemSet.Put( aWidowsItem );
3045 : }
3046 0 : }
3047 :
3048 0 : static void ParseCSS1_orphans( const CSS1Expression *pExpr,
3049 : SfxItemSet &rItemSet,
3050 : SvxCSS1PropertyInfo& /*rPropInfo*/,
3051 : const SvxCSS1Parser& /*rParser*/ )
3052 : {
3053 0 : if( CSS1_NUMBER == pExpr->GetType() )
3054 : {
3055 0 : sal_uInt8 nVal = pExpr->GetNumber() <= 255
3056 0 : ? (sal_uInt8)pExpr->GetNumber()
3057 0 : : 255;
3058 0 : SvxOrphansItem aOrphansItem( nVal, aItemIds.nOrphans );
3059 0 : rItemSet.Put( aOrphansItem );
3060 : }
3061 0 : }
3062 : // /Feature: PrintExt
3063 :
3064 0 : static void ParseCSS1_so_language( const CSS1Expression *pExpr,
3065 : SfxItemSet &rItemSet,
3066 : SvxCSS1PropertyInfo& /*rPropInfo*/,
3067 : const SvxCSS1Parser& rParser )
3068 : {
3069 0 : if( CSS1_IDENT == pExpr->GetType() ||
3070 0 : CSS1_STRING == pExpr->GetType() )
3071 : {
3072 0 : LanguageType eLang = LanguageTag( pExpr->GetString() ).getLanguageType();
3073 0 : if( LANGUAGE_DONTKNOW != eLang )
3074 : {
3075 0 : SvxLanguageItem aLang( eLang, aItemIds.nLanguage );
3076 0 : if( rParser.IsSetWesternProps() )
3077 0 : rItemSet.Put( aLang );
3078 0 : if( rParser.IsSetCJKProps() )
3079 : {
3080 0 : aLang.SetWhich( aItemIds.nLanguageCJK );
3081 0 : rItemSet.Put( aLang );
3082 : }
3083 0 : if( rParser.IsSetCTLProps() )
3084 : {
3085 0 : aLang.SetWhich( aItemIds.nLanguageCTL );
3086 0 : rItemSet.Put( aLang );
3087 0 : }
3088 : }
3089 : }
3090 0 : }
3091 :
3092 :
3093 : // die Zuordung Property zu parsender Funktion
3094 : struct CSS1PropEntry
3095 : {
3096 : union
3097 : {
3098 : const sal_Char *sName;
3099 : String *pName;
3100 : };
3101 : FnParseCSS1Prop pFunc;
3102 : };
3103 :
3104 : #define CSS1_PROP_ENTRY(p) \
3105 : { { sCSS1_P_##p }, ParseCSS1_##p }
3106 :
3107 :
3108 : // die Tabelle mit den Zuordnungen
3109 : static CSS1PropEntry aCSS1PropFnTab[] =
3110 : {
3111 : CSS1_PROP_ENTRY(background),
3112 : CSS1_PROP_ENTRY(background_color),
3113 : CSS1_PROP_ENTRY(border_top_width),
3114 : CSS1_PROP_ENTRY(border_right_width),
3115 : CSS1_PROP_ENTRY(border_bottom_width),
3116 : CSS1_PROP_ENTRY(border_left_width),
3117 : CSS1_PROP_ENTRY(border_width),
3118 : CSS1_PROP_ENTRY(border_color),
3119 : CSS1_PROP_ENTRY(border_style),
3120 : CSS1_PROP_ENTRY(border_top),
3121 : CSS1_PROP_ENTRY(border_right),
3122 : CSS1_PROP_ENTRY(border_bottom),
3123 : CSS1_PROP_ENTRY(border_left),
3124 : CSS1_PROP_ENTRY(border),
3125 : CSS1_PROP_ENTRY(color),
3126 : CSS1_PROP_ENTRY(direction),
3127 : CSS1_PROP_ENTRY(float),
3128 : CSS1_PROP_ENTRY(font_size),
3129 : CSS1_PROP_ENTRY(font_family),
3130 : CSS1_PROP_ENTRY(font_style),
3131 : CSS1_PROP_ENTRY(font_variant),
3132 : CSS1_PROP_ENTRY(font_weight),
3133 : CSS1_PROP_ENTRY(letter_spacing),
3134 : CSS1_PROP_ENTRY(line_height),
3135 : CSS1_PROP_ENTRY(font),
3136 : CSS1_PROP_ENTRY(text_align),
3137 : CSS1_PROP_ENTRY(text_decoration),
3138 : CSS1_PROP_ENTRY(text_indent),
3139 : CSS1_PROP_ENTRY(text_transform),
3140 : CSS1_PROP_ENTRY(margin_left),
3141 : CSS1_PROP_ENTRY(margin_right),
3142 : CSS1_PROP_ENTRY(margin_top),
3143 : CSS1_PROP_ENTRY(margin_bottom),
3144 : CSS1_PROP_ENTRY(margin),
3145 : CSS1_PROP_ENTRY(padding_top),
3146 : CSS1_PROP_ENTRY(padding_bottom),
3147 : CSS1_PROP_ENTRY(padding_left),
3148 : CSS1_PROP_ENTRY(padding_right),
3149 : CSS1_PROP_ENTRY(padding),
3150 : CSS1_PROP_ENTRY(position),
3151 : CSS1_PROP_ENTRY(left),
3152 : CSS1_PROP_ENTRY(top),
3153 : CSS1_PROP_ENTRY(width),
3154 : CSS1_PROP_ENTRY(height),
3155 : // Feature: PrintExt
3156 : CSS1_PROP_ENTRY(size),
3157 : CSS1_PROP_ENTRY(page_break_before),
3158 : CSS1_PROP_ENTRY(page_break_after),
3159 : CSS1_PROP_ENTRY(page_break_inside),
3160 : CSS1_PROP_ENTRY(widows),
3161 : CSS1_PROP_ENTRY(orphans),
3162 : // /Feature: PrintExt
3163 : CSS1_PROP_ENTRY(so_language)
3164 : };
3165 :
3166 :
3167 : static int bSortedPropFns = sal_False;
3168 :
3169 : extern "C"
3170 : {
3171 0 : static int SAL_CALL CSS1PropEntryCompare( const void *pFirst, const void *pSecond)
3172 : {
3173 : int nRet;
3174 0 : if( ((CSS1PropEntry*)pFirst)->pFunc )
3175 : {
3176 0 : if( ((CSS1PropEntry*)pSecond)->pFunc )
3177 : nRet = strcmp( ((CSS1PropEntry*)pFirst)->sName ,
3178 0 : ((CSS1PropEntry*)pSecond)->sName );
3179 : else
3180 : nRet = -1 * ((CSS1PropEntry*)pSecond)->pName->CompareToAscii(
3181 0 : ((CSS1PropEntry*)pFirst)->sName );
3182 : }
3183 : else
3184 : {
3185 0 : if( ((CSS1PropEntry*)pSecond)->pFunc )
3186 : nRet = ((CSS1PropEntry*)pFirst)->pName->CompareToAscii(
3187 0 : ((CSS1PropEntry*)pSecond)->sName );
3188 : else
3189 : nRet = ((CSS1PropEntry*)pFirst)->pName->CompareTo(
3190 0 : *((CSS1PropEntry*)pSecond)->pName );
3191 : }
3192 :
3193 0 : return nRet;
3194 : }
3195 : }
3196 :
3197 0 : void SvxCSS1Parser::ParseProperty( const String& rProperty,
3198 : const CSS1Expression *pExpr )
3199 : {
3200 : OSL_ENSURE( pItemSet, "DeclarationParsed() without ItemSet" );
3201 :
3202 0 : if( !bSortedPropFns )
3203 : {
3204 : qsort( (void*) aCSS1PropFnTab,
3205 : sizeof( aCSS1PropFnTab ) / sizeof( CSS1PropEntry ),
3206 : sizeof( CSS1PropEntry ),
3207 0 : CSS1PropEntryCompare );
3208 0 : bSortedPropFns = sal_True;
3209 : }
3210 :
3211 0 : String aTmp( rProperty );
3212 0 : aTmp.ToLowerAscii();
3213 :
3214 : CSS1PropEntry aSrch;
3215 0 : aSrch.pName = &aTmp;
3216 0 : aSrch.pFunc = 0;
3217 :
3218 : void* pFound;
3219 0 : if( 0 != ( pFound = bsearch( (char *) &aSrch,
3220 : (void*) aCSS1PropFnTab,
3221 : sizeof( aCSS1PropFnTab ) / sizeof( CSS1PropEntry ),
3222 : sizeof( CSS1PropEntry ),
3223 : CSS1PropEntryCompare )))
3224 : {
3225 0 : (((CSS1PropEntry*)pFound)->pFunc)( pExpr, *pItemSet, *pPropInfo, *this );
3226 0 : }
3227 0 : }
3228 :
3229 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|