Kaydet (Commit) fe8fbca7 authored tarafından Kurt Zenker's avatar Kurt Zenker

INTEGRATION: CWS chart20_DEV300 (1.19.32); FILE MERGED

2008/02/25 17:19:50 bm 1.19.32.5: #i366# fixed a bug for charts with own data
2008/02/22 15:34:59 bm 1.19.32.4: #i366# use old assignment method in postProcessTable() if no mapping is available
2008/02/22 14:46:51 bm 1.19.32.3: #i366# cleanup of unused function
2008/02/22 14:29:31 bm 1.19.32.2: #i366# passing temporary as ref ... oops
2008/02/21 15:59:49 bm 1.19.32.1: #i366# error bars from cell ranges
üst 5b544f18
...@@ -4,9 +4,9 @@ ...@@ -4,9 +4,9 @@
* *
* $RCSfile: SchXMLTableContext.cxx,v $ * $RCSfile: SchXMLTableContext.cxx,v $
* *
* $Revision: 1.19 $ * $Revision: 1.20 $
* *
* last change: $Author: rt $ $Date: 2008-01-29 17:00:44 $ * last change: $Author: kz $ $Date: 2008-03-06 15:57:48 $
* *
* The Contents of this file are made available subject to * The Contents of this file are made available subject to
* the terms of GNU Lesser General Public License Version 2.1. * the terms of GNU Lesser General Public License Version 2.1.
...@@ -99,6 +99,13 @@ using ::rtl::OUString; ...@@ -99,6 +99,13 @@ using ::rtl::OUString;
namespace namespace
{ {
const OUString lcl_aLabelPrefix( RTL_CONSTASCII_USTRINGPARAM("label "));
const OUString lcl_aCategoriesRange( RTL_CONSTASCII_USTRINGPARAM("categories"));
typedef ::std::multimap< ::rtl::OUString, ::rtl::OUString >
lcl_tOriginalRangeToInternalRangeMap;
Sequence< OUString > lcl_getCategoriesFromTable( const SchXMLTable & rTable, bool bHasLabels ) Sequence< OUString > lcl_getCategoriesFromTable( const SchXMLTable & rTable, bool bHasLabels )
{ {
sal_Int32 nNumRows( static_cast< sal_Int32 >( rTable.aData.size())); sal_Int32 nNumRows( static_cast< sal_Int32 >( rTable.aData.size()));
...@@ -164,30 +171,6 @@ std::vector< Reference< chart2::XAxis > > lcl_getAxesHoldingCategoriesFromDiagra ...@@ -164,30 +171,6 @@ std::vector< Reference< chart2::XAxis > > lcl_getAxesHoldingCategoriesFromDiagra
return aRet; return aRet;
} }
struct lcl_setCategories : public ::std::unary_function< Reference< chart2::XAxis >, void >
{
lcl_setCategories( const Reference< chart2::data::XDataProvider > & xProvider ) :
m_xProvider( xProvider )
{}
void operator() ( const Reference< chart2::XAxis > & xAxis )
{
if( xAxis.is() && m_xProvider.is())
{
chart2::ScaleData aSData( xAxis->getScaleData());
if( aSData.Categories.is())
{
aSData.Categories->setValues(
m_xProvider->createDataSequenceByRangeRepresentation(
OUString(RTL_CONSTASCII_USTRINGPARAM("categories"))));
xAxis->setScaleData( aSData );
}
}
}
private:
Reference< chart2::data::XDataProvider > m_xProvider;
};
void lcl_ApplyColumnLabels( void lcl_ApplyColumnLabels(
const ::std::vector< SchXMLCell > & rFirstRow, const ::std::vector< SchXMLCell > & rFirstRow,
Sequence< OUString > & rOutColumnLabels, Sequence< OUString > & rOutColumnLabels,
...@@ -254,6 +237,7 @@ struct lcl_ApplyRowsToData : public ::std::unary_function< ::std::vector< SchXML ...@@ -254,6 +237,7 @@ struct lcl_ApplyRowsToData : public ::std::unary_function< ::std::vector< SchXML
// label // label
if( m_bHasHeader && m_nIndex < m_rRowLabels.getLength() && rRow.front().eType == SCH_CELL_TYPE_STRING ) if( m_bHasHeader && m_nIndex < m_rRowLabels.getLength() && rRow.front().eType == SCH_CELL_TYPE_STRING )
m_rRowLabels[m_nIndex] = rRow.front().aString; m_rRowLabels[m_nIndex] = rRow.front().aString;
// values // values
if( m_nIndex < m_nOuterSize ) if( m_nIndex < m_nOuterSize )
::std::for_each( rRow.begin() + m_nOffset, rRow.end(), lcl_ApplyCellToData( m_rData[m_nIndex], m_rRowLabels )); ::std::for_each( rRow.begin() + m_nOffset, rRow.end(), lcl_ApplyCellToData( m_rData[m_nIndex], m_rRowLabels ));
...@@ -327,6 +311,68 @@ void lcl_applyXMLTableToInternalDataprovider( ...@@ -327,6 +311,68 @@ void lcl_applyXMLTableToInternalDataprovider(
xDataArray->setColumnDescriptions( aColumnLabels ); xDataArray->setColumnDescriptions( aColumnLabels );
} }
void lcl_fillRangeMapping(
const SchXMLTable & rTable,
lcl_tOriginalRangeToInternalRangeMap & rOutRangeMap,
chart::ChartDataRowSource eDataRowSource )
{
sal_Int32 nRowOffset = ( rTable.bHasHeaderRow ? 1 : 0 );
sal_Int32 nColOffset = ( rTable.bHasHeaderColumn ? 1 : 0 );
// Fill range mapping
const size_t nTableRowCount( rTable.aData.size());
for( size_t nRow = 0; nRow < nTableRowCount; ++nRow )
{
const ::std::vector< SchXMLCell > & rRow( rTable.aData[nRow] );
const size_t nTableColCount( rRow.size());
for( size_t nCol = 0; nCol < nTableColCount; ++nCol )
{
OUString aRangeId( rRow[nCol].aRangeId );
if( aRangeId.getLength())
{
if( eDataRowSource == chart::ChartDataRowSource_COLUMNS )
{
if( nCol == 0 && rTable.bHasHeaderColumn )
{
OSL_ASSERT( static_cast< sal_Int32 >( nRow ) == nRowOffset );
rOutRangeMap.insert( lcl_tOriginalRangeToInternalRangeMap::value_type(
aRangeId, lcl_aCategoriesRange ));
}
else
{
OUString aColNumStr = OUString::valueOf( static_cast< sal_Int32 >( nCol - nColOffset ));
if( nRow == 0 && rTable.bHasHeaderRow )
rOutRangeMap.insert( lcl_tOriginalRangeToInternalRangeMap::value_type(
aRangeId, lcl_aLabelPrefix + aColNumStr ));
else
rOutRangeMap.insert( lcl_tOriginalRangeToInternalRangeMap::value_type(
aRangeId, aColNumStr ));
}
}
else // eDataRowSource == chart::ChartDataRowSource_ROWS
{
if( nRow == 0 && rTable.bHasHeaderRow )
{
OSL_ASSERT( static_cast< sal_Int32 >( nCol ) == nColOffset );
rOutRangeMap.insert( lcl_tOriginalRangeToInternalRangeMap::value_type(
aRangeId, lcl_aCategoriesRange ));
}
else
{
OUString aRowNumStr = OUString::valueOf( static_cast< sal_Int32 >( nRow - nRowOffset ));
if( nCol == 0 && rTable.bHasHeaderColumn )
rOutRangeMap.insert( lcl_tOriginalRangeToInternalRangeMap::value_type(
aRangeId, lcl_aLabelPrefix + aRowNumStr ));
else
rOutRangeMap.insert( lcl_tOriginalRangeToInternalRangeMap::value_type(
aRangeId, aRowNumStr ));
}
}
}
}
}
}
void lcl_copyProperties( void lcl_copyProperties(
const Reference< beans::XPropertySet > & xSource, const Reference< beans::XPropertySet > & xSource,
const Reference< beans::XPropertySet > & xDestination ) const Reference< beans::XPropertySet > & xDestination )
...@@ -358,6 +404,44 @@ void lcl_copyProperties( ...@@ -358,6 +404,44 @@ void lcl_copyProperties(
} }
} }
Reference< chart2::data::XDataSequence >
lcl_reassignDataSequence(
const Reference< chart2::data::XDataSequence > & xSequence,
const Reference< chart2::data::XDataProvider > & xDataProvider,
lcl_tOriginalRangeToInternalRangeMap & rRangeMap,
const OUString & rRange )
{
Reference< chart2::data::XDataSequence > xResult( xSequence );
lcl_tOriginalRangeToInternalRangeMap::iterator aIt( rRangeMap.find( rRange ));
if( aIt != rRangeMap.end())
{
// set sequence with correct data
xResult.set( xDataProvider->createDataSequenceByRangeRepresentation( aIt->second ));
// remove translation, because it was used
rRangeMap.erase( aIt );
}
return xResult;
}
bool lcl_mapContainsRange(
lcl_tOriginalRangeToInternalRangeMap & rRangeMap,
const OUString & rRange )
{
lcl_tOriginalRangeToInternalRangeMap::iterator aIt( rRangeMap.find( rRange ));
return ( aIt != rRangeMap.end());
}
bool lcl_tableOfRangeMatches(
const ::rtl::OUString & rRange,
const ::rtl::OUString & rTableName )
{
// both strings are non-empty and the table name is part of the range
return ( (rRange.getLength() > 0) &&
(rTableName.getLength() > 0) &&
(rRange.indexOf( rTableName ) != -1 ));
}
} // anonymous namespace } // anonymous namespace
...@@ -422,6 +506,26 @@ SvXMLImportContext *SchXMLTableContext::CreateChildContext( ...@@ -422,6 +506,26 @@ SvXMLImportContext *SchXMLTableContext::CreateChildContext(
return pContext; return pContext;
} }
void SchXMLTableContext::StartElement( const uno::Reference< xml::sax::XAttributeList >& xAttrList )
{
// get table-name
sal_Int16 nAttrCount = xAttrList.is()? xAttrList->getLength(): 0;
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 &&
IsXMLToken( aLocalName, XML_NAME ) )
{
mrTable.aTableNameOfFile = xAttrList->getValueByIndex( i );
break; // we only need this attribute
}
}
}
// ======================================== // ========================================
// classes for columns // classes for columns
// ======================================== // ========================================
...@@ -686,12 +790,10 @@ SvXMLImportContext* SchXMLTableCellContext::CreateChildContext( ...@@ -686,12 +790,10 @@ SvXMLImportContext* SchXMLTableCellContext::CreateChildContext(
SvXMLImportContext* pContext = 0; SvXMLImportContext* pContext = 0;
// <text:p> element // <text:p> element
if( mbReadPara && if( nPrefix == XML_NAMESPACE_TEXT &&
nPrefix == XML_NAMESPACE_TEXT &&
IsXMLToken( rLocalName, XML_P ) ) IsXMLToken( rLocalName, XML_P ) )
{ {
// we have to read a string here (not a float) pContext = new SchXMLParagraphContext( GetImport(), rLocalName, maCellContent, &maRangeId );
pContext = new SchXMLParagraphContext( GetImport(), rLocalName, maCellContent );
} }
else else
{ {
...@@ -705,6 +807,8 @@ void SchXMLTableCellContext::EndElement() ...@@ -705,6 +807,8 @@ void SchXMLTableCellContext::EndElement()
{ {
if( mbReadPara && maCellContent.getLength()) if( mbReadPara && maCellContent.getLength())
mrTable.aData[ mrTable.nRowIndex ][ mrTable.nColumnIndex ].aString = maCellContent; mrTable.aData[ mrTable.nRowIndex ][ mrTable.nColumnIndex ].aString = maCellContent;
if( maRangeId.getLength())
mrTable.aData[ mrTable.nRowIndex ][ mrTable.nColumnIndex ].aRangeId = maRangeId;
} }
// ======================================== // ========================================
...@@ -713,7 +817,7 @@ void SchXMLTableCellContext::EndElement() ...@@ -713,7 +817,7 @@ void SchXMLTableCellContext::EndElement()
// (this is just a workaround for clipboard handling in EA2) // (this is just a workaround for clipboard handling in EA2)
void SchXMLTableHelper::applyTableSimple( void SchXMLTableHelper::applyTableSimple(
const SchXMLTable& rTable, const SchXMLTable& rTable,
uno::Reference< chart::XChartDataArray > xData ) const uno::Reference< chart::XChartDataArray > & xData )
{ {
// interpret table like this: // interpret table like this:
// //
...@@ -811,7 +915,6 @@ void SchXMLTableHelper::applyTableSimple( ...@@ -811,7 +915,6 @@ void SchXMLTableHelper::applyTableSimple(
void SchXMLTableHelper::applyTable( void SchXMLTableHelper::applyTable(
const SchXMLTable& rTable, const SchXMLTable& rTable,
const tSchXMLLSequencesPerIndex & rLSequencesPerIndex,
uno::Reference< chart2::XChartDocument > xChartDoc ) uno::Reference< chart2::XChartDocument > xChartDoc )
{ {
if( ! (xChartDoc.is() && xChartDoc->hasInternalDataProvider())) if( ! (xChartDoc.is() && xChartDoc->hasInternalDataProvider()))
...@@ -821,9 +924,6 @@ void SchXMLTableHelper::applyTable( ...@@ -821,9 +924,6 @@ void SchXMLTableHelper::applyTable(
if( ! xDataArray.is()) if( ! xDataArray.is())
return; return;
OSL_ASSERT( xDataProv.is()); OSL_ASSERT( xDataProv.is());
Reference< chart2::XDiagram > xDiagram( xChartDoc->getFirstDiagram());
if( ! xDiagram.is())
return;
// prerequisite for this method: all objects (data series, domains, etc.) // prerequisite for this method: all objects (data series, domains, etc.)
// need their own range string. // need their own range string.
...@@ -838,53 +938,112 @@ void SchXMLTableHelper::applyTable( ...@@ -838,53 +938,112 @@ void SchXMLTableHelper::applyTable(
// apply all data read in the table to the chart data-array of the internal // apply all data read in the table to the chart data-array of the internal
// data provider // data provider
lcl_applyXMLTableToInternalDataprovider( rTable, xDataArray ); lcl_applyXMLTableToInternalDataprovider( rTable, xDataArray );
}
void SchXMLTableHelper::postProcessTable(
const SchXMLTable& rTable,
const tSchXMLLSequencesPerIndex & rLSequencesPerIndex,
uno::Reference< chart2::XChartDocument > xChartDoc,
chart::ChartDataRowSource eDataRowSource )
{
if( ! (xChartDoc.is() && xChartDoc->hasInternalDataProvider()))
return;
Reference< chart2::data::XDataProvider > xDataProv( xChartDoc->getDataProvider());
// create a mapping from original ranges to new ranges
lcl_tOriginalRangeToInternalRangeMap aRangeMap;
lcl_fillRangeMapping( rTable, aRangeMap, eDataRowSource );
bool bCategoriesApplied = false; bool bCategoriesApplied = false;
// apply the data to the objects that have been parsed and marked for // translate ranges (using the map created before)
// getting the new data in ther rLSequencesPerIndex map. for( tSchXMLLSequencesPerIndex::const_iterator aLSeqIt( rLSequencesPerIndex.begin());
for( tSchXMLLSequencesPerIndex::const_iterator aIt( rLSequencesPerIndex.begin()); aLSeqIt != rLSequencesPerIndex.end(); ++aLSeqIt )
aIt != rLSequencesPerIndex.end(); ++aIt ) {
if( aLSeqIt->second.is())
{ {
if( aIt->second.is()) // values/error bars/categories
if( aLSeqIt->first.second == SCH_XML_PART_VALUES ||
aLSeqIt->first.second == SCH_XML_PART_ERROR_BARS )
{ {
if( aIt->first.second == SCH_XML_PART_VALUES ) Reference< chart2::data::XDataSequence > xSeq( aLSeqIt->second->getValues());
OUString aRange;
if( xSeq.is() &&
SchXMLTools::getXMLRangePropertyFromDataSequence( xSeq, aRange, /* bClearProp = */ true ) &&
lcl_mapContainsRange( aRangeMap, aRange ))
{
Reference< chart2::data::XDataSequence > xNewSeq(
lcl_reassignDataSequence( xSeq, xDataProv, aRangeMap, aRange ));
if( xNewSeq != xSeq )
{
lcl_copyProperties( Reference< beans::XPropertySet >( xSeq, uno::UNO_QUERY ),
Reference< beans::XPropertySet >( xNewSeq, uno::UNO_QUERY ));
aLSeqIt->second->setValues( xNewSeq );
}
}
else
{
if( lcl_tableOfRangeMatches( aRange, rTable.aTableNameOfFile ))
{
if( aLSeqIt->first.first == SCH_XML_CATEGORIES_INDEX )
bCategoriesApplied = true;
}
else
{ {
if( aIt->first.first == SCH_XML_CATEGORIES_INDEX ) if( aLSeqIt->first.first == SCH_XML_CATEGORIES_INDEX )
{ {
Reference< beans::XPropertySet > xOldSequenceProp( aIt->second->getValues(), uno::UNO_QUERY ); Reference< beans::XPropertySet > xOldSequenceProp( aLSeqIt->second->getValues(), uno::UNO_QUERY );
Reference< chart2::data::XDataSequence > xNewSequence( Reference< chart2::data::XDataSequence > xNewSequence(
xDataProv->createDataSequenceByRangeRepresentation( xDataProv->createDataSequenceByRangeRepresentation(
OUString(RTL_CONSTASCII_USTRINGPARAM("categories")))); OUString(RTL_CONSTASCII_USTRINGPARAM("categories"))));
lcl_copyProperties( lcl_copyProperties(
xOldSequenceProp, Reference< beans::XPropertySet >( xNewSequence, uno::UNO_QUERY )); xOldSequenceProp, Reference< beans::XPropertySet >( xNewSequence, uno::UNO_QUERY ));
aIt->second->setValues( xNewSequence ); aLSeqIt->second->setValues( xNewSequence );
bCategoriesApplied = true; bCategoriesApplied = true;
} }
else else
{ {
Reference< beans::XPropertySet > xOldSequenceProp( aIt->second->getValues(), uno::UNO_QUERY ); Reference< beans::XPropertySet > xOldSequenceProp( aLSeqIt->second->getValues(), uno::UNO_QUERY );
OUString aRep( OUString::valueOf( aIt->first.first )); OUString aRep( OUString::valueOf( aLSeqIt->first.first ));
Reference< chart2::data::XDataSequence > xNewSequence( Reference< chart2::data::XDataSequence > xNewSequence(
xDataProv->createDataSequenceByRangeRepresentation( aRep )); xDataProv->createDataSequenceByRangeRepresentation( aRep ));
lcl_copyProperties( lcl_copyProperties(
xOldSequenceProp, Reference< beans::XPropertySet >( xNewSequence, uno::UNO_QUERY )); xOldSequenceProp, Reference< beans::XPropertySet >( xNewSequence, uno::UNO_QUERY ));
aIt->second->setValues( xNewSequence ); aLSeqIt->second->setValues( xNewSequence );
} }
} }
else }
}
else // labels
{
OSL_ASSERT( aLSeqIt->first.second == SCH_XML_PART_LABEL );
// labels
Reference< chart2::data::XDataSequence > xSeq( aLSeqIt->second->getLabel());
OUString aRange;
if( xSeq.is() &&
SchXMLTools::getXMLRangePropertyFromDataSequence( xSeq, aRange, /* bClearProp = */ true ) &&
lcl_mapContainsRange( aRangeMap, aRange ))
{
Reference< chart2::data::XDataSequence > xNewSeq(
lcl_reassignDataSequence( xSeq, xDataProv, aRangeMap, aRange ));
if( xNewSeq != xSeq )
{
lcl_copyProperties( Reference< beans::XPropertySet >( xSeq, uno::UNO_QUERY ),
Reference< beans::XPropertySet >( xNewSeq, uno::UNO_QUERY ));
aLSeqIt->second->setLabel( xNewSeq );
}
}
else if( ! lcl_tableOfRangeMatches( aRange, rTable.aTableNameOfFile ))
{ {
Reference< beans::XPropertySet > xOldSequenceProp( aIt->second->getLabel(), uno::UNO_QUERY );
OSL_ASSERT( aIt->first.second == SCH_XML_PART_LABEL );
// index -1 is for categories => shouldn't have a label
OSL_ASSERT( aIt->first.first >= 0 );
OUString aRep( RTL_CONSTASCII_USTRINGPARAM("label ")); OUString aRep( RTL_CONSTASCII_USTRINGPARAM("label "));
aRep += OUString::valueOf( aIt->first.first ); aRep += OUString::valueOf( aLSeqIt->first.first );
Reference< chart2::data::XDataSequence > xNewSequence( Reference< chart2::data::XDataSequence > xNewSeq(
xDataProv->createDataSequenceByRangeRepresentation( aRep )); xDataProv->createDataSequenceByRangeRepresentation( aRep ));
lcl_copyProperties( lcl_copyProperties( Reference< beans::XPropertySet >( xSeq, uno::UNO_QUERY ),
xOldSequenceProp, Reference< beans::XPropertySet >( xNewSequence, uno::UNO_QUERY )); Reference< beans::XPropertySet >( xNewSeq, uno::UNO_QUERY ));
aIt->second->setLabel( xNewSequence ); aLSeqIt->second->setLabel( xNewSeq );
}
} }
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment