summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEike Rathke <erack@redhat.com>2016-03-18 12:27:09 +0100
committerEike Rathke <erack@redhat.com>2016-03-18 12:29:52 +0100
commit090de0e963fd3b0c7c4f8db4124b71b0fd92f61f (patch)
tree05d2eb87dc4e8e31bad43e9f6cd90e5d52ed09b4
parent9ebe054ddb2d938b24ca4688be9bcbc62745f67f (diff)
let FindRangeNamesInUse() collect also sheet-local names, tdf#96915 related
... though CopyRangeNamesToClip()/copyUsedNamesToClip() don't handle them yet. Change-Id: I570c13725ed6448688d1a2ce877f8bc1d1ff9916
-rw-r--r--sc/inc/column.hxx2
-rw-r--r--sc/inc/formulacell.hxx3
-rw-r--r--sc/inc/refupdatecontext.hxx13
-rw-r--r--sc/inc/table.hxx2
-rw-r--r--sc/source/core/data/column.cxx6
-rw-r--r--sc/source/core/data/document.cxx9
-rw-r--r--sc/source/core/data/formulacell.cxx19
-rw-r--r--sc/source/core/data/refupdatecontext.cxx14
-rw-r--r--sc/source/core/data/table1.cxx2
9 files changed, 44 insertions, 26 deletions
diff --git a/sc/inc/column.hxx b/sc/inc/column.hxx
index 62009ca46d4a..38e49b64b006 100644
--- a/sc/inc/column.hxx
+++ b/sc/inc/column.hxx
@@ -418,7 +418,7 @@ public:
void UpdateGrow( const ScRange& rArea, SCCOL nGrowX, SCROW nGrowY );
void SetTabNo(SCTAB nNewTab);
- void FindRangeNamesInUse(SCROW nRow1, SCROW nRow2, std::set<sal_uInt16>& rIndexes) const;
+ void FindRangeNamesInUse(SCROW nRow1, SCROW nRow2, sc::UpdatedRangeNames& rIndexes) const;
void PreprocessRangeNameUpdate(
sc::EndListeningContext& rEndListenCxt, sc::CompileFormulaContext& rCompileCxt );
diff --git a/sc/inc/formulacell.hxx b/sc/inc/formulacell.hxx
index d2c8c70d19fb..2d4c0476d230 100644
--- a/sc/inc/formulacell.hxx
+++ b/sc/inc/formulacell.hxx
@@ -46,6 +46,7 @@ struct RefUpdateDeleteTabContext;
struct RefUpdateMoveTabContext;
class CompileFormulaContext;
class FormulaGroupAreaListener;
+class UpdatedRangeNames;
}
@@ -276,7 +277,7 @@ public:
void UpdateMoveTab( sc::RefUpdateMoveTabContext& rCxt, SCTAB nTabNo );
bool TestTabRefAbs(SCTAB nTable);
void UpdateCompile( bool bForceIfNameInUse = false );
- void FindRangeNamesInUse(std::set<sal_uInt16>& rIndexes) const;
+ void FindRangeNamesInUse(sc::UpdatedRangeNames& rIndexes) const;
bool IsSubTotal() const { return bSubTotal;}
bool IsChanged() const { return bChanged;}
void SetChanged(bool b);
diff --git a/sc/inc/refupdatecontext.hxx b/sc/inc/refupdatecontext.hxx
index bee194c457e8..272c3a23e4a2 100644
--- a/sc/inc/refupdatecontext.hxx
+++ b/sc/inc/refupdatecontext.hxx
@@ -24,17 +24,22 @@ namespace sc {
/**
* Keep track of all named expressions that have been updated during
* reference update.
+ *
+ * Can also be used to collect any set of named expressions / ranges.
*/
class UpdatedRangeNames
{
+public:
typedef std::unordered_set<sal_uInt16> NameIndicesType;
- typedef std::unordered_map<SCTAB, NameIndicesType> UpdatedNamesType;
-
- UpdatedNamesType maUpdatedNames;
-public:
void setUpdatedName(SCTAB nTab, sal_uInt16 nIndex);
bool isNameUpdated(SCTAB nTab, sal_uInt16 nIndex) const;
+ NameIndicesType getUpdatedNames(SCTAB nTab) const;
+
+private:
+ typedef std::unordered_map<SCTAB, NameIndicesType> UpdatedNamesType;
+
+ UpdatedNamesType maUpdatedNames;
};
/**
diff --git a/sc/inc/table.hxx b/sc/inc/table.hxx
index 95d3225c985e..31b277f9e2d8 100644
--- a/sc/inc/table.hxx
+++ b/sc/inc/table.hxx
@@ -565,7 +565,7 @@ public:
void UpdateCompile( bool bForceIfNameInUse = false );
void SetTabNo(SCTAB nNewTab);
void FindRangeNamesInUse(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2,
- std::set<sal_uInt16>& rIndexes) const;
+ sc::UpdatedRangeNames& rIndexes) const;
void Fill( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2,
sal_uLong nFillCount, FillDir eFillDir, FillCmd eFillCmd, FillDateCmd eFillDateCmd,
double nStepValue, double nMaxValue, ScProgress* pProgress);
diff --git a/sc/source/core/data/column.cxx b/sc/source/core/data/column.cxx
index ce2ab47493b5..f3ae280bac02 100644
--- a/sc/source/core/data/column.cxx
+++ b/sc/source/core/data/column.cxx
@@ -2632,9 +2632,9 @@ public:
class UsedRangeNameFinder
{
- std::set<sal_uInt16>& mrIndexes;
+ sc::UpdatedRangeNames& mrIndexes;
public:
- explicit UsedRangeNameFinder(std::set<sal_uInt16>& rIndexes) : mrIndexes(rIndexes) {}
+ explicit UsedRangeNameFinder(sc::UpdatedRangeNames& rIndexes) : mrIndexes(rIndexes) {}
void operator() (size_t /*nRow*/, const ScFormulaCell* pCell)
{
@@ -3060,7 +3060,7 @@ void ScColumn::SetTabNo(SCTAB nNewTab)
sc::ProcessFormula(maCells, aFunc);
}
-void ScColumn::FindRangeNamesInUse(SCROW nRow1, SCROW nRow2, std::set<sal_uInt16>& rIndexes) const
+void ScColumn::FindRangeNamesInUse(SCROW nRow1, SCROW nRow2, sc::UpdatedRangeNames& rIndexes) const
{
UsedRangeNameFinder aFunc(rIndexes);
sc::ParseFormula(maCells.begin(), maCells, nRow1, nRow2, aFunc);
diff --git a/sc/source/core/data/document.cxx b/sc/source/core/data/document.cxx
index 73eb510db9e0..53544c5bb073 100644
--- a/sc/source/core/data/document.cxx
+++ b/sc/source/core/data/document.cxx
@@ -2328,7 +2328,8 @@ void ScDocument::TransposeClip( ScDocument* pTransClip, InsertDeleteFlags nFlags
namespace {
-void copyUsedNamesToClip(ScRangeName* pClipRangeName, ScRangeName* pRangeName, const std::set<sal_uInt16>& rUsedNames)
+void copyUsedNamesToClip(ScRangeName* pClipRangeName, ScRangeName* pRangeName,
+ const sc::UpdatedRangeNames::NameIndicesType& rUsedNames)
{
pClipRangeName->clear();
ScRangeName::const_iterator itr = pRangeName->begin(), itrEnd = pRangeName->end();
@@ -2352,7 +2353,7 @@ void ScDocument::CopyRangeNamesToClip(ScDocument* pClipDoc, const ScRange& rClip
if (!pRangeName || pRangeName->empty())
return;
- std::set<sal_uInt16> aUsedNames; // indexes of named ranges that are used in the copied cells
+ sc::UpdatedRangeNames aUsedNames; // indexes of named ranges that are used in the copied cells
SCTAB nMinSizeBothTabs = static_cast<SCTAB>(std::min(maTabs.size(), pClipDoc->maTabs.size()));
for (SCTAB i = 0; i < nMinSizeBothTabs; ++i)
if (maTabs[i] && pClipDoc->maTabs[i])
@@ -2361,7 +2362,9 @@ void ScDocument::CopyRangeNamesToClip(ScDocument* pClipDoc, const ScRange& rClip
rClipRange.aStart.Col(), rClipRange.aStart.Row(),
rClipRange.aEnd.Col(), rClipRange.aEnd.Row(), aUsedNames);
- copyUsedNamesToClip(pClipDoc->GetRangeName(), pRangeName, aUsedNames);
+ /* TODO: handle also sheet-local names */
+ sc::UpdatedRangeNames::NameIndicesType aUsedGlobalNames( aUsedNames.getUpdatedNames(-1));
+ copyUsedNamesToClip(pClipDoc->GetRangeName(), pRangeName, aUsedGlobalNames);
}
ScDocument::NumFmtMergeHandler::NumFmtMergeHandler(ScDocument* pDoc, ScDocument* pSrcDoc) :
diff --git a/sc/source/core/data/formulacell.cxx b/sc/source/core/data/formulacell.cxx
index 0db0ab4f65a5..9ef82e4834b1 100644
--- a/sc/source/core/data/formulacell.cxx
+++ b/sc/source/core/data/formulacell.cxx
@@ -3700,31 +3700,26 @@ void ScFormulaCell::UpdateGrow( const ScRange& rArea, SCCOL nGrowX, SCROW nGrowY
StartListeningTo( pDocument ); // Listener as previous
}
-static void lcl_FindRangeNamesInUse(std::set<sal_uInt16>& rIndexes, ScTokenArray* pCode, ScRangeName* pNames)
+static void lcl_FindRangeNamesInUse(sc::UpdatedRangeNames& rIndexes, ScTokenArray* pCode, const ScDocument* pDoc)
{
for (FormulaToken* p = pCode->First(); p; p = pCode->Next())
{
if (p->GetOpCode() == ocName)
{
- /* TODO: this should collect also sheet-local names, currently it
- * collects only global names. But looking even for indexes of
- * local names.. this always was wrong. Probably use
- * UpdatedRangeNames instead of the set, but doing so would also
- * need more work in copying things over clipboard and such. */
-
sal_uInt16 nTokenIndex = p->GetIndex();
- rIndexes.insert( nTokenIndex );
+ SCTAB nTab = p->GetSheet();
+ rIndexes.setUpdatedName( nTab, nTokenIndex);
- ScRangeData* pSubName = pNames->findByIndex(p->GetIndex());
+ ScRangeData* pSubName = pDoc->FindRangeNameByIndexAndSheet( nTokenIndex, nTab);
if (pSubName)
- lcl_FindRangeNamesInUse(rIndexes, pSubName->GetCode(), pNames);
+ lcl_FindRangeNamesInUse(rIndexes, pSubName->GetCode(), pDoc);
}
}
}
-void ScFormulaCell::FindRangeNamesInUse(std::set<sal_uInt16>& rIndexes) const
+void ScFormulaCell::FindRangeNamesInUse(sc::UpdatedRangeNames& rIndexes) const
{
- lcl_FindRangeNamesInUse( rIndexes, pCode, pDocument->GetRangeName() );
+ lcl_FindRangeNamesInUse( rIndexes, pCode, pDocument );
}
void ScFormulaCell::SetChanged(bool b)
diff --git a/sc/source/core/data/refupdatecontext.cxx b/sc/source/core/data/refupdatecontext.cxx
index 07cb0602e060..79a3792b41a5 100644
--- a/sc/source/core/data/refupdatecontext.cxx
+++ b/sc/source/core/data/refupdatecontext.cxx
@@ -14,6 +14,11 @@ namespace sc {
void UpdatedRangeNames::setUpdatedName(SCTAB nTab, sal_uInt16 nIndex)
{
+ // Map anything <-1 to global names. Unless we really want to come up with
+ // some classification there..
+ if (nTab < -1)
+ nTab = -1;
+
UpdatedNamesType::iterator it = maUpdatedNames.find(nTab);
if (it == maUpdatedNames.end())
{
@@ -43,6 +48,15 @@ bool UpdatedRangeNames::isNameUpdated(SCTAB nTab, sal_uInt16 nIndex) const
return rIndices.count(nIndex) > 0;
}
+UpdatedRangeNames::NameIndicesType UpdatedRangeNames::getUpdatedNames(SCTAB nTab) const
+{
+ UpdatedNamesType::const_iterator it = maUpdatedNames.find(nTab);
+ if (it == maUpdatedNames.end())
+ return NameIndicesType();
+ return it->second;
+}
+
+
RefUpdateContext::RefUpdateContext(ScDocument& rDoc) :
mrDoc(rDoc), meMode(URM_INSDEL), mnColDelta(0), mnRowDelta(0), mnTabDelta(0) {}
diff --git a/sc/source/core/data/table1.cxx b/sc/source/core/data/table1.cxx
index 2d7951123227..af61151753a4 100644
--- a/sc/source/core/data/table1.cxx
+++ b/sc/source/core/data/table1.cxx
@@ -1709,7 +1709,7 @@ void ScTable::SetTabNo(SCTAB nNewTab)
}
void ScTable::FindRangeNamesInUse(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2,
- std::set<sal_uInt16>& rIndexes) const
+ sc::UpdatedRangeNames& rIndexes) const
{
for (SCCOL i = nCol1; i <= nCol2 && ValidCol(i); i++)
aCol[i].FindRangeNamesInUse(nRow1, nRow2, rIndexes);