oox/inc/oox/xls/drawingbase.hxx | 10 ++++++- oox/inc/oox/xls/pivotcachebuffer.hxx | 16 ++++++++++- oox/inc/oox/xls/pivottablebuffer.hxx | 2 + oox/source/token/properties.txt | 1 oox/source/xls/drawingbase.cxx | 30 +++++++++++++++++++++ oox/source/xls/drawingfragment.cxx | 3 +- oox/source/xls/pivotcachebuffer.cxx | 50 +++++++++++++++++++++++++++++++---- oox/source/xls/pivottablebuffer.cxx | 26 ++++++++++++++++-- 8 files changed, 127 insertions(+), 11 deletions(-)
New commits: commit 3d62ea9a928c4a814369d5b6c276ac78239aeeeb Author: Noel Power <[email protected]> Date: Fri Jan 27 15:11:29 2012 +0000 import group field group name user captions fdo#45310 diff --git a/oox/inc/oox/xls/pivotcachebuffer.hxx b/oox/inc/oox/xls/pivotcachebuffer.hxx index 5f73527..b56de30 100644 --- a/oox/inc/oox/xls/pivotcachebuffer.hxx +++ b/oox/inc/oox/xls/pivotcachebuffer.hxx @@ -49,6 +49,9 @@ class WorksheetHelper; // ============================================================================ +typedef ::std::pair< sal_Int32, rtl::OUString > IdCaptionPair; +typedef ::std::vector< IdCaptionPair > IdCaptionPairList; + class PivotCacheItem { public: @@ -103,6 +106,9 @@ public: inline bool isUnused() const { return mbUnused; } private: +friend class PivotCacheItemList; + // #FIXME hack Sets the value of this item to the given string ( and overwrites type if necessary + void setStringValue( const rtl::OUString& sName ); ::com::sun::star::uno::Any maValue; /// Value of the item. sal_Int32 mnType; /// Value type (OOXML token identifier). bool mbUnused; @@ -131,6 +137,7 @@ public: const PivotCacheItem* getCacheItem( sal_Int32 nItemIdx ) const; /** Returns the names of all items. */ void getCacheItemNames( ::std::vector< ::rtl::OUString >& orItemNames ) const; + void applyItemCaptions( const IdCaptionPairList& vCaptions ); private: /** Creates and returns a new item at the end of the items list. */ @@ -262,6 +269,8 @@ public: void importPCDFRangePr( BiffInputStream& rStrm ); /** Imports the mapping between group items and base items from the PCDFDISCRETEPR record. */ void importPCDFDiscretePr( BiffInputStream& rStrm ); + /** Apply user Captions to imported group data */ + void applyItemCaptions( const IdCaptionPairList& vCaptions ); /** Returns true, if the field is based on source data, or false if it is grouped or calculated. */ inline bool isDatabaseField() const { return maFieldModel.mbDatabaseField; } @@ -318,7 +327,6 @@ public: void importPCItemIndex( BiffInputStream& rStrm, WorksheetHelper& rSheetHelper, sal_Int32 nCol, sal_Int32 nRow ) const; - private: /** Tries to write the passed value to the passed sheet position. */ void writeItemToSourceDataCell( WorksheetHelper& rSheetHelper, diff --git a/oox/inc/oox/xls/pivottablebuffer.hxx b/oox/inc/oox/xls/pivottablebuffer.hxx index f118476..1d7c10c 100644 --- a/oox/inc/oox/xls/pivottablebuffer.hxx +++ b/oox/inc/oox/xls/pivottablebuffer.hxx @@ -49,6 +49,7 @@ struct PTFieldItemModel { sal_Int32 mnCacheItem; /// Index to shared item in pivot cache. sal_Int32 mnType; /// Type of the item. + rtl::OUString msCaption; /// User caption of the item bool mbShowDetails; /// True = show item details (items of child fields). bool mbHidden; /// True = item is hidden. diff --git a/oox/source/xls/pivotcachebuffer.cxx b/oox/source/xls/pivotcachebuffer.cxx index 5132b7d..77b5a0f 100644 --- a/oox/source/xls/pivotcachebuffer.cxx +++ b/oox/source/xls/pivotcachebuffer.cxx @@ -302,6 +302,12 @@ void PivotCacheItem::readError( BiffInputStream& rStrm ) mnType = XML_e; } +void PivotCacheItem::setStringValue( const OUString& sString ) +{ + mnType = XML_s; + maValue <<= sString; +} + OUString PivotCacheItem::getName() const { switch( mnType ) @@ -393,6 +399,15 @@ const PivotCacheItem* PivotCacheItemList::getCacheItem( sal_Int32 nItemIdx ) con return ContainerHelper::getVectorElement( maItems, nItemIdx ); } +void PivotCacheItemList::applyItemCaptions( const IdCaptionPairList& vCaptions ) +{ + for( IdCaptionPairList::const_iterator aIt = vCaptions.begin(), aEnd = vCaptions.end(); aIt != aEnd; ++aIt ) + { + if ( static_cast<sal_uInt32>( aIt->first ) < maItems.size() ) + maItems[ aIt->first ].setStringValue( aIt->second ); + } +} + void PivotCacheItemList::getCacheItemNames( ::std::vector< OUString >& orItemNames ) const { orItemNames.clear(); @@ -753,6 +768,14 @@ const PivotCacheItem* PivotCacheField::getCacheItem( sal_Int32 nItemIdx ) const return 0; } +void PivotCacheField::applyItemCaptions( const IdCaptionPairList& vCaptions ) +{ + if( hasGroupItems() ) + maGroupItems.applyItemCaptions( vCaptions ); + if( hasSharedItems() ) + maSharedItems.applyItemCaptions( vCaptions ); +} + void PivotCacheField::getCacheItemNames( ::std::vector< OUString >& orItemNames ) const { if( hasGroupItems() ) diff --git a/oox/source/xls/pivottablebuffer.cxx b/oox/source/xls/pivottablebuffer.cxx index 7e6d298..ef390ca 100644 --- a/oox/source/xls/pivottablebuffer.cxx +++ b/oox/source/xls/pivottablebuffer.cxx @@ -370,6 +370,7 @@ void PivotTableField::importItem( const AttributeList& rAttribs ) aModel.mnType = rAttribs.getToken( XML_t, XML_data ); aModel.mbShowDetails = rAttribs.getBool( XML_sd, true ); aModel.mbHidden = rAttribs.getBool( XML_h, false ); + aModel.msCaption = rAttribs.getXString( XML_n, OUString() ); maItems.push_back( aModel ); } @@ -548,6 +549,7 @@ void PivotTableField::finalizeImport( const Reference< XDataPilotDescriptor >& r } else if( pCacheField->hasParentGrouping() ) { + // create a list of all item names, needed to map between original and group items ::std::vector< OUString > aItems; pCacheField->getCacheItemNames( aItems ); @@ -585,6 +587,17 @@ void PivotTableField::finalizeParentGroupingImport( const Reference< XDataPilotF { if( const PivotCacheField* pCacheField = mrPivotTable.getCacheField( mnFieldIndex ) ) { + // data field can have user defined groupname captions, apply them + // if they do + IdCaptionPairList captionList; + for( ItemModelVector::iterator aIt = maItems.begin(), aEnd = maItems.end(); aIt != aEnd; ++aIt ) + { + if ( aIt->mnType == XML_data && aIt->msCaption.getLength() ) + captionList.push_back( IdCaptionPair( aIt->mnCacheItem, aIt->msCaption ) ); + } + // #FIXME find another way out of this const nightmare prison + if ( !captionList.empty() ) + const_cast<PivotCacheField*>( pCacheField )->applyItemCaptions( captionList ); maDPFieldName = pCacheField->createParentGroupField( rxBaseDPField, rBaseCacheField, orItemNames ); // on success, try to create nested group fields Reference< XDataPilotField > xDPField = mrPivotTable.getDataPilotField( maDPFieldName ); commit 50be8ec9ed680c9b5b419d549e981c7a335b0257 Author: Noel Power <[email protected]> Date: Thu Jan 26 16:29:07 2012 +0000 fix corrupted numbers in pivottable using group field as data field fdo#45276 diff --git a/oox/source/xls/pivottablebuffer.cxx b/oox/source/xls/pivottablebuffer.cxx index 850dda8..7e6d298 100644 --- a/oox/source/xls/pivottablebuffer.cxx +++ b/oox/source/xls/pivottablebuffer.cxx @@ -1420,8 +1420,15 @@ void PivotTable::finalizeImport() // all data fields for( DataFieldVector::iterator aIt = maDataFields.begin(), aEnd = maDataFields.end(); aIt != aEnd; ++aIt ) + { + if( const PivotCacheField* pCacheField = getCacheField( aIt->mnField ) ) + { + if ( pCacheField-> getGroupBaseField() != -1 ) + aIt->mnField = pCacheField-> getGroupBaseField(); + } if( PivotTableField* pField = getTableField( aIt->mnField ) ) pField->convertDataField( *aIt ); + } // filters maFilters.forEachMem( &PivotTableFilter::finalizeImport ); commit 16af091a3339f6d00fe273f9dc5f155126e58881 Author: Noel Power <[email protected]> Date: Thu Jan 26 14:28:36 2012 +0000 fix corrupted group field entries in xlsx imported pivot table fdo#45268 diff --git a/oox/inc/oox/xls/pivotcachebuffer.hxx b/oox/inc/oox/xls/pivotcachebuffer.hxx index 208fbd4..5f73527 100644 --- a/oox/inc/oox/xls/pivotcachebuffer.hxx +++ b/oox/inc/oox/xls/pivotcachebuffer.hxx @@ -99,10 +99,13 @@ public: inline const ::com::sun::star::uno::Any& getValue() const { return maValue; } /** Returns the string representation of the item. */ ::rtl::OUString getName() const; + /** Returns true if the item is unused. */ + inline bool isUnused() const { return mbUnused; } private: ::com::sun::star::uno::Any maValue; /// Value of the item. sal_Int32 mnType; /// Value type (OOXML token identifier). + bool mbUnused; }; // ---------------------------------------------------------------------------- @@ -285,6 +288,8 @@ public: const PivotCacheItem* getCacheItem( sal_Int32 nItemIdx ) const; /** Returns the names of all shared or group items. */ void getCacheItemNames( ::std::vector< ::rtl::OUString >& orItemNames ) const; + /** Returns shared or group items. */ + PivotCacheItemList getCacheItems() const; /** Creates inplace numeric grouping settings. */ void convertNumericGrouping( @@ -295,6 +300,7 @@ public: /** Creates a new grouped DataPilot field and returns its name. */ ::rtl::OUString createParentGroupField( const ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XDataPilotField >& rxBaseDPField, + const PivotCacheField& rBaseCacheField, PivotCacheGroupItemVector& orItemNames ) const; /** Writes the title of the field into the passed sheet at the passed address. */ diff --git a/oox/inc/oox/xls/pivottablebuffer.hxx b/oox/inc/oox/xls/pivottablebuffer.hxx index 25c7bb1..f118476 100644 --- a/oox/inc/oox/xls/pivottablebuffer.hxx +++ b/oox/inc/oox/xls/pivottablebuffer.hxx @@ -170,6 +170,7 @@ public: /** Finalizes the grouped field after import. */ void finalizeParentGroupingImport( const ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XDataPilotField >& rxBaseDPField, + const PivotCacheField& rBaseCacheField, PivotCacheGroupItemVector& orItemNames ); /** Returns the name of the DataPilot field in the fields collection. */ diff --git a/oox/source/xls/pivotcachebuffer.cxx b/oox/source/xls/pivotcachebuffer.cxx index e4ed2a3..5132b7d 100644 --- a/oox/source/xls/pivotcachebuffer.cxx +++ b/oox/source/xls/pivotcachebuffer.cxx @@ -173,7 +173,7 @@ void lclAdjustBinDateTime( DateTime& orDateTime ) // ============================================================================ PivotCacheItem::PivotCacheItem() : - mnType( XML_m ) + mnType( XML_m ), mbUnused( false ) { } @@ -187,6 +187,7 @@ void PivotCacheItem::readNumeric( const AttributeList& rAttribs ) { maValue <<= rAttribs.getDouble( XML_v, 0.0 ); mnType = XML_n; + mbUnused = rAttribs.getBool( XML_u, false ); } void PivotCacheItem::readDate( const AttributeList& rAttribs ) @@ -760,6 +761,13 @@ void PivotCacheField::getCacheItemNames( ::std::vector< OUString >& orItemNames maSharedItems.getCacheItemNames( orItemNames ); } +PivotCacheItemList PivotCacheField::getCacheItems() const +{ + if( hasGroupItems() ) + return maGroupItems; + return maSharedItems; +} + void PivotCacheField::convertNumericGrouping( const Reference< XDataPilotField >& rxDPField ) const { OSL_ENSURE( hasGroupItems() && hasNumericGrouping(), "PivotCacheField::convertNumericGrouping - not a numeric group field" ); @@ -822,7 +830,7 @@ OUString PivotCacheField::createDateGroupField( const Reference< XDataPilotField return xFieldName.is() ? xFieldName->getName() : OUString(); } -OUString PivotCacheField::createParentGroupField( const Reference< XDataPilotField >& rxBaseDPField, PivotCacheGroupItemVector& orItemNames ) const +OUString PivotCacheField::createParentGroupField( const Reference< XDataPilotField >& rxBaseDPField, const PivotCacheField& rBaseCacheField, PivotCacheGroupItemVector& orItemNames ) const { OSL_ENSURE( hasGroupItems() && !maDiscreteItems.empty(), "PivotCacheField::createParentGroupField - not a group field" ); OSL_ENSURE( maDiscreteItems.size() == orItemNames.size(), "PivotCacheField::createParentGroupField - number of item names does not match grouping info" ); @@ -834,16 +842,25 @@ OUString PivotCacheField::createParentGroupField( const Reference< XDataPilotFie typedef ::std::vector< GroupItemList > GroupItemMap; GroupItemMap aItemMap( maGroupItems.size() ); for( IndexVector::const_iterator aBeg = maDiscreteItems.begin(), aIt = aBeg, aEnd = maDiscreteItems.end(); aIt != aEnd; ++aIt ) + { if( GroupItemList* pItems = ContainerHelper::getVectorElementAccess( aItemMap, *aIt ) ) + { + if ( const PivotCacheItem* pItem = rBaseCacheField.getCacheItems().getCacheItem( aIt - aBeg ) ) + { + // Skip unspecified or ununsed entries or errors + if ( pItem->isUnused() || ( pItem->getType() == XML_m ) || ( pItem->getType() == XML_e ) ) + continue; + } pItems->push_back( static_cast< sal_Int32 >( aIt - aBeg ) ); + } + } // process all groups Reference< XDataPilotField > xDPGroupField; for( GroupItemMap::iterator aBeg = aItemMap.begin(), aIt = aBeg, aEnd = aItemMap.end(); aIt != aEnd; ++aIt ) { OSL_ENSURE( !aIt->empty(), "PivotCacheField::createParentGroupField - item/group should not be empty" ); - // if the item count is greater than 1, the item is a group of items - if( aIt->size() > 1 ) + if( !aIt->empty() ) { /* Insert the names of the items that are part of this group. Calc expects the names of the members of the field whose members are @@ -860,7 +877,7 @@ OUString PivotCacheField::createParentGroupField( const Reference< XDataPilotFie /* Check again, that this is not just a group that is not grouped further with other items. */ - if( aMembers.size() > 1 ) try + if( !aMembers.empty() ) try { // only the first call of createNameGroup() returns the new field Reference< XDataPilotField > xDPNewField = xDPGrouping->createNameGroup( ContainerHelper::vectorToSequence( aMembers ) ); diff --git a/oox/source/xls/pivottablebuffer.cxx b/oox/source/xls/pivottablebuffer.cxx index fefced8..850dda8 100644 --- a/oox/source/xls/pivottablebuffer.cxx +++ b/oox/source/xls/pivottablebuffer.cxx @@ -579,13 +579,13 @@ void PivotTableField::finalizeDateGroupingImport( const Reference< XDataPilotFie } } -void PivotTableField::finalizeParentGroupingImport( const Reference< XDataPilotField >& rxBaseDPField, PivotCacheGroupItemVector& orItemNames ) +void PivotTableField::finalizeParentGroupingImport( const Reference< XDataPilotField >& rxBaseDPField, const PivotCacheField& rBaseCacheField, PivotCacheGroupItemVector& orItemNames ) { if( maDPFieldName.isEmpty() ) // prevent endless loops if file format is broken { if( const PivotCacheField* pCacheField = mrPivotTable.getCacheField( mnFieldIndex ) ) { - maDPFieldName = pCacheField->createParentGroupField( rxBaseDPField, orItemNames ); + maDPFieldName = pCacheField->createParentGroupField( rxBaseDPField, rBaseCacheField, orItemNames ); // on success, try to create nested group fields Reference< XDataPilotField > xDPField = mrPivotTable.getDataPilotField( maDPFieldName ); if( xDPField.is() ) @@ -1455,7 +1455,7 @@ void PivotTable::finalizeParentGroupingImport( const Reference< XDataPilotField { // try to create parent group fields that group the items of the passed base field if( PivotTableField* pParentTableField = maFields.get( rBaseCacheField.getParentGroupField() ).get() ) - pParentTableField->finalizeParentGroupingImport( rxBaseDPField, orItemNames ); + pParentTableField->finalizeParentGroupingImport( rxBaseDPField, rBaseCacheField, orItemNames ); } Reference< XDataPilotField > PivotTable::getDataPilotField( const OUString& rFieldName ) const commit c07e9299bb2c8d5477669568b12708bd2ff12684 Author: Noel Power <[email protected]> Date: Thu Jan 26 11:00:15 2012 +0000 improve xlsx shape/chart import, anchor to cell where needed fdo#45266 diff --git a/oox/inc/oox/xls/drawingbase.hxx b/oox/inc/oox/xls/drawingbase.hxx index c79eb7a..95fae46 100644 --- a/oox/inc/oox/xls/drawingbase.hxx +++ b/oox/inc/oox/xls/drawingbase.hxx @@ -32,6 +32,9 @@ #include "oox/drawingml/drawingmltypes.hxx" #include "oox/xls/worksheethelper.hxx" +#include <com/sun/star/drawing/XShape.hpp> +#include <com/sun/star/table/XCell.hpp> + namespace oox { namespace xls { @@ -108,7 +111,12 @@ public: /** Calculates the resulting shape anchor in 1/100 mm. */ ::com::sun::star::awt::Rectangle calcAnchorRectHmm( const ::com::sun::star::awt::Size& rPageSizeHmm ) const; - + /** Returns the 'to' cell if it exists */ + ::com::sun::star::uno::Reference< ::com::sun::star::table::XCell > getToCell() const; + /** Returns the 'from' cell if it exists */ + ::com::sun::star::uno::Reference< ::com::sun::star::table::XCell > getFromCell() const; + /** Applies Cell Anchor to an XShape if needed*/ + void applyToXShape( const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape>& rxShape ); private: /** Converts the passed anchor to an absolute position in EMUs. */ ::oox::drawingml::EmuPoint calcCellAnchorEmu( const CellAnchorModel& rModel ) const; diff --git a/oox/source/token/properties.txt b/oox/source/token/properties.txt index 9127c38..94a1947 100644 --- a/oox/source/token/properties.txt +++ b/oox/source/token/properties.txt @@ -9,6 +9,7 @@ AdjustLuminance AdjustmentValues Address Align +Anchor AnchorPosition ApplyFormDesignMode AreaLinks diff --git a/oox/source/xls/drawingbase.cxx b/oox/source/xls/drawingbase.cxx index 3369ba9..91ed337 100644 --- a/oox/source/xls/drawingbase.cxx +++ b/oox/source/xls/drawingbase.cxx @@ -32,6 +32,7 @@ #include "oox/helper/attributelist.hxx" #include "oox/helper/binaryinputstream.hxx" #include "oox/xls/unitconverter.hxx" +#include "oox/helper/propertyset.hxx" namespace oox { namespace xls { @@ -281,6 +282,35 @@ Rectangle ShapeAnchor::calcAnchorRectHmm( const Size& rPageSizeHmm ) const return Rectangle( lclEmuToHmm( aAnchorRect.X ), lclEmuToHmm( aAnchorRect.Y ), lclEmuToHmm( aAnchorRect.Width ), lclEmuToHmm( aAnchorRect.Height ) ); } +::com::sun::star::uno::Reference< ::com::sun::star::table::XCell > +ShapeAnchor::getToCell() const +{ + CellAddress aAddress; + aAddress.Sheet = getSheetIndex(); + aAddress.Row = maTo.mnRow; + aAddress.Column = maTo.mnCol; + return getCell( aAddress ); +} +::com::sun::star::uno::Reference< ::com::sun::star::table::XCell > +ShapeAnchor::getFromCell() const +{ + CellAddress aAddress; + aAddress.Sheet = getSheetIndex(); + aAddress.Row = maFrom.mnRow; + aAddress.Column = maFrom.mnCol; + return getCell( aAddress ); +} + +void +ShapeAnchor::applyToXShape( const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape>& rxShape ) +{ + if ( ( meAnchorType == ANCHOR_TWOCELL || meAnchorType == ANCHOR_ONECELL ) && getFromCell().is() ) + { + PropertySet aShapeProp( rxShape ); + aShapeProp.setProperty( PROP_Anchor, getFromCell() ); + } +} + // private -------------------------------------------------------------------- EmuPoint ShapeAnchor::calcCellAnchorEmu( const CellAnchorModel& rModel ) const diff --git a/oox/source/xls/drawingfragment.cxx b/oox/source/xls/drawingfragment.cxx index 75cf0c8..1fa504c 100644 --- a/oox/source/xls/drawingfragment.cxx +++ b/oox/source/xls/drawingfragment.cxx @@ -273,7 +273,8 @@ void DrawingFragment::onEndElement() basegfx::B2DHomMatrix aTransformation; mxShape->addShape( getOoxFilter(), &getTheme(), mxDrawPage, aTransformation, &aShapeRectEmu32 ); - + // apply Cell anchoring if necessary + mxAnchor->applyToXShape( mxShape->getXShape() ); /* Collect all shape positions in the WorksheetHelper base class. But first, scale EMUs to 1/100 mm. */ Rectangle aShapeRectHmm( _______________________________________________ Libreoffice-commits mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
