[Libreoffice-commits] core.git: 3 commits - sc/inc sc/source
Eike Rathke
erack at redhat.com
Thu Apr 28 21:13:01 UTC 2016
sc/inc/document.hxx | 83 ++++++++
sc/source/core/data/document10.cxx | 356 ++++++++++++++++++++++++++++++++++
sc/source/core/data/formulacell.cxx | 372 ------------------------------------
3 files changed, 444 insertions(+), 367 deletions(-)
New commits:
commit 37b071c9330d28f08d5a9f7bf11e577040925684
Author: Eike Rathke <erack at redhat.com>
Date: Thu Apr 28 22:42:14 2016 +0200
move to ScDocument::CopyAdjustRangeName() and namespace
Change-Id: I1ec3c8cc1b8d3cb899d49192295b14ffac02849a
diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx
index bb46e2d..a38279f 100644
--- a/sc/inc/document.hxx
+++ b/sc/inc/document.hxx
@@ -600,6 +600,40 @@ public:
SCTAB nGlobalRefTab, SCTAB nLocalRefTab, SCTAB nOldTokenTab, SCTAB nOldTokenTabReplacement,
bool bSameDoc, int nRecursion ) const;
+ /** If necessary (name references sheet rOldPos.Tab()) copy and adjust
+ named expression/range from sheet-local to sheet-local, or global to
+ sheet-local if bGlobalNamesToLocal==true.
+
+ Also copies nested names and adjusts the ocName tokens of the calling name.
+
+ @param rSheet
+ On entry, the original sheet of the named expression/range, <0 global.
+ On return TRUE, the new sheet. Else unchanged.
+
+ @param rIndex
+ On entry, the original index of the named expression/range.
+ On return TRUE, the new index, or 0 if a new copied name couldn't be inserted. Else unchanged.
+
+ @param rpRangeData
+ On entry, the pointer to the original named expression/range.
+ On return TRUE, the pointer to the new copied name, or nullptr if hit shappened.
+
+ @param rNewPos
+ New position of formula cell if called for that, else new base
+ position of a to be created new name adjusted for Tab.
+ rNewPos.nTab MUST point to the new sheet copied to.
+
+ @param rOldPos
+ Old position of formula cell if called for that, else base
+ position of the existing name adjusted for Tab.
+ rOldPos.nTab MUST point to the old sheet copied from.
+
+ @return TRUE if copied and caller may need to evaluate rpRangeData and rSheet and rIndex.
+ FALSE if nothing to be done.
+ */
+ bool CopyAdjustRangeName( SCTAB& rSheet, sal_uInt16& rIndex, ScRangeData*& rpRangeData, ScDocument& rNewDoc,
+ const ScAddress& rNewPos, const ScAddress& rOldPos, const bool bGlobalNamesToLocal) const;
+
/**
* Call this immediately before updating all named ranges.
*/
diff --git a/sc/source/core/data/document10.cxx b/sc/source/core/data/document10.cxx
index 80375b8..f7ed6e8 100644
--- a/sc/source/core/data/document10.cxx
+++ b/sc/source/core/data/document10.cxx
@@ -513,4 +513,296 @@ bool ScDocument::FindRangeNamesReferencingSheet( sc::UpdatedRangeNames& rIndexes
return bRef;
}
+namespace {
+
+enum MightReferenceSheet
+{
+ UNKNOWN,
+ NONE,
+ CODE,
+ NAME
+};
+
+MightReferenceSheet mightRangeNameReferenceSheet( ScRangeData* pData, SCTAB nRefTab)
+{
+ ScTokenArray* pCode = pData->GetCode();
+ if (!pCode)
+ return MightReferenceSheet::NONE;
+
+ for (const formula::FormulaToken* p = pCode->First(); p; p = pCode->Next())
+ {
+ if (p->GetOpCode() == ocName)
+ return MightReferenceSheet::NAME;
+ }
+
+ return pCode->ReferencesSheet( nRefTab, pData->GetPos().Tab()) ?
+ MightReferenceSheet::CODE : MightReferenceSheet::NONE;
+}
+
+ScRangeData* copyRangeName( const ScRangeData* pOldRangeData, ScDocument& rNewDoc, const ScDocument* pOldDoc,
+ const ScAddress& rNewPos, const ScAddress& rOldPos, bool bGlobalNamesToLocal,
+ SCTAB nOldSheet, const SCTAB nNewSheet, bool bSameDoc)
+{
+ ScAddress aRangePos( pOldRangeData->GetPos());
+ if (nNewSheet >= 0)
+ aRangePos.SetTab( nNewSheet);
+ ScRangeData* pRangeData = new ScRangeData(*pOldRangeData, &rNewDoc, &aRangePos);
+ pRangeData->SetIndex(0); // needed for insert to assign a new index
+ ScTokenArray* pRangeNameToken = pRangeData->GetCode();
+ if (bSameDoc && nNewSheet >= 0)
+ {
+ if (bGlobalNamesToLocal && nOldSheet < 0)
+ {
+ nOldSheet = rOldPos.Tab();
+ if (rNewPos.Tab() <= nOldSheet)
+ // Sheet was inserted before and references already updated.
+ ++nOldSheet;
+ }
+ pRangeNameToken->AdjustSheetLocalNameReferences( nOldSheet, nNewSheet);
+ }
+ if (!bSameDoc)
+ {
+ pRangeNameToken->ReadjustAbsolute3DReferences(pOldDoc, &rNewDoc, pRangeData->GetPos(), true);
+ pRangeNameToken->AdjustAbsoluteRefs(pOldDoc, rOldPos, rNewPos, true);
+ }
+
+ bool bInserted;
+ if (nNewSheet < 0)
+ bInserted = rNewDoc.GetRangeName()->insert(pRangeData);
+ else
+ bInserted = rNewDoc.GetRangeName(nNewSheet)->insert(pRangeData);
+
+ return bInserted ? pRangeData : nullptr;
+}
+
+struct SheetIndex
+{
+ SCTAB mnSheet;
+ sal_uInt16 mnIndex;
+
+ SheetIndex( SCTAB nSheet, sal_uInt16 nIndex ) : mnSheet(nSheet < -1 ? -1 : nSheet), mnIndex(nIndex) {}
+ bool operator<( const SheetIndex& r ) const
+ {
+ // Ascending order sheet, index
+ if (mnSheet < r.mnSheet)
+ return true;
+ if (mnSheet == r.mnSheet)
+ return mnIndex < r.mnIndex;
+ return false;
+ }
+};
+typedef std::map< SheetIndex, SheetIndex > SheetIndexMap;
+
+ScRangeData* copyRangeNames( SheetIndexMap& rSheetIndexMap, std::vector<ScRangeData*>& rRangeDataVec,
+ const sc::UpdatedRangeNames& rReferencingNames, SCTAB nTab,
+ const ScRangeData* pOldRangeData, ScDocument& rNewDoc, const ScDocument* pOldDoc,
+ const ScAddress& rNewPos, const ScAddress& rOldPos, bool bGlobalNamesToLocal,
+ const SCTAB nOldSheet, const SCTAB nNewSheet, bool bSameDoc)
+{
+ ScRangeData* pRangeData = nullptr;
+ const ScRangeName* pOldRangeName = (nTab < 0 ? pOldDoc->GetRangeName() : pOldDoc->GetRangeName(nTab));
+ if (pOldRangeName)
+ {
+ const ScRangeName* pNewRangeName = (nNewSheet < 0 ? rNewDoc.GetRangeName() : rNewDoc.GetRangeName(nNewSheet));
+ sc::UpdatedRangeNames::NameIndicesType aSet( rReferencingNames.getUpdatedNames(nTab));
+ for (auto const & rIndex : aSet)
+ {
+ const ScRangeData* pCopyData = pOldRangeName->findByIndex(rIndex);
+ if (pCopyData)
+ {
+ // Match the original pOldRangeData to adapt the current
+ // token's values later. For that no check for an already
+ // copied name is needed as we only enter here if there was
+ // none.
+ if (pCopyData == pOldRangeData)
+ {
+ pRangeData = copyRangeName( pCopyData, rNewDoc, pOldDoc, rNewPos, rOldPos,
+ bGlobalNamesToLocal, nOldSheet, nNewSheet, bSameDoc);
+ if (pRangeData)
+ {
+ rRangeDataVec.push_back(pRangeData);
+ rSheetIndexMap.insert( std::make_pair( SheetIndex( nOldSheet, pCopyData->GetIndex()),
+ SheetIndex( nNewSheet, pRangeData->GetIndex())));
+ }
+ }
+ else
+ {
+ // First check if the name is already available as copy.
+ const ScRangeData* pFoundData = pNewRangeName->findByUpperName( pCopyData->GetUpperName());
+ if (pFoundData)
+ {
+ // Just add the resulting sheet/index mapping.
+ rSheetIndexMap.insert( std::make_pair( SheetIndex( nOldSheet, pCopyData->GetIndex()),
+ SheetIndex( nNewSheet, pFoundData->GetIndex())));
+ }
+ else
+ {
+ ScRangeData* pTmpData = copyRangeName( pCopyData, rNewDoc, pOldDoc, rNewPos, rOldPos,
+ bGlobalNamesToLocal, nOldSheet, nNewSheet, bSameDoc);
+ if (pTmpData)
+ {
+ rRangeDataVec.push_back(pTmpData);
+ rSheetIndexMap.insert( std::make_pair( SheetIndex( nOldSheet, pCopyData->GetIndex()),
+ SheetIndex( nNewSheet, pTmpData->GetIndex())));
+ }
+ }
+ }
+ }
+ }
+ }
+ return pRangeData;
+}
+
+} // namespace
+
+bool ScDocument::CopyAdjustRangeName( SCTAB& rSheet, sal_uInt16& rIndex, ScRangeData*& rpRangeData,
+ ScDocument& rNewDoc, const ScAddress& rNewPos, const ScAddress& rOldPos, const bool bGlobalNamesToLocal) const
+{
+ const bool bSameDoc = (rNewDoc.GetPool() == const_cast<ScDocument*>(this)->GetPool());
+ if (bSameDoc && ((rSheet < 0 && !bGlobalNamesToLocal) || (rSheet >= 0 && rSheet != rOldPos.Tab())))
+ // Same doc and global name, if not copied to local name, or
+ // sheet-local name on other sheet stays the same.
+ return false;
+
+ // Ensure we don't fiddle with the references until exit.
+ const SCTAB nOldSheet = rSheet;
+ const sal_uInt16 nOldIndex = rIndex;
+
+ SAL_WARN_IF( !bSameDoc && nOldSheet >= 0 && nOldSheet != rOldPos.Tab(),
+ "sc.core", "adjustCopyRangeName - sheet-local name was on other sheet in other document");
+ /* TODO: can we do something about that? e.g. loop over sheets? */
+
+ OUString aRangeName;
+ ScRangeData* pOldRangeData = nullptr;
+
+ // XXX bGlobalNamesToLocal is also a synonym for copied sheet.
+ bool bInsertingBefore = (bGlobalNamesToLocal && bSameDoc && rNewPos.Tab() <= rOldPos.Tab());
+
+ // The Tab where an old local name is to be found or that a global name
+ // references. May differ below from nOldSheet if a sheet was inserted
+ // before the old position. Global names and local names other than on the
+ // old sheet or new sheet are already updated, local names on the old sheet
+ // or inserted sheet will be updated later. Confusing stuff. Watch out.
+ SCTAB nOldTab = (nOldSheet < 0 ? rOldPos.Tab() : nOldSheet);
+ if (bInsertingBefore)
+ // Sheet was already inserted before old position.
+ ++nOldTab;
+
+ // Search the name of the RangeName.
+ if (nOldSheet >= 0)
+ {
+ const ScRangeName* pNames = GetRangeName(nOldTab);
+ pOldRangeData = pNames ? pNames->findByIndex(nOldIndex) : nullptr;
+ if (!pOldRangeData)
+ return false; // might be an error in the formula array
+ aRangeName = pOldRangeData->GetUpperName();
+ }
+ else
+ {
+ pOldRangeData = GetRangeName()->findByIndex(nOldIndex);
+ if (!pOldRangeData)
+ return false; // might be an error in the formula array
+ aRangeName = pOldRangeData->GetUpperName();
+ }
+
+ // Find corresponding range name in new document.
+ // First search for local range name then global range names.
+ SCTAB nNewSheet = rNewPos.Tab();
+ ScRangeName* pNewNames = rNewDoc.GetRangeName(nNewSheet);
+ // Search local range names.
+ if (pNewNames)
+ {
+ rpRangeData = pNewNames->findByUpperName(aRangeName);
+ }
+ // Search global range names.
+ if (!rpRangeData && !bGlobalNamesToLocal)
+ {
+ nNewSheet = -1;
+ pNewNames = rNewDoc.GetRangeName();
+ if (pNewNames)
+ rpRangeData = pNewNames->findByUpperName(aRangeName);
+ }
+ // If no range name was found copy it.
+ if (!rpRangeData)
+ {
+ bool bEarlyBailOut = (nOldSheet < 0 && bSameDoc);
+ MightReferenceSheet eMightReference = mightRangeNameReferenceSheet( pOldRangeData, nOldTab);
+ if (bEarlyBailOut && eMightReference == MightReferenceSheet::NONE)
+ return false;
+
+ if (eMightReference == MightReferenceSheet::NAME)
+ {
+ // Name these to clarify what is passed where.
+ const SCTAB nGlobalRefTab = nOldTab;
+ const SCTAB nLocalRefTab = (bInsertingBefore ? nOldTab-1 : nOldTab);
+ const SCTAB nOldTokenTab = (nOldSheet < 0 ? (bInsertingBefore ? nOldTab-1 : nOldTab) : nOldSheet);
+ const SCTAB nOldTokenTabReplacement = nOldTab;
+ sc::UpdatedRangeNames aReferencingNames;
+ FindRangeNamesReferencingSheet( aReferencingNames, nOldSheet, nOldIndex,
+ nGlobalRefTab, nLocalRefTab, nOldTokenTab, nOldTokenTabReplacement, bSameDoc, 0);
+ if (bEarlyBailOut && aReferencingNames.isEmpty(-1) && aReferencingNames.isEmpty(nOldTokenTabReplacement))
+ return false;
+
+ SheetIndexMap aSheetIndexMap;
+ std::vector<ScRangeData*> aRangeDataVec;
+ if (!aReferencingNames.isEmpty(nOldTokenTabReplacement))
+ {
+ const SCTAB nTmpOldSheet = (nOldSheet < 0 ? nOldTab : nOldSheet);
+ nNewSheet = rNewPos.Tab();
+ rpRangeData = copyRangeNames( aSheetIndexMap, aRangeDataVec, aReferencingNames, nOldTab,
+ pOldRangeData, rNewDoc, this, rNewPos, rOldPos,
+ bGlobalNamesToLocal, nTmpOldSheet, nNewSheet, bSameDoc);
+ }
+ if ((bGlobalNamesToLocal || !bSameDoc) && !aReferencingNames.isEmpty(-1))
+ {
+ const SCTAB nTmpOldSheet = -1;
+ const SCTAB nTmpNewSheet = (bGlobalNamesToLocal ? rNewPos.Tab() : -1);
+ ScRangeData* pTmpData = copyRangeNames( aSheetIndexMap, aRangeDataVec, aReferencingNames, -1,
+ pOldRangeData, rNewDoc, this, rNewPos, rOldPos,
+ bGlobalNamesToLocal, nTmpOldSheet, nTmpNewSheet, bSameDoc);
+ if (!rpRangeData)
+ {
+ rpRangeData = pTmpData;
+ nNewSheet = nTmpNewSheet;
+ }
+ }
+
+ // Adjust copied nested names to new sheet/index.
+ for (auto & iRD : aRangeDataVec)
+ {
+ ScTokenArray* pCode = iRD->GetCode();
+ if (pCode)
+ {
+ for (formula::FormulaToken* p = pCode->First(); p; p = pCode->Next())
+ {
+ if (p->GetOpCode() == ocName)
+ {
+ auto it = aSheetIndexMap.find( SheetIndex( p->GetSheet(), p->GetIndex()));
+ if (it != aSheetIndexMap.end())
+ {
+ p->SetSheet( it->second.mnSheet);
+ p->SetIndex( it->second.mnIndex);
+ }
+ else if (!bSameDoc)
+ {
+ SAL_WARN("sc.core","adjustCopyRangeName - mapping to new name in other doc missing");
+ p->SetIndex(0); // #NAME? error instead of arbitrary name.
+ }
+ }
+ }
+ }
+ }
+ }
+ else
+ {
+ nNewSheet = ((nOldSheet < 0 && !bGlobalNamesToLocal) ? -1 : rNewPos.Tab());
+ rpRangeData = copyRangeName( pOldRangeData, rNewDoc, this, rNewPos, rOldPos, bGlobalNamesToLocal,
+ nOldSheet, nNewSheet, bSameDoc);
+ }
+ }
+ rSheet = nNewSheet;
+ rIndex = rpRangeData ? rpRangeData->GetIndex() : 0; // 0 means not inserted
+ return true;
+}
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/source/core/data/formulacell.cxx b/sc/source/core/data/formulacell.cxx
index f2a56dd..b61d89c 100644
--- a/sc/source/core/data/formulacell.cxx
+++ b/sc/source/core/data/formulacell.cxx
@@ -424,320 +424,13 @@ bool lcl_isReference(const FormulaToken& rToken)
rToken.GetType() == svDoubleRef;
}
-enum MightReferenceSheet
-{
- UNKNOWN,
- NONE,
- CODE,
- NAME
-};
-
-MightReferenceSheet mightRangeNameReferenceSheet( ScRangeData* pData, SCTAB nRefTab)
-{
- ScTokenArray* pCode = pData->GetCode();
- if (!pCode)
- return MightReferenceSheet::NONE;
-
- for (const FormulaToken* p = pCode->First(); p; p = pCode->Next())
- {
- if (p->GetOpCode() == ocName)
- return MightReferenceSheet::NAME;
- }
-
- return pCode->ReferencesSheet( nRefTab, pData->GetPos().Tab()) ?
- MightReferenceSheet::CODE : MightReferenceSheet::NONE;
-}
-
-ScRangeData* copyRangeName( const ScRangeData* pOldRangeData, ScDocument& rNewDoc, const ScDocument* pOldDoc,
- const ScAddress& rNewPos, const ScAddress& rOldPos, bool bGlobalNamesToLocal,
- SCTAB nOldSheet, const SCTAB nNewSheet, bool bSameDoc)
-{
- ScAddress aRangePos( pOldRangeData->GetPos());
- if (nNewSheet >= 0)
- aRangePos.SetTab( nNewSheet);
- ScRangeData* pRangeData = new ScRangeData(*pOldRangeData, &rNewDoc, &aRangePos);
- pRangeData->SetIndex(0); // needed for insert to assign a new index
- ScTokenArray* pRangeNameToken = pRangeData->GetCode();
- if (bSameDoc && nNewSheet >= 0)
- {
- if (bGlobalNamesToLocal && nOldSheet < 0)
- {
- nOldSheet = rOldPos.Tab();
- if (rNewPos.Tab() <= nOldSheet)
- // Sheet was inserted before and references already updated.
- ++nOldSheet;
- }
- pRangeNameToken->AdjustSheetLocalNameReferences( nOldSheet, nNewSheet);
- }
- if (!bSameDoc)
- {
- pRangeNameToken->ReadjustAbsolute3DReferences(pOldDoc, &rNewDoc, pRangeData->GetPos(), true);
- pRangeNameToken->AdjustAbsoluteRefs(pOldDoc, rOldPos, rNewPos, true);
- }
-
- bool bInserted;
- if (nNewSheet < 0)
- bInserted = rNewDoc.GetRangeName()->insert(pRangeData);
- else
- bInserted = rNewDoc.GetRangeName(nNewSheet)->insert(pRangeData);
-
- return bInserted ? pRangeData : nullptr;
-}
-
-struct SheetIndex
-{
- SCTAB mnSheet;
- sal_uInt16 mnIndex;
-
- SheetIndex( SCTAB nSheet, sal_uInt16 nIndex ) : mnSheet(nSheet < -1 ? -1 : nSheet), mnIndex(nIndex) {}
- bool operator<( const SheetIndex& r ) const
- {
- // Ascending order sheet, index
- if (mnSheet < r.mnSheet)
- return true;
- if (mnSheet == r.mnSheet)
- return mnIndex < r.mnIndex;
- return false;
- }
-};
-typedef std::map< SheetIndex, SheetIndex > SheetIndexMap;
-
-ScRangeData* copyRangeNames( SheetIndexMap& rSheetIndexMap, std::vector<ScRangeData*>& rRangeDataVec,
- const sc::UpdatedRangeNames& rReferencingNames, SCTAB nTab,
- const ScRangeData* pOldRangeData, ScDocument& rNewDoc, const ScDocument* pOldDoc,
- const ScAddress& rNewPos, const ScAddress& rOldPos, bool bGlobalNamesToLocal,
- const SCTAB nOldSheet, const SCTAB nNewSheet, bool bSameDoc)
-{
- ScRangeData* pRangeData = nullptr;
- const ScRangeName* pOldRangeName = (nTab < 0 ? pOldDoc->GetRangeName() : pOldDoc->GetRangeName(nTab));
- if (pOldRangeName)
- {
- const ScRangeName* pNewRangeName = (nNewSheet < 0 ? rNewDoc.GetRangeName() : rNewDoc.GetRangeName(nNewSheet));
- sc::UpdatedRangeNames::NameIndicesType aSet( rReferencingNames.getUpdatedNames(nTab));
- for (auto const & rIndex : aSet)
- {
- const ScRangeData* pCopyData = pOldRangeName->findByIndex(rIndex);
- if (pCopyData)
- {
- // Match the original pOldRangeData to adapt the current
- // token's values later. For that no check for an already
- // copied name is needed as we only enter here if there was
- // none.
- if (pCopyData == pOldRangeData)
- {
- pRangeData = copyRangeName( pCopyData, rNewDoc, pOldDoc, rNewPos, rOldPos,
- bGlobalNamesToLocal, nOldSheet, nNewSheet, bSameDoc);
- if (pRangeData)
- {
- rRangeDataVec.push_back(pRangeData);
- rSheetIndexMap.insert( std::make_pair( SheetIndex( nOldSheet, pCopyData->GetIndex()),
- SheetIndex( nNewSheet, pRangeData->GetIndex())));
- }
- }
- else
- {
- // First check if the name is already available as copy.
- const ScRangeData* pFoundData = pNewRangeName->findByUpperName( pCopyData->GetUpperName());
- if (pFoundData)
- {
- // Just add the resulting sheet/index mapping.
- rSheetIndexMap.insert( std::make_pair( SheetIndex( nOldSheet, pCopyData->GetIndex()),
- SheetIndex( nNewSheet, pFoundData->GetIndex())));
- }
- else
- {
- ScRangeData* pTmpData = copyRangeName( pCopyData, rNewDoc, pOldDoc, rNewPos, rOldPos,
- bGlobalNamesToLocal, nOldSheet, nNewSheet, bSameDoc);
- if (pTmpData)
- {
- rRangeDataVec.push_back(pTmpData);
- rSheetIndexMap.insert( std::make_pair( SheetIndex( nOldSheet, pCopyData->GetIndex()),
- SheetIndex( nNewSheet, pTmpData->GetIndex())));
- }
- }
- }
- }
- }
- }
- return pRangeData;
-}
-
-/** Adjust or copy name from sheet-local to sheet-local, or global to
- sheet-local if bGlobalNamesToLocal==true.
-
- @param rSheet
- On entry, the original sheet of the named expression/range, <0 global.
- On return TRUE, the new sheet. Else unchanged.
-
- @param rIndex
- On entry, the original index of the named expression/range.
- On return TRUE, the new index, or 0 if a new copied name couldn't be inserted. Else unchanged.
-
- @param rpRangeData
- On entry, the pointer to the original named expression/range.
- On return TRUE, the pointer to the new copied name, or nullptr if hit shappened.
-
- @return TRUE if copied and caller may need to evaluate rpRangeData and rSheet and rIndex.
- FALSE if nothing to be done.
- */
-bool adjustCopyRangeName( SCTAB& rSheet, sal_uInt16& rIndex, ScRangeData*& rpRangeData,
- ScDocument& rNewDoc, const ScDocument* pOldDoc,
- const ScAddress& rNewPos, const ScAddress& rOldPos, const bool bGlobalNamesToLocal)
-{
- const bool bSameDoc = (rNewDoc.GetPool() == const_cast<ScDocument*>(pOldDoc)->GetPool());
- if (bSameDoc && ((rSheet < 0 && !bGlobalNamesToLocal) || (rSheet >= 0 && rSheet != rOldPos.Tab())))
- // Same doc and global name, if not copied to local name, or
- // sheet-local name on other sheet stays the same.
- return false;
-
- // Ensure we don't fiddle with the references until exit.
- const SCTAB nOldSheet = rSheet;
- const sal_uInt16 nOldIndex = rIndex;
-
- SAL_WARN_IF( !bSameDoc && nOldSheet >= 0 && nOldSheet != rOldPos.Tab(),
- "sc.core", "adjustCopyRangeName - sheet-local name was on other sheet in other document");
- /* TODO: can we do something about that? e.g. loop over sheets? */
-
- OUString aRangeName;
- ScRangeData* pOldRangeData = nullptr;
-
- // XXX bGlobalNamesToLocal is also a synonym for copied sheet.
- bool bInsertingBefore = (bGlobalNamesToLocal && bSameDoc && rNewPos.Tab() <= rOldPos.Tab());
-
- // The Tab where an old local name is to be found or that a global name
- // references. May differ below from nOldSheet if a sheet was inserted
- // before the old position. Global names and local names other than on the
- // old sheet or new sheet are already updated, local names on the old sheet
- // or inserted sheet will be updated later. Confusing stuff. Watch out.
- SCTAB nOldTab = (nOldSheet < 0 ? rOldPos.Tab() : nOldSheet);
- if (bInsertingBefore)
- // Sheet was already inserted before old position.
- ++nOldTab;
-
- // Search the name of the RangeName.
- if (nOldSheet >= 0)
- {
- const ScRangeName* pRangeName = pOldDoc->GetRangeName(nOldTab);
- pOldRangeData = pRangeName ? pRangeName->findByIndex(nOldIndex) : nullptr;
- if (!pOldRangeData)
- return false; // might be an error in the formula array
- aRangeName = pOldRangeData->GetUpperName();
- }
- else
- {
- pOldRangeData = pOldDoc->GetRangeName()->findByIndex(nOldIndex);
- if (!pOldRangeData)
- return false; // might be an error in the formula array
- aRangeName = pOldRangeData->GetUpperName();
- }
-
- // Find corresponding range name in new document.
- // First search for local range name then global range names.
- SCTAB nNewSheet = rNewPos.Tab();
- ScRangeName* pRangeName = rNewDoc.GetRangeName(nNewSheet);
- // Search local range names.
- if (pRangeName)
- {
- rpRangeData = pRangeName->findByUpperName(aRangeName);
- }
- // Search global range names.
- if (!rpRangeData && !bGlobalNamesToLocal)
- {
- nNewSheet = -1;
- pRangeName = rNewDoc.GetRangeName();
- if (pRangeName)
- rpRangeData = pRangeName->findByUpperName(aRangeName);
- }
- // If no range name was found copy it.
- if (!rpRangeData)
- {
- bool bEarlyBailOut = (nOldSheet < 0 && bSameDoc);
- MightReferenceSheet eMightReference = mightRangeNameReferenceSheet( pOldRangeData, nOldTab);
- if (bEarlyBailOut && eMightReference == MightReferenceSheet::NONE)
- return false;
-
- if (eMightReference == MightReferenceSheet::NAME)
- {
- // Name these to clarify what is passed where.
- const SCTAB nGlobalRefTab = nOldTab;
- const SCTAB nLocalRefTab = (bInsertingBefore ? nOldTab-1 : nOldTab);
- const SCTAB nOldTokenTab = (nOldSheet < 0 ? (bInsertingBefore ? nOldTab-1 : nOldTab) : nOldSheet);
- const SCTAB nOldTokenTabReplacement = nOldTab;
- sc::UpdatedRangeNames aReferencingNames;
- pOldDoc->FindRangeNamesReferencingSheet( aReferencingNames, nOldSheet, nOldIndex,
- nGlobalRefTab, nLocalRefTab, nOldTokenTab, nOldTokenTabReplacement, bSameDoc, 0);
- if (bEarlyBailOut && aReferencingNames.isEmpty(-1) && aReferencingNames.isEmpty(nOldTokenTabReplacement))
- return false;
-
- SheetIndexMap aSheetIndexMap;
- std::vector<ScRangeData*> aRangeDataVec;
- if (!aReferencingNames.isEmpty(nOldTokenTabReplacement))
- {
- const SCTAB nTmpOldSheet = (nOldSheet < 0 ? nOldTab : nOldSheet);
- nNewSheet = rNewPos.Tab();
- rpRangeData = copyRangeNames( aSheetIndexMap, aRangeDataVec, aReferencingNames, nOldTab,
- pOldRangeData, rNewDoc, pOldDoc, rNewPos, rOldPos,
- bGlobalNamesToLocal, nTmpOldSheet, nNewSheet, bSameDoc);
- }
- if ((bGlobalNamesToLocal || !bSameDoc) && !aReferencingNames.isEmpty(-1))
- {
- const SCTAB nTmpOldSheet = -1;
- const SCTAB nTmpNewSheet = (bGlobalNamesToLocal ? rNewPos.Tab() : -1);
- ScRangeData* pTmpData = copyRangeNames( aSheetIndexMap, aRangeDataVec, aReferencingNames, -1,
- pOldRangeData, rNewDoc, pOldDoc, rNewPos, rOldPos,
- bGlobalNamesToLocal, nTmpOldSheet, nTmpNewSheet, bSameDoc);
- if (!rpRangeData)
- {
- rpRangeData = pTmpData;
- nNewSheet = nTmpNewSheet;
- }
- }
-
- // Adjust copied nested names to new sheet/index.
- for (auto & iRD : aRangeDataVec)
- {
- ScTokenArray* pCode = iRD->GetCode();
- if (pCode)
- {
- for (FormulaToken* p = pCode->First(); p; p = pCode->Next())
- {
- if (p->GetOpCode() == ocName)
- {
- auto it = aSheetIndexMap.find( SheetIndex( p->GetSheet(), p->GetIndex()));
- if (it != aSheetIndexMap.end())
- {
- p->SetSheet( it->second.mnSheet);
- p->SetIndex( it->second.mnIndex);
- }
- else if (!bSameDoc)
- {
- SAL_WARN("sc.core","adjustCopyRangeName - mapping to new name in other doc missing");
- p->SetIndex(0); // #NAME? error instead of arbitrary name.
- }
- }
- }
- }
- }
- }
- else
- {
- nNewSheet = ((nOldSheet < 0 && !bGlobalNamesToLocal) ? -1 : rNewPos.Tab());
- rpRangeData = copyRangeName( pOldRangeData, rNewDoc, pOldDoc, rNewPos, rOldPos, bGlobalNamesToLocal,
- nOldSheet, nNewSheet, bSameDoc);
- }
- }
- rSheet = nNewSheet;
- rIndex = rpRangeData ? rpRangeData->GetIndex() : 0; // 0 means not inserted
- return true;
-}
-
void adjustRangeName(formula::FormulaToken* pToken, ScDocument& rNewDoc, const ScDocument* pOldDoc,
const ScAddress& rNewPos, const ScAddress& rOldPos, bool bGlobalNamesToLocal)
{
ScRangeData* pRangeData = nullptr;
SCTAB nSheet = pToken->GetSheet();
sal_uInt16 nIndex = pToken->GetIndex();
- if (!adjustCopyRangeName( nSheet, nIndex, pRangeData, rNewDoc, pOldDoc, rNewPos, rOldPos, bGlobalNamesToLocal))
+ if (!pOldDoc->CopyAdjustRangeName( nSheet, nIndex, pRangeData, rNewDoc, rNewPos, rOldPos, bGlobalNamesToLocal))
return; // nothing to do
if (!pRangeData)
commit 75d588556ebe7f542673de67e87a6cb570ef75d1
Author: Eike Rathke <erack at redhat.com>
Date: Thu Apr 28 20:41:25 2016 +0200
move to ScDocument::FindRangeNamesReferencingSheet()
Change-Id: I8ddd83eca3eaf0bd04c8c73a16329517ec3c21b3
diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx
index d04e896..bb46e2d 100644
--- a/sc/inc/document.hxx
+++ b/sc/inc/document.hxx
@@ -80,6 +80,7 @@ struct SortUndoParam;
struct ReorderParam;
class FormulaGroupAreaListener;
class ColumnSet;
+class UpdatedRangeNames;
}
@@ -551,6 +552,54 @@ public:
*/
ScRangeData* FindRangeNameBySheetAndIndex( SCTAB nTab, sal_uInt16 nIndex ) const;
+ /** Recursively find all named expressions that directly or indirectly
+ (nested) reference a given sheet, starting from a given named
+ expression nTokenTab/nTokenIndex.
+
+ Used to collect all named expressions/ranges that will need to be
+ copied along when copying sheets.
+
+ The different tab/sheets passed cater for the situation that a sheet is
+ copied and was already inserted and global names are already adjusted
+ but the sheet-local names of the shifted original sheet are not yet. If
+ no sheet was inserted and global and local names' references not
+ updated yet, then all 4 tab arguments would be identical.
+
+ @param nTokenTab
+ Tab/sheet on which to find the name, -1 if global scope.
+ For example obtained from ocName token.
+
+ @param nTokenIndex
+ Index of named expression. For example obtained from ocName token.
+
+ @param nGlobalRefTab
+ Tab to check if used in global names.
+
+ @param nLocalRefTab
+ Tab to check if used in sheet-local names.
+
+ @param nOldTokenTab
+ The original tab of the copied sheet, used as sheet-local
+ base position for relative references.
+
+ @param nOldTokenTabReplacement
+ The replacement to use for relative references if the name
+ encountered uses nOldTokenTab as base position.
+
+ @param bSameDoc
+ FALSE if collecting names for a sheet to be copied to another
+ document. Then all names encountered are considered to be
+ referencing the sheet. Else TRUE if collecting names to be
+ copied into the same document.
+
+ @param nRecursion
+ Recursion guard, initialize with 0.
+ */
+ bool FindRangeNamesReferencingSheet( sc::UpdatedRangeNames& rIndexes,
+ SCTAB nTokenTab, const sal_uInt16 nTokenIndex,
+ SCTAB nGlobalRefTab, SCTAB nLocalRefTab, SCTAB nOldTokenTab, SCTAB nOldTokenTabReplacement,
+ bool bSameDoc, int nRecursion ) const;
+
/**
* Call this immediately before updating all named ranges.
*/
diff --git a/sc/source/core/data/document10.cxx b/sc/source/core/data/document10.cxx
index 5e8678d..80375b8 100644
--- a/sc/source/core/data/document10.cxx
+++ b/sc/source/core/data/document10.cxx
@@ -23,6 +23,7 @@
#include "dociter.hxx"
#include "patattr.hxx"
+#include "refupdatecontext.hxx"
#include <svl/whiter.hxx>
#include <editeng/colritem.hxx>
#include "scitems.hxx"
@@ -449,4 +450,67 @@ void ScDocument::finalizeOutlineImport()
}
}
+bool ScDocument::FindRangeNamesReferencingSheet( sc::UpdatedRangeNames& rIndexes,
+ SCTAB nTokenTab, const sal_uInt16 nTokenIndex,
+ SCTAB nGlobalRefTab, SCTAB nLocalRefTab, SCTAB nOldTokenTab, SCTAB nOldTokenTabReplacement,
+ bool bSameDoc, int nRecursion) const
+{
+ if (nTokenTab < -1)
+ {
+ SAL_WARN("sc.core", "ScDocument::FindRangeNamesReferencingSheet - nTokenTab < -1 : " <<
+ nTokenTab << ", nTokenIndex " << nTokenIndex << " Fix the creator!");
+#if OSL_DEBUG_LEVEL > 0
+ const ScRangeData* pData = FindRangeNameBySheetAndIndex( nTokenTab, nTokenIndex);
+ SAL_WARN_IF( pData, "sc.core", "ScDocument::FindRangeNamesReferencingSheet - named expression is: " << pData->GetName());
+#endif
+ nTokenTab = -1;
+ }
+ SCTAB nRefTab = nGlobalRefTab;
+ if (nTokenTab == nOldTokenTab)
+ {
+ nTokenTab = nOldTokenTabReplacement;
+ nRefTab = nLocalRefTab;
+ }
+ else if (nTokenTab == nOldTokenTabReplacement)
+ {
+ nRefTab = nLocalRefTab;
+ }
+
+ if (rIndexes.isNameUpdated( nTokenTab, nTokenIndex))
+ return true;
+
+ ScRangeData* pData = FindRangeNameBySheetAndIndex( nTokenTab, nTokenIndex);
+ if (!pData)
+ return false;
+
+ ScTokenArray* pCode = pData->GetCode();
+ if (!pCode)
+ return false;
+
+ bool bRef = !bSameDoc; // include every name used when copying to other doc
+ if (nRecursion < 126) // whatever.. 42*3
+ {
+ for (const formula::FormulaToken* p = pCode->First(); p; p = pCode->Next())
+ {
+ if (p->GetOpCode() == ocName)
+ {
+ bRef |= FindRangeNamesReferencingSheet( rIndexes, p->GetSheet(), p->GetIndex(),
+ nGlobalRefTab, nLocalRefTab, nOldTokenTab, nOldTokenTabReplacement, bSameDoc, nRecursion+1);
+ }
+ }
+ }
+
+ if (!bRef)
+ {
+ SCTAB nPosTab = pData->GetPos().Tab();
+ if (nPosTab == nOldTokenTab)
+ nPosTab = nOldTokenTabReplacement;
+ bRef = pCode->ReferencesSheet( nRefTab, nPosTab);
+ }
+ if (bRef)
+ rIndexes.setUpdatedName( nTokenTab, nTokenIndex);
+
+ return bRef;
+}
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/source/core/data/formulacell.cxx b/sc/source/core/data/formulacell.cxx
index ec7b454..f2a56dd 100644
--- a/sc/source/core/data/formulacell.cxx
+++ b/sc/source/core/data/formulacell.cxx
@@ -448,80 +448,6 @@ MightReferenceSheet mightRangeNameReferenceSheet( ScRangeData* pData, SCTAB nRef
MightReferenceSheet::CODE : MightReferenceSheet::NONE;
}
-// See also lcl_FindRangeNamesInUse() below.
-/** Recursively find all named expressions that directly or indirectly (nested)
- reference a given sheet, starting from a given named expression
- nTokenTab/nTokenIndex.
-
- @param nTokenTab
- Tab/sheet on which to find the name, -1 if global scope. Obtained
- from ocName token.
-
- @param nTokenIndex
- Index of named expression. Obtained from ocName token.
- */
-bool findRangeNamesReferencingSheet( sc::UpdatedRangeNames& rIndexes, SCTAB nTokenTab, const sal_uInt16 nTokenIndex,
- const ScDocument* pDoc, SCTAB nGlobalRefTab, SCTAB nLocalRefTab,
- SCTAB nOldTokenTab, SCTAB nOldTokenTabReplacement, bool bSameDoc, int nRecursion)
-{
- if (nTokenTab < -1)
- {
- SAL_WARN("sc.core", "findRangeNamesReferencingSheet - nTokenTab < -1 : " <<
- nTokenTab << ", nTokenIndex " << nTokenIndex << " Fix the creator!");
-#if OSL_DEBUG_LEVEL > 0
- const ScRangeData* pData = pDoc->FindRangeNameBySheetAndIndex( nTokenTab, nTokenIndex);
- SAL_WARN_IF( pData, "sc.core", "findRangeNamesReferencingSheet - named expression is: " << pData->GetName());
-#endif
- nTokenTab = -1;
- }
- SCTAB nRefTab = nGlobalRefTab;
- if (nTokenTab == nOldTokenTab)
- {
- nTokenTab = nOldTokenTabReplacement;
- nRefTab = nLocalRefTab;
- }
- else if (nTokenTab == nOldTokenTabReplacement)
- {
- nRefTab = nLocalRefTab;
- }
-
- if (rIndexes.isNameUpdated( nTokenTab, nTokenIndex))
- return true;
-
- ScRangeData* pData = pDoc->FindRangeNameBySheetAndIndex( nTokenTab, nTokenIndex);
- if (!pData)
- return false;
-
- ScTokenArray* pCode = pData->GetCode();
- if (!pCode)
- return false;
-
- bool bRef = !bSameDoc; // include every name used when copying to other doc
- if (nRecursion < 126) // whatever.. 42*3
- {
- for (const FormulaToken* p = pCode->First(); p; p = pCode->Next())
- {
- if (p->GetOpCode() == ocName)
- {
- bRef |= findRangeNamesReferencingSheet( rIndexes, p->GetSheet(), p->GetIndex(), pDoc,
- nGlobalRefTab, nLocalRefTab, nOldTokenTab, nOldTokenTabReplacement, bSameDoc, nRecursion+1);
- }
- }
- }
-
- if (!bRef)
- {
- SCTAB nPosTab = pData->GetPos().Tab();
- if (nPosTab == nOldTokenTab)
- nPosTab = nOldTokenTabReplacement;
- bRef = pCode->ReferencesSheet( nRefTab, nPosTab);
- }
- if (bRef)
- rIndexes.setUpdatedName( nTokenTab, nTokenIndex);
-
- return bRef;
-}
-
ScRangeData* copyRangeName( const ScRangeData* pOldRangeData, ScDocument& rNewDoc, const ScDocument* pOldDoc,
const ScAddress& rNewPos, const ScAddress& rOldPos, bool bGlobalNamesToLocal,
SCTAB nOldSheet, const SCTAB nNewSheet, bool bSameDoc)
@@ -738,7 +664,7 @@ bool adjustCopyRangeName( SCTAB& rSheet, sal_uInt16& rIndex, ScRangeData*& rpRan
const SCTAB nOldTokenTab = (nOldSheet < 0 ? (bInsertingBefore ? nOldTab-1 : nOldTab) : nOldSheet);
const SCTAB nOldTokenTabReplacement = nOldTab;
sc::UpdatedRangeNames aReferencingNames;
- findRangeNamesReferencingSheet( aReferencingNames, nOldSheet, nOldIndex, pOldDoc,
+ pOldDoc->FindRangeNamesReferencingSheet( aReferencingNames, nOldSheet, nOldIndex,
nGlobalRefTab, nLocalRefTab, nOldTokenTab, nOldTokenTabReplacement, bSameDoc, 0);
if (bEarlyBailOut && aReferencingNames.isEmpty(-1) && aReferencingNames.isEmpty(nOldTokenTabReplacement))
return false;
@@ -4020,7 +3946,7 @@ void ScFormulaCell::UpdateGrow( const ScRange& rArea, SCCOL nGrowX, SCROW nGrowY
StartListeningTo( pDocument ); // Listener as previous
}
-// See also findRangeNamesReferencingSheet() above.
+// See also ScDocument::FindRangeNamesReferencingSheet()
static void lcl_FindRangeNamesInUse(sc::UpdatedRangeNames& rIndexes, ScTokenArray* pCode, const ScDocument* pDoc,
int nRecursion)
{
commit c692b9cda192c8e31ddd59a9a9598c7e798e80d9
Author: Eike Rathke <erack at redhat.com>
Date: Thu Apr 28 19:07:56 2016 +0200
adjustCopyRangeName: pass rSheet, rIndex; encapsulate nNewSheet
Change-Id: I3de5982b8b8ad179010787ed7be721be54f761af
diff --git a/sc/source/core/data/formulacell.cxx b/sc/source/core/data/formulacell.cxx
index 280c1eb..ec7b454 100644
--- a/sc/source/core/data/formulacell.cxx
+++ b/sc/source/core/data/formulacell.cxx
@@ -636,20 +636,38 @@ ScRangeData* copyRangeNames( SheetIndexMap& rSheetIndexMap, std::vector<ScRangeD
return pRangeData;
}
-/** Adjust or copy name.
- @return TRUE if copied and caller may need to evaluate rpRangeData and rNewSheet.
+/** Adjust or copy name from sheet-local to sheet-local, or global to
+ sheet-local if bGlobalNamesToLocal==true.
+
+ @param rSheet
+ On entry, the original sheet of the named expression/range, <0 global.
+ On return TRUE, the new sheet. Else unchanged.
+
+ @param rIndex
+ On entry, the original index of the named expression/range.
+ On return TRUE, the new index, or 0 if a new copied name couldn't be inserted. Else unchanged.
+
+ @param rpRangeData
+ On entry, the pointer to the original named expression/range.
+ On return TRUE, the pointer to the new copied name, or nullptr if hit shappened.
+
+ @return TRUE if copied and caller may need to evaluate rpRangeData and rSheet and rIndex.
FALSE if nothing to be done.
*/
-bool adjustCopyRangeName( const SCTAB nOldSheet, const sal_uInt16 nOldIndex,
- ScRangeData*& rpRangeData, SCTAB& rNewSheet, ScDocument& rNewDoc, const ScDocument* pOldDoc,
+bool adjustCopyRangeName( SCTAB& rSheet, sal_uInt16& rIndex, ScRangeData*& rpRangeData,
+ ScDocument& rNewDoc, const ScDocument* pOldDoc,
const ScAddress& rNewPos, const ScAddress& rOldPos, const bool bGlobalNamesToLocal)
{
const bool bSameDoc = (rNewDoc.GetPool() == const_cast<ScDocument*>(pOldDoc)->GetPool());
- if (bSameDoc && ((nOldSheet < 0 && !bGlobalNamesToLocal) || (nOldSheet >= 0 && nOldSheet != rOldPos.Tab())))
+ if (bSameDoc && ((rSheet < 0 && !bGlobalNamesToLocal) || (rSheet >= 0 && rSheet != rOldPos.Tab())))
// Same doc and global name, if not copied to local name, or
// sheet-local name on other sheet stays the same.
return false;
+ // Ensure we don't fiddle with the references until exit.
+ const SCTAB nOldSheet = rSheet;
+ const sal_uInt16 nOldIndex = rIndex;
+
SAL_WARN_IF( !bSameDoc && nOldSheet >= 0 && nOldSheet != rOldPos.Tab(),
"sc.core", "adjustCopyRangeName - sheet-local name was on other sheet in other document");
/* TODO: can we do something about that? e.g. loop over sheets? */
@@ -689,8 +707,8 @@ bool adjustCopyRangeName( const SCTAB nOldSheet, const sal_uInt16 nOldIndex,
// Find corresponding range name in new document.
// First search for local range name then global range names.
- rNewSheet = rNewPos.Tab();
- ScRangeName* pRangeName = rNewDoc.GetRangeName(rNewSheet);
+ SCTAB nNewSheet = rNewPos.Tab();
+ ScRangeName* pRangeName = rNewDoc.GetRangeName(nNewSheet);
// Search local range names.
if (pRangeName)
{
@@ -699,7 +717,7 @@ bool adjustCopyRangeName( const SCTAB nOldSheet, const sal_uInt16 nOldIndex,
// Search global range names.
if (!rpRangeData && !bGlobalNamesToLocal)
{
- rNewSheet = -1;
+ nNewSheet = -1;
pRangeName = rNewDoc.GetRangeName();
if (pRangeName)
rpRangeData = pRangeName->findByUpperName(aRangeName);
@@ -730,10 +748,10 @@ bool adjustCopyRangeName( const SCTAB nOldSheet, const sal_uInt16 nOldIndex,
if (!aReferencingNames.isEmpty(nOldTokenTabReplacement))
{
const SCTAB nTmpOldSheet = (nOldSheet < 0 ? nOldTab : nOldSheet);
- rNewSheet = rNewPos.Tab();
+ nNewSheet = rNewPos.Tab();
rpRangeData = copyRangeNames( aSheetIndexMap, aRangeDataVec, aReferencingNames, nOldTab,
pOldRangeData, rNewDoc, pOldDoc, rNewPos, rOldPos,
- bGlobalNamesToLocal, nTmpOldSheet, rNewSheet, bSameDoc);
+ bGlobalNamesToLocal, nTmpOldSheet, nNewSheet, bSameDoc);
}
if ((bGlobalNamesToLocal || !bSameDoc) && !aReferencingNames.isEmpty(-1))
{
@@ -745,7 +763,7 @@ bool adjustCopyRangeName( const SCTAB nOldSheet, const sal_uInt16 nOldIndex,
if (!rpRangeData)
{
rpRangeData = pTmpData;
- rNewSheet = nTmpNewSheet;
+ nNewSheet = nTmpNewSheet;
}
}
@@ -777,11 +795,13 @@ bool adjustCopyRangeName( const SCTAB nOldSheet, const sal_uInt16 nOldIndex,
}
else
{
- rNewSheet = ((nOldSheet < 0 && !bGlobalNamesToLocal) ? -1 : rNewPos.Tab());
+ nNewSheet = ((nOldSheet < 0 && !bGlobalNamesToLocal) ? -1 : rNewPos.Tab());
rpRangeData = copyRangeName( pOldRangeData, rNewDoc, pOldDoc, rNewPos, rOldPos, bGlobalNamesToLocal,
- nOldSheet, rNewSheet, bSameDoc);
+ nOldSheet, nNewSheet, bSameDoc);
}
}
+ rSheet = nNewSheet;
+ rIndex = rpRangeData ? rpRangeData->GetIndex() : 0; // 0 means not inserted
return true;
}
@@ -789,9 +809,9 @@ void adjustRangeName(formula::FormulaToken* pToken, ScDocument& rNewDoc, const S
const ScAddress& rNewPos, const ScAddress& rOldPos, bool bGlobalNamesToLocal)
{
ScRangeData* pRangeData = nullptr;
- SCTAB nNewSheet = rNewPos.Tab();
- if (!adjustCopyRangeName( pToken->GetSheet(), pToken->GetIndex(), pRangeData, nNewSheet, rNewDoc, pOldDoc,
- rNewPos, rOldPos, bGlobalNamesToLocal))
+ SCTAB nSheet = pToken->GetSheet();
+ sal_uInt16 nIndex = pToken->GetIndex();
+ if (!adjustCopyRangeName( nSheet, nIndex, pRangeData, rNewDoc, pOldDoc, rNewPos, rOldPos, bGlobalNamesToLocal))
return; // nothing to do
if (!pRangeData)
@@ -802,9 +822,8 @@ void adjustRangeName(formula::FormulaToken* pToken, ScDocument& rNewDoc, const S
return;
}
- sal_Int32 nIndex = pRangeData->GetIndex();
pToken->SetIndex(nIndex);
- pToken->SetSheet(nNewSheet);
+ pToken->SetSheet(nSheet);
}
void adjustDBRange(formula::FormulaToken* pToken, ScDocument& rNewDoc, const ScDocument* pOldDoc)
More information about the Libreoffice-commits
mailing list