| /************************************************************** |
| * |
| * 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 SC_XESTYLE_HXX |
| #define SC_XESTYLE_HXX |
| |
| #include <map> |
| #include <tools/mempool.hxx> |
| #include <tools/string.hxx> |
| #include <svl/zforlist.hxx> |
| #include <svl/nfkeytab.hxx> |
| #include <editeng/svxfont.hxx> |
| #include "xerecord.hxx" |
| #include "xlstyle.hxx" |
| #include "xeroot.hxx" |
| |
| /* ============================================================================ |
| - Buffers for style records (PALETTE, FONT, FORMAT, XF, STYLE). |
| ============================================================================ */ |
| |
| const sal_uInt16 EXC_ID_FONTLIST = 0x8031; /// For internal use only. |
| const sal_uInt16 EXC_ID_FORMATLIST = 0x801E; /// For internal use only. |
| const sal_uInt16 EXC_ID_XFLIST = 0x8043; /// For internal use only. |
| |
| // PALETTE record - color information ========================================= |
| |
| /** Different types of colors in a document. */ |
| enum XclExpColorType |
| { |
| EXC_COLOR_CELLTEXT, /// Text in a cell. |
| EXC_COLOR_CELLBORDER, /// Border of a cell. |
| EXC_COLOR_CELLAREA, /// Background area of a cell. |
| EXC_COLOR_CHARTTEXT, /// Text color in a chart. |
| EXC_COLOR_CHARTLINE, /// Line in a chart. |
| EXC_COLOR_CHARTAREA, /// Area in a chart. |
| EXC_COLOR_CTRLTEXT, /// Text color in a form control. |
| EXC_COLOR_GRID, /// Spreadsheet grid color. |
| EXC_COLOR_TABBG /// Spreadsheet tab bg color. |
| }; |
| |
| // ---------------------------------------------------------------------------- |
| |
| class XclExpPaletteImpl; |
| |
| /** Stores all used colors in the document. |
| |
| Supports color reduction to the maximum count of the current BIFF version. |
| An instance of this class collects all colors in the conversion phase of |
| the export, using the InsertColor() function. It returns a unique |
| identidier for each passed color. |
| |
| After the entire document is converted, the Finalize() function will reduce |
| the palette to the number of colors supported by the current BIFF version. |
| |
| Then, in the streaming phase, the functions GetColorIndex() and |
| GetMixedColors() return the real Excel palette index for all color |
| identifiers. |
| */ |
| class XclExpPalette : public XclDefaultPalette, public XclExpRecord |
| { |
| public: |
| explicit XclExpPalette( const XclExpRoot& rRoot ); |
| virtual ~XclExpPalette(); |
| |
| /** Inserts the color into the list and updates weighting. |
| @param nAutoDefault The Excel palette index for automatic color. |
| @return A unique ID for this color. */ |
| sal_uInt32 InsertColor( const Color& rColor, XclExpColorType eType, sal_uInt16 nAutoDefault = 0 ); |
| /** Returns the color ID representing a fixed Excel palette index (i.e. for auto colors). */ |
| static sal_uInt32 GetColorIdFromIndex( sal_uInt16 nIndex ); |
| |
| /** Reduces the color list to the maximum count of the current BIFF version. */ |
| void Finalize(); |
| |
| /** Returns the Excel palette index of the color with passed color ID. */ |
| sal_uInt16 GetColorIndex( sal_uInt32 nColorId ) const; |
| |
| /** Returns a foreground and background color for the two passed color IDs. |
| @descr If rnXclPattern contains a solid pattern, this function tries to find |
| the two best fitting colors and a mix pattern (25%, 50% or 75%) for nForeColorId. |
| This will result in a better approximation to the passed foreground color. */ |
| void GetMixedColors( |
| sal_uInt16& rnXclForeIx, sal_uInt16& rnXclBackIx, sal_uInt8& rnXclPattern, |
| sal_uInt32 nForeColorId, sal_uInt32 nBackColorId ) const; |
| |
| /** Returns the RGB color data for a (non-zero-based) Excel palette entry. |
| @return The color from current or default palette or COL_AUTO, if nothing else found. */ |
| ColorData GetColorData( sal_uInt16 nXclIndex ) const; |
| /** Returns the color for a (non-zero-based) Excel palette entry. |
| @return The color from current or default palette or COL_AUTO, if nothing else found. */ |
| inline Color GetColor( sal_uInt16 nXclIndex ) const |
| { return Color( GetColorData( nXclIndex ) ); } |
| |
| /** Saves the PALETTE record, if it differs from the default palette. */ |
| virtual void Save( XclExpStream& rStrm ); |
| virtual void SaveXml( XclExpXmlStream& rStrm ); |
| |
| private: |
| /** Writes the contents of the PALETTE record. */ |
| virtual void WriteBody( XclExpStream& rStrm ); |
| |
| private: |
| typedef ScfRef< XclExpPaletteImpl > XclExpPaletteImplRef; |
| XclExpPaletteImplRef mxImpl; |
| }; |
| |
| // FONT record - font information ============================================= |
| |
| class Font; |
| class SvxFont; |
| |
| const size_t EXC_FONTLIST_NOTFOUND = static_cast< size_t >( -1 ); |
| |
| // ---------------------------------------------------------------------------- |
| |
| /** Static helper functions for font export. */ |
| class XclExpFontHelper |
| { |
| public: |
| /** Returns the script type of the first font item found in the item set and its parents. */ |
| static sal_Int16 GetFirstUsedScript( |
| const XclExpRoot& rRoot, |
| const SfxItemSet& rItemSet ); |
| |
| /** Returns a VCL font object filled from the passed item set. */ |
| static Font GetFontFromItemSet( |
| const XclExpRoot& rRoot, |
| const SfxItemSet& rItemSet, |
| sal_Int16 nScript ); |
| |
| /** Returns true, if at least one font related item is set in the passed item set. |
| @param bDeep true = Searches in parent item sets too. */ |
| static bool CheckItems( |
| const XclExpRoot& rRoot, |
| const SfxItemSet& rItemSet, |
| sal_Int16 nScript, |
| bool bDeep ); |
| |
| private: |
| XclExpFontHelper(); |
| ~XclExpFontHelper(); |
| }; |
| |
| // ---------------------------------------------------------------------------- |
| |
| /** Stores all data of an Excel font and provides export of FONT records. */ |
| class XclExpFont : public XclExpRecord, protected XclExpRoot |
| { |
| public: |
| explicit XclExpFont( const XclExpRoot& rRoot, |
| const XclFontData& rFontData, XclExpColorType eColorType ); |
| |
| /** Returns read-only access to font data. */ |
| inline const XclFontData& GetFontData() const { return maData; } |
| /** Returns the font color identifier. */ |
| inline sal_uInt32 GetFontColorId() const { return mnColorId; } |
| /** Compares this font with the passed font data. |
| @param nHash The hash value calculated from the font data. */ |
| virtual bool Equals( const XclFontData& rFontData, sal_uInt32 nHash ) const; |
| |
| virtual void SaveXml( XclExpXmlStream& rStrm ); |
| |
| private: |
| /** Writes the contents of the FONT record. */ |
| virtual void WriteBody( XclExpStream& rStrm ); |
| |
| private: |
| XclFontData maData; /// All font attributes. |
| sal_uInt32 mnColorId; /// Unique color ID for text color. |
| sal_uInt32 mnHash; /// Hash value for fast comparison. |
| }; |
| |
| // ---------------------------------------------------------------------------- |
| |
| /** Used as placeholder for font index 4, which is not used in Excel. */ |
| class XclExpBlindFont : public XclExpFont |
| { |
| public: |
| explicit XclExpBlindFont( const XclExpRoot& rRoot ); |
| |
| /** Returns always false to never find this font while searching the font list. */ |
| virtual bool Equals( const XclFontData& rFontData, sal_uInt32 nHash ) const; |
| |
| /** Skips writing this record. */ |
| virtual void Save( XclExpStream& rStrm ); |
| }; |
| |
| // ---------------------------------------------------------------------------- |
| |
| class ScPatternAttr; |
| |
| /** Stores the data of all fonts used in the document. */ |
| class XclExpFontBuffer : public XclExpRecordBase, protected XclExpRoot |
| { |
| public: |
| explicit XclExpFontBuffer( const XclExpRoot& rRoot ); |
| |
| /** Returns the specified font from font list. */ |
| const XclExpFont* GetFont( sal_uInt16 nXclFont ) const; |
| /** Returns the application font data of this file, needed e.g. for column width. */ |
| const XclFontData& GetAppFontData() const; |
| |
| /** Inserts a new font with the passed font data into the buffer if not present. |
| @param bAppFont true = Sets the application font; false = Inserts a new font. |
| @return The resulting Excel font index. */ |
| sal_uInt16 Insert( const XclFontData& rFontData, |
| XclExpColorType eColorType, bool bAppFont = false ); |
| /** Inserts the font into the buffer if not present. |
| @param bAppFont true = Sets the application font; false = Inserts a new font. |
| @return The resulting Excel font index. */ |
| sal_uInt16 Insert( const Font& rFont, |
| XclExpColorType eColorType, bool bAppFont = false ); |
| /** Inserts the SvxFont into the buffer if not present, e.g. where escapements are used. |
| @param bAppFont true = Sets the application font; false = Inserts a new font. |
| @return The resulting Excel font index. */ |
| sal_uInt16 Insert( const SvxFont& rFont, |
| XclExpColorType eColorType, bool bAppFont = false ); |
| /** Inserts the font contained in the passed item set into the buffer, if not present. |
| @param nScript The script type of the font properties to be used. |
| @param bAppFont true = Sets the application font; false = Inserts a new font. |
| @return The resulting Excel font index. */ |
| sal_uInt16 Insert( const SfxItemSet& rItemSet, sal_Int16 nScript, |
| XclExpColorType eColorType, bool bAppFont = false ); |
| /** Inserts the font contained in rPattern into the buffer if not present. |
| @param nScript The script type of the font properties to be used. |
| @param bAppFont true = Sets the application font; false = Inserts a new font. |
| @return The resulting Excel font index. */ |
| sal_uInt16 Insert( const ScPatternAttr& rPattern, sal_Int16 nScript, |
| XclExpColorType eColorType, bool bAppFont = false ); |
| |
| /** Writes all FONT records contained in this buffer. */ |
| virtual void Save( XclExpStream& rStrm ); |
| virtual void SaveXml( XclExpXmlStream& rStrm ); |
| |
| private: |
| /** Initializes the default fonts for the current BIFF version. */ |
| void InitDefaultFonts(); |
| /** Tries to find the passed font and returns the current list index. */ |
| size_t Find( const XclFontData& rFontData ); |
| |
| private: |
| typedef XclExpRecordList< XclExpFont > XclExpFontList; |
| typedef XclExpFontList::RecordRefType XclExpFontRef; |
| |
| XclExpFontList maFontList; /// List of all FONT records. |
| size_t mnXclMaxSize; /// Maximum number of fonts. |
| }; |
| |
| // FORMAT record - number formats ============================================= |
| |
| /** Stores a core number format index with corresponding Excel format index. */ |
| struct XclExpNumFmt |
| { |
| sal_uLong mnScNumFmt; /// Core index of the number format. |
| sal_uInt16 mnXclNumFmt; /// Resulting Excel format index. |
| |
| inline explicit XclExpNumFmt( sal_uLong nScNumFmt, sal_uInt16 nXclNumFmt ) : |
| mnScNumFmt( nScNumFmt ), mnXclNumFmt( nXclNumFmt ) {} |
| }; |
| |
| // ---------------------------------------------------------------------------- |
| |
| class SvNumberFormatter; |
| |
| /** Stores all number formats used in the document. */ |
| class XclExpNumFmtBuffer : public XclExpRecordBase, protected XclExpRoot |
| { |
| public: |
| explicit XclExpNumFmtBuffer( const XclExpRoot& rRoot ); |
| virtual ~XclExpNumFmtBuffer(); |
| |
| /** Returns the core index of the current standard number format. */ |
| inline sal_uLong GetStandardFormat() const { return mnStdFmt; } |
| |
| /** Inserts a number format into the format buffer. |
| @param nScNumFmt The core index of the number format. |
| @return The resulting Excel format index. */ |
| sal_uInt16 Insert( sal_uLong nScNumFmt ); |
| |
| /** Writes all FORMAT records contained in this buffer. */ |
| virtual void Save( XclExpStream& rStrm ); |
| virtual void SaveXml( XclExpXmlStream& rStrm ); |
| |
| private: |
| /** Writes the FORMAT record with index nXclIx and format string rFormatStr. */ |
| void WriteFormatRecord( XclExpStream& rStrm, sal_uInt16 nXclNumFmt, const String& rFormatStr ); |
| /** Writes the FORMAT record represented by rFormat. */ |
| void WriteFormatRecord( XclExpStream& rStrm, const XclExpNumFmt& rFormat ); |
| |
| String GetFormatCode ( const XclExpNumFmt& rFormat ); |
| |
| private: |
| typedef ::std::auto_ptr< SvNumberFormatter > SvNumberFormatterPtr; |
| typedef ::std::vector< XclExpNumFmt > XclExpNumFmtVec; |
| typedef NfKeywordTable* NfKeywordTablePtr; |
| |
| SvNumberFormatterPtr mxFormatter; /// Special number formatter for conversion. |
| XclExpNumFmtVec maFormatMap; /// Maps core formats to Excel indexes. |
| NfKeywordTablePtr mpKeywordTable; /// Replacement table. |
| sal_uLong mnStdFmt; /// Key for standard number format. |
| sal_uInt16 mnXclOffset; /// Offset to first user defined format. |
| }; |
| |
| // XF, STYLE record - Cell formatting ========================================= |
| |
| /** Extends the XclCellProt struct for export. |
| @descr Provides functions to fill from item sets and to fill to Excel record data. */ |
| struct XclExpCellProt : public XclCellProt |
| { |
| /** Fills the protection attributes from the passed item set. |
| @return true = At least one protection item is set. */ |
| bool FillFromItemSet( const SfxItemSet& rItemSet, bool bStyle = false ); |
| |
| #if 0 |
| /** Fills the data to the passed fields of a BIFF2 XF record. */ |
| void FillToXF2( sal_uInt8& rnNumFmt ) const; |
| #endif |
| /** Fills the data to the passed fields of a BIFF3-BIFF8 XF record. */ |
| void FillToXF3( sal_uInt16& rnProt ) const; |
| |
| void SaveXml( XclExpXmlStream& rStrm ) const; |
| }; |
| |
| // ---------------------------------------------------------------------------- |
| |
| /** Extends the XclCellAlign struct for export. |
| @descr Provides functions to fill from item sets and to fill to Excel record data. */ |
| struct XclExpCellAlign : public XclCellAlign |
| { |
| /** Fills the alignment attributes from the passed item set. |
| @descr Fills only the attributes exported in the passed BIFF version. |
| @param bForceLineBreak true = Set line break flag unconditionally. |
| @return true = At least one alignment item is set. */ |
| bool FillFromItemSet( const SfxItemSet& rItemSet, |
| bool bForceLineBreak, XclBiff eBiff, bool bStyle = false ); |
| |
| #if 0 |
| /** Fills the data to the passed fields of a BIFF2 XF record. */ |
| void FillToXF2( sal_uInt8& rnFlags ) const; |
| /** Fills the data to the passed fields of a BIFF3 XF record. */ |
| void FillToXF3( sal_uInt16& rnAlign ) const; |
| /** Fills the data to the passed fields of a BIFF4 XF record. */ |
| void FillToXF4( sal_uInt16& rnAlign ) const; |
| #endif |
| /** Fills the data to the passed fields of a BIFF5/BIFF7 XF record. */ |
| void FillToXF5( sal_uInt16& rnAlign ) const; |
| /** Fills the data to the passed fields of a BIFF8 XF record. */ |
| void FillToXF8( sal_uInt16& rnAlign, sal_uInt16& rnMiscAttrib ) const; |
| |
| void SaveXml( XclExpXmlStream& rStrm ) const; |
| }; |
| |
| // ---------------------------------------------------------------------------- |
| |
| /** Extends the XclCellBorder struct for export. |
| @descr Provides functions to fill from item sets and to fill to Excel record data. */ |
| struct XclExpCellBorder : public XclCellBorder |
| { |
| sal_uInt32 mnLeftColorId; /// Color ID for left line. |
| sal_uInt32 mnRightColorId; /// Color ID for right line. |
| sal_uInt32 mnTopColorId; /// Color ID for top line. |
| sal_uInt32 mnBottomColorId; /// Color ID for bottom line. |
| sal_uInt32 mnDiagColorId; /// Color ID for diagonal line(s). |
| |
| explicit XclExpCellBorder(); |
| |
| /** Fills the border attributes from the passed item set. |
| @descr Fills only the attributes exported in the passed BIFF version. |
| @return true = At least one border item is set. */ |
| bool FillFromItemSet( const SfxItemSet& rItemSet, |
| XclExpPalette& rPalette, XclBiff eBiff, bool bStyle = false ); |
| /** Fills the mn***Color base members from the mn***ColorId members. */ |
| void SetFinalColors( const XclExpPalette& rPalette ); |
| |
| #if 0 |
| /** Fills the data to the passed fields of a BIFF2 XF record. */ |
| void FillToXF2( sal_uInt8& rnFlags ) const; |
| /** Fills the data to the passed fields of a BIFF3/BIFF4 XF record. */ |
| void FillToXF3( sal_uInt32& rnBorder ) const; |
| #endif |
| /** Fills the data to the passed fields of a BIFF5/BIFF7 XF record. */ |
| void FillToXF5( sal_uInt32& rnBorder, sal_uInt32& rnArea ) const; |
| /** Fills the data to the passed fields of a BIFF8 XF record. */ |
| void FillToXF8( sal_uInt32& rnBorder1, sal_uInt32& rnBorder2 ) const; |
| |
| /** Fills the data to the passed fields of a BIFF8 CF (conditional format) record. */ |
| void FillToCF8( sal_uInt16& rnLine, sal_uInt32& rnColor ) const; |
| |
| void SaveXml( XclExpXmlStream& rStrm ) const; |
| }; |
| |
| // ---------------------------------------------------------------------------- |
| |
| /** Extends the XclCellArea struct for export. |
| @descr Provides functions to fill from item sets and to fill to Excel record data. */ |
| struct XclExpCellArea : public XclCellArea |
| { |
| sal_uInt32 mnForeColorId; /// Foreground color ID. |
| sal_uInt32 mnBackColorId; /// Background color ID. |
| |
| explicit XclExpCellArea(); |
| |
| /** Fills the area attributes from the passed item set. |
| @return true = At least one area item is set. */ |
| bool FillFromItemSet( |
| const SfxItemSet& rItemSet, XclExpPalette& rPalette, |
| bool bStyle = false ); |
| /** Fills the mn***Color base members from the mn***ColorId members. */ |
| void SetFinalColors( const XclExpPalette& rPalette ); |
| |
| #if 0 |
| /** Fills the data to the passed fields of a BIFF2 XF record. */ |
| void FillToXF2( sal_uInt8& rnFlags ) const; |
| /** Fills the data to the passed fields of a BIFF3/BIFF4 XF record. */ |
| void FillToXF3( sal_uInt16& rnArea ) const; |
| #endif |
| /** Fills the data to the passed fields of a BIFF5/BIFF7 XF record. */ |
| void FillToXF5( sal_uInt32& rnArea ) const; |
| /** Fills the data to the passed fields of a BIFF8 XF record. */ |
| void FillToXF8( sal_uInt32& rnBorder2, sal_uInt16& rnArea ) const; |
| |
| /** Fills the data to the passed fields of a BIFF8 CF (conditional format) record. */ |
| void FillToCF8( sal_uInt16& rnPattern, sal_uInt16& rnColor ) const; |
| |
| void SaveXml( XclExpXmlStream& rStrm ) const; |
| }; |
| |
| // ---------------------------------------------------------------------------- |
| |
| /** A combination of unique XF identifier with real Excel XF index. */ |
| struct XclExpXFId |
| { |
| sal_uInt32 mnXFId; /// Temporary XF identifier. |
| sal_uInt16 mnXFIndex; /// Real Excel XF index. |
| |
| explicit XclExpXFId(); |
| explicit XclExpXFId( sal_uInt32 nXFId ); |
| |
| /** Converts the XF identifier in mnXFId to an Excel XF index and stores it in mnXFIndex. */ |
| void ConvertXFIndex( const XclExpRoot& rRoot ); |
| }; |
| |
| // ---------------------------------------------------------------------------- |
| |
| class SfxStyleSheetBase; |
| |
| /** Represents an XF record which contains all formatting data of a cell or cell style. */ |
| class XclExpXF : public XclXFBase, public XclExpRecord, protected XclExpRoot |
| { |
| public: |
| /** Constructs a cell XF record from the passed Calc cell formatting. */ |
| explicit XclExpXF( |
| const XclExpRoot& rRoot, |
| const ScPatternAttr& rPattern, |
| sal_Int16 nScript, |
| sal_uLong nScForceNumFmt = NUMBERFORMAT_ENTRY_NOT_FOUND, |
| sal_uInt16 nForceXclFont = EXC_FONT_NOTFOUND, |
| bool bForceLineBreak = false ); |
| /** Constructs a style XF record from the passed cell style sheet. */ |
| explicit XclExpXF( |
| const XclExpRoot& rRoot, |
| const SfxStyleSheetBase& rStyleSheet ); |
| |
| /** Returns the cell protection settings of this XF. */ |
| const XclExpCellProt& GetProtectionData() const { return maProtection; } |
| /** Returns the alignment settings of this XF. */ |
| const XclExpCellAlign& GetAlignmentData() const { return maAlignment; } |
| /** Returns the cell border settings of this XF. */ |
| const XclExpCellBorder& GetBorderData() const { return maBorder; } |
| /** Returns the cell fill settings of this XF. */ |
| const XclExpCellArea& GetAreaData() const { return maArea; } |
| |
| /** Returns true, if this XF record represents the passed cell formatting. |
| @descr Searches for cell XFs only. */ |
| bool Equals( |
| const ScPatternAttr& rPattern, |
| sal_uLong nScForceNumFmt, |
| sal_uInt16 nForceXclFont, |
| bool bForceLineBreak ) const; |
| |
| /** Returns true, if this XF record represents the passed style. |
| @descr Searches for style XFs only. */ |
| bool Equals( const SfxStyleSheetBase& rStyleSheet ) const; |
| |
| /** Sets the resulting Excel palette index from all used color IDs (border and area). */ |
| void SetFinalColors(); |
| |
| /** Returns true, if this XF record is completely equal to the passed. */ |
| bool Equals( const XclExpXF& rCmpXF ) const; |
| |
| void SetXmlIds( sal_uInt32 nBorderId, sal_uInt32 nFillId ); |
| |
| virtual void SaveXml( XclExpXmlStream& rStrm ); |
| |
| // for buffered FindXF |
| const SfxItemSet* getItemSet() const { return mpItemSet; } |
| sal_uInt32 getIndexInXFList() const { return mnIndexInXFList; } |
| void setIndexInXFList(sal_uInt32 nNew) { mnIndexInXFList = nNew; } |
| |
| protected: |
| explicit XclExpXF( const XclExpRoot& rRoot, bool bCellXF ); |
| |
| protected: // access for XclExpDefaultXF |
| const SfxItemSet* mpItemSet; /// Pointer to the item set (we do not own it). |
| |
| XclExpCellProt maProtection; /// Cell protection flags. |
| XclExpCellAlign maAlignment; /// All alignment attributes. |
| XclExpCellBorder maBorder; /// Border line style. |
| XclExpCellArea maArea; /// Background area style. |
| sal_uInt32 mnParentXFId; /// XF ID of parent XF record. |
| sal_uLong mnScNumFmt; /// Calc number format index. |
| sal_uInt16 mnXclFont; /// Excel font index. |
| sal_uInt16 mnXclNumFmt; /// Excel number format index. |
| sal_Int32 mnBorderId; /// OOXML Border Index |
| sal_Int32 mnFillId; /// OOXML Fill Index |
| |
| // for buffered FindXF, holds the index in XclExpXFBuffer::maXFList when object is added to maXclExpXFMap |
| sal_uInt32 mnIndexInXFList; |
| |
| private: |
| using XclXFBase::Equals; |
| |
| /** Initializes with default values. */ |
| void InitDefault(); |
| /** Fills all members from the passed item set. |
| @param bDefStyle true = This is the "Default"/"Normal" style - needs special handling. */ |
| void Init( |
| const SfxItemSet& rItemSet, |
| sal_Int16 nScript, |
| sal_uLong nForceScNumFmt, |
| sal_uInt16 nForceXclFont, |
| bool bForceLineBreak, |
| bool bDefStyle ); |
| |
| /** Returns the bits specifying the used attributes. |
| @descr In cell XFs a set bit means a used attribute, in style XF a cleared |
| bit means a used attribute. This method regards the cell/style state. |
| @return The mask based on bit 0 (not yet bit-shifted as needed for export). */ |
| sal_uInt8 GetUsedFlags() const; |
| |
| void WriteBody5( XclExpStream& rStrm ); |
| void WriteBody8( XclExpStream& rStrm ); |
| |
| /** Writes the contents of the XF record. */ |
| virtual void WriteBody( XclExpStream& rStrm ); |
| }; |
| |
| // ---------------------------------------------------------------------------- |
| |
| /** Represents a default XF record. Supports methods to set attributes directly. */ |
| class XclExpDefaultXF : public XclExpXF |
| { |
| public: |
| explicit XclExpDefaultXF( const XclExpRoot& rRoot, bool bCellXF ); |
| |
| //UNUSED2008-05 /** Sets the parent XF ID. Only allowed for cell XFs. */ |
| //UNUSED2008-05 void SetParent( sal_uInt32 nParentXFId ); |
| //UNUSED2008-05 |
| //UNUSED2008-05 /** Sets all "attribute used" flags explicitely. |
| //UNUSED2008-05 @descr The following Set***() functions set the appropriate flag too. */ |
| //UNUSED2008-05 void SetUsedFlags( |
| //UNUSED2008-05 bool bProtUsed, bool bFontUsed, bool bFmtUsed, |
| //UNUSED2008-05 bool bAlignUsed, bool bBorderUsed, bool bAreaUsed ); |
| //UNUSED2008-05 /** Sets the cell protection flags. */ |
| //UNUSED2008-05 void SetProtection( const XclExpCellProt& rProtection ); |
| //UNUSED2008-05 /** Sets cell alignment attributes. */ |
| //UNUSED2008-05 void SetAlignment( const XclExpCellAlign& rAlignment ); |
| //UNUSED2008-05 /** Sets a cell border style. */ |
| //UNUSED2008-05 void SetBorder( const XclExpCellBorder& rBorder ); |
| //UNUSED2008-05 /** Sets a cell area style. */ |
| //UNUSED2008-05 void SetArea( const XclExpCellArea& rArea ); |
| |
| /** Sets the Excel font index. */ |
| void SetFont( sal_uInt16 nXclFont ); |
| /** Sets the Excel number format index. */ |
| void SetNumFmt( sal_uInt16 nXclNumFmt ); |
| }; |
| |
| // ---------------------------------------------------------------------------- |
| |
| /** Represents a STYLE record containing the data of a cell style. |
| @descr The calss is able to store built-in and user-defined styles. */ |
| class XclExpStyle : public XclExpRecord |
| { |
| public: |
| explicit XclExpStyle( sal_uInt32 nXFId, const String& rStyleName ); |
| explicit XclExpStyle( sal_uInt32 nXFId, sal_uInt8 nStyleId, sal_uInt8 nLevel = EXC_STYLE_NOLEVEL ); |
| |
| /** Returns true, if this record represents an Excel built-in style. */ |
| inline bool IsBuiltIn() const { return mnStyleId != EXC_STYLE_USERDEF; } |
| |
| inline const String& GetName() const { return maName; } |
| |
| virtual void SaveXml( XclExpXmlStream& rStrm ); |
| |
| private: |
| /** Writes the contents of the STYLE record. */ |
| virtual void WriteBody( XclExpStream& rStrm ); |
| |
| private: |
| String maName; /// Name of the cell style. |
| XclExpXFId maXFId; /// XF identifier for style formatting. |
| sal_uInt8 mnStyleId; /// Built-in style identifier. |
| sal_uInt8 mnLevel; /// Outline level for RowLevel and ColLevel styles. |
| }; |
| |
| // ---------------------------------------------------------------------------- |
| |
| /** Stores all XF records (cell formats and cell styles) in the document. |
| |
| Stores also the names of user defined cell styles (STYLE records). Supports |
| reduction to the maximum count of XF records of the current BIFF version. |
| |
| An instance of this class collects all XF records in the conversion phase |
| of the export, using the Insert() and InsertStyle() functions. It returns a |
| unique identidier for each XF record. |
| |
| After the entire document is converted, the Finalize() function will reduce |
| the list to the number of XF records supported by the current BIFF version. |
| |
| Then, in the streaming phase, the function GetXFIndex() returns the real |
| Excel XF index for all XF identifiers. |
| */ |
| class XclExpXFBuffer : public XclExpRecordBase, protected XclExpRoot |
| { |
| public: |
| explicit XclExpXFBuffer( const XclExpRoot& rRoot ); |
| |
| /** Inserts predefined built-in styles and user-defined styles. */ |
| void Initialize(); |
| |
| /** Finds or creates a cell XF record for the passed item set. |
| @return A unique XF record ID. */ |
| sal_uInt32 Insert( const ScPatternAttr* pPattern, sal_Int16 nScript ); |
| /** Finds or creates a cell XF record for the passed item set. |
| @param nForceXclFont The font to be exported. If not equal to EXC_FONT_NOTFOUND, |
| this font index will be used unconditionally and the cell font will be ignored. |
| @param bForceLineBreak true = Set line break flag unconditionally. |
| This is required for cells that contain multi-line text. |
| @return A unique XF record ID. */ |
| sal_uInt32 InsertWithFont( |
| const ScPatternAttr* pPattern, sal_Int16 nScript, |
| sal_uInt16 nForceXclFont, |
| bool bForceLineBreak ); |
| /** Finds or creates a cell XF record for the passed item set, with custom number format. |
| @param nXFFlags Additional flags allowing to control the creation of an XF. |
| @param nForceScNumFmt The number format to be exported, e.g. formula |
| result type. This format will always overwrite the cell's number format. |
| @param bForceLineBreak true = Set line break flag unconditionally. |
| This is required for cells that contain multi-line text. |
| @return A unique XF record ID. */ |
| sal_uInt32 InsertWithNumFmt( |
| const ScPatternAttr* pPattern, sal_Int16 nScript, |
| sal_uLong nForceScNumFmt, |
| bool bForceLineBreak ); |
| /** Inserts the passed cell style. Creates a style XF record and a STYLE record. |
| @return A unique XF record ID. */ |
| sal_uInt32 InsertStyle( const SfxStyleSheetBase* pStyleSheet ); |
| /** Returns the XF identifier representing a fixed Excel XF index (e.g. for built-in XFs). */ |
| static sal_uInt32 GetXFIdFromIndex( sal_uInt16 nXFIndex ); |
| /** Returns the XF identifier representing the default cell XF. */ |
| static sal_uInt32 GetDefCellXFId(); |
| |
| /** Returns an XF record by its unique identifier. */ |
| const XclExpXF* GetXFById( sal_uInt32 nXFId ) const; |
| |
| /** Reduces the XF record list to the maximum allowed number of records. */ |
| void Finalize(); |
| |
| /** Returns the Excel XF index of the XF record with passed XF ID. */ |
| sal_uInt16 GetXFIndex( sal_uInt32 nXFId ) const; |
| |
| sal_Int32 GetXmlStyleIndex( sal_uInt32 nXFId ) const; |
| sal_Int32 GetXmlCellIndex( sal_uInt32 nXFId ) const; |
| |
| /** Writes all XF records contained in this buffer. */ |
| virtual void Save( XclExpStream& rStrm ); |
| virtual void SaveXml( XclExpXmlStream& rStrm ); |
| |
| private: |
| typedef XclExpRecordList< XclExpXF > XclExpXFList; |
| typedef XclExpXFList::RecordRefType XclExpXFRef; |
| typedef XclExpRecordList< XclExpStyle > XclExpStyleList; |
| |
| private: |
| // helper to update the buffer for maXFList |
| void impAddMissingValuesFromXFListToXclExpXFMap(); |
| |
| /** Returns the XF ID of the cell XF containing the passed format. */ |
| sal_uInt32 FindXF( const ScPatternAttr& rPattern, sal_uLong nForceScNumFmt, |
| sal_uInt16 nForceXclFont, bool bForceLineBreak ) const; |
| /** Returns the XF ID of the style XF containing the passed style. */ |
| sal_uInt32 FindXF( const SfxStyleSheetBase& rStyleSheet ) const; |
| |
| /** Returns the XF ID of a built-in style XF, searches by style identifier. */ |
| sal_uInt32 FindBuiltInXF( sal_uInt8 nStyleId, sal_uInt8 nLevel = EXC_STYLE_NOLEVEL ) const; |
| |
| /** Tries to find the XF record containing the passed format or inserts a new record. |
| @return The XF record ID. */ |
| sal_uInt32 InsertCellXF( const ScPatternAttr* pPattern, sal_Int16 nScript, |
| sal_uLong nForceScNumFmt, |
| sal_uInt16 nForceXclFont, bool bForceLineBreak ); |
| /** Inserts the passed cell style. Creates a style XF record and a STYLE record. |
| @return The XF record ID. */ |
| sal_uInt32 InsertStyleXF( const SfxStyleSheetBase& rStyleSheet ); |
| |
| /** Inserts an XF and a STYLE record for all user defined style sheets. */ |
| void InsertUserStyles(); |
| |
| /** Inserts a built-in XF record without a STYLE record and returns the XF ID. |
| @param bCreateStyleRec true = Creates the related STYLE record. */ |
| sal_uInt32 AppendBuiltInXF( XclExpXFRef xXF, |
| sal_uInt8 nStyleId, sal_uInt8 nLevel = EXC_STYLE_NOLEVEL ); |
| /** Inserts a built-in XF and STYLE record and returns the XF ID. |
| @param bCreateStyleRec true = Creates the related STYLE record. */ |
| sal_uInt32 AppendBuiltInXFWithStyle( XclExpXFRef xXF, |
| sal_uInt8 nStyleId, sal_uInt8 nLevel = EXC_STYLE_NOLEVEL ); |
| |
| /** Inserts all default XF and STYLE records. */ |
| void InsertDefaultRecords(); |
| |
| /** Appends a XF index to the internal ID<->index maps. */ |
| void AppendXFIndex( sal_uInt32 nXFId ); |
| |
| void AddBorderAndFill( const XclExpXF& rXF ); |
| void SaveXFXml( XclExpXmlStream& rStrm, XclExpXF& rXF ); |
| |
| private: |
| /** Extended info about a built-in XF. */ |
| struct XclExpBuiltInInfo |
| { |
| sal_uInt8 mnStyleId; /// Built-in style identifier. |
| sal_uInt8 mnLevel; /// Level for RowLevel/ColLevel styles. |
| bool mbPredefined; /// true = XF still predefined. |
| bool mbHasStyleRec; /// true = STYLE record created. |
| explicit XclExpBuiltInInfo(); |
| }; |
| typedef ::std::map< sal_uInt32, XclExpBuiltInInfo > XclExpBuiltInMap; |
| typedef ::std::vector< XclExpCellBorder > XclExpBorderList; |
| typedef ::std::vector< XclExpCellArea > XclExpFillList; |
| |
| XclExpXFList maXFList; /// List of all XF records. |
| XclExpStyleList maStyleList; /// List of all STYLE records. |
| XclExpBuiltInMap maBuiltInMap; /// Contained elements describe built-in XFs. |
| ScfUInt16Vec maXFIndexVec; /// Maps XF IDs to XF indexes. |
| ScfUInt16Vec maStyleIndexes; /// Maps XF IDs to OOXML Style indexes |
| ScfUInt16Vec maCellIndexes; /// Maps XF IDs to OOXML Cell indexes |
| XclExpXFList maSortedXFList; /// List of XF records in XF index order. |
| XclExpBorderList maBorders; /// List of borders used by XF records |
| XclExpFillList maFills; /// List of fills used by XF records |
| |
| // for optimized FindXF, buffered version of maXFList for fast access |
| std::multimap< const SfxItemSet*, XclExpXF* > maXclExpXFMap; |
| }; |
| |
| // ============================================================================ |
| |
| class XclExpXmlStyleSheet : public XclExpRecordBase, protected XclExpRoot |
| { |
| public: |
| explicit XclExpXmlStyleSheet( const XclExpRoot& rRoot ); |
| |
| virtual void SaveXml( XclExpXmlStream& rStrm ); |
| private: |
| }; |
| |
| // ============================================================================ |
| |
| #endif |
| |