Kaydet (Commit) 74070a02 authored tarafından Markus Mohrhard's avatar Markus Mohrhard

rework 04d2e646

only update range names in formulas if the documents are different or
the sheets are different
üst d7791df3
...@@ -131,7 +131,7 @@ ScBaseCell* lclCloneCell( const ScBaseCell& rSrcCell, ScDocument& rDestDoc, cons ...@@ -131,7 +131,7 @@ ScBaseCell* lclCloneCell( const ScBaseCell& rSrcCell, ScDocument& rDestDoc, cons
return 0; return 0;
} }
void adjustRangeName(ScToken* pToken, ScDocument& aNewDoc, ScDocument* pOldDoc, ScAddress aNewPos, ScAddress aOldPos) void adjustRangeName(ScToken* pToken, ScDocument& rNewDoc, const ScDocument* pOldDoc, const ScAddress& aNewPos, const ScAddress& aOldPos)
{ {
bool bOldGlobal = static_cast<bool>(pToken->GetByte()); bool bOldGlobal = static_cast<bool>(pToken->GetByte());
SCTAB aOldTab = aOldPos.Tab(); SCTAB aOldTab = aOldPos.Tab();
...@@ -158,35 +158,35 @@ void adjustRangeName(ScToken* pToken, ScDocument& aNewDoc, ScDocument* pOldDoc, ...@@ -158,35 +158,35 @@ void adjustRangeName(ScToken* pToken, ScDocument& aNewDoc, ScDocument* pOldDoc,
//find corresponding range name in new document //find corresponding range name in new document
//first search for local range name then global range names //first search for local range name then global range names
SCTAB aNewTab = aNewPos.Tab(); SCTAB aNewTab = aNewPos.Tab();
ScRangeName* pRangeName = aNewDoc.GetRangeName(aNewTab); ScRangeName* pRangeName = rNewDoc.GetRangeName(aNewTab);
ScRangeData* pRangeData = NULL; ScRangeData* pRangeData = NULL;
bool bNewGlobal = false; bool bNewGlobal = false;
//search local range names //search local range names
if (pRangeName) if (pRangeName)
{ {
pRangeData = pRangeName->findByUpperName(aRangeName.toAsciiUpperCase()); pRangeData = pRangeName->findByUpperName(ScGlobal::pCharClass->upper(aRangeName));
} }
//search global range names //search global range names
if (!pRangeData) if (!pRangeData)
{ {
//even if it is not in the global scope we'll have a global range name //even if it is not in the global scope we'll have a global range name
bNewGlobal = true; bNewGlobal = true;
pRangeName = aNewDoc.GetRangeName(); pRangeName = rNewDoc.GetRangeName();
if (pRangeName) if (pRangeName)
pRangeData = pRangeName->findByUpperName(aRangeName.toAsciiUpperCase()); pRangeData = pRangeName->findByUpperName(ScGlobal::pCharClass->upper(aRangeName));
} }
//if no range name was found copy it //if no range name was found copy it
if (!pRangeData) if (!pRangeData)
{ {
pRangeData = new ScRangeData(*pOldRangeData, &aNewDoc); pRangeData = new ScRangeData(*pOldRangeData, &rNewDoc);
aNewDoc.GetRangeName()->insert(pRangeData); rNewDoc.GetRangeName()->insert(pRangeData);
} }
sal_Int32 nIndex = pRangeData->GetIndex(); sal_Int32 nIndex = pRangeData->GetIndex();
pToken->SetIndex(nIndex); pToken->SetIndex(nIndex);
pToken->SetByte(bNewGlobal); pToken->SetByte(bNewGlobal);
} }
void adjustDBRange(ScToken* pToken, ScDocument& aNewDoc, ScDocument* pOldDoc) void adjustDBRange(ScToken* pToken, ScDocument& rNewDoc, const ScDocument* pOldDoc)
{ {
ScDBCollection* pOldDBCollection = pOldDoc->GetDBCollection(); ScDBCollection* pOldDBCollection = pOldDoc->GetDBCollection();
if (!pOldDBCollection) if (!pOldDBCollection)
...@@ -198,10 +198,10 @@ void adjustDBRange(ScToken* pToken, ScDocument& aNewDoc, ScDocument* pOldDoc) ...@@ -198,10 +198,10 @@ void adjustDBRange(ScToken* pToken, ScDocument& aNewDoc, ScDocument* pOldDoc)
rtl::OUString aDBName = pDBData->GetName(); rtl::OUString aDBName = pDBData->GetName();
//search in new document //search in new document
ScDBCollection* pNewDBCollection = aNewDoc.GetDBCollection(); ScDBCollection* pNewDBCollection = rNewDoc.GetDBCollection();
if (!pNewDBCollection) if (!pNewDBCollection)
{ {
pNewDBCollection = new ScDBCollection(&aNewDoc); pNewDBCollection = new ScDBCollection(&rNewDoc);
} }
ScDBCollection::NamedDBs& aNewNamedDBs = pNewDBCollection->getNamedDBs(); ScDBCollection::NamedDBs& aNewNamedDBs = pNewDBCollection->getNamedDBs();
ScDBData* pNewDBData = aNewNamedDBs.findByName(aDBName); ScDBData* pNewDBData = aNewNamedDBs.findByName(aDBName);
...@@ -855,16 +855,19 @@ ScFormulaCell::ScFormulaCell( const ScFormulaCell& rCell, ScDocument& rDoc, cons ...@@ -855,16 +855,19 @@ ScFormulaCell::ScFormulaCell( const ScFormulaCell& rCell, ScDocument& rDoc, cons
sal_Bool bClipMode = rCell.pDocument->IsClipboard(); sal_Bool bClipMode = rCell.pDocument->IsClipboard();
//update ScNameTokens //update ScNameTokens
if (!pDocument->IsClipboard()) if (!pDocument->IsClipOrUndo() || rDoc.IsUndo())
{ {
ScToken* pToken = NULL; if (!pDocument->IsClipboardSource() || aPos.Tab() != rCell.aPos.Tab())
while((pToken = static_cast<ScToken*>(pCode->GetNextName()))!= NULL)
{ {
OpCode eOpCode = pToken->GetOpCode(); ScToken* pToken = NULL;
if (eOpCode == ocName) while((pToken = static_cast<ScToken*>(pCode->GetNextName()))!= NULL)
adjustRangeName(pToken, rDoc, rCell.pDocument, aPos, rCell.aPos); {
else if (eOpCode == ocDBArea) OpCode eOpCode = pToken->GetOpCode();
adjustDBRange(pToken, rDoc, rCell.pDocument); if (eOpCode == ocName)
adjustRangeName(pToken, rDoc, rCell.pDocument, aPos, rCell.aPos);
else if (eOpCode == ocDBArea)
adjustDBRange(pToken, rDoc, rCell.pDocument);
}
} }
} }
......
...@@ -465,7 +465,7 @@ void ScTable::CopyToClip(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2, ...@@ -465,7 +465,7 @@ void ScTable::CopyToClip(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2,
{ {
// copy content // copy content
//local range names need to be copied first for formula cells //local range names need to be copied first for formula cells
if (!pTable->mpRangeName) if (!pTable->mpRangeName && mpRangeName)
pTable->mpRangeName = new ScRangeName(*mpRangeName); pTable->mpRangeName = new ScRangeName(*mpRangeName);
SCCOL i; SCCOL i;
......
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