xmloff/source/chart/SchXMLChartContext.cxx | 4 +-- xmloff/source/chart/SchXMLTableContext.cxx | 33 +++++++++++++++++++++++++++-- xmloff/source/chart/SchXMLTableContext.hxx | 5 ++-- 3 files changed, 36 insertions(+), 6 deletions(-)
New commits: commit 6e6c25a4c18169e7f07a8fd23058ed17d719f44f Author: Markus Mohrhard <markus.mohrh...@googlemail.com> Date: Sun Jun 30 03:44:05 2013 +0200 transpose "data in rows" ranges for internal data provider, fdo#62057 This is an ugly hack but it at least works. This regression has been introduced by the merge from the AOO code. The order of calls during import is totally screwed and I have no idea how to properly fix all these problems without introducing new regressions. The best solution would be to move the import/export code into chart2 where we could manipulate tese properties directly and would not need to transform the same information N times until it is written into the chart code. (cherry picked from commit 14fa5488a829936275f79a7693b13da55114220e) Conflicts: xmloff/source/chart/SchXMLTableContext.cxx Change-Id: Id53c49441c683b19a973a48884135a3f4e89de03 Reviewed-on: https://gerrit.libreoffice.org/4628 Reviewed-by: David Tardon <dtar...@redhat.com> Tested-by: David Tardon <dtar...@redhat.com> diff --git a/xmloff/source/chart/SchXMLChartContext.cxx b/xmloff/source/chart/SchXMLChartContext.cxx index 5aeb93b..69410a5 100644 --- a/xmloff/source/chart/SchXMLChartContext.cxx +++ b/xmloff/source/chart/SchXMLChartContext.cxx @@ -788,7 +788,7 @@ void SchXMLChartContext::EndElement() //own data or only rectangular range available if( xNewDoc->hasInternalDataProvider() ) - SchXMLTableHelper::applyTableToInternalDataProvider( maTable, xNewDoc ); + SchXMLTableHelper::applyTableToInternalDataProvider( maTable, xNewDoc, meDataRowSource ); bool bOlderThan2_3 = SchXMLTools::isDocumentGeneratedWithOpenOfficeOlderThan2_3( Reference< frame::XModel >( xNewDoc, uno::UNO_QUERY )); bool bOldFileWithOwnDataFromRows = (bOlderThan2_3 && bHasOwnData && (meDataRowSource==chart::ChartDataRowSource_ROWS)); // in this case there are range addresses that are simply wrong. @@ -825,7 +825,7 @@ void SchXMLChartContext::EndElement() if( !xNewDoc->hasInternalDataProvider() ) { xNewDoc->createInternalDataProvider( sal_False /* bCloneExistingData */ ); - SchXMLTableHelper::applyTableToInternalDataProvider( maTable, xNewDoc ); + SchXMLTableHelper::applyTableToInternalDataProvider( maTable, xNewDoc, meDataRowSource ); try { lcl_ApplyDataFromRectangularRangeToDiagram( xNewDoc, msChartAddress, meDataRowSource, mbRowHasLabels, mbColHasLabels, bHasOwnData, msColTrans, msRowTrans ); diff --git a/xmloff/source/chart/SchXMLTableContext.cxx b/xmloff/source/chart/SchXMLTableContext.cxx index 206e5e8..ea877d6 100644 --- a/xmloff/source/chart/SchXMLTableContext.cxx +++ b/xmloff/source/chart/SchXMLTableContext.cxx @@ -775,9 +775,35 @@ static void lcl_ApplyCellToComplexLabel( const SchXMLCell& rCell, Sequence< uno: } } +namespace { + +void transposeTable(SchXMLTable& rTable) +{ + std::vector<std::vector<SchXMLCell> > aNewData; + sal_Int32 nRows = rTable.aData.size(); + aNewData.resize(rTable.nMaxColumnIndex+1); + for(sal_Int32 i = 0; i < nRows; ++i) + { + sal_Int32 nCols = rTable.aData[i].size(); + for(sal_Int32 j = 0; j < nCols; ++j) + { + SchXMLCell& rCell = rTable.aData[i][j]; + aNewData[j].push_back(rCell); + } + } + bool bHasRowHeader = rTable.bHasHeaderRow; + bool bHasColHeader = rTable.bHasHeaderColumn; + rTable.bHasHeaderColumn = bHasRowHeader; + rTable.bHasHeaderRow = bHasColHeader; + rTable.nMaxColumnIndex = nRows; + rTable.aData = aNewData; +} + +} + void SchXMLTableHelper::applyTableToInternalDataProvider( - const SchXMLTable& rTable, - uno::Reference< chart2::XChartDocument > xChartDoc ) + SchXMLTable rTable, + uno::Reference< chart2::XChartDocument > xChartDoc, chart::ChartDataRowSource eDataRowSource ) { // apply all data read from the local table to the internal data provider if( !xChartDoc.is() || !xChartDoc->hasInternalDataProvider() ) @@ -786,6 +812,9 @@ void SchXMLTableHelper::applyTableToInternalDataProvider( if( !xDataProv.is() ) return; + if(eDataRowSource == chart::ChartDataRowSource_ROWS) + transposeTable(rTable); + //prepare the read local table data sal_Int32 nNumRows( static_cast< sal_Int32 >( rTable.aData.size())); sal_Int32 nRowOffset = 0; diff --git a/xmloff/source/chart/SchXMLTableContext.hxx b/xmloff/source/chart/SchXMLTableContext.hxx index 1d06dd5..811e921 100644 --- a/xmloff/source/chart/SchXMLTableContext.hxx +++ b/xmloff/source/chart/SchXMLTableContext.hxx @@ -82,8 +82,9 @@ private: sal_Int32& nRows, sal_Int32& nColumns ); public: - static void applyTableToInternalDataProvider( const SchXMLTable& rTable, - com::sun::star::uno::Reference< com::sun::star::chart2::XChartDocument > xChartDoc ); + static void applyTableToInternalDataProvider( SchXMLTable rTable, + com::sun::star::uno::Reference< com::sun::star::chart2::XChartDocument > xChartDoc, + com::sun::star::chart::ChartDataRowSource eDataRowSource ); /** This function reorders local data to fit the correct data structure. Call it after the data series got their styles set. _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits