summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarkus Mohrhard <markus.mohrhard@googlemail.com>2013-06-30 03:44:05 +0200
committerMarkus Mohrhard <markus.mohrhard@googlemail.com>2013-06-30 04:01:36 +0200
commit14fa5488a829936275f79a7693b13da55114220e (patch)
treec9797b2139813c797f9c9fc05a22cff11cb24349
parent5e0813fc8ef1eb1b19392e46801a231b6f4e931c (diff)
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. Change-Id: Id53c49441c683b19a973a48884135a3f4e89de03
-rw-r--r--xmloff/source/chart/SchXMLChartContext.cxx4
-rw-r--r--xmloff/source/chart/SchXMLTableContext.cxx34
-rw-r--r--xmloff/source/chart/SchXMLTableContext.hxx5
3 files changed, 37 insertions, 6 deletions
diff --git a/xmloff/source/chart/SchXMLChartContext.cxx b/xmloff/source/chart/SchXMLChartContext.cxx
index 8c6aff2c04b0..f45b21056bcf 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 4834767fe1b0..7ffce593bdda 100644
--- a/xmloff/source/chart/SchXMLTableContext.cxx
+++ b/xmloff/source/chart/SchXMLTableContext.cxx
@@ -59,6 +59,7 @@ using ::com::sun::star::uno::Reference;
#if DEBUG_CHART_FILTER
#include <iostream>
+#endif
namespace {
@@ -858,9 +859,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() )
@@ -869,6 +896,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 20b87b563fad..864fa4e07059 100644
--- a/xmloff/source/chart/SchXMLTableContext.hxx
+++ b/xmloff/source/chart/SchXMLTableContext.hxx
@@ -77,8 +77,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.