22#include <rtl/math.hxx>
26#include <com/sun/star/sheet/ConditionOperator2.hpp>
31#include <document.hxx>
32#include <compiler.hxx>
39#include <tokenarray.hxx>
85 switch(
t->GetType() )
107 if( (nRecursion < 42) &&
lcl_HasRelRef( pDoc, pRangeData->GetCode(), nRecursion + 1 ) )
115 switch(
t->GetOpCode() )
144 size_t n = rRangeList.
size();
145 for (
size_t i = 0;
i <
n; ++
i)
147 const ScRange & rRange = rRangeList[
i];
176 nOptions(r.nOptions),
179 aStrVal1(r.aStrVal1),
180 aStrVal2(r.aStrVal2),
181 aStrNmsp1(r.aStrNmsp1),
182 aStrNmsp2(r.aStrNmsp2),
183 eTempGrammar1(r.eTempGrammar1),
184 eTempGrammar2(r.eTempGrammar2),
188 aSrcString(r.aSrcString),
189 bRelRef1(r.bRelRef1),
190 bRelRef2(r.bRelRef2),
193 eConditionType( r.eConditionType ),
194 pCondFormat(r.pCondFormat)
209 nOptions(r.nOptions),
212 aStrVal1(r.aStrVal1),
213 aStrVal2(r.aStrVal2),
214 aStrNmsp1(r.aStrNmsp1),
215 aStrNmsp2(r.aStrNmsp2),
216 eTempGrammar1(r.eTempGrammar1),
217 eTempGrammar2(r.eTempGrammar2),
221 aSrcString(r.aSrcString),
222 bRelRef1(r.bRelRef1),
223 bRelRef2(r.bRelRef2),
226 eConditionType( r.eConditionType),
227 pCondFormat(r.pCondFormat)
240 const OUString& rExpr1,
const OUString& rExpr2,
ScDocument& rDocument,
const ScAddress& rPos,
241 const OUString& rExprNmsp1,
const OUString& rExprNmsp2,
249 aStrNmsp1(rExprNmsp1),
250 aStrNmsp2(rExprNmsp2),
251 eTempGrammar1(eGrammar1),
252 eTempGrammar2(eGrammar2),
260 eConditionType(
eType),
263 Compile( rExpr1, rExpr2, rExprNmsp1, rExprNmsp2, eGrammar1, eGrammar2,
false );
315 if ( rFormula->GetLen() != 1 )
342 const OUString& rExprNmsp1,
const OUString& rExprNmsp2,
345 if ( !rExpr1.isEmpty() || !rExpr2.isEmpty() )
349 if ( !rExpr1.isEmpty() )
357 pFormula1->AssignXMLString( rExpr1, rExprNmsp1 );
368 if ( !rExpr2.isEmpty() )
376 pFormula2->AssignXMLString( rExpr2, rExprNmsp2 );
500 bool bChangedPos =
false;
506 assert(!
"can't move ScConditionEntry");
508 bChangedPos =
aSrcPos != aOldSrcPos;
517 aRes =
pFormula1->AdjustReferenceOnShift(rCxt, aOldSrcPos);
536 aRes =
pFormula2->AdjustReferenceOnShift(rCxt, aOldSrcPos);
604static bool lcl_IsEqual(
const std::unique_ptr<ScTokenArray>& pArr1,
const std::unique_ptr<ScTokenArray>& pArr2 )
607 if ( pArr1 && pArr2 )
608 return pArr1->EqualTokens( pArr2.get() );
610 return !pArr1 && !pArr2;
652 std::optional<ScFormulaCell> oTemp;
659 oTemp.emplace(*
mpDoc, rPos);
692 oTemp.emplace(*
mpDoc, rPos);
773 size_t nListCount = rRanges.
size();
774 for(
size_t i = 0;
i < nListCount;
i++ )
776 const ScRange & rRange = rRanges[
i];
787 bool bShrunk =
false;
792 for(
SCROW r = nRowStart; r <= nRow; r++ )
793 for(
SCCOL c = nColStart; c <= nCol; c++ )
803 std::pair<ScConditionEntryCache::StringCacheType::iterator, bool> aResult =
807 aResult.first->second++;
811 std::pair<ScConditionEntryCache::ValueCacheType::iterator, bool> aResult =
812 mpCache->maValues.emplace(nVal, 1);
815 aResult.first->second++;
829 ScConditionEntryCache::ValueCacheType::iterator itr =
mpCache->maValues.find(nArg);
830 if(itr ==
mpCache->maValues.end())
834 return itr->second > 1;
839 ScConditionEntryCache::StringCacheType::iterator itr =
mpCache->maStrings.find(rStr);
840 if(itr ==
mpCache->maStrings.end())
844 return itr->second > 1;
857 for(ScConditionEntryCache::ValueCacheType::const_reverse_iterator itr =
mpCache->maValues.rbegin(),
858 itrEnd =
mpCache->maValues.rend(); itr != itrEnd; ++itr)
862 if(itr->first <= nArg)
864 nCells += itr->second;
878 for(
const auto& [rVal, rCount] :
mpCache->maValues)
895 size_t nLimitCells =
static_cast<size_t>(
mpCache->nValueItems*
nVal1/100);
896 for(ScConditionEntryCache::ValueCacheType::const_reverse_iterator itr =
mpCache->maValues.rbegin(),
897 itrEnd =
mpCache->maValues.rend(); itr != itrEnd; ++itr)
899 if(nCells >= nLimitCells)
901 if(itr->first <= nArg)
903 nCells += itr->second;
914 size_t nLimitCells =
static_cast<size_t>(
mpCache->nValueItems*
nVal1/100);
915 for(
const auto& [rVal, rCount] :
mpCache->maValues)
917 if(nCells >= nLimitCells)
931 double nSum = std::accumulate(
mpCache->maValues.begin(),
mpCache->maValues.end(),
double(0),
932 [](
const double& rSum,
const ScConditionEntryCache::ValueCacheType::value_type& rEntry) {
933 return rSum + rEntry.first * rEntry.second; });
936 return (nArg <= nSum/mpCache->nValueItems);
938 return (nArg < nSum/mpCache->nValueItems);
945 double nSum = std::accumulate(
mpCache->maValues.begin(),
mpCache->maValues.end(),
double(0),
946 [](
const double& rSum,
const ScConditionEntryCache::ValueCacheType::value_type& rEntry) {
947 return rSum + rEntry.first * rEntry.second; });
950 return (nArg >= nSum/
mpCache->nValueItems);
952 return (nArg > nSum/
mpCache->nValueItems);
991 double nComp1 =
nVal1;
992 double nComp2 =
nVal2;
995 if ( nComp1 > nComp2 )
997 std::swap( nComp1, nComp2 );
1000 bool bValid =
false;
1006 bValid = ::rtl::math::approxEqual( nArg, nComp1 );
1009 bValid = !::rtl::math::approxEqual( nArg, nComp1 );
1012 bValid = ( nArg > nComp1 ) && !::rtl::math::approxEqual( nArg, nComp1 );
1015 bValid = ( nArg >= nComp1 ) || ::rtl::math::approxEqual( nArg, nComp1 );
1018 bValid = ( nArg < nComp1 ) && !::rtl::math::approxEqual( nArg, nComp1 );
1021 bValid = ( nArg <= nComp1 ) || ::rtl::math::approxEqual( nArg, nComp1 );
1024 bValid = ( nArg >= nComp1 && nArg <= nComp2 ) ||
1025 ::rtl::math::approxEqual( nArg, nComp1 ) || ::rtl::math::approxEqual( nArg, nComp2 );
1028 bValid = ( nArg < nComp1 || nArg > nComp2 ) &&
1029 !::rtl::math::approxEqual( nArg, nComp1 ) && !::rtl::math::approxEqual( nArg, nComp2 );
1041 bValid = nComp1 != 0.0;
1072 OUString
aStr = OUString::number(
nVal1);
1073 OUString aStr2 = OUString::number(nArg);
1074 bValid = aStr2.startsWith(
aStr);
1078 OUString aStr2 = OUString::number(nArg);
1079 bValid = aStr2.startsWith(
aStrVal1);
1085 OUString
aStr = OUString::number(
nVal1);
1086 OUString aStr2 = OUString::number(nArg);
1087 bValid = aStr2.endsWith(
aStr);
1091 OUString aStr2 = OUString::number(nArg);
1099 OUString
aStr = OUString::number(
nVal1);
1100 OUString aStr2 = OUString::number(nArg);
1101 bValid = aStr2.indexOf(
aStr) != -1;
1105 OUString aStr2 = OUString::number(nArg);
1106 bValid = aStr2.indexOf(
aStrVal1) != -1;
1113 SAL_WARN(
"sc",
"unknown operation at ScConditionEntry");
1121 bool bValid =
false;
1124 return nVal1 != 0.0;
1172 sal_Int32 nStart = rArg.getLength();
1173 const sal_Int32 nLen = aUpVal1.getLength();
1178 nStart = nStart - nLen;
1179 sal_Int32 nMatch1(0), nMatch2(0);
1181 aUpVal1, 0, nLen, nMatch2);
1190 bValid = aArgStr.indexOf(aValStr) != -1;
1203 bValid = ( nCompare > 0 );
1206 bValid = ( nCompare >= 0 );
1209 bValid = ( nCompare < 0 );
1212 bValid = ( nCompare <= 0 );
1219 bValid = (nCompare > 0 && nCompare2 > 0) || (nCompare < 0 && nCompare2 < 0);
1225 SAL_WARN(
"sc",
"unknown operation in ScConditionEntry");
1239 return nVal1 != 0.0;
1257 if ( FormulaGrammar::isEnglish( eGrammar) && nNumFmt == 0 )
1267 aRet =
aBuffer.makeStringAndClear();
1283 aRet =
aBuffer.makeStringAndClear();
1299 std::unique_ptr<ScTokenArray> pRet;
1314 pRet->AddDouble(
nVal1 );
1330 pRet->AddDouble(
nVal2 );
1344 SCTAB nMaxTab = nMinTab;
1346 for (sal_uInt16 nPass = 0; nPass < 2; nPass++)
1357 if (aAbs.
Tab() < nMinTab)
1358 nMinTab = aAbs.
Tab();
1359 if (aAbs.
Tab() > nMaxTab)
1360 nMaxTab = aAbs.
Tab();
1368 if (aAbs.
Tab() < nMinTab)
1369 nMinTab = aAbs.
Tab();
1370 if (aAbs.
Tab() > nMaxTab)
1371 nMaxTab = aAbs.
Tab();
1380 if ( nMaxTab >= nTabCount && nMinTab > 0 )
1383 if ( aValidPos.
Tab() >= nTabCount )
1384 aValidPos.
SetTab( nTabCount - 1 );
1396 bool bAllMarked =
false;
1397 for (sal_uInt16 nPass = 0; !bAllMarked && nPass < 2; nPass++)
1414 switch (
static_cast<sal_Int32
>(nOperation))
1416 case css::sheet::ConditionOperator2::EQUAL:
1419 case css::sheet::ConditionOperator2::LESS:
1422 case css::sheet::ConditionOperator2::GREATER:
1425 case css::sheet::ConditionOperator2::LESS_EQUAL:
1428 case css::sheet::ConditionOperator2::GREATER_EQUAL:
1431 case css::sheet::ConditionOperator2::NOT_EQUAL:
1434 case css::sheet::ConditionOperator2::BETWEEN:
1437 case css::sheet::ConditionOperator2::NOT_BETWEEN:
1443 case css::sheet::ConditionOperator2::DUPLICATE:
1446 case css::sheet::ConditionOperator2::NOT_DUPLICATE:
1471 const OUString& rExpr1,
const OUString& rExpr2,
1474 const OUString& rExprNmsp1,
const OUString& rExprNmsp2,
1478 ScConditionEntry( eOper, rExpr1, rExpr2, rDocument, rPos, rExprNmsp1, rExprNmsp2, eGrammar1, eGrammar2,
eType ),
1479 aStyleName(
std::move( aStyle )),
1480 eCondFormatType(
eType )
1489 aStyleName(
std::move( aStyle ))
1495 aStyleName( r.aStyleName ),
1496 eCondFormatType( r.eCondFormatType)
1502 aStyleName( r.aStyleName ),
1503 eCondFormatType( r.eCondFormatType)
1550 maStyleName( rFormat.maStyleName )
1567 sal_Int32 nCurrentDate = rActDate - pFormatter->
GetNullDate();
1570 sal_Int32 nCellDate =
static_cast<sal_Int32
>(::rtl::math::approxFloor(nVal));
1577 if( nCurrentDate == nCellDate )
1581 if( nCurrentDate == nCellDate -1 )
1585 if( nCurrentDate == nCellDate + 1)
1589 if( nCurrentDate >= nCellDate && nCurrentDate - 7 < nCellDate )
1597 Date aBegin(rActDate - (8 +
static_cast<sal_Int32
>(eDay)));
1598 Date aEnd(rActDate - (2 +
static_cast<sal_Int32
>(eDay)));
1599 return aCellDate.
IsBetween( aBegin, aEnd );
1603 Date aBegin(rActDate - 8);
1604 Date aEnd(rActDate - 1);
1605 return aCellDate.
IsBetween( aBegin, aEnd );
1614 Date aBegin(rActDate - (1 +
static_cast<sal_Int32
>(eDay)));
1615 Date aEnd(rActDate + (5 -
static_cast<sal_Int32
>(eDay)));
1616 return aCellDate.
IsBetween( aBegin, aEnd );
1620 Date aEnd( rActDate + 6);
1621 return aCellDate.
IsBetween( rActDate, aEnd );
1630 return aCellDate.
IsBetween( rActDate + (6 -
static_cast<sal_Int32
>(eDay)),
1631 rActDate + (12 -
static_cast<sal_Int32
>(eDay)) );
1635 return aCellDate.
IsBetween( rActDate + 7, rActDate + 13 );
1730 pNew->maEntries.push_back( std::unique_ptr<ScFormatEntry>(pNewEntry) );
1744 [&bIgnoreSrcPos](
const std::unique_ptr<ScFormatEntry>& p1,
const std::unique_ptr<ScFormatEntry>& p2) ->
bool
1746 return p1->IsEqual(*p2, bIgnoreSrcPos);
1764 maEntries.push_back( std::unique_ptr<ScFormatEntry>(pNew));
1833 aData.aStyleName.isEmpty())
1895 rxEntry->UpdateReference(rCxt);
1900 rxEntry->UpdateReference(rCxt);
1932 rxEntry->UpdateInsertTab(rCxt);
1961 rxEntry->UpdateDeleteTab(rCxt);
1969 for(
size_t i = 0;
i <
n; ++
i)
1973 if(nTab < nMinTab || nTab > nMaxTab)
1998 rxEntry->UpdateMoveTab(rCxt);
2024 bool bAllMarked =
false;
2042 rxEntry->startRendering();
2050 rxEntry->endRendering();
2069 for(
const auto& rxFormat : rList)
2075 for(
const auto& rxFormat : rList)
2090 SAL_WARN(
"sc",
"ScConditionalFormatList: Entry not found");
2100 SAL_WARN(
"sc",
"ScConditionalFormatList: Entry not found");
2124 it->UpdateReference(rCxt);
2138 it->InsertRow(nTab, nColStart, nColEnd, nRowPos, nSize);
2146 it->InsertCol(nTab, nRowStart, nRowEnd, nColPos, nSize);
2154 it->UpdateInsertTab(rCxt);
2162 it->UpdateDeleteTab(rCxt);
2170 it->UpdateMoveTab(rCxt);
2178 it->RenameCellStyle(rOld, rNew);
2190 if ((*itr)->GetRange().empty())
2194 rLink.
Call(itr->get());
2207 rxFormat->DeleteArea( nCol1, nRow1, nCol2, nRow2 );
2238 for (
size_t i = 0,
n = rRange.
size();
i <
n; ++
i)
2240 aRange.
Join(rRange[
i]);
2289 it->startRendering();
size_t SCSIZE
size_t typedef to be able to find places where code was changed from USHORT to size_t and is used to ...
sal_Int32 compareString(const OUString &s1, const OUString &s2) const
sal_Int16 GetNextYear() const
void AddDays(sal_Int32 nAddDays)
bool IsBetween(const Date &rFrom, const Date &rTo) const
sal_Int16 GetYear() const
DayOfWeek GetDayOfWeek() const
sal_uInt16 GetMonth() const
void IncTab(SCTAB nDelta=1)
SC_DLLPUBLIC bool Move(SCCOL nDeltaX, SCROW nDeltaY, SCTAB nDeltaZ, ScAddress &rErrorPos, const ScDocument &rDoc)
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)
void SetGrammar(const formula::FormulaGrammar::Grammar eGrammar)
std::unique_ptr< ScTokenArray > CompileString(const OUString &rFormula)
Tokenize formula expression string into an array of tokens.
void SetDateType(condformat::ScCondFormatDateType eType)
std::unique_ptr< Date > mpCache
void SetStyleName(const OUString &rStyleName)
bool IsValid(const ScAddress &rPos) const
ScCondDateFormatEntry(ScDocument *pDoc)
condformat::ScCondFormatDateType meType
virtual ScFormatEntry * Clone(ScDocument *pDoc) const override
virtual void endRendering() override
virtual void startRendering() override
const OUString & GetStyleName() const
virtual void DataChanged() const override
const OUString & GetStyle() const
virtual ~ScCondFormatEntry() override
bool IsEqual(const ScFormatEntry &r, bool bIgnoreSrcPos) const override
virtual ScFormatEntry * Clone(ScDocument *pDoc) const override
ScCondFormatEntry(ScConditionMode eOper, const OUString &rExpr1, const OUString &rExpr2, ScDocument &rDocument, const ScAddress &rPos, OUString aStyle, const OUString &rExprNmsp1=OUString(), const OUString &rExprNmsp2=OUString(), formula::FormulaGrammar::Grammar eGrammar1=formula::FormulaGrammar::GRAM_DEFAULT, formula::FormulaGrammar::Grammar eGrammar2=formula::FormulaGrammar::GRAM_DEFAULT, Type eType=Type::Condition)
void UpdateStyleName(const OUString &rNew)
bool IsDuplicate(double nArg, const OUString &rStr) const
ScConditionEntry(ScConditionMode eOper, const OUString &rExpr1, const OUString &rExpr2, ScDocument &rDocument, const ScAddress &rPos, const OUString &rExprNmsp1, const OUString &rExprNmsp2, formula::FormulaGrammar::Grammar eGrammar1, formula::FormulaGrammar::Grammar eGrammar2, Type eType=Type::Condition)
bool IsTopNPercent(double nArg) const
virtual void UpdateDeleteTab(sc::RefUpdateDeleteTabContext &rCxt) override
ScAddress GetValidSrcPos() const
Return a position that's adjusted to allow textual representation of expressions if possible.
virtual void DataChanged() const
bool MarkUsedExternalReferences() const
void SetIgnoreBlank(bool bSet)
bool IsTopNElement(double nArg) const
void SetFormula1(const ScTokenArray &rArray)
bool IsBelowAverage(double nArg, bool bEqual) const
const formula::FormulaGrammar::Grammar eTempGrammar1
virtual void UpdateMoveTab(sc::RefUpdateMoveTabContext &rCxt) override
const formula::FormulaGrammar::Grammar eTempGrammar2
static ScConditionMode GetModeFromApi(css::sheet::ConditionOperator nOperator)
bool IsAboveAverage(double nArg, bool bEqual) const
std::unique_ptr< ScFormulaCell > pFCell1
virtual Type GetType() const override
std::unique_ptr< ScFormulaCell > pFCell2
virtual void UpdateInsertTab(sc::RefUpdateInsertTabContext &rCxt) override
std::unique_ptr< ScFormulaListener > mpListener
std::unique_ptr< ScConditionEntryCache > mpCache
bool NeedsRepaint() const
static void SimplifyCompiledFormula(std::unique_ptr< ScTokenArray > &rFormula, double &rVal, bool &rIsStr, OUString &rStrVal)
bool IsValidStr(const OUString &rArg, const ScAddress &rPos) const
std::unique_ptr< ScTokenArray > pFormula1
ScConditionalFormat * pCondFormat
void CompileAll()
Delete formula cells, so we re-compile at the next IsValid.
virtual ~ScConditionEntry() override
bool IsEqual(const ScFormatEntry &r, bool bIgnoreSrcPos) const override
std::unique_ptr< ScTokenArray > CreateFlatCopiedTokenArray(sal_uInt16 nPos) const
Create a flat copy using ScTokenArray copy-ctor with shared tokens.
void Compile(const OUString &rExpr1, const OUString &rExpr2, const OUString &rExprNmsp1, const OUString &rExprNmsp2, formula::FormulaGrammar::Grammar eGrammar1, formula::FormulaGrammar::Grammar eGrammar2, bool bTextToReal)
virtual void SetParent(ScConditionalFormat *pNew) override
bool IsBottomNElement(double nArg) const
virtual ScFormatEntry * Clone(ScDocument *pDoc) const override
std::unique_ptr< ScTokenArray > pFormula2
void SetFormula2(const ScTokenArray &rArray)
bool IsBottomNPercent(double nArg) const
bool IsCellValid(ScRefCellValue &rCell, const ScAddress &rPos) const
void MakeCells(const ScAddress &rPos)
Create formula cells.
virtual void endRendering() override
void Interpret(const ScAddress &rPos)
void SetSrcString(const OUString &rNew)
bool IsError(const ScAddress &rPos) const
virtual void UpdateReference(sc::RefUpdateContext &rCxt) override
OUString GetExpression(const ScAddress &rCursor, sal_uInt16 nPos, sal_uInt32 nNumFmt=0, const formula::FormulaGrammar::Grammar eGrammar=formula::FormulaGrammar::GRAM_DEFAULT) const
bool IsValid(double nArg, const ScAddress &rPos) const
void SetOperation(ScConditionMode eMode)
virtual void startRendering() override
ScSheetLimits & GetSheetLimits() const
ScRangeData * FindRangeNameBySheetAndIndex(SCTAB nTab, sal_uInt16 nIndex) const
Find a named expression / range name in either global or a local scope.
SC_DLLPUBLIC SCROW MaxRow() const
SC_DLLPUBLIC void CheckLinkFormulaNeedingCheck(const ScTokenArray &rCode)
Check token array and set link check if ocDde/ocWebservice is contained.
void RepaintRange(const ScRange &rRange)
bool ShrinkToUsedDataArea(bool &o_bShrunk, SCTAB nTab, SCCOL &rStartCol, SCROW &rStartRow, SCCOL &rEndCol, SCROW &rEndRow, bool bColumnsOnly, bool bStickyTopRow=false, bool bStickyLeftCol=false, ScDataAreaExtras *pDataAreaExtras=nullptr) const
Shrink a range to only include used data area.
SC_DLLPUBLIC bool GetAutoCalc() const
void MarkUsedExternalReferences()
bool IsClipOrUndo() const
void ClearSelectionItems(const sal_uInt16 *pWhich, const ScMarkData &rMark)
SC_DLLPUBLIC svl::SharedStringPool & GetSharedStringPool()
SC_DLLPUBLIC void AddCondFormatData(const ScRangeList &rRange, SCTAB nTab, sal_uInt32 nIndex)
SC_DLLPUBLIC SvNumberFormatter * GetFormatTable() const
bool IsImportingXML() const
SC_DLLPUBLIC SCTAB GetTableCount() const
static SC_DLLPUBLIC OUString GetString(const EditTextObject &rEditText, const ScDocument *pDoc)
Retrieves string with paragraphs delimited by new lines (' ').
virtual Type GetType() const =0
virtual ScFormatEntry * Clone(ScDocument *pDoc) const =0
virtual void SetParent(ScConditionalFormat *pNew)=0
virtual void endRendering()
bool operator==(const ScFormatEntry &) const
ScFormatEntry(ScDocument *pDoc)
virtual bool IsEqual(const ScFormatEntry &, bool bIgnoreSrcPos) const
virtual void startRendering()
static SC_DLLPUBLIC CollatorWrapper & GetCollator()
case-insensitive collator
static SC_DLLPUBLIC ::utl::TransliterationWrapper & GetTransliteration()
static SC_DLLPUBLIC const CharClass & getCharClass()
todo: It should be possible to have MarkArrays for each table, in order to enable "search all" across...
void MarkFromRangeList(const ScRangeList &rList, bool bReset)
void InsertRow(SCTAB nTab, SCCOL nColStart, SCCOL nColEnd, SCROW nRowPos, SCSIZE nSize)
void InsertCol(SCTAB nTab, SCROW nRowStart, SCROW nRowEnd, SCCOL nColPos, SCSIZE nSize)
void Join(const ScRange &, bool bIsInList=false)
bool DeleteArea(SCCOL nCol1, SCROW nRow1, SCTAB nTab1, SCCOL nCol2, SCROW nRow2, SCTAB nTab2)
For now this method assumes that nTab1 == nTab2 The algorithm will be much more complicated if nTab1 ...
bool UpdateReference(UpdateRefMode, const ScDocument *, const ScRange &rWhere, SCCOL nDx, SCROW nDy, SCTAB nDz)
bool Contains(const ScAddress &) const
is Address& fully in Range?
SharedString intern(const OUString &rStr)
const OUString & getString() const
bool isMatch(const OUString &rStr1, const OUString &rStr2) const
bool isEqual(const OUString &rStr1, const OUString &rStr2) const
bool equals(const OUString &rStr1, sal_Int32 nPos1, sal_Int32 nCount1, sal_Int32 &nMatch1, const OUString &rStr2, sal_Int32 nPos2, sal_Int32 nCount2, sal_Int32 &nMatch2) const
static bool lcl_IsEqual(const std::unique_ptr< ScTokenArray > &pArr1, const std::unique_ptr< ScTokenArray > &pArr2)
static bool lcl_HasRelRef(ScDocument *pDoc, const ScTokenArray *pFormula, sal_uInt16 nRecursion=0)
static bool lcl_GetCellContent(ScRefCellValue &rCell, bool bIsStr1, double &rArg, OUString &rArgStr, const ScDocument *pDoc)
#define LANGUAGE_ENGLISH_US
#define SAL_WARN_IF(condition, area, stream)
#define SAL_WARN(area, stream)
constexpr OUStringLiteral aData
constexpr TypedWhichId< ScCondFormatItem > ATTR_CONDITIONAL(154)
static void UpdateDeleteTab(ScAddress &rAddr, const sc::RefUpdateDeleteTabContext &rCxt)
This is for the base-cell-address of a defined name or conditional format, not for references.
static void UpdateInsertTab(ScAddress &rAddr, const sc::RefUpdateInsertTabContext &rCxt)
This is very similar to ScCellValue, except that it references the original value instead of copying ...
ScFormulaCell * getFormula() const
const EditTextObject * getEditText() const
const svl::SharedString * getSharedString() const
Single reference (one address) into the sheet.
ScAddress toAbs(const ScSheetLimits &rLimits, const ScAddress &rPos) const
bool IsTabDeleted() const
Context for reference update during shifting, moving or copying of cell ranges.
SCROW mnRowDelta
Amount and direction of movement in the row direction.
UpdateRefMode meMode
update mode - insert/delete, copy, or move.
SCCOL mnColDelta
Amount and direction of movement in the column direction.
SCTAB mnTabDelta
Amount and direction of movement in the sheet direction.
ScRange maRange
Range of cells that are about to be moved for insert/delete/move modes.
bool mbReferenceModified
This flag indicates whether any reference in the token array has been modified.
std::unique_ptr< char[]> aBuffer