/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ /* * This file is part of the LibreOffice project. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * This file incorporates work covered by the following license notice: * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed * with this work for additional information regarding copyright * ownership. The ASF licenses this file to you under the Apache * License, Version 2.0 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
enumclass SvtScriptType : sal_uInt8; enumclass ScMF; enumclass FormulaError : sal_uInt16; enumclass CharCompressType; enumclass EEHorizontalTextDirection; namespace editeng { class SvxBorderLine; } namespace formula { struct VectorRefArray; } namespace svl { class SharedString; class SharedStringPool;
}
namespace tools { class Guid; }
namespace sc {
struct BroadcasterState; struct FormulaGroupContext; class StartListeningContext; class EndListeningContext; class CopyFromClipContext; class ColumnSpanSet; struct ColumnBlockPosition; struct RefUpdateContext; class EditTextIterator; struct NoteEntry; class DocumentLinkManager; class CellValues; class TableValues; class RowHeightContext; struct SetFormulaDirtyContext; struct ReorderParam; class ColumnSet; class UpdatedRangeNames; class ColumnIterator; class ExternalDataMapper; class Sparkline; class SparklineGroup; class SparklineList;
}
class Fraction;
class OutputDevice; class SdrObject; class SfxBroadcaster; class SfxListener; class SfxItemSet; class SfxBindings; class SfxPoolItem; class SfxItemPool; class SfxPrinter; class SfxStyleSheetBase; class SvMemoryStream; class SvxBoxInfoItem; class SvxBoxItem; class SvxForbiddenCharactersTable; namespace sfx2 { class LinkManager;
} class SvxSearchItem; class XColorList;
class ScAutoFormatData; class ScBroadcastAreaSlotMachine; class ScChangeViewSettings; class ScChartListenerCollection; class ScClipOptions; class ScColumn; class ScConditionalFormat; class ScConditionalFormatList; class ScDBCollection; class ScDBData; class ScDetOpData; class ScDetOpList; class ScDocOptions; class ScDocProtection; class ScDocumentPool; class ScExtDocOptions; class ScExternalRefManager; class ScFormulaCell; class ScMacroManager; class ScOutlineTable; class ScPrintRangeSaver; class ScStyleSheet; class ScStyleSheetPool; class ScTable; class ScTableProtection; class ScTokenArray; class ScValidationData; class ScValidationDataList; class ScViewOptions; class ScChangeTrack; class ScEditEngineDefaulter; class ScFieldEditEngine; class ScNoteEditEngine; class ScDPObject; class ScDPCollection; class ScMatrix; class ScScriptTypeData; class ScPoolHelper; struct ScSortParam; class ScRefreshTimerControl; class ScUnoListenerCalls; class ScUnoRefList; struct RowInfo; struct ScTableInfo; struct ScTabOpParam; class VirtualDevice; class ScAutoNameCache; class ScTemporaryChartLock; class ScLookupCache; class ScSortedRangeCache; struct ScSortedRangeCacheMap; class ScUndoManager; class ScFormulaParserPool; struct ScClipParam; class ScRowBreakIterator; struct ScSetStringParam; struct ScColWidthParam; class ScSheetEvents; class ScProgress; class SvtListener; class ScEditDataArray; class EditTextObject; struct ScRefCellValue; class ScPostIt; struct ScSubTotalParam; struct ScQueryParam; class ScHint; class SvtBroadcaster; enumclass ScDBDataPortion; enumclass ScSheetEventId; class BitmapEx; class ScColumnsRange; struct ScFilterEntries; typedef o3tl::sorted_vector<sal_uInt32> ScCondFormatIndexes; struct ScDataAreaExtras; enumclass ScConditionMode;
enum CommentCaptionState
{
ALLSHOWN, // All comments captions are shown
ALLHIDDEN, // All comments captions are hidden
MIXED // There are comments in shown and hidden.
};
enum RangeNameScope
{
GLOBAL, // A range name can be defined
SHEET // with two scope on Manage Names dialog.
};
/// Represents the type of sheet geometry data. enumclass SheetGeomType
{
SIZES, // Column widths or row heights.
HIDDEN, // Hidden columns/rows.
FILTERED, // Filtered columns/rows.
GROUPS // Grouping of columns/rows.
};
// DDE link modes const sal_uInt8 SC_DDE_DEFAULT = 0; const sal_uInt8 SC_DDE_ENGLISH = 1; const sal_uInt8 SC_DDE_TEXT = 2; const sal_uInt8 SC_DDE_IGNOREMODE = 255; /// For usage in FindDdeLink() only!
// During threaded calculation fields being mutated are kept in this struct struct ScDocumentThreadSpecific
{
std::unique_ptr<ScRecursionHelper> xRecursionHelper; // information for recursive and iterative cell formulas
ScInterpreterContext* pContext = nullptr; // references the context passed around for easier access
};
/// Enumeration to determine which pieces of the code should not be mutated when set. enum ScMutationGuardFlags
{ // Bit mask bits
CORE = 0x0001, /// Core calc data structures should not be mutated
};
// Stores settings used in the Goal Seek struct ScGoalSeekSettings
{ bool bDefined = false;
ScAddress aFormulaCell;
ScAddress aVariableCell;
OUString sTargetValue;
};
public: enumclass HardRecalcState
{
OFF, /// normal calculation of dependencies
TEMPORARY, /// CalcAll() without broadcast/notify but setting up new listeners
ETERNAL /// no new listeners are setup, no broadcast/notify
};
private: // needs to be shared to allow the bIsClip/bIsUndo mechanism to // do the right thing (SCDOCMODE_CLIP, SCDOCMODE_UNDO) mutable std::shared_ptr<CellAttributeHelper> mpCellAttributeHelper;
// mutable for lazy construction mutable std::unique_ptr< ScFormulaParserPool >
mxFormulaParserPool; /// Pool for all external formula parsers used by this document.
OUString aDocName; // optional: name of document
OUString aDocCodeName; // optional: name of document (twice?)
OUString maFileURL; // file URL for copy & paste
ScRangePairListRef xColNameRanges;
ScRangePairListRef xRowNameRanges;
std::unique_ptr<ScAutoNameCache> pAutoNameCache; // for automatic name lookup during CompileXML
std::unique_ptr<SfxItemSet> pPreviewFont; // convert to std::unique_ptr or whatever
ScStyleSheet* pPreviewCellStyle;
ScMarkData maPreviewSelection;
sal_Int64 nUnoObjectId; // counted up for UNO objects
ErrCode nRangeOverflowType; // used in (xml) loading for overflow warnings
ConnectionVector maConnectionVector; public: /// list of ScInterpreterTableOpParams currently in use
std::vector<ScInterpreterTableOpParams*> m_TableOpList;
ScInterpreterTableOpParams aLastTableOpParams; // remember last params
private:
LanguageType eLanguage; // default language
LanguageType eCjkLanguage; // default language for asian text
LanguageType eCtlLanguage; // default language for complex text
rtl_TextEncoding eSrcSet; // during reading: source character set
/** The compiler grammar used in document storage. GRAM_PODF for ODF 1.1
documents, GRAM_ODFF for ODF 1.2 documents. */
formula::FormulaGrammar::Grammar eStorageGrammar;
sal_uInt64 nFormulaCodeInTree; // formula RPN in the formula tree
sal_uInt64 nXMLImportedFormulaCount; // progress count during XML import
sal_uInt16 nInterpretLevel; // >0 if in interpreter
sal_uInt16 nMacroInterpretLevel; // >0 if macro in interpreter
sal_uInt16 nInterpreterTableOpLevel; // >0 if in interpreter TableOp
ScDocumentThreadSpecific maNonThreaded;
// There can be only one ScDocument being calculated in a thread at a time, so we can use a // plain thread_local static member.
thread_local static ScDocumentThreadSpecific maThreadSpecific;
std::shared_mutex mScLookupMutex; // protection for thread-unsafe parts of handling ScLookup
std::unique_ptr<ScSortedRangeCacheMap> mxScSortedRangeCache; // cache for unsorted lookups
staticconst sal_uInt16 nSrcVer; // file version (load/save)
sal_uInt16 nFormulaTrackCount;
HardRecalcState eHardRecalcState; // off, temporary, eternal
SCTAB nVisibleTab; // for OLE etc., don't use inside ScDocument
SCCOL nPosLeft; // for OLE etc., don't use inside ScDocument
SCROW nPosTop; // for OLE etc., don't use inside ScDocument
ScLkUpdMode eLinkMode;
bool bAutoCalc; // calculate automatically bool bAutoCalcShellDisabled; // in/from/for ScDocShell disabled // are there ForcedFormulas which have to be calculated // in interaction with ScDocShell SetDocumentModified, // AutoCalcShellDisabled and TrackFormulas bool bForcedFormulaPending; bool bCalculatingFormulaTree; bool bIsClip; bool bIsUndo; bool bIsFunctionAccess; bool bIsVisible; // set from view ctor
// no broadcast, construct no listener during insert from a different // Doc (per filter or the like ), not until CompileAll / CalcAfterLoad bool bInsertingFromOtherDoc; bool bLoadingMedium; bool bImportingXML; // special handling of formula text bool mbImportingXLSX; bool bCalcingAfterLoad; // in CalcAfterLoad TRUE // don't construct/destruct listeners temporarily bool bNoListening; bool mbIdleEnabled; bool bInLinkUpdate; // TableLink or AreaLink bool bChartListenerCollectionNeedsUpdate; // are/were there RC_FORCED formula cells in the document (if set once to TRUE then set forever) bool bHasForcedFormulas; // is the Doc being destroyed? (no Notify-Tracking etc. needed anymore) bool bInDtorClear; // expand reference if insert column/row takes place at the border // of a reference // is fetched in each UpdateReference from InputOptions, // assigned, and restored at the end of UpdateReference bool bExpandRefs; // for detective update, is set for each change of a formula bool bDetectiveDirty; // If the pointer is set, formula cells will not be automatically grouped into shared formula groups, // instead the range will be extended to contain all such cells.
std::unique_ptr< ScRange > pDelayedFormulaGrouping; // If non-empty, ScColumn::StartListeningFormulaCells() calls may be delayed using this, // avoiding repeated calling for the same cells in the given range. The function will be called once // later for all the cells in the range.
std::unordered_map< ScColumn*, std::pair<SCROW, SCROW>> pDelayedStartListeningFormulaCells; // Cells will not delete their broadcasters if delayed, avoiding possible extensive mdds vector changes. bool bDelayedDeletingBroadcasters;
bool bLinkFormulaNeedingCheck; // valid only after loading, for ocDde and ocWebservice
bool mbUndoEnabled:1; bool mbExecuteLinkEnabled:1; bool mbChangeReadOnlyEnabled:1; // allow changes in read-only document (for API import filters) bool mbStreamValidLocked:1; bool mbUserInteractionEnabled:1; // whether or not to launch any kind of interactive dialogs.
bool mbTrackFormulasPending : 1; bool mbFinalTrackFormulas : 1; // This indicates if a ScDocShell::DoRecalc() or ScDocShell::DoHardRecalc() is in progress. bool mbDocShellRecalc : 1; // This indicates if a ScOutputData::LayoutStrings() is in progress. bool mbLayoutStrings : 1;
/** * Get all range names that are local to each table. It only returns * non-empty range name set.
*/
SC_DLLPUBLIC void GetAllTabRangeNames(ScRangeName::TabNameCopyMap& rRangeNames) const;
SC_DLLPUBLIC void SetAllRangeNames(const std::map<OUString, ScRangeName>& rRangeMap);
SC_DLLPUBLIC void GetRangeNameMap(std::map<OUString, ScRangeName*>& rRangeName);
SC_DLLPUBLIC ScRangeName* GetRangeName(SCTAB nTab) const;
SC_DLLPUBLIC ScRangeName* GetRangeName() const; void SetRangeName(SCTAB nTab, std::unique_ptr<ScRangeName> pNew); void SetRangeName( std::unique_ptr<ScRangeName> pNewRangeName ); bool IsAddressInRangeName( RangeNameScope eScope, const ScAddress& rAddress);
/** Find a named expression / range name in either global or a local scope. @param nTab If <0 search nIndex in global scope, if >=0 search nIndex in scope of nTab. @param nIndex Index of named expression / range name. @return nullptr if indexed name not found.
*/
ScRangeData* FindRangeNameBySheetAndIndex( SCTAB nTab, sal_uInt16 nIndex ) const;
/** Recursively find all named expressions that directly or indirectly (nested) reference a given sheet, starting from a given named expression nTokenTab/nTokenIndex.
Used to collect all named expressions/ranges that will need to be copied along when copying sheets.
The different tab/sheets passed cater for the situation that a sheet is copied and was already inserted and global names are already adjusted but the sheet-local names of the shifted original sheet are not yet. If no sheet was inserted and global and local names' references not updated yet, then all 4 tab arguments would be identical.
@param nTokenTab Tab/sheet on which to find the name, -1 if global scope. For example obtained from ocName token.
@param nTokenIndex Index of named expression. For example obtained from ocName token.
@param nGlobalRefTab Tab to check if used in global names.
@param nLocalRefTab Tab to check if used in sheet-local names.
@param nOldTokenTab The original tab of the copied sheet, used as sheet-local base position for relative references.
@param nOldTokenTabReplacement The replacement to use for relative references if the name encountered uses nOldTokenTab as base position.
@param bSameDoc FALSE if collecting names for a sheet to be copied to another document. Then all names encountered are considered to be referencing the sheet. Else TRUE if collecting names to be copied into the same document.
/** If necessary (name references sheet rOldPos.Tab()) copy and adjust named expression/range from sheet-local to sheet-local, or global to sheet-local if bGlobalNamesToLocal==true.
Also copies nested names and adjusts the ocName tokens of the calling name.
@param rSheet On entry, the original sheet of the named expression/range, <0 global. On return TRUE, the new sheet. Else unchanged.
@param rIndex On entry, the original index of the named expression/range. On return TRUE, the new index, or 0 if a new copied name couldn't be inserted. Else unchanged.
@param rpRangeData On entry, the pointer to the original named expression/range. On return TRUE, the pointer to the new copied name, or nullptr if hits happened.
@param rNewPos New position of formula cell if called for that, else new base position of a to be created new name adjusted for Tab. rNewPos.nTab MUST point to the new sheet copied to.
@param rOldPos Old position of formula cell if called for that, else base position of the existing name adjusted for Tab. rOldPos.nTab MUST point to the old sheet copied from.
@param bGlobalNamesToLocal If TRUE, affected global names are copied to sheet-local names. If FALSE, global names are copied to global names in another document.
@param bUsedByFormula If TRUE, forces a global name to be affected/used. If FALSE, a global name is only affected if it evaluates to be referencing the sheet.
@return TRUE if copied and caller may need to evaluate rpRangeData and rSheet and rIndex. FALSE if nothing to be done.
*/ bool CopyAdjustRangeName( SCTAB& rSheet, sal_uInt16& rIndex, ScRangeData*& rpRangeData, ScDocument& rNewDoc, const ScAddress& rNewPos, const ScAddress& rOldPos, constbool bGlobalNamesToLocal, constbool bUsedByFormula ) const;
/** * Call this immediately before updating all named ranges.
*/
SC_DLLPUBLIC void PreprocessAllRangeNamesUpdate( const std::map<OUString, ScRangeName>& rRangeMap );
SC_DLLPUBLIC void PreprocessRangeNameUpdate();
SC_DLLPUBLIC void PreprocessDBDataUpdate(); /** * Call this immediately after updating named ranges.
*/
SC_DLLPUBLIC void CompileHybridFormula();
/** * Insert a new named expression to the global scope. * * @param rName name for the expression. * @param rPos base position. * @param rExpr formula expression to be associated with the name. The * current grammar is used to compile this expression. * * @return true if inserted successfully, false otherwise.
*/ bool InsertNewRangeName( const OUString& rName, const ScAddress& rPos, const OUString& rExpr );
/** * Insert a new named expression to a sheet-local scope. * * @param nTab sheet for local scope. * @param rName name for the expression. * @param rPos base position. * @param rExpr formula expression to be associated with the name. The * current grammar is used to compile this expression. * * @return true if inserted successfully, false otherwise.
*/ bool InsertNewRangeName( SCTAB nTab, const OUString& rName, const ScAddress& rPos, const OUString& rExpr );
/** Obtain the sheet separator corresponding to the document's grammar.
@return '.' for our own grammars, '!' for Excel grammars.
*/
SC_DLLPUBLIC sal_Unicode GetSheetSeparator() const;
/** One document global anonymous database range for temporary operations, used if the corresponding sheet-local anonymous database range is already used with AutoFilter and range differs. Not stored in document
files. */
SC_DLLPUBLIC void SetAnonymousDBData(std::unique_ptr<ScDBData> pDBData);
SC_DLLPUBLIC ScDBData* GetAnonymousDBData();
/** Tries to find a DDE link with the specified connection data. @param rnDdePos (out-param) Returns the index of the DDE link (does not include other links from link manager).
@return true = DDE link found, rnDdePos valid. */
SC_DLLPUBLIC bool FindDdeLink( std::u16string_view rAppl, std::u16string_view rTopic,
std::u16string_view rItem, sal_uInt8 nMode, size_t& rnDdePos );
/** Returns the connection data of the specified DDE link. @param nDdePos Index of the DDE link (does not include other links from link manager). @param rAppl (out-param) The application name. @param rTopic (out-param) The DDE topic. @param rItem (out-param) The DDE item.
@return true = DDE link found, out-parameters valid. */ bool GetDdeLinkData( size_t nDdePos, OUString& rAppl, OUString& rTopic, OUString& rItem ) const; /** Returns the link mode of the specified DDE link. @param nDdePos Index of the DDE link (does not include other links from link manager). @param rnMode (out-param) The link mode of the specified DDE link.
@return true = DDE link found, rnMode valid. */ bool GetDdeLinkMode( size_t nDdePos, sal_uInt8& rnMode ) const; /** Returns the result matrix of the specified DDE link. @param nDdePos Index of the DDE link (does not include other links from link manager).
@return The result matrix, if the DDE link has been found, 0 otherwise. */
SC_DLLPUBLIC const ScMatrix* GetDdeLinkResultMatrix( size_t nDdePos ) const;
/** Tries to find a DDE link or creates a new, if not extant. @param pResults If not 0, sets the matrix as DDE link result matrix (also for existing links).
@return true = DDE link found; false = Unpredictable error occurred, no DDE link created. */
SC_DLLPUBLIC bool CreateDdeLink( const OUString& rAppl, const OUString& rTopic, const OUString& rItem, sal_uInt8 nMode, const ScMatrixRef& pResults ); /** Sets a result matrix for the specified DDE link. @param nDdePos Index of the DDE link (does not include other links from link manager). @param pResults The array containing all results of the DDE link (intrusive-ref-counted, do not delete).
@return true = DDE link found and matrix set. */ bool SetDdeLinkResultMatrix( size_t nDdePos, const ScMatrixRef& pResults );
/** * This method manages the lifecycle of the passed edit text object. When * the text is successfully inserted, the cell takes over the ownership of * the text object. If not, the text object gets deleted. * * <p>The caller must ensure that the passed edit text object <i>uses the * SfxItemPool instance returned from ScDocument::GetEditPool()</i>. * This is very important.</p>
*/
SC_DLLPUBLIC bool SetEditText( const ScAddress& rPos, std::unique_ptr<EditTextObject> pEditText ); void SetEditText( const ScAddress& rPos, const EditTextObject& rEditText, const SfxItemPool* pEditPool );
SC_DLLPUBLIC void SetEditText( const ScAddress& rPos, const OUString& rStr );
SC_DLLPUBLIC SCROW GetFirstEditTextRow( const ScRange& rRange ) const;
/** * Call this if you are not sure whether to put this as an edit text or a * simple text.
*/
SC_DLLPUBLIC void SetTextCell(const ScAddress& rPos, const OUString& rStr, const ScSetStringParam* pParam = nullptr);
/** * Set formula cell, and transfer its ownership to the document. This call * attempts to group the passed formula cell with the adjacent cells or * cell groups if appropriate. * * @return pCell if it was successfully inserted, NULL otherwise. pCell * is deleted automatically on failure to insert.
*/
SC_DLLPUBLIC ScFormulaCell* SetFormulaCell( const ScAddress& rPos, ScFormulaCell* pCell ); bool SetFormulaCells( const ScAddress& rPos, std::vector<ScFormulaCell*>& rCells );
/** * Check if there is at least one formula cell in specified range.
*/ bool HasFormulaCell( const ScRange& rRange ) const;
SC_DLLPUBLIC void InsertMatrixFormula(SCCOL nCol1, SCROW nRow1,
SCCOL nCol2, SCROW nRow2, const ScMarkData& rMark, const OUString& rFormula, const ScTokenArray* p = nullptr, const formula::FormulaGrammar::Grammar = formula::FormulaGrammar::GRAM_DEFAULT );
SC_DLLPUBLIC void InsertTableOp(const ScTabOpParam& rParam, // multi-operation
SCCOL nCol1, SCROW nRow1,
SCCOL nCol2, SCROW nRow2, const ScMarkData& rMark);
/** * Return a pointer to the double value stored in value cell. * * @param rPos cell position * * @return pointer to the double value stored in a numeric cell, or NULL * if the cell at specified position is not a numeric cell.
*/
SC_DLLPUBLIC double* GetValueCell( const ScAddress& rPos );
/** Returns true, if there is any data to create a selection list for rPos. */ bool HasSelectionData( SCCOL nCol, SCROW nRow, SCTAB nTab ) const; bool HasValidationData( SCCOL nCol, SCROW nRow, SCTAB nTab ) const;
/** * Check if the specified range contains either: 1) one non-empty cell, 2) * more than one non-empty cells, or 3) totally empty. In case the range * contains at least one non-empty cell, specify the position of the first * non-empty cell.
*/
sc::MultiDataCellState HasMultipleDataCells( const ScRange& rRange ) const;
/** * Returns true if the whole range covers one and the same sparkline * group and returns the group via out parameter
*/
SC_DLLPUBLIC bool GetSparklineGroupInRange(ScRange const& rRange, std::shared_ptr<sc::SparklineGroup>& rGroup);
SC_DLLPUBLIC bool HasOneSparklineGroup(ScRange const& rRange);
SC_DLLPUBLIC std::shared_ptr<sc::SparklineGroup> SearchSparklineGroup(tools::Guid const& rGuid);
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.