24 #include <com/sun/star/sheet/NamedRangeFlag.hpp>
25 #include <osl/diagnose.h>
28 #include <tokenarray.hxx>
31 #include <compiler.hxx>
33 #include <document.hxx>
45 const OUString& rName,
46 const OUString& rSymbol,
51 aUpperName (
ScGlobal::getCharClassPtr()->uppercase( rName ) ),
55 eTempGrammar( eGrammar ),
59 if (!rSymbol.isEmpty())
75 pCode->SetFromRangeName(
true);
80 const OUString& rName,
85 aUpperName (
ScGlobal::getCharClassPtr()->uppercase( rName ) ),
94 pCode->SetFromRangeName(
true);
99 const OUString& rName,
102 aUpperName (
ScGlobal::getCharClassPtr()->uppercase( rName ) ),
114 pCode->AddSingleReference( aRefData );
115 pCode->SetFromRangeName(
true);
118 if (
pCode->GetCodeError() == FormulaError::NONE )
124 aUpperName (rScRangeData.aUpperName),
125 pCode (rScRangeData.pCode ? rScRangeData.pCode->
Clone().release() : new
ScTokenArray(*pDocument)),
126 aPos (pPos ? *pPos : rScRangeData.aPos),
128 rDoc (pDocument ? *pDocument : rScRangeData.rDoc),
129 eTempGrammar(rScRangeData.eTempGrammar),
131 bModified (rScRangeData.bModified)
133 pCode->SetFromRangeName(
true);
144 OSL_FAIL(
"ScRangeData::CompileRangeData: unspecified grammar");
154 pCode->SetFromRangeName(
true);
155 if(
pCode->GetCodeError() != FormulaError::NONE )
179 if (
pCode->GetCodeError() == FormulaError::NoName)
193 #if DEBUG_FORMULA_COMPILER
194 void ScRangeData::Dump()
const
196 cout <<
"-- ScRangeData" <<
endl;
197 cout <<
" name: " <<
aName << endl;
198 cout <<
" ref position: (col=" <<
aPos.
Col() <<
", row=" <<
aPos.
Row() <<
", sheet=" <<
aPos.
Tab() <<
")" << endl;
210 OSL_ENSURE(
aPos ==
ScAddress(),
"position will go lost now");
222 nMinCol = rRef1.
Col();
224 nMinRow = rRef1.
Row();
226 nMinTab = rRef1.
Tab();
232 nMinCol = rRef2.
Col();
234 nMinRow = rRef2.
Row();
236 nMinTab = rRef2.
Tab();
240 aPos =
ScAddress( static_cast<SCCOL>(-nMinCol), static_cast<SCROW>(-nMinRow), static_cast<SCTAB>(-nMinTab) );
259 std::unique_ptr<ScTokenArray> pTemp(
pCode->Clone() );
262 aComp.CreateStringFromTokenArray( rBuffer );
275 bool bChanged =
false;
307 bool bChanged =
false;
341 aPos !=
rData.aPos ||
344 sal_uInt16 nLen = pCode->GetLen();
345 if ( nLen !=
rData.pCode->GetLen() )
return false;
350 for ( sal_uInt16
i=0;
i<nLen;
i++ )
351 if ( ppThis[
i] != ppOther[
i] && !(*ppThis[
i] == *ppOther[
i]) )
362 bRet = ( rBlock == aRange );
377 return pCode->IsReference(rRange, rPos);
385 return pCode->IsValidReference(rRange,
aPos);
424 sal_Int32 nLen = rName.getLength();
428 rName = rName.copy(nPos);
435 nLen = rName.getLength();
436 for (nPos=0; nPos<nLen; nPos++)
439 rName = rName.replaceAt( nPos, 1,
"_" );
446 for (
int nConv = FormulaGrammar::CONV_UNSPECIFIED; ++nConv < FormulaGrammar::CONV_LAST; )
448 ScAddress::Details details( static_cast<FormulaGrammar::AddressConvention>( nConv ) );
456 if ( rName.indexOf(
'.' ) != -1 )
457 rName = rName.replaceFirst(
".",
"_" );
469 if (rName.indexOf(a) != -1)
472 sal_Int32 nLen = rName.getLength();
475 while ( nPos < nLen )
482 for (
int nConv = FormulaGrammar::CONV_UNSPECIFIED; ++nConv < FormulaGrammar::CONV_LAST; )
484 ScAddress::Details details( static_cast<FormulaGrammar::AddressConvention>( nConv ) );
498 return pCode ?
pCode->GetCodeError() : FormulaError::NONE;
503 return pCode->HasReferences();
508 sal_uInt32 nUnoType = 0;
527 SCTAB nMaxTab = nMinTab;
536 if (aAbs.
Tab() < nMinTab)
537 nMinTab = aAbs.
Tab();
538 if (aAbs.
Tab() > nMaxTab)
539 nMaxTab = aAbs.
Tab();
547 if (aAbs.
Tab() < nMinTab)
548 nMinTab = aAbs.
Tab();
549 if (aAbs.
Tab() > nMaxTab)
550 nMaxTab = aAbs.
Tab();
556 if ( nMaxTab < nTabCount || nMinTab <= 0 )
562 SCTAB nMove = nMinTab;
605 pCode->SetFromRangeName(
true);
611 if(
pCode->GetCodeError() == FormulaError::NONE )
628 (*static_cast<const ScRangeData* const *>(p1))->GetName(),
629 (*static_cast<const ScRangeData* const *>(p2))->GetName() ));
641 explicit MatchByRange(
const ScRange& rRange) : mrRange(rRange) {}
642 bool operator() (std::pair<OUString
const, std::unique_ptr<ScRangeData>>
const& r)
const
644 return r.second->IsRangeAtBlock(mrRange);
654 for (
auto const& it : r.
m_Data)
656 m_Data.insert(std::make_pair(it.first, std::make_unique<ScRangeData>(*it.second)));
660 for (
auto const& itr :
m_Data)
662 size_t nPos = itr.second->GetIndex() - 1;
665 OSL_FAIL(
"ScRangeName copy-ctor: maIndexToData size doesn't fit");
674 DataType::const_iterator itr = std::find_if(
676 return itr ==
m_Data.end() ?
nullptr : itr->second.get();
681 DataType::iterator itr =
m_Data.find(rName);
682 return itr ==
m_Data.end() ?
nullptr : itr->second.get();
687 DataType::const_iterator itr =
m_Data.find(rName);
688 return itr ==
m_Data.end() ?
nullptr : itr->second.get();
707 for (
auto const& itr :
m_Data)
709 itr.second->UpdateReference(rCxt, nLocalTab);
715 for (
auto const& itr :
m_Data)
717 itr.second->UpdateInsertTab(rCxt, nLocalTab);
723 for (
auto const& itr :
m_Data)
725 itr.second->UpdateDeleteTab(rCxt, nLocalTab);
731 for (
auto const& itr :
m_Data)
733 itr.second->UpdateMoveTab(rCxt, nLocalTab);
739 for (
auto const& itr :
m_Data)
741 itr.second->UpdateTranspose(rSource, rDest);
747 for (
auto const& itr :
m_Data)
749 itr.second->UpdateGrow(rArea, nGrowX, nGrowY);
755 for (
auto const& itr :
m_Data)
757 itr.second->CompileUnresolvedXML(rCxt);
764 for (
auto const& itr :
m_Data)
766 SCTAB nSheet = (nLocalTab < 0) ? nLocalTab : nOldTab;
767 sal_uInt16
nIndex = itr.second->GetIndex();
768 ScAddress aOldPos( itr.second->GetPos());
773 rOldDoc.
CopyAdjustRangeName( nSheet, nIndex, pRangeData, rNewDoc, aNewPos, aOldPos, bGlobalNamesToLocal,
false);
817 IndexDataType::iterator itr = std::find(
837 pair<DataType::iterator, bool> r =
838 m_Data.insert(std::make_pair(
aName, std::unique_ptr<ScRangeData>(p)));
857 DataType::iterator itr =
m_Data.find(rName);
864 sal_uInt16
nIndex = itr->second->GetIndex();
866 OSL_ENSURE( 0 < nIndex && nIndex <=
maIndexToData.size(),
"ScRangeName::erase: bad index");
880 [](
const DataType::value_type& lhs,
const DataType::value_type& rhs) {
881 return (lhs.first == rhs.first) && (*lhs.second == *rhs.second);
UpdatedRangeNames maUpdatedNames
sal_uInt32 GetUnoType() const
void UpdateDeleteTab(sc::RefUpdateDeleteTabContext &rCxt, SCTAB nLocalTab=-1)
bool IsTabDeleted() const
void CompileUnresolvedXML(sc::CompileFormulaContext &rCxt)
Compile those names that couldn't be resolved during loading and inserting because they may have refe...
sal_Int32 compareString(const OUString &s1, const OUString &s2) const
void IncTab(SCTAB nDelta=1)
SC_DLLPUBLIC ScRange toAbs(const ScSheetLimits &rLimits, const ScAddress &rPos) const
SC_DLLPUBLIC void SetCode(const ScTokenArray &)
Single reference (one address) into the sheet.
const OUString & GetUpperName() const
ScAddress toAbs(const ScSheetLimits &rLimits, const ScAddress &rPos) const
sal_uInt16 GetIndex() const
Context for reference update during shifting, moving or copying of cell ranges.
static ScRefUpdateRes UpdateGrow(const ScRange &rArea, SCCOL nGrowX, SCROW nGrowY, ScRange &rRef)
void UpdateTranspose(const ScRange &rSource, const ScAddress &rDest)
std::unique_ptr< ScTokenArray > CompileString(const OUString &rFormula)
Tokenize formula expression string into an array of tokens.
static SC_DLLPUBLIC CollatorWrapper * GetCollator()
SCTAB getNewTab(SCTAB nOldTab) const
const ContentProperties & rData
bool operator==(const ScRangeName &r) const
static void MakeValidName(const ScDocument &rDoc, OUString &rName)
UpdatedRangeNames maUpdatedNames
DataType::iterator iterator
void CompileUnresolvedXML(sc::CompileFormulaContext &rCxt)
SC_DLLPUBLIC formula::FormulaGrammar::Grammar GetGrammar() const
IndexDataType maIndexToData
void setUpdatedName(SCTAB nTab, sal_uInt16 nIndex)
SC_DLLPUBLIC void CheckLinkFormulaNeedingCheck(const ScTokenArray &rCode)
Check token array and set link check if ocDde/ocWebservice is contained.
DataType::const_iterator const_iterator
formula::FormulaGrammar::Grammar eTempGrammar
SC_DLLPUBLIC SCTAB GetTableCount() const
void UpdateGrow(const ScRange &rArea, SCCOL nGrowX, SCROW nGrowY)
void CopyUsedNames(const SCTAB nLocalTab, const SCTAB nOldTab, const SCTAB nNewTab, const ScDocument &rOldDoc, ScDocument &rNewDoc, const bool bGlobalNamesToLocal) const
Copy names while copying a sheet if they reference the sheet to be copied.
void UpdateGrow(const ScRange &rArea, SCCOL nGrowX, SCROW nGrowY)
SC_DLLPUBLIC void GuessPosition()
SC_DLLPUBLIC const_iterator begin() const
void UpdateInsertTab(sc::RefUpdateInsertTabContext &rCxt, SCTAB nLocalTab)
void UpdateReference(sc::RefUpdateContext &rCxt, SCTAB nLocalTab=-1)
bool HasReferences() const
std::unique_ptr< ScTokenArray > pCode
void UpdateInsertTab(sc::RefUpdateInsertTabContext &rCxt, SCTAB nLocalTab=-1)
bool IsRangeAtBlock(const ScRange &) const
UpdatedRangeNames maUpdatedNames
SC_DLLPUBLIC ScRangeData * findByUpperName(const OUString &rName)
SC_DLLPUBLIC const ScRangeData * findByRange(const ScRange &rRange) const
SC_DLLPUBLIC const_iterator end() const
bool IsImportingXML() const
SC_DLLPUBLIC void GetSymbol(OUString &rSymbol, const formula::FormulaGrammar::Grammar eGrammar=formula::FormulaGrammar::GRAM_DEFAULT) const
Reference< XAnimationNode > Clone(const Reference< XAnimationNode > &xSourceNode, const SdPage *pSource, const SdPage *pTarget)
UpdateRefMode meMode
update mode - insert/delete, copy, or move.
void UpdateTranspose(const ScRange &rSource, const ScAddress &rDest)
void SetFlag3D(bool bVal)
int ScRangeData_QsortNameCompare(const void *p1, const void *p2)
void InitAddress(const ScAddress &rAdr)
InitAddress: InitFlags and set address.
ScSheetLimits & GetSheetLimits() const
static SC_DLLPUBLIC IsNameValidType IsNameValid(const OUString &rName, const ScDocument &rDoc)
static bool IsCharFlagAllConventions(OUString const &rStr, sal_Int32 nPos, ScCharFlags nFlags)
If the character is allowed as tested by nFlags (SC_COMPILER_C_...
void UpdateMoveTab(sc::RefUpdateMoveTabContext &rCxt, SCTAB nLocalTab)
SC_DLLPUBLIC ScRangeData * findByIndex(sal_uInt16 i) const
void erase(const ScRangeData &r)
bool operator==(const ScRangeData &rData) const
bool HasType(Type nType) const
void CompileRangeData(const OUString &rSymbol, bool bSetError)
void setGrammar(formula::FormulaGrammar::Grammar eGram)
Reference not affected, no change at all.
void UpdateMoveTab(sc::RefUpdateMoveTabContext &rCxt, SCTAB nLocalTab=-1)
void SetIndex(sal_uInt16 nInd)
static ScRefUpdateRes UpdateTranspose(const ScDocument &rDoc, const ScRange &rSource, const ScAddress &rDest, ScRange &rRef)
void UpdateDeleteTab(sc::RefUpdateDeleteTabContext &rCxt, SCTAB nLocalTab)
SvStream & endl(SvStream &rStr)
SC_DLLPUBLIC ScRefFlags Parse(const OUString &, const ScDocument &, const ScAddress::Details &rDetails=ScAddress::detailsOOOa1, ScAddress::ExternalInfo *pExtInfo=nullptr, const css::uno::Sequence< css::sheet::ExternalLinkInfo > *pExternalLinks=nullptr, const OUString *pErrRef=nullptr)
void SetRange(const ScSheetLimits &rLimits, const ScRange &rRange, const ScAddress &rPos)
Set a new range, assuming that the ordering of the range matches the ordering of the reference data f...
void SetExtendedErrorDetection(ExtendedErrorDetection eVal)
void SetAddress(const ScSheetLimits &rLimits, const ScAddress &rAddr, const ScAddress &rPos)
SC_DLLPUBLIC FormulaError GetErrCode() const
bool mbReferenceModified
This flag indicates whether any reference in the token array has been modified.
SC_DLLPUBLIC bool IsValidReference(ScRange &rRef) const
SC_DLLPUBLIC bool IsReference(ScRange &rRef) const
Complex reference (a range) into the sheet.
SC_DLLPUBLIC size_t size() const
void UpdateSymbol(OUStringBuffer &rBuffer, const ScAddress &)
SC_DLLPUBLIC ScRefFlags Parse(const OUString &, const ScDocument &, const Details &rDetails=detailsOOOa1, ExternalInfo *pExtInfo=nullptr, const css::uno::Sequence< css::sheet::ExternalLinkInfo > *pExternalLinks=nullptr, sal_Int32 *pSheetEndPos=nullptr, const OUString *pErrRef=nullptr)
bool CopyAdjustRangeName(SCTAB &rSheet, sal_uInt16 &rIndex, ScRangeData *&rpRangeData, ScDocument &rNewDoc, const ScAddress &rNewPos, const ScAddress &rOldPos, const bool bGlobalNamesToLocal, const bool bUsedByFormula) const
If necessary (name references sheet rOldPos.Tab()) copy and adjust named expression/range from sheet-...
UpdatedRangeNames maUpdatedNames
SC_DLLPUBLIC ScRangeData(ScDocument &rDoc, const OUString &rName, const OUString &rSymbol, const ScAddress &rAdr=ScAddress(), Type nType=Type::Name, const formula::FormulaGrammar::Grammar eGrammar=formula::FormulaGrammar::GRAM_DEFAULT)
SC_DLLPUBLIC bool insert(ScRangeData *p, bool bReuseFreeIndex=true)
Insert object into set.
SC_DLLPUBLIC ~ScRangeData()
void UpdateReference(sc::RefUpdateContext &rCxt, SCTAB nLocalTab)