blob: bb7689b33e202838ccd033089cd1e2d2cf8325f4 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#ifndef _SVXCSS1_HXX
#define _SVXCSS1_HXX
#include <tools/string.hxx>
#include <svl/itemset.hxx>
#include <editeng/svxenum.hxx>
#ifndef _SVSTDARR_HXX
#define _SVSTDARR_USHORTS
#include <svl/svstdarr.hxx>
#endif
#include <rtl/textenc.h>
#include "parcss1.hxx"
class SfxItemPool;
class SvxBoxItem;
class FontList;
/* */
enum SvxCSS1Position
{
SVX_CSS1_POS_NONE, // nichts angegeben
SVX_CSS1_POS_STATIC, // normal
SVX_CSS1_POS_ABSOLUTE, // absolut
SVX_CSS1_POS_RELATIVE, // relativ
SVX_CSS1_POS_END
};
enum SvxCSS1LengthType
{
SVX_CSS1_LTYPE_NONE, // nichts angegeben
SVX_CSS1_LTYPE_AUTO, // automatisch
SVX_CSS1_LTYPE_TWIP, // twip
SVX_CSS1_LTYPE_PERCENTAGE, // %-Angabe
SVX_CSS1_LTYPE_END
};
// Feature: PrintExt
enum SvxCSS1SizeType
{
SVX_CSS1_STYPE_NONE, // nichts angegeben
SVX_CSS1_STYPE_AUTO, // automatisch
SVX_CSS1_STYPE_TWIP, // twip
SVX_CSS1_STYPE_LANDSCAPE, // Landscape
SVX_CSS1_STYPE_PORTRAIT, // Landscape
SVX_CSS1_STYPE_END
};
enum SvxCSS1PageBreak
{
SVX_CSS1_PBREAK_NONE, // nichts angegeben
SVX_CSS1_PBREAK_AUTO, // automatisch
SVX_CSS1_PBREAK_ALWAYS, // immer
SVX_CSS1_PBREAK_AVOID, // nie
SVX_CSS1_PBREAK_LEFT, // naechste Seite ist eine linke
SVX_CSS1_PBREAK_RIGHT, // naechste Seite ist eine rechte
SVX_CSS1_PBREAK_END
};
// /Feature: PrintExt
#define CSS1_SCRIPT_WESTERN 0x01
#define CSS1_SCRIPT_CJK 0x02
#define CSS1_SCRIPT_CTL 0x04
#define CSS1_SCRIPT_ALL 0x07
/* */
struct CSS1PropertyEnum
{
const sal_Char *pName; // Wert einer Property
sal_uInt16 nEnum; // und der dazugehoerige Wert eines Enums
};
/* */
class SvxBorderLine;
SV_DECL_PTRARR_DEL( CSS1Selectors, CSS1Selector*, 1, 1 )
#define SVX_CSS1_BORDERINFO_WIDTH 1
#define SVX_CSS1_BORDERINFO_COLOR 2
#define SVX_CSS1_BORDERINFO_STYLE 4
struct SvxCSS1BorderInfo;
class SvxCSS1PropertyInfo
{
SvxCSS1BorderInfo *aBorderInfos[4];
void DestroyBorderInfos();
public:
String aId; // ID fuer Bookmarks, Rahmen etc.
sal_Bool bTopMargin : 1;
sal_Bool bBottomMargin : 1;
sal_Bool bLeftMargin : 1;
sal_Bool bRightMargin : 1;
sal_Bool bTextIndent : 1;
SvxAdjust eFloat;
SvxCSS1Position ePosition;
sal_uInt16 nTopBorderDistance;
sal_uInt16 nBottomBorderDistance;
sal_uInt16 nLeftBorderDistance;
sal_uInt16 nRightBorderDistance;
long nLeft, nTop;
long nWidth, nHeight;
long nLeftMargin, nRightMargin;
SvxCSS1LengthType eLeftType, eTopType;
SvxCSS1LengthType eWidthType, eHeightType;
// Feature: PrintExt
SvxCSS1SizeType eSizeType;
SvxCSS1PageBreak ePageBreakBefore;
SvxCSS1PageBreak ePageBreakAfter;
// /Feature: PrintExt
SvxCSS1PropertyInfo();
SvxCSS1PropertyInfo( const SvxCSS1PropertyInfo& rProp );
~SvxCSS1PropertyInfo();
void Merge( const SvxCSS1PropertyInfo& rProp );
void Clear();
SvxCSS1BorderInfo *GetBorderInfo( sal_uInt16 nLine, sal_Bool bCreate=sal_True );
void CopyBorderInfo( sal_uInt16 nSrcLine, sal_uInt16 nDstLine, sal_uInt16 nWhat );
void CopyBorderInfo( sal_uInt16 nCount, sal_uInt16 nWhat );
void SetBoxItem( SfxItemSet& rItemSet, sal_uInt16 nMinBorderDist,
const SvxBoxItem* pDflt=0, sal_Bool bTable = sal_False );
};
class SvxCSS1MapEntry
{
String aKey;
SfxItemSet aItemSet;
SvxCSS1PropertyInfo aPropInfo;
public:
SvxCSS1MapEntry( SfxItemPool& rPool, const sal_uInt16 *pWhichMap ) :
aItemSet( rPool, pWhichMap )
{}
SvxCSS1MapEntry( const String& rKey, const SfxItemSet& rItemSet,
const SvxCSS1PropertyInfo& rProp );
const SfxItemSet& GetItemSet() const { return aItemSet; }
SfxItemSet& GetItemSet() { return aItemSet; }
const SvxCSS1PropertyInfo& GetPropertyInfo() const { return aPropInfo; }
SvxCSS1PropertyInfo& GetPropertyInfo() { return aPropInfo; }
const String& GetKey() const { return aKey; }
// TODO: ToUpperAscii -> ???
void SetKey( const String& rKey ) { aKey = rKey; aKey.ToUpperAscii(); }
friend sal_Bool operator==( const SvxCSS1MapEntry& rE1,
const SvxCSS1MapEntry& rE2 );
friend sal_Bool operator<( const SvxCSS1MapEntry& rE1,
const SvxCSS1MapEntry& rE2 );
};
typedef SvxCSS1MapEntry *SvxCSS1MapEntryPtr;
SV_DECL_PTRARR_SORT_DEL( SvxCSS1Map, SvxCSS1MapEntryPtr, 5, 5 )
#if !defined( ICC ) && !defined( BLC )
inline sal_Bool operator==( const SvxCSS1MapEntry& rE1, const SvxCSS1MapEntry& rE2 )
{
return rE1.aKey==rE2.aKey;
}
inline sal_Bool operator<( const SvxCSS1MapEntry& rE1, const SvxCSS1MapEntry& rE2 )
{
return rE1.aKey<rE2.aKey;
}
#endif
// Diese Klasse bereitet den Output des CSS1-Parsers auf,
// indem die CSS1-Properties in SvxItem(Set)s umgewandelt werden.
// Ausserdem werden die Selektoren samt zugehoeriger Item-Set
// gespeichert.
// Ein abgeleiteter Parser kann dies fuer einzelne Selektoren unterdruecken,
// indem er die Methode StyleParsed ueberlaed.
class SvxCSS1Parser : public CSS1Parser
{
CSS1Selectors aSelectors; // Liste der "offenen" Selectoren
SvxCSS1Map aIds;
SvxCSS1Map aClasses;
SvxCSS1Map aPages;
SvxCSS1Map aTags;
String sBaseURL;
SfxItemSet *pSheetItemSet; // der Item-Set fuer Style-Sheets
SfxItemSet *pItemSet; // der aktuelle Item-Set
SvxCSS1MapEntry *pSearchEntry;
SvxCSS1PropertyInfo *pSheetPropInfo;
SvxCSS1PropertyInfo *pPropInfo;
sal_uInt16 nMinFixLineSpace; // Mindest-Abstand fuer festen Zeilenabstand
rtl_TextEncoding eDfltEnc;
sal_uInt16 nScriptFlags;
sal_Bool bIgnoreFontFamily;
void ParseProperty( const String& rProperty,
const CSS1Expression *pExpr );
SvUShorts aWhichMap; // Which-Map des Parser
using CSS1Parser::ParseStyleOption;
protected:
using CSS1Parser::ParseStyleSheet;
// Diese Methode wird fuer jeden Selektor mit dem zugehoerigen
// Item-Set aufgerufen. Fuer einen Selektor koennen mehrere
// Aufrufe erfolgen.
// wenn sal_True zuruckgegeben wird, wird der Item-Set bzw. der
// Selektor nicht mehr gespeichert!
// Der ItemSet darf entsprechend modifiziert werden!
// Die Implementierung dieser Methode gibt sal_False zurueck.
virtual sal_Bool StyleParsed( const CSS1Selector *pSelector,
SfxItemSet& rItemSet,
SvxCSS1PropertyInfo& rPropInfo );
// Diese Methode wird aufgerufen, wenn ein Selektor geparst wurde
// Wenn bFirst gesetzt ist, wird der Inhalt von aItemSet in alle
// zuletzt angelegten Styles kopiert.
// Diese Methode sollte in abgleiteten Parsern nicht mehr
// ueberladen werden!
virtual sal_Bool SelectorParsed( const CSS1Selector *pSelector,
sal_Bool bFirst );
// Diese Methode wird fuer jede geparste Property aufgerufen
// sie fuegt das Item in den ItemSet 'pItemSet' ein
// Sie sollte in abgeleiteten Parsern nicht mehr ueberladen werden!
virtual sal_Bool DeclarationParsed( const String& rProperty,
const CSS1Expression *pExpr );
public:
SvxCSS1Parser( SfxItemPool& rPool,
const String& rBaseURL,
sal_uInt16 nMinFixLineSp,
sal_uInt16 *pWhichIds=0, sal_uInt16 nWhichIds=0 );
virtual ~SvxCSS1Parser();
sal_Bool IsIgnoreFontFamily() const { return bIgnoreFontFamily; }
void SetIgnoreFontFamily( sal_Bool bSet ) { bIgnoreFontFamily = bSet; }
// Parsen eines Style-Sheets. Fuer jeden gefundenen Selektor
// wird StyleParsed mit dem entsprechenem Item-Set aufgerufen
virtual sal_Bool ParseStyleSheet( const String& rIn );
// Parsen einer Style-Option. Hier wird einfach nur der Item-Set
// gefuellt.
sal_Bool ParseStyleOption( const String& rIn, SfxItemSet& rItemSet,
SvxCSS1PropertyInfo& rPropInfo );
// Umwandeln eines Strings in den Wert eines Enums
static sal_Bool GetEnum( const CSS1PropertyEnum *pPropTable,
const String& rValue, sal_uInt16 &rEnum );
// Pixel in Twips wandeln
static void PixelToTwip( long &nWidth, long &nHeight );
// Die Breite einer Umrandung einstellen
static void SetBorderWidth( SvxBorderLine& aBorderLine, sal_uInt16 nWidth,
sal_Bool bDouble, sal_Bool bTable=sal_False );
// Die Font-Hoehe fuer eine bestimmte Font-Groesse (0-6) ermitteln
virtual sal_uInt32 GetFontHeight( sal_uInt16 nSize ) const;
virtual const FontList *GetFontList() const;
const sal_uInt16 *GetWhichMap() const { return aWhichMap.GetData(); }
SvxCSS1MapEntry *GetMapEntry( const String& rKey,
const SvxCSS1Map& rMap ) const;
void InsertMapEntry( const String& rKey, const SfxItemSet& rItemSet,
const SvxCSS1PropertyInfo& rProp, SvxCSS1Map& rMap );
void InsertId( const String& rId, const SfxItemSet& rItemSet,
const SvxCSS1PropertyInfo& rProp );
inline SvxCSS1MapEntry *GetId( const String& rId ) const;
void InsertClass( const String& rClass, const SfxItemSet& rItemSet,
const SvxCSS1PropertyInfo& rProp );
inline SvxCSS1MapEntry *GetClass( const String& rClass ) const;
inline void InsertPage( const String& rPage, sal_Bool bPseudo,
const SfxItemSet& rItemSet,
const SvxCSS1PropertyInfo& rProp );
inline SvxCSS1MapEntry *GetPage( const String& rPage, sal_Bool bPseudo ) const;
inline SvxCSS1MapEntry *GetPage( sal_uInt16 i ) const { return aPages[i]; }
sal_uInt16 GetPageCount() const { return aPages.Count(); }
void InsertTag( const String& rTag, const SfxItemSet& rItemSet,
const SvxCSS1PropertyInfo& rProp );
inline SvxCSS1MapEntry *GetTag( const String& rTag ) const;
void MergeStyles( const SfxItemSet& rSrcSet,
const SvxCSS1PropertyInfo& rSrcInfo,
SfxItemSet& rTargetSet,
SvxCSS1PropertyInfo& rTargetInfo,
sal_Bool bSmart );
sal_uInt16 GetMinFixLineSpace() const { return nMinFixLineSpace; }
virtual void SetDfltEncoding( rtl_TextEncoding eEnc );
rtl_TextEncoding GetDfltEncoding() const { return eDfltEnc; }
sal_Bool IsSetWesternProps() const { return (nScriptFlags & CSS1_SCRIPT_WESTERN) != 0; }
sal_Bool IsSetCJKProps() const { return (nScriptFlags & CSS1_SCRIPT_CJK) != 0; }
sal_Bool IsSetCTLProps() const { return (nScriptFlags & CSS1_SCRIPT_CTL) != 0; }
const String& GetBaseURL() const { return sBaseURL;}
};
inline void SvxCSS1Parser::InsertId( const String& rId,
const SfxItemSet& rItemSet,
const SvxCSS1PropertyInfo& rProp )
{
InsertMapEntry( rId, rItemSet, rProp, aIds );
}
inline SvxCSS1MapEntry *SvxCSS1Parser::GetId( const String& rId ) const
{
return GetMapEntry( rId, aIds );
}
inline void SvxCSS1Parser::InsertClass( const String& rClass,
const SfxItemSet& rItemSet,
const SvxCSS1PropertyInfo& rProp )
{
InsertMapEntry( rClass, rItemSet, rProp, aClasses );
}
inline SvxCSS1MapEntry *SvxCSS1Parser::GetClass( const String& rClass ) const
{
return GetMapEntry( rClass, aClasses );
}
inline void SvxCSS1Parser::InsertPage( const String& rPage,
sal_Bool bPseudo,
const SfxItemSet& rItemSet,
const SvxCSS1PropertyInfo& rProp )
{
String aKey( rPage );
if( bPseudo )
aKey.Insert( ':', 0 );
InsertMapEntry( aKey, rItemSet, rProp, aPages );
}
inline SvxCSS1MapEntry *SvxCSS1Parser::GetPage( const String& rPage,
sal_Bool bPseudo ) const
{
String aKey( rPage );
if( bPseudo )
aKey.Insert( ':', 0 );
return GetMapEntry( aKey, aPages );
}
inline void SvxCSS1Parser::InsertTag( const String& rTag,
const SfxItemSet& rItemSet,
const SvxCSS1PropertyInfo& rProp )
{
InsertMapEntry( rTag, rItemSet, rProp, aTags );
}
inline SvxCSS1MapEntry *SvxCSS1Parser::GetTag( const String& rTag ) const
{
return GetMapEntry( rTag, aTags );
}
#endif