sc/inc/formulacell.hxx | 3 ++ sc/source/core/data/column.cxx | 36 +++++++++++++++++++++++++++- sc/source/core/data/column3.cxx | 41 +++++++++++++++++++++++++++++++-- sc/source/core/data/documentimport.cxx | 41 ++++++++++++++++++++++++++++----- sc/source/core/data/formulacell.cxx | 25 ++++++++++++++++---- 5 files changed, 133 insertions(+), 13 deletions(-)
New commits: commit 3f96f44be8048c112766819f990c3bb18366c874 Author: Kohei Yoshida <kohei.yosh...@collabora.com> Date: Wed Oct 1 20:34:36 2014 -0400 Be sure to copy the cell text attributes values to and from clip. Otherwise we'd have to unnecessarily re-calculate the script types again which is not cheap... Change-Id: Ie589fb4a7e5ec9b5ef646dabea4e6bd0c0aca560 diff --git a/sc/source/core/data/column.cxx b/sc/source/core/data/column.cxx index 939069b..656d53c 100644 --- a/sc/source/core/data/column.cxx +++ b/sc/source/core/data/column.cxx @@ -983,6 +983,31 @@ public: } }; +class CopyTextAttrToClipHandler +{ + sc::CellTextAttrStoreType& mrDestAttrs; + sc::CellTextAttrStoreType::iterator miPos; + +public: + CopyTextAttrToClipHandler( sc::CellTextAttrStoreType& rAttrs ) : + mrDestAttrs(rAttrs), miPos(mrDestAttrs.begin()) {} + + void operator() ( const sc::CellTextAttrStoreType::value_type& aNode, size_t nOffset, size_t nDataSize ) + { + if (aNode.type != sc::element_type_celltextattr) + return; + + sc::celltextattr_block::const_iterator it = sc::celltextattr_block::begin(*aNode.data); + std::advance(it, nOffset); + sc::celltextattr_block::const_iterator itEnd = it; + std::advance(itEnd, nDataSize); + + size_t nPos = aNode.position + nOffset; + miPos = mrDestAttrs.set(miPos, nPos, it, itEnd); + } +}; + + } void ScColumn::CopyToClip( @@ -991,8 +1016,15 @@ void ScColumn::CopyToClip( pAttrArray->CopyArea( nRow1, nRow2, 0, *rColumn.pAttrArray, rCxt.isKeepScenarioFlags() ? (SC_MF_ALL & ~SC_MF_SCENARIO) : SC_MF_ALL ); - CopyToClipHandler aFunc(*this, rColumn, rCxt.getBlockPosition(rColumn.nTab, rColumn.nCol), rCxt.isCloneNotes()); - sc::ParseBlock(maCells.begin(), maCells, aFunc, nRow1, nRow2); + { + CopyToClipHandler aFunc(*this, rColumn, rCxt.getBlockPosition(rColumn.nTab, rColumn.nCol), rCxt.isCloneNotes()); + sc::ParseBlock(maCells.begin(), maCells, aFunc, nRow1, nRow2); + } + + { + CopyTextAttrToClipHandler aFunc(rColumn.maCellTextAttrs); + sc::ParseBlock(maCellTextAttrs.begin(), maCellTextAttrs, aFunc, nRow1, nRow2); + } rColumn.CellStorageModified(); } diff --git a/sc/source/core/data/column3.cxx b/sc/source/core/data/column3.cxx index 5723b73..225276a 100644 --- a/sc/source/core/data/column3.cxx +++ b/sc/source/core/data/column3.cxx @@ -950,6 +950,31 @@ public: } }; +class CopyTextAttrsFromClipHandler +{ + sc::CellTextAttrStoreType& mrAttrs; + sc::CellTextAttrStoreType::iterator miPos; + size_t mnDelta; + +public: + CopyTextAttrsFromClipHandler( sc::CellTextAttrStoreType& rAttrs, size_t nDelta ) : + mrAttrs(rAttrs), miPos(mrAttrs.begin()), mnDelta(nDelta) {} + + void operator() ( const sc::CellTextAttrStoreType::value_type& aNode, size_t nOffset, size_t nDataSize ) + { + if (aNode.type != sc::element_type_celltextattr) + return; + + sc::celltextattr_block::const_iterator it = sc::celltextattr_block::begin(*aNode.data); + std::advance(it, nOffset); + sc::celltextattr_block::const_iterator itEnd = it; + std::advance(itEnd, nDataSize); + + size_t nPos = aNode.position + nOffset + mnDelta; + miPos = mrAttrs.set(miPos, nPos, it, itEnd); + } +}; + } // rColumn = source @@ -1001,6 +1026,10 @@ void ScColumn::CopyFromClip( SetFormulaCell(nDestRow, new ScFormulaCell(pDocument, aDestPos, aArr)); } + // Don't forget to copy the cell text attributes. + CopyTextAttrsFromClipHandler aFunc(maCellTextAttrs, nDy); + sc::ParseBlock(rColumn.maCellTextAttrs.begin(), rColumn.maCellTextAttrs, aFunc, nRow1-nDy, nRow2-nDy); + return; } @@ -1011,8 +1040,16 @@ void ScColumn::CopyFromClip( // nRow1 to nRow2 is for destination (this) column. Subtract nDy to get the source range. // Copy all cells in the source column (rColumn) from nRow1-nDy to nRow2-nDy to this column. - CopyCellsFromClipHandler aFunc(rCxt, rColumn, *this, nTab, nCol, nDy, pSharedStringPool); - sc::ParseBlock(rColumn.maCells.begin(), rColumn.maCells, aFunc, nRow1-nDy, nRow2-nDy); + { + CopyCellsFromClipHandler aFunc(rCxt, rColumn, *this, nTab, nCol, nDy, pSharedStringPool); + sc::ParseBlock(rColumn.maCells.begin(), rColumn.maCells, aFunc, nRow1-nDy, nRow2-nDy); + } + + { + // Don't forget to copy the cell text attributes. + CopyTextAttrsFromClipHandler aFunc(maCellTextAttrs, nDy); + sc::ParseBlock(rColumn.maCellTextAttrs.begin(), rColumn.maCellTextAttrs, aFunc, nRow1-nDy, nRow2-nDy); + } } void ScColumn::MixMarked( commit 673534adcbd32bde262875d0af29a9f42e5949ed Author: Kohei Yoshida <kohei.yosh...@collabora.com> Date: Wed Oct 1 15:18:17 2014 -0400 Set script type to latin for formula cells with numeric results. But only when the column contains only standard number format types. Change-Id: I83982d2e87f9776cf03754beaf183e35675be992 diff --git a/sc/inc/formulacell.hxx b/sc/inc/formulacell.hxx index b765ff0..502fbb8 100644 --- a/sc/inc/formulacell.hxx +++ b/sc/inc/formulacell.hxx @@ -289,6 +289,7 @@ public: bool IsEmptyDisplayedAsString(); bool IsValue(); // also true if formula::svEmptyCell bool IsValueNoError(); + bool IsValueNoError() const; bool IsHybridValueCell(); // for cells after import to deal with inherited number formats double GetValue(); svl::SharedString GetString(); @@ -370,6 +371,8 @@ public: /** Determines whether or not the result string contains more than one paragraph */ bool IsMultilineResult(); + bool NeedsInterpret() const; + void MaybeInterpret(); /** diff --git a/sc/source/core/data/documentimport.cxx b/sc/source/core/data/documentimport.cxx index 29f912f..625b92f 100644 --- a/sc/source/core/data/documentimport.cxx +++ b/sc/source/core/data/documentimport.cxx @@ -513,12 +513,43 @@ public: // Fill with default values for non-empty cell segments. sc::CellTextAttr aDefault; - if (node.type == sc::element_type_numeric) + switch (node.type) { - aDefault.mnScriptType = mpImpl->mnScriptNumeric; - const ColAttr* p = mrDocImpl.getColAttr(mnTab, mnCol); - if (p && p->mbLatinNumFmtOnly) - aDefault.mnScriptType = SCRIPTTYPE_LATIN; + case sc::element_type_numeric: + { + aDefault.mnScriptType = mpImpl->mnScriptNumeric; + const ColAttr* p = mrDocImpl.getColAttr(mnTab, mnCol); + if (p && p->mbLatinNumFmtOnly) + aDefault.mnScriptType = SCRIPTTYPE_LATIN; + } + break; + case sc::element_type_formula: + { + const ColAttr* p = mrDocImpl.getColAttr(mnTab, mnCol); + if (p && p->mbLatinNumFmtOnly) + { + // We can assume latin script type if the block only + // contains formula cells with numeric results. + ScFormulaCell** pp = &sc::formula_block::at(*node.data, 0); + ScFormulaCell** ppEnd = pp + node.size; + bool bNumResOnly = true; + for (; pp != ppEnd; ++pp) + { + const ScFormulaCell& rCell = **pp; + if (!rCell.IsValueNoError()) + { + bNumResOnly = false; + break; + } + } + + if (bNumResOnly) + aDefault.mnScriptType = SCRIPTTYPE_LATIN; + } + } + break; + default: + ; } std::vector<sc::CellTextAttr> aDefaults(node.size, aDefault); diff --git a/sc/source/core/data/formulacell.cxx b/sc/source/core/data/formulacell.cxx index d10b9d4..f809cc2 100644 --- a/sc/source/core/data/formulacell.cxx +++ b/sc/source/core/data/formulacell.cxx @@ -2218,15 +2218,20 @@ bool ScFormulaCell::IsMultilineResult() return false; } -void ScFormulaCell::MaybeInterpret() +bool ScFormulaCell::NeedsInterpret() const { if (mxGroup && mxGroup->meKernelState == sc::OpenCLKernelCompilationScheduled) - return; + return false; if (!IsDirtyOrInTableOpDirty()) - return; + return false; - if (pDocument->GetAutoCalc() || (cMatrixFlag != MM_NONE)) + return (pDocument->GetAutoCalc() || (cMatrixFlag != MM_NONE)); +} + +void ScFormulaCell::MaybeInterpret() +{ + if (NeedsInterpret()) Interpret(); } @@ -2271,6 +2276,18 @@ bool ScFormulaCell::IsValueNoError() return aResult.IsValueNoError(); } +bool ScFormulaCell::IsValueNoError() const +{ + if (NeedsInterpret()) + // false if the cell is dirty & needs to be interpreted. + return false; + + if (pCode->GetCodeError()) + return false; + + return aResult.IsValueNoError(); +} + bool ScFormulaCell::IsHybridValueCell() { return aResult.GetType() == formula::svHybridValueCell; _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits