merge the formfield patch from ooo-build
[ooovba.git] / sw / source / filter / html / svxcss1.hxx
blob36ed19fc3af343e0bd3b134fbcbed73682eeb0ed
1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: svxcss1.hxx,v $
10 * $Revision: 1.9 $
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 ************************************************************************/
30 #ifndef _SVXCSS1_HXX
31 #define _SVXCSS1_HXX
33 #include <tools/string.hxx>
34 #include <svtools/itemset.hxx>
35 #include <svx/svxenum.hxx>
37 #ifndef _SVSTDARR_HXX
38 #define _SVSTDARR_USHORTS
39 #include <svtools/svstdarr.hxx>
40 #endif
41 #include <rtl/textenc.h>
42 #include "parcss1.hxx"
44 class SfxItemPool;
45 class SvxBoxItem;
46 class FontList;
48 /* \f */
50 enum SvxCSS1Position
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
56 SVX_CSS1_POS_END
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
66 SVX_CSS1_LTYPE_END
69 // Feature: PrintExt
70 enum SvxCSS1SizeType
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
77 SVX_CSS1_STYPE_END
80 enum SvxCSS1PageBreak
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
88 SVX_CSS1_PBREAK_END
91 // /Feature: PrintExt
93 #define CSS1_SCRIPT_WESTERN 0x01
94 #define CSS1_SCRIPT_CJK 0x02
95 #define CSS1_SCRIPT_CTL 0x04
96 #define CSS1_SCRIPT_ALL 0x07
98 /* \f */
100 struct CSS1PropertyEnum
102 const sal_Char *pName; // Wert einer Property
103 sal_uInt16 nEnum; // und der dazugehoerige Wert eines Enums
107 /* \f */
109 class SvxBorderLine;
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();
124 public:
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;
135 SvxAdjust eFloat;
137 SvxCSS1Position ePosition;
139 sal_uInt16 nTopBorderDistance;
140 sal_uInt16 nBottomBorderDistance;
141 sal_uInt16 nLeftBorderDistance;
142 sal_uInt16 nRightBorderDistance;
144 long nLeft, nTop;
145 long nWidth, nHeight;
146 long nLeftMargin, nRightMargin;
148 SvxCSS1LengthType eLeftType, eTopType;
149 SvxCSS1LengthType eWidthType, eHeightType;
151 // Feature: PrintExt
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 );
164 void Clear();
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
177 String aKey;
178 SfxItemSet aItemSet;
179 SvxCSS1PropertyInfo aPropInfo;
181 public:
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;
221 #endif
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
226 // gespeichert.
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
234 SvxCSS1Map aIds;
235 SvxCSS1Map aClasses;
236 SvxCSS1Map aPages;
237 SvxCSS1Map aTags;
239 String sBaseURL;
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;
262 protected:
264 using CSS1Parser::ParseStyleSheet;
266 // Diese Methode wird fuer jeden Selektor mit dem zugehoerigen
267 // Item-Set aufgerufen. Fuer einen Selektor koennen mehrere
268 // Aufrufe erfolgen.
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,
283 sal_Bool bFirst );
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 );
291 public:
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
308 // gefuellt.
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,
364 sal_Bool bSmart );
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,
404 sal_Bool bPseudo,
405 const SfxItemSet& rItemSet,
406 const SvxCSS1PropertyInfo& rProp )
408 String aKey( rPage );
409 if( bPseudo )
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 );
418 if( bPseudo )
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 );
436 #endif