1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22
23 #ifndef _SVXCSS1_HXX
24 #define _SVXCSS1_HXX
25
26 #include <tools/string.hxx>
27 #include <svl/itemset.hxx>
28 #include <editeng/svxenum.hxx>
29
30 #ifndef _SVSTDARR_HXX
31 #define _SVSTDARR_USHORTS
32 #include <svl/svstdarr.hxx>
33 #endif
34 #include <rtl/textenc.h>
35 #include "parcss1.hxx"
36
37 class SfxItemPool;
38 class SvxBoxItem;
39 class FontList;
40
41 /* */
42
43 enum SvxCSS1Position
44 {
45 SVX_CSS1_POS_NONE, // nichts angegeben
46 SVX_CSS1_POS_STATIC, // normal
47 SVX_CSS1_POS_ABSOLUTE, // absolut
48 SVX_CSS1_POS_RELATIVE, // relativ
49 SVX_CSS1_POS_END
50 };
51
52
53 enum SvxCSS1LengthType
54 {
55 SVX_CSS1_LTYPE_NONE, // nichts angegeben
56 SVX_CSS1_LTYPE_AUTO, // automatisch
57 SVX_CSS1_LTYPE_TWIP, // twip
58 SVX_CSS1_LTYPE_PERCENTAGE, // %-Angabe
59 SVX_CSS1_LTYPE_END
60 };
61
62 // Feature: PrintExt
63 enum SvxCSS1SizeType
64 {
65 SVX_CSS1_STYPE_NONE, // nichts angegeben
66 SVX_CSS1_STYPE_AUTO, // automatisch
67 SVX_CSS1_STYPE_TWIP, // twip
68 SVX_CSS1_STYPE_LANDSCAPE, // Landscape
69 SVX_CSS1_STYPE_PORTRAIT, // Landscape
70 SVX_CSS1_STYPE_END
71 };
72
73 enum SvxCSS1PageBreak
74 {
75 SVX_CSS1_PBREAK_NONE, // nichts angegeben
76 SVX_CSS1_PBREAK_AUTO, // automatisch
77 SVX_CSS1_PBREAK_ALWAYS, // immer
78 SVX_CSS1_PBREAK_AVOID, // nie
79 SVX_CSS1_PBREAK_LEFT, // naechste Seite ist eine linke
80 SVX_CSS1_PBREAK_RIGHT, // naechste Seite ist eine rechte
81 SVX_CSS1_PBREAK_END
82 };
83
84 // /Feature: PrintExt
85
86 #define CSS1_SCRIPT_WESTERN 0x01
87 #define CSS1_SCRIPT_CJK 0x02
88 #define CSS1_SCRIPT_CTL 0x04
89 #define CSS1_SCRIPT_ALL 0x07
90
91 /* */
92
93 struct CSS1PropertyEnum
94 {
95 const sal_Char *pName; // Wert einer Property
96 sal_uInt16 nEnum; // und der dazugehoerige Wert eines Enums
97 };
98
99
100 /* */
101
102 class SvxBorderLine;
103
104 SV_DECL_PTRARR_DEL( CSS1Selectors, CSS1Selector*, 1, 1 )
105
106 #define SVX_CSS1_BORDERINFO_WIDTH 1
107 #define SVX_CSS1_BORDERINFO_COLOR 2
108 #define SVX_CSS1_BORDERINFO_STYLE 4
109
110 struct SvxCSS1BorderInfo;
111 class SvxCSS1PropertyInfo
112 {
113 SvxCSS1BorderInfo *aBorderInfos[4];
114
115 void DestroyBorderInfos();
116
117 public:
118
119 String aId; // ID fuer Bookmarks, Rahmen etc.
120
121 sal_Bool bTopMargin : 1;
122 sal_Bool bBottomMargin : 1;
123
124 sal_Bool bLeftMargin : 1;
125 sal_Bool bRightMargin : 1;
126 sal_Bool bTextIndent : 1;
127
128 SvxAdjust eFloat;
129
130 SvxCSS1Position ePosition;
131
132 sal_uInt16 nTopBorderDistance;
133 sal_uInt16 nBottomBorderDistance;
134 sal_uInt16 nLeftBorderDistance;
135 sal_uInt16 nRightBorderDistance;
136
137 long nLeft, nTop;
138 long nWidth, nHeight;
139 long nLeftMargin, nRightMargin;
140
141 SvxCSS1LengthType eLeftType, eTopType;
142 SvxCSS1LengthType eWidthType, eHeightType;
143
144 // Feature: PrintExt
145 SvxCSS1SizeType eSizeType;
146
147 SvxCSS1PageBreak ePageBreakBefore;
148 SvxCSS1PageBreak ePageBreakAfter;
149 // /Feature: PrintExt
150
151 SvxCSS1PropertyInfo();
152 SvxCSS1PropertyInfo( const SvxCSS1PropertyInfo& rProp );
153 ~SvxCSS1PropertyInfo();
154
155 void Merge( const SvxCSS1PropertyInfo& rProp );
156
157 void Clear();
158
159 SvxCSS1BorderInfo *GetBorderInfo( sal_uInt16 nLine, sal_Bool bCreate=sal_True );
160 void CopyBorderInfo( sal_uInt16 nSrcLine, sal_uInt16 nDstLine, sal_uInt16 nWhat );
161 void CopyBorderInfo( sal_uInt16 nCount, sal_uInt16 nWhat );
162
163 void SetBoxItem( SfxItemSet& rItemSet, sal_uInt16 nMinBorderDist,
164 const SvxBoxItem* pDflt=0, sal_Bool bTable = sal_False );
165
166 };
167
168 class SvxCSS1MapEntry
169 {
170 String aKey;
171 SfxItemSet aItemSet;
172 SvxCSS1PropertyInfo aPropInfo;
173
174 public:
175
SvxCSS1MapEntry(SfxItemPool & rPool,const sal_uInt16 * pWhichMap)176 SvxCSS1MapEntry( SfxItemPool& rPool, const sal_uInt16 *pWhichMap ) :
177 aItemSet( rPool, pWhichMap )
178 {}
179
180 SvxCSS1MapEntry( const String& rKey, const SfxItemSet& rItemSet,
181 const SvxCSS1PropertyInfo& rProp );
182
183
GetItemSet() const184 const SfxItemSet& GetItemSet() const { return aItemSet; }
GetItemSet()185 SfxItemSet& GetItemSet() { return aItemSet; }
186
GetPropertyInfo() const187 const SvxCSS1PropertyInfo& GetPropertyInfo() const { return aPropInfo; }
GetPropertyInfo()188 SvxCSS1PropertyInfo& GetPropertyInfo() { return aPropInfo; }
189
GetKey() const190 const String& GetKey() const { return aKey; }
191 // TODO: ToUpperAscii -> ???
SetKey(const String & rKey)192 void SetKey( const String& rKey ) { aKey = rKey; aKey.ToUpperAscii(); }
193
194 friend sal_Bool operator==( const SvxCSS1MapEntry& rE1,
195 const SvxCSS1MapEntry& rE2 );
196 friend sal_Bool operator<( const SvxCSS1MapEntry& rE1,
197 const SvxCSS1MapEntry& rE2 );
198 };
199
200 typedef SvxCSS1MapEntry *SvxCSS1MapEntryPtr;
201 SV_DECL_PTRARR_SORT_DEL( SvxCSS1Map, SvxCSS1MapEntryPtr, 5, 5 )
202
203
204 #if !defined( ICC ) && !defined( BLC )
operator ==(const SvxCSS1MapEntry & rE1,const SvxCSS1MapEntry & rE2)205 inline sal_Bool operator==( const SvxCSS1MapEntry& rE1, const SvxCSS1MapEntry& rE2 )
206 {
207 return rE1.aKey==rE2.aKey;
208 }
209
operator <(const SvxCSS1MapEntry & rE1,const SvxCSS1MapEntry & rE2)210 inline sal_Bool operator<( const SvxCSS1MapEntry& rE1, const SvxCSS1MapEntry& rE2 )
211 {
212 return rE1.aKey<rE2.aKey;
213 }
214 #endif
215
216 // Diese Klasse bereitet den Output des CSS1-Parsers auf,
217 // indem die CSS1-Properties in SvxItem(Set)s umgewandelt werden.
218 // Ausserdem werden die Selektoren samt zugehoeriger Item-Set
219 // gespeichert.
220 // Ein abgeleiteter Parser kann dies fuer einzelne Selektoren unterdruecken,
221 // indem er die Methode StyleParsed ueberlaed.
222
223 class SvxCSS1Parser : public CSS1Parser
224 {
225 CSS1Selectors aSelectors; // Liste der "offenen" Selectoren
226
227 SvxCSS1Map aIds;
228 SvxCSS1Map aClasses;
229 SvxCSS1Map aPages;
230 SvxCSS1Map aTags;
231
232 String sBaseURL;
233
234 SfxItemSet *pSheetItemSet; // der Item-Set fuer Style-Sheets
235 SfxItemSet *pItemSet; // der aktuelle Item-Set
236 SvxCSS1MapEntry *pSearchEntry;
237
238 SvxCSS1PropertyInfo *pSheetPropInfo;
239 SvxCSS1PropertyInfo *pPropInfo;
240
241 sal_uInt16 nMinFixLineSpace; // Mindest-Abstand fuer festen Zeilenabstand
242
243 rtl_TextEncoding eDfltEnc;
244 sal_uInt16 nScriptFlags;
245
246 sal_Bool bIgnoreFontFamily;
247
248 void ParseProperty( const String& rProperty,
249 const CSS1Expression *pExpr );
250
251 SvUShorts aWhichMap; // Which-Map des Parser
252
253 using CSS1Parser::ParseStyleOption;
254
255 protected:
256
257 using CSS1Parser::ParseStyleSheet;
258
259 // Diese Methode wird fuer jeden Selektor mit dem zugehoerigen
260 // Item-Set aufgerufen. Fuer einen Selektor koennen mehrere
261 // Aufrufe erfolgen.
262 // wenn sal_True zuruckgegeben wird, wird der Item-Set bzw. der
263 // Selektor nicht mehr gespeichert!
264 // Der ItemSet darf entsprechend modifiziert werden!
265 // Die Implementierung dieser Methode gibt sal_False zurueck.
266 virtual sal_Bool StyleParsed( const CSS1Selector *pSelector,
267 SfxItemSet& rItemSet,
268 SvxCSS1PropertyInfo& rPropInfo );
269
270 // Diese Methode wird aufgerufen, wenn ein Selektor geparst wurde
271 // Wenn bFirst gesetzt ist, wird der Inhalt von aItemSet in alle
272 // zuletzt angelegten Styles kopiert.
273 // Diese Methode sollte in abgleiteten Parsern nicht mehr
274 // ueberladen werden!
275 virtual sal_Bool SelectorParsed( const CSS1Selector *pSelector,
276 sal_Bool bFirst );
277
278 // Diese Methode wird fuer jede geparste Property aufgerufen
279 // sie fuegt das Item in den ItemSet 'pItemSet' ein
280 // Sie sollte in abgeleiteten Parsern nicht mehr ueberladen werden!
281 virtual sal_Bool DeclarationParsed( const String& rProperty,
282 const CSS1Expression *pExpr );
283
284 public:
285
286
287 SvxCSS1Parser( SfxItemPool& rPool,
288 const String& rBaseURL,
289 sal_uInt16 nMinFixLineSp,
290 sal_uInt16 *pWhichIds=0, sal_uInt16 nWhichIds=0 );
291 virtual ~SvxCSS1Parser();
292
IsIgnoreFontFamily() const293 sal_Bool IsIgnoreFontFamily() const { return bIgnoreFontFamily; }
SetIgnoreFontFamily(sal_Bool bSet)294 void SetIgnoreFontFamily( sal_Bool bSet ) { bIgnoreFontFamily = bSet; }
295
296 // Parsen eines Style-Sheets. Fuer jeden gefundenen Selektor
297 // wird StyleParsed mit dem entsprechenem Item-Set aufgerufen
298 virtual sal_Bool ParseStyleSheet( const String& rIn );
299
300 // Parsen einer Style-Option. Hier wird einfach nur der Item-Set
301 // gefuellt.
302 sal_Bool ParseStyleOption( const String& rIn, SfxItemSet& rItemSet,
303 SvxCSS1PropertyInfo& rPropInfo );
304
305 // Umwandeln eines Strings in den Wert eines Enums
306 static sal_Bool GetEnum( const CSS1PropertyEnum *pPropTable,
307 const String& rValue, sal_uInt16 &rEnum );
308
309 // Pixel in Twips wandeln
310 static void PixelToTwip( long &nWidth, long &nHeight );
311
312 // Die Breite einer Umrandung einstellen
313 static void SetBorderWidth( SvxBorderLine& aBorderLine, sal_uInt16 nWidth,
314 sal_Bool bDouble, sal_Bool bTable=sal_False );
315
316 // Die Font-Hoehe fuer eine bestimmte Font-Groesse (0-6) ermitteln
317 virtual sal_uInt32 GetFontHeight( sal_uInt16 nSize ) const;
318
319 virtual const FontList *GetFontList() const;
320
GetWhichMap() const321 const sal_uInt16 *GetWhichMap() const { return aWhichMap.GetData(); }
322
323 SvxCSS1MapEntry *GetMapEntry( const String& rKey,
324 const SvxCSS1Map& rMap ) const;
325
326 void InsertMapEntry( const String& rKey, const SfxItemSet& rItemSet,
327 const SvxCSS1PropertyInfo& rProp, SvxCSS1Map& rMap );
328
329 void InsertId( const String& rId, const SfxItemSet& rItemSet,
330 const SvxCSS1PropertyInfo& rProp );
331
332 inline SvxCSS1MapEntry *GetId( const String& rId ) const;
333
334 void InsertClass( const String& rClass, const SfxItemSet& rItemSet,
335 const SvxCSS1PropertyInfo& rProp );
336
337 inline SvxCSS1MapEntry *GetClass( const String& rClass ) const;
338
339 inline void InsertPage( const String& rPage, sal_Bool bPseudo,
340 const SfxItemSet& rItemSet,
341 const SvxCSS1PropertyInfo& rProp );
342
343 inline SvxCSS1MapEntry *GetPage( const String& rPage, sal_Bool bPseudo ) const;
344
GetPage(sal_uInt16 i) const345 inline SvxCSS1MapEntry *GetPage( sal_uInt16 i ) const { return aPages[i]; }
GetPageCount() const346 sal_uInt16 GetPageCount() const { return aPages.Count(); }
347
348 void InsertTag( const String& rTag, const SfxItemSet& rItemSet,
349 const SvxCSS1PropertyInfo& rProp );
350
351 inline SvxCSS1MapEntry *GetTag( const String& rTag ) const;
352
353 void MergeStyles( const SfxItemSet& rSrcSet,
354 const SvxCSS1PropertyInfo& rSrcInfo,
355 SfxItemSet& rTargetSet,
356 SvxCSS1PropertyInfo& rTargetInfo,
357 sal_Bool bSmart );
358
GetMinFixLineSpace() const359 sal_uInt16 GetMinFixLineSpace() const { return nMinFixLineSpace; }
360
361 virtual void SetDfltEncoding( rtl_TextEncoding eEnc );
GetDfltEncoding() const362 rtl_TextEncoding GetDfltEncoding() const { return eDfltEnc; }
363
IsSetWesternProps() const364 sal_Bool IsSetWesternProps() const { return (nScriptFlags & CSS1_SCRIPT_WESTERN) != 0; }
IsSetCJKProps() const365 sal_Bool IsSetCJKProps() const { return (nScriptFlags & CSS1_SCRIPT_CJK) != 0; }
IsSetCTLProps() const366 sal_Bool IsSetCTLProps() const { return (nScriptFlags & CSS1_SCRIPT_CTL) != 0; }
367
GetBaseURL() const368 const String& GetBaseURL() const { return sBaseURL;}
369
370 };
371
InsertId(const String & rId,const SfxItemSet & rItemSet,const SvxCSS1PropertyInfo & rProp)372 inline void SvxCSS1Parser::InsertId( const String& rId,
373 const SfxItemSet& rItemSet,
374 const SvxCSS1PropertyInfo& rProp )
375 {
376 InsertMapEntry( rId, rItemSet, rProp, aIds );
377 }
378
GetId(const String & rId) const379 inline SvxCSS1MapEntry *SvxCSS1Parser::GetId( const String& rId ) const
380 {
381 return GetMapEntry( rId, aIds );
382 }
383
InsertClass(const String & rClass,const SfxItemSet & rItemSet,const SvxCSS1PropertyInfo & rProp)384 inline void SvxCSS1Parser::InsertClass( const String& rClass,
385 const SfxItemSet& rItemSet,
386 const SvxCSS1PropertyInfo& rProp )
387 {
388 InsertMapEntry( rClass, rItemSet, rProp, aClasses );
389 }
390
GetClass(const String & rClass) const391 inline SvxCSS1MapEntry *SvxCSS1Parser::GetClass( const String& rClass ) const
392 {
393 return GetMapEntry( rClass, aClasses );
394 }
395
InsertPage(const String & rPage,sal_Bool bPseudo,const SfxItemSet & rItemSet,const SvxCSS1PropertyInfo & rProp)396 inline void SvxCSS1Parser::InsertPage( const String& rPage,
397 sal_Bool bPseudo,
398 const SfxItemSet& rItemSet,
399 const SvxCSS1PropertyInfo& rProp )
400 {
401 String aKey( rPage );
402 if( bPseudo )
403 aKey.Insert( ':', 0 );
404 InsertMapEntry( aKey, rItemSet, rProp, aPages );
405 }
406
GetPage(const String & rPage,sal_Bool bPseudo) const407 inline SvxCSS1MapEntry *SvxCSS1Parser::GetPage( const String& rPage,
408 sal_Bool bPseudo ) const
409 {
410 String aKey( rPage );
411 if( bPseudo )
412 aKey.Insert( ':', 0 );
413 return GetMapEntry( aKey, aPages );
414 }
415
InsertTag(const String & rTag,const SfxItemSet & rItemSet,const SvxCSS1PropertyInfo & rProp)416 inline void SvxCSS1Parser::InsertTag( const String& rTag,
417 const SfxItemSet& rItemSet,
418 const SvxCSS1PropertyInfo& rProp )
419 {
420 InsertMapEntry( rTag, rItemSet, rProp, aTags );
421 }
422
GetTag(const String & rTag) const423 inline SvxCSS1MapEntry *SvxCSS1Parser::GetTag( const String& rTag ) const
424 {
425 return GetMapEntry( rTag, aTags );
426 }
427
428
429 #endif
430
431
432