diff options
| author | Kohei Yoshida <kohei.yoshida@suse.com> | 2011-12-10 00:41:09 -0500 |
|---|---|---|
| committer | Kohei Yoshida <kohei.yoshida@suse.com> | 2011-12-10 00:47:28 -0500 |
| commit | ef747a6570d72f3f2f871ee2edd4611523f91988 (patch) | |
| tree | 7e6c812d653e4eb7f8fe66eeb03f1ef07bf5287a | |
| parent | b2f6fbeafc5a944e98a5511ba9fe29b5b8feb5ca (diff) | |
fdo#43467: Infer number format from formula result if appropriate.
In case the data source has a formula cell, the number format may be
inferred from the formula result in case the cell format is General.
Also,
1) no need to use UNO API in the API implementation. Let use the
internal API here.
2) this method didn't take into account the hidden cells.
TODO: We need to handle number formats for external ref data properly.
| -rw-r--r-- | sc/source/ui/unoobj/chart2uno.cxx | 105 |
1 files changed, 60 insertions, 45 deletions
diff --git a/sc/source/ui/unoobj/chart2uno.cxx b/sc/source/ui/unoobj/chart2uno.cxx index 1847bb083c0c..3852e3bde2df 100644 --- a/sc/source/ui/unoobj/chart2uno.cxx +++ b/sc/source/ui/unoobj/chart2uno.cxx @@ -3145,80 +3145,95 @@ uno::Sequence< ::rtl::OUString > SAL_CALL ScChart2DataSequence::generateLabel(ch return aSeq; } +namespace { + +sal_uLong getDisplayNumberFormat(ScDocument* pDoc, const ScAddress& rPos) +{ + sal_uLong nFormat = pDoc->GetNumberFormat(rPos); // original format from cell. + SvNumberFormatter* pFormatter = pDoc->GetFormatTable(); + if (!pFormatter) + return nFormat; + + ScBaseCell* pCell = pDoc->GetCell(rPos); + if (!pCell || pCell->GetCellType() != CELLTYPE_FORMULA) + return nFormat; + + // With formula cell, the format may be inferred from the formula result. + return static_cast<ScFormulaCell*>(pCell)->GetStandardFormat(*pFormatter, nFormat); +} + +} + ::sal_Int32 SAL_CALL ScChart2DataSequence::getNumberFormatKeyByIndex( ::sal_Int32 nIndex ) throw (lang::IndexOutOfBoundsException, uno::RuntimeException) { // index -1 means a heuristic value for the entire sequence bool bGetSeriesFormat = (nIndex == -1); - sal_Int32 nResult = 0; SolarMutexGuard aGuard; if ( !m_pDocument || !m_pTokens.get()) - return nResult; - - sal_Int32 nCount = 0; - bool bFound = false; - ScRange* p; + return 0; - uno::Reference <sheet::XSpreadsheetDocument> xSpreadDoc( lcl_GetSpreadSheetDocument( m_pDocument )); - if (!xSpreadDoc.is()) - return nResult; + // TODO: Handle external references too. - uno::Reference<container::XIndexAccess> xIndex( xSpreadDoc->getSheets(), uno::UNO_QUERY ); - if (!xIndex.is()) - return nResult; + sal_Int32 nCount = 0; ScRangeList aRanges; ScRefTokenHelper::getRangeListFromTokens(aRanges, *m_pTokens); - uno::Reference< table::XCellRange > xSheet; - for ( size_t rIndex = 0, nRanges = aRanges.size(); (rIndex < nRanges) && !bFound; ++rIndex ) - { - p = aRanges[ rIndex ]; - // TODO: use DocIter? - table::CellAddress aStart, aEnd; - ScUnoConversion::FillApiAddress( aStart, p->aStart ); - ScUnoConversion::FillApiAddress( aEnd, p->aEnd ); - for ( sal_Int16 nSheet = aStart.Sheet; nSheet <= aEnd.Sheet && !bFound; ++nSheet) - { - xSheet.set(xIndex->getByIndex(nSheet), uno::UNO_QUERY); - for ( sal_Int32 nCol = aStart.Column; nCol <= aEnd.Column && !bFound; ++nCol) + for (size_t i = 0, n = aRanges.size(); i < n; ++i) + { + ScRange* p = aRanges[i]; + for (SCTAB nTab = p->aStart.Tab(); nTab <= p->aEnd.Tab(); ++nTab) + { + for (SCCOL nCol = p->aStart.Col(); nCol <= p->aEnd.Col(); ++nCol) { - for ( sal_Int32 nRow = aStart.Row; nRow <= aEnd.Row && !bFound; ++nRow) + if (!m_bIncludeHiddenCells) { + // Skip hidden columns. + SCCOL nLastCol = -1; + bool bColHidden = m_pDocument->ColHidden(nCol, nTab, NULL, &nLastCol); + if (bColHidden) + { + nCol = nLastCol; + continue; + } + } + + for (SCROW nRow = p->aStart.Row(); nRow <= p->aEnd.Row(); ++nRow) + { + if (!m_bIncludeHiddenCells) + { + // Skip hidden rows. + SCROW nLastRow = -1; + bool bRowHidden = m_pDocument->RowHidden(nRow, nTab, NULL, &nLastRow); + if (bRowHidden) + { + nRow = nLastRow; + continue; + } + } + + ScAddress aPos(nCol, nRow, nTab); + if( bGetSeriesFormat ) { // TODO: use nicer heuristic // return format of first non-empty cell - uno::Reference< text::XText > xText( - xSheet->getCellByPosition(nCol, nRow), uno::UNO_QUERY); - if (xText.is() && xText->getString().getLength()) - { - uno::Reference< beans::XPropertySet > xProp(xText, uno::UNO_QUERY); - if( xProp.is()) - xProp->getPropertyValue( - ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("NumberFormat"))) >>= nResult; - bFound = true; - break; - } + ScBaseCell* pCell = m_pDocument->GetCell(aPos); + if (pCell) + return static_cast<sal_Int32>(getDisplayNumberFormat(m_pDocument, aPos)); } else if( nCount == nIndex ) { - uno::Reference< beans::XPropertySet > xProp( - xSheet->getCellByPosition(nCol, nRow), uno::UNO_QUERY); - if( xProp.is()) - xProp->getPropertyValue( - ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("NumberFormat"))) >>= nResult; - bFound = true; - break; + return static_cast<sal_Int32>(getDisplayNumberFormat(m_pDocument, aPos)); } ++nCount; } } } } - - return nResult; + return 0; } // XCloneable ================================================================ |
