summaryrefslogtreecommitdiff
path: root/xmloff/source/chart/SchXMLTableContext.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'xmloff/source/chart/SchXMLTableContext.cxx')
-rw-r--r--xmloff/source/chart/SchXMLTableContext.cxx711
1 files changed, 711 insertions, 0 deletions
diff --git a/xmloff/source/chart/SchXMLTableContext.cxx b/xmloff/source/chart/SchXMLTableContext.cxx
new file mode 100644
index 0000000000..4d03e199ef
--- /dev/null
+++ b/xmloff/source/chart/SchXMLTableContext.cxx
@@ -0,0 +1,711 @@
+/*************************************************************************
+ *
+ * $RCSfile: SchXMLTableContext.cxx,v $
+ *
+ * $Revision: 1.1.1.1 $
+ *
+ * last change: $Author: hr $ $Date: 2000-09-18 17:07:03 $
+ *
+ * The Contents of this file are made available subject to the terms of
+ * either of the following licenses
+ *
+ * - GNU Lesser General Public License Version 2.1
+ * - Sun Industry Standards Source License Version 1.1
+ *
+ * Sun Microsystems Inc., October, 2000
+ *
+ * GNU Lesser General Public License Version 2.1
+ * =============================================
+ * Copyright 2000 by Sun Microsystems, Inc.
+ * 901 San Antonio Road, Palo Alto, CA 94303, USA
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software Foundation.
+ *
+ * This library 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 for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ *
+ *
+ * Sun Industry Standards Source License Version 1.1
+ * =================================================
+ * The contents of this file are subject to the Sun Industry Standards
+ * Source License Version 1.1 (the "License"); You may not use this file
+ * except in compliance with the License. You may obtain a copy of the
+ * License at http://www.openoffice.org/license.html.
+ *
+ * Software provided under this License is provided on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
+ * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
+ * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
+ * See the License for the specific provisions governing your rights and
+ * obligations concerning the Software.
+ *
+ * The Initial Developer of the Original Code is: Sun Microsystems, Inc.
+ *
+ * Copyright: 2000 by Sun Microsystems, Inc.
+ *
+ * All Rights Reserved.
+ *
+ * Contributor(s): _______________________________________
+ *
+ *
+ ************************************************************************/
+
+#include "SchXMLTableContext.hxx"
+#include "SchXMLParagraphContext.hxx"
+#include "SchXMLImport.hxx"
+#include "transporttypes.hxx"
+
+#ifndef _TOOLS_DEBUG_HXX
+#include <tools/debug.hxx>
+#endif
+#ifndef _TOOLS_SOLMATH_HXX
+#include <tools/solmath.hxx>
+#endif
+
+#ifndef _XMLOFF_XMLNMSPE_HXX
+#include "xmlnmspe.hxx"
+#endif
+#ifndef _XMLOFF_XMLKYWD_HXX
+#include "xmlkywd.hxx"
+#endif
+#ifndef _XMLOFF_NMSPMAP_HXX
+#include "nmspmap.hxx"
+#endif
+#ifndef _XMLOFF_XMLUCONV_HXX
+#include "xmluconv.hxx"
+#endif
+
+#ifndef _COM_SUN_STAR_FRAME_XMODEL_HPP_
+#include <com/sun/star/frame/XModel.hpp>
+#endif
+#ifndef _COM_SUN_STAR_CHART_XCHARTDOCUMENT_HPP_
+#include <com/sun/star/chart/XChartDocument.hpp>
+#endif
+#ifndef _COM_SUN_STAR_CHART_XCHARTDATAARRAY_HPP_
+#include <com/sun/star/chart/XChartDataArray.hpp>
+#endif
+#ifndef _COM_SUN_STAR_CHART_CHARTDATAROWSOURCE_HPP_
+#include <com/sun/star/chart/ChartDataRowSource.hpp>
+#endif
+#ifndef _COM_SUN_STAR_CHART_CHARTSERIESADDRESS_HPP_
+#include <com/sun/star/chart/ChartSeriesAddress.hpp>
+#endif
+
+using namespace com::sun::star;
+
+// ----------------------------------------
+// class SchXMLTableContext
+// ----------------------------------------
+
+SchXMLTableContext::SchXMLTableContext( SchXMLImportHelper& rImpHelper,
+ SvXMLImport& rImport,
+ const rtl::OUString& rLName,
+ SchXMLTable& aTable ) :
+ SvXMLImportContext( rImport, XML_NAMESPACE_TABLE, rLName ),
+ mrImportHelper( rImpHelper ),
+ mrTable( aTable )
+{
+ mrTable.nColumnIndex = -1;
+ mrTable.nMaxColumnIndex = -1;
+ mrTable.nRowIndex = -1;
+ mrTable.aData.clear();
+}
+
+SchXMLTableContext::~SchXMLTableContext()
+{
+}
+
+SvXMLImportContext *SchXMLTableContext::CreateChildContext(
+ USHORT nPrefix,
+ const rtl::OUString& rLocalName,
+ const uno::Reference< xml::sax::XAttributeList >& xAttrList )
+{
+ SvXMLImportContext* pContext = 0;
+ const SvXMLTokenMap& rTokenMap = mrImportHelper.GetTableElemTokenMap();
+
+ switch( rTokenMap.Get( nPrefix, rLocalName ))
+ {
+ case XML_TOK_TABLE_HEADER_COLS:
+ case XML_TOK_TABLE_COLUMNS:
+ pContext = new SchXMLTableColumnsContext( mrImportHelper, GetImport(), rLocalName, mrTable );
+ break;
+
+ case XML_TOK_TABLE_COLUMN:
+ pContext = new SchXMLTableColumnContext( mrImportHelper, GetImport(), rLocalName, mrTable );
+ break;
+
+ case XML_TOK_TABLE_HEADER_ROWS:
+ case XML_TOK_TABLE_ROWS:
+ pContext = new SchXMLTableRowsContext( mrImportHelper, GetImport(), rLocalName, mrTable );
+ break;
+
+ case XML_TOK_TABLE_ROW:
+ pContext = new SchXMLTableRowContext( mrImportHelper, GetImport(), rLocalName, mrTable );
+ break;
+
+ default:
+ pContext = new SvXMLImportContext( GetImport(), nPrefix, rLocalName );
+ }
+
+ return pContext;
+}
+
+// ========================================
+// classes for columns
+// ========================================
+
+// ----------------------------------------
+// class SchXMLTableColumnsContext
+// ----------------------------------------
+
+SchXMLTableColumnsContext::SchXMLTableColumnsContext(
+ SchXMLImportHelper& rImpHelper,
+ SvXMLImport& rImport,
+ const rtl::OUString& rLocalName,
+ SchXMLTable& aTable ) :
+ SvXMLImportContext( rImport, XML_NAMESPACE_TABLE, rLocalName ),
+ mrImportHelper( rImpHelper ),
+ mrTable( aTable )
+{
+}
+
+SchXMLTableColumnsContext::~SchXMLTableColumnsContext()
+{
+}
+
+SvXMLImportContext* SchXMLTableColumnsContext::CreateChildContext(
+ USHORT nPrefix,
+ const rtl::OUString& rLocalName,
+ const uno::Reference< xml::sax::XAttributeList >& xAttrList )
+{
+ SvXMLImportContext* pContext = 0;
+
+ if( nPrefix == XML_NAMESPACE_TABLE &&
+ rLocalName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( sXML_table_column )))
+ {
+ pContext = new SchXMLTableColumnContext( mrImportHelper, GetImport(), rLocalName, mrTable );
+ }
+ else
+ pContext = new SvXMLImportContext( GetImport(), nPrefix, rLocalName );
+
+ return pContext;
+}
+
+// ----------------------------------------
+// class SchXMLTableColumnContext
+// ----------------------------------------
+
+SchXMLTableColumnContext::SchXMLTableColumnContext(
+ SchXMLImportHelper& rImpHelper,
+ SvXMLImport& rImport,
+ const rtl::OUString& rLocalName,
+ SchXMLTable& aTable ) :
+ SvXMLImportContext( rImport, XML_NAMESPACE_TABLE, rLocalName ),
+ mrImportHelper( rImpHelper ),
+ mrTable( aTable )
+{
+}
+
+void SchXMLTableColumnContext::StartElement( const uno::Reference< xml::sax::XAttributeList >& xAttrList )
+{
+ // get number-columns-repeated attribute
+ sal_Int16 nAttrCount = xAttrList.is()? xAttrList->getLength(): 0;
+ rtl::OUString aValue;
+
+ for( sal_Int16 i = 0; i < nAttrCount; i++ )
+ {
+ rtl::OUString sAttrName = xAttrList->getNameByIndex( i );
+ rtl::OUString aLocalName;
+ USHORT nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
+
+ if( nPrefix == XML_NAMESPACE_TABLE &&
+ aLocalName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( sXML_number_columns_repeated )))
+ {
+ aValue = xAttrList->getValueByIndex( i );
+ break; // we only need this attribute
+ }
+ }
+
+ if( aValue.getLength())
+ {
+ sal_Int32 nRepeated = aValue.toInt32();
+ mrTable.nNumberOfColsEstimate += nRepeated;
+ }
+ else
+ {
+ mrTable.nNumberOfColsEstimate++;
+ }
+}
+
+SchXMLTableColumnContext::~SchXMLTableColumnContext()
+{
+}
+
+// ========================================
+// classes for rows
+// ========================================
+
+// ----------------------------------------
+// class SchXMLTableRowsContext
+// ----------------------------------------
+
+SchXMLTableRowsContext::SchXMLTableRowsContext(
+ SchXMLImportHelper& rImpHelper,
+ SvXMLImport& rImport,
+ const rtl::OUString& rLocalName,
+ SchXMLTable& aTable ) :
+ SvXMLImportContext( rImport, XML_NAMESPACE_TABLE, rLocalName ),
+ mrImportHelper( rImpHelper ),
+ mrTable( aTable )
+{
+}
+
+SchXMLTableRowsContext::~SchXMLTableRowsContext()
+{
+}
+
+SvXMLImportContext* SchXMLTableRowsContext::CreateChildContext(
+ USHORT nPrefix,
+ const rtl::OUString& rLocalName,
+ const uno::Reference< xml::sax::XAttributeList >& xAttrList )
+{
+ SvXMLImportContext* pContext = 0;
+
+ if( nPrefix == XML_NAMESPACE_TABLE &&
+ rLocalName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( sXML_table_row )))
+ {
+ pContext = new SchXMLTableRowContext( mrImportHelper, GetImport(), rLocalName, mrTable );
+ }
+ else
+ {
+ pContext = new SvXMLImportContext( GetImport(), nPrefix, rLocalName );
+ }
+
+ return pContext;
+}
+
+// ----------------------------------------
+// class SchXMLTableRowContext
+// ----------------------------------------
+
+SchXMLTableRowContext::SchXMLTableRowContext(
+ SchXMLImportHelper& rImpHelper,
+ SvXMLImport& rImport,
+ const rtl::OUString& rLocalName,
+ SchXMLTable& aTable ) :
+ SvXMLImportContext( rImport, XML_NAMESPACE_TABLE, rLocalName ),
+ mrImportHelper( rImpHelper ),
+ mrTable( aTable )
+{
+ mrTable.nColumnIndex = -1;
+ mrTable.nRowIndex++;
+
+ std::vector< SchXMLCell > aNewRow;
+ aNewRow.reserve( mrTable.nNumberOfColsEstimate );
+ while( mrTable.aData.size() <= mrTable.nRowIndex )
+ mrTable.aData.push_back( aNewRow );
+}
+
+SchXMLTableRowContext::~SchXMLTableRowContext()
+{
+}
+
+SvXMLImportContext* SchXMLTableRowContext::CreateChildContext(
+ USHORT nPrefix,
+ const rtl::OUString& rLocalName,
+ const uno::Reference< xml::sax::XAttributeList >& xAttrList )
+{
+ SvXMLImportContext* pContext = 0;
+
+ // <table:table-cell> element
+ if( nPrefix == XML_NAMESPACE_TABLE &&
+ rLocalName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( sXML_table_cell )))
+ {
+ pContext = new SchXMLTableCellContext( mrImportHelper, GetImport(), rLocalName, mrTable );
+ }
+ else
+ {
+ pContext = new SvXMLImportContext( GetImport(), nPrefix, rLocalName );
+ }
+
+ return pContext;
+}
+
+
+// ========================================
+// classes for cells and their content
+// ========================================
+
+// ----------------------------------------
+// class SchXMLTableCellContext
+// ----------------------------------------
+
+SchXMLTableCellContext::SchXMLTableCellContext(
+ SchXMLImportHelper& rImpHelper,
+ SvXMLImport& rImport,
+ const rtl::OUString& rLocalName,
+ SchXMLTable& aTable ) :
+ SvXMLImportContext( rImport, XML_NAMESPACE_TABLE, rLocalName ),
+ mrImportHelper( rImpHelper ),
+ mrTable( aTable )
+{
+}
+
+SchXMLTableCellContext::~SchXMLTableCellContext()
+{
+}
+
+void SchXMLTableCellContext::StartElement( const uno::Reference< xml::sax::XAttributeList >& xAttrList )
+{
+ sal_Int16 nAttrCount = xAttrList.is()? xAttrList->getLength(): 0;
+ rtl::OUString aValue;
+ rtl::OUString aLocalName;
+ rtl::OUString aCellContent;
+ SchXMLCellType eValueType = SCH_CELL_TYPE_UNKNOWN;
+ const SvXMLTokenMap& rAttrTokenMap = mrImportHelper.GetCellAttrTokenMap();
+
+ for( sal_Int16 i = 0; i < nAttrCount; i++ )
+ {
+ rtl::OUString sAttrName = xAttrList->getNameByIndex( i );
+ USHORT nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
+
+ switch( rAttrTokenMap.Get( nPrefix, aLocalName ))
+ {
+ case XML_TOK_CELL_VAL_TYPE:
+ aValue = xAttrList->getValueByIndex( i );
+ if( aValue.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( sXML_float )))
+ eValueType = SCH_CELL_TYPE_FLOAT;
+ else if( aValue.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( sXML_string )))
+ eValueType = SCH_CELL_TYPE_STRING;
+ break;
+
+ case XML_TOK_CELL_VALUE:
+ aCellContent = xAttrList->getValueByIndex( i );
+ break;
+ }
+ }
+
+ mbReadPara = sal_True;
+ SchXMLCell aCell;
+ aCell.eType = eValueType;
+
+ if( eValueType == SCH_CELL_TYPE_FLOAT )
+ {
+ double fData;
+ sal_Bool bResult = SvXMLUnitConverter::convertNumber( fData, aCellContent );
+ DBG_ASSERT( bResult, "Error converting string to double" );
+
+ aCell.fValue = fData;
+ // dont read following <text:p> element
+ mbReadPara = sal_False;
+ }
+
+ mrTable.aData[ mrTable.nRowIndex ].push_back( aCell );
+ mrTable.nColumnIndex++;
+ if( mrTable.nMaxColumnIndex < mrTable.nColumnIndex )
+ mrTable.nMaxColumnIndex = mrTable.nColumnIndex;
+}
+
+SvXMLImportContext* SchXMLTableCellContext::CreateChildContext(
+ USHORT nPrefix,
+ const rtl::OUString& rLocalName,
+ const uno::Reference< xml::sax::XAttributeList >& xAttrList )
+{
+ SvXMLImportContext* pContext = 0;
+
+ // <text:p> element
+ if( mbReadPara &&
+ nPrefix == XML_NAMESPACE_TEXT &&
+ rLocalName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( sXML_p )))
+ {
+ // we have to read a string here (not a float)
+ pContext = new SchXMLParagraphContext( GetImport(), rLocalName, maCellContent );
+ }
+ else
+ {
+ pContext = new SvXMLImportContext( GetImport(), nPrefix, rLocalName );
+ }
+
+ return pContext;
+}
+
+void SchXMLTableCellContext::EndElement()
+{
+ if( mbReadPara && maCellContent.getLength())
+ mrTable.aData[ mrTable.nRowIndex ][ mrTable.nColumnIndex ].aString = maCellContent;
+}
+
+// ========================================
+
+void SchXMLTableHelper::applyTable(
+ const SchXMLTable& rTable,
+ uno::Sequence< chart::ChartSeriesAddress >& rSeriesAddresses,
+ rtl::OUString& rCategoriesAddress,
+ uno::Reference< chart::XChartDocument > xChartDoc )
+{
+ // general note: series are always interpreted as columns in import
+
+ // first check if data can be attached to an appropriate object
+ if( rTable.nRowIndex > -1 &&
+ xChartDoc.is())
+ {
+ uno::Reference< chart::XChartDataArray > xData( xChartDoc->getData(), uno::UNO_QUERY );
+ if( xData.is())
+ {
+ sal_Int32 nNumSeriesAddresses = rSeriesAddresses.getLength();
+ sal_Int32 nNumLabelAddresses = nNumSeriesAddresses;
+ sal_Int32 nDomainOffset = 0;
+ sal_Int32 nNumAddrSize = nNumSeriesAddresses;
+
+ uno::Reference< chart::XChartData > xChartData( xData, uno::UNO_QUERY );
+ if( xChartData.is())
+ {
+ sal_Int32 nColumns = 0;
+ sal_Int32 nRows = 0;
+ sal_Int32 i, j;
+
+ // set data
+ if( nNumSeriesAddresses )
+ {
+ // get NaN
+ double fSolarNaN;
+ SolarMath::SetNAN( fSolarNaN, FALSE );
+ double fNaN = fSolarNaN;
+ fNaN = xChartData->getNotANumber();
+
+ // convert data from std::vector to uno::Sequence
+ // ----------------------------------------------
+
+ // determine size of data
+ std::vector< SchNumericCellRangeAddress > aNumericAddresses( nNumSeriesAddresses );
+
+ for( i = 0; i < nNumSeriesAddresses; i++ )
+ {
+ if( rSeriesAddresses[ i ].DomainRangeAddresses.getLength())
+ {
+ GetCellRangeAddress( rSeriesAddresses[ i ].DomainRangeAddresses[ 0 ],
+ aNumericAddresses[ i + nDomainOffset ] );
+ AdjustMax( aNumericAddresses[ i + nDomainOffset ], nRows, nColumns );
+ nDomainOffset++;
+ aNumericAddresses.reserve( nNumSeriesAddresses + nDomainOffset );
+ }
+
+ GetCellRangeAddress( rSeriesAddresses[ i ].DataRangeAddress,
+ aNumericAddresses[ i + nDomainOffset ] );
+ AdjustMax( aNumericAddresses[ i + nDomainOffset ], nRows, nColumns );
+ }
+ nNumAddrSize += nDomainOffset;
+
+ // allocate memory for sequence
+ uno::Sequence< uno::Sequence< double > > aSequence( nRows );
+ for( i = 0; i < nRows; i++ )
+ {
+ aSequence[ i ].realloc( nColumns );
+
+ // initialize values with NaN
+ for( j = 0; j < nColumns; j++ )
+ aSequence[ i ][ j ] = fNaN;
+ }
+
+ // copy data
+ for( i = 0; i < nNumAddrSize; i++ )
+ PutTableContentIntoSequence( rTable, aNumericAddresses[ i ], i, aSequence );
+
+ // set data to XChartDataArray
+ xData->setData( aSequence );
+ }
+
+ // set labels
+ uno::Sequence< rtl::OUString > aLabels;
+ aLabels.realloc( nNumAddrSize );
+
+ sal_Int32 nRow, nCol;
+ for( i = 0; i < nNumSeriesAddresses; i++ )
+ {
+ if( rSeriesAddresses[ i ].LabelAddress.getLength())
+ {
+ GetCellAddress( rSeriesAddresses[ i ].LabelAddress, nCol, nRow );
+ aLabels[ i + nDomainOffset ] = rTable.aData[ nRow ][ nCol ].aString;
+ }
+ }
+ xData->setColumnDescriptions( aLabels );
+
+ // set categories
+ aLabels = xData->getRowDescriptions();
+
+ if( rCategoriesAddress.getLength())
+ {
+ SchNumericCellRangeAddress aAddress;
+ if( GetCellRangeAddress( rCategoriesAddress, aAddress ))
+ {
+ uno::Sequence< rtl::OUString > aLabels;
+
+ if( aAddress.nCol1 == aAddress.nCol2 )
+ {
+ sal_Int32 nWidth = aAddress.nRow2 - aAddress.nRow1 + 1;
+ aLabels.realloc( nWidth );
+
+ for( i = 0; i < nWidth; i++ )
+ {
+ DBG_ASSERT( rTable.aData[ aAddress.nRow1 + i ][ aAddress.nCol1 ].eType == SCH_CELL_TYPE_STRING, "expecting string" );
+ aLabels[ i ] = rTable.aData[ aAddress.nRow1 + i ][ aAddress.nCol1 ].aString;
+ }
+ }
+ else
+ {
+ DBG_ASSERT( aAddress.nRow1 == aAddress.nRow2, "range must be in one row or one column" );
+
+ sal_Int32 nWidth = aAddress.nCol2 - aAddress.nCol1 + 1;
+ aLabels.realloc( nWidth );
+
+ for( sal_Int32 i = 0; i < nWidth; i++ )
+ {
+ DBG_ASSERT( rTable.aData[ aAddress.nRow1 ][ aAddress.nCol1 + i ].eType == SCH_CELL_TYPE_STRING, "expecting string" );
+ aLabels[ i ] = rTable.aData[ aAddress.nRow1 ][ aAddress.nCol1 + i ].aString;
+ }
+ }
+
+ xData->setRowDescriptions( aLabels );
+ }
+ }
+
+ // apply data to chart
+ // not necessary ?
+ // xChartDoc->attachData( xChartData );
+ }
+ }
+ }
+}
+
+void SchXMLTableHelper::AdjustMax( const SchNumericCellRangeAddress& rAddr,
+ sal_Int32& nRows, sal_Int32& nColumns )
+{
+ // rows and columns are both mapped to columns ( == series )
+ if( rAddr.nCol1 == rAddr.nCol2 )
+ {
+ if( rAddr.nRow1 > nRows )
+ nRows = rAddr.nRow1;
+ if( rAddr.nRow2 > nRows )
+ nRows = rAddr.nRow2;
+ if( rAddr.nCol1 > nColumns )
+ nColumns = rAddr.nCol1;
+ if( rAddr.nCol2 > nColumns )
+ nColumns = rAddr.nCol2;
+ }
+ else
+ {
+ DBG_ASSERT( rAddr.nRow1 == rAddr.nRow2, "row indexes should be equal" );
+ if( rAddr.nRow1 > nRows )
+ nColumns = rAddr.nRow1;
+ if( rAddr.nRow2 > nRows )
+ nColumns = rAddr.nRow2;
+ if( rAddr.nCol1 > nColumns )
+ nRows = rAddr.nCol1;
+ if( rAddr.nCol2 > nColumns )
+ nRows = rAddr.nCol2;
+ }
+}
+
+void SchXMLTableHelper::GetCellAddress( const rtl::OUString& rStr, sal_Int32& rCol, sal_Int32& rRow )
+{
+ sal_Int32 nPos = rStr.indexOf( sal_Unicode( '.' ));
+ if( nPos != -1 )
+ {
+ // currently just one letter is accepted
+ sal_Unicode aLetter = rStr.getStr()[ nPos + 1 ];
+ if( 'a' <= aLetter && aLetter <= 'z' )
+ rCol = aLetter - 'a';
+ else
+ rCol = aLetter - 'A';
+
+ rRow = (rStr.copy( nPos + 2 )).toInt32() - 1;
+ }
+}
+
+sal_Bool SchXMLTableHelper::GetCellRangeAddress(
+ const rtl::OUString& rStr, SchNumericCellRangeAddress& rResult )
+{
+ sal_Int32 nBreakAt = rStr.indexOf( sal_Unicode( ':' ));
+ if( nBreakAt != -1 )
+ {
+ GetCellAddress( rStr.copy( 0, nBreakAt ), rResult.nCol1, rResult.nRow1 );
+ GetCellAddress( rStr.copy( nBreakAt + 1 ), rResult.nCol2, rResult.nRow2 );
+ return sal_True;
+ }
+
+ return sal_False;
+}
+
+
+// returns true if datarange was inside one column
+void SchXMLTableHelper::PutTableContentIntoSequence(
+ const SchXMLTable& rTable,
+ SchNumericCellRangeAddress& rAddress,
+ sal_Int32 nSeriesIndex,
+ uno::Sequence< uno::Sequence< double > >& aSequence )
+{
+ if( rAddress.nCol2 > rTable.nMaxColumnIndex + 1 ||
+ rAddress.nRow2 > rTable.nRowIndex + 1 )
+ {
+ DBG_ERROR( "Invalid references" );
+ //ToDo: strip the range
+ return;
+ }
+
+ // currently only ranges that span one row or one column are supported
+
+ sal_Int32 nSeqPos = 0;
+ uno::Sequence< double >* pSeqArray = aSequence.getArray();
+
+ // same column
+ if( rAddress.nCol1 == rAddress.nCol2 )
+ {
+ if( rAddress.nRow1 <= rAddress.nRow2 )
+ {
+ for( sal_Int32 nRow = rAddress.nRow1; nRow <= rAddress.nRow2; nRow++, nSeqPos++ )
+ {
+ DBG_ASSERT( rTable.aData[ nRow ][ rAddress.nCol1 ].eType != SCH_CELL_TYPE_UNKNOWN, "trying to refer to unknown cell" );
+ pSeqArray[ nSeqPos ][ nSeriesIndex ] = rTable.aData[ nRow ][ rAddress.nCol1 ].fValue;
+ }
+ }
+ else // reverse
+ {
+ for( sal_Int32 nRow = rAddress.nRow1; nRow >= rAddress.nRow2; nRow--, nSeqPos++ )
+ {
+ DBG_ASSERT( rTable.aData[ nRow ][ rAddress.nCol1 ].eType != SCH_CELL_TYPE_UNKNOWN, "trying to refer to unknown cell" );
+ pSeqArray[ nSeqPos ][ nSeriesIndex ] = rTable.aData[ nRow ][ rAddress.nCol1 ].fValue;
+ }
+ }
+ }
+ else // same row
+ {
+ DBG_ASSERT( rAddress.nRow1 == rAddress.nRow2, "range must be in one row or one column" );
+
+ if( rAddress.nCol1 <= rAddress.nCol2 )
+ {
+ for( sal_Int32 nCol = rAddress.nCol1; nCol <= rAddress.nCol2; nCol++, nSeqPos++ )
+ {
+ DBG_ASSERT( rTable.aData[ rAddress.nRow1 ][ nCol ].eType != SCH_CELL_TYPE_UNKNOWN, "trying to refer to unknown cell" );
+ pSeqArray[ nSeqPos ][ nSeriesIndex ] = rTable.aData[ rAddress.nRow1 ][ nCol ].fValue;
+ }
+ }
+ else // reverse
+ {
+ for( sal_Int32 nCol = rAddress.nCol1; nCol >= rAddress.nCol2; nCol--, nSeqPos++ )
+ {
+ DBG_ASSERT( rTable.aData[ rAddress.nRow1 ][ nCol ].eType != SCH_CELL_TYPE_UNKNOWN, "trying to refer to unknown cell" );
+ pSeqArray[ nSeqPos ][ nSeriesIndex ] = rTable.aData[ rAddress.nRow1 ][ nCol ].fValue;
+ }
+ }
+ }
+}
+