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>
82 for( t = aIter.
Next(); t; t = aIter.
Next() )
106 if( (nRecursion < 42) &&
lcl_HasRelRef( pDoc, pRangeData->GetCode(), nRecursion + 1 ) )
143 size_t n = rRangeList.
size();
144 for (
size_t i = 0;
i < n; ++
i)
146 const ScRange & rRange = rRangeList[
i];
175 nOptions(r.nOptions),
178 aStrVal1(r.aStrVal1),
179 aStrVal2(r.aStrVal2),
180 aStrNmsp1(r.aStrNmsp1),
181 aStrNmsp2(r.aStrNmsp2),
182 eTempGrammar1(r.eTempGrammar1),
183 eTempGrammar2(r.eTempGrammar2),
187 aSrcString(r.aSrcString),
188 bRelRef1(r.bRelRef1),
189 bRelRef2(r.bRelRef2),
192 eConditionType( r.eConditionType ),
193 pCondFormat(r.pCondFormat)
208 nOptions(r.nOptions),
211 aStrVal1(r.aStrVal1),
212 aStrVal2(r.aStrVal2),
213 aStrNmsp1(r.aStrNmsp1),
214 aStrNmsp2(r.aStrNmsp2),
215 eTempGrammar1(r.eTempGrammar1),
216 eTempGrammar2(r.eTempGrammar2),
220 aSrcString(r.aSrcString),
221 bRelRef1(r.bRelRef1),
222 bRelRef2(r.bRelRef2),
225 eConditionType( r.eConditionType),
226 pCondFormat(r.pCondFormat)
239 const OUString& rExpr1,
const OUString& rExpr2,
ScDocument& rDocument,
const ScAddress& rPos,
240 const OUString& rExprNmsp1,
const OUString& rExprNmsp2,
248 aStrNmsp1(rExprNmsp1),
249 aStrNmsp2(rExprNmsp2),
250 eTempGrammar1(eGrammar1),
251 eTempGrammar2(eGrammar2),
259 eConditionType(eType),
262 Compile( rExpr1, rExpr2, rExprNmsp1, rExprNmsp2, eGrammar1, eGrammar2,
false );
314 if ( rFormula->GetLen() != 1 )
341 const OUString& rExprNmsp1,
const OUString& rExprNmsp2,
344 if ( !rExpr1.isEmpty() || !rExpr2.isEmpty() )
348 if ( !rExpr1.isEmpty() )
356 pFormula1->AssignXMLString( rExpr1, rExprNmsp1 );
367 if ( !rExpr2.isEmpty() )
375 pFormula2->AssignXMLString( rExpr2, rExprNmsp2 );
497 bool bChangedPos =
false;
503 assert(!
"can't move ScConditionEntry");
505 bChangedPos =
aSrcPos != aOldSrcPos;
514 aRes =
pFormula1->AdjustReferenceOnShift(rCxt, aOldSrcPos);
533 aRes =
pFormula2->AdjustReferenceOnShift(rCxt, aOldSrcPos);
601 static bool lcl_IsEqual(
const std::unique_ptr<ScTokenArray>& pArr1,
const std::unique_ptr<ScTokenArray>& pArr2 )
604 if ( pArr1 && pArr2 )
605 return pArr1->EqualTokens( pArr2.get() );
607 return !pArr1 && !pArr2;
649 std::unique_ptr<ScFormulaCell> pTemp1;
654 pEff1 = pTemp1.get();
679 std::unique_ptr<ScFormulaCell> pTemp2;
684 pEff2 = pTemp2.get();
763 size_t nListCount = rRanges.
size();
764 for(
size_t i = 0;
i < nListCount;
i++ )
766 const ScRange & rRange = rRanges[
i];
777 bool bShrunk =
false;
782 for(
SCROW r = nRowStart; r <= nRow; r++ )
783 for(
SCCOL c = nColStart; c <= nCol; c++ )
793 std::pair<ScConditionEntryCache::StringCacheType::iterator, bool> aResult =
794 mpCache->maStrings.emplace(aStr, 1);
797 aResult.first->second++;
801 std::pair<ScConditionEntryCache::ValueCacheType::iterator, bool> aResult =
802 mpCache->maValues.emplace(nVal, 1);
805 aResult.first->second++;
819 ScConditionEntryCache::ValueCacheType::iterator itr =
mpCache->maValues.find(nArg);
820 if(itr ==
mpCache->maValues.end())
824 return itr->second > 1;
829 ScConditionEntryCache::StringCacheType::iterator itr =
mpCache->maStrings.find(rStr);
830 if(itr ==
mpCache->maStrings.end())
834 return itr->second > 1;
847 for(ScConditionEntryCache::ValueCacheType::const_reverse_iterator itr =
mpCache->maValues.rbegin(),
848 itrEnd =
mpCache->maValues.rend(); itr != itrEnd; ++itr)
852 if(itr->first <= nArg)
854 nCells += itr->second;
868 for(
const auto& [rVal, rCount] :
mpCache->maValues)
885 size_t nLimitCells =
static_cast<size_t>(
mpCache->nValueItems*
nVal1/100);
886 for(ScConditionEntryCache::ValueCacheType::const_reverse_iterator itr =
mpCache->maValues.rbegin(),
887 itrEnd =
mpCache->maValues.rend(); itr != itrEnd; ++itr)
889 if(nCells >= nLimitCells)
891 if(itr->first <= nArg)
893 nCells += itr->second;
904 size_t nLimitCells =
static_cast<size_t>(
mpCache->nValueItems*
nVal1/100);
905 for(
const auto& [rVal, rCount] :
mpCache->maValues)
907 if(nCells >= nLimitCells)
921 double nSum = std::accumulate(
mpCache->maValues.begin(),
mpCache->maValues.end(), double(0),
922 [](
const double& rSum,
const ScConditionEntryCache::ValueCacheType::value_type& rEntry) {
923 return rSum + rEntry.first * rEntry.second; });
926 return (nArg <= nSum/mpCache->nValueItems);
928 return (nArg < nSum/mpCache->nValueItems);
935 double nSum = std::accumulate(
mpCache->maValues.begin(),
mpCache->maValues.end(), double(0),
936 [](
const double& rSum,
const ScConditionEntryCache::ValueCacheType::value_type& rEntry) {
937 return rSum + rEntry.first * rEntry.second; });
940 return (nArg >= nSum/
mpCache->nValueItems);
942 return (nArg > nSum/
mpCache->nValueItems);
981 double nComp1 =
nVal1;
982 double nComp2 =
nVal2;
985 if ( nComp1 > nComp2 )
988 double nTemp = nComp1; nComp1 = nComp2; nComp2 = nTemp;
998 bValid = ::rtl::math::approxEqual( nArg, nComp1 );
1001 bValid = !::rtl::math::approxEqual( nArg, nComp1 );
1004 bValid = ( nArg > nComp1 ) && !::rtl::math::approxEqual( nArg, nComp1 );
1007 bValid = ( nArg >= nComp1 ) || ::rtl::math::approxEqual( nArg, nComp1 );
1010 bValid = ( nArg < nComp1 ) && !::rtl::math::approxEqual( nArg, nComp1 );
1013 bValid = ( nArg <= nComp1 ) || ::rtl::math::approxEqual( nArg, nComp1 );
1016 bValid = ( nArg >= nComp1 && nArg <= nComp2 ) ||
1017 ::rtl::math::approxEqual( nArg, nComp1 ) || ::rtl::math::approxEqual( nArg, nComp2 );
1020 bValid = ( nArg < nComp1 || nArg > nComp2 ) &&
1021 !::rtl::math::approxEqual( nArg, nComp1 ) && !::rtl::math::approxEqual( nArg, nComp2 );
1033 bValid = nComp1 != 0.0;
1064 OUString
aStr = OUString::number(
nVal1);
1065 OUString aStr2 = OUString::number(nArg);
1066 bValid = aStr2.startsWith(aStr);
1070 OUString aStr2 = OUString::number(nArg);
1071 bValid = aStr2.startsWith(
aStrVal1);
1077 OUString
aStr = OUString::number(
nVal1);
1078 OUString aStr2 = OUString::number(nArg);
1079 bValid = aStr2.endsWith(aStr);
1083 OUString aStr2 = OUString::number(nArg);
1091 OUString
aStr = OUString::number(
nVal1);
1092 OUString aStr2 = OUString::number(nArg);
1093 bValid = aStr2.indexOf(aStr) != -1;
1097 OUString aStr2 = OUString::number(nArg);
1098 bValid = aStr2.indexOf(
aStrVal1) != -1;
1105 SAL_WARN(
"sc",
"unknown operation at ScConditionEntry");
1113 bool bValid =
false;
1116 return nVal1 != 0.0;
1143 OUString aTemp( aUpVal1 ); aUpVal1 = aUpVal2; aUpVal2 = aTemp;
1150 rArg, aUpVal1 ) == 0);
1154 rArg, aUpVal1 ) != 0);
1170 bValid = rArg.startsWith(aUpVal1);
1173 bValid = rArg.endsWith(aUpVal1);
1177 bValid = rArg.indexOf(aUpVal1) != -1;
1188 bValid = ( nCompare > 0 );
1191 bValid = ( nCompare >= 0 );
1194 bValid = ( nCompare < 0 );
1197 bValid = ( nCompare <= 0 );
1202 bValid = ( nCompare < 0 ||
1210 SAL_WARN(
"sc",
"unknown operation in ScConditionEntry");
1224 return nVal1 != 0.0;
1242 if ( FormulaGrammar::isEnglish( eGrammar) && nNumFmt == 0 )
1252 aRet = aBuffer.makeStringAndClear();
1261 else if ( nIndex==1 )
1268 aRet = aBuffer.makeStringAndClear();
1284 std::unique_ptr<ScTokenArray> pRet;
1299 pRet->AddDouble(
nVal1 );
1302 else if ( nIndex==1 )
1315 pRet->AddDouble(
nVal2 );
1329 SCTAB nMaxTab = nMinTab;
1331 for (sal_uInt16 nPass = 0; nPass < 2; nPass++)
1342 if (aAbs.
Tab() < nMinTab)
1343 nMinTab = aAbs.
Tab();
1344 if (aAbs.
Tab() > nMaxTab)
1345 nMaxTab = aAbs.
Tab();
1353 if (aAbs.
Tab() < nMinTab)
1354 nMinTab = aAbs.
Tab();
1355 if (aAbs.
Tab() > nMaxTab)
1356 nMaxTab = aAbs.
Tab();
1365 if ( nMaxTab >= nTabCount && nMinTab > 0 )
1368 if ( aValidPos.
Tab() >= nTabCount )
1369 aValidPos.
SetTab( nTabCount - 1 );
1381 bool bAllMarked =
false;
1382 for (sal_uInt16 nPass = 0; !bAllMarked && nPass < 2; nPass++)
1399 switch (static_cast<sal_Int32>(nOperation))
1401 case css::sheet::ConditionOperator2::EQUAL:
1404 case css::sheet::ConditionOperator2::LESS:
1407 case css::sheet::ConditionOperator2::GREATER:
1410 case css::sheet::ConditionOperator2::LESS_EQUAL:
1413 case css::sheet::ConditionOperator2::GREATER_EQUAL:
1416 case css::sheet::ConditionOperator2::NOT_EQUAL:
1419 case css::sheet::ConditionOperator2::BETWEEN:
1422 case css::sheet::ConditionOperator2::NOT_BETWEEN:
1428 case css::sheet::ConditionOperator2::DUPLICATE:
1431 case css::sheet::ConditionOperator2::NOT_DUPLICATE:
1456 const OUString& rExpr1,
const OUString& rExpr2,
1458 const OUString& rStyle,
1459 const OUString& rExprNmsp1,
const OUString& rExprNmsp2,
1463 ScConditionEntry( eOper, rExpr1, rExpr2, rDocument, rPos, rExprNmsp1, rExprNmsp2, eGrammar1, eGrammar2, eType ),
1464 aStyleName( rStyle ),
1465 eCondFormatType( eType )
1472 const OUString& rStyle ) :
1474 aStyleName( rStyle )
1480 aStyleName( r.aStyleName ),
1481 eCondFormatType( r.eCondFormatType)
1487 aStyleName( r.aStyleName ),
1488 eCondFormatType( r.eCondFormatType)
1535 maStyleName( rFormat.maStyleName )
1552 sal_Int32 nCurrentDate = rActDate - pFormatter->
GetNullDate();
1555 sal_Int32 nCellDate =
static_cast<sal_Int32
>(::rtl::math::approxFloor(nVal));
1562 if( nCurrentDate == nCellDate )
1566 if( nCurrentDate == nCellDate -1 )
1570 if( nCurrentDate == nCellDate + 1)
1574 if( nCurrentDate >= nCellDate && nCurrentDate - 7 < nCellDate )
1582 Date aBegin(rActDate - (8 + static_cast<sal_Int32>(eDay)));
1583 Date aEnd(rActDate - (2 + static_cast<sal_Int32>(eDay)));
1584 return aCellDate.
IsBetween( aBegin, aEnd );
1588 Date aBegin(rActDate - 8);
1589 Date aEnd(rActDate - 1);
1590 return aCellDate.
IsBetween( aBegin, aEnd );
1599 Date aBegin(rActDate - (1 + static_cast<sal_Int32>(eDay)));
1600 Date aEnd(rActDate + (5 - static_cast<sal_Int32>(eDay)));
1601 return aCellDate.
IsBetween( aBegin, aEnd );
1605 Date aEnd( rActDate + 6);
1606 return aCellDate.
IsBetween( rActDate, aEnd );
1615 return aCellDate.
IsBetween( rActDate + (6 - static_cast<sal_Int32>(eDay)),
1616 rActDate + (12 - static_cast<sal_Int32>(eDay)) );
1620 return aCellDate.
IsBetween( rActDate + 7, rActDate + 13 );
1715 pNew->maEntries.push_back( std::unique_ptr<ScFormatEntry>(pNewEntry) );
1729 [&bIgnoreSrcPos](
const std::unique_ptr<ScFormatEntry>& p1,
const std::unique_ptr<ScFormatEntry>& p2) ->
bool
1731 return p1->IsEqual(*p2, bIgnoreSrcPos);
1749 maEntries.push_back( std::unique_ptr<ScFormatEntry>(pNew));
1783 if ( nPos <
size() )
1860 static_cast<ScCondFormatEntry&>(*rxEntry).CompileAll();
1868 static_cast<ScCondFormatEntry&>(*rxEntry).CompileXML();
1880 rxEntry->UpdateReference(rCxt);
1885 rxEntry->UpdateReference(rCxt);
1917 rxEntry->UpdateInsertTab(rCxt);
1946 rxEntry->UpdateDeleteTab(rCxt);
1954 for(
size_t i = 0;
i < n; ++
i)
1958 if(nTab < nMinTab || nTab > nMaxTab)
1983 rxEntry->UpdateMoveTab(rCxt);
2009 bool bAllMarked =
false;
2027 rxEntry->startRendering();
2035 rxEntry->endRendering();
2054 for(
const auto& rxFormat : rList)
2060 for(
const auto& rxFormat : rList)
2075 SAL_WARN(
"sc",
"ScConditionalFormatList: Entry not found");
2085 SAL_WARN(
"sc",
"ScConditionalFormatList: Entry not found");
2109 it->UpdateReference(rCxt);
2123 it->InsertRow(nTab, nColStart, nColEnd, nRowPos, nSize);
2131 it->InsertCol(nTab, nRowStart, nRowEnd, nColPos, nSize);
2139 it->UpdateInsertTab(rCxt);
2147 it->UpdateDeleteTab(rCxt);
2155 it->UpdateMoveTab(rCxt);
2163 it->RenameCellStyle(rOld, rNew);
2175 if ((*itr)->GetRange().empty())
2179 rLink.
Call(itr->get());
2192 rxFormat->DeleteArea( nCol1, nRow1, nCol2, nRow2 );
2223 for (
size_t i = 0, n = rRange.
size();
i < n; ++
i)
2225 aRange.
Join(rRange[
i]);
2274 it->startRendering();
void SetOperation(ScConditionMode eMode)
sal_Int16 GetNextYear() const
bool UpdateReference(UpdateRefMode, const ScDocument *, const ScRange &rWhere, SCCOL nDx, SCROW nDy, SCTAB nDz)
SCROW mnRowDelta
Amount and direction of movement in the row direction.
virtual void endRendering() override
void ClearSelectionItems(const sal_uInt16 *pWhich, const ScMarkData &rMark)
static void UpdateInsertTab(ScAddress &rAddr, const sc::RefUpdateInsertTabContext &rCxt)
void SetGrammar(const formula::FormulaGrammar::Grammar eGrammar)
bool IsTabDeleted() const
OUString getString() const
SharedString intern(const OUString &rStr)
virtual ~ScCondFormatEntry() override
SC_DLLPUBLIC svl::SharedStringPool & GetSharedStringPool()
virtual void DataChanged() const override
todo: It should be possible to have MarkArrays for each table, in order to enable "search all" across...
DayOfWeek GetDayOfWeek() const
sal_Int32 compareString(const OUString &s1, const OUString &s2) const
void IncTab(SCTAB nDelta=1)
#define LANGUAGE_ENGLISH_US
Single reference (one address) into the sheet.
std::unique_ptr< ScTokenArray > pFormula2
std::unique_ptr< ScConditionEntryCache > mpCache
ScAddress toAbs(const ScSheetLimits &rLimits, const ScAddress &rPos) const
void SetFormula1(const ScTokenArray &rArray)
void Interpret(const ScAddress &rPos)
bool IsBetween(const Date &rFrom, const Date &rTo) const
Context for reference update during shifting, moving or copying of cell ranges.
std::unique_ptr< ScTokenArray > CompileString(const OUString &rFormula)
Tokenize formula expression string into an array of tokens.
const OUString & GetStyle() const
static SC_DLLPUBLIC CollatorWrapper * GetCollator()
virtual void UpdateInsertTab(sc::RefUpdateInsertTabContext &rCxt) override
bool MarkUsedExternalReferences() const
bool IsClipOrUndo() const
bool IsValid(const ScAddress &rPos) const
bool IsBelowAverage(double nArg, bool bEqual) const
virtual void DataChanged() const
This is very similar to ScCellValue, except that it references the original value instead of copying ...
bool IsCellValid(ScRefCellValue &rCell, const ScAddress &rPos) const
void MarkFromRangeList(const ScRangeList &rList, bool bReset)
virtual void endRendering()
virtual ~ScConditionEntry() override
void InsertRow(SCTAB nTab, SCCOL nColStart, SCCOL nColEnd, SCROW nRowPos, SCSIZE nSize)
void RepaintRange(const ScRange &rRange)
SC_DLLPUBLIC void CheckLinkFormulaNeedingCheck(const ScTokenArray &rCode)
Check token array and set link check if ocDde/ocWebservice is contained.
virtual void UpdateMoveTab(sc::RefUpdateMoveTabContext &rCxt) override
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 ...
const EditTextObject * mpEditText
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 ...
void SetSrcString(const OUString &rNew)
const BorderLinePrimitive2D *pCandidateB assert(pCandidateA)
SC_DLLPUBLIC SCTAB GetTableCount() const
sal_uInt16 GetMonth() const
void CompileAll()
Delete formula cells, so we re-compile at the next IsValid.
IntrinsicAnimationEventHandlerSharedPtr mpListener
ScFormulaCell * mpFormula
void MarkUsedExternalReferences()
bool IsBottomNElement(double nArg) const
virtual void SetParent(ScConditionalFormat *pNew)=0
void Compile(const OUString &rExpr1, const OUString &rExpr2, const OUString &rExprNmsp1, const OUString &rExprNmsp2, formula::FormulaGrammar::Grammar eGrammar1, formula::FormulaGrammar::Grammar eGrammar2, bool bTextToReal)
ScAddress GetValidSrcPos() const
Return a position that's adjusted to allow textual representation of expressions if possible...
constexpr OUStringLiteral aData
sal_Int16 GetYear() const
bool operator==(const ScFormatEntry &) const
bool IsEqual(const ScFormatEntry &r, bool bIgnoreSrcPos) const override
std::unique_ptr< ScFormulaListener > mpListener
bool IsTopNElement(double nArg) const
std::unique_ptr< ScFormulaCell > pFCell1
bool ShrinkToUsedDataArea(bool &o_bShrunk, SCTAB nTab, SCCOL &rStartCol, SCROW &rStartRow, SCCOL &rEndCol, SCROW &rEndRow, bool bColumnsOnly, bool bStickyTopRow=false, bool bStickyLeftCol=false, bool bConsiderCellNotes=false, bool bConsiderCellDrawObjects=false) const
Shrink a range to only include used data area.
SC_DLLPUBLIC SvNumberFormatter * GetFormatTable() const
bool IsImportingXML() const
void InsertCol(SCTAB nTab, SCROW nRowStart, SCROW nRowEnd, SCCOL nColPos, SCSIZE nSize)
virtual bool IsEqual(const ScFormatEntry &, bool bIgnoreSrcPos) const
UpdateRefMode meMode
update mode - insert/delete, copy, or move.
virtual ScFormatEntry * Clone(ScDocument *pDoc) const override
bool IsValidStr(const OUString &rArg, const ScAddress &rPos) const
const svl::SharedString * mpString
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
condformat::ScCondFormatDateType meType
virtual Type GetType() const override
ScSheetLimits & GetSheetLimits() const
bool IsEqual(const ScFormatEntry &r, bool bIgnoreSrcPos) const override
bool NeedsRepaint() const
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)
ScFormatEntry(ScDocument *pDoc)
void AddDays(sal_Int32 nAddDays)
virtual ScFormatEntry * Clone(ScDocument *pDoc) const =0
void SetIgnoreBlank(bool bSet)
bool In(const ScAddress &) const
is Address& in Range?
void SetFormula2(const ScTokenArray &rArray)
void UpdateStyleName(const OUString &rNew)
bool IsError(const ScAddress &rPos) const
virtual void UpdateReference(sc::RefUpdateContext &rCxt) override
ScRange maRange
Range of cells that are about to be moved for insert/delete/move modes.
virtual void endRendering() override
virtual void UpdateDeleteTab(sc::RefUpdateDeleteTabContext &rCxt) override
SC_DLLPUBLIC bool Move(SCCOL nDeltaX, SCROW nDeltaY, SCTAB nDeltaZ, ScAddress &rErrorPos, const ScDocument *pDocument=nullptr)
virtual ScFormatEntry * Clone(ScDocument *pDoc) const override
ScCondDateFormatEntry(ScDocument *pDoc)
std::unique_ptr< Date > mpCache
std::unique_ptr< char[]> aBuffer
std::unique_ptr< ScTokenArray > pFormula1
#define SAL_WARN_IF(condition, area, stream)
void Join(const ScRange &, bool bIsInList=false)
const OUString & GetStyleName() const
SCTAB mnTabDelta
Amount and direction of movement in the sheet direction.
static void UpdateDeleteTab(ScAddress &rAddr, const sc::RefUpdateDeleteTabContext &rCxt)
virtual ScFormatEntry * Clone(ScDocument *pDoc) const override
const formula::FormulaGrammar::Grammar eTempGrammar2
static bool lcl_IsEqual(const std::unique_ptr< ScTokenArray > &pArr1, const std::unique_ptr< ScTokenArray > &pArr2)
bool IsAboveAverage(double nArg, bool bEqual) const
static bool lcl_GetCellContent(ScRefCellValue &rCell, bool bIsStr1, double &rArg, OUString &rArgStr, const ScDocument *pDoc)
void SetDateType(condformat::ScCondFormatDateType eType)
constexpr TypedWhichId< ScCondFormatItem > ATTR_CONDITIONAL(154)
bool mbReferenceModified
This flag indicates whether any reference in the token array has been modified.
virtual void startRendering()
static bool lcl_HasRelRef(ScDocument *pDoc, const ScTokenArray *pFormula, sal_uInt16 nRecursion=0)
static void SimplifyCompiledFormula(std::unique_ptr< ScTokenArray > &rFormula, double &rVal, bool &rIsStr, OUString &rStrVal)
ScCondFormatEntry(ScConditionMode eOper, const OUString &rExpr1, const OUString &rExpr2, ScDocument &rDocument, const ScAddress &rPos, const OUString &rStyle, const OUString &rExprNmsp1=EMPTY_OUSTRING, const OUString &rExprNmsp2=EMPTY_OUSTRING, formula::FormulaGrammar::Grammar eGrammar1=formula::FormulaGrammar::GRAM_DEFAULT, formula::FormulaGrammar::Grammar eGrammar2=formula::FormulaGrammar::GRAM_DEFAULT, Type eType=Type::Condition)
static SC_DLLPUBLIC OUString GetString(const EditTextObject &rEditText, const ScDocument *pDoc)
Retrieves string with paragraphs delimited by new lines (' ').
virtual Type GetType() const =0
bool IsTopNPercent(double nArg) const
static ScConditionMode GetModeFromApi(css::sheet::ConditionOperator nOperator)
#define SAL_WARN(area, stream)
virtual void startRendering() override
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)
std::unique_ptr< ScTokenArray > CreateFlatCopiedTokenArray(sal_uInt16 nPos) const
Create a flat copy using ScTokenArray copy-ctor with shared tokens.
virtual void SetParent(ScConditionalFormat *pNew) override
ScConditionalFormat * pCondFormat
bool IsBottomNPercent(double nArg) const
ScRangeData * FindRangeNameBySheetAndIndex(SCTAB nTab, sal_uInt16 nIndex) const
Find a named expression / range name in either global or a local scope.
SCCOL mnColDelta
Amount and direction of movement in the column direction.
virtual void startRendering() override
const formula::FormulaGrammar::Grammar eTempGrammar1
void SetStyleName(const OUString &rStyleName)
void MakeCells(const ScAddress &rPos)
Create formula cells.
SC_DLLPUBLIC void AddCondFormatData(const ScRangeList &rRange, SCTAB nTab, sal_uInt32 nIndex)
SC_DLLPUBLIC bool GetAutoCalc() const
std::unique_ptr< ScFormulaCell > pFCell2