1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: svxcss1.hxx,v $
12 * This file is part of OpenOffice.org.
14 * OpenOffice.org is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU Lesser General Public License version 3
16 * only, as published by the Free Software Foundation.
18 * OpenOffice.org is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU Lesser General Public License version 3 for more details
22 * (a copy is included in the LICENSE file that accompanied this code).
24 * You should have received a copy of the GNU Lesser General Public License
25 * version 3 along with OpenOffice.org. If not, see
26 * <http://www.openoffice.org/license.html>
27 * for a copy of the LGPLv3 License.
29 ************************************************************************/
33 #include <tools/string.hxx>
34 #include <svtools/itemset.hxx>
35 #include <svx/svxenum.hxx>
38 #define _SVSTDARR_USHORTS
39 #include <svtools/svstdarr.hxx>
41 #include <rtl/textenc.h>
42 #include "parcss1.hxx"
52 SVX_CSS1_POS_NONE
, // nichts angegeben
53 SVX_CSS1_POS_STATIC
, // normal
54 SVX_CSS1_POS_ABSOLUTE
, // absolut
55 SVX_CSS1_POS_RELATIVE
, // relativ
60 enum SvxCSS1LengthType
62 SVX_CSS1_LTYPE_NONE
, // nichts angegeben
63 SVX_CSS1_LTYPE_AUTO
, // automatisch
64 SVX_CSS1_LTYPE_TWIP
, // twip
65 SVX_CSS1_LTYPE_PERCENTAGE
, // %-Angabe
72 SVX_CSS1_STYPE_NONE
, // nichts angegeben
73 SVX_CSS1_STYPE_AUTO
, // automatisch
74 SVX_CSS1_STYPE_TWIP
, // twip
75 SVX_CSS1_STYPE_LANDSCAPE
, // Landscape
76 SVX_CSS1_STYPE_PORTRAIT
, // Landscape
82 SVX_CSS1_PBREAK_NONE
, // nichts angegeben
83 SVX_CSS1_PBREAK_AUTO
, // automatisch
84 SVX_CSS1_PBREAK_ALWAYS
, // immer
85 SVX_CSS1_PBREAK_AVOID
, // nie
86 SVX_CSS1_PBREAK_LEFT
, // naechste Seite ist eine linke
87 SVX_CSS1_PBREAK_RIGHT
, // naechste Seite ist eine rechte
93 #define CSS1_SCRIPT_WESTERN 0x01
94 #define CSS1_SCRIPT_CJK 0x02
95 #define CSS1_SCRIPT_CTL 0x04
96 #define CSS1_SCRIPT_ALL 0x07
100 struct CSS1PropertyEnum
102 const sal_Char
*pName
; // Wert einer Property
103 sal_uInt16 nEnum
; // und der dazugehoerige Wert eines Enums
111 SV_DECL_PTRARR_DEL( CSS1Selectors
, CSS1Selector
*, 1, 1 )
113 #define SVX_CSS1_BORDERINFO_WIDTH 1
114 #define SVX_CSS1_BORDERINFO_COLOR 2
115 #define SVX_CSS1_BORDERINFO_STYLE 4
117 struct SvxCSS1BorderInfo
;
118 class SvxCSS1PropertyInfo
120 SvxCSS1BorderInfo
*aBorderInfos
[4];
122 void DestroyBorderInfos();
126 String aId
; // ID fuer Bookmarks, Rahmen etc.
128 sal_Bool bTopMargin
: 1;
129 sal_Bool bBottomMargin
: 1;
131 sal_Bool bLeftMargin
: 1;
132 sal_Bool bRightMargin
: 1;
133 sal_Bool bTextIndent
: 1;
137 SvxCSS1Position ePosition
;
139 sal_uInt16 nTopBorderDistance
;
140 sal_uInt16 nBottomBorderDistance
;
141 sal_uInt16 nLeftBorderDistance
;
142 sal_uInt16 nRightBorderDistance
;
145 long nWidth
, nHeight
;
146 long nLeftMargin
, nRightMargin
;
148 SvxCSS1LengthType eLeftType
, eTopType
;
149 SvxCSS1LengthType eWidthType
, eHeightType
;
152 SvxCSS1SizeType eSizeType
;
154 SvxCSS1PageBreak ePageBreakBefore
;
155 SvxCSS1PageBreak ePageBreakAfter
;
156 // /Feature: PrintExt
158 SvxCSS1PropertyInfo();
159 SvxCSS1PropertyInfo( const SvxCSS1PropertyInfo
& rProp
);
160 ~SvxCSS1PropertyInfo();
162 void Merge( const SvxCSS1PropertyInfo
& rProp
);
166 SvxCSS1BorderInfo
*GetBorderInfo( sal_uInt16 nLine
, sal_Bool bCreate
=sal_True
);
167 void CopyBorderInfo( sal_uInt16 nSrcLine
, sal_uInt16 nDstLine
, sal_uInt16 nWhat
);
168 void CopyBorderInfo( sal_uInt16 nCount
, sal_uInt16 nWhat
);
170 void SetBoxItem( SfxItemSet
& rItemSet
, sal_uInt16 nMinBorderDist
,
171 const SvxBoxItem
* pDflt
=0, sal_Bool bTable
= sal_False
);
175 class SvxCSS1MapEntry
179 SvxCSS1PropertyInfo aPropInfo
;
183 SvxCSS1MapEntry( SfxItemPool
& rPool
, const sal_uInt16
*pWhichMap
) :
184 aItemSet( rPool
, pWhichMap
)
187 SvxCSS1MapEntry( const String
& rKey
, const SfxItemSet
& rItemSet
,
188 const SvxCSS1PropertyInfo
& rProp
);
191 const SfxItemSet
& GetItemSet() const { return aItemSet
; }
192 SfxItemSet
& GetItemSet() { return aItemSet
; }
194 const SvxCSS1PropertyInfo
& GetPropertyInfo() const { return aPropInfo
; }
195 SvxCSS1PropertyInfo
& GetPropertyInfo() { return aPropInfo
; }
197 const String
& GetKey() const { return aKey
; }
198 // TODO: ToUpperAscii -> ???
199 void SetKey( const String
& rKey
) { aKey
= rKey
; aKey
.ToUpperAscii(); }
201 friend sal_Bool
operator==( const SvxCSS1MapEntry
& rE1
,
202 const SvxCSS1MapEntry
& rE2
);
203 friend sal_Bool
operator<( const SvxCSS1MapEntry
& rE1
,
204 const SvxCSS1MapEntry
& rE2
);
207 typedef SvxCSS1MapEntry
*SvxCSS1MapEntryPtr
;
208 SV_DECL_PTRARR_SORT_DEL( SvxCSS1Map
, SvxCSS1MapEntryPtr
, 5, 5 )
211 #if !defined( ICC ) && !defined( BLC )
212 inline sal_Bool
operator==( const SvxCSS1MapEntry
& rE1
, const SvxCSS1MapEntry
& rE2
)
214 return rE1
.aKey
==rE2
.aKey
;
217 inline sal_Bool
operator<( const SvxCSS1MapEntry
& rE1
, const SvxCSS1MapEntry
& rE2
)
219 return rE1
.aKey
<rE2
.aKey
;
223 // Diese Klasse bereitet den Output des CSS1-Parsers auf,
224 // indem die CSS1-Properties in SvxItem(Set)s umgewandelt werden.
225 // Ausserdem werden die Selektoren samt zugehoeriger Item-Set
227 // Ein abgeleiteter Parser kann dies fuer einzelne Selektoren unterdruecken,
228 // indem er die Methode StyleParsed ueberlaed.
230 class SvxCSS1Parser
: public CSS1Parser
232 CSS1Selectors aSelectors
; // Liste der "offenen" Selectoren
241 SfxItemSet
*pSheetItemSet
; // der Item-Set fuer Style-Sheets
242 SfxItemSet
*pItemSet
; // der aktuelle Item-Set
243 SvxCSS1MapEntry
*pSearchEntry
;
245 SvxCSS1PropertyInfo
*pSheetPropInfo
;
246 SvxCSS1PropertyInfo
*pPropInfo
;
248 sal_uInt16 nMinFixLineSpace
; // Mindest-Abstand fuer festen Zeilenabstand
250 rtl_TextEncoding eDfltEnc
;
251 sal_uInt16 nScriptFlags
;
253 sal_Bool bIgnoreFontFamily
;
255 void ParseProperty( const String
& rProperty
,
256 const CSS1Expression
*pExpr
);
258 SvUShorts aWhichMap
; // Which-Map des Parser
260 using CSS1Parser::ParseStyleOption
;
264 using CSS1Parser::ParseStyleSheet
;
266 // Diese Methode wird fuer jeden Selektor mit dem zugehoerigen
267 // Item-Set aufgerufen. Fuer einen Selektor koennen mehrere
269 // wenn sal_True zuruckgegeben wird, wird der Item-Set bzw. der
270 // Selektor nicht mehr gespeichert!
271 // Der ItemSet darf entsprechend modifiziert werden!
272 // Die Implementierung dieser Methode gibt sal_False zurueck.
273 virtual sal_Bool
StyleParsed( const CSS1Selector
*pSelector
,
274 SfxItemSet
& rItemSet
,
275 SvxCSS1PropertyInfo
& rPropInfo
);
277 // Diese Methode wird aufgerufen, wenn ein Selektor geparst wurde
278 // Wenn bFirst gesetzt ist, wird der Inhalt von aItemSet in alle
279 // zuletzt angelegten Styles kopiert.
280 // Diese Methode sollte in abgleiteten Parsern nicht mehr
281 // ueberladen werden!
282 virtual sal_Bool
SelectorParsed( const CSS1Selector
*pSelector
,
285 // Diese Methode wird fuer jede geparste Property aufgerufen
286 // sie fuegt das Item in den ItemSet 'pItemSet' ein
287 // Sie sollte in abgeleiteten Parsern nicht mehr ueberladen werden!
288 virtual sal_Bool
DeclarationParsed( const String
& rProperty
,
289 const CSS1Expression
*pExpr
);
294 SvxCSS1Parser( SfxItemPool
& rPool
,
295 const String
& rBaseURL
,
296 sal_uInt16 nMinFixLineSp
,
297 sal_uInt16
*pWhichIds
=0, sal_uInt16 nWhichIds
=0 );
298 virtual ~SvxCSS1Parser();
300 sal_Bool
IsIgnoreFontFamily() const { return bIgnoreFontFamily
; }
301 void SetIgnoreFontFamily( sal_Bool bSet
) { bIgnoreFontFamily
= bSet
; }
303 // Parsen eines Style-Sheets. Fuer jeden gefundenen Selektor
304 // wird StyleParsed mit dem entsprechenem Item-Set aufgerufen
305 virtual sal_Bool
ParseStyleSheet( const String
& rIn
);
307 // Parsen einer Style-Option. Hier wird einfach nur der Item-Set
309 sal_Bool
ParseStyleOption( const String
& rIn
, SfxItemSet
& rItemSet
,
310 SvxCSS1PropertyInfo
& rPropInfo
);
312 // Umwandeln eines Strings in den Wert eines Enums
313 static sal_Bool
GetEnum( const CSS1PropertyEnum
*pPropTable
,
314 const String
& rValue
, sal_uInt16
&rEnum
);
316 // Pixel in Twips wandeln
317 static void PixelToTwip( long &nWidth
, long &nHeight
);
319 // Die Breite einer Umrandung einstellen
320 static void SetBorderWidth( SvxBorderLine
& aBorderLine
, sal_uInt16 nWidth
,
321 sal_Bool bDouble
, sal_Bool bTable
=sal_False
);
323 // Die Font-Hoehe fuer eine bestimmte Font-Groesse (0-6) ermitteln
324 virtual sal_uInt32
GetFontHeight( sal_uInt16 nSize
) const;
326 virtual const FontList
*GetFontList() const;
328 const sal_uInt16
*GetWhichMap() const { return aWhichMap
.GetData(); }
330 SvxCSS1MapEntry
*GetMapEntry( const String
& rKey
,
331 const SvxCSS1Map
& rMap
) const;
333 void InsertMapEntry( const String
& rKey
, const SfxItemSet
& rItemSet
,
334 const SvxCSS1PropertyInfo
& rProp
, SvxCSS1Map
& rMap
);
336 void InsertId( const String
& rId
, const SfxItemSet
& rItemSet
,
337 const SvxCSS1PropertyInfo
& rProp
);
339 inline SvxCSS1MapEntry
*GetId( const String
& rId
) const;
341 void InsertClass( const String
& rClass
, const SfxItemSet
& rItemSet
,
342 const SvxCSS1PropertyInfo
& rProp
);
344 inline SvxCSS1MapEntry
*GetClass( const String
& rClass
) const;
346 inline void InsertPage( const String
& rPage
, sal_Bool bPseudo
,
347 const SfxItemSet
& rItemSet
,
348 const SvxCSS1PropertyInfo
& rProp
);
350 inline SvxCSS1MapEntry
*GetPage( const String
& rPage
, sal_Bool bPseudo
) const;
352 inline SvxCSS1MapEntry
*GetPage( sal_uInt16 i
) const { return aPages
[i
]; }
353 sal_uInt16
GetPageCount() const { return aPages
.Count(); }
355 void InsertTag( const String
& rTag
, const SfxItemSet
& rItemSet
,
356 const SvxCSS1PropertyInfo
& rProp
);
358 inline SvxCSS1MapEntry
*GetTag( const String
& rTag
) const;
360 void MergeStyles( const SfxItemSet
& rSrcSet
,
361 const SvxCSS1PropertyInfo
& rSrcInfo
,
362 SfxItemSet
& rTargetSet
,
363 SvxCSS1PropertyInfo
& rTargetInfo
,
366 sal_uInt16
GetMinFixLineSpace() const { return nMinFixLineSpace
; }
368 virtual void SetDfltEncoding( rtl_TextEncoding eEnc
);
369 rtl_TextEncoding
GetDfltEncoding() const { return eDfltEnc
; }
371 sal_Bool
IsSetWesternProps() const { return (nScriptFlags
& CSS1_SCRIPT_WESTERN
) != 0; }
372 sal_Bool
IsSetCJKProps() const { return (nScriptFlags
& CSS1_SCRIPT_CJK
) != 0; }
373 sal_Bool
IsSetCTLProps() const { return (nScriptFlags
& CSS1_SCRIPT_CTL
) != 0; }
375 const String
& GetBaseURL() const { return sBaseURL
;}
379 inline void SvxCSS1Parser::InsertId( const String
& rId
,
380 const SfxItemSet
& rItemSet
,
381 const SvxCSS1PropertyInfo
& rProp
)
383 InsertMapEntry( rId
, rItemSet
, rProp
, aIds
);
386 inline SvxCSS1MapEntry
*SvxCSS1Parser::GetId( const String
& rId
) const
388 return GetMapEntry( rId
, aIds
);
391 inline void SvxCSS1Parser::InsertClass( const String
& rClass
,
392 const SfxItemSet
& rItemSet
,
393 const SvxCSS1PropertyInfo
& rProp
)
395 InsertMapEntry( rClass
, rItemSet
, rProp
, aClasses
);
398 inline SvxCSS1MapEntry
*SvxCSS1Parser::GetClass( const String
& rClass
) const
400 return GetMapEntry( rClass
, aClasses
);
403 inline void SvxCSS1Parser::InsertPage( const String
& rPage
,
405 const SfxItemSet
& rItemSet
,
406 const SvxCSS1PropertyInfo
& rProp
)
408 String
aKey( rPage
);
410 aKey
.Insert( ':', 0 );
411 InsertMapEntry( aKey
, rItemSet
, rProp
, aPages
);
414 inline SvxCSS1MapEntry
*SvxCSS1Parser::GetPage( const String
& rPage
,
415 sal_Bool bPseudo
) const
417 String
aKey( rPage
);
419 aKey
.Insert( ':', 0 );
420 return GetMapEntry( aKey
, aPages
);
423 inline void SvxCSS1Parser::InsertTag( const String
& rTag
,
424 const SfxItemSet
& rItemSet
,
425 const SvxCSS1PropertyInfo
& rProp
)
427 InsertMapEntry( rTag
, rItemSet
, rProp
, aTags
);
430 inline SvxCSS1MapEntry
*SvxCSS1Parser::GetTag( const String
& rTag
) const
432 return GetMapEntry( rTag
, aTags
);