From 776129a5502ac77dc6a365231a24f2f975fa5608 Mon Sep 17 00:00:00 2001 From: Michael Stahl Date: Fri, 9 Oct 2009 11:15:36 +0200 Subject: #i105649#: OOXMLDocPropHandler::AddCustomProperty(): add properties as REMOVEABLE, not TRANSIENT! --- oox/source/docprop/docprophandler.cxx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/oox/source/docprop/docprophandler.cxx b/oox/source/docprop/docprophandler.cxx index 185a061acea4..3e5a4830b691 100644 --- a/oox/source/docprop/docprophandler.cxx +++ b/oox/source/docprop/docprophandler.cxx @@ -78,13 +78,15 @@ void OOXMLDocPropHandler::AddCustomProperty( const uno::Any& aAny ) { if ( m_aCustomPropertyName.getLength() ) { - uno::Reference< beans::XPropertyContainer > xUserProps = m_xDocProp->getUserDefinedProperties(); + const uno::Reference< beans::XPropertyContainer > xUserProps = + m_xDocProp->getUserDefinedProperties(); if ( !xUserProps.is() ) throw uno::RuntimeException(); try { - xUserProps->addProperty( m_aCustomPropertyName, beans::PropertyAttribute::TRANSIENT, aAny ); + xUserProps->addProperty( m_aCustomPropertyName, + beans::PropertyAttribute::REMOVEABLE, aAny ); } catch( beans::PropertyExistException& ) { -- cgit From a2c9a3e9d45a4d9a90ea6915f1a382765cbafd1b Mon Sep 17 00:00:00 2001 From: Caolán McNamara Date: Tue, 20 Oct 2009 08:55:11 +0000 Subject: CWS-TOOLING: rebase CWS cmcfixes64 to trunk@277035 (milestone: DEV300:m62) --- oox/inc/oox/helper/containerhelper.hxx | 40 ++++ oox/inc/oox/xls/biffhelper.hxx | 2 + oox/inc/oox/xls/biffinputstream.hxx | 5 +- oox/inc/oox/xls/excelhandlers.hxx | 15 ++ oox/inc/oox/xls/stylesbuffer.hxx | 114 +++++++---- oox/inc/oox/xls/workbookhelper.hxx | 8 + oox/inc/oox/xls/worksheetbuffer.hxx | 6 +- oox/source/drawingml/table/tablecell.cxx | 4 +- oox/source/dump/biffdumper.cxx | 18 +- oox/source/dump/biffdumper.ini | 13 +- oox/source/dump/xlsbdumper.ini | 3 +- oox/source/helper/zipstorage.cxx | 16 +- oox/source/token/properties.txt | 1 + oox/source/token/tokenmap.cxx | 1 + oox/source/xls/excelhandlers.cxx | 129 ++++++------ oox/source/xls/externallinkbuffer.cxx | 22 +- oox/source/xls/pivottablebuffer.cxx | 2 +- oox/source/xls/stylesbuffer.cxx | 334 ++++++++++++++++++++----------- oox/source/xls/workbookfragment.cxx | 2 +- oox/source/xls/workbookhelper.cxx | 9 + oox/source/xls/workbooksettings.cxx | 2 + oox/source/xls/worksheetbuffer.cxx | 28 +-- 22 files changed, 506 insertions(+), 268 deletions(-) diff --git a/oox/inc/oox/helper/containerhelper.hxx b/oox/inc/oox/helper/containerhelper.hxx index 8186d537faee..b79d243bef01 100644 --- a/oox/inc/oox/helper/containerhelper.hxx +++ b/oox/inc/oox/helper/containerhelper.hxx @@ -211,6 +211,38 @@ public: forEach( ::boost::bind( pFunc, _1, aParam1, aParam2 ) ); } + /** Calls the passed functor for every contained object. Passes the key as + first argument and the object reference as second argument to rFunctor. */ + template< typename FunctorType > + inline void forEachWithKey( const FunctorType& rFunctor ) const + { + ::std::for_each( this->begin(), this->end(), ForEachFunctorWithKey< FunctorType >( rFunctor ) ); + } + + /** Calls the passed member function of ObjType on every contained object. + Passes the object key as argument to the member function. */ + template< typename FuncType > + inline void forEachMemWithKey( FuncType pFunc ) const + { + forEachWithKey( ::boost::bind( pFunc, _2, _1 ) ); + } + + /** Calls the passed member function of ObjType on every contained object. + Passes the object key as first argument to the member function. */ + template< typename FuncType, typename ParamType > + inline void forEachMemWithKey( FuncType pFunc, ParamType aParam ) const + { + forEachWithKey( ::boost::bind( pFunc, _2, _1, aParam ) ); + } + + /** Calls the passed member function of ObjType on every contained object. + Passes the object key as first argument to the member function. */ + template< typename FuncType, typename ParamType1, typename ParamType2 > + inline void forEachMemWithKey( FuncType pFunc, ParamType1 aParam1, ParamType2 aParam2 ) const + { + forEachWithKey( ::boost::bind( pFunc, _2, _1, aParam1, aParam2 ) ); + } + private: template< typename FunctorType > struct ForEachFunctor @@ -220,6 +252,14 @@ private: inline void operator()( const value_type& rValue ) const { if( rValue.second.get() ) mrFunctor( *rValue.second ); } }; + template< typename FunctorType > + struct ForEachFunctorWithKey + { + const FunctorType& mrFunctor; + inline explicit ForEachFunctorWithKey( const FunctorType& rFunctor ) : mrFunctor( rFunctor ) {} + inline void operator()( const value_type& rValue ) const { if( rValue.second.get() ) mrFunctor( rValue.first, *rValue.second ); } + }; + inline const mapped_type* getRef( key_type nKey ) const { typename container_type::const_iterator aIt = find( nKey ); diff --git a/oox/inc/oox/xls/biffhelper.hxx b/oox/inc/oox/xls/biffhelper.hxx index d5be59019315..60efb9e856a6 100644 --- a/oox/inc/oox/xls/biffhelper.hxx +++ b/oox/inc/oox/xls/biffhelper.hxx @@ -313,6 +313,7 @@ const sal_uInt16 BIFF_ID_CHPICFORMAT = 0x103C; const sal_uInt16 BIFF_ID_CHPIE = 0x1019; const sal_uInt16 BIFF_ID_CHPIEEXT = 0x1061; const sal_uInt16 BIFF_ID_CHPIEFORMAT = 0x100B; +const sal_uInt16 BIFF_ID_CHPIVOTFLAGS = 0x0859; const sal_uInt16 BIFF5_ID_CHPIVOTREF = 0x1048; const sal_uInt16 BIFF8_ID_CHPIVOTREF = 0x0858; const sal_uInt16 BIFF_ID_CHPLOTFRAME = 0x1035; @@ -481,6 +482,7 @@ const sal_uInt16 BIFF_ID_VERPAGEBREAKS = 0x001A; const sal_uInt16 BIFF_ID_WINDOW1 = 0x003D; const sal_uInt16 BIFF2_ID_WINDOW2 = 0x003E; const sal_uInt16 BIFF3_ID_WINDOW2 = 0x023E; +const sal_uInt16 BIFF_ID_WRITEACCESS = 0x005C; const sal_uInt16 BIFF_ID_XCT = 0x0059; const sal_uInt16 BIFF2_ID_XF = 0x0043; const sal_uInt16 BIFF3_ID_XF = 0x0243; diff --git a/oox/inc/oox/xls/biffinputstream.hxx b/oox/inc/oox/xls/biffinputstream.hxx index e3109a1fafcc..a829bcec6e23 100644 --- a/oox/inc/oox/xls/biffinputstream.hxx +++ b/oox/inc/oox/xls/biffinputstream.hxx @@ -182,7 +182,10 @@ public: /** Sets stream pointer to the start of the content of the specified record. The handle of the current record can be received and stored using the - function getRecHandle() for later usage with this function. + function getRecHandle() for later usage with this function. The record + handle is equivalent to the position of the underlying binary stream, + thus the function can be used to perform a hard seek to a specific + position, if it is sure that a record starts exactly at this position. @return False = no record found (invalid handle passed). */ diff --git a/oox/inc/oox/xls/excelhandlers.hxx b/oox/inc/oox/xls/excelhandlers.hxx index 76d0e599e502..a6619aa242c4 100644 --- a/oox/inc/oox/xls/excelhandlers.hxx +++ b/oox/inc/oox/xls/excelhandlers.hxx @@ -304,6 +304,17 @@ protected: */ BiffFragmentType startFragment( BiffType eBiff ); + /** Starts a new fragment at a specific position in the workbbok stream and + returns the fragment type. + + The passed record handle must specify the stream position of the BOF + record of the fragment substream. The function will try to start the + next record and read the contents of the BOF record, if extant. + + @return Fragment type according to the imported BOF record. + */ + BiffFragmentType startFragment( BiffType eBiff, sal_Int64 nRecHandle ); + /** Skips the current fragment up to its trailing EOF record. Skips all records until next EOF record. When this function returns, @@ -316,6 +327,10 @@ protected: @return True = stream points to the EOF record of the current fragment. */ bool skipFragment(); + +private: + /** Implementation helper for the startFragment() functions. */ + BiffFragmentType implStartFragment( BiffType eBiff ); }; // ============================================================================ diff --git a/oox/inc/oox/xls/stylesbuffer.hxx b/oox/inc/oox/xls/stylesbuffer.hxx index 2b5b5bf3e7f7..c79ef46e5859 100644 --- a/oox/inc/oox/xls/stylesbuffer.hxx +++ b/oox/inc/oox/xls/stylesbuffer.hxx @@ -795,8 +795,10 @@ public: /** Final processing after import of all style settings. */ void finalizeImport(); - /** Creates the style sheet described by the DXF. */ - const ::rtl::OUString& createDxfStyle( sal_Int32 nDxfId ); + /** Writes all formatting attributes to the passed property map. */ + void writeToPropertyMap( PropertyMap& rPropMap ) const; + /** Writes all formatting attributes to the passed property set. */ + void writeToPropertySet( PropertySet& rPropSet ) const; private: FontRef mxFont; /// Font data. @@ -805,7 +807,6 @@ private: ProtectionRef mxProtection; /// Protection data. BorderRef mxBorder; /// Border data. FillRef mxFill; /// Fill data. - ::rtl::OUString maFinalName; /// Final style name used in API. }; typedef ::boost::shared_ptr< Dxf > DxfRef; @@ -826,7 +827,7 @@ struct CellStyleModel explicit CellStyleModel(); /** Returns true, if this style is a builtin style. */ - inline bool isBuiltin() const { return mbBuiltin && (mnBuiltinId >= 0); } + bool isBuiltin() const; /** Returns true, if this style represents the default document cell style. */ bool isDefaultStyle() const; }; @@ -844,24 +845,17 @@ public: void importCellStyle( RecordInputStream& rStrm ); /** Imports style settings from a STYLE record. */ void importStyle( BiffInputStream& rStrm ); - /** Sets the final style name to be used in the document. */ - inline void setFinalStyleName( const ::rtl::OUString& rStyleName ) { maFinalName = rStyleName; } - - /** Returns true, if this style is a builtin style. */ - inline bool isBuiltin() const { return maModel.isBuiltin(); } - /** Returns true, if this style represents the default document cell style. */ - inline bool isDefaultStyle() const { return maModel.isDefaultStyle(); } - /** Returns the XF identifier for this cell style. */ - inline sal_Int32 getXfId() const { return maModel.mnXfId; } - /** Calculates a readable style name according to the settings. */ - ::rtl::OUString calcInitialStyleName() const; - /** Returns the final style name used in the document. */ - inline const ::rtl::OUString& getFinalStyleName() const { return maFinalName; } /** Creates the style sheet in the document described by this cell style object. */ void createCellStyle(); - /** Creates the cell style, if it is user-defined or modified built-in. */ - void finalizeImport(); + /** Stores tha passed final style name and creates the cell style, if it is + user-defined or modified built-in. */ + void finalizeImport( const ::rtl::OUString& rFinalName ); + + /** Returns the cell style model structure. */ + inline const CellStyleModel& getModel() const { return maModel; } + /** Returns the final style name used in the document. */ + inline const ::rtl::OUString& getFinalStyleName() const { return maFinalName; } private: CellStyleModel maModel; @@ -873,6 +867,46 @@ typedef ::boost::shared_ptr< CellStyle > CellStyleRef; // ============================================================================ +class CellStyleBuffer : public WorkbookHelper +{ +public: + explicit CellStyleBuffer( const WorkbookHelper& rHelper ); + + /** Appends and returns a new named cell style object. */ + CellStyleRef importCellStyle( const AttributeList& rAttribs ); + /** Imports the CELLSTYLE record from the passed stream. */ + CellStyleRef importCellStyle( RecordInputStream& rStrm ); + /** Imports the STYLE record from the passed stream. */ + CellStyleRef importStyle( BiffInputStream& rStrm ); + + /** Final processing after import of all style settings. */ + void finalizeImport(); + + /** Returns the XF identifier associated to the default cell style. */ + sal_Int32 getDefaultXfId() const; + /** Returns the default style sheet for unused cells. */ + ::rtl::OUString getDefaultStyleName() const; + /** Creates the style sheet described by the style XF with the passed identifier. */ + ::rtl::OUString createCellStyle( sal_Int32 nXfId ) const; + +private: + /** Inserts the passed cell style object into the internal maps. */ + void insertCellStyle( CellStyleRef xCellStyle ); + /** Creates the style sheet described by the passed cell style object. */ + ::rtl::OUString createCellStyle( const CellStyleRef& rxCellStyle ) const; + +private: + typedef RefVector< CellStyle > CellStyleVector; + typedef RefMap< sal_Int32, CellStyle > CellStyleXfIdMap; + + CellStyleVector maBuiltinStyles; /// All built-in cell styles. + CellStyleVector maUserStyles; /// All user defined cell styles. + CellStyleXfIdMap maStylesByXf; /// All cell styles, mapped by XF identifier. + CellStyleRef mxDefStyle; /// Default cell style. +}; + +// ============================================================================ + class StylesBuffer : public WorkbookHelper { public: @@ -947,12 +981,12 @@ public: /** Returns the model of the default application font (used in the "Normal" cell style). */ const FontModel& getDefaultFontModel() const; + /** Returns the default style sheet for unused cells. */ + ::rtl::OUString getDefaultStyleName() const; /** Creates the style sheet described by the style XF with the passed identifier. */ - const ::rtl::OUString& createCellStyle( sal_Int32 nXfId ) const; + ::rtl::OUString createCellStyle( sal_Int32 nXfId ) const; /** Creates the style sheet described by the DXF with the passed identifier. */ - const ::rtl::OUString& createDxfStyle( sal_Int32 nDxfId ) const; - /** Returns the default style sheet for unused cells. */ - const ::rtl::OUString& getDefaultStyleName() const; + ::rtl::OUString createDxfStyle( sal_Int32 nDxfId ) const; /** Writes the font attributes of the specified font data to the passed property map. */ void writeFontToPropertyMap( PropertyMap& rPropMap, sal_Int32 nFontId ) const; @@ -973,29 +1007,23 @@ public: void writeStyleXfToPropertySet( PropertySet& rPropSet, sal_Int32 nXfId ) const; private: - void insertCellStyle( CellStyleRef xCellStyle ); - -private: - typedef RefVector< Font > FontVec; - typedef RefVector< Border > BorderVec; - typedef RefVector< Fill > FillVec; - typedef RefVector< Xf > XfVec; - typedef RefVector< Dxf > DxfVec; - typedef RefMap< sal_Int32, CellStyle > CellStyleIdMap; - typedef RefMap< ::rtl::OUString, CellStyle > CellStyleNameMap; + typedef RefVector< Font > FontVector; + typedef RefVector< Border > BorderVector; + typedef RefVector< Fill > FillVector; + typedef RefVector< Xf > XfVector; + typedef RefVector< Dxf > DxfVector; + typedef ::std::map< sal_Int32, ::rtl::OUString > DxfStyleMap; ColorPalette maPalette; /// Color palette. - FontVec maFonts; /// List of font objects. + FontVector maFonts; /// List of font objects. NumberFormatsBuffer maNumFmts; /// List of all number format codes. - BorderVec maBorders; /// List of cell border objects. - FillVec maFills; /// List of cell area fill objects. - XfVec maCellXfs; /// List of cell formats. - XfVec maStyleXfs; /// List of cell styles. - DxfVec maDxfs; /// List of differential cell styles. - CellStyleIdMap maCellStylesById; /// List of named cell styles, mapped by XF identifier. - CellStyleNameMap maCellStylesByName; /// List of named cell styles, mapped by name. - ::rtl::OUString maDefStyleName; /// API name of default cell style. - sal_Int32 mnDefStyleXf; /// Style XF index of default cell style. + BorderVector maBorders; /// List of cell border objects. + FillVector maFills; /// List of cell area fill objects. + XfVector maCellXfs; /// List of cell formats. + XfVector maStyleXfs; /// List of cell styles. + CellStyleBuffer maCellStyles; /// All built-in and user defined cell styles. + DxfVector maDxfs; /// List of differential cell styles. + mutable DxfStyleMap maDxfStyles; /// Maps DXF identifiers to Calc style sheet names. }; // ============================================================================ diff --git a/oox/inc/oox/xls/workbookhelper.hxx b/oox/inc/oox/xls/workbookhelper.hxx index 1c4210deabf6..cd2d9cf14f06 100644 --- a/oox/inc/oox/xls/workbookhelper.hxx +++ b/oox/inc/oox/xls/workbookhelper.hxx @@ -169,6 +169,14 @@ enum FilterType // ============================================================================ +/** Functor for case-insensitive string comparison, usable in maps etc. */ +struct IgnoreCaseCompare +{ + bool operator()( const ::rtl::OUString& rName1, const ::rtl::OUString& rName2 ) const; +}; + +// ============================================================================ + class WorkbookData; class WorkbookSettings; class ViewSettings; diff --git a/oox/inc/oox/xls/worksheetbuffer.hxx b/oox/inc/oox/xls/worksheetbuffer.hxx index 327ff5c5638d..c1f977f802ca 100644 --- a/oox/inc/oox/xls/worksheetbuffer.hxx +++ b/oox/inc/oox/xls/worksheetbuffer.hxx @@ -49,6 +49,7 @@ struct SheetInfoModel { ::rtl::OUString maRelId; /// Relation identifier for the sheet substream. ::rtl::OUString maName; /// Original name of the sheet. + sal_Int64 mnBiffHandle; /// BIFF record handle of the sheet substream. sal_Int32 mnSheetId; /// Sheet identifier. sal_Int32 mnState; /// Visibility state. @@ -88,6 +89,8 @@ public: sal_Int32 getWorksheetCount() const; /** Returns the OOX relation identifier of the specified worksheet. */ ::rtl::OUString getWorksheetRelId( sal_Int32 nWorksheet ) const; + /** Returns the BIFF record handle of the associated sheet substream. */ + sal_Int64 getBiffRecordHandle( sal_Int32 nWorksheet ) const; /** Returns the Calc index of the specified worksheet. */ sal_Int16 getCalcSheetIndex( sal_Int32 nWorksheet ) const; @@ -120,8 +123,7 @@ private: typedef RefVector< SheetInfo > SheetInfoVector; SheetInfoVector maSheetInfos; - struct SheetNameCompare { bool operator()( const ::rtl::OUString& rName1, const ::rtl::OUString& rName2 ) const; }; - typedef RefMap< ::rtl::OUString, SheetInfo, SheetNameCompare > SheetInfoMap; + typedef RefMap< ::rtl::OUString, SheetInfo, IgnoreCaseCompare > SheetInfoMap; SheetInfoMap maSheetInfosByName; }; diff --git a/oox/source/drawingml/table/tablecell.cxx b/oox/source/drawingml/table/tablecell.cxx index 332e6f55601e..1f0bdad34100 100644 --- a/oox/source/drawingml/table/tablecell.cxx +++ b/oox/source/drawingml/table/tablecell.cxx @@ -84,8 +84,8 @@ void applyLineAttributes( const ::oox::core::XmlFilterBase& rFilterBase, { Color aColor = rLineProperties.maLineFill.getBestSolidColor(); aBorderLine.Color = aColor.getColor( rFilterBase ); - aBorderLine.OuterLineWidth = static_cast< sal_Int16 >( GetCoordinate( rLineProperties.moLineWidth.get( 0 ) ) ); - aBorderLine.InnerLineWidth = 0; + aBorderLine.OuterLineWidth = static_cast< sal_Int16 >( GetCoordinate( rLineProperties.moLineWidth.get( 0 ) ) / 4 ); + aBorderLine.InnerLineWidth = static_cast< sal_Int16 >( GetCoordinate( rLineProperties.moLineWidth.get( 0 ) ) / 4 ); aBorderLine.LineDistance = 0; } diff --git a/oox/source/dump/biffdumper.cxx b/oox/source/dump/biffdumper.cxx index da21926e04bf..2e42d2dc8ca8 100644 --- a/oox/source/dump/biffdumper.cxx +++ b/oox/source/dump/biffdumper.cxx @@ -1864,6 +1864,18 @@ void WorkbookStreamObject::implDumpRecordBody() if( eBiff >= BIFF8 ) dumpHex< sal_uInt16 >( "flags", "CHPIE-FLAGS" ); break; + case BIFF_ID_CHPIVOTFLAGS: + dumpRepeatedRecId(); + dumpUnused( 2 ); + dumpHex< sal_uInt16 >( "flags", "CHPIVOTFLAGS-FLAGS" ); + break; + + case BIFF8_ID_CHPIVOTREF: + dumpRepeatedRecId(); + dumpUnused( 4 ); + dumpUniString( "ref", BIFF_STR_8BITLENGTH ); + break; + case BIFF_ID_CHPLOTGROWTH: dumpFix< sal_Int32 >( "horizontal-growth" ); dumpFix< sal_Int32 >( "vertical-growth" ); @@ -2786,6 +2798,10 @@ void WorkbookStreamObject::implDumpRecordBody() dumpColorABGR( "grid-color" ); break; + case BIFF_ID_WRITEACCESS: + dumpString( "user-name", BIFF_STR_8BITLENGTH ); + break; + case BIFF_ID_XCT: dumpDec< sal_uInt16 >( "crn-count" ); if( eBiff == BIFF8 ) dumpDec< sal_Int16 >( "sheet-idx" ); @@ -2864,7 +2880,7 @@ OUString WorkbookStreamObject::dumpPivotString( const String& rName, sal_uInt16 if( nStrLen != BIFF_PT_NOSTRING ) { aString = (getBiff() == BIFF8) ? - getBiffStream().readUniString( nStrLen ) : + getBiffStream().readUniStringBody( nStrLen ) : getBiffStream().readCharArrayUC( nStrLen, getBiffData().getTextEncoding() ); writeStringItem( rName, aString ); } diff --git a/oox/source/dump/biffdumper.ini b/oox/source/dump/biffdumper.ini index e9766865dd8b..cc9a5d11427a 100644 --- a/oox/source/dump/biffdumper.ini +++ b/oox/source/dump/biffdumper.ini @@ -308,8 +308,8 @@ multilist=RECORD-NAMES-BIFF5 0x0098=,,,FILTERMODE,,AUTOFILTERINFO,AUTOFILTER, 0x00A8=,,,,,,SCENARIOS,SCENARIO 0x00B0=PTDEFINITION,PTFIELD,PTFITEM,,PTROWCOLFIELDS,PTROWCOLITEMS,PTPAGEFIELDS, - 0x00B8=DOCROUTE,RECIPNAME,,,SHAREDFMLA,MULTRK,MULTBLANK, - 0x00C0=,MMS,ADDMENU,DELMENU,,PTDATAFIELD,PCDEFINITION,PCDFIELD + 0x00B8=DOCROUTE,RECIPNAME,,,SHAREDFMLA,MULTRK,MULTBLANK,TOOLBARHDR + 0x00C0=TOOLBAREND,MMS,ADDMENU,DELMENU,,PTDATAFIELD,PCDEFINITION,PCDFIELD 0x00C8=PCITEM_INDEXLIST,PCITEM_DOUBLE,PCITEM_BOOL,PCITEM_ERROR,PCITEM_INTEGER,PCITEM_STRING,PCITEM_DATE,PCITEM_MISSING 0x00D0=SXTBL,SXTBRGITEM,SXTBPG,OBPROJ,,PIVOTCACHE,RSTRING,DBCELL 0x00D8=PCDFRANGEPR,PCDFDISCRETEPR,BOOKBOOL,REVERT,SXEXT|PARAMQRY,SCENPROTECT,OLESIZE,UDDESC @@ -342,9 +342,10 @@ multilist=RECORD-NAMES-BIFF8 0x01A8=,USERBVIEW,USERSVIEWBEGIN,USERSVIEWEND,,QSI,EXTERNALBOOK,PROT4REV 0x01B0=CFHEADER,CFRULE,DATAVALIDATIONS,,,DCONBINAME,TXO,REFRESHALL 0x01B8=HYPERLINK,NLRDELNAME,CODENAME,PCDFSQLTYPE,PROT4REVPASS,,DATAVALIDATION, + 0x01C0=XL9FILE,,,,,,, 0x0800=SCREENTIP,,,WEBQRYSETTINGS,WEBQRYTABLES,,, 0x0850=CHFRINFO,CHFRWRAPPER,CHFRBLOCKBEGIN,CHFRBLOCKEND,,,,CHFRUNITPROPS - 0x0858=CHPIVOTREF,,,,,,, + 0x0858=CHPIVOTREF,CHPIVOTFLAGS,,,,,, 0x0860=,,SHEETLAYOUT,,,,,SHEETPROTECTION 0x0868=,,,CHFRLABELPROPS,,,, 0x0890=,,STYLEEXT,,,,, @@ -817,6 +818,12 @@ flagslist=CHPIE-FLAGS 0x0002=connectors end +# CHPIVOTFLAGS --------------------------------------------------------------- + +flagslist=CHPIVOTFLAGS-FLAGS + 0x0001=hide-field-captions +end + # CHRADAR, CHRADARAREA ------------------------------------------------------- flagslist=CHRADAR-FLAGS diff --git a/oox/source/dump/xlsbdumper.ini b/oox/source/dump/xlsbdumper.ini index be6efd2c6af3..34c464c69509 100644 --- a/oox/source/dump/xlsbdumper.ini +++ b/oox/source/dump/xlsbdumper.ini @@ -208,7 +208,7 @@ multilist=RECORD-NAMES 0x01C8=,,,AUTOSORTSCOPE,AUTOSORTSCOPE_END,CONDFORMATTING,CONDFORMATTING_END,CFRULE 0x01D0=CFRULE_END,ICONSET,ICONSET_END,DATABAR,DATABAR_END,COLORSCALE,COLORSCALE_END,CFVO 0x01D8=,COLORS,COLORS_END,RGBCOLOR,PAGEMARGINS,PRINTOPTIONS,PAGESETUP,HEADERFOOTER - 0x01E0=HEADERFOOTER_END,,,,,SHEETFORMATPR,, + 0x01E0=HEADERFOOTER_END,PTCHARTFORMAT,PTCHARTFORMAT_END,PTCHARTFORMATS,PTCHARTFORMATS_END,SHEETFORMATPR,, 0x01E8=,,,,,,HYPERLINK, 0x01F0=,,,,SCENARIOS,SCENARIOS_END,SCENARIO,SCENARIO_END 0x01F8=INPUTCELLS,DXFS,DXFS_END,DXF,TABLESTYLES,TABLESTYLES_END,, @@ -249,6 +249,7 @@ constlist=SIMPLE-RECORDS 0x0159=int32,dec,count 0x017E=int32,dec,item-index 0x01DD=uint16,hex,flags,PRINTOPTIONS-FLAGS + 0x01E3=int32,dec,count 0x01F9=int32,dec,count 0x0204=int32,dec,type,VOLTYPE-TYPE 0x020D=uint8,dec,error-code,ERRORCODES diff --git a/oox/source/helper/zipstorage.cxx b/oox/source/helper/zipstorage.cxx index 7685b32e2b23..5dd3aa67109b 100644 --- a/oox/source/helper/zipstorage.cxx +++ b/oox/source/helper/zipstorage.cxx @@ -63,7 +63,13 @@ ZipStorage::ZipStorage( // create base storage object try { - mxStorage = ::comphelper::OStorageHelper::GetStorageFromInputStream( rxInStream, rxFactory ); + /* #i105325# ::comphelper::OStorageHelper::GetStorageFromInputStream() + cannot be used here as it will open a storage with format type + 'PackageFormat' that will not work with OOXML packages. + TODO: #i105410# switch to 'OFOPXMLFormat' and use its + implementation of relations handling. */ + mxStorage = ::comphelper::OStorageHelper::GetStorageOfFormatFromInputStream( + ZIP_STORAGE_FORMAT_STRING, rxInStream, rxFactory ); } catch( Exception& ) { @@ -79,11 +85,9 @@ ZipStorage::ZipStorage( // create base storage object try { - mxStorage = ::comphelper::OStorageHelper::GetStorageOfFormatFromStream( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "OFOPXMLFormat" ) ), - rxStream, - com::sun::star::embed::ElementModes::READWRITE - | com::sun::star::embed::ElementModes::TRUNCATE, - rxFactory ); + using namespace ::com::sun::star::embed::ElementModes; + mxStorage = ::comphelper::OStorageHelper::GetStorageOfFormatFromStream( + OFOPXML_STORAGE_FORMAT_STRING, rxStream, READWRITE | TRUNCATE, rxFactory ); } catch( Exception& ) { diff --git a/oox/source/token/properties.txt b/oox/source/token/properties.txt index 958a9ac24e77..0ecd40ee6595 100644 --- a/oox/source/token/properties.txt +++ b/oox/source/token/properties.txt @@ -400,6 +400,7 @@ VisualEffect Weight WhiteDay Width +WriteProtectionPassword WritingMode ZoomType ZoomValue diff --git a/oox/source/token/tokenmap.cxx b/oox/source/token/tokenmap.cxx index 733b18fd1f01..c01e3662a0d4 100644 --- a/oox/source/token/tokenmap.cxx +++ b/oox/source/token/tokenmap.cxx @@ -29,6 +29,7 @@ ************************************************************************/ #include "oox/token/tokenmap.hxx" +#include #include #include #include "tokens.hxx" diff --git a/oox/source/xls/excelhandlers.cxx b/oox/source/xls/excelhandlers.cxx index aa5a8634a60d..fa72d9602fed 100644 --- a/oox/source/xls/excelhandlers.cxx +++ b/oox/source/xls/excelhandlers.cxx @@ -143,68 +143,12 @@ BiffFragmentHandler::BiffFragmentHandler( const BiffFragmentHandler& rHandler ) BiffFragmentType BiffFragmentHandler::startFragment( BiffType eBiff ) { - BiffFragmentType eFragment = BIFF_FRAGMENT_UNKNOWN; - if( mrStrm.startNextRecord() ) - { - /* #i23425# Don't rely on BOF record ID to read BOF contents, but on - the detected BIFF version. */ - if( isBofRecord() ) - { - // BOF is always written unencrypted - mrStrm.enableDecoder( false ); - mrStrm.skip( 2 ); - sal_uInt16 nType = mrStrm.readuInt16(); + return mrStrm.startNextRecord() ? implStartFragment( eBiff ) : BIFF_FRAGMENT_UNKNOWN; +} - // decide which fragment types are valid for current BIFF version - switch( eBiff ) - { - case BIFF2: switch( nType ) - { - case BIFF_BOF_CHART: eFragment = BIFF_FRAGMENT_EMPTYSHEET; break; - case BIFF_BOF_MACRO: eFragment = BIFF_FRAGMENT_MACROSHEET; break; - // #i51490# Excel interprets invalid types as worksheet - default: eFragment = BIFF_FRAGMENT_WORKSHEET; - } - break; - - case BIFF3: switch( nType ) - { - case BIFF_BOF_CHART: eFragment = BIFF_FRAGMENT_EMPTYSHEET; break; - case BIFF_BOF_MACRO: eFragment = BIFF_FRAGMENT_MACROSHEET; break; - case BIFF_BOF_WORKSPACE:eFragment = BIFF_FRAGMENT_UNKNOWN; break; - // #i51490# Excel interprets invalid types as worksheet - default: eFragment = BIFF_FRAGMENT_WORKSHEET; - }; - break; - - case BIFF4: switch( nType ) - { - case BIFF_BOF_CHART: eFragment = BIFF_FRAGMENT_EMPTYSHEET; break; - case BIFF_BOF_MACRO: eFragment = BIFF_FRAGMENT_MACROSHEET; break; - case BIFF_BOF_WORKSPACE:eFragment = BIFF_FRAGMENT_WORKSPACE; break; - // #i51490# Excel interprets invalid types as worksheet - default: eFragment = BIFF_FRAGMENT_WORKSHEET; - }; - break; - - case BIFF5: - case BIFF8: switch( nType ) - { - case BIFF_BOF_GLOBALS: eFragment = BIFF_FRAGMENT_GLOBALS; break; - case BIFF_BOF_CHART: eFragment = BIFF_FRAGMENT_CHARTSHEET; break; - case BIFF_BOF_MACRO: eFragment = BIFF_FRAGMENT_MACROSHEET; break; - case BIFF_BOF_MODULE: eFragment = BIFF_FRAGMENT_MODULESHEET; break; - case BIFF_BOF_WORKSPACE:eFragment = BIFF_FRAGMENT_UNKNOWN; break; - // #i51490# Excel interprets invalid types as worksheet - default: eFragment = BIFF_FRAGMENT_WORKSHEET; - }; - break; - - case BIFF_UNKNOWN: break; - } - } - } - return eFragment; +BiffFragmentType BiffFragmentHandler::startFragment( BiffType eBiff, sal_Int64 nRecHandle ) +{ + return mrStrm.startRecordByHandle( nRecHandle ) ? implStartFragment( eBiff ) : BIFF_FRAGMENT_UNKNOWN; } bool BiffFragmentHandler::skipFragment() @@ -215,6 +159,69 @@ bool BiffFragmentHandler::skipFragment() return !mrStrm.isEof() && (mrStrm.getRecId() == BIFF_ID_EOF); } +BiffFragmentType BiffFragmentHandler::implStartFragment( BiffType eBiff ) +{ + BiffFragmentType eFragment = BIFF_FRAGMENT_UNKNOWN; + /* #i23425# Don't rely on BOF record ID to read BOF contents, but on + the detected BIFF version. */ + if( isBofRecord() ) + { + // BOF is always written unencrypted + mrStrm.enableDecoder( false ); + mrStrm.skip( 2 ); + sal_uInt16 nType = mrStrm.readuInt16(); + + // decide which fragment types are valid for current BIFF version + switch( eBiff ) + { + case BIFF2: switch( nType ) + { + case BIFF_BOF_CHART: eFragment = BIFF_FRAGMENT_EMPTYSHEET; break; + case BIFF_BOF_MACRO: eFragment = BIFF_FRAGMENT_MACROSHEET; break; + // #i51490# Excel interprets invalid types as worksheet + default: eFragment = BIFF_FRAGMENT_WORKSHEET; + } + break; + + case BIFF3: switch( nType ) + { + case BIFF_BOF_CHART: eFragment = BIFF_FRAGMENT_EMPTYSHEET; break; + case BIFF_BOF_MACRO: eFragment = BIFF_FRAGMENT_MACROSHEET; break; + case BIFF_BOF_WORKSPACE:eFragment = BIFF_FRAGMENT_UNKNOWN; break; + // #i51490# Excel interprets invalid types as worksheet + default: eFragment = BIFF_FRAGMENT_WORKSHEET; + }; + break; + + case BIFF4: switch( nType ) + { + case BIFF_BOF_CHART: eFragment = BIFF_FRAGMENT_EMPTYSHEET; break; + case BIFF_BOF_MACRO: eFragment = BIFF_FRAGMENT_MACROSHEET; break; + case BIFF_BOF_WORKSPACE:eFragment = BIFF_FRAGMENT_WORKSPACE; break; + // #i51490# Excel interprets invalid types as worksheet + default: eFragment = BIFF_FRAGMENT_WORKSHEET; + }; + break; + + case BIFF5: + case BIFF8: switch( nType ) + { + case BIFF_BOF_GLOBALS: eFragment = BIFF_FRAGMENT_GLOBALS; break; + case BIFF_BOF_CHART: eFragment = BIFF_FRAGMENT_CHARTSHEET; break; + case BIFF_BOF_MACRO: eFragment = BIFF_FRAGMENT_MACROSHEET; break; + case BIFF_BOF_MODULE: eFragment = BIFF_FRAGMENT_MODULESHEET; break; + case BIFF_BOF_WORKSPACE:eFragment = BIFF_FRAGMENT_UNKNOWN; break; + // #i51490# Excel interprets invalid types as worksheet + default: eFragment = BIFF_FRAGMENT_WORKSHEET; + }; + break; + + case BIFF_UNKNOWN: break; + } + } + return eFragment; +} + // ============================================================================ BiffWorkbookFragmentBase::BiffWorkbookFragmentBase( const WorkbookHelper& rHelper, const OUString& rStrmName, bool bCloneDecoder ) : diff --git a/oox/source/xls/externallinkbuffer.cxx b/oox/source/xls/externallinkbuffer.cxx index 26a1df09cc69..c75625216142 100644 --- a/oox/source/xls/externallinkbuffer.cxx +++ b/oox/source/xls/externallinkbuffer.cxx @@ -1030,18 +1030,20 @@ void ExternalLinkBuffer::importExternalName( BiffInputStream& rStrm ) void ExternalLinkBuffer::importExternSheet8( BiffInputStream& rStrm ) { - OSL_ENSURE( getBiff() == BIFF8, "ExternalLinkBuffer::importExternSheet - wrong BIFF version" ); - OSL_ENSURE( maRefSheets.empty(), "ExternalLinkBuffer::importExternSheet - multiple EXTERNSHEET records" ); - maRefSheets.clear(); + OSL_ENSURE( getBiff() == BIFF8, "ExternalLinkBuffer::importExternSheet8 - wrong BIFF version" ); + sal_uInt16 nRefCount; rStrm >> nRefCount; - maRefSheets.reserve( nRefCount ); - for( sal_uInt16 nRefId = 0; !rStrm.isEof() && (nRefId < nRefCount); ++nRefId ) - { - RefSheetsModel aRefSheets; - aRefSheets.readBiff8Data( rStrm ); - maRefSheets.push_back( aRefSheets ); - } + OSL_ENSURE( static_cast< sal_Int64 >( nRefCount * 6 ) == rStrm.getRemaining(), "ExternalLinkBuffer::importExternSheet8 - invalid count" ); + nRefCount = static_cast< sal_uInt16 >( ::std::min< sal_Int64 >( nRefCount, rStrm.getRemaining() / 6 ) ); + + /* #i104057# A weird external XLS generator writes multiple EXTERNSHEET + records instead of only one as expected. Surprisingly, Excel seems to + insert the entries of the second record before the entries of the first + record. */ + maRefSheets.insert( maRefSheets.begin(), nRefCount, RefSheetsModel() ); + for( RefSheetsModelVec::iterator aIt = maRefSheets.begin(); !rStrm.isEof() && (nRefCount > 0); --nRefCount ) + aIt->readBiff8Data( rStrm ); } Sequence< ExternalLinkInfo > ExternalLinkBuffer::getLinkInfos() const diff --git a/oox/source/xls/pivottablebuffer.cxx b/oox/source/xls/pivottablebuffer.cxx index 73404d29612f..361a3c00131b 100644 --- a/oox/source/xls/pivottablebuffer.cxx +++ b/oox/source/xls/pivottablebuffer.cxx @@ -221,7 +221,7 @@ OUString lclReadPivotString( const WorkbookHelper& rHelper, BiffInputStream& rSt { if( nLen == BIFF_PT_NOSTRING ) return OUString(); - return (rHelper.getBiff() == BIFF8) ? rStrm.readUniString( nLen ) : rStrm.readCharArrayUC( nLen, rHelper.getTextEncoding() ); + return (rHelper.getBiff() == BIFF8) ? rStrm.readUniStringBody( nLen ) : rStrm.readCharArrayUC( nLen, rHelper.getTextEncoding() ); } } // namespace diff --git a/oox/source/xls/stylesbuffer.cxx b/oox/source/xls/stylesbuffer.cxx index dc7456e1e4c9..3e69266592c7 100644 --- a/oox/source/xls/stylesbuffer.cxx +++ b/oox/source/xls/stylesbuffer.cxx @@ -1,3 +1,4 @@ + /************************************************************************* * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. @@ -29,7 +30,7 @@ ************************************************************************/ #include "oox/xls/stylesbuffer.hxx" -#include +#include #include #include #include @@ -65,8 +66,7 @@ using ::com::sun::star::uno::Reference; using ::com::sun::star::uno::UNO_QUERY; using ::com::sun::star::uno::UNO_QUERY_THROW; using ::com::sun::star::uno::UNO_SET_THROW; -using ::com::sun::star::container::XEnumerationAccess; -using ::com::sun::star::container::XEnumeration; +using ::com::sun::star::container::XIndexAccess; using ::com::sun::star::container::XNameAccess; using ::com::sun::star::container::XNamed; using ::com::sun::star::awt::FontDescriptor; @@ -2526,30 +2526,27 @@ void Dxf::finalizeImport() mxFill->finalizeImport(); } -const OUString& Dxf::createDxfStyle( sal_Int32 nDxfId ) +void Dxf::writeToPropertyMap( PropertyMap& rPropMap ) const { - if( maFinalName.getLength() == 0 ) - { - maFinalName = OUStringBuffer( CREATE_OUSTRING( "ConditionalStyle_" ) ).append( nDxfId + 1 ).makeStringAndClear(); - Reference< XStyle > xStyle = createStyleObject( maFinalName, false ); - // write style formatting properties - PropertyMap aPropMap; - if( mxFont.get() ) - mxFont->writeToPropertyMap( aPropMap, FONT_PROPTYPE_CELL ); - if( mxNumFmt.get() ) - mxNumFmt->writeToPropertyMap( aPropMap ); - if( mxAlignment.get() ) - mxAlignment->writeToPropertyMap( aPropMap ); - if( mxProtection.get() ) - mxProtection->writeToPropertyMap( aPropMap ); - if( mxBorder.get() ) - mxBorder->writeToPropertyMap( aPropMap ); - if( mxFill.get() ) - mxFill->writeToPropertyMap( aPropMap ); - PropertySet aPropSet( xStyle ); - aPropSet.setProperties( aPropMap ); - } - return maFinalName; + if( mxFont.get() ) + mxFont->writeToPropertyMap( rPropMap, FONT_PROPTYPE_CELL ); + if( mxNumFmt.get() ) + mxNumFmt->writeToPropertyMap( rPropMap ); + if( mxAlignment.get() ) + mxAlignment->writeToPropertyMap( rPropMap ); + if( mxProtection.get() ) + mxProtection->writeToPropertyMap( rPropMap ); + if( mxBorder.get() ) + mxBorder->writeToPropertyMap( rPropMap ); + if( mxFill.get() ) + mxFill->writeToPropertyMap( rPropMap ); +} + +void Dxf::writeToPropertySet( PropertySet& rPropSet ) const +{ + PropertyMap aPropMap; + writeToPropertyMap( aPropMap ); + rPropSet.setProperties( aPropMap ); } // ============================================================================ @@ -2732,6 +2729,11 @@ CellStyleModel::CellStyleModel() : { } +bool CellStyleModel::isBuiltin() const +{ + return mbBuiltin && (mnBuiltinId >= 0); +} + bool CellStyleModel::isDefaultStyle() const { return mbBuiltin && (mnBuiltinId == OOX_STYLE_NORMAL); @@ -2801,11 +2803,6 @@ void CellStyle::importStyle( BiffInputStream& rStrm ) } } -OUString CellStyle::calcInitialStyleName() const -{ - return isBuiltin() ? lclGetBuiltinStyleName( maModel.mnBuiltinId, maModel.maName, maModel.mnLevel ) : maModel.maName; -} - void CellStyle::createCellStyle() { // #i1624# #i1768# ignore unnamed user styles @@ -2832,7 +2829,7 @@ void CellStyle::createCellStyle() // write style formatting properties PropertySet aPropSet( xStyle ); getStyles().writeStyleXfToPropertySet( aPropSet, maModel.mnXfId ); - if( !isDefaultStyle() ) + if( !maModel.isDefaultStyle() ) xStyle->setParentStyle( getStyles().getDefaultStyleName() ); } catch( Exception& ) @@ -2840,47 +2837,182 @@ void CellStyle::createCellStyle() } } -void CellStyle::finalizeImport() +void CellStyle::finalizeImport( const OUString& rFinalName ) { - if( !isBuiltin() || maModel.mbCustom ) + maFinalName = rFinalName; + if( !maModel.isBuiltin() || maModel.mbCustom ) createCellStyle(); } // ============================================================================ -StylesBuffer::StylesBuffer( const WorkbookHelper& rHelper ) : - WorkbookHelper( rHelper ), - maPalette( rHelper ), - maNumFmts( rHelper ), - maDefStyleName( lclGetBuiltinStyleName( OOX_STYLE_NORMAL, OUString() ) ), - mnDefStyleXf( -1 ) +CellStyleBuffer::CellStyleBuffer( const WorkbookHelper& rHelper ) : + WorkbookHelper( rHelper ) +{ +} + +CellStyleRef CellStyleBuffer::importCellStyle( const AttributeList& rAttribs ) +{ + CellStyleRef xCellStyle( new CellStyle( *this ) ); + xCellStyle->importCellStyle( rAttribs ); + insertCellStyle( xCellStyle ); + return xCellStyle; +} + +CellStyleRef CellStyleBuffer::importCellStyle( RecordInputStream& rStrm ) +{ + CellStyleRef xCellStyle( new CellStyle( *this ) ); + xCellStyle->importCellStyle( rStrm ); + insertCellStyle( xCellStyle ); + return xCellStyle; +} + +CellStyleRef CellStyleBuffer::importStyle( BiffInputStream& rStrm ) { - /* Reserve style names that are built-in in Calc. This causes that + CellStyleRef xCellStyle( new CellStyle( *this ) ); + xCellStyle->importStyle( rStrm ); + insertCellStyle( xCellStyle ); + return xCellStyle; +} + +void CellStyleBuffer::finalizeImport() +{ + // calculate final names of all styles + typedef RefMap< OUString, CellStyle, IgnoreCaseCompare > CellStyleNameMap; + CellStyleNameMap aCellStyles; + CellStyleVector aConflictNameStyles; + + /* First, reserve style names that are built-in in Calc. This causes that imported cell styles get different unused names and thus do not try to overwrite these built-in styles. For BIFF4 workbooks (which contain a - separate list of cell styles per sheet), reserve all existing names if + separate list of cell styles per sheet), reserve all existing styles if current sheet is not the first sheet (this styles buffer will be constructed again for every new sheet). This will create unique names - for styles in different sheets with the same name. */ + for styles in different sheets with the same name. Assuming that the + BIFF4W import filter is never used to import from clipboard... */ bool bReserveAll = (getFilterType() == FILTER_BIFF) && (getBiff() == BIFF4) && isWorkbookFile() && (getCurrentSheetIndex() > 0); try { - Reference< XEnumerationAccess > xCellStylesEA( getStyleFamily( false ), UNO_QUERY_THROW ); - Reference< XEnumeration > xCellStylesEnum( xCellStylesEA->createEnumeration(), UNO_SET_THROW ); - while( xCellStylesEnum->hasMoreElements() ) + // unfortunately, com.sun.star.style.StyleFamily does not implement XEnumerationAccess... + Reference< XIndexAccess > xStyleFamilyIA( getStyleFamily( false ), UNO_QUERY_THROW ); + for( sal_Int32 nIndex = 0, nCount = xStyleFamilyIA->getCount(); nIndex < nCount; ++nIndex ) { - Reference< XStyle > xCellStyle( xCellStylesEnum->nextElement(), UNO_QUERY_THROW ); - if( bReserveAll || !xCellStyle->isUserDefined() ) + Reference< XStyle > xStyle( xStyleFamilyIA->getByIndex( nIndex ), UNO_QUERY_THROW ); + if( bReserveAll || !xStyle->isUserDefined() ) { - Reference< XNamed > xCellStyleName( xCellStyle, UNO_QUERY_THROW ); + Reference< XNamed > xStyleName( xStyle, UNO_QUERY_THROW ); // create an empty entry by using ::std::map<>::operator[] - maCellStylesByName[ xCellStyleName->getName() ]; + aCellStyles[ xStyleName->getName() ]; } } } catch( Exception& ) { } + + /* Calculate names of built-in styles. Store styles with reserved names + in the aConflictNameStyles list. */ + for( CellStyleVector::iterator aIt = maBuiltinStyles.begin(), aEnd = maBuiltinStyles.end(); aIt != aEnd; ++aIt ) + { + const CellStyleModel& rModel = (*aIt)->getModel(); + OUString aStyleName = lclGetBuiltinStyleName( rModel.mnBuiltinId, rModel.maName, rModel.mnLevel ); + OSL_ENSURE( bReserveAll || (aCellStyles.count( aStyleName ) == 0), + "CellStyleBuffer::finalizeImport - multiple styles with equal built-in identifier" ); + if( aCellStyles.count( aStyleName ) > 0 ) + aConflictNameStyles.push_back( *aIt ); + else + aCellStyles[ aStyleName ] = *aIt; + } + + /* Calculate names of user defined styles. Store styles with reserved + names in the aConflictNameStyles list. */ + for( CellStyleVector::iterator aIt = maUserStyles.begin(), aEnd = maUserStyles.end(); aIt != aEnd; ++aIt ) + { + const CellStyleModel& rModel = (*aIt)->getModel(); + // #i1624# #i1768# ignore unnamed user styles + if( rModel.maName.getLength() > 0 ) + { + if( aCellStyles.count( rModel.maName ) > 0 ) + aConflictNameStyles.push_back( *aIt ); + else + aCellStyles[ rModel.maName ] = *aIt; + } + } + + // find unused names for all styles with conflicting names + for( CellStyleVector::iterator aIt = aConflictNameStyles.begin(), aEnd = aConflictNameStyles.end(); aIt != aEnd; ++aIt ) + { + const CellStyleModel& rModel = (*aIt)->getModel(); + OUString aUnusedName; + sal_Int32 nIndex = 0; + do + { + aUnusedName = OUStringBuffer( rModel.maName ).append( sal_Unicode( ' ' ) ).append( ++nIndex ).makeStringAndClear(); + } + while( aCellStyles.count( aUnusedName ) > 0 ); + aCellStyles[ aUnusedName ] = *aIt; + } + + // set final names and create user-defined and modified built-in cell styles + aCellStyles.forEachMemWithKey( &CellStyle::finalizeImport ); +} + +sal_Int32 CellStyleBuffer::getDefaultXfId() const +{ + return mxDefStyle.get() ? mxDefStyle->getModel().mnXfId : -1; +} + +OUString CellStyleBuffer::getDefaultStyleName() const +{ + return createCellStyle( mxDefStyle ); +} + +OUString CellStyleBuffer::createCellStyle( sal_Int32 nXfId ) const +{ + return createCellStyle( maStylesByXf.get( nXfId ) ); +} + +// private -------------------------------------------------------------------- + +void CellStyleBuffer::insertCellStyle( CellStyleRef xCellStyle ) +{ + const CellStyleModel& rModel = xCellStyle->getModel(); + if( rModel.mnXfId >= 0 ) + { + // insert into the built-in map or user defined map + (rModel.isBuiltin() ? maBuiltinStyles : maUserStyles).push_back( xCellStyle ); + + // insert into the XF identifier map + OSL_ENSURE( maStylesByXf.count( rModel.mnXfId ) == 0, "CellStyleBuffer::insertCellStyle - multiple styles with equal XF identifier" ); + maStylesByXf[ rModel.mnXfId ] = xCellStyle; + + // remember default cell style + if( rModel.isDefaultStyle() ) + mxDefStyle = xCellStyle; + } +} + +OUString CellStyleBuffer::createCellStyle( const CellStyleRef& rxCellStyle ) const +{ + if( rxCellStyle.get() ) + { + rxCellStyle->createCellStyle(); + const OUString& rStyleName = rxCellStyle->getFinalStyleName(); + if( rStyleName.getLength() > 0 ) + return rStyleName; + } + // on error: fallback to default style + return lclGetBuiltinStyleName( OOX_STYLE_NORMAL, OUString() ); +} + +// ============================================================================ + +StylesBuffer::StylesBuffer( const WorkbookHelper& rHelper ) : + WorkbookHelper( rHelper ), + maPalette( rHelper ), + maNumFmts( rHelper ), + maCellStyles( rHelper ) +{ } FontRef StylesBuffer::createFont( sal_Int32* opnFontId ) @@ -2948,10 +3080,7 @@ NumberFormatRef StylesBuffer::importNumFmt( const AttributeList& rAttribs ) CellStyleRef StylesBuffer::importCellStyle( const AttributeList& rAttribs ) { - CellStyleRef xCellStyle( new CellStyle( *this ) ); - xCellStyle->importCellStyle( rAttribs ); - insertCellStyle( xCellStyle ); - return xCellStyle; + return maCellStyles.importCellStyle( rAttribs ); } void StylesBuffer::importPaletteColor( RecordInputStream& rStrm ) @@ -2966,9 +3095,7 @@ void StylesBuffer::importNumFmt( RecordInputStream& rStrm ) void StylesBuffer::importCellStyle( RecordInputStream& rStrm ) { - CellStyleRef xCellStyle( new CellStyle( *this ) ); - xCellStyle->importCellStyle( rStrm ); - insertCellStyle( xCellStyle ); + maCellStyles.importCellStyle( rStrm ); } void StylesBuffer::importPalette( BiffInputStream& rStrm ) @@ -3019,9 +3146,7 @@ void StylesBuffer::importXf( BiffInputStream& rStrm ) void StylesBuffer::importStyle( BiffInputStream& rStrm ) { - CellStyleRef xCellStyle( new CellStyle( *this ) ); - xCellStyle->importStyle( rStrm ); - insertCellStyle( xCellStyle ); + maCellStyles.importStyle( rStrm ); } void StylesBuffer::finalizeImport() @@ -3046,14 +3171,11 @@ void StylesBuffer::finalizeImport() maStyleXfs.forEachMem( &Xf::finalizeImport ); maCellXfs.forEachMem( &Xf::finalizeImport ); - // conditional formatting - maDxfs.forEachMem( &Dxf::finalizeImport ); + // built-in and user defined cell styles + maCellStyles.finalizeImport(); - // create the default cell style first - if( CellStyle* pDefStyle = maCellStylesById.get( mnDefStyleXf ).get() ) - pDefStyle->createCellStyle(); - // create user-defined and modified built-in cell styles - maCellStylesById.forEachMem( &CellStyle::finalizeImport ); + // differential formatting (for conditional formatting) + maDxfs.forEachMem( &Dxf::finalizeImport ); } sal_Int32 StylesBuffer::getPaletteColor( sal_Int32 nPaletteIdx ) const @@ -3092,7 +3214,7 @@ FontRef StylesBuffer::getFontFromCellXf( sal_Int32 nXfId ) const FontRef StylesBuffer::getDefaultFont() const { FontRef xDefFont; - if( const Xf* pXf = getStyleXf( mnDefStyleXf ).get() ) + if( const Xf* pXf = getStyleXf( maCellStyles.getDefaultXfId() ).get() ) xDefFont = pXf->getFont(); // no font from styles - try first loaded font (e.g. BIFF2) if( !xDefFont ) @@ -3107,30 +3229,35 @@ const FontModel& StylesBuffer::getDefaultFontModel() const return xDefFont.get() ? xDefFont->getModel() : getTheme().getDefaultFontModel(); } -const OUString& StylesBuffer::createCellStyle( sal_Int32 nXfId ) const +OUString StylesBuffer::getDefaultStyleName() const { - if( CellStyle* pCellStyle = maCellStylesById.get( nXfId ).get() ) - { - pCellStyle->createCellStyle(); - const OUString& rStyleName = pCellStyle->getFinalStyleName(); - if( rStyleName.getLength() > 0 ) - return rStyleName; - } - // on error: fallback to default style - return maDefStyleName; + return maCellStyles.getDefaultStyleName(); } -const OUString& StylesBuffer::createDxfStyle( sal_Int32 nDxfId ) const +OUString StylesBuffer::createCellStyle( sal_Int32 nXfId ) const { - if( Dxf* pDxf = maDxfs.get( nDxfId ).get() ) - return pDxf->createDxfStyle( nDxfId ); - // on error: fallback to default style - return maDefStyleName; + return maCellStyles.createCellStyle( nXfId ); } -const OUString& StylesBuffer::getDefaultStyleName() const +OUString StylesBuffer::createDxfStyle( sal_Int32 nDxfId ) const { - return createCellStyle( mnDefStyleXf ); + OUString& rStyleName = maDxfStyles[ nDxfId ]; + if( rStyleName.getLength() == 0 ) + { + if( Dxf* pDxf = maDxfs.get( nDxfId ).get() ) + { + rStyleName = OUStringBuffer( CREATE_OUSTRING( "ConditionalStyle_" ) ).append( nDxfId + 1 ).makeStringAndClear(); + // create the style sheet (this may change rStyleName if such a style already exists) + Reference< XStyle > xStyle = createStyleObject( rStyleName, false ); + // write style formatting properties + PropertySet aPropSet( xStyle ); + pDxf->writeToPropertySet( aPropSet ); + } + // on error: fallback to default style + if( rStyleName.getLength() == 0 ) + rStyleName = maCellStyles.getDefaultStyleName(); + } + return rStyleName; } void StylesBuffer::writeFontToPropertyMap( PropertyMap& rPropMap, sal_Int32 nFontId ) const @@ -3180,43 +3307,6 @@ void StylesBuffer::writeStyleXfToPropertySet( PropertySet& rPropSet, sal_Int32 n pXf->writeToPropertySet( rPropSet ); } -void StylesBuffer::insertCellStyle( CellStyleRef xCellStyle ) -{ - sal_Int32 nXfId = xCellStyle->getXfId(); - OUString aStyleName = xCellStyle->calcInitialStyleName(); - // #i1624# #i1768# ignore unnamed user styles - if( (nXfId >= 0) && (aStyleName.getLength() > 0) ) - { - // insert into the XF identifier map - maCellStylesById[ nXfId ] = xCellStyle; - - // find an unused name - OUString aUnusedName = aStyleName; - sal_Int32 nIndex = 0; - while( maCellStylesByName.count( aUnusedName ) > 0 ) - aUnusedName = OUStringBuffer( aStyleName ).append( sal_Unicode( ' ' ) ).append( ++nIndex ).makeStringAndClear(); - - // move old existing style to new unused name, if new style is built-in - if( xCellStyle->isBuiltin() && (aStyleName != aUnusedName) ) - { - CellStyleRef& rxCellStyle = maCellStylesByName[ aUnusedName ]; - rxCellStyle = maCellStylesByName[ aStyleName ]; - // the entry may be empty if the style name has been reserved in c'tor - if( rxCellStyle.get() ) - rxCellStyle->setFinalStyleName( aUnusedName ); - aUnusedName = aStyleName; - } - - // insert new style - maCellStylesByName[ aUnusedName ] = xCellStyle; - xCellStyle->setFinalStyleName( aUnusedName ); - - // remember XF identifier of default cell style - if( xCellStyle->isDefaultStyle() ) - mnDefStyleXf = nXfId; - } -} - // ============================================================================ } // namespace xls diff --git a/oox/source/xls/workbookfragment.cxx b/oox/source/xls/workbookfragment.cxx index 6a78c838838e..a372ef714633 100644 --- a/oox/source/xls/workbookfragment.cxx +++ b/oox/source/xls/workbookfragment.cxx @@ -371,7 +371,7 @@ bool BiffWorkbookFragment::importFragment() // try to start a new sheet fragment double fSegmentLength = getProgressBar().getFreeLength() / (nWorksheetCount - nWorksheet); ISegmentProgressBarRef xSheetProgress = getProgressBar().createSegment( fSegmentLength ); - BiffFragmentType eSheetFragment = startFragment( getBiff() ); + BiffFragmentType eSheetFragment = startFragment( getBiff(), rWorksheets.getBiffRecordHandle( nWorksheet ) ); sal_Int16 nCalcSheet = rWorksheets.getCalcSheetIndex( nWorksheet ); bNextSheet = importSheetFragment( *xSheetProgress, eSheetFragment, nCalcSheet ); } diff --git a/oox/source/xls/workbookhelper.cxx b/oox/source/xls/workbookhelper.cxx index 2b337050a996..39b292ae0c7b 100644 --- a/oox/source/xls/workbookhelper.cxx +++ b/oox/source/xls/workbookhelper.cxx @@ -250,6 +250,15 @@ TimeCount& WorkbookHelper::getTimeCount( TimerType eType ) const // ============================================================================ +bool IgnoreCaseCompare::operator()( const OUString& rName1, const OUString& rName2 ) const +{ + // there is no wrapper in rtl::OUString, TODO: compare with collator + return ::rtl_ustr_compareIgnoreAsciiCase_WithLength( + rName1.getStr(), rName1.getLength(), rName2.getStr(), rName2.getLength() ) < 0; +} + +// ============================================================================ + class WorkbookData #if OSL_DEBUG_LEVEL > 0 : public dbg::WorkbookData diff --git a/oox/source/xls/workbooksettings.cxx b/oox/source/xls/workbooksettings.cxx index e4de0ff2dd0c..3473dbcc330e 100644 --- a/oox/source/xls/workbooksettings.cxx +++ b/oox/source/xls/workbooksettings.cxx @@ -298,6 +298,8 @@ void WorkbookSettings::finalizeImport() // write protection if( maFileSharing.mbRecommendReadOnly || (maFileSharing.mnPasswordHash != 0) ) getBaseFilter().getMediaDescriptor()[ CREATE_OUSTRING( "ReadOnly" ) ] <<= true; + if( maFileSharing.mnPasswordHash != 0 ) + aPropSet.setProperty( PROP_WriteProtectionPassword, static_cast< sal_Int32 >( maFileSharing.mnPasswordHash ) ); // calculation settings Date aNullDate = getNullDate(); diff --git a/oox/source/xls/worksheetbuffer.cxx b/oox/source/xls/worksheetbuffer.cxx index ee2491880c4e..5f19fd55dbcd 100644 --- a/oox/source/xls/worksheetbuffer.cxx +++ b/oox/source/xls/worksheetbuffer.cxx @@ -61,6 +61,7 @@ namespace xls { // ============================================================================ SheetInfoModel::SheetInfoModel() : + mnBiffHandle( -1 ), mnSheetId( -1 ), mnState( XML_visible ) { @@ -111,19 +112,19 @@ void WorksheetBuffer::importSheet( RecordInputStream& rStrm ) void WorksheetBuffer::importSheet( BiffInputStream& rStrm ) { - sal_uInt16 nState = 0; + SheetInfoModel aModel; if( getBiff() >= BIFF5 ) { - rStrm.skip( 4 ); - rStrm >> nState; + rStrm.enableDecoder( false ); + aModel.mnBiffHandle = rStrm.readuInt32(); + rStrm.enableDecoder( true ); + sal_uInt16 nState = rStrm.readuInt16(); + static const sal_Int32 spnStates[] = { XML_visible, XML_hidden, XML_veryHidden }; + aModel.mnState = STATIC_ARRAY_SELECT( spnStates, nState, XML_visible ); } - - SheetInfoModel aModel; aModel.maName = (getBiff() == BIFF8) ? rStrm.readUniStringBody( rStrm.readuInt8() ) : rStrm.readByteStringUC( false, getTextEncoding() ); - static const sal_Int32 spnStates[] = { XML_visible, XML_hidden, XML_veryHidden }; - aModel.mnState = STATIC_ARRAY_SELECT( spnStates, nState, XML_visible ); insertSheet( aModel ); } @@ -143,6 +144,12 @@ OUString WorksheetBuffer::getWorksheetRelId( sal_Int32 nWorksheet ) const return pSheetInfo ? pSheetInfo->maRelId : OUString(); } +sal_Int64 WorksheetBuffer::getBiffRecordHandle( sal_Int32 nWorksheet ) const +{ + const SheetInfo* pSheetInfo = maSheetInfos.get( nWorksheet ).get(); + return pSheetInfo ? pSheetInfo->mnBiffHandle : -1; +} + sal_Int16 WorksheetBuffer::getCalcSheetIndex( sal_Int32 nWorksheet ) const { const SheetInfo* pSheetInfo = maSheetInfos.get( nWorksheet ).get(); @@ -250,13 +257,6 @@ void WorksheetBuffer::insertSheet( const SheetInfoModel& rModel ) maSheetInfosByName[ lclQuoteName( rModel.maName ) ] = xSheetInfo; } -bool WorksheetBuffer::SheetNameCompare::operator()( const OUString& rName1, const OUString& rName2 ) const -{ - // there is no wrapper in rtl::OUString, TODO: compare with collator - return ::rtl_ustr_compareIgnoreAsciiCase_WithLength( - rName1.getStr(), rName1.getLength(), rName2.getStr(), rName2.getLength() ) < 0; -} - // ============================================================================ } // namespace xls -- cgit -- cgit From 0211e8bc457a12570988f4aee7dea42c2fc6d56f Mon Sep 17 00:00:00 2001 From: Ivo Hinkelmann Date: Wed, 28 Oct 2009 15:40:57 +0000 Subject: CWS-TOOLING: integrate CWS writerfilter32bugfixes01 2009-10-16 10:25:35 +0200 os r276956 : warning fixed 2009-10-16 10:18:35 +0200 os r276954 : using namespace std removed from headers 2009-10-16 10:18:19 +0200 os r276953 : using namespace std removed from headers 2009-10-16 10:17:35 +0200 os r276952 : using namespace std removed from headers 2009-10-14 12:14:16 +0200 cedricbosdo r276890 : Fixed warnings 2009-10-09 08:36:35 +0200 cedricbosdo r276796 : Rebased to OOO320_m1 2009-10-05 11:32:53 +0200 cedricbosdo r276668 : * Fixed namespace_preprocess for windows build * Removed some unused variable * Set a default value for GetCurrentToken 2009-09-07 13:05:30 +0200 os r275892 : #i104155# support for empty URLs if called from writerfilter re-introduced 2009-09-04 14:36:14 +0200 cedricbosdo r275803 : CWS-TOOLING: rebase CWS writerfilter32bugfixes01 to trunk@275331 (milestone: DEV300:m56) 2009-05-15 17:36:28 +0200 cedricbosdo r271958 : Added file to test docx numbering import fixes 2009-05-15 17:28:27 +0200 cedricbosdo r271955 : * Implemented a VML import basis. * Fixed some docx numbering import bugs * Implemented docx outline style import 2009-03-16 11:42:06 +0100 hbrinkm r269515 : moved clog inside #ifdef 2009-03-13 18:30:14 +0100 cedricbosdo r269493 : Fixed a dummy paragraph ending problem 2009-03-13 13:57:58 +0100 cedricbosdo r269477 : Added the missing headers 2009-03-13 12:03:25 +0100 cedricbosdo r269466 : Fixed i#93786 and i#100176 2009-03-12 11:39:10 +0100 cedricbosdo r269377 : Fixed a crash in the redlines patch 2009-03-12 10:11:48 +0100 cedricbosdo r269362 : Fixes for the docx import 2009-03-12 10:10:37 +0100 cedricbosdo r269361 : docx import fixes for: + tables styles + pictures positionning + redlines Started to implement the docx settings.xml import --- oox/inc/oox/core/namespaces.hxx | 104 ----- oox/prj/d.lst | 1 + oox/source/core/filterbase.cxx | 2 +- oox/source/shape/ShapeContextHandler.cxx | 12 + oox/source/token/gennamespaces.pl | 65 +++ oox/source/token/makefile.mk | 16 +- oox/source/token/namespaces.txt | 48 +++ writerfilter/inc/dmapper/DomainMapper.hxx | 8 +- writerfilter/inc/resourcemodel/TableData.hxx | 21 + writerfilter/inc/resourcemodel/TableManager.hxx | 96 +++-- .../inc/resourcemodel/WW8ResourceModel.hxx | 8 + .../qa/documents/docx/numbering/num-1.docx | Bin 0 -> 11288 bytes .../Word DocumentOffice 2007 Format Sample6.docx | Bin 0 -> 302738 bytes .../docx/pictures/i97645 New example.docx | Bin 0 -> 102969 bytes .../qa/documents/docx/pictures/test-image.docx | Bin 0 -> 24026 bytes .../qa/documents/docx/pictures/test-image1.docx | Bin 0 -> 61174 bytes writerfilter/qa/documents/docx/pictures/test.docx | Bin 0 -> 22007 bytes .../documents/docx/redlines/test-review-brk.docx | Bin 0 -> 10621 bytes .../documents/docx/redlines/test-review-para.docx | Bin 0 -> 10682 bytes .../documents/docx/redlines/test-review-stack.docx | Bin 0 -> 10598 bytes .../qa/documents/docx/tables/nested-tables.docx | Bin 0 -> 11079 bytes .../qa/documents/docx/tables/nested-tables2.docx | Bin 0 -> 10521 bytes .../qa/documents/docx/tables/nested-tables3.docx | Bin 0 -> 11482 bytes .../qa/documents/docx/tables/nested-tables4.docx | Bin 0 -> 13956 bytes .../qa/documents/docx/tables/nested-tables5.docx | Bin 0 -> 10761 bytes .../qa/documents/docx/tables/parentinvguid.docx | Bin 0 -> 139481 bytes .../qa/documents/docx/tables/table-styles.docx | Bin 0 -> 13859 bytes .../qa/documents/docx/tables/test-grid.docx | Bin 0 -> 10978 bytes .../qa/documents/docx/tables/test-paras.docx | Bin 0 -> 13586 bytes .../qa/documents/docx/tables/test-simple.docx | Bin 0 -> 10527 bytes .../qa/documents/docx/tables/two-tables.docx | Bin 0 -> 10619 bytes .../docx/tables/updatejpegprocessing.docx | Bin 0 -> 24439 bytes .../qa/documents/docx/test-page-format.docx | Bin 0 -> 20846 bytes writerfilter/source/dmapper/BorderHandler.cxx | 8 +- writerfilter/source/dmapper/BorderHandler.hxx | 1 + writerfilter/source/dmapper/CellColorHandler.cxx | 5 + writerfilter/source/dmapper/ConversionHelper.cxx | 7 +- writerfilter/source/dmapper/DomainMapper.cxx | 132 ++++-- .../source/dmapper/DomainMapperTableHandler.cxx | 323 ++++++++++---- .../source/dmapper/DomainMapperTableHandler.hxx | 7 + .../source/dmapper/DomainMapperTableManager.cxx | 299 +++++-------- .../source/dmapper/DomainMapperTableManager.hxx | 55 ++- writerfilter/source/dmapper/DomainMapper_Impl.cxx | 345 +++++++++++---- writerfilter/source/dmapper/DomainMapper_Impl.hxx | 69 ++- writerfilter/source/dmapper/FontTable.cxx | 9 + writerfilter/source/dmapper/FontTable.hxx | 3 +- writerfilter/source/dmapper/GraphicHelpers.cxx | 223 ++++++++++ writerfilter/source/dmapper/GraphicHelpers.hxx | 48 +++ writerfilter/source/dmapper/GraphicImport.cxx | 184 ++++++-- writerfilter/source/dmapper/GraphicImport.hxx | 11 +- writerfilter/source/dmapper/ListTable.cxx | 282 +++++++++---- writerfilter/source/dmapper/ListTable.hxx | 2 + writerfilter/source/dmapper/OLEHandler.cxx | 62 ++- writerfilter/source/dmapper/OLEHandler.hxx | 9 + writerfilter/source/dmapper/PageBordersHandler.cxx | 121 ++++++ writerfilter/source/dmapper/PageBordersHandler.hxx | 57 +++ writerfilter/source/dmapper/PropertyIds.cxx | 9 +- writerfilter/source/dmapper/PropertyIds.hxx | 6 + writerfilter/source/dmapper/PropertyMap.cxx | 68 +-- writerfilter/source/dmapper/PropertyMap.hxx | 16 + writerfilter/source/dmapper/SettingsTable.cxx | 87 ++++ writerfilter/source/dmapper/SettingsTable.hxx | 46 ++ writerfilter/source/dmapper/StyleSheetTable.cxx | 468 ++++++++++++++++----- writerfilter/source/dmapper/StyleSheetTable.hxx | 46 +- writerfilter/source/dmapper/TDefTableHandler.cxx | 19 + writerfilter/source/dmapper/TDefTableHandler.hxx | 4 + .../source/dmapper/TablePropertiesHandler.cxx | 217 ++++++++++ .../source/dmapper/TablePropertiesHandler.hxx | 83 ++++ writerfilter/source/dmapper/TblStylePrHandler.cxx | 69 +++ writerfilter/source/dmapper/TblStylePrHandler.hxx | 64 +++ writerfilter/source/dmapper/ThemeTable.hxx | 1 - writerfilter/source/dmapper/makefile.mk | 9 +- .../source/ooxml/OOXMLFastContextHandler.cxx | 70 ++- .../source/ooxml/OOXMLFastContextHandler.hxx | 8 + writerfilter/source/ooxml/makefile.mk | 14 +- writerfilter/source/ooxml/model.xml | 141 ++++--- writerfilter/source/ooxml/modelpreprocess.xsl | 2 +- writerfilter/source/ooxml/namespace_preprocess.pl | 65 +++ writerfilter/source/ooxml/resourcestools.xsl | 96 ++++- writerfilter/source/resourcemodel/WW8Analyzer.cxx | 8 + writerfilter/source/resourcemodel/WW8Analyzer.hxx | 2 + .../source/resourcemodel/resourcemodel.cxx | 10 + .../source/resourcemodel/resourcemodel.hxx | 3 + 83 files changed, 3354 insertions(+), 920 deletions(-) delete mode 100644 oox/inc/oox/core/namespaces.hxx create mode 100644 oox/source/token/gennamespaces.pl create mode 100644 oox/source/token/namespaces.txt create mode 100644 writerfilter/qa/documents/docx/numbering/num-1.docx create mode 100644 writerfilter/qa/documents/docx/pictures/Word DocumentOffice 2007 Format Sample6.docx create mode 100644 writerfilter/qa/documents/docx/pictures/i97645 New example.docx create mode 100644 writerfilter/qa/documents/docx/pictures/test-image.docx create mode 100644 writerfilter/qa/documents/docx/pictures/test-image1.docx create mode 100644 writerfilter/qa/documents/docx/pictures/test.docx create mode 100644 writerfilter/qa/documents/docx/redlines/test-review-brk.docx create mode 100644 writerfilter/qa/documents/docx/redlines/test-review-para.docx create mode 100644 writerfilter/qa/documents/docx/redlines/test-review-stack.docx create mode 100644 writerfilter/qa/documents/docx/tables/nested-tables.docx create mode 100644 writerfilter/qa/documents/docx/tables/nested-tables2.docx create mode 100644 writerfilter/qa/documents/docx/tables/nested-tables3.docx create mode 100644 writerfilter/qa/documents/docx/tables/nested-tables4.docx create mode 100644 writerfilter/qa/documents/docx/tables/nested-tables5.docx create mode 100644 writerfilter/qa/documents/docx/tables/parentinvguid.docx create mode 100644 writerfilter/qa/documents/docx/tables/table-styles.docx create mode 100644 writerfilter/qa/documents/docx/tables/test-grid.docx create mode 100644 writerfilter/qa/documents/docx/tables/test-paras.docx create mode 100644 writerfilter/qa/documents/docx/tables/test-simple.docx create mode 100644 writerfilter/qa/documents/docx/tables/two-tables.docx create mode 100644 writerfilter/qa/documents/docx/tables/updatejpegprocessing.docx create mode 100644 writerfilter/qa/documents/docx/test-page-format.docx create mode 100644 writerfilter/source/dmapper/GraphicHelpers.cxx create mode 100644 writerfilter/source/dmapper/GraphicHelpers.hxx create mode 100644 writerfilter/source/dmapper/PageBordersHandler.cxx create mode 100644 writerfilter/source/dmapper/PageBordersHandler.hxx create mode 100644 writerfilter/source/dmapper/SettingsTable.cxx create mode 100644 writerfilter/source/dmapper/SettingsTable.hxx create mode 100644 writerfilter/source/dmapper/TablePropertiesHandler.cxx create mode 100644 writerfilter/source/dmapper/TablePropertiesHandler.hxx create mode 100644 writerfilter/source/dmapper/TblStylePrHandler.cxx create mode 100644 writerfilter/source/dmapper/TblStylePrHandler.hxx create mode 100644 writerfilter/source/ooxml/namespace_preprocess.pl diff --git a/oox/inc/oox/core/namespaces.hxx b/oox/inc/oox/core/namespaces.hxx deleted file mode 100644 index 643e595b8051..000000000000 --- a/oox/inc/oox/core/namespaces.hxx +++ /dev/null @@ -1,104 +0,0 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2008 by Sun Microsystems, Inc. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * $RCSfile: namespaces.hxx,v $ - * $Revision: 1.5.4.1 $ - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#ifndef OOX_CORE_NAMESPACES_HXX -#define OOX_CORE_NAMESPACES_HXX - -#include - -namespace oox { - -// ============================================================================ - -// relations, XML -const sal_Int32 NMSP_XML = 1 << 16; -const sal_Int32 NMSP_PACKAGE_RELATIONSHIPS = 2 << 16; -const sal_Int32 NMSP_RELATIONSHIPS = 3 << 16; -const sal_Int32 NMSP_CONTENT_TYPES = 4 << 16; -// office global -const sal_Int32 NMSP_ACTIVATION = 12 << 16; -// DrawingML -const sal_Int32 NMSP_DRAWINGML = 21 << 16; -const sal_Int32 NMSP_DIAGRAM = 22 << 16; -const sal_Int32 NMSP_CHART = 23 << 16; -// VML -const sal_Int32 NMSP_VML = 31 << 16; -const sal_Int32 NMSP_OFFICE = 32 << 16; -const sal_Int32 NMSP_VML_DOC = 33 << 16; // Word VML -const sal_Int32 NMSP_VML_XLS = 34 << 16; // Excel VML -const sal_Int32 NMSP_VML_PPT = 35 << 16; // PowerPoint VML -const sal_Int32 NMSP_AX = 36 << 16; // ActiveX (for OCX form controls) -// SpreadsheetML -const sal_Int32 NMSP_XLS = 41 << 16; -const sal_Int32 NMSP_XDR = 42 << 16; // SpreadsheetDrawingML -const sal_Int32 NMSP_XM = 43 << 16; // Macro sheet -// PresentationML -const sal_Int32 NMSP_PPT = 51 << 16; -// Document properties -const sal_Int32 NMSP_COREPR = 61 << 16; -const sal_Int32 NMSP_DC = 62 << 16; -const sal_Int32 NMSP_DCTERMS = 63 << 16; -const sal_Int32 NMSP_EXTPR = 64 << 16; -const sal_Int32 NMSP_CUSTPR = 65 << 16; -const sal_Int32 NMSP_VT = 66 << 16; - -// ---------------------------------------------------------------------------- - -const sal_Int32 TOKEN_MASK = SAL_MAX_UINT16; -const sal_Int32 NMSP_MASK = SAL_MAX_INT16 << 16; - -/** Returns the token identifier of the passed element without namespace. */ -inline sal_Int32 getToken( sal_Int32 nElement ) { return nElement & TOKEN_MASK; } - -/** Returns the namespace of the passed element without token identifier. */ -inline sal_Int32 getNamespace( sal_Int32 nElement ) { return nElement & NMSP_MASK; } - -// ---------------------------------------------------------------------------- - -// defines for tokens with specific namespaces, can be used in switch/cases -#define A_TOKEN( token ) (::oox::NMSP_DRAWINGML | XML_##token) -#define AX_TOKEN( token ) (::oox::NMSP_AX | XML_##token) -#define C_TOKEN( token ) (::oox::NMSP_CHART | XML_##token) -#define O_TOKEN( token ) (::oox::NMSP_OFFICE | XML_##token) -#define PPT_TOKEN( token ) (::oox::NMSP_PPT | XML_##token) -#define R_TOKEN( token ) (::oox::NMSP_RELATIONSHIPS | XML_##token) -#define VML_TOKEN( token ) (::oox::NMSP_VML | XML_##token) -#define VMLX_TOKEN( token ) (::oox::NMSP_VML_XLS | XML_##token) -#define XDR_TOKEN( token ) (::oox::NMSP_XDR | XML_##token) -#define XLS_TOKEN( token ) (::oox::NMSP_XLS | XML_##token) -#define XM_TOKEN( token ) (::oox::NMSP_XM | XML_##token) -#define XML_TOKEN( token ) (::oox::NMSP_XML | XML_##token) - -// ============================================================================ - -} // namespace oox - -#endif // OOX_CORE_NAMESPACES_HXX - diff --git a/oox/prj/d.lst b/oox/prj/d.lst index 50ec05955ca6..2c9d8d5bae74 100644 --- a/oox/prj/d.lst +++ b/oox/prj/d.lst @@ -18,6 +18,7 @@ mkdir: %_DEST%\inc%_EXT%\oox\vml ..\%__SRC%\inc\tokens.hxx %_DEST%\inc%_EXT%\oox\core\tokens.hxx ..\source\token\tokens.txt %_DEST%\inc%_EXT%\oox\token.txt +..\source\token\namespaces.txt %_DEST%\inc%_EXT%\oox\namespaces.txt ..\inc\oox\dllapi.h %_DEST%\inc%_EXT%\oox\dllapi.h ..\inc\oox\helper\binarystreambase.hxx %_DEST%\inc%_EXT%\oox\helper\binarystreambase.hxx ..\inc\oox\helper\helper.hxx %_DEST%\inc%_EXT%\oox\helper\helper.hxx diff --git a/oox/source/core/filterbase.cxx b/oox/source/core/filterbase.cxx index c5b423380e82..f2f9ef09b9e5 100644 --- a/oox/source/core/filterbase.cxx +++ b/oox/source/core/filterbase.cxx @@ -600,7 +600,7 @@ sal_Bool SAL_CALL FilterBase::filter( const Sequence< PropertyValue >& rMediaDes { setMediaDescriptor( rMediaDescSeq ); DocumentOpenedGuard aOpenedGuard( mxImpl->maFileUrl ); - if( aOpenedGuard.isValid() ) + if( aOpenedGuard.isValid() || !mxImpl->maFileUrl.getLength() ) { mxImpl->initializeFilter(); switch( mxImpl->meDirection ) diff --git a/oox/source/shape/ShapeContextHandler.cxx b/oox/source/shape/ShapeContextHandler.cxx index 8f5165726710..204ed459c7fc 100644 --- a/oox/source/shape/ShapeContextHandler.cxx +++ b/oox/source/shape/ShapeContextHandler.cxx @@ -33,6 +33,11 @@ #include "oox/vml/vmlshape.hxx" #include "oox/vml/vmlshapecontainer.hxx" +#if DEBUG +#include +using namespace std; +#endif + namespace oox { namespace shape { using namespace ::com::sun::star; @@ -90,6 +95,9 @@ ShapeContextHandler::getGraphicShapeContext(::sal_Int32 Element ) uno::Reference ShapeContextHandler::getDrawingShapeContext() { +#if DEBUG + clog << "ShapeContextHandler::getDrawingShapeContext" << endl; +#endif if (!mxDrawingFragmentHandler.is()) { mpDrawing.reset( new oox::vml::Drawing( *mxFilterBase, mxDrawPage, oox::vml::VMLDRAWING_WORD ) ); @@ -109,6 +117,7 @@ ShapeContextHandler::getContextHandler() switch (mnStartToken & NMSP_MASK) { + case NMSP_DOC: case NMSP_VML: xResult.set(getDrawingShapeContext()); break; @@ -179,6 +188,9 @@ ShapeContextHandler::createFastChildContext const uno::Reference< xml::sax::XFastAttributeList > & Attribs) throw (uno::RuntimeException, xml::sax::SAXException) { +#if DEBUG + clog << "ShapeContextHandler::createFastChildContext" << endl; +#endif uno::Reference< xml::sax::XFastContextHandler > xResult; uno::Reference< xml::sax::XFastContextHandler > xContextHandler(getContextHandler()); diff --git a/oox/source/token/gennamespaces.pl b/oox/source/token/gennamespaces.pl new file mode 100644 index 000000000000..b3d277b85c2f --- /dev/null +++ b/oox/source/token/gennamespaces.pl @@ -0,0 +1,65 @@ +$ARGV0 = shift @ARGV; +$ARGV1 = shift @ARGV; + +open ( NAMESPACES, $ARGV0 ) || die "can't open namespaces file: $!"; + + +open ( HXX, ">$ARGV1" ) or die "can't open namespaces.hxx file: $!"; + +print ( HXX "#ifndef OOX_NAMESPACES_HXX\n" ); +print ( HXX "#define OOX_NAMESPACES_HXX\n\n" ); +print ( HXX "#include \n\n" ); +print ( HXX "namespace oox {\n\n" ); + +$group = 0; +$i = 1; +while ( ) +{ + chomp( $_ ); + $_ =~ s/\s*//g; + if ( $_ =~ m/^$/ ) + { + # Start a new group + print ( HXX "\n" ); + $i = 0; + $group++; + } + elsif ( $_ =~ m/^[^#]/ ) + { + # Neither an empty line nor a comment + $_ =~ /^[a-zA-Z0-9-_]+$/ or die "Invalid namespace token $_"; + $id = "NMSP_$_"; + $id =~ s/-/_/g; + $no = $group*10 + $i; + print ( HXX "const sal_Int32 $id = $no << 16;\n" ); + ++$i; + } +} +close ( NAMESPACES ); + +print ( HXX "\nconst sal_Int32 TOKEN_MASK = SAL_MAX_UINT16;\n" ); +print ( HXX "const sal_Int32 NMSP_MASK = SAL_MAX_INT16 << 16;\n" ); + +print ( HXX "/** Returns the token identifier of the passed element without namespace. */\n" ); +print ( HXX "inline sal_Int32 getToken( sal_Int32 nElement ) { return nElement & TOKEN_MASK; }\n\n" ); + +print ( HXX "/** Returns the namespace of the passed element without token identifier. */\n" ); +print ( HXX "inline sal_Int32 getNamespace( sal_Int32 nElement ) { return nElement & NMSP_MASK; }\n\n" ); + +print ( HXX "// defines for tokens with specific namespaces, can be used in switch/cases\n\n" ); +print ( HXX "#define A_TOKEN( token ) (::oox::NMSP_DRAWINGML | XML_##token)\n" ); +print ( HXX "#define AX_TOKEN( token ) (::oox::NMSP_AX | XML_##token)\n" ); +print ( HXX "#define C_TOKEN( token ) (::oox::NMSP_CHART | XML_##token)\n" ); +print ( HXX "#define O_TOKEN( token ) (::oox::NMSP_OFFICE | XML_##token)\n" ); +print ( HXX "#define PPT_TOKEN( token ) (::oox::NMSP_PPT | XML_##token)\n" ); +print ( HXX "#define R_TOKEN( token ) (::oox::NMSP_RELATIONSHIPS | XML_##token)\n" ); +print ( HXX "#define VML_TOKEN( token ) (::oox::NMSP_VML | XML_##token)\n" ); +print ( HXX "#define VMLX_TOKEN( token ) (::oox::NMSP_VML_XLS | XML_##token)\n" ); +print ( HXX "#define XDR_TOKEN( token ) (::oox::NMSP_XDR | XML_##token)\n" ); +print ( HXX "#define XLS_TOKEN( token ) (::oox::NMSP_XLS | XML_##token)\n" ); +print ( HXX "#define XM_TOKEN( token ) (::oox::NMSP_XM | XML_##token)\n" ); +print ( HXX "#define XML_TOKEN( token ) (::oox::NMSP_XML | XML_##token)\n" ); + + +print ( HXX "} // namespace oox\n\n" ); +print ( HXX "#endif // OOX_NAMESPACES_HXX\n" ); diff --git a/oox/source/token/makefile.mk b/oox/source/token/makefile.mk index 3cce788d2508..cda48a6b11a0 100644 --- a/oox/source/token/makefile.mk +++ b/oox/source/token/makefile.mk @@ -51,16 +51,26 @@ SLOFILES = \ .INCLUDE : target.mk -$(MISC)$/tokens.gperf $(INCCOM)$/tokenwords.inc $(INCCOM)$/tokens.hxx $(INCCOM)$/propertywords.inc $(INCCOM)$/properties.hxx : +$(MISC)$/tokens.gperf $(INCCOM)$/tokenwords.inc $(INCCOM)$/tokens.hxx $(INCCOM)$/propertywords.inc $(INCCOM)$/properties.hxx $(INCCOM)$/oox$/core$/namespaces.hxx : @@noop $(assign do_phony:=.PHONY) $(MISC)$/do_tokens $(do_phony) : tokens.txt gentoken.pl $(MISC)$/tokens.gperf $(INCCOM)$/tokenwords.inc $(INCCOM)$/tokens.hxx - $(PERL) gentoken.pl tokens.txt $(INCCOM)$/tokens.hxx $(INCCOM)$/tokenwords.inc $(MISC)$/tokens.gperf && $(TOUCH) $@ + $(PERL) gentoken.pl tokens.txt $(INCCOM)$/tokens.hxx $(INCCOM)$/tokenwords.inc $(MISC)$/tokens.gperf && $(TOUCH) $@ + +$(INCCOM)$/oox: + $(MKDIR) $(INCCOM)$/oox + +$(INCCOM)$/oox$/core: $(INCCOM)$/oox + $(MKDIR) $(INCCOM)$/oox$/core + +$(MISC)$/do_namespaces $(do_phony) : namespaces.txt gennamespaces.pl + $(MKDIRHIER) $(INCCOM)$/oox$/core + $(PERL) gennamespaces.pl namespaces.txt $(INCCOM)$/oox$/core$/namespaces.hxx && $(TOUCH) $@ $(INCCOM)$/tokens.inc : $(MISC)$/tokens.gperf $(MISC)$/do_tokens $(AUGMENT_LIBRARY_PATH) gperf --compare-strncmp $(MISC)$/tokens.gperf | $(SED) -e "s/(char\*)0/(char\*)0, 0/g" | $(GREP) -v "^#line" >$(INCCOM)$/tokens.inc -$(SLO)$/tokenmap.obj : $(INCCOM)$/tokens.inc $(INCCOM)$/tokenwords.inc $(INCCOM)$/tokens.hxx $(MISC)$/do_tokens +$(SLO)$/tokenmap.obj : $(INCCOM)$/tokens.inc $(INCCOM)$/tokenwords.inc $(INCCOM)$/tokens.hxx $(INCCOM)$/oox$/core$/namespaces.hxx $(MISC)$/do_tokens $(MISC)$/do_namespaces $(MISC)$/do_properties $(do_phony) : properties.txt genproperties.pl $(INCCOM)$/properties.hxx $(INCCOM)$/propertywords.inc $(PERL) genproperties.pl properties.txt $(INCCOM)$/properties.hxx $(INCCOM)$/propertywords.inc && $(TOUCH) $@ diff --git a/oox/source/token/namespaces.txt b/oox/source/token/namespaces.txt new file mode 100644 index 000000000000..63ca76e95f54 --- /dev/null +++ b/oox/source/token/namespaces.txt @@ -0,0 +1,48 @@ +# Relations, XML +XML +PACKAGE_RELATIONSHIPS +RELATIONSHIPS +CONTENT_TYPES + +# Office global +THEME +ACTIVATION +MATH + +#DrawingML +DRAWINGML +PICTURE +DIAGRAM +CHART +DOC_DRAWINGML + +# VML +VML +OFFICE +VML_DOC +VML_XLS +VML_PPT +AX + +#SpreadsheetML +XLS +XDR +XM + +#PresentationML +PPT + +#WordprocessingML +DOC +SML + +# Document properties +COREPR +DC +DCTERMS +EXTPR +CUSTPR +VT + +# Other elements: used by writerfilter +SPRM diff --git a/writerfilter/inc/dmapper/DomainMapper.hxx b/writerfilter/inc/dmapper/DomainMapper.hxx index 71c22822affb..d543c0157874 100644 --- a/writerfilter/inc/dmapper/DomainMapper.hxx +++ b/writerfilter/inc/dmapper/DomainMapper.hxx @@ -62,7 +62,6 @@ typedef std::vector< com::sun::star::beans::PropertyValue > PropertyValueVector_ namespace writerfilter { namespace dmapper { -using namespace std; class PropertyMap; class DomainMapper_Impl; @@ -109,6 +108,9 @@ public: virtual void endParagraphGroup(); virtual void startCharacterGroup(); virtual void endCharacterGroup(); + virtual void startShape( ::com::sun::star::uno::Reference< com::sun::star::drawing::XShape > xShape ); + virtual void endShape( ); + virtual void text(const sal_uInt8 * data, size_t len); virtual void utext(const sal_uInt8 * data, size_t len); virtual void props(writerfilter::Reference::Pointer_t ref); @@ -120,8 +122,8 @@ public: void sprm( Sprm& sprm, ::boost::shared_ptr pContext, SprmType = SPRM_DEFAULT ); - void PushStyleSheetProperties( ::boost::shared_ptr pStyleProperties ); - void PopStyleSheetProperties(); + void PushStyleSheetProperties( ::boost::shared_ptr pStyleProperties, bool bAffectTableMngr = false ); + void PopStyleSheetProperties( bool bAffectTableMngr = false ); void PushListProperties( ::boost::shared_ptr pListProperties ); void PopListProperties(); diff --git a/writerfilter/inc/resourcemodel/TableData.hxx b/writerfilter/inc/resourcemodel/TableData.hxx index 407395a46de1..c86826feed01 100644 --- a/writerfilter/inc/resourcemodel/TableData.hxx +++ b/writerfilter/inc/resourcemodel/TableData.hxx @@ -275,6 +275,11 @@ class WRITERFILTER_DLLPUBLIC TableData typedef typename RowData::Pointer_t RowPointer_t; typedef ::std::vector Rows; + /** + the table properties + */ + PropertiesPointer mpTableProps; + /** the data of the rows of the table */ @@ -349,6 +354,22 @@ public: mpRow->insertCellProperties(i, pProps); } + void insertTableProperties( PropertiesPointer pProps ) + { + if ( mpTableProps.get( ) ) + mpTableProps->insert( pProps ); + else + mpTableProps = pProps; + } + + /** + Return the table properties. + */ + PropertiesPointer getTableProperties( ) + { + return mpTableProps; + } + /** Return number of rows in the table. */ diff --git a/writerfilter/inc/resourcemodel/TableManager.hxx b/writerfilter/inc/resourcemodel/TableManager.hxx index a9cc7f57cc52..cc267273fdf0 100644 --- a/writerfilter/inc/resourcemodel/TableManager.hxx +++ b/writerfilter/inc/resourcemodel/TableManager.hxx @@ -103,6 +103,11 @@ public: @param rT end handle of cell */ virtual void endCell(const T & rT) = 0; + + virtual T* getTable( ) + { + return NULL; + }; }; template @@ -151,16 +156,16 @@ class TableManager /** properties of the current cell */ - PropertiesPointer mpCellProps; + vector< PropertiesPointer > mpCellProps; /** properties of the current row */ - PropertiesPointer mpRowProps; + vector< PropertiesPointer > mpRowProps; /** - properties of the current table - */ + properties of the current table: don't use them directly. + */ PropertiesPointer mpTableProps; /** @@ -168,6 +173,7 @@ class TableManager */ T mCurHandle; + T* mpInnerTable; /** stack of table data @@ -231,7 +237,6 @@ protected: */ virtual void clearData(); - public: TableManager(); virtual ~TableManager(){} @@ -351,7 +356,7 @@ public: template TableManager::TableManager() : mbRowEnd(false), mbInCell(false), mbCellEnd(false), mnTableDepthNew(0), - mnTableDepth(0) + mnTableDepth(0), mpInnerTable( NULL ) { } @@ -398,19 +403,30 @@ void TableManager::handle(const T & rHandle) template void TableManager::startLevel() { +#if DEBUG + std::clog << "TableManager::startLevel()" << std::endl; +#endif typename TableData::Pointer_t pTableData (new TableData(mTableDataStack.size())); mTableDataStack.push(pTableData); + + PropertiesPointer pEmptyProps; + cellProps( pEmptyProps ); } template void TableManager::endLevel() { +#if DEBUG + std::clog << "TableManager::endLevel()" << std::endl; +#endif if (mpTableDataHandler.get() != NULL) resolveCurrentTable(); - mTableDataStack.pop(); + + if ( mpCellProps.size( ) > 0 ) + mpCellProps.pop_back( ); } template @@ -426,12 +442,6 @@ template void TableManager::endParagraphGroup() { sal_Int32 nTableDepthDifference = mnTableDepthNew - mnTableDepth; - while (nTableDepthDifference > 0) - { - startLevel(); - - --nTableDepthDifference; - } while (nTableDepthDifference < 0) { endLevel(); @@ -447,14 +457,23 @@ void TableManager::endParagraphGroup() if (mbRowEnd) { endOfRowAction(); - pTableData->endRow(mpRowProps); - mpRowProps.reset(); + pTableData->endRow( mpRowProps.back( ) ); + mpRowProps.back( ).reset(); } - - else if (mbInCell) + else if ( mbInCell ) { if (! pTableData->isCellOpen()) - pTableData->addCell(mCurHandle, mpCellProps); + { + if ( mpInnerTable ) + { + pTableData->addCell( *mpInnerTable, mpCellProps.back( ) ); + mpInnerTable = NULL; + } + else + { + pTableData->addCell( mCurHandle, mpCellProps.back( ) ); + } + } if (mbCellEnd) { @@ -462,7 +481,8 @@ void TableManager::endParagraphGroup() pTableData->endCell(mCurHandle); } } - mpCellProps.reset(); + if ( mpCellProps.size( ) > 0 ) + mpCellProps.back().reset( ); } template @@ -538,10 +558,15 @@ void TableManager::utext(const sal_uInt8 * data, size_t le template void TableManager::cellProps(PropertiesPointer pProps) { - if(mpCellProps.get()) - mpCellProps->insert( pProps ); + if ( mpCellProps.size( ) == mTableDataStack.size( ) ) + { + if ( mpCellProps.back( ).get( ) ) + mpCellProps.back()->insert( pProps ); + else + mpCellProps.back( ) = pProps; + } else - mpCellProps = pProps; + mpCellProps.push_back( pProps ); } template @@ -554,19 +579,24 @@ void TableManager::cellPropsByCell template void TableManager::insertRowProps(PropertiesPointer pProps) { - if( mpRowProps.get() ) - mpRowProps->insert( pProps ); + if ( mpRowProps.size( ) == ( mTableDataStack.size( ) - 1 ) ) + { + if( mpRowProps.back( ).get( ) ) + mpRowProps.back( )->insert( pProps ); + else + mpRowProps.back( ) = pProps; + } else - mpRowProps = pProps; + mpRowProps.push_back( pProps ); } template void TableManager::insertTableProps(PropertiesPointer pProps) { - if( mpTableProps.get() ) - mpTableProps->insert( pProps ); - else - mpTableProps = pProps; + typename TableData::Pointer_t + pTableData = mTableDataStack.top(); + + pTableData->insertTableProperties( pProps ); } template @@ -579,7 +609,7 @@ void TableManager::resolveCurrentTable() unsigned int nRows = pTableData->getRowCount(); - mpTableDataHandler->startTable(nRows, pTableData->getDepth(), mpTableProps); + mpTableDataHandler->startTable(nRows, pTableData->getDepth(), pTableData->getTableProperties( ) ); for (unsigned int nRow = 0; nRow < nRows; ++nRow) { @@ -602,8 +632,12 @@ void TableManager::resolveCurrentTable() } mpTableDataHandler->endTable(); + + // The inner table has to be stored only if there is something in the stack + // The 0 depth is the dummy table for the whole stream + if ( pTableData->getDepth( ) > 1 ) + mpInnerTable = mpTableDataHandler->getTable( ); } - mpTableProps.reset(); clearData(); } diff --git a/writerfilter/inc/resourcemodel/WW8ResourceModel.hxx b/writerfilter/inc/resourcemodel/WW8ResourceModel.hxx index 05725e08be90..c7c072fefc4d 100644 --- a/writerfilter/inc/resourcemodel/WW8ResourceModel.hxx +++ b/writerfilter/inc/resourcemodel/WW8ResourceModel.hxx @@ -35,6 +35,7 @@ #include #include #include +#include #include #include #include @@ -219,6 +220,13 @@ public: */ virtual void endCharacterGroup() = 0; + /** + Receives a shape. + */ + virtual void startShape( ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > xShape ) = 0; + + virtual void endShape( ) = 0; + /** Receives 8-bit per character text. diff --git a/writerfilter/qa/documents/docx/numbering/num-1.docx b/writerfilter/qa/documents/docx/numbering/num-1.docx new file mode 100644 index 000000000000..b5e5ffb0b20c Binary files /dev/null and b/writerfilter/qa/documents/docx/numbering/num-1.docx differ diff --git a/writerfilter/qa/documents/docx/pictures/Word DocumentOffice 2007 Format Sample6.docx b/writerfilter/qa/documents/docx/pictures/Word DocumentOffice 2007 Format Sample6.docx new file mode 100644 index 000000000000..eb0d4c256c73 Binary files /dev/null and b/writerfilter/qa/documents/docx/pictures/Word DocumentOffice 2007 Format Sample6.docx differ diff --git a/writerfilter/qa/documents/docx/pictures/i97645 New example.docx b/writerfilter/qa/documents/docx/pictures/i97645 New example.docx new file mode 100644 index 000000000000..6cda8590ad21 Binary files /dev/null and b/writerfilter/qa/documents/docx/pictures/i97645 New example.docx differ diff --git a/writerfilter/qa/documents/docx/pictures/test-image.docx b/writerfilter/qa/documents/docx/pictures/test-image.docx new file mode 100644 index 000000000000..fff6424514a4 Binary files /dev/null and b/writerfilter/qa/documents/docx/pictures/test-image.docx differ diff --git a/writerfilter/qa/documents/docx/pictures/test-image1.docx b/writerfilter/qa/documents/docx/pictures/test-image1.docx new file mode 100644 index 000000000000..bdcc8e088210 Binary files /dev/null and b/writerfilter/qa/documents/docx/pictures/test-image1.docx differ diff --git a/writerfilter/qa/documents/docx/pictures/test.docx b/writerfilter/qa/documents/docx/pictures/test.docx new file mode 100644 index 000000000000..72e3c01f3fda Binary files /dev/null and b/writerfilter/qa/documents/docx/pictures/test.docx differ diff --git a/writerfilter/qa/documents/docx/redlines/test-review-brk.docx b/writerfilter/qa/documents/docx/redlines/test-review-brk.docx new file mode 100644 index 000000000000..7c884505f19e Binary files /dev/null and b/writerfilter/qa/documents/docx/redlines/test-review-brk.docx differ diff --git a/writerfilter/qa/documents/docx/redlines/test-review-para.docx b/writerfilter/qa/documents/docx/redlines/test-review-para.docx new file mode 100644 index 000000000000..9bb87be947bf Binary files /dev/null and b/writerfilter/qa/documents/docx/redlines/test-review-para.docx differ diff --git a/writerfilter/qa/documents/docx/redlines/test-review-stack.docx b/writerfilter/qa/documents/docx/redlines/test-review-stack.docx new file mode 100644 index 000000000000..18b3e3063ea6 Binary files /dev/null and b/writerfilter/qa/documents/docx/redlines/test-review-stack.docx differ diff --git a/writerfilter/qa/documents/docx/tables/nested-tables.docx b/writerfilter/qa/documents/docx/tables/nested-tables.docx new file mode 100644 index 000000000000..844b29de8517 Binary files /dev/null and b/writerfilter/qa/documents/docx/tables/nested-tables.docx differ diff --git a/writerfilter/qa/documents/docx/tables/nested-tables2.docx b/writerfilter/qa/documents/docx/tables/nested-tables2.docx new file mode 100644 index 000000000000..0602ba4fa703 Binary files /dev/null and b/writerfilter/qa/documents/docx/tables/nested-tables2.docx differ diff --git a/writerfilter/qa/documents/docx/tables/nested-tables3.docx b/writerfilter/qa/documents/docx/tables/nested-tables3.docx new file mode 100644 index 000000000000..7b61d147237c Binary files /dev/null and b/writerfilter/qa/documents/docx/tables/nested-tables3.docx differ diff --git a/writerfilter/qa/documents/docx/tables/nested-tables4.docx b/writerfilter/qa/documents/docx/tables/nested-tables4.docx new file mode 100644 index 000000000000..6a17180a4ef4 Binary files /dev/null and b/writerfilter/qa/documents/docx/tables/nested-tables4.docx differ diff --git a/writerfilter/qa/documents/docx/tables/nested-tables5.docx b/writerfilter/qa/documents/docx/tables/nested-tables5.docx new file mode 100644 index 000000000000..2247b64a7621 Binary files /dev/null and b/writerfilter/qa/documents/docx/tables/nested-tables5.docx differ diff --git a/writerfilter/qa/documents/docx/tables/parentinvguid.docx b/writerfilter/qa/documents/docx/tables/parentinvguid.docx new file mode 100644 index 000000000000..8f859fe43a59 Binary files /dev/null and b/writerfilter/qa/documents/docx/tables/parentinvguid.docx differ diff --git a/writerfilter/qa/documents/docx/tables/table-styles.docx b/writerfilter/qa/documents/docx/tables/table-styles.docx new file mode 100644 index 000000000000..2136f9d0f4fe Binary files /dev/null and b/writerfilter/qa/documents/docx/tables/table-styles.docx differ diff --git a/writerfilter/qa/documents/docx/tables/test-grid.docx b/writerfilter/qa/documents/docx/tables/test-grid.docx new file mode 100644 index 000000000000..09f95d1a0982 Binary files /dev/null and b/writerfilter/qa/documents/docx/tables/test-grid.docx differ diff --git a/writerfilter/qa/documents/docx/tables/test-paras.docx b/writerfilter/qa/documents/docx/tables/test-paras.docx new file mode 100644 index 000000000000..0cef4ae05a5b Binary files /dev/null and b/writerfilter/qa/documents/docx/tables/test-paras.docx differ diff --git a/writerfilter/qa/documents/docx/tables/test-simple.docx b/writerfilter/qa/documents/docx/tables/test-simple.docx new file mode 100644 index 000000000000..2c0c08427d3d Binary files /dev/null and b/writerfilter/qa/documents/docx/tables/test-simple.docx differ diff --git a/writerfilter/qa/documents/docx/tables/two-tables.docx b/writerfilter/qa/documents/docx/tables/two-tables.docx new file mode 100644 index 000000000000..d2e99d3ac9ae Binary files /dev/null and b/writerfilter/qa/documents/docx/tables/two-tables.docx differ diff --git a/writerfilter/qa/documents/docx/tables/updatejpegprocessing.docx b/writerfilter/qa/documents/docx/tables/updatejpegprocessing.docx new file mode 100644 index 000000000000..f62eb61dfdcb Binary files /dev/null and b/writerfilter/qa/documents/docx/tables/updatejpegprocessing.docx differ diff --git a/writerfilter/qa/documents/docx/test-page-format.docx b/writerfilter/qa/documents/docx/test-page-format.docx new file mode 100644 index 000000000000..eba8dea3e126 Binary files /dev/null and b/writerfilter/qa/documents/docx/test-page-format.docx differ diff --git a/writerfilter/source/dmapper/BorderHandler.cxx b/writerfilter/source/dmapper/BorderHandler.cxx index 106f20440031..63140b486472 100644 --- a/writerfilter/source/dmapper/BorderHandler.cxx +++ b/writerfilter/source/dmapper/BorderHandler.cxx @@ -137,6 +137,8 @@ void BorderHandler::sprm(Sprm & rSprm) pProperties->resolve(*this); ConversionHelper::MakeBorderLine( m_nLineWidth, m_nLineType, m_nLineColor, m_aBorderLines[rSprm.getId() - NS_ooxml::LN_CT_TblBorders_top], m_bOOXML ); + + m_aFilledLines[ rSprm.getId( ) - NS_ooxml::LN_CT_TblBorders_top] = true; } break; default:; @@ -161,7 +163,11 @@ PropertyMapPtr BorderHandler::getProperties() if( m_bOOXML || m_nCurrentBorderPosition ) { for( sal_Int32 nProp = 0; nProp < BORDER_COUNT; ++nProp) - pPropertyMap->Insert( aPropNames[nProp], false, uno::makeAny( m_aBorderLines[nProp] ) ); + { + if ( m_aFilledLines[nProp] ) { + pPropertyMap->Insert( aPropNames[nProp], false, uno::makeAny( m_aBorderLines[nProp] ) ); + } + } } return pPropertyMap; } diff --git a/writerfilter/source/dmapper/BorderHandler.hxx b/writerfilter/source/dmapper/BorderHandler.hxx index 703518d61b6e..be3d0f7b1055 100644 --- a/writerfilter/source/dmapper/BorderHandler.hxx +++ b/writerfilter/source/dmapper/BorderHandler.hxx @@ -63,6 +63,7 @@ private: sal_Int32 m_nLineDistance; bool m_bOOXML; + bool m_aFilledLines[BORDER_COUNT]; ::com::sun::star::table::BorderLine m_aBorderLines[BORDER_COUNT]; public: diff --git a/writerfilter/source/dmapper/CellColorHandler.cxx b/writerfilter/source/dmapper/CellColorHandler.cxx index 508893888255..2e1e9d6d06b4 100644 --- a/writerfilter/source/dmapper/CellColorHandler.cxx +++ b/writerfilter/source/dmapper/CellColorHandler.cxx @@ -110,6 +110,11 @@ void CellColorHandler::attribute(Id rName, Value & rVal) // } // } // break; + case NS_ooxml::LN_CT_Shd_themeFill: + case NS_ooxml::LN_CT_Shd_themeFillTint: + case NS_ooxml::LN_CT_Shd_themeFillShade: + // ignored + break; default: OSL_ENSURE( false, "unknown attribute"); } diff --git a/writerfilter/source/dmapper/ConversionHelper.cxx b/writerfilter/source/dmapper/ConversionHelper.cxx index 43d805b162ac..efb7bc710338 100644 --- a/writerfilter/source/dmapper/ConversionHelper.cxx +++ b/writerfilter/source/dmapper/ConversionHelper.cxx @@ -275,6 +275,10 @@ void MakeBorderLine( sal_Int32 nLineThickness, sal_Int32 nLineType, case 21: eCodeIdx = double1;// 60 Twips for us break; + case 0: + case 255: + eCodeIdx = none; + break; default: eCodeIdx = single0; break; @@ -305,7 +309,8 @@ void MakeBorderLine( sal_Int32 nLineThickness, sal_Int32 nLineType, /*13*/ { DOUBLE_LINE7_OUT, DOUBLE_LINE7_IN, DOUBLE_LINE7_DIST }, /*14*/ { DOUBLE_LINE8_OUT, DOUBLE_LINE8_IN, DOUBLE_LINE8_DIST }, /*15*/ { DOUBLE_LINE9_OUT, DOUBLE_LINE9_IN, DOUBLE_LINE9_DIST }, - /*16*/ { DOUBLE_LINE10_OUT,DOUBLE_LINE10_IN,DOUBLE_LINE10_DIST} + /*16*/ { DOUBLE_LINE10_OUT,DOUBLE_LINE10_IN,DOUBLE_LINE10_DIST}, + /*17*/ { 0, 0, 0 } }; rToFill.Color = nLineColor; diff --git a/writerfilter/source/dmapper/DomainMapper.cxx b/writerfilter/source/dmapper/DomainMapper.cxx index d61cf5024b99..dbf9a33f067b 100644 --- a/writerfilter/source/dmapper/DomainMapper.cxx +++ b/writerfilter/source/dmapper/DomainMapper.cxx @@ -28,6 +28,8 @@ * for a copy of the LGPLv3 License. * ************************************************************************/ +#include "PageBordersHandler.hxx" + #include #include #include @@ -177,6 +179,10 @@ DomainMapper::~DomainMapper() uno::Reference< document::XEventBroadcaster > xBroadcaster(xIndexesSupplier, uno::UNO_QUERY); xBroadcaster->addEventListener(uno::Reference< document::XEventListener >(new ModelEventListener)); } + + + // Apply the document settings after everything else + m_pImpl->GetSettingsTable()->ApplyProperties( m_pImpl->GetTextDocument( ) ); } catch( const uno::Exception& rEx ) { @@ -552,8 +558,8 @@ void DomainMapper::attribute(Id nName, Value & val) //if the style is a user defined style then it must have an ISTD - built-in styles might not have it StyleSheetTablePtr pStyleSheets = m_pImpl->GetStyleSheetTable(); ::rtl::OUString sValue = ::rtl::OUString::valueOf(nIntValue, 16); - const StyleSheetEntry* pEntry = pStyleSheets->FindStyleSheetByISTD(sValue); - if(pEntry) + const StyleSheetEntryPtr pEntry = pStyleSheets->FindStyleSheetByISTD(sValue); + if( pEntry.get( ) ) { bool bParaStyle = (pEntry->nStyleTypeCode == STYLE_TYPE_PARA); if(bParaStyle) @@ -1882,12 +1888,12 @@ void DomainMapper::attribute(Id nName, Value & val) /* WRITERFILTERSTATUS: done: 80, planned: 0.5, spent: 0.2 */ //TODO: autospacing depends on some document property (called fDontUseHTMLAutoSpacing in old ww8 filter) 100 or 280 twip //and should be set to 0 on start of page - m_pImpl->GetTopContext()->Insert( PROP_TOP_MARGIN, false, uno::makeAny( AUTO_PARA_SPACING ) ); + m_pImpl->GetTopContext()->Insert( PROP_PARA_TOP_MARGIN, false, uno::makeAny( AUTO_PARA_SPACING ) ); break; case NS_ooxml::LN_CT_Spacing_afterAutospacing: /* WRITERFILTERSTATUS: done: 80, planned: 0.5, spent: 0.2 */ //TODO: autospacing depends on some document property (called fDontUseHTMLAutoSpacing in old ww8 filter) 100 or 280 twip - m_pImpl->GetTopContext()->Insert( PROP_BOTTOM_MARGIN, false, uno::makeAny( AUTO_PARA_SPACING ) ); + m_pImpl->GetTopContext()->Insert( PROP_PARA_BOTTOM_MARGIN, false, uno::makeAny( AUTO_PARA_SPACING ) ); break; case NS_ooxml::LN_CT_SmartTagRun_uri: case NS_ooxml::LN_CT_SmartTagRun_element: @@ -1926,13 +1932,6 @@ void DomainMapper::attribute(Id nName, Value & val) //afterwards the adding of the binary data. m_pImpl->GetGraphicImport( IMPORT_AS_DETECTED_INLINE )->attribute(nName, val); m_pImpl->ImportGraphic( val.getProperties(), IMPORT_AS_DETECTED_INLINE ); - if( m_pImpl->IsInShapeContext() ) - { - //imported text from temporary shape needs to be copied to the real shape - uno::Reference< drawing::XShape > xShape; - val.getAny() >>= xShape; - m_pImpl->CopyTemporaryShapeText( xShape ); - } } break; case NS_ooxml::LN_CT_FramePr_dropCap: @@ -2090,19 +2089,12 @@ void DomainMapper::attribute(Id nName, Value & val) break; case NS_ooxml::LN_CT_Markup_id: /* WRITERFILTERSTATUS: done: 100, planned: 0.5, spent: 0 */ - m_pImpl->SetCurrentRedlineId( sStringValue ); + m_pImpl->SetCurrentRedlineId( nIntValue ); break; case NS_ooxml::LN_token: /* WRITERFILTERSTATUS: done: 100, planned: 0.5, spent: 0 */ m_pImpl->SetCurrentRedlineToken( nIntValue ); break; - case NS_ooxml::LN_mark_shape: - /* WRITERFILTERSTATUS: done: 100, planned: 0.5, spent: 0 */ - if( nIntValue ) - m_pImpl->PopShapeContext(); - else - m_pImpl->PushShapeContext(); - break; case NS_ooxml::LN_CT_LineNumber_countBy: /* WRITERFILTERSTATUS: done: 0, planned: 0.5, spent: 0 */ case NS_ooxml::LN_CT_LineNumber_restart: @@ -2144,6 +2136,9 @@ void DomainMapper::attribute(Id nName, Value & val) case NS_ooxml::LN_CT_Color_themeShade: //unsupported break; + case NS_ooxml::LN_endtrackchange: + m_pImpl->RemoveCurrentRedline( ); + break; default: { #if OSL_DEBUG_LEVEL > 0 @@ -2625,6 +2620,15 @@ void DomainMapper::sprm( Sprm& rSprm, PropertyMapPtr rContext, SprmType eSprmTyp break; // sprmPPropRMark case NS_sprm::LN_POutLvl: /* WRITERFILTERSTATUS: done: 0, planned: 2, spent: 0 */ + { + if( m_pImpl->IsStyleSheetImport() ) + { + sal_Int16 nLvl = static_cast< sal_Int16 >( nIntValue ); + + StyleSheetPropertyMap* pStyleSheetPropertyMap = dynamic_cast< StyleSheetPropertyMap* >( rContext.get() ); + pStyleSheetPropertyMap->SetOutlineLevel( nLvl ); + } + } break; // sprmPOutLvl case NS_sprm::LN_PFBiDi: /* WRITERFILTERSTATUS: done: 0, planned: 2, spent: 0 */ @@ -3877,6 +3881,20 @@ void DomainMapper::sprm( Sprm& rSprm, PropertyMapPtr rContext, SprmType eSprmTyp } } break; + case NS_ooxml::LN_EG_SectPrContents_pgBorders: + { + writerfilter::Reference::Pointer_t pProperties = rSprm.getProps(); + if( pProperties.get( ) && pSectionContext ) + { + PageBordersHandlerPtr pHandler( new PageBordersHandler ); + pProperties->resolve( *pHandler ); + + // Set the borders to the context and apply them to the styles + pHandler->SetBorders( pSectionContext ); + pSectionContext->SetBorderParams( pHandler->GetDisplayOffset( ) ); + } + } + break; case NS_ooxml::LN_CT_PPrBase_pStyle: { @@ -3886,20 +3904,31 @@ void DomainMapper::sprm( Sprm& rSprm, PropertyMapPtr rContext, SprmType eSprmTyp const ::rtl::OUString sConvertedStyleName = pStyleTable->ConvertStyleName( sStringValue, true ); if (m_pImpl->GetTopContext() && m_pImpl->GetTopContextType() != CONTEXT_SECTION) m_pImpl->GetTopContext()->Insert( PROP_PARA_STYLE_NAME, true, uno::makeAny( sConvertedStyleName )); - const StyleSheetEntry* pEntry = pStyleTable->FindStyleSheetByISTD(sStringValue); + const StyleSheetEntryPtr pEntry = pStyleTable->FindStyleSheetByISTD(sStringValue); //apply numbering to paragraph if it was set at the style - OSL_ENSURE( pEntry, "no style sheet found" ); + OSL_ENSURE( pEntry.get(), "no style sheet found" ); const StyleSheetPropertyMap* pStyleSheetProperties = dynamic_cast(pEntry ? pEntry->pProperties.get() : 0); + if( pStyleSheetProperties && pStyleSheetProperties->GetListId() >= 0 ) - rContext->Insert( PROP_NUMBERING_RULES, true, uno::makeAny(m_pImpl->GetListTable()->GetNumberingRules(pStyleSheetProperties->GetListId())), false); + rContext->Insert( PROP_NUMBERING_STYLE_NAME, true, uno::makeAny( + m_pImpl->GetListTable( )->GetStyleName( pStyleSheetProperties->GetListId( ) ) ), false); + if( pStyleSheetProperties && pStyleSheetProperties->GetListLevel() >= 0 ) rContext->Insert( PROP_NUMBERING_LEVEL, true, uno::makeAny(pStyleSheetProperties->GetListLevel()), false); } break; case NS_ooxml::LN_EG_RPrBase_rStyle: /* WRITERFILTERSTATUS: done: 100, planned: 0.5, spent: 0 */ - if (m_pImpl->GetTopContext()) - m_pImpl->GetTopContext()->Insert( PROP_CHAR_STYLE_NAME, true, uno::makeAny( m_pImpl->GetStyleSheetTable()->ConvertStyleName( sStringValue, true ))); + { + rtl::OUString sConvertedName( m_pImpl->GetStyleSheetTable()->ConvertStyleName( sStringValue, true ) ); + // First check if the style exists in the document. + StyleSheetEntryPtr pEntry = m_pImpl->GetStyleSheetTable( )->FindStyleSheetByStyleName( sConvertedName ); + bool bExists = pEntry.get( ) && ( pEntry->nStyleTypeCode == STYLE_TYPE_CHAR ); + + // Add the property if the style exists + if ( bExists && m_pImpl->GetTopContext() ) + m_pImpl->GetTopContext()->Insert( PROP_CHAR_STYLE_NAME, true, uno::makeAny( sConvertedName ) ); + } break; case NS_ooxml::LN_CT_TblPrBase_tblCellMar: //cell margins /* WRITERFILTERSTATUS: done: 100, planned: 0.5, spent: 0 */ @@ -4036,16 +4065,16 @@ void DomainMapper::sprm( Sprm& rSprm, PropertyMapPtr rContext, SprmType eSprmTyp } } break; + case NS_ooxml::LN_paratrackchange: + m_pImpl->StartParaChange( ); case NS_ooxml::LN_trackchange: /* WRITERFILTERSTATUS: done: 100, planned: 5, spent: 0 */ case NS_ooxml::LN_EG_RPrContent_rPrChange: /* WRITERFILTERSTATUS: done: 100, planned: 5, spent: 0 */ { + m_pImpl->AddNewRedline( ); resolveSprmProps( rSprm ); // now the properties author, date and id should be available - ::rtl::OUString sAuthor = m_pImpl->GetCurrentRedlineAuthor(); - ::rtl::OUString sDate = m_pImpl->GetCurrentRedlineDate(); - ::rtl::OUString sId = m_pImpl->GetCurrentRedlineId(); sal_Int32 nToken = m_pImpl->GetCurrentRedlineToken(); switch( nToken & 0xffff ) { @@ -4054,6 +4083,7 @@ void DomainMapper::sprm( Sprm& rSprm, PropertyMapPtr rContext, SprmType eSprmTyp case ooxml::OOXML_del : break; default: OSL_ENSURE( false, "redline token other than mod, ins or del" ); } + m_pImpl->EndParaChange( ); } break; case NS_ooxml::LN_CT_RPrChange_rPr: @@ -4062,15 +4092,21 @@ void DomainMapper::sprm( Sprm& rSprm, PropertyMapPtr rContext, SprmType eSprmTyp /* WRITERFILTERSTATUS: done: 0, planned: 4, spent: 0 */ case NS_ooxml::LN_object: { +#if DEBUG + clog << "DomainMapper: LN_object" << endl; +#endif writerfilter::Reference::Pointer_t pProperties = rSprm.getProps(); - if( pProperties.get()) + if( pProperties.get( ) ) { OLEHandlerPtr pOLEHandler( new OLEHandler ); pProperties->resolve(*pOLEHandler); - ::rtl::OUString sStreamName = pOLEHandler->copyOLEOStream( m_pImpl->GetTextDocument() ); - if(sStreamName.getLength()) + if ( pOLEHandler->isOLEObject( ) ) { - m_pImpl->appendOLE( sStreamName, pOLEHandler ); + ::rtl::OUString sStreamName = pOLEHandler->copyOLEOStream( m_pImpl->GetTextDocument() ); + if( sStreamName.getLength() ) + { + m_pImpl->appendOLE( sStreamName, pOLEHandler ); + } } } } @@ -4099,7 +4135,6 @@ void DomainMapper::sprm( Sprm& rSprm, PropertyMapPtr rContext, SprmType eSprmTyp case NS_ooxml::LN_CT_Lvl_pStyle: //TODO: numbering style should apply current numbering level - not yet supported break; - default: { #if OSL_DEBUG_LEVEL > 0 @@ -4225,19 +4260,36 @@ void DomainMapper::endParagraphGroup() #endif } +void DomainMapper::startShape( uno::Reference< drawing::XShape > xShape ) +{ + m_pImpl->PushShapeContext( xShape ); +} + +void DomainMapper::endShape( ) +{ + m_pImpl->PopShapeContext( ); +} + /*-- 13.06.2007 16:15:55--------------------------------------------------- -----------------------------------------------------------------------*/ -void DomainMapper::PushStyleSheetProperties( PropertyMapPtr pStyleProperties ) +void DomainMapper::PushStyleSheetProperties( PropertyMapPtr pStyleProperties, bool bAffectTableMngr ) { m_pImpl->PushStyleProperties( pStyleProperties ); + if ( bAffectTableMngr ) + m_pImpl->getTableManager( ).SetStyleProperties( pStyleProperties ); } /*-- 13.06.2007 16:15:55--------------------------------------------------- -----------------------------------------------------------------------*/ -void DomainMapper::PopStyleSheetProperties() +void DomainMapper::PopStyleSheetProperties( bool bAffectTableMngr ) { m_pImpl->PopProperties( CONTEXT_STYLESHEET ); + if ( bAffectTableMngr ) + { + PropertyMapPtr emptyPtr; + m_pImpl->getTableManager( ).SetStyleProperties( emptyPtr ); + } } /*-- 28.01.2008 14:52:33--------------------------------------------------- @@ -4484,10 +4536,13 @@ void DomainMapper::table(Id name, writerfilter::Reference::Pointer_t ref) break; case NS_ooxml::LN_NUMBERING: case NS_rtf::LN_LISTTABLE: - /* WRITERFILTERSTATUS: done: 0, planned: 0.5, spent: 0 */ + { + /* WRITERFILTERSTATUS: done: 0, planned: 0.5, spent: 0 */ - //the same for list tables - ref->resolve( *m_pImpl->GetListTable() ); + //the same for list tables + ref->resolve( *m_pImpl->GetListTable() ); + m_pImpl->GetListTable( )->CreateNumberingRules( ); + } break; case NS_rtf::LN_LFOTABLE: /* WRITERFILTERSTATUS: done: 0, planned: 0.5, spent: 0 */ @@ -4497,6 +4552,9 @@ void DomainMapper::table(Id name, writerfilter::Reference
::Pointer_t ref) case NS_ooxml::LN_THEMETABLE: ref->resolve ( *m_pImpl->GetThemeTable() ); break; + case NS_ooxml::LN_SETTINGS: + ref->resolve( *m_pImpl->GetSettingsTable( ) ); + break; default: OSL_ENSURE( false, "which table is to be filled here?"); } diff --git a/writerfilter/source/dmapper/DomainMapperTableHandler.cxx b/writerfilter/source/dmapper/DomainMapperTableHandler.cxx index 4ae6af8c4e67..20fc7755358b 100644 --- a/writerfilter/source/dmapper/DomainMapperTableHandler.cxx +++ b/writerfilter/source/dmapper/DomainMapperTableHandler.cxx @@ -68,7 +68,22 @@ static void lcl_printProperties( PropertyMapPtr pProps ) { rtl::OUString aOUStr = rPropSupplier.GetName( aMapIter->first.eId ); rtl::OString aOStr(aOUStr.getStr(), aOUStr.getLength(), RTL_TEXTENCODING_ASCII_US ); - clog << aOStr.getStr() << '-'; + clog << aOStr.getStr(); + + table::BorderLine aLine; + sal_Int32 nColor; + if ( aMapIter->second >>= aLine ) + { + clog << ": BorderLine ( Color: " << aLine.Color; + clog << ", Inner: " << aLine.InnerLineWidth; + clog << ", Outer: " << aLine.OuterLineWidth << ") "; + } + else if ( aMapIter->second >>= nColor ) + { + clog << ": Color ( " << nColor << " ) "; + } + + clog << " - "; } clog << endl; } @@ -106,21 +121,121 @@ void DomainMapperTableHandler::startTable(unsigned int nRows, /*-- 22.02.2008 10:18:37--------------------------------------------------- -----------------------------------------------------------------------*/ -PropertyMapPtr lcl_SearchParentStyleSheetAndMergeProperties(const StyleSheetEntry* pStyleSheet, StyleSheetTablePtr pStyleSheetTable) +PropertyMapPtr lcl_SearchParentStyleSheetAndMergeProperties(const StyleSheetEntryPtr pStyleSheet, StyleSheetTablePtr pStyleSheetTable) { PropertyMapPtr pRet; if( pStyleSheet->sBaseStyleIdentifier.getLength()) { - const StyleSheetEntry* pParentStyleSheet = pStyleSheetTable->FindStyleSheetByISTD( pStyleSheet->sBaseStyleIdentifier ); + const StyleSheetEntryPtr pParentStyleSheet = pStyleSheetTable->FindStyleSheetByISTD( pStyleSheet->sBaseStyleIdentifier ); pRet = lcl_SearchParentStyleSheetAndMergeProperties( pParentStyleSheet, pStyleSheetTable ); } else { pRet.reset( new PropertyMap ); } + pRet->insert( pStyleSheet->pProperties, true ); return pRet; } + +void lcl_mergeBorder( PropertyIds nId, PropertyMapPtr pOrig, PropertyMapPtr pDest ) +{ + PropertyDefinition aDef( nId, false ); + PropertyMap::iterator pOrigIt = pOrig->find( aDef ); + + if ( pOrigIt != pOrig->end( ) ) + { + pDest->Insert( nId, false, pOrigIt->second, false ); + } +} + +void lcl_computeCellBorders( PropertyMapPtr pTableBorders, PropertyMapPtr pCellProps, + sal_Int32 nCell, sal_Int32 nRow, bool bIsEndCol, bool bIsEndRow ) +{ + PropertyDefinition aVertPDef( META_PROP_VERTICAL_BORDER, false ); + PropertyDefinition aHorizPDef( META_PROP_HORIZONTAL_BORDER, false ); + + PropertyMap::iterator aVerticalIter = pCellProps->find( aVertPDef ); + PropertyMap::iterator aHorizontalIter = pCellProps->find( aHorizPDef ); + + // Handle the vertical and horizontal borders + bool bHasVert = ( aVerticalIter != pCellProps->end( ) ); + uno::Any aVertProp; + if ( !bHasVert ) + { + aVerticalIter = pTableBorders->find( aVertPDef ); + bHasVert = ( aVerticalIter != pTableBorders->end( ) ); + if ( bHasVert ) + aVertProp = aVerticalIter->second; + } + else + { + aVertProp = aVerticalIter->second; + pCellProps->erase( aVerticalIter ); + } + + bool bHasHoriz = ( aHorizontalIter != pCellProps->end( ) ); + uno::Any aHorizProp; + if ( !bHasHoriz ) + { + aHorizontalIter = pTableBorders->find( aHorizPDef ); + bHasHoriz = ( aHorizontalIter != pTableBorders->end( ) ); + if ( bHasHoriz ) + aHorizProp = aHorizontalIter->second; + } + else + { + aHorizProp = aHorizontalIter->second; + pCellProps->erase( aHorizontalIter ); + } + + if ( nCell == 0 ) + { + lcl_mergeBorder( PROP_LEFT_BORDER, pTableBorders, pCellProps ); + if ( bHasVert ) + pCellProps->Insert( PROP_RIGHT_BORDER, false, aVertProp, false ); + } + + if ( bIsEndCol ) + { + lcl_mergeBorder( PROP_RIGHT_BORDER, pTableBorders, pCellProps ); + if ( bHasVert ) + pCellProps->Insert( PROP_LEFT_BORDER, false, aVertProp, false ); + } + + if ( nCell > 0 && !bIsEndCol ) + { + if ( bHasVert ) + { + pCellProps->Insert( PROP_RIGHT_BORDER, false, aVertProp, false ); + pCellProps->Insert( PROP_LEFT_BORDER, false, aVertProp, false ); + } + } + + if ( nRow == 0 ) + { + lcl_mergeBorder( PROP_TOP_BORDER, pTableBorders, pCellProps ); + if ( bHasHoriz ) + pCellProps->Insert( PROP_BOTTOM_BORDER, false, aHorizProp, false ); + } + + if ( bIsEndRow ) + { + lcl_mergeBorder( PROP_BOTTOM_BORDER, pTableBorders, pCellProps ); + if ( bHasHoriz ) + pCellProps->Insert( PROP_TOP_BORDER, false, aHorizProp, false ); + } + + if ( nRow > 0 && !bIsEndRow ) + { + if ( bHasHoriz ) + { + pCellProps->Insert( PROP_TOP_BORDER, false, aHorizProp, false ); + pCellProps->Insert( PROP_BOTTOM_BORDER, false, aHorizProp, false ); + } + } +} + void DomainMapperTableHandler::endTable() { #if OSL_DEBUG_LEVEL > 1 @@ -140,7 +255,7 @@ void DomainMapperTableHandler::endTable() if( nTblPropSize ) { const beans::PropertyValues aDebugTbl = m_aTableProperties->GetPropertyValues(); - for( sal_Int32 nDebug = 0; nDebug < nTblPropSize; ++nDebug) + for( sal_uInt32 nDebug = 0; nDebug < nTblPropSize; ++nDebug) { const ::rtl::OUString sName = aDebugTbl[nDebug].Name; sNames += sName; @@ -148,6 +263,7 @@ void DomainMapperTableHandler::endTable() } m_aTableProperties->Invalidate(); sNames += ::rtl::OUString(' '); + clog << "Props: " << rtl::OUStringToOString( sNames, RTL_TEXTENCODING_UTF8 ).getStr( ) << endl; } } #endif @@ -156,6 +272,13 @@ void DomainMapperTableHandler::endTable() sal_Int32 nLeftBorderDistance, nRightBorderDistance, nTopBorderDistance, nBottomBorderDistance; nLeftBorderDistance = nRightBorderDistance = DEF_BORDER_DIST; nTopBorderDistance = nBottomBorderDistance = 0; + + PropertyMapPtr pTableDefaults( new PropertyMap ); + PropertyMapPtr pTableBorders( new PropertyMap ); + + // will receive the table style if any + TableStyleSheetEntry* pTableStyle = NULL; + if( m_aTableProperties.get() ) { //create properties from the table attributes @@ -169,36 +292,32 @@ void DomainMapperTableHandler::endTable() m_aTableProperties->find( PropertyDefinition( META_PROP_TABLE_STYLE_NAME, false ) ); if(aTableStyleIter != m_aTableProperties->end()) { - //TODO: apply table style properties recursively + // Apply table style properties recursively ::rtl::OUString sTableStyleName; aTableStyleIter->second >>= sTableStyleName; StyleSheetTablePtr pStyleSheetTable = m_rDMapper_Impl.GetStyleSheetTable(); - const StyleSheetEntry* pStyleSheet = pStyleSheetTable->FindStyleSheetByISTD( sTableStyleName ); + const StyleSheetEntryPtr pStyleSheet = pStyleSheetTable->FindStyleSheetByISTD( sTableStyleName ); + pTableStyle = static_cast( pStyleSheet.get( ) ); + m_aTableProperties->erase( aTableStyleIter ); + if( pStyleSheet ) { - PropertyMapPtr pMergedProperties = lcl_SearchParentStyleSheetAndMergeProperties(pStyleSheet, pStyleSheetTable); - - PropertyMap::const_iterator aStylePropIter = - pMergedProperties->find(PropertyDefinition( META_PROP_CELL_MAR_TOP, false ) ); - if( aStylePropIter != pMergedProperties->end() ) - aStylePropIter->second >>= nTopBorderDistance; + // First get the style properties, then the table ones + PropertyMapPtr pTableProps( m_aTableProperties ); + TablePropertyMapPtr pEmptyProps( new TablePropertyMap ); - aStylePropIter = pMergedProperties->find(PropertyDefinition( META_PROP_CELL_MAR_BOTTOM, false ) ); - if( aStylePropIter != pMergedProperties->end() ) - aStylePropIter->second >>= nBottomBorderDistance; + m_aTableProperties = pEmptyProps; - aStylePropIter = pMergedProperties->find(PropertyDefinition( META_PROP_CELL_MAR_LEFT, false ) ); - if( aStylePropIter != pMergedProperties->end() ) - aStylePropIter->second >>= nLeftBorderDistance; - - aStylePropIter = pMergedProperties->find(PropertyDefinition( META_PROP_CELL_MAR_RIGHT, false ) ); - if( aStylePropIter != pMergedProperties->end() ) - aStylePropIter->second >>= nRightBorderDistance; + PropertyMapPtr pMergedProperties = lcl_SearchParentStyleSheetAndMergeProperties(pStyleSheet, pStyleSheetTable); + m_aTableProperties->insert( pMergedProperties ); + m_aTableProperties->insert( pTableProps ); } - m_aTableProperties->erase( aTableStyleIter ); } + // Set the table default attributes for the cells + pTableDefaults->insert( m_aTableProperties ); + m_aTableProperties->getValue( TablePropertyMap::GAP_HALF, nGapHalf ); m_aTableProperties->getValue( TablePropertyMap::LEFT_MARGIN, nLeftMargin ); @@ -228,6 +347,11 @@ void DomainMapperTableHandler::endTable() aTblBorderIter->second >>= aTableBorder.TopLine; aTableBorder.IsTopLineValid = true; m_aTableProperties->erase( aTblBorderIter ); + + pTableBorders->Insert( PROP_TOP_BORDER, false, uno::makeAny( aTableBorder.TopLine ) ); + PropertyMap::iterator pIt = pTableDefaults->find( PropertyDefinition( PROP_TOP_BORDER, false ) ); + if ( pIt != pTableDefaults->end( ) ) + pTableDefaults->erase( pIt ); } aTblBorderIter = m_aTableProperties->find( PropertyDefinition(PROP_BOTTOM_BORDER, false) ); if( aTblBorderIter != m_aTableProperties->end() ) @@ -235,6 +359,11 @@ void DomainMapperTableHandler::endTable() aTblBorderIter->second >>= aTableBorder.BottomLine; aTableBorder.IsBottomLineValid = true; m_aTableProperties->erase( aTblBorderIter ); + + pTableBorders->Insert( PROP_BOTTOM_BORDER, false, uno::makeAny( aTableBorder.BottomLine ) ); + PropertyMap::iterator pIt = pTableDefaults->find( PropertyDefinition( PROP_BOTTOM_BORDER, false ) ); + if ( pIt != pTableDefaults->end( ) ) + pTableDefaults->erase( pIt ); } aTblBorderIter = m_aTableProperties->find( PropertyDefinition(PROP_LEFT_BORDER, false) ); if( aTblBorderIter != m_aTableProperties->end() ) @@ -242,6 +371,11 @@ void DomainMapperTableHandler::endTable() aTblBorderIter->second >>= aTableBorder.LeftLine; aTableBorder.IsLeftLineValid = true; m_aTableProperties->erase( aTblBorderIter ); + + pTableBorders->Insert( PROP_LEFT_BORDER, false, uno::makeAny( aTableBorder.LeftLine ) ); + PropertyMap::iterator pIt = pTableDefaults->find( PropertyDefinition( PROP_LEFT_BORDER, false ) ); + if ( pIt != pTableDefaults->end( ) ) + pTableDefaults->erase( pIt ); } aTblBorderIter = m_aTableProperties->find( PropertyDefinition(PROP_RIGHT_BORDER, false) ); if( aTblBorderIter != m_aTableProperties->end() ) @@ -249,6 +383,11 @@ void DomainMapperTableHandler::endTable() aTblBorderIter->second >>= aTableBorder.RightLine; aTableBorder.IsRightLineValid = true; m_aTableProperties->erase( aTblBorderIter ); + + pTableBorders->Insert( PROP_RIGHT_BORDER, false, uno::makeAny( aTableBorder.RightLine ) ); + PropertyMap::iterator pIt = pTableDefaults->find( PropertyDefinition( PROP_RIGHT_BORDER, false ) ); + if ( pIt != pTableDefaults->end( ) ) + pTableDefaults->erase( pIt ); } aTblBorderIter = m_aTableProperties->find( PropertyDefinition(META_PROP_HORIZONTAL_BORDER, false) ); if( aTblBorderIter != m_aTableProperties->end() ) @@ -256,6 +395,11 @@ void DomainMapperTableHandler::endTable() aTblBorderIter->second >>= aTableBorder.HorizontalLine; aTableBorder.IsHorizontalLineValid = true; m_aTableProperties->erase( aTblBorderIter ); + + pTableBorders->Insert( META_PROP_HORIZONTAL_BORDER, false, uno::makeAny( aTableBorder.HorizontalLine ) ); + PropertyMap::iterator pIt = pTableDefaults->find( PropertyDefinition( META_PROP_HORIZONTAL_BORDER, false ) ); + if ( pIt != pTableDefaults->end( ) ) + pTableDefaults->erase( pIt ); } aTblBorderIter = m_aTableProperties->find( PropertyDefinition(META_PROP_VERTICAL_BORDER, false) ); if( aTblBorderIter != m_aTableProperties->end() ) @@ -263,6 +407,11 @@ void DomainMapperTableHandler::endTable() aTblBorderIter->second >>= aTableBorder.VerticalLine; aTableBorder.IsVerticalLineValid = true; m_aTableProperties->erase( aTblBorderIter ); + + pTableBorders->Insert( META_PROP_VERTICAL_BORDER, false, uno::makeAny( aTableBorder.VerticalLine ) ); + PropertyMap::iterator pIt = pTableDefaults->find( PropertyDefinition( META_PROP_VERTICAL_BORDER, false ) ); + if ( pIt != pTableDefaults->end( ) ) + pTableDefaults->erase( pIt ); } aTableBorder.Distance = 0; aTableBorder.IsDistanceValid = false; @@ -285,6 +434,13 @@ void DomainMapperTableHandler::endTable() if( aRepeatIter == m_aTableProperties->end() ) m_aTableProperties->Insert( PROP_HEADER_ROW_COUNT, false, uno::makeAny( (sal_Int32)0 )); + // Remove the PROP_HEADER_ROW_COUNT from the table default to avoid + // propagating it to the cells + PropertyMap::iterator aDefaultRepeatIt = + pTableDefaults->find( PropertyDefinition( PROP_HEADER_ROW_COUNT, false ) ); + if ( aDefaultRepeatIt != pTableDefaults->end( ) ) + pTableDefaults->erase( aDefaultRepeatIt ); + aTableProperties = m_aTableProperties->GetPropertyValues(); } @@ -294,6 +450,7 @@ void DomainMapperTableHandler::endTable() // std::vector< std::vector > m_aCellProperties PropertyMapVector2::const_iterator aRowOfCellsIterator = m_aCellProperties.begin(); PropertyMapVector2::const_iterator aRowOfCellsIteratorEnd = m_aCellProperties.end(); + PropertyMapVector2::const_iterator aLastRowIterator = m_aCellProperties.end() - 1; sal_Int32 nRow = 0; //it's a uno::Sequence< beans::PropertyValues >* @@ -303,67 +460,72 @@ void DomainMapperTableHandler::endTable() //aRowOfCellsIterator points to a vector of PropertyMapPtr PropertyMapVector1::const_iterator aCellIterator = aRowOfCellsIterator->begin(); PropertyMapVector1::const_iterator aCellIteratorEnd = aRowOfCellsIterator->end(); + PropertyMapVector1::const_iterator aLastCellIterator = aRowOfCellsIterator->end() - 1; - //contains the default border of the line - PropertyMapPtr aCellBorders( new PropertyMap ); + // Get the row style properties + sal_Int32 nRowStyleMask = sal_Int32( 0 ); + PropertyMapPtr pRowProps = m_aRowProperties[nRow]; + if ( pRowProps.get( ) ) + { + PropertyMap::iterator pTcCnfStyleIt = pRowProps->find( PropertyDefinition( PROP_CNF_STYLE, true ) ); + if ( pTcCnfStyleIt != pRowProps->end( ) ) + { + if ( pTableStyle ) + { + rtl::OUString sMask; + pTcCnfStyleIt->second >>= sMask; + nRowStyleMask = sMask.toInt32( 2 ); + } + pRowProps->erase( pTcCnfStyleIt ); + } + } sal_Int32 nCell = 0; pCellProperties[nRow].realloc( aRowOfCellsIterator->size() ); beans::PropertyValues* pSingleCellProperties = pCellProperties[nRow].getArray(); while( aCellIterator != aCellIteratorEnd ) { - //TODO: aCellIterator contains HorizontalBorder and VerticalBorder - // they have to be removed, depending on the position of the cell they - // have to be moved to BottomBorder/RightBorder respectively + PropertyMapPtr pAllCellProps( new PropertyMap ); + + bool bIsEndCol = aCellIterator == aLastCellIterator; + bool bIsEndRow = aRowOfCellsIterator == aLastRowIterator; + //aCellIterator points to a PropertyMapPtr; if( aCellIterator->get() ) { - if( nCell && aCellBorders->size() ) + if ( pTableDefaults->size( ) ) + pAllCellProps->insert( pTableDefaults ); + + // Fill the cell properties with the ones of the style + sal_Int32 nCellStyleMask = 0; + const PropertyMap::iterator aCnfStyleIter = + aCellIterator->get()->find( PropertyDefinition( PROP_CNF_STYLE, false ) ); + if ( aCnfStyleIter != aCellIterator->get( )->end( ) ) { - //now apply the default border - //TODO: This overwrites the existing values! - aCellIterator->get()->insert( aCellBorders, false ); + if ( pTableStyle ) { + rtl::OUString sMask; + aCnfStyleIter->second >>= sMask; + nCellStyleMask = sMask.toInt32( 2 ); + } + aCellIterator->get( )->erase( aCnfStyleIter ); } - - const PropertyMap::iterator aVerticalIter = - aCellIterator->get()->find( PropertyDefinition(META_PROP_VERTICAL_BORDER, false) ); - const PropertyMap::iterator aHorizontalIter = - aCellIterator->get()->find( PropertyDefinition(META_PROP_HORIZONTAL_BORDER, false) ); - const PropertyMap::const_iterator aRightIter = - aCellIterator->get()->find( PropertyDefinition(PROP_RIGHT_BORDER, false) ); - const PropertyMap::const_iterator aBottomIter = - aCellIterator->get()->find( PropertyDefinition(PROP_BOTTOM_BORDER, false) ); - - if( aVerticalIter != aCellIterator->get()->end()) + if ( pTableStyle ) { - if( !nCell ) - aCellBorders->insert(*aVerticalIter); - aCellIterator->get()->erase( aVerticalIter ); - } - if( aHorizontalIter != aCellIterator->get()->end()) - { - if( !nCell ) - aCellBorders->insert(*aHorizontalIter); - aCellIterator->get()->erase( aHorizontalIter ); - } - //fill the additional borders into the line default border - if( !nCell ) - { - const PropertyMap::const_iterator aLeftIter = - aCellIterator->get()->find( PropertyDefinition(PROP_RIGHT_BORDER, false) ); - if(aLeftIter != aCellIterator->get()->end()) - aCellBorders->insert(*aLeftIter); - if(aRightIter != aCellIterator->get()->end()) - aCellBorders->insert(*aRightIter); - const PropertyMap::const_iterator aTopIter = - aCellIterator->get()->find( PropertyDefinition(PROP_TOP_BORDER, false) ); - if(aTopIter != aCellIterator->get()->end()) - aCellBorders->insert(*aTopIter); - if(aBottomIter != aCellIterator->get()->end()) - aCellBorders->insert(*aBottomIter); + PropertyMapPtr pStyleProps = pTableStyle->GetProperties( nCellStyleMask + nRowStyleMask ); + pAllCellProps->insert( pStyleProps ); } + // Then add the cell properties + pAllCellProps->insert( *aCellIterator ); + aCellIterator->get( )->swap( *pAllCellProps.get( ) ); + +#if DEBUG + clog << "Cell #" << nCell << ", Row #" << nRow << endl; +#endif + + lcl_computeCellBorders( pTableBorders, *aCellIterator, nCell, nRow, bIsEndCol, bIsEndRow ); + //now set the default left+right border distance TODO: there's an sprm containing the default distance! const PropertyMap::const_iterator aLeftDistanceIter = aCellIterator->get()->find( PropertyDefinition(PROP_LEFT_BORDER_DISTANCE, false) ); @@ -410,7 +572,7 @@ void DomainMapperTableHandler::endTable() sNames += sName; sNames += ::rtl::OUString('-'); } - sNames += ::rtl::OUString(' '); + sNames += ::rtl::OUString('\n'); } (void)sNames; } @@ -479,11 +641,15 @@ void DomainMapperTableHandler::endTable() (void) nCellPropertiesProperties; ++nCellPropertiesProperties; } + clog << "Converting table" << endl; #endif - m_xText->convertToTable(*m_pTableSeq, + + uno::Reference xTable = m_xText->convertToTable(*m_pTableSeq, aCellProperties, aRowProperties, aTableProperties); + + m_xTableRange = xTable->getAnchor( ); } catch (lang::IllegalArgumentException e) { @@ -491,7 +657,14 @@ void DomainMapperTableHandler::endTable() clog << "failed to import table!" << endl; #endif } +#if OSL_DEBUG_LEVEL > 1 + catch ( uno::Exception e ) + { + clog << "Caught an other exception: " << rtl::OUStringToOString( e.Message, RTL_TEXTENCODING_UTF8 ).getStr( ) << endl; + } +#endif } + m_aTableProperties.reset(); m_aCellProperties.clear(); m_aRowProperties.clear(); @@ -529,7 +702,15 @@ void DomainMapperTableHandler::startCell(const Handle_t & start, TablePropertyMapPtr pProps ) { sal_uInt32 nRow = m_aRowProperties.size(); - m_aCellProperties[nRow - 1].push_back( pProps ); + if ( pProps.get( ) ) + m_aCellProperties[nRow - 1].push_back( pProps ); + else + { + // Adding an empty cell properties map to be able to get + // the table defaults properties + TablePropertyMapPtr pEmptyProps( new TablePropertyMap( ) ); + m_aCellProperties[nRow - 1].push_back( pEmptyProps ); + } #if OSL_DEBUG_LEVEL > 1 clog << ""; diff --git a/writerfilter/source/dmapper/DomainMapperTableHandler.hxx b/writerfilter/source/dmapper/DomainMapperTableHandler.hxx index 8847d628f506..971d75b32884 100644 --- a/writerfilter/source/dmapper/DomainMapperTableHandler.hxx +++ b/writerfilter/source/dmapper/DomainMapperTableHandler.hxx @@ -66,6 +66,8 @@ class DomainMapperTableHandler : public TableDataHandlerSetTableManager( this ); } /*-- 23.04.2007 14:57:49--------------------------------------------------- -----------------------------------------------------------------------*/ DomainMapperTableManager::~DomainMapperTableManager() { + if ( m_pTablePropsHandler ) + delete m_pTablePropsHandler, m_pTablePropsHandler = NULL; } /*-- 23.04.2007 15:25:37--------------------------------------------------- @@ -72,40 +76,18 @@ bool DomainMapperTableManager::sprm(Sprm & rSprm) { bool bRet = DomainMapperTableManager_Base_t::sprm(rSprm); if( !bRet ) + { + bRet = m_pTablePropsHandler->sprm( rSprm ); + } + + if ( !bRet ) { bRet = true; sal_uInt32 nSprmId = rSprm.getId(); Value::Pointer_t pValue = rSprm.getValue(); sal_Int32 nIntValue = ((pValue.get() != NULL) ? pValue->getInt() : 0); - /* WRITERFILTERSTATUS: table: table_sprmdata */ - switch( nSprmId ) + switch ( nSprmId ) { - /* WRITERFILTERSTATUS: done: 1, planned: 2, spent: 2 */ - case NS_ooxml::LN_CT_TrPrBase_jc: //90706 - /* WRITERFILTERSTATUS: done: 1, planned: 0.5, spent: 0.5 */ - case NS_ooxml::LN_CT_TblPrBase_jc: - /* WRITERFILTERSTATUS: done: 1, planned: 2, spent: 2 */ - case 0x5400: // sprmTJc - { - //table justification 0: left, 1: center, 2: right - sal_Int16 nOrient = ConversionHelper::convertTableJustification( nIntValue ); - TablePropertyMapPtr pTableMap( new TablePropertyMap ); - pTableMap->setValue( TablePropertyMap::HORI_ORIENT, nOrient ); - insertTableProps( pTableMap ); - } - break; - /* WRITERFILTERSTATUS: done: 0, planned: 2, spent: 0 */ - case 0x9601: // sprmTDxaLeft - break; - /* WRITERFILTERSTATUS: done: 1, planned: 2, spent: 0 */ - case 0x9602: // sprmTDxaGapHalf - { - //m_nGapHalf = ConversionHelper::convertTwipToMM100( nIntValue ); - TablePropertyMapPtr pPropMap( new TablePropertyMap ); - pPropMap->setValue( TablePropertyMap::GAP_HALF, ConversionHelper::convertTwipToMM100( nIntValue ) ); - insertTableProps(pPropMap); - } - break; /* WRITERFILTERSTATUS: done: 1, planned: 2, spent: 0 */ case 0xf661: //sprmTTRLeft left table indent /* WRITERFILTERSTATUS: done: 1, planned: 2, spent: 0 */ @@ -136,32 +118,6 @@ bool DomainMapperTableManager::sprm(Sprm & rSprm) } } break; - /* WRITERFILTERSTATUS: done: 1, planned: 2, spent: 2 */ - case NS_ooxml::LN_CT_TrPrBase_trHeight: //90703 - { - //contains unit and value - writerfilter::Reference::Pointer_t pProperties = rSprm.getProps(); - if( pProperties.get()) - { //contains attributes x2902 (LN_unit) and x17e2 (LN_trleft) - MeasureHandlerPtr pMeasureHandler( new MeasureHandler ); - pProperties->resolve(*pMeasureHandler); - TablePropertyMapPtr pPropMap( new TablePropertyMap ); - pPropMap->Insert( PROP_SIZE_TYPE, false, uno::makeAny( pMeasureHandler->GetRowHeightSizeType() )); - pPropMap->Insert( PROP_HEIGHT, false, uno::makeAny(pMeasureHandler->getMeasureValue() )); - insertRowProps(pPropMap); - } - } - break; - /* WRITERFILTERSTATUS: done: 1, planned: 2, spent: 0 */ - case 0x3403: // sprmTFCantSplit - case NS_sprm::LN_TCantSplit: // 0x3644 - { - //row can't break across pages if nIntValue == 1 - TablePropertyMapPtr pPropMap( new TablePropertyMap ); - pPropMap->Insert( PROP_IS_SPLIT_ALLOWED, false, uno::makeAny(sal_Bool( nIntValue == 1 ? sal_False : sal_True ) )); - insertRowProps(pPropMap); - } - break; /* WRITERFILTERSTATUS: done: 1, planned: 2, spent: 0 */ case 0x3404:// sprmTTableHeader case NS_ooxml::LN_CT_TrPrBase_tblHeader: //90704 @@ -178,23 +134,6 @@ bool DomainMapperTableManager::sprm(Sprm & rSprm) m_nHeaderRepeat = -1; break; /* WRITERFILTERSTATUS: done: 1, planned: 2, spent: 0 */ - case 0x9407: // sprmTDyaRowHeight - { - // table row height - negative values indicate 'exact height' - positive 'at least' - TablePropertyMapPtr pPropMap( new TablePropertyMap ); - bool bMinHeight = true; - sal_Int16 nHeight = static_cast( nIntValue ); - if( nHeight < 0 ) - { - bMinHeight = false; - nHeight *= -1; - } - pPropMap->Insert( PROP_SIZE_TYPE, false, uno::makeAny(bMinHeight ? text::SizeType::MIN : text::SizeType::FIX )); - pPropMap->Insert( PROP_HEIGHT, false, uno::makeAny(ConversionHelper::convertTwipToMM100( nHeight ))); - insertRowProps(pPropMap); - } - break; - /* WRITERFILTERSTATUS: done: 1, planned: 2, spent: 0 */ case 0xd608: // TDefTable { writerfilter::Reference::Pointer_t pProperties = rSprm.getProps(); @@ -226,22 +165,6 @@ bool DomainMapperTableManager::sprm(Sprm & rSprm) } break; /* WRITERFILTERSTATUS: done: 1, planned: 2, spent: 0 */ - case NS_ooxml::LN_CT_TcPrBase_vAlign://90694 - { - sal_Int16 nVertOrient = text::VertOrientation::NONE; - switch( nIntValue ) //0 - top 1 - center 3 - bottom - { - case 1: nVertOrient = text::VertOrientation::CENTER; break; - case 3: nVertOrient = text::VertOrientation::BOTTOM; break; - default:; - }; - TablePropertyMapPtr pCellPropMap( new TablePropertyMap() ); - pCellPropMap->Insert( PROP_VERT_ORIENT, false, uno::makeAny( nVertOrient ) ); - //todo: in ooxml import the value of m_ncell is wrong - cellProps( pCellPropMap ); - } - break; - /* WRITERFILTERSTATUS: done: 1, planned: 2, spent: 0 */ case 0xD605: // sprmTTableBorders { writerfilter::Reference::Pointer_t pProperties = rSprm.getProps(); @@ -256,70 +179,6 @@ bool DomainMapperTableManager::sprm(Sprm & rSprm) } } break; - /* WRITERFILTERSTATUS: done: 1, planned: 2, spent: 0 */ - case NS_ooxml::LN_CT_TblPrBase_tblBorders: //table borders, might be defined in table style - { - writerfilter::Reference::Pointer_t pProperties = rSprm.getProps(); - if( pProperties.get()) - { - BorderHandlerPtr pBorderHandler( new BorderHandler(m_bOOXML) ); - pProperties->resolve(*pBorderHandler); - TablePropertyMapPtr pTablePropMap( new TablePropertyMap ); - pTablePropMap->insert( pBorderHandler->getProperties() ); - insertTableProps( pTablePropMap ); - } - } - break; - /* WRITERFILTERSTATUS: done: 1, planned: 2, spent: 0 */ - case NS_ooxml::LN_CT_TcPrBase_tcBorders ://cell borders - //contains CT_TcBorders_left, right, top, bottom - { - writerfilter::Reference::Pointer_t pProperties = rSprm.getProps(); - if( pProperties.get()) - { - //in OOXML there's one set of borders at each cell (if there is any) - TDefTableHandlerPtr pTDefTableHandler( new TDefTableHandler( m_bOOXML )); - pProperties->resolve( *pTDefTableHandler ); - TablePropertyMapPtr pCellPropMap( new TablePropertyMap ); - pTDefTableHandler->fillCellProperties( 0, pCellPropMap ); - cellProps( pCellPropMap ); - } - } - break; - case NS_ooxml::LN_CT_TblPrBase_shd: - { - writerfilter::Reference::Pointer_t pProperties = rSprm.getProps(); - if( pProperties.get()) - { - CellColorHandlerPtr pCellColorHandler( new CellColorHandler); - pProperties->resolve( *pCellColorHandler ); - TablePropertyMapPtr pTablePropMap( new TablePropertyMap ); - insertTableProps( pCellColorHandler->getProperties() ); - } - } - break; - /* WRITERFILTERSTATUS: done: 1, planned: 2, spent: 0 */ - case 0xd61a : // sprmTCellTopColor - /* WRITERFILTERSTATUS: done: 1, planned: 2, spent: 0 */ - case 0xd61b : // sprmTCellLeftColor - /* WRITERFILTERSTATUS: done: 1, planned: 2, spent: 0 */ - case 0xd61c : // sprmTCellBottomColor - /* WRITERFILTERSTATUS: done: 1, planned: 2, spent: 0 */ - case 0xd61d : // sprmTCellRightColor - /* WRITERFILTERSTATUS: done: 1, planned: 2, spent: 0 */ - case NS_ooxml::LN_CT_TcPrBase_shd: - { - // each color sprm contains as much colors as cells are in a row - //LN_CT_TcPrBase_shd: cell shading contains: LN_CT_Shd_val, LN_CT_Shd_fill, LN_CT_Shd_color - writerfilter::Reference::Pointer_t pProperties = rSprm.getProps(); - if( pProperties.get()) - { - CellColorHandlerPtr pCellColorHandler( new CellColorHandler ); - pProperties->resolve( *pCellColorHandler ); - cellProps( pCellColorHandler->getProperties()); - } - } - break; /* WRITERFILTERSTATUS: done: 0, planned: 2, spent: 0 */ case 0xd632 : //sprmTNewSpacing /* WRITERFILTERSTATUS: done: 0, planned: 2, spent: 0 */ @@ -356,7 +215,6 @@ bool DomainMapperTableManager::sprm(Sprm & rSprm) case 0xf618 : //unknown bRet = false; break; -//OOXML table properties /* WRITERFILTERSTATUS: done: 1, planned: 2, spent: 0 */ case NS_ooxml::LN_CT_TblPrBase_tblStyle: //table style name { @@ -368,32 +226,8 @@ bool DomainMapperTableManager::sprm(Sprm & rSprm) break; /* WRITERFILTERSTATUS: done: 1, planned: 2, spent: 0 */ case NS_ooxml::LN_CT_TblGridBase_gridCol: - - if(!m_nRow) - { - m_aTableGrid.push_back( ConversionHelper::convertTwipToMM100( nIntValue ) ); - } - break; - /* WRITERFILTERSTATUS: done: 0, planned: 2, spent: 0 */ - case NS_ooxml::LN_CT_TblPrBase_tblCellMar: //cell margins { - //contains LN_CT_TblCellMar_top, LN_CT_TblCellMar_left, LN_CT_TblCellMar_bottom, LN_CT_TblCellMar_right - writerfilter::Reference::Pointer_t pProperties = rSprm.getProps(); - if( pProperties.get()) - { - CellMarginHandlerPtr pCellMarginHandler( new CellMarginHandler ); - pProperties->resolve( *pCellMarginHandler ); - TablePropertyMapPtr pMarginProps( new TablePropertyMap ); - if( pCellMarginHandler->m_bTopMarginValid ) - pMarginProps->setValue( TablePropertyMap::CELL_MAR_TOP, pCellMarginHandler->m_nTopMargin ); - if( pCellMarginHandler->m_bBottomMarginValid ) - pMarginProps->setValue( TablePropertyMap::CELL_MAR_BOTTOM, pCellMarginHandler->m_nBottomMargin ); - if( pCellMarginHandler->m_bLeftMarginValid ) - pMarginProps->setValue( TablePropertyMap::CELL_MAR_LEFT, pCellMarginHandler->m_nLeftMargin ); - if( pCellMarginHandler->m_bRightMarginValid ) - pMarginProps->setValue( TablePropertyMap::CELL_MAR_RIGHT, pCellMarginHandler->m_nRightMargin ); - insertTableProps(pMarginProps); - } + getCurrentGrid()->push_back( ConversionHelper::convertTwipToMM100( nIntValue ) ); } break; /* WRITERFILTERSTATUS: done: 1, planned: 2, spent: 0 */ @@ -408,25 +242,84 @@ bool DomainMapperTableManager::sprm(Sprm & rSprm) /* WRITERFILTERSTATUS: done: 1, planned: 2, spent: 0 */ case NS_ooxml::LN_CT_TcPrBase_gridSpan: //number of grid positions spanned by this cell { +#if DEBUG + clog << "GridSpan: " << nIntValue << endl; +#endif //the cell width is determined by its position in the table grid //it takes 'gridSpan' grid elements - if( m_aGridSpans.size() < m_nCell) + IntVectorPtr pCurrentSpans = getCurrentSpans( ); + if( pCurrentSpans->size() < m_nCell) { //fill missing elements with '1' - m_aGridSpans.insert( m_aGridSpans.end(), m_nCell - m_aGridSpans.size(), 1 ); + pCurrentSpans->insert( pCurrentSpans->end(), m_nCell - pCurrentSpans->size(), 1 ); } - m_aGridSpans.push_back( nIntValue ); + pCurrentSpans->push_back( nIntValue ); } break; /* WRITERFILTERSTATUS: done: 0, planned: 2, spent: 0 */ - case NS_ooxml::LN_CT_TblPrBase_tblLook: break; //todo: table look specifier + case NS_ooxml::LN_CT_TblPrBase_tblLook: + break; //todo: table look specifier /* WRITERFILTERSTATUS: done: 100, planned: 0.5, spent: 0 */ - case NS_ooxml::LN_CT_TcPrBase_tcW: break; //fixed column width is not supported - default: bRet = false; + case NS_ooxml::LN_CT_TcPrBase_tcW: + break; //fixed column width is not supported + case NS_ooxml::LN_CT_TrPrBase_cnfStyle: + { + TablePropertyMapPtr pProps( new TablePropertyMap ); + pProps->Insert( PROP_CNF_STYLE, true, uno::makeAny( pValue->getString( ) ) ); + insertRowProps( pProps ); + } + break; + case NS_ooxml::LN_CT_PPrBase_cnfStyle: + // TODO cnfStyle on a paragraph + break; + case NS_ooxml::LN_CT_TcPrBase_cnfStyle: + { + TablePropertyMapPtr pProps( new TablePropertyMap ); + pProps->Insert( PROP_CNF_STYLE, true, uno::makeAny( pValue->getString( ) ) ); + cellProps( pProps ); + } + break; + case NS_ooxml::LN_tblStart: + { + startLevel( ); + } + break; + default: + bRet = false; } } return bRet; } + +boost::shared_ptr< vector > DomainMapperTableManager::getCurrentGrid( ) +{ + return m_aTableGrid.back( ); +} + +boost::shared_ptr< vector< sal_Int32 > > DomainMapperTableManager::getCurrentSpans( ) +{ + return m_aGridSpans.back( ); +} + +void DomainMapperTableManager::startLevel( ) +{ + DomainMapperTableManager_Base_t::startLevel( ); + + IntVectorPtr pNewGrid( new vector ); + IntVectorPtr pNewSpans( new vector ); + m_aTableGrid.push_back( pNewGrid ); + m_aGridSpans.push_back( pNewSpans ); + m_nTableWidth = 0; +} + +void DomainMapperTableManager::endLevel( ) +{ + m_aTableGrid.pop_back( ); + m_aGridSpans.pop_back( ); + + DomainMapperTableManager_Base_t::endLevel( ); +} + /*-- 02.05.2007 14:36:26--------------------------------------------------- -----------------------------------------------------------------------*/ @@ -439,10 +332,11 @@ void DomainMapperTableManager::endOfCellAction() -----------------------------------------------------------------------*/ void DomainMapperTableManager::endOfRowAction() { - if(!m_nRow && !m_nTableWidth && m_aTableGrid.size()) + IntVectorPtr pTableGrid = getCurrentGrid( ); + if(!m_nTableWidth && pTableGrid->size()) { - ::std::vector::const_iterator aCellIter = m_aTableGrid.begin(); - while( aCellIter != m_aTableGrid.end() ) + ::std::vector::const_iterator aCellIter = pTableGrid->begin(); + while( aCellIter != pTableGrid->end() ) m_nTableWidth += *aCellIter++; if( m_nTableWidth > 0) { @@ -452,18 +346,20 @@ void DomainMapperTableManager::endOfRowAction() insertTableProps(pPropMap); } } - if( m_aGridSpans.size() < m_nCell) + + IntVectorPtr pCurrentSpans = getCurrentSpans( ); + if( pCurrentSpans->size() < m_nCell) { //fill missing elements with '1' - m_aGridSpans.insert( m_aGridSpans.end(), m_nCell - m_aGridSpans.size(), 1 ); + pCurrentSpans->insert( pCurrentSpans->end( ), m_nCell - pCurrentSpans->size(), 1 ); } //calculate number of used grids - it has to match the size of m_aTableGrid size_t nGrids = 0; - ::std::vector::const_iterator aGridSpanIter = m_aGridSpans.begin(); - for( ; aGridSpanIter != m_aGridSpans.end(); ++aGridSpanIter) + ::std::vector::const_iterator aGridSpanIter = pCurrentSpans->begin(); + for( ; aGridSpanIter != pCurrentSpans->end(); ++aGridSpanIter) nGrids += *aGridSpanIter; - if( m_aTableGrid.size() == nGrids ) + if( pTableGrid->size() == nGrids ) { //determine table width double nFullWidth = m_nTableWidth; @@ -473,13 +369,15 @@ void DomainMapperTableManager::endOfRowAction() text::TableColumnSeparator* pSeparators = aSeparators.getArray(); sal_Int16 nLastRelPos = 0; sal_uInt32 nBorderGridIndex = 0; + + ::std::vector< sal_Int32 >::const_iterator aSpansIter = pCurrentSpans->begin( ); for( sal_uInt32 nBorder = 0; nBorder < m_nCell - 1; ++nBorder ) { - sal_Int32 nGridCount = m_aGridSpans[nBorder]; + sal_Int32 nGridCount = *aSpansIter; double fGridWidth = 0.; do { - fGridWidth += m_aTableGrid[nBorderGridIndex++]; + fGridWidth += (*pTableGrid.get())[nBorderGridIndex++]; }while( --nGridCount ); sal_Int16 nRelPos = @@ -488,6 +386,7 @@ void DomainMapperTableManager::endOfRowAction() pSeparators[nBorder].Position = nRelPos + nLastRelPos; pSeparators[nBorder].IsVisible = sal_True; nLastRelPos = nLastRelPos + nRelPos; + aSpansIter++; } TablePropertyMapPtr pPropMap( new TablePropertyMap ); pPropMap->Insert( PROP_TABLE_COLUMN_SEPARATORS, false, uno::makeAny( aSeparators ) ); @@ -497,7 +396,7 @@ void DomainMapperTableManager::endOfRowAction() ++m_nRow; m_nCell = 0; m_nCellBorderIndex = 0; - m_aGridSpans.clear(); + pCurrentSpans->clear(); } /*-- 18.06.2007 10:34:37--------------------------------------------------- @@ -505,8 +404,6 @@ void DomainMapperTableManager::endOfRowAction() void DomainMapperTableManager::clearData() { m_nRow = m_nCell = m_nCellBorderIndex = m_nHeaderRepeat = m_nTableWidth = 0; - m_aTableGrid.clear(); - m_aGridSpans.clear(); m_sTableStyleName = ::rtl::OUString(); m_pTableStyleTextProperies.reset(); } @@ -521,10 +418,10 @@ void lcl_CopyTextProperties(PropertyMapPtr pToFill, //fill base style properties first, recursively if( pStyleSheetEntry->sBaseStyleIdentifier.getLength()) { - const StyleSheetEntry* pParentStyleSheet = + const StyleSheetEntryPtr pParentStyleSheet = pStyleSheetTable->FindStyleSheetByISTD(pStyleSheetEntry->sBaseStyleIdentifier); OSL_ENSURE( pParentStyleSheet, "table style not found" ); - lcl_CopyTextProperties( pToFill, pParentStyleSheet, pStyleSheetTable); + lcl_CopyTextProperties( pToFill, pParentStyleSheet.get( ), pStyleSheetTable); } PropertyMap::const_iterator aPropIter = pStyleSheetEntry->pProperties->begin(); @@ -541,10 +438,10 @@ void DomainMapperTableManager::CopyTextProperties(PropertyMapPtr pContext, Style if( !m_pTableStyleTextProperies.get()) { m_pTableStyleTextProperies.reset( new PropertyMap ); - const StyleSheetEntry* pStyleSheetEntry = pStyleSheetTable->FindStyleSheetByISTD( + const StyleSheetEntryPtr pStyleSheetEntry = pStyleSheetTable->FindStyleSheetByISTD( m_sTableStyleName); OSL_ENSURE( pStyleSheetEntry, "table style not found" ); - lcl_CopyTextProperties(m_pTableStyleTextProperies, pStyleSheetEntry, pStyleSheetTable); + lcl_CopyTextProperties(m_pTableStyleTextProperies, pStyleSheetEntry.get( ), pStyleSheetTable); } pContext->insert( m_pTableStyleTextProperies ); } diff --git a/writerfilter/source/dmapper/DomainMapperTableManager.hxx b/writerfilter/source/dmapper/DomainMapperTableManager.hxx index 2703b155e11f..7a8b07c8d174 100644 --- a/writerfilter/source/dmapper/DomainMapperTableManager.hxx +++ b/writerfilter/source/dmapper/DomainMapperTableManager.hxx @@ -30,6 +30,8 @@ #ifndef INCLUDED_DOMAIN_MAPPER_TABLE_MANAGER_HXX #define INCLUDED_DOMAIN_MAPPER_TABLE_MANAGER_HXX +#include "TablePropertiesHandler.hxx" + #include #include #include @@ -38,10 +40,11 @@ namespace writerfilter { namespace dmapper { -typedef ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > Handle_t; -typedef TableManager DomainMapperTableManager_Base_t; + class DomainMapperTableManager : public DomainMapperTableManager_Base_t { + typedef boost::shared_ptr< std::vector > IntVectorPtr; + sal_uInt32 m_nRow; sal_uInt32 m_nCell; sal_uInt32 m_nCellBorderIndex; //borders are provided for all cells and need counting @@ -51,8 +54,11 @@ class DomainMapperTableManager : public DomainMapperTableManager_Base_t ::rtl::OUString m_sTableStyleName; PropertyMapPtr m_pTableStyleTextProperies; - ::std::vector m_aTableGrid; - ::std::vector m_aGridSpans; + ::std::vector< IntVectorPtr > m_aTableGrid; + ::std::vector< IntVectorPtr > m_aGridSpans; + + TablePropertiesHandler *m_pTablePropsHandler; + PropertyMapPtr m_pStyleProps; virtual void clearData(); @@ -61,15 +67,56 @@ public: DomainMapperTableManager(bool bOOXML); virtual ~DomainMapperTableManager(); + // use this method to avoid adding the properties for the table + // but in the provided properties map. + inline void SetStyleProperties( PropertyMapPtr pProperties ) { m_pStyleProps = pProperties; }; + virtual bool sprm(Sprm & rSprm); + virtual void startLevel( ); + virtual void endLevel( ); + virtual void endOfCellAction(); virtual void endOfRowAction(); + IntVectorPtr getCurrentGrid( ); + IntVectorPtr getCurrentSpans( ); + const ::rtl::OUString& getTableStyleName() const { return m_sTableStyleName; } /// copy the text properties of the table style and its parent into pContext void CopyTextProperties(PropertyMapPtr pContext, StyleSheetTablePtr pStyleSheetTable); + inline virtual void cellProps(TablePropertyMapPtr pProps) + { + if ( m_pStyleProps.get( ) ) + m_pStyleProps->insert( pProps, true ); + else + DomainMapperTableManager_Base_t::cellProps( pProps ); + }; + + inline virtual void cellPropsByCell(unsigned int i, TablePropertyMapPtr pProps) + { + if ( m_pStyleProps.get( ) ) + m_pStyleProps->insert( pProps, true ); + else + DomainMapperTableManager_Base_t::cellPropsByCell( i, pProps ); + }; + + inline virtual void insertRowProps(TablePropertyMapPtr pProps) + { + if ( m_pStyleProps.get( ) ) + m_pStyleProps->insert( pProps, true ); + else + DomainMapperTableManager_Base_t::insertRowProps( pProps ); + }; + + inline virtual void insertTableProps(TablePropertyMapPtr pProps) + { + if ( m_pStyleProps.get( ) ) + m_pStyleProps->insert( pProps, true ); + else + DomainMapperTableManager_Base_t::insertTableProps( pProps ); + }; }; }} diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx b/writerfilter/source/dmapper/DomainMapper_Impl.cxx index 2d8acbcdb56e..e6b52805a5da 100644 --- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx +++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx @@ -36,6 +36,8 @@ #include #include #include +#include +#include #include #include #include @@ -55,6 +57,7 @@ #include #include #include +#include #include #include #include @@ -69,12 +72,17 @@ #include #include #include + +#include #ifdef DEBUG_DOMAINMAPPER #include #include #endif #include +#if DEBUG +#include +#endif #include @@ -393,6 +401,8 @@ DomainMapper_Impl::DomainMapper_Impl( m_bIsFirstSection( true ), m_bIsColumnBreakDeferred( false ), m_bIsPageBreakDeferred( false ), + m_bIsInShape( false ), + m_bShapeContextAdded( false ), m_TableManager( eDocumentType == DOCUMENT_OOXML ), m_nCurrentTabStopIndex( 0 ), m_sCurrentParaStyleId(), @@ -401,7 +411,7 @@ DomainMapper_Impl::DomainMapper_Impl( m_bLineNumberingSet( false ), m_bIsInFootnoteProperties( true ), m_bIsCustomFtnMark( false ), - n_CurrentRedlineToken( ooxml::OOXML_mod ) + m_bIsParaChange( false ) { GetBodyText(); uno::Reference< text::XTextAppend > xBodyTextAppend = uno::Reference< text::XTextAppend >( m_xBodyText, uno::UNO_QUERY ); @@ -685,13 +695,13 @@ uno::Sequence< style::TabStop > DomainMapper_Impl::GetCurrentTabStopAndClear() -----------------------------------------------------------------------*/ uno::Any DomainMapper_Impl::GetPropertyFromStyleSheet(PropertyIds eId) { - const StyleSheetEntry* pEntry = 0; + StyleSheetEntryPtr pEntry; if( m_bInStyleSheetImport ) pEntry = GetStyleSheetTable()->FindParentStyleSheet(::rtl::OUString()); else pEntry = GetStyleSheetTable()->FindStyleSheetByISTD(GetCurrentParaStyleId()); - while(pEntry) + while(pEntry.get( ) ) { //is there a tab stop set? if(pEntry->pProperties) @@ -725,10 +735,10 @@ void DomainMapper_Impl::deferBreak( BreakType deferredBreakType) switch (deferredBreakType) { case COLUMN_BREAK: - m_bIsColumnBreakDeferred = true; + m_bIsColumnBreakDeferred = true; break; case PAGE_BREAK: - m_bIsPageBreakDeferred = true; + m_bIsPageBreakDeferred = true; break; default: return; @@ -831,11 +841,15 @@ void lcl_AddRangeAndStyle( /*------------------------------------------------------------------------- -----------------------------------------------------------------------*/ -//define some default frame width - 10cm ATM -#define DEFAULT_FRAME_MIN_WIDTH 10000 +//define some default frame width - 0cm ATM: this allow the frame to be wrapped around the text +#define DEFAULT_FRAME_MIN_WIDTH 0 void DomainMapper_Impl::finishParagraph( PropertyMapPtr pPropertyMap ) { +#if DEBUG + clog << "finishParagraph" << endl; +#endif + ParagraphPropertyMap* pParaContext = dynamic_cast< ParagraphPropertyMap* >( pPropertyMap.get() ); TextAppendContext& rAppendContext = m_aTextAppendStack.top(); uno::Reference< text::XTextAppend > xTextAppend = rAppendContext.xTextAppend; @@ -903,11 +917,11 @@ void DomainMapper_Impl::finishParagraph( PropertyMapPtr pPropertyMap ) try { // - const StyleSheetEntry* pParaStyle = + StyleSheetEntryPtr pParaStyle = m_pStyleSheetTable->FindStyleSheetByConvertedStyleName(rAppendContext.pLastParagraphProperties->GetParaStyleName()); uno::Sequence< beans::PropertyValue > aFrameProperties(pParaStyle ? 15: 0); - if(pParaStyle) + if ( pParaStyle.get( ) ) { const ParagraphProperties* pStyleProperties = dynamic_cast( pParaStyle->pProperties.get() ); beans::PropertyValue* pFrameProperties = aFrameProperties.getArray(); @@ -1045,14 +1059,34 @@ void DomainMapper_Impl::finishParagraph( PropertyMapPtr pPropertyMap ) uno::Reference< text::XTextRange > xTextRange = xTextAppend->finishParagraph( aProperties ); m_TableManager.handle(xTextRange); - } - else - { + // Set the anchor of the objects to the created paragraph + while ( m_aAnchoredStack.size( ) > 0 && !m_bIsInShape ) + { + uno::Reference< text::XTextContent > xObj = m_aAnchoredStack.top( ); + try + { +#if DEBUG + rtl::OUString sText( xTextRange->getString( ) ); +#endif + xObj->attach( xTextRange ); + } + catch ( uno::RuntimeException& ) + { + // this is normal: the shape is already attached + } + m_aAnchoredStack.pop( ); + } + + // Get the end of paragraph character inserted + uno::Reference< text::XTextCursor > xCur = xTextRange->getText( )->createTextCursor( ); + xCur->gotoEnd( false ); + xCur->goLeft( 1 , true ); + uno::Reference< text::XTextRange > xParaEnd( xCur, uno::UNO_QUERY ); + CheckParaRedline( xParaEnd ); } if( !bKeepLastParagraphProperties ) rAppendContext.pLastParagraphProperties = pToBeSavedProperties; - } catch(const lang::IllegalArgumentException& rIllegal) { @@ -1062,7 +1096,7 @@ void DomainMapper_Impl::finishParagraph( PropertyMapPtr pPropertyMap ) catch(const uno::Exception& rEx) { (void)rEx; - OSL_ENSURE( false, "ArgumentException in DomainMapper_Impl::finishParagraph" ); + //OSL_ENSURE( false, "ArgumentException in DomainMapper_Impl::finishParagraph" ); } } } @@ -1099,35 +1133,7 @@ void DomainMapper_Impl::appendTextPortion( const ::rtl::OUString& rString, Prope uno::Reference< text::XTextRange > xTextRange = xTextAppend->appendTextPortion (rString, pPropertyMap->GetPropertyValues()); - if( m_CurrentRedlineDate.getLength() ) - { - try - { - ::rtl::OUString sType; - PropertyNameSupplier& rPropNameSupplier = PropertyNameSupplier::GetPropertyNameSupplier(); - switch(n_CurrentRedlineToken & 0xffff) - { - case ooxml::OOXML_mod : sType = rPropNameSupplier.GetName( PROP_FORMAT ); break; - case ooxml::OOXML_ins : sType = rPropNameSupplier.GetName( PROP_INSERT ); break; - case ooxml::OOXML_del : sType = rPropNameSupplier.GetName( PROP_DELETE ); break; - } - uno::Reference< text::XRedline > xRedline( xTextRange, uno::UNO_QUERY_THROW ); - beans::PropertyValues aRedlineProperties( 2 ); - beans::PropertyValue* pRedlineProperties = aRedlineProperties.getArray(); - pRedlineProperties[0].Name = rPropNameSupplier.GetName( PROP_REDLINE_AUTHOR ); - pRedlineProperties[0].Value <<= m_CurrentRedlineAuthor; - pRedlineProperties[1].Name = rPropNameSupplier.GetName( PROP_REDLINE_DATE_TIME ); - pRedlineProperties[1].Value <<= lcl_DateStringToDateTime( m_CurrentRedlineDate ); - xRedline->makeRedline( sType, aRedlineProperties); - - } - catch( const uno::Exception& rEx ) - { - (void)rEx; - OSL_ENSURE( false, "Exception in makeRedline" ); - } - ResetRedlineProperties(); - } + CheckRedline( xTextRange ); //m_TableManager.handle(xTextRange); } @@ -1167,6 +1173,7 @@ void DomainMapper_Impl::appendTextContent( } } } + /*-- 24.04.2008 08:38:07--------------------------------------------------- -----------------------------------------------------------------------*/ @@ -1368,9 +1375,11 @@ void DomainMapper_Impl::PushFootOrEndnote( bool bIsFootnote ) aFontProps->Insert(PROP_CHAR_FONT_NAME, true, uno::makeAny( pTopContext->GetFootnoteFontName() )); aFontProperties = aFontProps->GetPropertyValues(); } - appendTextContent( uno::Reference< text::XTextContent >( xFootnoteText, uno::UNO_QUERY_THROW ), aFontProperties ); m_aTextAppendStack.push(uno::Reference< text::XTextAppend >( xFootnoteText, uno::UNO_QUERY_THROW )); + + // Redlines for the footnote anchor + CheckRedline( xFootnote->getAnchor( ) ); } catch( uno::Exception& ) { @@ -1378,6 +1387,87 @@ void DomainMapper_Impl::PushFootOrEndnote( bool bIsFootnote ) } } +void DomainMapper_Impl::CreateRedline( uno::Reference< text::XTextRange > xRange, RedlineParamsPtr& pRedline ) +{ + if ( pRedline.get( ) ) + { +#if DEBUG + clog << "REDLINE: Writing redline: " << pRedline->m_nId << endl; +#endif + try + { + ::rtl::OUString sType; + PropertyNameSupplier & rPropNameSupplier = PropertyNameSupplier::GetPropertyNameSupplier( ); + switch ( pRedline->m_nToken & 0xffff ) + { + case ooxml::OOXML_mod: + sType = rPropNameSupplier.GetName( PROP_FORMAT ); + break; + case ooxml::OOXML_ins: + sType = rPropNameSupplier.GetName( PROP_INSERT ); + break; + case ooxml::OOXML_del: + sType = rPropNameSupplier.GetName( PROP_DELETE ); + break; + } + uno::Reference < text::XRedline > xRedline( xRange, uno::UNO_QUERY_THROW ); + beans::PropertyValues aRedlineProperties( 2 ); + beans::PropertyValue * pRedlineProperties = aRedlineProperties.getArray( ); + pRedlineProperties[0].Name = rPropNameSupplier.GetName( PROP_REDLINE_AUTHOR ); + pRedlineProperties[0].Value <<= pRedline->m_sAuthor; + pRedlineProperties[1].Name = rPropNameSupplier.GetName( PROP_REDLINE_DATE_TIME ); + pRedlineProperties[1].Value <<= lcl_DateStringToDateTime( pRedline->m_sDate ); + + xRedline->makeRedline( sType, aRedlineProperties ); + } + catch( const uno::Exception & rEx ) + { +#if DEBUG + clog << "REDLINE: error - " << rtl::OUStringToOString( rEx.Message, RTL_TEXTENCODING_UTF8 ).getStr( ) << endl; +#endif + ( void ) rEx; + OSL_ENSURE( false, "Exception in makeRedline" ); + } + } +} + +void DomainMapper_Impl::CheckParaRedline( uno::Reference< text::XTextRange > xRange ) +{ + if ( m_pParaRedline.get( ) ) + { + CreateRedline( xRange, m_pParaRedline ); + ResetParaRedline( ); + } +} + +void DomainMapper_Impl::CheckRedline( uno::Reference< text::XTextRange > xRange ) +{ + vector::iterator pIt = m_aRedlines.begin( ); + vector< RedlineParamsPtr > aCleaned; + for (; pIt != m_aRedlines.end( ); pIt++ ) + { + CreateRedline( xRange, *pIt ); + + // Adding the non-mod redlines to the temporary vector + if ( pIt->get( ) && ( ( *pIt )->m_nToken & 0xffff ) != ooxml::OOXML_mod ) + { + aCleaned.push_back( *pIt ); + } + } + + m_aRedlines.swap( aCleaned ); +} + +void DomainMapper_Impl::StartParaChange( ) +{ + m_bIsParaChange = true; +} + +void DomainMapper_Impl::EndParaChange( ) +{ + m_bIsParaChange = false; +} + /*-- 22.12.2008 13:45:15--------------------------------------------------- -----------------------------------------------------------------------*/ @@ -1416,57 +1506,58 @@ void DomainMapper_Impl::PopAnnotation() m_xAnnotationField.clear(); } -/*-- 20.03.2008 09:01:58--------------------------------------------------- - -----------------------------------------------------------------------*/ -void DomainMapper_Impl::PushShapeContext() +void DomainMapper_Impl::PushShapeContext( const uno::Reference< drawing::XShape > xShape ) { +#if DEBUG + clog << "PushShapeContext" << endl; +#endif + m_bIsInShape = true; try { - uno::Reference< text::XText > xTemporaryShape( GetTextFactory()->createInstance( - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.drawing.RectangleShape") )), - uno::UNO_QUERY_THROW ); - uno::Reference< text::XTextAppend > xShapeAppend( xTemporaryShape, uno::UNO_QUERY ); - //insert into the document - uno::Reference< text::XTextContent > xShapeContent( xTemporaryShape, uno::UNO_QUERY_THROW ); - xShapeContent->attach( GetBodyText()->getStart() ); - m_aTextAppendStack.push(uno::Reference< text::XTextAppend >( xShapeAppend, uno::UNO_QUERY_THROW )); + // Add the shape to the text append stack + m_aTextAppendStack.push( uno::Reference< text::XTextAppend >( xShape, uno::UNO_QUERY_THROW ) ); + m_bShapeContextAdded = true; + + // Add the shape to the anchored objects stack + uno::Reference< text::XTextContent > xTxtContent( xShape, uno::UNO_QUERY_THROW ); + m_aAnchoredStack.push( xTxtContent ); + + PropertyNameSupplier& rPropNameSupplier = PropertyNameSupplier::GetPropertyNameSupplier(); + + uno::Reference< beans::XPropertySet > xProps( xShape, uno::UNO_QUERY_THROW ); + xProps->setPropertyValue( + rPropNameSupplier.GetName( PROP_ANCHOR_TYPE ), + uno::makeAny( text::TextContentAnchorType_AT_PARAGRAPH ) ); + xProps->setPropertyValue( + rPropNameSupplier.GetName( PROP_OPAQUE ), + uno::makeAny( true ) ); } - catch( uno::Exception& ) + catch ( const uno::Exception& e ) { - OSL_ENSURE( false, "exception in DomainMapper_Impl::PushShapeContext" ); +#if DEBUG + clog << "Exception when adding shape: "; + clog << rtl::OUStringToOString( e.Message, RTL_TEXTENCODING_UTF8 ).getStr( ); + clog << endl; +#endif } } + /*-- 20.03.2008 09:01:59--------------------------------------------------- -----------------------------------------------------------------------*/ void DomainMapper_Impl::PopShapeContext() { - m_xTemporaryShape = uno::Reference< drawing::XShape >( m_aTextAppendStack.top().xTextAppend, uno::UNO_QUERY ); - m_aTextAppendStack.pop(); -} -/*-- 20.03.2008 12:31:58--------------------------------------------------- +#if DEBUG + clog << "PopShapeContext" << endl; +#endif - -----------------------------------------------------------------------*/ -void DomainMapper_Impl::CopyTemporaryShapeText( uno::Reference< drawing::XShape > xShape ) -{ - uno::Reference< text::XTextCopy >xShapeText( xShape, uno::UNO_QUERY ); - uno::Reference< text::XTextCopy >xTempShapeText( m_xTemporaryShape, uno::UNO_QUERY ); - if( xShapeText.is() && xTempShapeText.is() ) - { - xShapeText->copyText( xTempShapeText ); - } - try - { - uno::Reference< lang::XComponent >xTemp( m_xTemporaryShape, uno::UNO_QUERY ); - if( xTemp.is() ) - xTemp->dispose(); - } - catch( const uno::Exception& ) + if ( m_bShapeContextAdded ) { + m_aTextAppendStack.pop(); + m_bShapeContextAdded = false; } - m_xTemporaryShape = uno::Reference< drawing::XShape >(); - + m_bIsInShape = false; } /*-- 12.09.2006 08:07:55--------------------------------------------------- @@ -2952,6 +3043,7 @@ void DomainMapper_Impl::CloseFieldCommand() bool bHyperlinks = false; bool bFromOutline = false; bool bFromEntries = false; + sal_Int16 nMaxLevel = 10; ::rtl::OUString sTemplate; ::rtl::OUString sChapterNoSeparator; // \a Builds a table of figures but does not include the captions's label and number @@ -3001,6 +3093,10 @@ void DomainMapper_Impl::CloseFieldCommand() if( lcl_FindInCommand( pContext->GetCommand(), 'o', sValue )) { bFromOutline = true; + UniString sParam( sValue ); + xub_StrLen nIndex = 0; + sParam.GetToken( 0, '-', nIndex ); + nMaxLevel = sal_Int16( sParam.Copy( nIndex ).ToInt32( ) ); } // \p Defines the separator between the table entry and its page number if( lcl_FindInCommand( pContext->GetCommand(), 'p', sValue )) @@ -3048,6 +3144,7 @@ void DomainMapper_Impl::CloseFieldCommand() xTOC->setPropertyValue(rPropNameSupplier.GetName( PROP_TITLE ), uno::makeAny(::rtl::OUString())); if( !bTableOfFigures ) { + xTOC->setPropertyValue( rPropNameSupplier.GetName( PROP_LEVEL ), uno::makeAny( nMaxLevel ) ); xTOC->setPropertyValue( rPropNameSupplier.GetName( PROP_CREATE_FROM_OUTLINE ), uno::makeAny( bFromOutline )); xTOC->setPropertyValue( rPropNameSupplier.GetName( PROP_CREATE_FROM_MARKS ), uno::makeAny( bFromEntries )); if( sTemplate.getLength() ) @@ -3531,14 +3628,98 @@ bool DomainMapper_Impl::ExecuteFrameConversion() } return bRet; } + +void DomainMapper_Impl::AddNewRedline( ) +{ + RedlineParamsPtr pNew( new RedlineParams ); + pNew->m_nToken = ooxml::OOXML_mod; + if ( !m_bIsParaChange ) + { +#if DEBUG + clog << "REDLINE: Adding a new redline to stack" << endl; +#endif + m_aRedlines.push_back( pNew ); + } + else + { +#if DEBUG + clog << "REDLINE: Setting a new paragraph redline" << endl; +#endif + m_pParaRedline.swap( pNew ); + } +} + +RedlineParamsPtr DomainMapper_Impl::GetTopRedline( ) +{ + RedlineParamsPtr pResult; + if ( !m_bIsParaChange && m_aRedlines.size( ) > 0 ) + pResult = m_aRedlines.back( ); + else if ( m_bIsParaChange ) + pResult = m_pParaRedline; + return pResult; +} + +sal_Int32 DomainMapper_Impl::GetCurrentRedlineToken( ) +{ + sal_Int32 nToken = 0; + RedlineParamsPtr pCurrent( GetTopRedline( ) ); + if ( pCurrent.get( ) ) + nToken = pCurrent->m_nToken; + return nToken; +} + +void DomainMapper_Impl::SetCurrentRedlineAuthor( rtl::OUString sAuthor ) +{ + RedlineParamsPtr pCurrent( GetTopRedline( ) ); + if ( pCurrent.get( ) ) + pCurrent->m_sAuthor = sAuthor; +} + +void DomainMapper_Impl::SetCurrentRedlineDate( rtl::OUString sDate ) +{ + RedlineParamsPtr pCurrent( GetTopRedline( ) ); + if ( pCurrent.get( ) ) + pCurrent->m_sDate = sDate; +} + +void DomainMapper_Impl::SetCurrentRedlineId( sal_Int32 sId ) +{ + RedlineParamsPtr pCurrent( GetTopRedline( ) ); + if ( pCurrent.get( ) ) + pCurrent->m_nId = sId; +} + +void DomainMapper_Impl::SetCurrentRedlineToken( sal_Int32 nToken ) +{ + RedlineParamsPtr pCurrent( GetTopRedline( ) ); + if ( pCurrent.get( ) ) + pCurrent->m_nToken = nToken; +} + /*-- 19.03.2008 11:35:38--------------------------------------------------- -----------------------------------------------------------------------*/ -void DomainMapper_Impl::ResetRedlineProperties() +void DomainMapper_Impl::RemoveCurrentRedline( ) { - m_CurrentRedlineAuthor = m_CurrentRedlineDate = m_CurrentRedlineId = ::rtl::OUString(); - n_CurrentRedlineToken = ooxml::OOXML_mod; + if ( m_aRedlines.size( ) > 0 ) + { +#if DEBUG + clog << "REDLINE: Removing back redline" << endl; +#endif + m_aRedlines.pop_back( ); + } } +void DomainMapper_Impl::ResetParaRedline( ) +{ + if ( m_pParaRedline.get( ) ) + { +#if DEBUG + clog << "REDLINE: Cleaning the para redline" << endl; +#endif + RedlineParamsPtr pEmpty; + m_pParaRedline.swap( pEmpty ); + } +} }} diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.hxx b/writerfilter/source/dmapper/DomainMapper_Impl.hxx index f4dfaf0041e7..989d09e9d351 100644 --- a/writerfilter/source/dmapper/DomainMapper_Impl.hxx +++ b/writerfilter/source/dmapper/DomainMapper_Impl.hxx @@ -34,6 +34,7 @@ #include #include #include +#include #include #include #include @@ -51,6 +52,7 @@ #include #include #include +#include #include #include #include @@ -177,6 +179,7 @@ typedef std::stack ContextStack; typedef std::stack PropertyStack; typedef std::stack< TextAppendContext > TextAppendStack; typedef std::stack FieldStack; +typedef std::stack< com::sun::star::uno::Reference< com::sun::star::text::XTextContent > > TextContentStack; /*-- 18.07.2006 08:49:08--------------------------------------------------- @@ -225,6 +228,15 @@ struct BookmarkInsertPosition {} }; +struct RedlineParams +{ + ::rtl::OUString m_sAuthor; + ::rtl::OUString m_sDate; + sal_Int32 m_nId; + sal_Int32 m_nToken; +}; +typedef boost::shared_ptr< RedlineParams > RedlineParamsPtr; + /*-- 03.03.2008 11:01:38--------------------------------------------------- -----------------------------------------------------------------------*/ @@ -267,12 +279,17 @@ private: TextAppendStack m_aTextAppendStack; + TextContentStack + m_aAnchoredStack; + FieldStack m_aFieldStack; bool m_bFieldMode; bool m_bSetUserFieldContent; bool m_bIsFirstSection; bool m_bIsColumnBreakDeferred; bool m_bIsPageBreakDeferred; + bool m_bIsInShape; + bool m_bShapeContextAdded; LineNumberSettings m_aLineNumberSettings; @@ -293,6 +310,7 @@ private: StyleSheetTablePtr m_pStyleSheetTable; ThemeTablePtr m_pThemeTable; GraphicImportPtr m_pGraphicImport; + SettingsTablePtr m_pSettingsTable; PropertyMapPtr m_pTopContext; @@ -311,14 +329,11 @@ private: ::com::sun::star::uno::Reference< text::XTextRange > m_xFrameStartRange; ::com::sun::star::uno::Reference< text::XTextRange > m_xFrameEndRange; - //current redline - ::rtl::OUString m_CurrentRedlineAuthor; - ::rtl::OUString m_CurrentRedlineDate; - ::rtl::OUString m_CurrentRedlineId; - sal_Int32 n_CurrentRedlineToken; + // Redline stack + std::vector< RedlineParamsPtr > m_aRedlines; + RedlineParamsPtr m_pParaRedline; + bool m_bIsParaChange; - //shape import - ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > m_xTemporaryShape; //annotation import uno::Reference< beans::XPropertySet > m_xAnnotationField; @@ -357,6 +372,15 @@ public: } void SetDocumentSettingsProperty( const ::rtl::OUString& rPropName, const uno::Any& rValue ); + void CreateRedline( ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > xRange, RedlineParamsPtr& pRedline ); + + void CheckParaRedline( ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > xRange ); + + void CheckRedline( ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > xRange ); + + void StartParaChange( ); + void EndParaChange( ); + void deferBreak( BreakType deferredBreakType ); bool isBreakDeferred( BreakType deferredBreakType ); void clearDeferredBreaks(); @@ -412,6 +436,13 @@ public: return m_pThemeTable; } + SettingsTablePtr GetSettingsTable( ) + { + if ( !m_pSettingsTable ) + m_pSettingsTable.reset( new SettingsTable ); + return m_pSettingsTable; + } + GraphicImportPtr GetGraphicImport( GraphicImportType eGraphicImportType ); void ResetGraphicImport(); // this method deletes the current m_pGraphicImport after import @@ -432,10 +463,8 @@ public: void SetAnyTableImport( bool bSet ) { m_bInAnyTableImport = bSet;} bool IsAnyTableImport()const { return m_bInAnyTableImport;} - void PushShapeContext(); + void PushShapeContext( const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > xShape ); void PopShapeContext(); - bool IsInShapeContext() const { return m_xTemporaryShape.is(); } - void CopyTemporaryShapeText( ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > xShape ); void PushPageHeader(SectionPropertyMap::PageType eType); void PushPageFooter(SectionPropertyMap::PageType eType); @@ -495,19 +524,17 @@ public: ); bool ExecuteFrameConversion(); - ::rtl::OUString GetCurrentRedlineAuthor() const { return m_CurrentRedlineAuthor; } - void SetCurrentRedlineAuthor( const ::rtl::OUString& rSet ) { m_CurrentRedlineAuthor = rSet; } - - ::rtl::OUString GetCurrentRedlineDate() const { return m_CurrentRedlineDate; } - void SetCurrentRedlineDate( const ::rtl::OUString& rSet ) { m_CurrentRedlineDate = rSet; } - - ::rtl::OUString GetCurrentRedlineId() const { return m_CurrentRedlineId; } - void SetCurrentRedlineId( const ::rtl::OUString& rSet ) { m_CurrentRedlineId = rSet; } + void AddNewRedline( ); - sal_Int32 GetCurrentRedlineToken() const { return n_CurrentRedlineToken; } - void SetCurrentRedlineToken(sal_Int32 nSet) { n_CurrentRedlineToken = nSet; } + RedlineParamsPtr GetTopRedline( ); - void ResetRedlineProperties(); + sal_Int32 GetCurrentRedlineToken( ); + void SetCurrentRedlineAuthor( rtl::OUString sAuthor ); + void SetCurrentRedlineDate( rtl::OUString sDate ); + void SetCurrentRedlineId( sal_Int32 nId ); + void SetCurrentRedlineToken( sal_Int32 nToken ); + void RemoveCurrentRedline( ); + void ResetParaRedline( ); }; } //namespace dmapper diff --git a/writerfilter/source/dmapper/FontTable.cxx b/writerfilter/source/dmapper/FontTable.cxx index 7d5af93a2da4..70baeeddd380 100644 --- a/writerfilter/source/dmapper/FontTable.cxx +++ b/writerfilter/source/dmapper/FontTable.cxx @@ -647,6 +647,15 @@ void FontTable::substream(Id, ::writerfilter::Reference::Pointer_t) void FontTable::info(const string& ) { } + +void FontTable::startShape( ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > ) +{ +} + +void FontTable::endShape( ) +{ +} + /*-- 21.06.2006 11:21:38--------------------------------------------------- -----------------------------------------------------------------------*/ diff --git a/writerfilter/source/dmapper/FontTable.hxx b/writerfilter/source/dmapper/FontTable.hxx index b41414e204d4..b47374d2b0f9 100644 --- a/writerfilter/source/dmapper/FontTable.hxx +++ b/writerfilter/source/dmapper/FontTable.hxx @@ -38,7 +38,6 @@ namespace writerfilter { namespace dmapper { -using namespace std; struct FontTable_Impl; struct FontEntry @@ -98,6 +97,8 @@ public: virtual void substream(Id name, ::writerfilter::Reference::Pointer_t ref); virtual void info(const string & info); + virtual void startShape( ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > xShape ); + virtual void endShape( ); const FontEntry* getFontEntry(sal_uInt32 nIndex); sal_uInt32 size(); diff --git a/writerfilter/source/dmapper/GraphicHelpers.cxx b/writerfilter/source/dmapper/GraphicHelpers.cxx new file mode 100644 index 000000000000..c77f2dd55d3e --- /dev/null +++ b/writerfilter/source/dmapper/GraphicHelpers.cxx @@ -0,0 +1,223 @@ +#include "ConversionHelper.hxx" +#include "GraphicHelpers.hxx" + +#include + +#include +#include +#include +#include + +#include +using namespace std; + +namespace writerfilter { +namespace dmapper { + +using namespace com::sun::star; + +PositionHandler::PositionHandler( ) : + Properties( ) +{ + m_nOrient = text::VertOrientation::NONE; + m_nRelation = text::RelOrientation::FRAME; + m_nPosition = 0; +} + +PositionHandler::~PositionHandler( ) +{ +} + +void PositionHandler::attribute( Id aName, Value& rVal ) +{ + sal_Int32 nIntValue = rVal.getInt( ); + switch ( aName ) + { + case NS_ooxml::LN_CT_PosV_relativeFrom: + { + // TODO There are some other unhandled values + static Id pVertRelValues[] = + { + NS_ooxml::LN_Value_wordprocessingDrawing_ST_RelFromV_margin, + NS_ooxml::LN_Value_wordprocessingDrawing_ST_RelFromV_page, + NS_ooxml::LN_Value_wordprocessingDrawing_ST_RelFromV_paragraph, + NS_ooxml::LN_Value_wordprocessingDrawing_ST_RelFromV_line + }; + + static sal_Int16 pVertRelations[] = + { + text::RelOrientation::PAGE_PRINT_AREA, + text::RelOrientation::PAGE_FRAME, + text::RelOrientation::FRAME, + text::RelOrientation::TEXT_LINE + }; + + for ( int i = 0; i < 4; i++ ) + { + if ( pVertRelValues[i] == sal_uInt32( nIntValue ) ) + m_nRelation = pVertRelations[i]; + } + } + break; + case NS_ooxml::LN_CT_PosH_relativeFrom: + { + // TODO There are some other unhandled values + static Id pHoriRelValues[] = + { + NS_ooxml::LN_Value_wordprocessingDrawing_ST_RelFromH_margin, + NS_ooxml::LN_Value_wordprocessingDrawing_ST_RelFromH_page, + NS_ooxml::LN_Value_wordprocessingDrawing_ST_RelFromH_column, + NS_ooxml::LN_Value_wordprocessingDrawing_ST_RelFromH_character + }; + + static sal_Int16 pHoriRelations[] = + { + text::RelOrientation::PAGE_PRINT_AREA, + text::RelOrientation::PAGE_FRAME, + text::RelOrientation::FRAME, + text::RelOrientation::CHAR, + }; + + for ( int i = 0; i < 4; i++ ) + { + if ( pHoriRelValues[i] == sal_uInt32( nIntValue ) ) + m_nRelation = pHoriRelations[i]; + } + } + break; + default:; + } +} + +void PositionHandler::sprm( Sprm& rSprm ) +{ + Value::Pointer_t pValue = rSprm.getValue(); + sal_Int32 nIntValue = pValue->getInt(); + + switch ( rSprm.getId( ) ) + { + case NS_ooxml::LN_CT_PosV_align: + { + static Id pVertValues[] = + { + NS_ooxml::LN_Value_wordprocessingDrawing_ST_AlignV_top, + NS_ooxml::LN_Value_wordprocessingDrawing_ST_AlignV_bottom, + NS_ooxml::LN_Value_wordprocessingDrawing_ST_AlignV_center, + NS_ooxml::LN_Value_wordprocessingDrawing_ST_AlignV_inside, + NS_ooxml::LN_Value_wordprocessingDrawing_ST_AlignV_outside + }; + + static sal_Int16 pVertOrients[] = + { + text::VertOrientation::TOP, + text::VertOrientation::BOTTOM, + text::VertOrientation::CENTER, + text::VertOrientation::NONE, + text::VertOrientation::NONE + }; + + for ( int i = 0; i < 5; i++ ) + { + if ( pVertValues[i] == sal_uInt32( nIntValue ) ) + m_nOrient = pVertOrients[i]; + } + } + break; + case NS_ooxml::LN_CT_PosH_align: + { + static Id pHoriValues[] = + { + NS_ooxml::LN_Value_wordprocessingDrawing_ST_AlignH_left, + NS_ooxml::LN_Value_wordprocessingDrawing_ST_AlignH_right, + NS_ooxml::LN_Value_wordprocessingDrawing_ST_AlignH_center, + NS_ooxml::LN_Value_wordprocessingDrawing_ST_AlignH_inside, + NS_ooxml::LN_Value_wordprocessingDrawing_ST_AlignH_outside + }; + + static sal_Int16 pHoriOrients[] = + { + text::HoriOrientation::LEFT, + text::HoriOrientation::RIGHT, + text::HoriOrientation::CENTER, + text::HoriOrientation::INSIDE, + text::HoriOrientation::OUTSIDE + }; + + for ( int i = 0; i < 5; i++ ) + { + if ( pHoriValues[i] == sal_uInt32( nIntValue ) ) + m_nOrient = pHoriOrients[i]; + } + } + break; + case NS_ooxml::LN_CT_PosH_posOffset: + case NS_ooxml::LN_CT_PosV_posOffset: + m_nPosition = ConversionHelper::convertEMUToMM100( nIntValue ); + default:; + } +} + +WrapHandler::WrapHandler( ) : + Properties( ), + m_nType( 0 ), + m_nSide( 0 ) +{ +} + +WrapHandler::~WrapHandler( ) +{ +} + +void WrapHandler::attribute( Id aName, Value& rVal ) +{ + switch ( aName ) + { + case NS_ooxml::LN_CT_Wrap_type: + m_nType = sal_Int32( rVal.getInt( ) ); + break; + case NS_ooxml::LN_CT_Wrap_side: + m_nSide = sal_Int32( rVal.getInt( ) ); + break; + default:; + } +} + +void WrapHandler::sprm( Sprm& ) +{ +} + +sal_Int32 WrapHandler::getWrapMode( ) +{ + sal_Int32 nMode = com::sun::star::text::WrapTextMode_NONE; + + switch ( m_nType ) + { + case NS_ooxml::LN_Value_vml_wordprocessingDrawing_ST_WrapType_square: + case NS_ooxml::LN_Value_vml_wordprocessingDrawing_ST_WrapType_tight: + { + switch ( m_nSide ) + { + case NS_ooxml::LN_Value_vml_wordprocessingDrawing_ST_WrapSide_left: + nMode = com::sun::star::text::WrapTextMode_LEFT; + break; + case NS_ooxml::LN_Value_vml_wordprocessingDrawing_ST_WrapSide_right: + nMode = com::sun::star::text::WrapTextMode_RIGHT; + break; + default: + nMode = com::sun::star::text::WrapTextMode_PARALLEL; + } + } + break; + case NS_ooxml::LN_Value_vml_wordprocessingDrawing_ST_WrapType_through: + nMode = com::sun::star::text::WrapTextMode_THROUGHT; + break; + case NS_ooxml::LN_Value_vml_wordprocessingDrawing_ST_WrapType_topAndBottom: + case NS_ooxml::LN_Value_vml_wordprocessingDrawing_ST_WrapType_none: + default: + nMode = com::sun::star::text::WrapTextMode_NONE; + } + + return nMode; +} + +} } diff --git a/writerfilter/source/dmapper/GraphicHelpers.hxx b/writerfilter/source/dmapper/GraphicHelpers.hxx new file mode 100644 index 000000000000..fb8f8b2455ee --- /dev/null +++ b/writerfilter/source/dmapper/GraphicHelpers.hxx @@ -0,0 +1,48 @@ +#ifndef INCLUDED_GRAPHICHELPERS_HXX +#define INCLUDED_GRAPHICHELPERS_HXX + +#include "PropertyMap.hxx" + +#include +#include + +#include + +namespace writerfilter { +namespace dmapper +{ + +class WRITERFILTER_DLLPRIVATE PositionHandler: public Properties +{ +public: + PositionHandler( ); + ~PositionHandler( ); + + sal_Int16 m_nOrient; + sal_Int16 m_nRelation; + sal_Int32 m_nPosition; + + virtual void attribute( Id aName, Value& rVal ); + virtual void sprm( Sprm& rSprm ); +}; +typedef boost::shared_ptr PositionHandlerPtr; + +class WRITERFILTER_DLLPRIVATE WrapHandler: public Properties +{ +public: + WrapHandler( ); + ~WrapHandler( ); + + sal_Int32 m_nType; + sal_Int32 m_nSide; + + sal_Int32 getWrapMode( ); + + virtual void attribute( Id aName, Value& rVal ); + virtual void sprm( Sprm& rSprm ); +}; +typedef boost::shared_ptr WrapHandlerPtr; + +} } + +#endif diff --git a/writerfilter/source/dmapper/GraphicImport.cxx b/writerfilter/source/dmapper/GraphicImport.cxx index 5a8bfabb0e59..33a064b09d83 100644 --- a/writerfilter/source/dmapper/GraphicImport.cxx +++ b/writerfilter/source/dmapper/GraphicImport.cxx @@ -29,7 +29,9 @@ * ************************************************************************/ -#include +#include "GraphicImport.hxx" +#include "GraphicHelpers.hxx" + #include #include #include @@ -995,35 +997,79 @@ void GraphicImport::attribute(Id nName, Value & val) case NS_ooxml::LN_shape: /* WRITERFILTERSTATUS: done: 0, planned: 0.5, spent: 0 */ { - val.getAny() >>= m_xShape; + uno::Reference< drawing::XShape> xShape; + val.getAny( ) >>= xShape; - if (m_xShape.is()) + if ( xShape.is( ) ) { - uno::Reference< beans::XPropertySet > xShapeProps - (m_xShape, uno::UNO_QUERY_THROW); - - PropertyNameSupplier& rPropNameSupplier = - PropertyNameSupplier::GetPropertyNameSupplier(); - xShapeProps->setPropertyValue - (rPropNameSupplier.GetName(PROP_ANCHOR_TYPE), - uno::makeAny - (text::TextContentAnchorType_AS_CHARACTER)); - xShapeProps->setPropertyValue - (rPropNameSupplier.GetName(PROP_TEXT_RANGE), - uno::makeAny - (m_pImpl->rDomainMapper.GetCurrentTextRange())); - - awt::Point aPoint(m_xShape->getPosition()); - awt::Size aSize(m_xShape->getSize()); - - if (m_pImpl->isXSizeValid()) - aSize.Width = m_pImpl->getXSize(); - if (m_pImpl->isYSizeValis()) - aSize.Height = m_pImpl->getYSize(); - - m_xShape->setSize(aSize); - - m_pImpl->bIsGraphic = true; + // Is it a graphic image + bool bUseShape = true; + try + { + uno::Reference< beans::XPropertySet > xShapeProps + ( xShape, uno::UNO_QUERY_THROW ); + + rtl::OUString sUrl; + xShapeProps->getPropertyValue( rtl::OUString::createFromAscii( "GraphicURL" ) ) >>= sUrl; + + ::com::sun::star::beans::PropertyValues aMediaProperties( 1 ); + aMediaProperties[0].Name = rtl::OUString::createFromAscii( "URL" ); + aMediaProperties[0].Value <<= sUrl; + + m_xGraphicObject = createGraphicObject( aMediaProperties ); + + bUseShape = !m_xGraphicObject.is( ); + + if ( !bUseShape ) + { + // Define the object size + uno::Reference< beans::XPropertySet > xGraphProps( m_xGraphicObject, + uno::UNO_QUERY ); + awt::Size aSize = xShape->getSize( ); + xGraphProps->setPropertyValue( rtl::OUString::createFromAscii( "Height" ), + uno::makeAny( aSize.Height ) ); + xGraphProps->setPropertyValue( rtl::OUString::createFromAscii( "Width" ), + uno::makeAny( aSize.Width ) ); + } + } + catch( const beans::UnknownPropertyException e ) + { + // It isn't a graphic image + } + + if ( bUseShape ) + m_xShape = xShape; + + + if ( m_xShape.is( ) ) + { + uno::Reference< beans::XPropertySet > xShapeProps + (m_xShape, uno::UNO_QUERY_THROW); + + + PropertyNameSupplier& rPropNameSupplier = + PropertyNameSupplier::GetPropertyNameSupplier(); + xShapeProps->setPropertyValue + (rPropNameSupplier.GetName(PROP_ANCHOR_TYPE), + uno::makeAny + (text::TextContentAnchorType_AS_CHARACTER)); + xShapeProps->setPropertyValue + (rPropNameSupplier.GetName(PROP_TEXT_RANGE), + uno::makeAny + (m_pImpl->rDomainMapper.GetCurrentTextRange())); + + awt::Point aPoint(m_xShape->getPosition()); + awt::Size aSize(m_xShape->getSize()); + + if (m_pImpl->isXSizeValid()) + aSize.Width = m_pImpl->getXSize(); + if (m_pImpl->isYSizeValis()) + aSize.Height = m_pImpl->getYSize(); + + m_xShape->setSize(aSize); + + m_pImpl->bIsGraphic = true; + } } } break; @@ -1769,8 +1815,6 @@ void GraphicImport::sprm(Sprm & rSprm) case NS_ooxml::LN_CT_NonVisualGraphicFrameProperties_graphicFrameLocks:// 90657 case NS_ooxml::LN_CT_Inline_a_graphic:// 90915 case NS_ooxml::LN_CT_Anchor_simplePos_elem: // 90975; - case NS_ooxml::LN_CT_Anchor_positionH: // 90976; - case NS_ooxml::LN_CT_Anchor_positionV: // 90977; case NS_ooxml::LN_CT_Anchor_extent: // 90978; case NS_ooxml::LN_CT_Anchor_effectExtent: // 90979; case NS_ooxml::LN_EG_WrapType_wrapSquare: // 90945; @@ -1791,6 +1835,36 @@ void GraphicImport::sprm(Sprm & rSprm) } } break; + case NS_ooxml::LN_CT_Anchor_positionH: // 90976; + { + // Use a special handler for the positionning + PositionHandlerPtr pHandler( new PositionHandler ); + writerfilter::Reference::Pointer_t pProperties = rSprm.getProps(); + if( pProperties.get( ) ) + { + pProperties->resolve( *pHandler ); + + m_pImpl->nHoriRelation = pHandler->m_nRelation; + m_pImpl->nHoriOrient = pHandler->m_nOrient; + m_pImpl->nLeftPosition = pHandler->m_nPosition; + } + } + break; + case NS_ooxml::LN_CT_Anchor_positionV: // 90977; + { + // Use a special handler for the positionning + PositionHandlerPtr pHandler( new PositionHandler ); + writerfilter::Reference::Pointer_t pProperties = rSprm.getProps(); + if( pProperties.get( ) ) + { + pProperties->resolve( *pHandler ); + + m_pImpl->nVertRelation = pHandler->m_nRelation; + m_pImpl->nVertOrient = pHandler->m_nOrient; + m_pImpl->nTopPosition = pHandler->m_nPosition; + } + } + break; case 0x271b: case 0x271c: { @@ -1858,11 +1932,9 @@ void lcl_CalcCrop( sal_Int32& nCrop, sal_Int32 nRef ) + (((nCrop & 0xffff) * nRef ) >> 16); } -/*-- 01.11.2006 09:45:02--------------------------------------------------- - - -----------------------------------------------------------------------*/ -void GraphicImport::data(const sal_uInt8* buf, size_t len, writerfilter::Reference::Pointer_t /*ref*/) +uno::Reference< text::XTextContent > GraphicImport::createGraphicObject( const beans::PropertyValues& aMediaProperties ) { + uno::Reference< text::XTextContent > xGraphicObject; try { uno::Reference< graphic::XGraphicProvider > xGraphicProvider( @@ -1870,28 +1942,22 @@ void GraphicImport::data(const sal_uInt8* buf, size_t len, writerfilter::Referen ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.graphic.GraphicProvider")), m_xComponentContext), uno::UNO_QUERY_THROW ); - uno::Reference< io::XInputStream > xIStream = new XInputStreamHelper( buf, len, m_pImpl->bIsBitmap ); - - PropertyNameSupplier& rPropNameSupplier = PropertyNameSupplier::GetPropertyNameSupplier(); - ::com::sun::star::beans::PropertyValues aMediaProperties( 1 ); - aMediaProperties[0].Name = rPropNameSupplier.GetName(PROP_INPUT_STREAM); - aMediaProperties[0].Value <<= xIStream; uno::Reference< graphic::XGraphic > xGraphic = xGraphicProvider->queryGraphic( aMediaProperties ); - // + if(xGraphic.is()) { - clog << "Graphic loaded" << endl; + PropertyNameSupplier& rPropNameSupplier = PropertyNameSupplier::GetPropertyNameSupplier(); uno::Reference< beans::XPropertySet > xGraphicObjectProperties( m_xTextFactory->createInstance(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.text.TextGraphicObject"))), - uno::UNO_QUERY_THROW); + uno::UNO_QUERY_THROW); xGraphicObjectProperties->setPropertyValue(rPropNameSupplier.GetName(PROP_GRAPHIC), uno::makeAny( xGraphic )); xGraphicObjectProperties->setPropertyValue(rPropNameSupplier.GetName(PROP_ANCHOR_TYPE), uno::makeAny( m_pImpl->eGraphicImportType == IMPORT_AS_SHAPE || m_pImpl->eGraphicImportType == IMPORT_AS_DETECTED_ANCHOR ? text::TextContentAnchorType_AT_CHARACTER : text::TextContentAnchorType_AS_CHARACTER )); - m_xGraphicObject = uno::Reference< text::XTextContent >( xGraphicObjectProperties, uno::UNO_QUERY_THROW ); + xGraphicObject = uno::Reference< text::XTextContent >( xGraphicObjectProperties, uno::UNO_QUERY_THROW ); //shapes have only one border, PICF might have four table::BorderLine aBorderLine; @@ -2083,11 +2149,28 @@ void GraphicImport::data(const sal_uInt8* buf, size_t len, writerfilter::Referen } } } - catch( const uno::Exception& ) + catch( const uno::Exception& e ) { - clog << __FILE__ << __LINE__ << " failed!" << endl; + clog << __FILE__ << ":" << __LINE__ << " failed. Message :" ; + clog << rtl::OUStringToOString( e.Message, RTL_TEXTENCODING_UTF8 ).getStr( ) << endl; } + return xGraphicObject; +} +/*-- 01.11.2006 09:45:02--------------------------------------------------- + + -----------------------------------------------------------------------*/ +void GraphicImport::data(const sal_uInt8* buf, size_t len, writerfilter::Reference::Pointer_t /*ref*/) +{ + PropertyNameSupplier& rPropNameSupplier = PropertyNameSupplier::GetPropertyNameSupplier(); + + ::com::sun::star::beans::PropertyValues aMediaProperties( 1 ); + aMediaProperties[0].Name = rPropNameSupplier.GetName(PROP_INPUT_STREAM); + + uno::Reference< io::XInputStream > xIStream = new XInputStreamHelper( buf, len, m_pImpl->bIsBitmap ); + aMediaProperties[0].Value <<= xIStream; + + m_xGraphicObject = createGraphicObject( aMediaProperties ); } /*-- 01.11.2006 09:45:03--------------------------------------------------- @@ -2161,6 +2244,15 @@ void GraphicImport::substream(Id /*name*/, ::writerfilter::Reference::Po void GraphicImport::info(const string & /*info*/) { } + +void GraphicImport::startShape( ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > /*xShape*/ ) +{ +} + +void GraphicImport::endShape( ) +{ +} + /*-- 09.08.2007 10:17:00--------------------------------------------------- -----------------------------------------------------------------------*/ diff --git a/writerfilter/source/dmapper/GraphicImport.hxx b/writerfilter/source/dmapper/GraphicImport.hxx index 8318335b45f8..8e1558656507 100644 --- a/writerfilter/source/dmapper/GraphicImport.hxx +++ b/writerfilter/source/dmapper/GraphicImport.hxx @@ -51,12 +51,16 @@ namespace com{ namespace sun { namespace star { { class XShape; } + namespace beans + { + class PropertyValue; + typedef ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue > PropertyValues; + } }}} namespace writerfilter { namespace dmapper { -using namespace std; class GraphicImport_Impl; class DomainMapper; @@ -80,6 +84,9 @@ class WRITERFILTER_DLLPRIVATE GraphicImport : public Properties, public Table ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape> m_xShape; void ProcessShapeOptions(Value & val); + ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextContent > createGraphicObject( + const ::com::sun::star::beans::PropertyValues& aMediaProperties ); + public: explicit GraphicImport(::com::sun::star::uno::Reference < ::com::sun::star::uno::XComponentContext > xComponentContext, ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > xTextFactory, @@ -112,6 +119,8 @@ public: virtual void substream(Id name, ::writerfilter::Reference::Pointer_t ref); virtual void info(const string & info); + virtual void startShape( ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > xShape ); + virtual void endShape( ); ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextContent > GetGraphicObject(); bool IsGraphic() const; diff --git a/writerfilter/source/dmapper/ListTable.cxx b/writerfilter/source/dmapper/ListTable.cxx index 3d229486e7fd..9a4e19939df7 100644 --- a/writerfilter/source/dmapper/ListTable.cxx +++ b/writerfilter/source/dmapper/ListTable.cxx @@ -38,9 +38,12 @@ #include #endif #include +#include #include #include +#include #include +#include #include #define NUMBERING_MAX_LEVELS 10 @@ -139,6 +142,7 @@ class ListPropertyMap : public PropertyMap ::rtl::OUString sRGBXchNums; //LN_RGBXCHNUMS sal_Int32 nXChFollow; //LN_IXCHFOLLOW ::rtl::OUString sBulletChar; + sal_Int32 nTabstop; public: ListPropertyMap() : nIStartAt(-1) @@ -150,6 +154,7 @@ public: ,nFPrevSpace(-1) ,nFWord6(-1) ,nXChFollow(-1) + ,nTabstop( 0 ) {} ~ListPropertyMap(){} @@ -187,6 +192,8 @@ uno::Sequence< beans::PropertyValue > ListPropertyMap::GetPropertyValuesList( P if( nNumberFormat == style::NumberingType::CHAR_SPECIAL && sBulletChar.getLength() ) aNumberingProperties.push_back( MAKE_PROPVAL(PROP_BULLET_CHAR, sBulletChar.copy(0,1))); + aNumberingProperties.push_back( MAKE_PROPVAL( PROP_LISTTAB_STOP_POSITION, nTabstop ) ); + //TODO: handling of nFLegal? //TODO: nFNoRestart lower levels do not restart when higher levels are incremented, like: //1. @@ -215,6 +222,9 @@ uno::Sequence< beans::PropertyValue > ListPropertyMap::GetPropertyValuesList( P { switch( aMapIter->first.eId ) { + case PROP_ADJUST: + case PROP_INDENT_AT: + case PROP_FIRST_LINE_INDENT: case PROP_FIRST_LINE_OFFSET: case PROP_LEFT_MARGIN: aNumberingProperties.push_back( @@ -818,22 +828,27 @@ void ListTable::attribute(Id nName, Value & rVal) case NS_ooxml::LN_CT_Ind_left: /* WRITERFILTERSTATUS: done: 100, planned: 0.5, spent: 0 */ m_pImpl->m_pCurrentEntry->pCurrentProperties->Insert( - PROP_LEFT_MARGIN, true, uno::makeAny( ConversionHelper::convertTwipToMM100(nIntValue ) )); + PROP_INDENT_AT, true, uno::makeAny( ConversionHelper::convertTwipToMM100( nIntValue ) )); break; case NS_ooxml::LN_CT_Ind_hanging: /* WRITERFILTERSTATUS: done: 100, planned: 0.5, spent: 0 */ m_pImpl->m_pCurrentEntry->pCurrentProperties->Insert( - PROP_FIRST_LINE_OFFSET, true, uno::makeAny( - ConversionHelper::convertTwipToMM100(nIntValue ) )); + PROP_FIRST_LINE_INDENT, true, uno::makeAny( - ConversionHelper::convertTwipToMM100( nIntValue ) )); + break; + case NS_ooxml::LN_CT_Ind_firstLine: + /* WRITERFILTERSTATUS: done: 100, planned: 0.5, spent: 0 */ + m_pImpl->m_pCurrentEntry->pCurrentProperties->Insert( + PROP_FIRST_LINE_INDENT, true, uno::makeAny( ConversionHelper::convertTwipToMM100( nIntValue ) )); break; -// case NS_ooxml::LN_CT_Ind_firstLine: -// /* WRITERFILTERSTATUS: done: 100, planned: 0.5, spent: 0 */ -// m_pImpl->m_pCurrentEntry->pCurrentProperties->Insert( -// PROP_FIRST_LINE_OFFSET, true, uno::makeAny( ConversionHelper::convertTwipToMM100(nIntValue ) )); -// break; case NS_ooxml::LN_CT_Lvl_ilvl: //overrides previous level - unsupported case NS_ooxml::LN_CT_Lvl_tplc: //template code - unsupported case NS_ooxml::LN_CT_Lvl_tentative: //marks level as unused in the document - unsupported - case NS_ooxml::LN_CT_Ind_firstLine: //todo: first line indent in numbering not yet supported + break; + case NS_ooxml::LN_CT_TabStop_pos: + { + //no paragraph attributes in ListTable char style sheets + m_pImpl->m_pCurrentEntry->pCurrentProperties->nTabstop = ConversionHelper::convertTwipToMM100( nIntValue ); + } break; default: { @@ -955,7 +970,17 @@ void ListTable::sprm(Sprm & rSprm) } break; case NS_ooxml::LN_CT_Lvl_lvlJc: - //todo: ???? + { + static sal_Int16 aWWAlignments[ ] = + { + text::HoriOrientation::LEFT, + text::HoriOrientation::CENTER, + text::HoriOrientation::RIGHT + }; + m_pImpl->m_pCurrentEntry->pCurrentProperties->Insert( + PROP_ADJUST, true, uno::makeAny( aWWAlignments[ nIntValue ] ) ); + writerfilter::Reference::Pointer_t pProperties = rSprm.getProps(); + } break; case NS_ooxml::LN_CT_Lvl_pPr: case NS_ooxml::LN_CT_PPrBase_ind: @@ -967,7 +992,12 @@ void ListTable::sprm(Sprm & rSprm) } break; case NS_ooxml::LN_CT_PPrBase_tabs: - //no paragraph attributes in ListTable char style sheets + case NS_ooxml::LN_CT_Tabs_tab: + { + writerfilter::Reference::Pointer_t pProperties = rSprm.getProps(); + if(pProperties.get()) + pProperties->resolve(*this); + } break; case NS_ooxml::LN_CT_Lvl_suff: //todo: currently unsupported suffix @@ -1057,105 +1087,181 @@ sal_uInt32 ListTable::size() const { return m_pImpl->m_aListEntries.size(); } -/*-- 26.06.2006 10:33:56--------------------------------------------------- - -----------------------------------------------------------------------*/ -uno::Reference< container::XIndexReplace > ListTable::GetNumberingRules(sal_Int32 nListId) +rtl::OUString ListTable::GetStyleName( sal_Int32 nListId ) +{ + rtl::OUString sStyleName( rtl::OUString::createFromAscii( "WWNum" ) ); + sStyleName += rtl::OUString::valueOf( nListId + 1 ); + + return sStyleName; +} + +void ListTable::CreateNumberingRules( ) { uno::Reference< container::XIndexReplace > xRet; std::vector< ListEntryPtr >::const_iterator aIt = m_pImpl->m_aListEntries.begin(); std::vector< ListEntryPtr >::const_iterator aEndIt = m_pImpl->m_aListEntries.end(); + + uno::Reference< container::XNameContainer > xStyles; + + try + { + uno::Reference< style::XStyleFamiliesSupplier > xFamilies( m_pImpl->m_xFactory, uno::UNO_QUERY_THROW ); + uno::Any oFamily = xFamilies->getStyleFamilies( )->getByName( rtl::OUString::createFromAscii( "NumberingStyles" ) ); + + oFamily >>= xStyles; + } + catch ( const uno::Exception ) + { + } + for(; aIt != aEndIt; ++aIt) { - if((*aIt)->nListId == nListId) + if( !(*aIt)->m_xNumRules.is() && m_pImpl->m_xFactory.is() && xStyles.is( ) ) { - if( !(*aIt)->m_xNumRules.is() && m_pImpl->m_xFactory.is()) + try { - try + // Create the numbering style + uno::Reference< beans::XPropertySet > xStyle ( + m_pImpl->m_xFactory->createInstance( + ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.style.NumberingStyle"))), + uno::UNO_QUERY_THROW ); + + rtl::OUString sStyleName = GetStyleName( ( *aIt )->nListId ); +#if DEBUG + clog << "Creating numbering style: "; + clog << rtl::OUStringToOString( sStyleName, RTL_TEXTENCODING_UTF8 ).getStr( ); + clog << endl; +#endif + + xStyles->insertByName( sStyleName, makeAny( xStyle ) ); + + uno::Any oStyle = xStyles->getByName( sStyleName ); + xStyle.set( oStyle, uno::UNO_QUERY_THROW ); + + PropertyNameSupplier& aPropNameSupplier = PropertyNameSupplier::GetPropertyNameSupplier(); + uno::Any aRules = xStyle->getPropertyValue( aPropNameSupplier.GetName( PROP_NUMBERING_RULES ) ); + aRules >>= ( *aIt )->m_xNumRules; + + //now fill the numbering levels appropriately + ::std::vector< ListPropertyMapPtr >::const_iterator aIter = (*aIt)->aLevelProperties.begin(); + ::std::vector< ListPropertyMapPtr >::const_iterator aEnd = (*aIt)->aLevelProperties.end(); + sal_Int32 nLevel = 0; + while(aIter != aEnd) { - (*aIt)->m_xNumRules = uno::Reference< container::XIndexReplace >( - m_pImpl->m_xFactory->createInstance(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.text.NumberingRules"))), - uno::UNO_QUERY_THROW); - - //now fill the numbering levels appropriately - ::std::vector< ListPropertyMapPtr >::const_iterator aIter = (*aIt)->aLevelProperties.begin(); - ::std::vector< ListPropertyMapPtr >::const_iterator aEnd = (*aIt)->aLevelProperties.end(); - sal_Int32 nLevel = 0; - PropertyNameSupplier& aPropNameSupplier = PropertyNameSupplier::GetPropertyNameSupplier(); - while(aIter != aEnd) + PropertyValueVector_t aCharStyleProperties; + uno::Sequence< beans::PropertyValue> aValues = (*aIter)->GetPropertyValuesList(aCharStyleProperties); + if( aCharStyleProperties.size() ) { - PropertyValueVector_t aCharStyleProperties; - uno::Sequence< beans::PropertyValue> aValues = (*aIter)->GetPropertyValuesList(aCharStyleProperties); - if( aCharStyleProperties.size() ) - { - //create (or find) a character style containing the character attributes of the symbol - //and apply it to the numbering level - ::rtl::OUString sStyle = m_pImpl->m_rDMapper.getOrCreateCharStyle( aCharStyleProperties ); - aValues.realloc( aValues.getLength() + 1); - aValues[aValues.getLength() - 1].Name = aPropNameSupplier.GetName( PROP_CHAR_STYLE_NAME ); - aValues[aValues.getLength() - 1].Value <<= sStyle; - } - //now parse the text to find %n from %1 to %nLevel+1 - //everything before the first % and the last %x is prefix and suffix - ::rtl::OUString sLevelText( (*aIter)->sBulletChar ); - sal_Int32 nCurrentIndex = 0; - sal_Int32 nFound = sLevelText.indexOf( '%', nCurrentIndex ); - if( nFound > 0 ) - { - ::rtl::OUString sPrefix = sLevelText.copy( 0, nFound ); - aValues.realloc( aValues.getLength() + 1 ); - aValues[ aValues.getLength() - 1 ] = MAKE_PROPVAL(PROP_PREFIX, sPrefix); - sLevelText = sLevelText.copy( nFound ); - } - sal_Int32 nMinLevel = nLevel; - //now the text should either be empty or start with % - nFound = 0; - while( nFound >= 0 ) + //create (or find) a character style containing the character attributes of the symbol + //and apply it to the numbering level + ::rtl::OUString sStyle = m_pImpl->m_rDMapper.getOrCreateCharStyle( aCharStyleProperties ); + aValues.realloc( aValues.getLength() + 1); + aValues[aValues.getLength() - 1].Name = aPropNameSupplier.GetName( PROP_CHAR_STYLE_NAME ); + aValues[aValues.getLength() - 1].Value <<= sStyle; + } + //now parse the text to find %n from %1 to %nLevel+1 + //everything before the first % and the last %x is prefix and suffix + ::rtl::OUString sLevelText( (*aIter)->sBulletChar ); + sal_Int32 nCurrentIndex = 0; + sal_Int32 nFound = sLevelText.indexOf( '%', nCurrentIndex ); + if( nFound > 0 ) + { + ::rtl::OUString sPrefix = sLevelText.copy( 0, nFound ); + aValues.realloc( aValues.getLength() + 1 ); + aValues[ aValues.getLength() - 1 ] = MAKE_PROPVAL(PROP_PREFIX, sPrefix); + sLevelText = sLevelText.copy( nFound ); + } + sal_Int32 nMinLevel = nLevel; + //now the text should either be empty or start with % + nFound = 0; + while( nFound >= 0 ) + { + if( sLevelText.getLength() > 1 ) { - if( sLevelText.getLength() > 1 ) + sal_Unicode cLevel = sLevelText.getStr()[1]; + if( cLevel >= '1' && cLevel <= '9' ) { - sal_Unicode cLevel = sLevelText.getStr()[1]; - if( cLevel >= '1' && cLevel <= '9' ) - { - if( cLevel - '1' < nMinLevel ) - nMinLevel = cLevel - '1'; - //remove first char - next char is removed later - sLevelText = sLevelText.copy( 1 ); - } + if( cLevel - '1' < nMinLevel ) + nMinLevel = cLevel - '1'; + //remove first char - next char is removed later + sLevelText = sLevelText.copy( 1 ); } - //remove old '%' or number - sLevelText = sLevelText.copy( 1 ); - nCurrentIndex = 0; - nFound = sLevelText.indexOf( '%', nCurrentIndex ); - //remove the text before the next % - if(nFound > 0) - sLevelText = sLevelText.copy( nFound -1 ); - } - if( nMinLevel < nLevel ) - { - aValues.realloc( aValues.getLength() + 1); - aValues[ aValues.getLength() - 1 ] = - MAKE_PROPVAL(PROP_PARENT_NUMBERING, sal_Int16( nLevel - nMinLevel )); - } - if( sLevelText.getLength() ) - { - aValues.realloc( aValues.getLength() + 1); - aValues[ aValues.getLength() - 1 ] = MAKE_PROPVAL(PROP_SUFFIX, sLevelText); } + //remove old '%' or number + sLevelText = sLevelText.copy( 1 ); + nCurrentIndex = 0; + nFound = sLevelText.indexOf( '%', nCurrentIndex ); + //remove the text before the next % + if(nFound > 0) + sLevelText = sLevelText.copy( nFound -1 ); + } + if( nMinLevel < nLevel ) + { + aValues.realloc( aValues.getLength() + 1); + aValues[ aValues.getLength() - 1 ] = + MAKE_PROPVAL(PROP_PARENT_NUMBERING, sal_Int16( nLevel - nMinLevel + 1)); + } + aValues.realloc( aValues.getLength() + 1); + aValues[ aValues.getLength() - 1 ] = MAKE_PROPVAL(PROP_SUFFIX, sLevelText); - (*aIt)->m_xNumRules->replaceByIndex(nLevel, uno::makeAny(aValues)); + aValues.realloc( aValues.getLength() + 1); + aValues[ aValues.getLength() - 1 ] = MAKE_PROPVAL( PROP_POSITION_AND_SPACE_MODE, + sal_Int16( text::PositionAndSpaceMode::LABEL_ALIGNMENT ) ); - ++aIter; - ++nLevel; +#if DEBUG + clog << endl << "Numbering rule properties - " << nLevel << endl; + for ( sal_Int32 i = 0, len = aValues.getLength( ); i < len; i++ ) + { + beans::PropertyValue aVal = aValues[i]; + clog << " " << rtl::OUStringToOString( aVal.Name, RTL_TEXTENCODING_UTF8 ).getStr( ); + clog << ": "; + rtl::OUString sVal; + sal_Int32 nVal; + if ( aVal.Value >>= sVal ) + { + clog << rtl::OUStringToOString( sVal, RTL_TEXTENCODING_UTF8 ).getStr( ); } - + else if ( aVal.Value >>= nVal ) + { + clog << nVal; + } + clog << endl; } - catch( const uno::Exception& rEx) - { - (void)rEx; - OSL_ENSURE( false, "ListTable::GetNumberingRules"); +#endif + + (*aIt)->m_xNumRules->replaceByIndex(nLevel, uno::makeAny(aValues)); + ++aIter; + ++nLevel; } + + // Create the numbering style for these rules + rtl::OUString sNumRulesName = aPropNameSupplier.GetName( PROP_NUMBERING_RULES ); + xStyle->setPropertyValue( + sNumRulesName, + uno::makeAny( ( *aIt )->m_xNumRules ) ); + } + catch( const uno::Exception& rEx) + { + (void)rEx; + OSL_ENSURE( false, "ListTable::CreateNumberingRules"); } + } + } +} + +/*-- 26.06.2006 10:33:56--------------------------------------------------- + + -----------------------------------------------------------------------*/ +uno::Reference< container::XIndexReplace > ListTable::GetNumberingRules(sal_Int32 nListId) +{ + uno::Reference< container::XIndexReplace > xRet; + std::vector< ListEntryPtr >::const_iterator aIt = m_pImpl->m_aListEntries.begin(); + std::vector< ListEntryPtr >::const_iterator aEndIt = m_pImpl->m_aListEntries.end(); + for(; aIt != aEndIt; ++aIt) + { + if((*aIt)->nListId == nListId) + { xRet = (*aIt)->m_xNumRules; break; } diff --git a/writerfilter/source/dmapper/ListTable.hxx b/writerfilter/source/dmapper/ListTable.hxx index 97e5d1619953..2d0cf2e6bdce 100644 --- a/writerfilter/source/dmapper/ListTable.hxx +++ b/writerfilter/source/dmapper/ListTable.hxx @@ -78,6 +78,8 @@ public: // writerfilter::Reference::Pointer_t ref); sal_uInt32 size() const; + rtl::OUString GetStyleName( sal_Int32 nListId ); + void CreateNumberingRules( ); ::com::sun::star::uno::Reference< ::com::sun::star::container::XIndexReplace > GetNumberingRules(sal_Int32 nListId); diff --git a/writerfilter/source/dmapper/OLEHandler.cxx b/writerfilter/source/dmapper/OLEHandler.cxx index 67b692c3ade3..8f1501046418 100644 --- a/writerfilter/source/dmapper/OLEHandler.cxx +++ b/writerfilter/source/dmapper/OLEHandler.cxx @@ -29,6 +29,8 @@ ************************************************************************/ #include #include +#include "GraphicHelpers.hxx" + #include #include #include @@ -54,7 +56,8 @@ using namespace ::com::sun::star; -----------------------------------------------------------------------*/ OLEHandler::OLEHandler() : m_nDxaOrig(0), - m_nDyaOrig(0) + m_nDyaOrig(0), + m_nWrapMode(0) { } /*-- 23.04.2008 10:46:14--------------------------------------------------- @@ -108,15 +111,28 @@ void OLEHandler::attribute(Id rName, Value & rVal) rVal.getAny() >>= xTempShape; if( xTempShape.is() ) { - m_aShapeSize = xTempShape->getSize(); - m_aShapePosition = xTempShape->getPosition(); + m_xShape.set( xTempShape ); + try { + m_aShapeSize = xTempShape->getSize(); + m_aShapePosition = xTempShape->getPosition(); + uno::Reference< beans::XPropertySet > xShapeProps( xTempShape, uno::UNO_QUERY_THROW ); - xShapeProps->getPropertyValue( PropertyNameSupplier::GetPropertyNameSupplier().GetName( PROP_BITMAP ) ) >>= m_xReplacement; + PropertyNameSupplier& rNameSupplier = PropertyNameSupplier::GetPropertyNameSupplier(); + + xShapeProps->getPropertyValue( rNameSupplier.GetName( PROP_BITMAP ) ) >>= m_xReplacement; + + xShapeProps->setPropertyValue( + rNameSupplier.GetName( PROP_SURROUND ), + uno::makeAny( m_nWrapMode ) ); } - catch( const uno::Exception& ) + catch( const uno::Exception& e ) { +#if DEBUG + clog << "Exception in OLE Handler: "; + clog << rtl::OUStringToOString( e.Message, RTL_TEXTENCODING_UTF8 ).getStr( ) << endl; +#endif } } } @@ -142,8 +158,39 @@ void OLEHandler::sprm(Sprm & rSprm) } } break; + case NS_ooxml::LN_wrap_wrap: + { + writerfilter::Reference::Pointer_t pProperties = rSprm.getProps(); + if ( pProperties.get( ) ) + { + WrapHandlerPtr pHandler( new WrapHandler ); + pProperties->resolve( *pHandler ); + + m_nWrapMode = pHandler->getWrapMode( ); + + try + { + uno::Reference< beans::XPropertySet > xShapeProps( m_xShape, uno::UNO_QUERY_THROW ); + PropertyNameSupplier& rNameSupplier = PropertyNameSupplier::GetPropertyNameSupplier(); + + xShapeProps->setPropertyValue( + rNameSupplier.GetName( PROP_SURROUND ), + uno::makeAny( m_nWrapMode ) ); + } + catch( const uno::Exception& e ) + { +#if DEBUG + clog << "Exception in OLE Handler: "; + clog << rtl::OUStringToOString( e.Message, RTL_TEXTENCODING_UTF8 ).getStr( ) << endl; +#endif + } + } + } + break; default: + { OSL_ENSURE( false, "unknown attribute"); + } } } /*-- 23.04.2008 11:15:19--------------------------------------------------- @@ -152,9 +199,10 @@ void OLEHandler::sprm(Sprm & rSprm) ::rtl::OUString OLEHandler::copyOLEOStream( uno::Reference< text::XTextDocument > xTextDocument ) { ::rtl::OUString sRet; - if( !m_xInputStream.is() ) + if( !m_xInputStream.is( ) ) return sRet; - try{ + try + { uno::Reference < lang::XMultiServiceFactory > xFactory(xTextDocument, uno::UNO_QUERY_THROW); uno::Reference< document::XEmbeddedObjectResolver > xEmbeddedResolver( xFactory->createInstance( diff --git a/writerfilter/source/dmapper/OLEHandler.hxx b/writerfilter/source/dmapper/OLEHandler.hxx index 34b4a0316819..bdd94a802b7b 100644 --- a/writerfilter/source/dmapper/OLEHandler.hxx +++ b/writerfilter/source/dmapper/OLEHandler.hxx @@ -38,6 +38,8 @@ #include #include +#include + namespace com{ namespace sun{ namespace star{ namespace embed{ class XEmbeddedObject; @@ -72,6 +74,9 @@ class WRITERFILTER_DLLPRIVATE OLEHandler : public Properties sal_Int32 m_nDxaOrig; sal_Int32 m_nDyaOrig; + sal_Int32 m_nWrapMode; + + ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > m_xShape; ::com::sun::star::awt::Size m_aShapeSize; ::com::sun::star::awt::Point m_aShapePosition; @@ -87,6 +92,10 @@ public: virtual void attribute(Id Name, Value & val); virtual void sprm(Sprm & sprm); + inline ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > getShape( ) { return m_xShape; }; + + inline bool isOLEObject( ) { return m_xInputStream.is( ); }; + ::rtl::OUString copyOLEOStream( ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextDocument > xTextDocument ); ::com::sun::star::awt::Size getSize() const { return m_aShapeSize;} diff --git a/writerfilter/source/dmapper/PageBordersHandler.cxx b/writerfilter/source/dmapper/PageBordersHandler.cxx new file mode 100644 index 000000000000..725502843982 --- /dev/null +++ b/writerfilter/source/dmapper/PageBordersHandler.cxx @@ -0,0 +1,121 @@ +#include "PageBordersHandler.hxx" + +#include + +namespace writerfilter { +namespace dmapper { + +_PgBorder::_PgBorder( ) : + m_nDistance( 0 ), + m_ePos( BORDER_RIGHT ) +{ +} + +_PgBorder::~_PgBorder( ) +{ +} + +PageBordersHandler::PageBordersHandler( ) : + m_nDisplay( 0 ), + m_nOffset( 0 ) +{ +} + +PageBordersHandler::~PageBordersHandler( ) +{ +} + +void PageBordersHandler::attribute( Id eName, Value& rVal ) +{ + int nIntValue = rVal.getInt( ); + switch ( eName ) + { + case NS_ooxml::LN_CT_PageBorders_display: + { + switch ( nIntValue ) + { + default: + case NS_ooxml::LN_Value_wordprocessingml_ST_PageBorderDisplay_allPages: + m_nDisplay = 0; + break; + case NS_ooxml::LN_Value_wordprocessingml_ST_PageBorderDisplay_firstPage: + m_nDisplay = 1; + break; + case NS_ooxml::LN_Value_wordprocessingml_ST_PageBorderDisplay_notFirstPage: + m_nDisplay = 2; + break; + } + } + break; + case NS_ooxml::LN_CT_PageBorders_offsetFrom: + { + switch ( nIntValue ) + { + default: + case NS_ooxml::LN_Value_wordprocessingml_ST_PageBorderOffset_page: + m_nOffset = 1; + break; + case NS_ooxml::LN_Value_wordprocessingml_ST_PageBorderOffset_text: + m_nOffset = 0; + break; + } + } + break; + default:; + } +} + +void PageBordersHandler::sprm( Sprm& rSprm ) +{ + switch ( rSprm.getId( ) ) + { + case NS_ooxml::LN_CT_PageBorders_top: + case NS_ooxml::LN_CT_PageBorders_left: + case NS_ooxml::LN_CT_PageBorders_bottom: + case NS_ooxml::LN_CT_PageBorders_right: + { + writerfilter::Reference::Pointer_t pProperties = rSprm.getProps(); + if( pProperties.get()) + { + BorderHandlerPtr pBorderHandler( new BorderHandler( true ) ); + pProperties->resolve(*pBorderHandler); + BorderPosition ePos = BorderPosition( 0 ); + switch( rSprm.getId( ) ) + { + case NS_ooxml::LN_CT_PageBorders_top: + ePos = BORDER_TOP; + break; + case NS_ooxml::LN_CT_PageBorders_left: + ePos = BORDER_LEFT; + break; + case NS_ooxml::LN_CT_PageBorders_bottom: + ePos = BORDER_BOTTOM; + break; + case NS_ooxml::LN_CT_PageBorders_right: + ePos = BORDER_RIGHT; + break; + default:; + } + + _PgBorder aPgBorder; + aPgBorder.m_rLine = pBorderHandler->getBorderLine( ); + aPgBorder.m_nDistance = pBorderHandler->getLineDistance( ); + aPgBorder.m_ePos = ePos; + m_aBorders.push_back( aPgBorder ); + } + } + break; + default:; + } +} + +void PageBordersHandler::SetBorders( SectionPropertyMap* pSectContext ) +{ + for ( int i = 0, length = m_aBorders.size( ); i < length; i++ ) + { + _PgBorder aBorder = m_aBorders[i]; + pSectContext->SetBorder( aBorder.m_ePos, aBorder.m_nDistance, aBorder.m_rLine ); + } +} + +} } diff --git a/writerfilter/source/dmapper/PageBordersHandler.hxx b/writerfilter/source/dmapper/PageBordersHandler.hxx new file mode 100644 index 000000000000..327ccfc4f8d6 --- /dev/null +++ b/writerfilter/source/dmapper/PageBordersHandler.hxx @@ -0,0 +1,57 @@ +#ifndef INCLUDED_PAGEBORDERSHANDLER_HXX +#define INCLUDED_PAGEBORDERSHANDLER_HXX + +#include "BorderHandler.hxx" +#include "PropertyMap.hxx" + +#include +#include +#include + +#include + +#include + + +namespace writerfilter { +namespace dmapper { + +class _PgBorder +{ +public: + com::sun::star::table::BorderLine m_rLine; + sal_Int32 m_nDistance; + BorderPosition m_ePos; + + _PgBorder( ); + ~_PgBorder( ); +}; + +class WRITERFILTER_DLLPRIVATE PageBordersHandler : public Properties +{ +private: + + // See implementation of SectionPropertyMap::ApplyBorderToPageStyles + sal_Int32 m_nDisplay; + sal_Int32 m_nOffset; + vector<_PgBorder> m_aBorders; + +public: + PageBordersHandler( ); + ~PageBordersHandler( ); + + // Properties + virtual void attribute( Id eName, Value& rVal ); + virtual void sprm( Sprm& rSprm ); + + inline sal_Int32 GetDisplayOffset( ) + { + return ( m_nOffset << 5 ) + m_nDisplay; + }; + void SetBorders( SectionPropertyMap* pSectContext ); +}; +typedef boost::shared_ptr< PageBordersHandler > PageBordersHandlerPtr; + +} } + +#endif diff --git a/writerfilter/source/dmapper/PropertyIds.cxx b/writerfilter/source/dmapper/PropertyIds.cxx index f74cb574ff97..bc76be7d8ecf 100644 --- a/writerfilter/source/dmapper/PropertyIds.cxx +++ b/writerfilter/source/dmapper/PropertyIds.cxx @@ -315,9 +315,12 @@ const rtl::OUString& PropertyNameSupplier::GetName( PropertyIds eId ) const case PROP_STREAM_NAME: sName = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("StreamName")); break; case PROP_BITMAP : sName = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Bitmap")); break; case PROP_IS_DATE : sName = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("IsDate")); break; -// case : sName = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("")); break; -// case : sName = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("")); break; -// case : sName = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("")); break; + case PROP_CNF_STYLE : sName = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("CnfStyle")); break; + case PROP_INDENT_AT : sName = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("IndentAt")); break; + case PROP_FIRST_LINE_INDENT : sName = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("FirstLineIndent")); break; + case PROP_NUMBERING_STYLE_NAME : sName = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("NumberingStyleName")); break; + case PROP_LISTTAB_STOP_POSITION : sName = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ListtabStopPosition")); break; + case PROP_POSITION_AND_SPACE_MODE : sName = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("PositionAndSpaceMode")); break; // case : sName = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("")); break; // case : sName = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("")); break; // case : sName = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("")); break; diff --git a/writerfilter/source/dmapper/PropertyIds.hxx b/writerfilter/source/dmapper/PropertyIds.hxx index c9acac71e280..cdbcf758b579 100644 --- a/writerfilter/source/dmapper/PropertyIds.hxx +++ b/writerfilter/source/dmapper/PropertyIds.hxx @@ -278,6 +278,12 @@ enum PropertyIds /*239*/ ,PROP_STREAM_NAME /*240*/ ,PROP_BITMAP /*241*/ ,PROP_IS_DATE +/*242*/ ,PROP_CNF_STYLE +/*243*/ ,PROP_INDENT_AT +/*244*/ ,PROP_FIRST_LINE_INDENT +/*245*/ ,PROP_NUMBERING_STYLE_NAME +/*246*/ ,PROP_LISTTAB_STOP_POSITION +/*247*/ ,PROP_POSITION_AND_SPACE_MODE }; struct PropertyNameSupplier_Impl; class PropertyNameSupplier diff --git a/writerfilter/source/dmapper/PropertyMap.cxx b/writerfilter/source/dmapper/PropertyMap.cxx index f39338eca908..3e2f0752fc52 100644 --- a/writerfilter/source/dmapper/PropertyMap.cxx +++ b/writerfilter/source/dmapper/PropertyMap.cxx @@ -176,6 +176,7 @@ void PropertyMap::insertTableProperties( const PropertyMap* ) -----------------------------------------------------------------------*/ SectionPropertyMap::SectionPropertyMap(bool bIsFirstSection) : m_bIsFirstSection( bIsFirstSection ) + ,m_nBorderParams( 0 ) ,m_bTitlePage( false ) ,m_nColumnCount( 0 ) ,m_nColumnDistance( 1249 ) @@ -377,21 +378,6 @@ void SectionPropertyMap::ApplyBorderToPageStyles( sal_Int32 nOffsetFrom = (nValue & 0x00E0) >> 5; //sal_Int32 bPageDepth = (nValue & 0x0018) >> 3; //unused infromation: 0 - in front 1 - in back //todo: negative spacing (from ww8par6.cxx) - if( nOffsetFrom == 1 ) - { -// USHORT nDist; -// if (aBox.GetLeft()) -// { -// nDist = aBox.GetDistance(BOX_LINE_LEFT); -// lcl_MakeSafeNegativeSpacing( ) sets the distance to 0 if > SHRT_MAX -// -// aBox.SetDistance(lcl_MakeSafeNegativeSpacing(static_cast(aLR.GetLeft() - nDist)), BOX_LINE_LEFT); -// aSizeArray[WW8_LEFT] = -// aSizeArray[WW8_LEFT] - nDist + aBox.GetDistance(BOX_LINE_LEFT); -// } - //the same for right, top, bottom - - } switch( nValue & 0x07) { case 0: /*all styles*/ @@ -422,8 +408,16 @@ void SectionPropertyMap::ApplyBorderToPageStyles( PROP_LEFT_BORDER_DISTANCE, PROP_RIGHT_BORDER_DISTANCE, PROP_TOP_BORDER_DISTANCE, - PROP_BOTTOM_BORDER_DISTANCE, + PROP_BOTTOM_BORDER_DISTANCE }; + static const PropertyIds aMarginIds[4] = + { + PROP_LEFT_MARGIN, + PROP_RIGHT_MARGIN, + PROP_TOP_MARGIN, + PROP_BOTTOM_MARGIN + }; + PropertyNameSupplier& rPropNameSupplier = PropertyNameSupplier::GetPropertyNameSupplier(); for( sal_Int32 nBorder = 0; nBorder < 4; ++nBorder) { @@ -436,19 +430,38 @@ void SectionPropertyMap::ApplyBorderToPageStyles( } if( m_nBorderDistances[nBorder] >= 0 ) { - const ::rtl::OUString sBorderDistanceName = rPropNameSupplier.GetName( aBorderDistanceIds[nBorder] ); - xFirst->setPropertyValue( sBorderDistanceName, uno::makeAny( m_nBorderDistances[nBorder] )); + SetBorderDistance( xFirst, aMarginIds[nBorder], aBorderDistanceIds[nBorder], + m_nBorderDistances[nBorder], nOffsetFrom ); if(xSecond.is()) - xSecond->setPropertyValue( sBorderDistanceName, uno::makeAny( m_nBorderDistances[nBorder] )); + SetBorderDistance( xSecond, aMarginIds[nBorder], aBorderDistanceIds[nBorder], + m_nBorderDistances[nBorder], nOffsetFrom ); } } +} + +void SectionPropertyMap::SetBorderDistance( uno::Reference< beans::XPropertySet > xStyle, + PropertyIds eMarginId, PropertyIds eDistId, sal_Int32 nDistance, sal_Int32 nOffsetFrom ) +{ + PropertyNameSupplier& rPropNameSupplier = PropertyNameSupplier::GetPropertyNameSupplier(); -// rContext->Insert( aBorderIds[nId - 0x702B], uno::makeAny( aBorderLine )); -// rContext->Insert( aBorderDistanceIds[nId - 0x702B], uno::makeAny( nLineDistance) ); + sal_Int32 nDist = nDistance; + if( nOffsetFrom == 1 ) + { + const ::rtl::OUString sMarginName = rPropNameSupplier.GetName( eMarginId ); + uno::Any aMargin = xStyle->getPropertyValue( sMarginName ); + sal_Int32 nMargin = 0; + aMargin >>= nMargin; -// uno::Reference< beans::XPropertySet > xStyle = GetPageStyle( ePageType ); + // Change the margins with the border distance + xStyle->setPropertyValue( sMarginName, uno::makeAny( nDistance ) ); + // Set the distance to ( Margin - distance ) + nDist = nMargin - nDistance; + } + const ::rtl::OUString sBorderDistanceName = rPropNameSupplier.GetName( eDistId ); + xStyle->setPropertyValue( sBorderDistanceName, uno::makeAny( nDist )); } + /*-- 14.12.2006 12:50:06--------------------------------------------------- -----------------------------------------------------------------------*/ @@ -726,8 +739,8 @@ void SectionPropertyMap::CloseSectionGroup( DomainMapper_Impl& rDM_Impl ) sal_Int32 nCharWidth = 423; //240 twip/ 12 pt //todo: is '0' the right index here? - const StyleSheetEntry* pEntry = rDM_Impl.GetStyleSheetTable()->FindStyleSheetByISTD(::rtl::OUString::valueOf(static_cast(0), 16)); - if( pEntry ) + const StyleSheetEntryPtr pEntry = rDM_Impl.GetStyleSheetTable()->FindStyleSheetByISTD(::rtl::OUString::valueOf(static_cast(0), 16)); + if( pEntry.get( ) ) { PropertyMap::iterator aElement_ = pEntry->pProperties->find(PropertyDefinition( PROP_CHAR_HEIGHT_ASIAN, false )); if( aElement_ != pEntry->pProperties->end()) @@ -766,6 +779,7 @@ void SectionPropertyMap::CloseSectionGroup( DomainMapper_Impl& rDM_Impl ) uno::Reference< beans::XPropertySet > xFirstPageStyle = GetPageStyle( rDM_Impl.GetPageStyles(), rDM_Impl.GetTextFactory(), true ); _ApplyProperties( xFirstPageStyle ); + sal_Int32 nPaperBin = m_nFirstPaperBin >= 0 ? m_nFirstPaperBin : m_nPaperBin >= 0 ? m_nPaperBin : 0; if( nPaperBin ) xFollowPageStyle->setPropertyValue( sTrayIndex, uno::makeAny( nPaperBin ) ); @@ -773,6 +787,9 @@ void SectionPropertyMap::CloseSectionGroup( DomainMapper_Impl& rDM_Impl ) xFollowPageStyle->setPropertyValue( rPropNameSupplier.GetName( PROP_TEXT_COLUMNS ), uno::makeAny( xColumns )); } + + ApplyBorderToPageStyles( rDM_Impl.GetPageStyles( ), rDM_Impl.GetTextFactory( ), m_nBorderParams ); + try { // if( m_xStartingRange.is() ) @@ -877,7 +894,8 @@ StyleSheetPropertyMap::StyleSheetPropertyMap() : mbCT_TblWidth_wSet( false ), mbCT_TblWidth_typeSet( false ), mnListId( -1 ), - mnListLevel( -1 ) + mnListLevel( -1 ), + mnOutlineLevel( -1 ) { } /*-- 14.06.2007 13:57:43--------------------------------------------------- diff --git a/writerfilter/source/dmapper/PropertyMap.hxx b/writerfilter/source/dmapper/PropertyMap.hxx index 2b46d5ddef5b..1e30a018b721 100644 --- a/writerfilter/source/dmapper/PropertyMap.hxx +++ b/writerfilter/source/dmapper/PropertyMap.hxx @@ -158,6 +158,7 @@ class SectionPropertyMap : public PropertyMap ::com::sun::star::table::BorderLine* m_pBorderLines[4]; sal_Int32 m_nBorderDistances[4]; + sal_Int32 m_nBorderParams; bool m_bTitlePage; sal_Int16 m_nColumnCount; @@ -202,6 +203,9 @@ class SectionPropertyMap : public PropertyMap bool HasHeader( bool bFirstPage ) const; bool HasFooter( bool bFirstPage ) const; + void SetBorderDistance( ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > xStyle, + PropertyIds eMarginId, PropertyIds eDistId, sal_Int32 nDistance, sal_Int32 nOffsetFrom ); + public: explicit SectionPropertyMap(bool bIsFirstSection); ~SectionPropertyMap(); @@ -227,6 +231,7 @@ public: bool bFirst ); void SetBorder( BorderPosition ePos, sal_Int32 nLineDistance, const ::com::sun::star::table::BorderLine& rBorderLine ); + void SetBorderParams( sal_Int32 nSet ) { m_nBorderParams = nSet; } void SetColumnCount( sal_Int16 nCount ) { m_nColumnCount = nCount; } void SetColumnDistance( sal_Int32 nDist ) { m_nColumnDistance = nDist; } @@ -376,6 +381,9 @@ typedef boost::shared_ptr ParagraphPropertiesPtr; /*-- 14.06.2007 12:12:34--------------------------------------------------- property map of a stylesheet -----------------------------------------------------------------------*/ + +#define WW_OUTLINE_MAX sal_Int16( 9 ) + class StyleSheetPropertyMap : public PropertyMap, public ParagraphProperties { @@ -405,6 +413,8 @@ class StyleSheetPropertyMap : public PropertyMap, public ParagraphProperties sal_Int32 mnListId; sal_Int16 mnListLevel; + + sal_Int16 mnOutlineLevel; public: explicit StyleSheetPropertyMap(); ~StyleSheetPropertyMap(); @@ -479,6 +489,12 @@ public: sal_Int16 GetListLevel() const { return mnListLevel; } void SetListLevel(sal_Int16 nLevel) { mnListLevel = nLevel; } + sal_Int16 GetOutlineLevel() const { return mnOutlineLevel; } + void SetOutlineLevel(sal_Int16 nLevel) + { + if ( nLevel < WW_OUTLINE_MAX ) + mnOutlineLevel = nLevel; + } }; /*-- 27.12.2007 12:38:06--------------------------------------------------- diff --git a/writerfilter/source/dmapper/SettingsTable.cxx b/writerfilter/source/dmapper/SettingsTable.cxx new file mode 100644 index 000000000000..dd5796a22ceb --- /dev/null +++ b/writerfilter/source/dmapper/SettingsTable.cxx @@ -0,0 +1,87 @@ +#include "SettingsTable.hxx" + +#include + +#include +#include + +#if DEBUG +#include +#endif + +using namespace com::sun::star; +using namespace rtl; + +namespace writerfilter { +namespace dmapper { + +SettingsTable_Impl::SettingsTable_Impl( ) : + m_bRecordChanges( false ) +{ +} + +SettingsTable_Impl::~SettingsTable_Impl( ) +{ +} + +SettingsTable::SettingsTable( ) : + m_pImpl( new SettingsTable_Impl ) +{ +} + +SettingsTable::~SettingsTable( ) +{ + delete m_pImpl, m_pImpl = NULL; +} + +void SettingsTable::attribute( Id /*nName*/, Value& /*rVal*/ ) +{ +#if DEBUG + clog << "SettingsTable::attribute( )" << endl; +#endif +} + +void SettingsTable::sprm( Sprm& rSprm ) +{ + switch ( rSprm.getId( ) ) + { + case NS_ooxml::LN_CT_Settings_trackRevisions: + { + m_pImpl->m_bRecordChanges = bool(rSprm.getValue( )->getInt( ) ); + } + break; + default: + { +#if DEBUG + clog << __FILE__ << ":" << __LINE__; + clog << ": unknown SPRM: " << rSprm.getName( ) << endl; +#endif + } + } +} + +void SettingsTable::entry( int nPos, writerfilter::Reference::Pointer_t pRef ) +{ + (void)nPos; +#if DEBUG + fprintf( stderr, "SettingsTable::entry( ), pos: %d\n", nPos ); +#endif + pRef->resolve( *this ); +} + +void SettingsTable::resolveSprmProps( Sprm& rSprm ) +{ + writerfilter::Reference::Pointer_t pProperties = rSprm.getProps(); + if( pProperties.get()) + pProperties->resolve(*this); +} + +void SettingsTable::ApplyProperties( uno::Reference< text::XTextDocument > xDoc ) +{ + uno::Reference< beans::XPropertySet> xDocProps( xDoc, uno::UNO_QUERY ); + + // Record changes value + xDocProps->setPropertyValue( OUString::createFromAscii( "RecordChanges" ), uno::makeAny( m_pImpl->m_bRecordChanges ) ); +} + +} } diff --git a/writerfilter/source/dmapper/SettingsTable.hxx b/writerfilter/source/dmapper/SettingsTable.hxx new file mode 100644 index 000000000000..fb5ba5a8b010 --- /dev/null +++ b/writerfilter/source/dmapper/SettingsTable.hxx @@ -0,0 +1,46 @@ +#ifndef INCLUDED_SETTINGSTABLE_HXX +#define INCLUDED_SETTINGSTABLE_HXX + +#include +#include + +#include + +namespace writerfilter { +namespace dmapper +{ + +struct SettingsTable_Impl +{ +public: + bool m_bRecordChanges; + + SettingsTable_Impl( ); + ~SettingsTable_Impl( ); +}; + +class WRITERFILTER_DLLPRIVATE SettingsTable: public Properties, public Table +{ +public: + SettingsTable_Impl* m_pImpl; + + SettingsTable( ); + ~SettingsTable( ); + + // Properties + virtual void attribute(Id Name, Value & val); + virtual void sprm(Sprm & sprm); + + // Table + virtual void entry(int pos, writerfilter::Reference::Pointer_t ref); + + void resolveSprmProps( Sprm& rSprm ); + + void ApplyProperties( com::sun::star::uno::Reference< com::sun::star::text::XTextDocument > xDoc ); +}; +typedef boost::shared_ptr< SettingsTable > SettingsTablePtr; + + +} } + +#endif diff --git a/writerfilter/source/dmapper/StyleSheetTable.cxx b/writerfilter/source/dmapper/StyleSheetTable.cxx index ae290c00698d..c42651b21881 100644 --- a/writerfilter/source/dmapper/StyleSheetTable.cxx +++ b/writerfilter/source/dmapper/StyleSheetTable.cxx @@ -30,6 +30,7 @@ #include #include #include +#include #include #include #include @@ -38,6 +39,7 @@ #include #include #include +#include #include #include #include @@ -70,6 +72,175 @@ StyleSheetEntry::StyleSheetEntry() : { } +TableStyleSheetEntry::TableStyleSheetEntry( StyleSheetEntry& rEntry, StyleSheetTable* pStyles ): + StyleSheetEntry( ), + m_pStyleSheet( pStyles ) +{ + bIsDefaultStyle = rEntry.bIsDefaultStyle; + bInvalidHeight = rEntry.bInvalidHeight; + bHasUPE = rEntry.bHasUPE; + nStyleTypeCode = STYLE_TYPE_TABLE; + sBaseStyleIdentifier = rEntry.sBaseStyleIdentifier; + sNextStyleIdentifier = rEntry.sNextStyleIdentifier; + sStyleName = rEntry.sStyleName; + sStyleName1 = rEntry.sStyleName1; + + m_nColBandSize = 1; + m_nRowBandSize = 1; +} + +TableStyleSheetEntry::~TableStyleSheetEntry( ) +{ + m_pStyleSheet = NULL; +} + +void TableStyleSheetEntry::AddTblStylePr( TblStyleType nType, PropertyMapPtr pProps ) +{ + static TblStyleType pTypesToFix[] = + { + TBL_STYLE_FIRSTROW, + TBL_STYLE_LASTROW, + TBL_STYLE_FIRSTCOL, + TBL_STYLE_LASTCOL + }; + + static PropertyIds pPropsToCheck[] = + { + PROP_BOTTOM_BORDER, + PROP_TOP_BORDER, + PROP_RIGHT_BORDER, + PROP_LEFT_BORDER + }; + + int i = 0; + while ( i < 4 ) + { + if ( nType == pTypesToFix[i] ) + { + PropertyIds nChecked = pPropsToCheck[i]; + PropertyMap::iterator pCheckedIt = pProps->find( PropertyDefinition( nChecked, false ) ); + + PropertyIds nInsideProp = ( i < 2 ) ? META_PROP_HORIZONTAL_BORDER : META_PROP_VERTICAL_BORDER; + PropertyMap::iterator pInsideIt = pProps->find( PropertyDefinition( nInsideProp, false ) ); + + bool bHasChecked = pCheckedIt != pProps->end( ); + bool bHasInside = pInsideIt != pProps->end( ); + + if ( bHasChecked && bHasInside ) + { + // In this case, remove the inside border + pProps->erase( pInsideIt ); + } + + i = 4; // Stop looping stupidly + } + i++; + } + + // Append the tblStylePr + m_aStyles[nType] = pProps; +} + +PropertyMapPtr TableStyleSheetEntry::GetProperties( sal_Int32 nMask ) +{ + PropertyMapPtr pProps( new PropertyMap ); + + // First get the parent properties + StyleSheetEntryPtr pEntry = m_pStyleSheet->FindParentStyleSheet( sBaseStyleIdentifier ); + + if ( pEntry.get( ) ) + { + TableStyleSheetEntry* pParent = static_cast( pEntry.get( ) ); + pProps->insert( pParent->GetProperties( nMask ) ); + } + + // And finally get the mask ones + pProps->insert( GetLocalPropertiesFromMask( nMask ) ); + + return pProps; +} + +void lcl_mergeProps( PropertyMapPtr pToFill, PropertyMapPtr pToAdd, TblStyleType nStyleId ) +{ + static PropertyIds pPropsToCheck[] = + { + PROP_BOTTOM_BORDER, + PROP_TOP_BORDER, + PROP_RIGHT_BORDER, + PROP_LEFT_BORDER, + }; + + bool pRemoveInside[] = + { + ( nStyleId == TBL_STYLE_FIRSTROW ), + ( nStyleId == TBL_STYLE_LASTROW ), + ( nStyleId == TBL_STYLE_LASTCOL ), + ( nStyleId == TBL_STYLE_FIRSTCOL ) + }; + + for ( int i = 0 ; i < 7; i++ ) + { + PropertyIds nId = pPropsToCheck[i]; + PropertyDefinition aProp( nId, false ); + PropertyMap::iterator pIt = pToAdd->find( aProp ); + + if ( pIt != pToAdd->end( ) ) + { + PropertyMap::iterator pDestIt = pToFill->find( aProp ); + + if ( pRemoveInside[i] ) + { + // Remove the insideH and insideV depending on the cell pos + PropertyIds nInsideProp = ( i < 2 ) ? META_PROP_HORIZONTAL_BORDER : META_PROP_VERTICAL_BORDER; + pDestIt = pToFill->find( PropertyDefinition( nInsideProp, false ) ); + if ( pDestIt != pToFill->end( ) ) + pToFill->erase( pDestIt ); + } + } + } + + pToFill->insert( pToAdd ); +} + +PropertyMapPtr TableStyleSheetEntry::GetLocalPropertiesFromMask( sal_Int32 nMask ) +{ + // Order from right to left + static TblStyleType aBitsOrder[] = + { + TBL_STYLE_SWCELL, + TBL_STYLE_SECELL, + TBL_STYLE_NWCELL, + TBL_STYLE_NECELL, + TBL_STYLE_BAND2HORZ, + TBL_STYLE_BAND1HORZ, + TBL_STYLE_BAND2VERT, + TBL_STYLE_BAND1VERT, + TBL_STYLE_LASTCOL, + TBL_STYLE_FIRSTCOL, + TBL_STYLE_LASTROW, + TBL_STYLE_FIRSTROW + }; + + // Get the properties applying according to the mask + PropertyMapPtr pProps( new PropertyMap( ) ); + short nBit = 0; + do + { + TblStyleType nStyleId = aBitsOrder[nBit]; + TblStylePrs::iterator pIt = m_aStyles.find( nStyleId ); + + short nTestBit = 1 << nBit; + sal_Int32 nBitMask = sal_Int32( nTestBit ); + if ( ( nMask & nBitMask ) && ( pIt != m_aStyles.end( ) ) ) + lcl_mergeProps( pProps, pIt->second, nStyleId ); + + nBit++; + } + while ( nBit < 12 ); + + return pProps; +} + /*-- 06.02.2008 11:30:46--------------------------------------------------- -----------------------------------------------------------------------*/ @@ -92,8 +263,8 @@ struct StyleSheetTable_Impl DomainMapper& m_rDMapper; uno::Reference< text::XTextDocument> m_xTextDocument; uno::Reference< beans::XPropertySet> m_xTextDefaults; - std::vector< StyleSheetEntry > m_aStyleSheetEntries; - StyleSheetEntry *m_pCurrentEntry; + std::vector< StyleSheetEntryPtr > m_aStyleSheetEntries; + StyleSheetEntryPtr m_pCurrentEntry; PropertyMapPtr m_pDefaultParaProps, m_pDefaultCharProps; PropertyMapPtr m_pCurrentProps; StringPairMap_t m_aStyleNameMap; @@ -110,7 +281,7 @@ struct StyleSheetTable_Impl StyleSheetTable_Impl::StyleSheetTable_Impl(DomainMapper& rDMapper, uno::Reference< text::XTextDocument> xTextDocument ) : m_rDMapper( rDMapper ), m_xTextDocument( xTextDocument ), - m_pCurrentEntry(0), + m_pCurrentEntry(), m_pDefaultParaProps(new PropertyMap), m_pDefaultCharProps(new PropertyMap) { @@ -659,13 +830,23 @@ void StyleSheetTable::attribute(Id Name, Value & val) // case NS_rtf::LN_STYLESHEET: break; /* WRITERFILTERSTATUS: done: 100, planned: 0, spent: 0 */ case NS_ooxml::LN_CT_Style_type: + { /* defaults should be set at the service "com.sun.star.text.Defaults" if (nIntValue == 1) *(m_pImpl->m_pCurrentEntry->pProperties) = *(m_pImpl->m_pDefaultParaProps); else if (nIntValue == 2) *(m_pImpl->m_pCurrentEntry->pProperties) = *(m_pImpl->m_pDefaultCharProps);*/ - m_pImpl->m_pCurrentEntry->nStyleTypeCode = (StyleType)nIntValue; + StyleType nType = ( StyleType ) nIntValue; + if ( nType == STYLE_TYPE_TABLE ) + { + StyleSheetEntryPtr pEntry = m_pImpl->m_pCurrentEntry; + TableStyleSheetEntryPtr pTableEntry( new TableStyleSheetEntry( *pEntry.get( ), this ) ); + m_pImpl->m_pCurrentEntry = pTableEntry; + } + else + m_pImpl->m_pCurrentEntry->nStyleTypeCode = (StyleType)nIntValue; break; + } /* WRITERFILTERSTATUS: done: 100, planned: 0, spent: 0 */ case NS_ooxml::LN_CT_Style_default: m_pImpl->m_pCurrentEntry->bIsDefaultStyle = (nIntValue != 0); @@ -753,13 +934,28 @@ void StyleSheetTable::sprm(Sprm & rSprm) case NS_ooxml::LN_CT_Style_rsid: /* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */ case NS_ooxml::LN_CT_Style_trPr: - /* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */ - case NS_ooxml::LN_CT_Style_tcPr: break; /* WRITERFILTERSTATUS: done: 100, planned: 0, spent: 0 */ - case NS_ooxml::LN_CT_Style_tblPr: //contains table properties - /* WRITERFILTERSTATUS: done: 100, planned: 0, spent: 0 */ case NS_ooxml::LN_CT_Style_tblStylePr: //contains to table properties + { + writerfilter::Reference::Pointer_t pProperties = rSprm.getProps(); + if( pProperties.get()) + { + TblStylePrHandlerPtr pTblStylePrHandler( new TblStylePrHandler( m_pImpl->m_rDMapper ) ); + pProperties->resolve( *pTblStylePrHandler ); + + // Add the properties to the table style + TblStyleType nType = pTblStylePrHandler->getType( ); + PropertyMapPtr pProps = pTblStylePrHandler->getProperties( ); + StyleSheetEntryPtr pEntry = m_pImpl->m_pCurrentEntry; + TableStyleSheetEntry* pTableEntry = static_cast( pEntry.get( ) ); + pTableEntry->AddTblStylePr( nType, pProps ); + } + break; + } + case NS_ooxml::LN_CT_Style_tcPr: + /* WRITERFILTERSTATUS: done: 100, planned: 0, spent: 0 */ + case NS_ooxml::LN_CT_Style_tblPr: //contains table properties /* WRITERFILTERSTATUS: done: 100, planned: 0, spent: 0 */ case NS_ooxml::LN_CT_DocDefaults_pPrDefault: /* WRITERFILTERSTATUS: done: 100, planned: 0, spent: 0 */ @@ -805,14 +1001,35 @@ void StyleSheetTable::sprm(Sprm & rSprm) } } break; - /* WRITERFILTERSTATUS: done: 100, planned: 0, spent: 0 */ + case NS_ooxml::LN_CT_TblPrBase_tblStyleRowBandSize: + case NS_ooxml::LN_CT_TblPrBase_tblStyleColBandSize: + { + StyleSheetEntry* pEntry = m_pImpl->m_pCurrentEntry.get( ); + TableStyleSheetEntry *pTEntry = static_cast( pEntry ); + if ( pTEntry ) + { + if ( nSprmId == NS_ooxml::LN_CT_TblPrBase_tblStyleRowBandSize ) + pTEntry->m_nRowBandSize = nIntValue; + else + pTEntry->m_nColBandSize = nIntValue; + } + } + break; + /* WRITERFILTERSTATUS: done: 100, planned: 0, spent: 0 */ case NS_ooxml::LN_CT_Style_pPr: /* WRITERFILTERSTATUS: done: 100, planned: 0, spent: 0 */ case NS_ooxml::LN_CT_Style_rPr: default: if (!m_pImpl->m_pCurrentEntry) break; - m_pImpl->m_rDMapper.sprm( rSprm, m_pImpl->m_pCurrentEntry->pProperties ); + TablePropertiesHandlerPtr pTblHandler( new TablePropertiesHandler( true ) ); + pTblHandler->SetProperties( m_pImpl->m_pCurrentEntry->pProperties ); + if ( !pTblHandler->sprm( rSprm ) ) + { + m_pImpl->m_rDMapper.PushStyleSheetProperties( m_pImpl->m_pCurrentEntry->pProperties ); + m_pImpl->m_rDMapper.sprm( rSprm ); + m_pImpl->m_rDMapper.PopStyleSheetProperties( ); + } } } /*-- 19.06.2006 12:04:33--------------------------------------------------- @@ -823,7 +1040,8 @@ void StyleSheetTable::entry(int /*pos*/, writerfilter::Reference::Po //create a new style entry // printf("StyleSheetTable::entry(...)\n"); OSL_ENSURE( !m_pImpl->m_pCurrentEntry, "current entry has to be NULL here"); - m_pImpl->m_pCurrentEntry = new StyleSheetEntry; + StyleSheetEntryPtr pNewEntry( new StyleSheetEntry ); + m_pImpl->m_pCurrentEntry = pNewEntry; m_pImpl->m_rDMapper.PushStyleSheetProperties( m_pImpl->m_pCurrentEntry->pProperties ); ref->resolve(*this); //append it to the table @@ -831,13 +1049,14 @@ void StyleSheetTable::entry(int /*pos*/, writerfilter::Reference::Po if( !m_pImpl->m_rDMapper.IsOOXMLImport() || m_pImpl->m_pCurrentEntry->sStyleName.getLength() >0) { m_pImpl->m_pCurrentEntry->sConvertedStyleName = ConvertStyleName( m_pImpl->m_pCurrentEntry->sStyleName ); - m_pImpl->m_aStyleSheetEntries.push_back( *m_pImpl->m_pCurrentEntry ); + m_pImpl->m_aStyleSheetEntries.push_back( m_pImpl->m_pCurrentEntry ); } else { //TODO: this entry contains the default settings - they have to be added to the settings } - m_pImpl->m_pCurrentEntry = 0; + StyleSheetEntryPtr pEmptyEntry; + m_pImpl->m_pCurrentEntry = pEmptyEntry; } /*-- 21.06.2006 15:34:49--------------------------------------------------- sorting helper @@ -910,16 +1129,17 @@ void StyleSheetTable::ApplyStyleSheets( FontTablePtr rFontTable ) xStyleFamilies->getByName(rPropNameSupplier.GetName( PROP_PARAGRAPH_STYLES )) >>= xParaStyles; if(xCharStyles.is() && xParaStyles.is()) { - std::vector< StyleSheetEntry >::iterator aIt = m_pImpl->m_aStyleSheetEntries.begin(); + std::vector< StyleSheetEntryPtr >::iterator aIt = m_pImpl->m_aStyleSheetEntries.begin(); while( aIt != m_pImpl->m_aStyleSheetEntries.end() ) { - if( aIt->nStyleTypeCode == STYLE_TYPE_CHAR || aIt->nStyleTypeCode == STYLE_TYPE_PARA ) + StyleSheetEntryPtr pEntry = *aIt; + if( pEntry->nStyleTypeCode == STYLE_TYPE_CHAR || pEntry->nStyleTypeCode == STYLE_TYPE_PARA ) { - bool bParaStyle = aIt->nStyleTypeCode == STYLE_TYPE_PARA; + bool bParaStyle = pEntry->nStyleTypeCode == STYLE_TYPE_PARA; bool bInsert = false; uno::Reference< container::XNameContainer > xStyles = bParaStyle ? xParaStyles : xCharStyles; uno::Reference< style::XStyle > xStyle; - ::rtl::OUString sConvertedStyleName = ConvertStyleName( aIt->sStyleName ); + ::rtl::OUString sConvertedStyleName = ConvertStyleName( pEntry->sStyleName ); if(xStyles->hasByName( sConvertedStyleName )) xStyles->getByName( sConvertedStyleName ) >>= xStyle; else @@ -931,12 +1151,13 @@ void StyleSheetTable::ApplyStyleSheets( FontTablePtr rFontTable ) rPropNameSupplier.GetName( PROP_SERVICE_CHAR_STYLE )), uno::UNO_QUERY_THROW); } - if( aIt->sBaseStyleIdentifier.getLength() ) + if( pEntry->sBaseStyleIdentifier.getLength() ) { try { //TODO: Handle cases where a paragraph <> character style relation is needed - xStyle->setParentStyle(ConvertStyleName( aIt->sBaseStyleIdentifier )); + StyleSheetEntryPtr pParent = FindStyleSheetByISTD( pEntry->sBaseStyleIdentifier ); + xStyle->setParentStyle(ConvertStyleName( pParent->sStyleName )); } catch( const uno::RuntimeException& ) { @@ -955,43 +1176,71 @@ void StyleSheetTable::ApplyStyleSheets( FontTablePtr rFontTable ) { uno::Any aTwoHundredFortyTwip = uno::makeAny(12.); // font size to 240 twip (12 pts) for all if not set - aIt->pProperties->Insert(PROP_CHAR_HEIGHT, true, aTwoHundredFortyTwip, false); + pEntry->pProperties->Insert(PROP_CHAR_HEIGHT, true, aTwoHundredFortyTwip, false); // western font not already set -> apply first font const FontEntry* pWesternFontEntry = rFontTable->getFontEntry( 0 ); rtl::OUString sWesternFontName = pWesternFontEntry->sFontName; - aIt->pProperties->Insert(PROP_CHAR_FONT_NAME, true, uno::makeAny( sWesternFontName ), false); + pEntry->pProperties->Insert(PROP_CHAR_FONT_NAME, true, uno::makeAny( sWesternFontName ), false); // CJK ... apply second font const FontEntry* pCJKFontEntry = rFontTable->getFontEntry( 2 ); - aIt->pProperties->Insert(PROP_CHAR_FONT_NAME_ASIAN, true, uno::makeAny( pCJKFontEntry->sFontName ), false); - aIt->pProperties->Insert(PROP_CHAR_HEIGHT_ASIAN, true, aTwoHundredFortyTwip, false); + pEntry->pProperties->Insert(PROP_CHAR_FONT_NAME_ASIAN, true, uno::makeAny( pCJKFontEntry->sFontName ), false); + pEntry->pProperties->Insert(PROP_CHAR_HEIGHT_ASIAN, true, aTwoHundredFortyTwip, false); // CTL ... apply third font, if available if( nFontCount > 3 ) { const FontEntry* pCTLFontEntry = rFontTable->getFontEntry( 3 ); - aIt->pProperties->Insert(PROP_CHAR_FONT_NAME_COMPLEX, true, uno::makeAny( pCTLFontEntry->sFontName ), false); - aIt->pProperties->Insert(PROP_CHAR_HEIGHT_COMPLEX, true, aTwoHundredFortyTwip, false); + pEntry->pProperties->Insert(PROP_CHAR_FONT_NAME_COMPLEX, true, uno::makeAny( pCTLFontEntry->sFontName ), false); + pEntry->pProperties->Insert(PROP_CHAR_HEIGHT_COMPLEX, true, aTwoHundredFortyTwip, false); } } // Widow/Orphan -> set both to two if not already set uno::Any aTwo = uno::makeAny(sal_Int8(2)); - aIt->pProperties->Insert(PROP_PARA_WIDOWS, true, aTwo, false); - aIt->pProperties->Insert(PROP_PARA_ORPHANS, true, aTwo, false); + pEntry->pProperties->Insert(PROP_PARA_WIDOWS, true, aTwo, false); + pEntry->pProperties->Insert(PROP_PARA_ORPHANS, true, aTwo, false); // Left-to-right direction if not already set - aIt->pProperties->Insert(PROP_WRITING_MODE, true, uno::makeAny( sal_Int16(text::WritingMode_LR_TB) ), false); + pEntry->pProperties->Insert(PROP_WRITING_MODE, true, uno::makeAny( sal_Int16(text::WritingMode_LR_TB) ), false); // font color COL_AUTO if not already set - aIt->pProperties->Insert(PROP_CHAR_COLOR, true, uno::makeAny( sal_Int32(0xffffffff) ), false); + pEntry->pProperties->Insert(PROP_CHAR_COLOR, true, uno::makeAny( sal_Int32(0xffffffff) ), false); } - uno::Sequence< beans::PropertyValue > aPropValues = aIt->pProperties->GetPropertyValues(); + uno::Sequence< beans::PropertyValue > aPropValues = pEntry->pProperties->GetPropertyValues(); bool bAddFollowStyle = false; - if(bParaStyle && !aIt->sNextStyleIdentifier.getLength() ) + if(bParaStyle && !pEntry->sNextStyleIdentifier.getLength() ) { bAddFollowStyle = true; } //remove Left/RightMargin values from TOX heading styles if( bParaStyle ) { + // Set the outline levels + const StyleSheetPropertyMap* pStyleSheetProperties = dynamic_cast(pEntry ? pEntry->pProperties.get() : 0); + if ( pStyleSheetProperties && pStyleSheetProperties->GetOutlineLevel( ) >= 0 ) + { + sal_Int16 nLvl = pStyleSheetProperties->GetOutlineLevel( ); + uno::Reference< text::XChapterNumberingSupplier > xOutlines ( m_pImpl->m_xTextDocument, + uno::UNO_QUERY_THROW ); + uno::Reference< container::XIndexReplace > xRules = xOutlines->getChapterNumberingRules( ); + uno::Any aLevel = xRules->getByIndex( nLvl ); + uno::Sequence< beans::PropertyValue > aLevelProps; + aLevel >>= aLevelProps; + + sal_Int32 nLen = aLevelProps.getLength( ); + sal_Int32 i = 0; + bool bPropFound = false; + rtl::OUString sPropName( rtl::OUString::createFromAscii( "HeadingStyleName" ) ); + while ( i < nLen && !bPropFound ) + { + if ( aLevelProps[i].Name.equals( sPropName ) ) + { + aLevelProps[i].Value = uno::makeAny( ConvertStyleName( pEntry->sStyleName ) ); + bPropFound = true; + } + i++; + } + xRules->replaceByIndex( nLvl, uno::makeAny( aLevelProps ) ); + } + uno::Reference< beans::XPropertyState >xState( xStyle, uno::UNO_QUERY_THROW ); if( sConvertedStyleName.equalsAscii( "Contents Heading" ) || sConvertedStyleName.equalsAscii( "User Index Heading" ) || @@ -1028,24 +1277,27 @@ void StyleSheetTable::ApplyStyleSheets( FontTablePtr rFontTable ) if(bAddFollowStyle || aPropValues.getLength()) { - const beans::PropertyValue* pPropValues = aPropValues.getConstArray(); PropValVector aSortedPropVals; for( sal_Int32 nProp = 0; nProp < aPropValues.getLength(); ++nProp) { - aSortedPropVals.Insert( pPropValues[nProp] ); + // Don't add the style name properties + bool bIsParaStyleName = aPropValues[nProp].Name.equalsAscii( "ParaStyleName" ); + bool bIsCharStyleName = aPropValues[nProp].Name.equalsAscii( "CharStyleName" ); + if ( !bInsert && !bIsParaStyleName && !bIsCharStyleName ) + aSortedPropVals.Insert( aPropValues[nProp] ); } if(bAddFollowStyle) { //find the name of the Next style - std::vector< StyleSheetEntry >::iterator aNextStyleIt = m_pImpl->m_aStyleSheetEntries.begin(); + std::vector< StyleSheetEntryPtr >::iterator aNextStyleIt = m_pImpl->m_aStyleSheetEntries.begin(); for( ; aNextStyleIt != m_pImpl->m_aStyleSheetEntries.end(); ++aNextStyleIt ) { - if( aNextStyleIt->sStyleName.getLength() && - aNextStyleIt->sStyleName == aIt->sNextStyleIdentifier) + if( ( *aNextStyleIt )->sStyleName.getLength() && + ( *aNextStyleIt )->sStyleName == pEntry->sNextStyleIdentifier) { beans::PropertyValue aNew; aNew.Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("FollowStyle")); - aNew.Value = uno::makeAny(ConvertStyleName( aNextStyleIt->sStyleIdentifierD )); + aNew.Value = uno::makeAny(ConvertStyleName( ( *aNextStyleIt )->sStyleIdentifierD )); aSortedPropVals.Insert( aNew ); break; } @@ -1084,14 +1336,14 @@ void StyleSheetTable::ApplyStyleSheets( FontTablePtr rFontTable ) /*-- 22.06.2006 15:56:56--------------------------------------------------- -----------------------------------------------------------------------*/ -const StyleSheetEntry* StyleSheetTable::FindStyleSheetByISTD(const ::rtl::OUString& sIndex) +const StyleSheetEntryPtr StyleSheetTable::FindStyleSheetByISTD(const ::rtl::OUString& sIndex) { - const StyleSheetEntry* pRet = 0; + StyleSheetEntryPtr pRet; for( sal_uInt32 nPos = 0; nPos < m_pImpl->m_aStyleSheetEntries.size(); ++nPos ) { - if( m_pImpl->m_aStyleSheetEntries[nPos].sStyleIdentifierD == sIndex) + if( m_pImpl->m_aStyleSheetEntries[nPos]->sStyleIdentifierD == sIndex) { - pRet = &m_pImpl->m_aStyleSheetEntries[nPos]; + pRet = m_pImpl->m_aStyleSheetEntries[nPos]; break; } } @@ -1100,14 +1352,14 @@ const StyleSheetEntry* StyleSheetTable::FindStyleSheetByISTD(const ::rtl::OUStri /*-- 28.12.2007 14:45:45--------------------------------------------------- -----------------------------------------------------------------------*/ -const StyleSheetEntry* StyleSheetTable::FindStyleSheetByStyleName(const ::rtl::OUString& sIndex) +const StyleSheetEntryPtr StyleSheetTable::FindStyleSheetByStyleName(const ::rtl::OUString& sIndex) { - const StyleSheetEntry* pRet = 0; + StyleSheetEntryPtr pRet; for( sal_uInt32 nPos = 0; nPos < m_pImpl->m_aStyleSheetEntries.size(); ++nPos ) { - if( m_pImpl->m_aStyleSheetEntries[nPos].sStyleName == sIndex) + if( m_pImpl->m_aStyleSheetEntries[nPos]->sStyleName == sIndex) { - pRet = &m_pImpl->m_aStyleSheetEntries[nPos]; + pRet = m_pImpl->m_aStyleSheetEntries[nPos]; break; } } @@ -1116,14 +1368,14 @@ const StyleSheetEntry* StyleSheetTable::FindStyleSheetByStyleName(const ::rtl::O /*-- 28.12.2007 14:45:45--------------------------------------------------- -----------------------------------------------------------------------*/ -const StyleSheetEntry* StyleSheetTable::FindStyleSheetByConvertedStyleName(const ::rtl::OUString& sIndex) +const StyleSheetEntryPtr StyleSheetTable::FindStyleSheetByConvertedStyleName(const ::rtl::OUString& sIndex) { - const StyleSheetEntry* pRet = 0; + StyleSheetEntryPtr pRet; for( sal_uInt32 nPos = 0; nPos < m_pImpl->m_aStyleSheetEntries.size(); ++nPos ) { - if( m_pImpl->m_aStyleSheetEntries[nPos].sConvertedStyleName == sIndex) + if( m_pImpl->m_aStyleSheetEntries[nPos]->sConvertedStyleName == sIndex) { - pRet = &m_pImpl->m_aStyleSheetEntries[nPos]; + pRet = m_pImpl->m_aStyleSheetEntries[nPos]; break; } } @@ -1133,23 +1385,17 @@ const StyleSheetEntry* StyleSheetTable::FindStyleSheetByConvertedStyleName(const /*-- 17.07.2006 11:47:00--------------------------------------------------- -----------------------------------------------------------------------*/ -const StyleSheetEntry* StyleSheetTable::FindParentStyleSheet(::rtl::OUString sBaseStyle) +const StyleSheetEntryPtr StyleSheetTable::FindParentStyleSheet(::rtl::OUString sBaseStyle) { if( !sBaseStyle.getLength() ) - return 0; + { + StyleSheetEntryPtr pEmptyPtr; + return pEmptyPtr; + } if( m_pImpl->m_pCurrentEntry) sBaseStyle = m_pImpl->m_pCurrentEntry->sBaseStyleIdentifier; - const StyleSheetEntry* pRet = 0; - for( sal_uInt32 nPos = 0; nPos < m_pImpl->m_aStyleSheetEntries.size(); ++nPos ) - { - if( m_pImpl->m_aStyleSheetEntries[nPos].sStyleIdentifierD == sBaseStyle ) - { - pRet = &m_pImpl->m_aStyleSheetEntries[nPos]; - break; - } - } - return pRet; + return FindStyleSheetByISTD( sBaseStyle ); } /*-- 21.12.2006 15:58:23--------------------------------------------------- @@ -1187,12 +1433,12 @@ static const sal_Char *aStyleNamePairs[] = "Index 1", "Index 1", "Index 2", "Index 2", "Index 3", "Index 3", - "Index 4", 0, - "Index 5", 0, - "Index 6", 0, - "Index 7", 0, - "Index 8", 0, - "Index 9", 0, + "Index 4", "", + "Index 5", "", + "Index 6", "", + "Index 7", "", + "Index 8", "", + "Index 9", "", "TOC 1", "Contents 1", "TOC 2", "Contents 2", "TOC 3", "Contents 3", @@ -1222,46 +1468,46 @@ static const sal_Char *aStyleNamePairs[] = "TOC7", "Contents 7", "TOC8", "Contents 8", "TOC9", "Contents 9", - "Normal Indent", 0, + "Normal Indent", "", "Footnote Text", "Footnote", - "Annotation Text", 0, + "Annotation Text", "", "Header", "Header", "header", "Header", "Footer", "Footer", "footer", "Footer", "Index Heading", "Index Heading", - "Caption", 0, - "Table of Figures", 0, + "Caption", "", + "Table of Figures", "", "Envelope Address", "Addressee", "Envelope Return", "Sender", "Footnote Reference", "Footnote anchor", - "Annotation Reference", 0, + "Annotation Reference", "", "Line Number", "Line numbering", "Page Number", "Page Number", "Endnote Reference", "Endnote anchor", "Endnote Text", "Endnote Symbol", - "Table of Authorities", 0, - "Macro Text", 0, - "TOA Heading", 0, + "Table of Authorities", "", + "Macro Text", "", + "TOA Heading", "", "List", "List", - "List 2", 0, - "List 3", 0, - "List 4", 0, - "List 5", 0, - "List Bullet", 0, - "List Bullet 2", 0, - "List Bullet 3", 0, - "List Bullet 4", 0, - "List Bullet 5", 0, - "List Number", 0, - "List Number 2", 0, - "List Number 3", 0, - "List Number 4", 0, - "List Number 5", 0, + "List 2", "", + "List 3", "", + "List 4", "", + "List 5", "", + "List Bullet", "", + "List Bullet 2", "", + "List Bullet 3", "", + "List Bullet 4", "", + "List Bullet 5", "", + "List Number", "", + "List Number 2", "", + "List Number 3", "", + "List Number 4", "", + "List Number 5", "", "Title", "Title", - "Closing", 0, + "Closing", "", "Signature", "Signature", - "Default Paragraph Font", 0, + "Default Paragraph Font", "", "DefaultParagraphFont", "Default Paragraph Font", "Body Text", "Text body", "BodyText", "Text body", @@ -1269,29 +1515,29 @@ static const sal_Char *aStyleNamePairs[] = "Body Text Indent", "Text body indent", "BodyTextIndent", "Text body indent", "BodyTextIndent2", "Text body indent2", - "List Continue", 0, - "List Continue 2", 0, - "List Continue 3", 0, - "List Continue 4", 0, - "List Continue 5", 0, - "Message Header", 0, + "List Continue", "", + "List Continue 2", "", + "List Continue 3", "", + "List Continue 4", "", + "List Continue 5", "", + "Message Header", "", "Subtitle", "Subtitle", - "Salutation", 0, - "Date", 0, + "Salutation", "", + "Date", "", "Body Text First Indent", "Body Text Indent", - "Body Text First Indent 2", 0, - "Note Heading", 0, - "Body Text 2", 0, - "Body Text 3", 0, - "Body Text Indent 2", 0, - "Body Text Indent 3", 0, - "Block Text", 0, + "Body Text First Indent 2", "", + "Note Heading", "", + "Body Text 2", "", + "Body Text 3", "", + "Body Text Indent 2", "", + "Body Text Indent 3", "", + "Block Text", "", "Hyperlink", "Internet link", "Followed Hyperlink", "Visited Internet Link", "Strong", "Strong Emphasis", "Emphasis", "Emphasis", - "Document Map", 0, - "Plain Text", 0, + "Document Map", "", + "Plain Text", "", "NoList", "No List", "AbstractHeading", "Abstract Heading", "AbstractBody", "Abstract Body", @@ -1307,12 +1553,12 @@ static const sal_Char *aStyleNamePairs[] = if( bExtendedSearch ) { //search for the rWWName in the IdentifierD of the existing styles and convert the sStyleName member - std::vector< StyleSheetEntry >::iterator aIt = m_pImpl->m_aStyleSheetEntries.begin(); + std::vector< StyleSheetEntryPtr >::iterator aIt = m_pImpl->m_aStyleSheetEntries.begin(); //TODO: performance issue - put styles list into a map sorted by it's sStyleIdentifierD members while( aIt != m_pImpl->m_aStyleSheetEntries.end() ) { - if( rWWName == aIt->sStyleIdentifierD ) - sRet = aIt->sStyleName; + if( rWWName == ( *aIt )->sStyleIdentifierD ) + sRet = ( *aIt )->sStyleName; ++aIt; } } diff --git a/writerfilter/source/dmapper/StyleSheetTable.hxx b/writerfilter/source/dmapper/StyleSheetTable.hxx index 99e6fd0b9705..73f5a2defebf 100644 --- a/writerfilter/source/dmapper/StyleSheetTable.hxx +++ b/writerfilter/source/dmapper/StyleSheetTable.hxx @@ -30,6 +30,8 @@ #ifndef INCLUDED_STYLESHEETTABLE_HXX #define INCLUDED_STYLESHEETTABLE_HXX +#include "TblStylePrHandler.hxx" + #include #include #include @@ -41,6 +43,7 @@ namespace com{ namespace sun { namespace star { namespace text{ class XTextDocument; }}}} + namespace writerfilter { namespace dmapper { @@ -72,6 +75,9 @@ struct StyleSheetEntry ::rtl::OUString sConvertedStyleName; StyleSheetEntry(); }; + +typedef boost::shared_ptr StyleSheetEntryPtr; + class DomainMapper; class WRITERFILTER_DLLPRIVATE StyleSheetTable : public Properties, @@ -92,11 +98,11 @@ public: virtual void entry(int pos, writerfilter::Reference::Pointer_t ref); void ApplyStyleSheets( FontTablePtr rFontTable ); - const StyleSheetEntry* FindStyleSheetByISTD(const ::rtl::OUString& sIndex); - const StyleSheetEntry* FindStyleSheetByStyleName(const ::rtl::OUString& rIndex); - const StyleSheetEntry* FindStyleSheetByConvertedStyleName(const ::rtl::OUString& rIndex); + const StyleSheetEntryPtr FindStyleSheetByISTD(const ::rtl::OUString& sIndex); + const StyleSheetEntryPtr FindStyleSheetByStyleName(const ::rtl::OUString& rIndex); + const StyleSheetEntryPtr FindStyleSheetByConvertedStyleName(const ::rtl::OUString& rIndex); // returns the parent of the one with the given name - if empty the parent of the current style sheet is returned - const StyleSheetEntry* FindParentStyleSheet(::rtl::OUString sBaseStyle); + const StyleSheetEntryPtr FindParentStyleSheet(::rtl::OUString sBaseStyle); ::rtl::OUString ConvertStyleName( const ::rtl::OUString& rWWName, bool bExtendedSearch = false ); ::rtl::OUString GetStyleIdFromIndex(const sal_uInt32 sti); @@ -110,6 +116,38 @@ private: }; typedef boost::shared_ptr< StyleSheetTable > StyleSheetTablePtr; + +class WRITERFILTER_DLLPRIVATE TableStyleSheetEntry : + public StyleSheetEntry +{ +private: + typedef std::map TblStylePrs; + + StyleSheetTable* m_pStyleSheet; + TblStylePrs m_aStyles; + +public: + + short m_nColBandSize; + short m_nRowBandSize; + + // Adds a new tblStylePr to the table style entry. This method + // fixes some possible properties conflicts, like borders ones. + void AddTblStylePr( TblStyleType nType, PropertyMapPtr pProps ); + + // Gets all the properties + // + corresponding to the mask, + // + from the parent styles + PropertyMapPtr GetProperties( sal_Int32 nMask ); + + TableStyleSheetEntry( StyleSheetEntry& aEntry, StyleSheetTable* pStyles ); + ~TableStyleSheetEntry( ); + +protected: + PropertyMapPtr GetLocalPropertiesFromMask( sal_Int32 nMask ); +}; +typedef boost::shared_ptr TableStyleSheetEntryPtr; + }} #endif // diff --git a/writerfilter/source/dmapper/TDefTableHandler.cxx b/writerfilter/source/dmapper/TDefTableHandler.cxx index c5ce8d02a40d..dc2583249da2 100644 --- a/writerfilter/source/dmapper/TDefTableHandler.cxx +++ b/writerfilter/source/dmapper/TDefTableHandler.cxx @@ -155,6 +155,11 @@ void TDefTableHandler::attribute(Id rName, Value & rVal) case NS_rtf::LN_UNUSED2_15: // 0x2877 // ignored break; + case NS_ooxml::LN_CT_Border_themeColor: + case NS_ooxml::LN_CT_Border_themeTint: + case NS_ooxml::LN_CT_Border_themeShade: + // ignored + break; default: OSL_ENSURE(false, "unknown attribute"); } @@ -199,6 +204,12 @@ void TDefTableHandler::localResolve(Id rName, writerfilter::Reference::Pointer_t pProperties = rSprm.getProps(); localResolve( rSprm.getId(), pProperties ); @@ -281,6 +296,10 @@ void TDefTableHandler::fillCellProperties( pCellProperties->Insert( PROP_BOTTOM_BORDER, false, uno::makeAny( m_aBottomBorderLines[nCell] ) ); if( m_aRightBorderLines.size() > nCell ) pCellProperties->Insert( PROP_RIGHT_BORDER, false, uno::makeAny( m_aRightBorderLines[nCell] ) ); + if( m_aInsideHBorderLines.size() > nCell ) + pCellProperties->Insert( META_PROP_HORIZONTAL_BORDER, false, uno::makeAny( m_aInsideHBorderLines[nCell] ) ); + if( m_aInsideVBorderLines.size() > nCell ) + pCellProperties->Insert( META_PROP_VERTICAL_BORDER, false, uno::makeAny( m_aInsideVBorderLines[nCell] ) ); } /*-- 09.05.2007 13:14:17--------------------------------------------------- diff --git a/writerfilter/source/dmapper/TDefTableHandler.hxx b/writerfilter/source/dmapper/TDefTableHandler.hxx index 42ca98494ec4..352cb936cc97 100644 --- a/writerfilter/source/dmapper/TDefTableHandler.hxx +++ b/writerfilter/source/dmapper/TDefTableHandler.hxx @@ -56,6 +56,10 @@ private: ::std::vector< ::com::sun::star::table::BorderLine > m_aRightBorderLines; ::std::vector< ::com::sun::star::table::BorderLine > m_aTopBorderLines; ::std::vector< ::com::sun::star::table::BorderLine > m_aBottomBorderLines; + ::std::vector< ::com::sun::star::table::BorderLine > m_aInsideHBorderLines; + ::std::vector< ::com::sun::star::table::BorderLine > m_aInsideVBorderLines; + ::std::vector< ::com::sun::star::table::BorderLine > m_aTl2brBorderLines; + ::std::vector< ::com::sun::star::table::BorderLine > m_aTr2blBorderLines; //values of the current border sal_Int32 m_nLineWidth; diff --git a/writerfilter/source/dmapper/TablePropertiesHandler.cxx b/writerfilter/source/dmapper/TablePropertiesHandler.cxx new file mode 100644 index 000000000000..e3739b56e636 --- /dev/null +++ b/writerfilter/source/dmapper/TablePropertiesHandler.cxx @@ -0,0 +1,217 @@ +#include "BorderHandler.hxx" +#include "CellColorHandler.hxx" +#include "CellMarginHandler.hxx" +#include "ConversionHelper.hxx" +#include "MeasureHandler.hxx" +#include "TablePropertiesHandler.hxx" +#include "TDefTableHandler.hxx" + +#include +#include + +#include +#include + + +namespace writerfilter { +namespace dmapper { + + TablePropertiesHandler::TablePropertiesHandler( bool bOOXML ) : + m_pTableManager( NULL ), + m_bOOXML( bOOXML ) + { + } + + + TablePropertiesHandler::~TablePropertiesHandler( ) + { + // Do not delete the table manager... this will be done somewhere else + m_pTableManager = NULL; + } + + bool TablePropertiesHandler::sprm(Sprm & rSprm) + { + bool bRet = true; + sal_uInt32 nSprmId = rSprm.getId(); + Value::Pointer_t pValue = rSprm.getValue(); + sal_Int32 nIntValue = ((pValue.get() != NULL) ? pValue->getInt() : 0); + /* WRITERFILTERSTATUS: table: table_sprmdata */ + switch( nSprmId ) + { + /* WRITERFILTERSTATUS: done: 1, planned: 2, spent: 2 */ + case NS_ooxml::LN_CT_TrPrBase_jc: //90706 + /* WRITERFILTERSTATUS: done: 1, planned: 0.5, spent: 0.5 */ + case NS_ooxml::LN_CT_TblPrBase_jc: + /* WRITERFILTERSTATUS: done: 1, planned: 2, spent: 2 */ + case 0x5400: // sprmTJc + { + //table justification 0: left, 1: center, 2: right + sal_Int16 nOrient = ConversionHelper::convertTableJustification( nIntValue ); + TablePropertyMapPtr pTableMap( new TablePropertyMap ); + pTableMap->setValue( TablePropertyMap::HORI_ORIENT, nOrient ); + insertTableProps( pTableMap ); + } + break; + /* WRITERFILTERSTATUS: done: 0, planned: 2, spent: 0 */ + case 0x9601: // sprmTDxaLeft + break; + /* WRITERFILTERSTATUS: done: 1, planned: 2, spent: 0 */ + case 0x9602: // sprmTDxaGapHalf + { + //m_nGapHalf = ConversionHelper::convertTwipToMM100( nIntValue ); + TablePropertyMapPtr pPropMap( new TablePropertyMap ); + pPropMap->setValue( TablePropertyMap::GAP_HALF, ConversionHelper::convertTwipToMM100( nIntValue ) ); + insertTableProps(pPropMap); + } + break; + /* WRITERFILTERSTATUS: done: 1, planned: 2, spent: 2 */ + case NS_ooxml::LN_CT_TrPrBase_trHeight: //90703 + { + //contains unit and value + writerfilter::Reference::Pointer_t pProperties = rSprm.getProps(); + if( pProperties.get()) + { //contains attributes x2902 (LN_unit) and x17e2 (LN_trleft) + MeasureHandlerPtr pMeasureHandler( new MeasureHandler ); + pProperties->resolve(*pMeasureHandler); + TablePropertyMapPtr pPropMap( new TablePropertyMap ); + pPropMap->Insert( PROP_SIZE_TYPE, false, uno::makeAny( pMeasureHandler->GetRowHeightSizeType() )); + pPropMap->Insert( PROP_HEIGHT, false, uno::makeAny(pMeasureHandler->getMeasureValue() )); + insertRowProps(pPropMap); + } + } + break; + /* WRITERFILTERSTATUS: done: 1, planned: 2, spent: 0 */ + case 0x3403: // sprmTFCantSplit + case NS_sprm::LN_TCantSplit: // 0x3644 + { + //row can't break across pages if nIntValue == 1 + TablePropertyMapPtr pPropMap( new TablePropertyMap ); + pPropMap->Insert( PROP_IS_SPLIT_ALLOWED, false, uno::makeAny(sal_Bool( nIntValue == 1 ? sal_False : sal_True ) )); + insertRowProps(pPropMap); + } + break; + /* WRITERFILTERSTATUS: done: 1, planned: 2, spent: 0 */ + case 0x9407: // sprmTDyaRowHeight + { + // table row height - negative values indicate 'exact height' - positive 'at least' + TablePropertyMapPtr pPropMap( new TablePropertyMap ); + bool bMinHeight = true; + sal_Int16 nHeight = static_cast( nIntValue ); + if( nHeight < 0 ) + { + bMinHeight = false; + nHeight *= -1; + } + pPropMap->Insert( PROP_SIZE_TYPE, false, uno::makeAny(bMinHeight ? text::SizeType::MIN : text::SizeType::FIX )); + pPropMap->Insert( PROP_HEIGHT, false, uno::makeAny(ConversionHelper::convertTwipToMM100( nHeight ))); + insertRowProps(pPropMap); + } + break; + /* WRITERFILTERSTATUS: done: 1, planned: 2, spent: 0 */ + case NS_ooxml::LN_CT_TcPrBase_vAlign://90694 + { + sal_Int16 nVertOrient = text::VertOrientation::NONE; + switch( nIntValue ) //0 - top 1 - center 3 - bottom + { + case 1: nVertOrient = text::VertOrientation::CENTER; break; + case 3: nVertOrient = text::VertOrientation::BOTTOM; break; + default:; + }; + TablePropertyMapPtr pCellPropMap( new TablePropertyMap() ); + pCellPropMap->Insert( PROP_VERT_ORIENT, false, uno::makeAny( nVertOrient ) ); + //todo: in ooxml import the value of m_ncell is wrong + cellProps( pCellPropMap ); + } + break; + /* WRITERFILTERSTATUS: done: 1, planned: 2, spent: 0 */ + case NS_ooxml::LN_CT_TblPrBase_tblBorders: //table borders, might be defined in table style + { + writerfilter::Reference::Pointer_t pProperties = rSprm.getProps(); + if( pProperties.get()) + { + BorderHandlerPtr pBorderHandler( new BorderHandler(m_bOOXML) ); + pProperties->resolve(*pBorderHandler); + TablePropertyMapPtr pTablePropMap( new TablePropertyMap ); + pTablePropMap->insert( pBorderHandler->getProperties() ); + insertTableProps( pTablePropMap ); + } + } + break; + /* WRITERFILTERSTATUS: done: 1, planned: 2, spent: 0 */ + case NS_ooxml::LN_CT_TcPrBase_tcBorders ://cell borders + //contains CT_TcBorders_left, right, top, bottom + { + writerfilter::Reference::Pointer_t pProperties = rSprm.getProps(); + if( pProperties.get()) + { + //in OOXML there's one set of borders at each cell (if there is any) + TDefTableHandlerPtr pTDefTableHandler( new TDefTableHandler( m_bOOXML )); + pProperties->resolve( *pTDefTableHandler ); + TablePropertyMapPtr pCellPropMap( new TablePropertyMap ); + pTDefTableHandler->fillCellProperties( 0, pCellPropMap ); + cellProps( pCellPropMap ); + } + } + break; + case NS_ooxml::LN_CT_TblPrBase_shd: + { + writerfilter::Reference::Pointer_t pProperties = rSprm.getProps(); + if( pProperties.get()) + { + CellColorHandlerPtr pCellColorHandler( new CellColorHandler); + pProperties->resolve( *pCellColorHandler ); + TablePropertyMapPtr pTablePropMap( new TablePropertyMap ); + insertTableProps( pCellColorHandler->getProperties() ); + } + } + break; + /* WRITERFILTERSTATUS: done: 1, planned: 2, spent: 0 */ + case 0xd61a : // sprmTCellTopColor + /* WRITERFILTERSTATUS: done: 1, planned: 2, spent: 0 */ + case 0xd61b : // sprmTCellLeftColor + /* WRITERFILTERSTATUS: done: 1, planned: 2, spent: 0 */ + case 0xd61c : // sprmTCellBottomColor + /* WRITERFILTERSTATUS: done: 1, planned: 2, spent: 0 */ + case 0xd61d : // sprmTCellRightColor + /* WRITERFILTERSTATUS: done: 1, planned: 2, spent: 0 */ + case NS_ooxml::LN_CT_TcPrBase_shd: + { + // each color sprm contains as much colors as cells are in a row + //LN_CT_TcPrBase_shd: cell shading contains: LN_CT_Shd_val, LN_CT_Shd_fill, LN_CT_Shd_color + writerfilter::Reference::Pointer_t pProperties = rSprm.getProps(); + if( pProperties.get()) + { + CellColorHandlerPtr pCellColorHandler( new CellColorHandler ); + pProperties->resolve( *pCellColorHandler ); + cellProps( pCellColorHandler->getProperties()); + } + } + break; +//OOXML table properties + /* WRITERFILTERSTATUS: done: 0, planned: 2, spent: 0 */ + case NS_ooxml::LN_CT_TblPrBase_tblCellMar: //cell margins + { + //contains LN_CT_TblCellMar_top, LN_CT_TblCellMar_left, LN_CT_TblCellMar_bottom, LN_CT_TblCellMar_right + writerfilter::Reference::Pointer_t pProperties = rSprm.getProps(); + if( pProperties.get()) + { + CellMarginHandlerPtr pCellMarginHandler( new CellMarginHandler ); + pProperties->resolve( *pCellMarginHandler ); + TablePropertyMapPtr pMarginProps( new TablePropertyMap ); + if( pCellMarginHandler->m_bTopMarginValid ) + pMarginProps->setValue( TablePropertyMap::CELL_MAR_TOP, pCellMarginHandler->m_nTopMargin ); + if( pCellMarginHandler->m_bBottomMarginValid ) + pMarginProps->setValue( TablePropertyMap::CELL_MAR_BOTTOM, pCellMarginHandler->m_nBottomMargin ); + if( pCellMarginHandler->m_bLeftMarginValid ) + pMarginProps->setValue( TablePropertyMap::CELL_MAR_LEFT, pCellMarginHandler->m_nLeftMargin ); + if( pCellMarginHandler->m_bRightMarginValid ) + pMarginProps->setValue( TablePropertyMap::CELL_MAR_RIGHT, pCellMarginHandler->m_nRightMargin ); + insertTableProps(pMarginProps); + } + } + break; + default: bRet = false; + } + return bRet; + } +}} diff --git a/writerfilter/source/dmapper/TablePropertiesHandler.hxx b/writerfilter/source/dmapper/TablePropertiesHandler.hxx new file mode 100644 index 000000000000..68fe40689702 --- /dev/null +++ b/writerfilter/source/dmapper/TablePropertiesHandler.hxx @@ -0,0 +1,83 @@ +#ifndef INCLUDED_TABLEPROPERTIESHANDLER_HXX +#define INCLUDED_TABLEPROPERTIESHANDLER_HXX + +#include + +#include +#include +#include + +#include + +#include + +namespace writerfilter { +namespace dmapper { + + +typedef ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > Handle_t; +typedef TableManager DomainMapperTableManager_Base_t; + +class TablePropertiesHandler +{ +private: + vector< PropertyMapPtr > m_rPropertiesStack; + PropertyMapPtr m_pCurrentProperties; + DomainMapperTableManager_Base_t *m_pTableManager; + bool m_bOOXML; + +public: + TablePropertiesHandler( bool bOOXML ); + virtual ~TablePropertiesHandler( ); + + bool sprm(Sprm & sprm); + + inline void SetTableManager( DomainMapperTableManager_Base_t *pTableManager ) + { + m_pTableManager = pTableManager; + }; + + inline void SetProperties( PropertyMapPtr pProperties ) + { + m_pCurrentProperties = pProperties; + }; + +private: + + inline void cellProps( TablePropertyMapPtr pProps ) + { + if ( m_pTableManager ) + m_pTableManager->cellProps( pProps ); + else + m_pCurrentProperties->insert( pProps, true ); + }; + + inline void cellPropsByCell( unsigned int i, TablePropertyMapPtr pProps ) + { + if ( m_pTableManager ) + m_pTableManager->cellPropsByCell( i, pProps ); + else + m_pCurrentProperties->insert( pProps, true ); + }; + + inline void insertRowProps( TablePropertyMapPtr pProps ) + { + if ( m_pTableManager ) + m_pTableManager->insertRowProps( pProps ); + else + m_pCurrentProperties->insert( pProps, true ); + }; + + inline void insertTableProps( TablePropertyMapPtr pProps ) + { + if ( m_pTableManager ) + m_pTableManager->insertTableProps( pProps ); + else + m_pCurrentProperties->insert( pProps, true ); + }; +}; +typedef boost::shared_ptr TablePropertiesHandlerPtr; + +} } + +#endif diff --git a/writerfilter/source/dmapper/TblStylePrHandler.cxx b/writerfilter/source/dmapper/TblStylePrHandler.cxx new file mode 100644 index 000000000000..d6f790990e22 --- /dev/null +++ b/writerfilter/source/dmapper/TblStylePrHandler.cxx @@ -0,0 +1,69 @@ +#include +#include +#include + +namespace writerfilter { +namespace dmapper { + +TblStylePrHandler::TblStylePrHandler( DomainMapper & rDMapper ) : + m_rDMapper( rDMapper ), + m_pTablePropsHandler( new TablePropertiesHandler( true ) ), + m_nType( TBL_STYLE_UNKNOWN ), + m_pProperties( new PropertyMap ) +{ +} + +TblStylePrHandler::~TblStylePrHandler( ) +{ + delete m_pTablePropsHandler, m_pTablePropsHandler = NULL; +} + +void TblStylePrHandler::attribute(Id rName, Value & rVal) +{ + switch ( rName ) + { + case NS_ooxml::LN_CT_TblStyleOverrideType: + { + // The tokenid should be the same in the model.xml than + // in the TblStyleType enum + m_nType = TblStyleType( rVal.getInt( ) ); + } + break; + } +} + +void TblStylePrHandler::sprm(Sprm & rSprm) +{ + Value::Pointer_t pValue = rSprm.getValue(); + switch ( rSprm.getId( ) ) + { + case NS_ooxml::LN_CT_PPrBase: + case NS_ooxml::LN_EG_RPrBase: + case NS_ooxml::LN_CT_TblPrBase: + case NS_ooxml::LN_CT_TrPrBase: + case NS_ooxml::LN_CT_TcPrBase: + resolveSprmProps( rSprm ); + break; + default: + // Tables specific properties have to handled here + m_pTablePropsHandler->SetProperties( m_pProperties ); + bool bRet = m_pTablePropsHandler->sprm( rSprm ); + + if ( !bRet ) + { + // The DomainMapper can handle some of the properties + m_rDMapper.PushStyleSheetProperties( m_pProperties, true ); + m_rDMapper.sprm( rSprm ); + m_rDMapper.PopStyleSheetProperties( true ); + } + } +} + +void TblStylePrHandler::resolveSprmProps(Sprm & rSprm) +{ + writerfilter::Reference::Pointer_t pProperties = rSprm.getProps(); + if( pProperties.get()) + pProperties->resolve(*this); +} + +}} diff --git a/writerfilter/source/dmapper/TblStylePrHandler.hxx b/writerfilter/source/dmapper/TblStylePrHandler.hxx new file mode 100644 index 000000000000..dd8d2da97690 --- /dev/null +++ b/writerfilter/source/dmapper/TblStylePrHandler.hxx @@ -0,0 +1,64 @@ +#ifndef INCLUDED_TBLSTYLEPRHANDLER_HXX +#define INCLUDED_TBLSTYLEPRHANDLER_HXX + +#include "TablePropertiesHandler.hxx" + +#include +#include +#include +#include + +namespace writerfilter { +namespace dmapper { + +class DomainMapper; +class PropertyMap; + +enum TblStyleType +{ + TBL_STYLE_UNKNOWN, + TBL_STYLE_WHOLETABLE, + TBL_STYLE_FIRSTROW, + TBL_STYLE_LASTROW, + TBL_STYLE_FIRSTCOL, + TBL_STYLE_LASTCOL, + TBL_STYLE_BAND1VERT, + TBL_STYLE_BAND2VERT, + TBL_STYLE_BAND1HORZ, + TBL_STYLE_BAND2HORZ, + TBL_STYLE_NECELL, + TBL_STYLE_NWCELL, + TBL_STYLE_SECELL, + TBL_STYLE_SWCELL +}; + +class WRITERFILTER_DLLPRIVATE TblStylePrHandler : public Properties +{ +private: + DomainMapper & m_rDMapper; + TablePropertiesHandler * m_pTablePropsHandler; + + TblStyleType m_nType; + PropertyMapPtr m_pProperties; + +public: + TblStylePrHandler( DomainMapper & rDMapper ); + virtual ~TblStylePrHandler( ); + + // Properties + virtual void attribute(Id Name, Value & val); + virtual void sprm(Sprm & sprm); + + inline PropertyMapPtr getProperties() { return m_pProperties; }; + inline TblStyleType getType() { return m_nType; }; + +private: + + void resolveSprmProps(Sprm & rSprm); +}; + +typedef boost::shared_ptr< TblStylePrHandler > TblStylePrHandlerPtr; + +}} + +#endif diff --git a/writerfilter/source/dmapper/ThemeTable.hxx b/writerfilter/source/dmapper/ThemeTable.hxx index 45bf42f03fae..85b698b966c3 100644 --- a/writerfilter/source/dmapper/ThemeTable.hxx +++ b/writerfilter/source/dmapper/ThemeTable.hxx @@ -39,7 +39,6 @@ namespace writerfilter { namespace dmapper { -using namespace std; struct ThemeTable_Impl; diff --git a/writerfilter/source/dmapper/makefile.mk b/writerfilter/source/dmapper/makefile.mk index e7998925a768..5f421643150d 100644 --- a/writerfilter/source/dmapper/makefile.mk +++ b/writerfilter/source/dmapper/makefile.mk @@ -43,6 +43,9 @@ ENABLE_EXCEPTIONS=TRUE # --- Files ------------------------------------- SLOFILES= $(SLO)$/BorderHandler.obj \ + $(SLO)$/TblStylePrHandler.obj \ + $(SLO)$/GraphicHelpers.obj \ + $(SLO)$/TablePropertiesHandler.obj \ $(SLO)$/CellColorHandler.obj \ $(SLO)$/CellMarginHandler.obj \ $(SLO)$/SectionColumnHandler.obj \ @@ -60,9 +63,11 @@ SLOFILES= $(SLO)$/BorderHandler.obj \ $(SLO)$/PropertyIds.obj \ $(SLO)$/StyleSheetTable.obj \ $(SLO)$/TDefTableHandler.obj \ - $(SLO)$/ThemeTable.obj \ + $(SLO)$/ThemeTable.obj \ + $(SLO)$/SettingsTable.obj \ $(SLO)$/ModelEventListener.obj\ - $(SLO)$/OLEHandler.obj + $(SLO)$/OLEHandler.obj \ + $(SLO)$/PageBordersHandler.obj # --- Targets ---------------------------------- diff --git a/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx b/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx index 27a1221ed36c..53f0c423bc9c 100644 --- a/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx +++ b/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx @@ -252,6 +252,9 @@ void SAL_CALL OOXMLFastContextHandler::startFastElement logger("MEMORY", buffer); #endif +#if DEBUG + clog << "Token: " << fastTokenToId(Element) << endl; +#endif attributes(Attribs); lcl_startFastElement(Element, Attribs); } @@ -1870,6 +1873,16 @@ void OOXMLFastContextHandlerTextTable::lcl_startFastElement { mnTableDepth++; + boost::shared_ptr pProps( new OOXMLPropertySetImpl ); + { + OOXMLValue::Pointer_t pVal + (new OOXMLIntegerValue(mnTableDepth)); + OOXMLProperty::Pointer_t pProp + (new OOXMLPropertyImpl(NS_ooxml::LN_tblStart, pVal, OOXMLPropertyImpl::SPRM)); + pProps->add(pProp); + } + mpParserState->setCharacterProperties(pProps); + startAction(Element); } @@ -1954,10 +1967,9 @@ void SAL_CALL ShapesNoAdd::remove(const uno::Reference< drawing::XShape > & xSha OOXMLFastContextHandlerShape::OOXMLFastContextHandlerShape (OOXMLFastContextHandler * pContext) -: OOXMLFastContextHandlerProperties(pContext) +: OOXMLFastContextHandlerProperties(pContext), m_bShapeSent( false ) { uno::Reference xContext(getComponentContext()); - if (xContext.is()) { uno::Reference rServiceManager @@ -2008,7 +2020,9 @@ void OOXMLFastContextHandlerShape::lcl_startFastElement startAction(Element); if (mrShapeContext.is()) + { mrShapeContext->startFastElement(Element, Attribs); + } } void SAL_CALL OOXMLFastContextHandlerShape::startUnknownElement @@ -2029,28 +2043,43 @@ void OOXMLFastContextHandlerShape::setToken(Token_t nToken) mrShapeContext->setStartToken(nToken); } -void OOXMLFastContextHandlerShape::lcl_endFastElement -(Token_t Element) - throw (uno::RuntimeException, xml::sax::SAXException) +void OOXMLFastContextHandlerShape::sendShape( Token_t Element ) { - if (mrShapeContext.is()) + if ( mrShapeContext.is() && !m_bShapeSent ) { - mrShapeContext->endFastElement(Element); - uno::Reference xShape(mrShapeContext->getShape()); - if (xShape.is()) { - awt::Point aPoint(xShape->getPosition()); - awt::Size aSize(xShape->getSize()); - OOXMLValue::Pointer_t pValue(new OOXMLShapeValue(xShape)); newProperty(NS_ooxml::LN_shape, pValue); + m_bShapeSent = true; + + bool bIsPicture = Element == ( NS_picture | OOXML_pic ); + + // Notify the dmapper that the shape is ready to use + if ( !bIsPicture ) + mpStream->startShape( xShape ); } } +} + +void OOXMLFastContextHandlerShape::lcl_endFastElement +(Token_t Element) + throw (uno::RuntimeException, xml::sax::SAXException) +{ + if (mrShapeContext.is()) + { + mrShapeContext->endFastElement(Element); + sendShape( Element ); + } OOXMLFastContextHandlerProperties::lcl_endFastElement(Element); + + // Ending the shape should be the last thing to do + bool bIsPicture = Element == ( NS_picture | OOXML_pic ); + if ( !bIsPicture ) + mpStream->endShape( ); } void SAL_CALL OOXMLFastContextHandlerShape::endUnknownElement @@ -2091,6 +2120,7 @@ OOXMLFastContextHandlerShape::lcl_createFastChildContext pWrapper->addNamespace(NS_wordprocessingml); pWrapper->addNamespace(NS_vml_wordprocessingDrawing); pWrapper->addNamespace(NS_office); + pWrapper->addToken( NS_vml|OOXML_textbox ); xContextHandler.set(pWrapper); } @@ -2099,6 +2129,7 @@ OOXMLFastContextHandlerShape::lcl_createFastChildContext break; } + return xContextHandler; } @@ -2207,6 +2238,11 @@ void OOXMLFastContextHandlerWrapper::addNamespace(const Id & nId) mMyNamespaces.insert(nId); } +void OOXMLFastContextHandlerWrapper::addToken( Token_t Token ) +{ + mMyTokens.insert( Token ); +} + void OOXMLFastContextHandlerWrapper::lcl_startFastElement (Token_t Element, const uno::Reference< xml::sax::XFastAttributeList > & Attribs) @@ -2251,7 +2287,9 @@ OOXMLFastContextHandlerWrapper::lcl_createFastChildContext debug_logger->endElement("Wrapper-createChildContext"); #endif - if (mMyNamespaces.find(nNameSpace) != mMyNamespaces.end()) + bool bInNamespaces = mMyNamespaces.find(nNameSpace) != mMyNamespaces.end(); + bool bInTokens = mMyTokens.find( Element ) != mMyTokens.end( ); + if ( bInNamespaces ) xResult.set(createFromStart(Element, Attribs)); else if (mxContext.is()) { @@ -2265,6 +2303,12 @@ OOXMLFastContextHandlerWrapper::lcl_createFastChildContext else xResult.set(this); + if ( bInTokens ) + { + OOXMLFastContextHandlerShape* pShapeCtx = (OOXMLFastContextHandlerShape*)mpParent; + pShapeCtx->sendShape( Element ); + } + return xResult; } diff --git a/writerfilter/source/ooxml/OOXMLFastContextHandler.hxx b/writerfilter/source/ooxml/OOXMLFastContextHandler.hxx index 479cf0e4e78f..e8fb0efc0f7b 100644 --- a/writerfilter/source/ooxml/OOXMLFastContextHandler.hxx +++ b/writerfilter/source/ooxml/OOXMLFastContextHandler.hxx @@ -558,6 +558,9 @@ protected: class OOXMLFastContextHandlerShape: public OOXMLFastContextHandlerProperties { +private: + bool m_bShapeSent; + public: explicit OOXMLFastContextHandlerShape (OOXMLFastContextHandler * pContext); @@ -585,6 +588,9 @@ public: virtual void setToken(Token_t nToken); virtual ResourceEnum_t getResource() const { return SHAPE; } + + void sendShape( Token_t Element ); + protected: typedef uno::Reference ShapeContextRef; ShapeContextRef mrShapeContext; @@ -649,6 +655,7 @@ public: virtual ResourceEnum_t getResource() const; void addNamespace(const Id & nId); + void addToken( Token_t Element ); virtual void newProperty(const Id & rId, OOXMLValue::Pointer_t pVal); virtual void setPropertySet(OOXMLPropertySet::Pointer_t pPropertySet); @@ -683,6 +690,7 @@ protected: private: uno::Reference mxContext; set mMyNamespaces; + set mMyTokens; OOXMLPropertySet::Pointer_t mpPropertySet; OOXMLFastContextHandler * getFastContextHandler() const; diff --git a/writerfilter/source/ooxml/makefile.mk b/writerfilter/source/ooxml/makefile.mk index e63ac5e15ee6..3cd7cd8066b5 100644 --- a/writerfilter/source/ooxml/makefile.mk +++ b/writerfilter/source/ooxml/makefile.mk @@ -151,6 +151,8 @@ OOXMLGPERFFASTTOKENXSL=gperffasttokenhandler.xsl OOXMLRESOURCEIDSHXX=$(OOXMLHXXOUTDIR)$/resourceids.hxx +NSPROCESS=namespace_preprocess.pl + TOKENXML=$(OOXMLCXXOUTDIR)$/token.xml TOKENXMLTMP=$(OOXMLCXXOUTDIR)$/token.tmp @@ -162,6 +164,7 @@ OOXMLVALUESHXX=$(OOXMLCXXOUTDIR)$/OOXMLvalues.hxx OOXMLVALUESCXX=$(OOXMLCXXOUTDIR)$/OOXMLvalues.cxx GPERFFASTTOKENHXX=$(OOXMLHXXOUTDIR)$/gperffasttoken.hxx MODELPROCESSED=$(MISC)$/model_preprocessed.xml +NSXSL=$(MISC)$/namespacesmap.xsl OOXMLGENHEADERS= \ $(OOXMLFASTRESOURCESHXX) \ @@ -186,8 +189,15 @@ $(TOKENXMLTMP): $(SOLARVER)$/$(INPATH)$/inc$(UPDMINOREXT)$/oox$/token.txt $(TOKENXML): tokenxmlheader $(TOKENXMLTMP) tokenxmlfooter $(TYPE) tokenxmlheader $(TOKENXMLTMP) tokenxmlfooter > $@ -$(MODELPROCESSED): $(OOXMLPREPROCESSXSL) $(OOXMLMODEL) - $(XSLTPROC) $(OOXMLPREPROCESSXSL) $(OOXMLMODEL) > $@ +$(MISC)$/$(OOXMLPREPROCESSXSL): $(OOXMLPREPROCESSXSL) + $(COPY) $(PWD)$/$(OOXMLPREPROCESSXSL) $(MISC) + +$(NSXSL) : $(OOXMLMODEL) $(SOLARVER)$/$(INPATH)$/inc$(UPDMINOREXT)$/oox$/namespaces.txt $(NSPROCESS) + $(PERL) $(NSPROCESS) $(SOLARVER)$/$(INPATH)$/inc$(UPDMINOREXT)$/oox$/namespaces.txt > $@ + + +$(MODELPROCESSED): $(NSXSL) $(MISC)$/$(OOXMLPREPROCESSXSL) $(OOXMLMODEL) + $(XSLTPROC) $(NSXSL) $(OOXMLMODEL) > $@ $(OOXMLHXXOUTDIRCREATED): $(MKDIRHIER) $(OOXMLHXXOUTDIR) diff --git a/writerfilter/source/ooxml/model.xml b/writerfilter/source/ooxml/model.xml index d6c194921e68..add4a80b551e 100644 --- a/writerfilter/source/ooxml/model.xml +++ b/writerfilter/source/ooxml/model.xml @@ -1,23 +1,24 @@ - - - - - - - - - - - - - + + + + + + + + + + + + + + @@ -6505,11 +6506,17 @@ + + + Absolute Position Offset Value + + + Relative Horizontal Alignment Positions @@ -6553,10 +6560,10 @@ - + - + @@ -6564,6 +6571,9 @@ Horizontal Position Relative Base + + + Vertical Alignment Definition @@ -6607,10 +6617,10 @@ - + - + @@ -6793,6 +6803,7 @@ + left right @@ -6800,6 +6811,7 @@ inside outside + margin page @@ -6815,6 +6827,7 @@ + top bottom @@ -8326,8 +8339,6 @@ - - @@ -15471,19 +15482,19 @@ - + Z-Ordering of Page Border - + Pages to Display Page Borders - + Page Border Positioning @@ -16563,15 +16574,18 @@ + + + - + - + @@ -17550,7 +17564,7 @@ - + Conditional Formatting Bit Mask @@ -19867,16 +19881,16 @@ - + - + - + @@ -19886,20 +19900,29 @@ - + - + - + Table Style Conditional Formatting Type + + + + + + + + + Style Types @@ -19999,12 +20022,12 @@ - + - + @@ -20014,17 +20037,17 @@ - + - + - + @@ -21617,6 +21640,11 @@ + + + + + @@ -21681,6 +21709,7 @@ + @@ -21775,8 +21804,6 @@ - - @@ -22251,6 +22278,8 @@ + + @@ -22863,20 +22892,20 @@ - - wholeTable - firstRow - lastRow - firstCol - lastCol - band1Vert - band2Vert - band1Horz - band2Horz - neCell - nwCell - seCell - swCell + + wholeTable + firstRow + lastRow + firstCol + lastCol + band1Vert + band2Vert + band1Horz + band2Horz + neCell + nwCell + seCell + swCell paragraph @@ -22884,6 +22913,14 @@ table numbering + + + + + + + + diff --git a/writerfilter/source/ooxml/modelpreprocess.xsl b/writerfilter/source/ooxml/modelpreprocess.xsl index 51efa93f33f1..90376fc08903 100644 --- a/writerfilter/source/ooxml/modelpreprocess.xsl +++ b/writerfilter/source/ooxml/modelpreprocess.xsl @@ -225,4 +225,4 @@ - \ No newline at end of file + diff --git a/writerfilter/source/ooxml/namespace_preprocess.pl b/writerfilter/source/ooxml/namespace_preprocess.pl new file mode 100644 index 000000000000..22c172329f61 --- /dev/null +++ b/writerfilter/source/ooxml/namespace_preprocess.pl @@ -0,0 +1,65 @@ +$ARGV0 = shift @ARGV; + +print < + + + + + + + + + + + + + + + + + + + + + + +EOF + + +# print the mapping +open ( NAMESPACES, $ARGV0 ) || die "can't open namespace file: $!"; +$group = 0; +$i = 1; +while ( ) +{ + chomp( $_ ); + $_ =~ s/\s*//g; + if ( $_ =~ m/^$/ ) + { + # Start a new group + $i = 0; + $group++; + } + elsif ( $_ =~ m/^[^#]/ ) + { + # Neither an empty line nor a comment + $_ =~ /^[a-zA-Z0-9-_]+$/ or die "Invalid namespace token $_"; + $_ =~ s/-/_/g; + $no = $group*10 + $i; + print < + $no + +EOF + ++$i; + } +} + +print < + + + +EOF diff --git a/writerfilter/source/ooxml/resourcestools.xsl b/writerfilter/source/ooxml/resourcestools.xsl index 9b17e4d3126f..7296cbd34154 100644 --- a/writerfilter/source/ooxml/resourcestools.xsl +++ b/writerfilter/source/ooxml/resourcestools.xsl @@ -92,6 +92,20 @@ match="rng:define" use="ancestor::rng:grammar/@application"/> + + + + /* + + + / + + + [@name= + + ] + */ + @@ -398,7 +412,7 @@ public: Generate switch body for createFastChildContext --> - + @@ -1543,6 +1557,12 @@ uno::Reference < xml::sax::XFastParser > OOXMLStreamImpl::getFastParser() + + + + + msValue = sText; + @@ -1555,6 +1575,12 @@ uno::Reference < xml::sax::XFastParser > OOXMLStreamImpl::getFastParser() ); + + + + + mnValue = sText.toInt32(); + @@ -1568,6 +1594,12 @@ uno::Reference < xml::sax::XFastParser > OOXMLStreamImpl::getFastParser() + + + + mnValue = sText.toInt32(16); + + @@ -1580,6 +1612,12 @@ uno::Reference < xml::sax::XFastParser > OOXMLStreamImpl::getFastParser() + + + + setValue( sText ); + + @@ -1592,6 +1630,35 @@ uno::Reference < xml::sax::XFastParser > OOXMLStreamImpl::getFastParser() + + + + + + + + + + + + + + + + + + mpValue = OOXMLValue::Pointer_t (new + + ( sText ) ); + + + + + + + + + @@ -1739,9 +1806,9 @@ void - + - + createFromStart(Element, Attribs) @@ -1999,6 +2066,29 @@ void + + + + + + + + + + + + + + + + + + + + + + + diff --git a/writerfilter/source/resourcemodel/WW8Analyzer.cxx b/writerfilter/source/resourcemodel/WW8Analyzer.cxx index 729d5bf54cb4..15a8470bac8b 100644 --- a/writerfilter/source/resourcemodel/WW8Analyzer.cxx +++ b/writerfilter/source/resourcemodel/WW8Analyzer.cxx @@ -168,6 +168,14 @@ void WW8Analyzer::info(const string & /*info*/) { } +void WW8Analyzer::startShape( ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > /*xShape*/ ) +{ +} + +void WW8Analyzer::endShape( ) +{ +} + void WW8Analyzer::dumpStats(ostream & o) const { { diff --git a/writerfilter/source/resourcemodel/WW8Analyzer.hxx b/writerfilter/source/resourcemodel/WW8Analyzer.hxx index dbedd3195439..339b7adeab61 100644 --- a/writerfilter/source/resourcemodel/WW8Analyzer.hxx +++ b/writerfilter/source/resourcemodel/WW8Analyzer.hxx @@ -92,6 +92,8 @@ public: virtual void substream(Id name, writerfilter::Reference::Pointer_t ref); virtual void info(const string & info); + virtual void startShape( ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > xShape ); + virtual void endShape( ); void dumpStats(ostream & o) const; }; diff --git a/writerfilter/source/resourcemodel/resourcemodel.cxx b/writerfilter/source/resourcemodel/resourcemodel.cxx index c96a04716bfa..0bfa9845ffe8 100644 --- a/writerfilter/source/resourcemodel/resourcemodel.cxx +++ b/writerfilter/source/resourcemodel/resourcemodel.cxx @@ -267,6 +267,16 @@ void WW8StreamHandler::endCharacterGroup() output.addItem(""); } +void WW8StreamHandler::startShape( ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > /*xShape*/ ) +{ + output.addItem(""); +} + +void WW8StreamHandler::endShape( ) +{ + output.addItem( "" ); +} + void WW8StreamHandler::text(const sal_uInt8 * data, size_t len) { string tmpStr = ""; diff --git a/writerfilter/source/resourcemodel/resourcemodel.hxx b/writerfilter/source/resourcemodel/resourcemodel.hxx index 681a83c23320..314cc4a83c8f 100644 --- a/writerfilter/source/resourcemodel/resourcemodel.hxx +++ b/writerfilter/source/resourcemodel/resourcemodel.hxx @@ -51,6 +51,9 @@ public: virtual void table(Id name, writerfilter::Reference
::Pointer_t ref); + virtual void startShape( ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > xShape ); + virtual void endShape( ); + virtual void substream(Id name, writerfilter::Reference::Pointer_t ref); virtual void info(const string & info); -- cgit From 17e16f466b88adeef6f80a7c1b75d37daed1ddf5 Mon Sep 17 00:00:00 2001 From: Vladimir Glazunov Date: Thu, 26 Nov 2009 14:26:19 +0100 Subject: #i10000# fix for deliver path --- writerperfect/prj/d.lst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/writerperfect/prj/d.lst b/writerperfect/prj/d.lst index 7cd3b89ad092..5b5852c6a86f 100644 --- a/writerperfect/prj/d.lst +++ b/writerperfect/prj/d.lst @@ -1,4 +1,4 @@ ..\%__SRC%\lib\libwpft*.so %_DEST%\lib%_EXT% -..\%__SRC%\bin\wpft*.dll %_DEST%\lib%_EXT% +..\%__SRC%\bin\wpft*.dll %_DEST%\bin%_EXT% ..\%__SRC%\bin\wpftgo.dll %_DEST%\bin%_EXT%\wpftgo.dll ..\%__SRC%\lib\*.dylib %_DEST%\lib%_EXT%\*.dylib -- cgit From 81087627f30494064a791bffd61ec99b5b289b4f Mon Sep 17 00:00:00 2001 From: Vladimir Glazunov Date: Mon, 30 Nov 2009 14:18:54 +0100 Subject: #i10000# fix for wrong merge --- writerfilter/source/ooxml/makefile.mk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/writerfilter/source/ooxml/makefile.mk b/writerfilter/source/ooxml/makefile.mk index 67d019608dc2..e154a29b01c0 100644 --- a/writerfilter/source/ooxml/makefile.mk +++ b/writerfilter/source/ooxml/makefile.mk @@ -195,9 +195,9 @@ $(MISC)$/$(OOXMLPREPROCESSXSL): $(OOXMLPREPROCESSXSL) $(NSXSL) : $(OOXMLMODEL) $(SOLARVER)$/$(INPATH)$/inc$(UPDMINOREXT)$/oox$/namespaces.txt $(NSPROCESS) @$(PERL) $(NSPROCESS) $(SOLARVER)$/$(INPATH)$/inc$(UPDMINOREXT)$/oox$/namespaces.txt > $@ -$(MODELPROCESSED): $(OOXMLPREPROCESSXSL) $(OOXMLMODEL) +$(MODELPROCESSED): $(NSXSL) $(MISC)$/$(OOXMLPREPROCESSXSL) $(OOXMLMODEL) @echo "Making: " $(@:f) - $(COMMAND_ECHO)$(XSLTPROC) $(OOXMLPREPROCESSXSL) $(OOXMLMODEL) > $@ + $(COMMAND_ECHO)$(XSLTPROC) $(NSXSL) $(OOXMLMODEL) > $@ $(OOXMLHXXOUTDIRCREATED): @$(MKDIRHIER) $(OOXMLHXXOUTDIR) -- cgit