class StartListeningContext; class EndListeningContext; struct RefUpdateContext; struct RefUpdateInsertTabContext; struct RefUpdateDeleteTabContext; struct RefUpdateMoveTabContext; class CompileFormulaContext; class UpdatedRangeNames;
}
class ScFormulaCell; class ScProgress; enumclass SvNumFormatType : sal_Int16;
std::optional<ScTokenArray> mpCode;
ScFormulaCell *mpTopCell;
SCROW mnLength; // How many of these do we have ?
sal_Int32 mnWeight;
SvNumFormatType mnFormatType; bool mbInvariant:1; bool mbSubTotal:1; bool mbPartOfCycle:1; // To flag FG's part of a cycle
enumclass ScMatrixMode : sal_uInt8 {
NONE = 0, // No matrix formula
Formula = 1, // Upper left matrix formula cell
Reference = 2// Remaining cells, via ocMatRef reference token
};
class SAL_DLLPUBLIC_RTTI ScFormulaCell final : public SvtListener
{ private:
ScFormulaCellGroupRef mxGroup; // Group of formulae we're part of bool bDirty : 1; // Must be (re)calculated bool bTableOpDirty : 1; // Dirty flag for TableOp bool bChanged : 1; // Whether something changed regarding display/representation bool bRunning : 1; // Already interpreting right now bool bCompile : 1; // Must be (re)compiled bool bSubTotal : 1; // Cell is part of or contains a SubTotal bool bIsIterCell : 1; // Cell is part of a circular reference bool bInChangeTrack : 1; // Cell is in ChangeTrack bool bNeedListening : 1; // Listeners need to be re-established after UpdateReference bool mbNeedsNumberFormat : 1; // set the calculated number format as hard number format bool mbAllowNumberFormatChange : 1; /* allow setting further calculated
number formats as hard number format */ bool mbPostponedDirty : 1; // if cell needs to be set dirty later bool mbIsExtRef : 1; // has references in ScExternalRefManager; never cleared after set bool mbSeenInPath : 1; // For detecting cycle involving formula groups and singleton formulacells bool mbFreeFlying : 1; // Cell is out of sheets interpreted, like in conditional format
ScMatrixMode cMatrixFlag : 8;
sal_uInt16 nSeenInIteration : 16; // Iteration cycle in which the cell was last encountered
SvNumFormatType nFormatType : 16;
ScFormulaResult aResult;
formula::FormulaGrammar::Grammar eTempGrammar; // used between string (creation) and (re)compilation // If this cell is in a cell group (mxGroup!=nullptr), then this pCode is a not-owning pointer // to the mxGroup's mpCode, which owns the array. If the cell is not in a group, this is an owning pointer.
ScTokenArray* pCode; // The token array
ScDocument& rDocument;
ScFormulaCell* pPrevious;
ScFormulaCell* pNext;
ScFormulaCell* pPreviousTrack;
ScFormulaCell* pNextTrack;
SC_DLLPUBLIC void SetDirty( bool bDirtyFlag=true ); void SetDirtyVar(); // If setting entire document dirty after load, no broadcasts but still append to FormulaTree. void SetDirtyAfterLoad(); void ResetTableOpDirtyVar(); void SetTableOpDirty();
void CompileTokenArray( bool bNoListening = false ); void CompileTokenArray( sc::CompileFormulaContext& rCxt, bool bNoListening = false ); void CompileXML( sc::CompileFormulaContext& rCxt, ScProgress& rProgress ); // compile temporary string tokens void CalcAfterLoad( sc::CompileFormulaContext& rCxt, bool bStartListening ); bool MarkUsedExternalReferences(); // Returns true if the cell was interpreted as part of the formula group. // The parameters may limit which subset of the formula group should be interpreted, if possible. bool Interpret(SCROW nStartOffset = -1, SCROW nEndOffset = -1); bool IsIterCell() const { return bIsIterCell; }
sal_uInt16 GetSeenInIteration() const { return nSeenInIteration; }
bool HasOneReference( ScRange& r ) const; /* Checks if the formula contains reference list that can be expressedbyonereference(likeA1;A2;A3:A5->A1:A5).The referencelistisnotrequiredtobesorted(i.e.A3;A1;A2is stillrecognizedasA1:A3),butnooverlappingisallowed. Ifonereferenceisrecognized,therRangeisfilled.
enumclass RelNameRef
{
NONE, ///< no relative reference from named expression
SINGLE, ///< only single cell relative reference DOUBLE///< at least one range relative reference from named expression
};
RelNameRef HasRelNameReference() const;
// cell belongs to ChangeTrack and not to the real document void SetInChangeTrack( bool bVal ); bool IsInChangeTrack() const { return bInChangeTrack;}
// For import filters!
SC_DLLPUBLIC void AddRecalcMode( ScRecalcMode ); /** For import only: set a double result. */
SC_DLLPUBLIC void SetHybridDouble( double n ); /** For import only: set a string result. Ifforwhateverreasonyouhavetouseboth,SetHybridDouble()and SetHybridString()orSetHybridFormula(),useSetHybridDouble()first
for performance reasons.*/
SC_DLLPUBLIC void SetHybridString( const svl::SharedString& r ); /** For import only: set an empty cell result to be displayed as empty string. Ifforwhateverreasonyouhavetouseboth,SetHybridDouble()and SetHybridEmptyDisplayedAsString()orSetHybridFormula(),use SetHybridDouble()firstforperformancereasonsanduse SetHybridEmptyDisplayedAsString()lastbecauseSetHybridDouble()and
SetHybridString() will override it.*/ void SetHybridEmptyDisplayedAsString(); /** For import only: set a temporary formula string to be compiled later. Ifforwhateverreasonyouhavetouseboth,SetHybridDouble()and SetHybridString()orSetHybridFormula(),useSetHybridDouble()first
for performance reasons.*/ void SetHybridFormula( const OUString& r, const formula::FormulaGrammar::Grammar eGrammar );
/** For import only: set a double result. UsethisinsteadofSetHybridDouble()ifthereisno(temporary) formulastringbecausetheformulaispresentasatokenarray,asit isthecaseforbinaryExcelimport.
*/
SC_DLLPUBLIC void SetResultDouble( double n );
/** Determines whether or not the result string contains more than one paragraph */
SC_DLLPUBLIC bool IsMultilineResult();
bool NeedsInterpret() const
{ if (bIsIterCell) // Shortcut to force return of current value and not enter Interpret() // as we're looping over all iteration cells. returnfalse;
void MaybeInterpret()
{ if (NeedsInterpret())
{ if (bRunning && !rDocument.GetDocOptions().IsIter() && rDocument.IsThreadedGroupCalcInProgress())
{ // This is actually copied from Interpret()'s if(bRunning) // block that once caught this circular reference but now is // prepended with various threaded group calc things which the // assert() below is supposed to fail on when entering again. // Nevertheless, we need some state here the caller can obtain.
aResult.SetResultError( FormulaError::CircularReference );
} else
{
assert(!rDocument.IsThreadedGroupCalcInProgress());
Interpret();
}
}
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.