LibreOffice Module sc (master)  1
externalrefmgr.hxx
Go to the documentation of this file.
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3  * This file is part of the LibreOffice project.
4  *
5  * This Source Code Form is subject to the terms of the Mozilla Public
6  * License, v. 2.0. If a copy of the MPL was not distributed with this
7  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8  *
9  * This file incorporates work covered by the following license notice:
10  *
11  * Licensed to the Apache Software Foundation (ASF) under one or more
12  * contributor license agreements. See the NOTICE file distributed
13  * with this work for additional information regarding copyright
14  * ownership. The ASF licenses this file to you under the Apache
15  * License, Version 2.0 (the "License"); you may not use this file
16  * except in compliance with the License. You may obtain a copy of
17  * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18  */
19 
20 #pragma once
21 
22 #include "address.hxx"
23 #include "document.hxx"
24 #include <sfx2/objsh.hxx>
25 #include <sfx2/lnkbase.hxx>
26 #include <tools/time.hxx>
27 #include <vcl/timer.hxx>
28 #include <svl/zforlist.hxx>
29 #include <svl/lstner.hxx>
30 #include "types.hxx"
31 #include "rangelst.hxx"
32 #include <osl/mutex.hxx>
33 #include <formula/types.hxx>
34 #include <tools/solar.h>
35 
36 #include <memory>
37 #include <unordered_map>
38 #include <unordered_set>
39 #include <vector>
40 #include <set>
41 #include <o3tl/sorted_vector.hxx>
43 
44 class ScTokenArray;
45 namespace weld { class Window; }
46 
47 class ScFormulaCell;
48 
49 namespace sc {
50 
51 class ColumnSpanSet;
52 
53 }
54 
56 {
57 public:
58  ScExternalRefLink(ScDocument& rDoc, sal_uInt16 nFileId);
59  virtual ~ScExternalRefLink() override;
60 
61  virtual void Closed() override;
62  virtual ::sfx2::SvBaseLink::UpdateResult DataChanged(
63  const OUString& rMimeType, const css::uno::Any & rValue) override;
64  virtual void Edit(weld::Window* pParent, const Link<SvBaseLink&,void>& rEndEditHdl) override;
65 
66  void SetDoRefresh(bool b);
67 
68 private:
69  ScExternalRefLink() = delete;
70  ScExternalRefLink(const ScExternalRefLink&) = delete;
71 
72  sal_uInt16 mnFileId;
75 };
76 
81 {
82 public:
83  typedef ::formula::FormulaTokenRef TokenRef;
84  typedef std::shared_ptr<ScTokenArray> TokenArrayRef;
85 
86  struct TableName
87  {
88  OUString maUpperName;
89  OUString maRealName;
90 
91  explicit TableName(const OUString& rUpper, const OUString& rReal);
92  };
93 
94  struct CellFormat
95  {
96  bool mbIsSet;
99 
100  explicit CellFormat();
101  };
102 
103 private:
105  struct Cell
106  {
107  TokenRef mxToken;
109  };
110  typedef std::unordered_map<SCCOL, Cell> RowDataType;
111  typedef std::unordered_map<SCROW, RowDataType> RowsDataType;
112 
113 public:
123  class Table
124  {
125  public:
126 
127  Table();
128  ~Table();
129 
130  void clear();
131 
139  SC_DLLPUBLIC void setCell(SCCOL nCol, SCROW nRow, TokenRef const & pToken, sal_uLong nFmtIndex = 0, bool bSetCacheRange = true);
140  SC_DLLPUBLIC TokenRef getCell(SCCOL nCol, SCROW nRow, sal_uInt32* pnFmtIndex = nullptr) const;
141  bool hasRow( SCROW nRow ) const;
144  void setReferenced( bool bReferenced );
145  bool isReferenced() const;
147  void getAllRows(::std::vector<SCROW>& rRows, SCROW nLow = 0, SCROW nHigh = MAXROW) const;
149  SC_DLLPUBLIC ::std::pair< SCROW, SCROW > getRowRange() const;
151  void getAllCols(SCROW nRow, ::std::vector<SCCOL>& rCols, SCCOL nLow = 0, SCCOL nHigh = MAXCOL) const;
153  SC_DLLPUBLIC ::std::pair< SCCOL, SCCOL > getColRange( SCROW nRow ) const;
154  void getAllNumberFormats(::std::vector<sal_uInt32>& rNumFmts) const;
155  bool isRangeCached(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2) const;
156 
157  void setCachedCell(SCCOL nCol, SCROW nRow);
158  void setCachedCellRange(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2);
159 
168  private:
169  bool isInCachedRanges(SCCOL nCol, SCROW nRow) const;
170  TokenRef getEmptyOrNullToken(SCCOL nCol, SCROW nRow) const;
171 
172  private:
174  RowsDataType maRows;
179  };
180 
181  typedef std::shared_ptr<Table> TableTypeRef;
182  typedef std::unordered_map< OUString, size_t>
184 
187 
188  const OUString* getRealTableName(sal_uInt16 nFileId, const OUString& rTabName) const;
189  const OUString* getRealRangeName(sal_uInt16 nFileId, const OUString& rRangeName) const;
190 
202  sal_uInt16 nFileId, const OUString& rTabName, SCCOL nCol, SCROW nRow, sal_uInt32* pnFmtIndex);
203 
212  sal_uInt16 nFileId, const OUString& rTabName, const ScRange& rRange);
213 
214  ScExternalRefCache::TokenArrayRef getRangeNameTokens(sal_uInt16 nFileId, const OUString& rName);
215  void setRangeNameTokens(sal_uInt16 nFileId, const OUString& rName, TokenArrayRef pArray);
216  bool isValidRangeName(sal_uInt16 nFileId, const OUString& rName) const;
217  void setRangeName(sal_uInt16 nFileId, const OUString& rName);
218 
219  void setCellData(sal_uInt16 nFileId, const OUString& rTabName,
220  SCCOL nCol, SCROW nRow, TokenRef const & pToken, sal_uLong nFmtIndex);
221 
223  {
225  OUString maTableName;
227  };
228  void setCellRangeData(sal_uInt16 nFileId, const ScRange& rRange, const ::std::vector<SingleRangeData>& rData,
229  const TokenArrayRef& pArray);
230 
231  bool isDocInitialized(sal_uInt16 nFileId);
232  void initializeDoc(sal_uInt16 nFileId, const ::std::vector<OUString>& rTabNames, const OUString& rBaseName);
233  OUString getTableName(sal_uInt16 nFileId, size_t nCacheId) const;
234  void getAllTableNames(sal_uInt16 nFileId, ::std::vector<OUString>& rTabNames) const;
235  SCTAB getTabSpan( sal_uInt16 nFileId, const OUString& rStartTabName, const OUString& rEndTabName ) const;
236  void getAllNumberFormats(::std::vector<sal_uInt32>& rNumFmts) const;
237 
243  bool setCacheDocReferenced( sal_uInt16 nFileId );
244 
249  bool setCacheTableReferenced( sal_uInt16 nFileId, const OUString& rTabName, size_t nSheets );
250  void setAllCacheTableReferencedStati( bool bReferenced );
252 
258  void getAllCachedDataSpans( const ScDocument& rSrcDoc, sal_uInt16 nFileId, sc::ColumnSpanSet& rSet ) const;
259 
260  bool getSrcDocTable( const ScDocument& rSrcDoc, const OUString& rTabName, SCTAB& rTab, sal_uInt16 nFileId ) const;
261 
262 private:
264  {
266  {
267  ::std::vector<bool> maTables;
269  // Initially, documents have no tables but all referenced.
270  DocReferenced() : mbAllTablesReferenced(true) {}
271  };
272  typedef ::std::vector<DocReferenced> DocReferencedVec;
273 
274  DocReferencedVec maDocs;
276 
278  void reset( size_t nDocs );
279  void checkAllDocs();
280 
281  } maReferenced;
282  void addCacheTableToReferenced( sal_uInt16 nFileId, size_t nIndex );
283  void addCacheDocToReferenced( sal_uInt16 nFileId );
284 public:
285 
286  ScExternalRefCache::TableTypeRef getCacheTable(sal_uInt16 nFileId, size_t nTabIndex) const;
287  ScExternalRefCache::TableTypeRef getCacheTable(sal_uInt16 nFileId, const OUString& rTabName, bool bCreateNew,
288  size_t* pnIndex, const OUString* pExtUrl);
289 
293  void clearCache(sal_uInt16 nFileId);
294 
299  void clearCacheTables(sal_uInt16 nFileId);
300 
301  // Get the fake doc used to pass to methods that need an ScDocument in order to do row/col validation
302  const ScDocument* getFakeDoc() const { return mxFakeDoc.get(); }
303 
304 private:
305  struct RangeHash
306  {
307  size_t operator()(const ScRange& rRange) const
308  {
309  const ScAddress& s = rRange.aStart;
310  const ScAddress& e = rRange.aEnd;
311  size_t hash = 17;
312  hash = hash * 37 + s.Tab();
313  hash = hash * 37 + s.Col();
314  hash = hash * 37 + s.Row();
315  hash = hash * 37 + e.Tab();
316  hash = hash * 37 + e.Col();
317  hash = hash * 37 + e.Row();
318  return hash;
319  }
320  };
321 
322  typedef std::unordered_map<OUString, TokenArrayRef> RangeNameMap;
323  typedef std::unordered_map<ScRange, TokenArrayRef, RangeHash> RangeArrayMap;
324  typedef std::unordered_map<OUString, OUString> NamePairMap;
325 
327  struct DocItem
328  {
330  ::std::vector<TableTypeRef> maTables;
332  ::std::vector<TableName> maTableNames;
336  RangeNameMap maRangeNames;
338  RangeArrayMap maRangeArrays;
340  NamePairMap maRealRangeNameMap;
341 
346 
348 
349  DocItem() : mbInitFromSource(false) {}
350 
351  TableNameIndexMap::const_iterator findTableNameIndex( const OUString& rTabName ) const;
352  bool getTableDataIndex( const OUString& rTabName, size_t& rIndex ) const;
353  bool getSingleTableNameAlternative( OUString& rTabName ) const;
354  };
355  typedef std::unordered_map<sal_uInt16, DocItem> DocDataType;
356  DocItem* getDocItem(sal_uInt16 nFileId) const;
357 
358 private:
359  mutable osl::Mutex maMtxDocs;
360  mutable DocDataType maDocs;
361  ScDocumentUniquePtr mxFakeDoc; // just to have something to pass to the methods that need to validate columns/rows
362 };
363 
365 {
366 public:
367 
368  typedef std::set<ScFormulaCell*> RefCellSet;
369  typedef std::unordered_map<sal_uInt16, RefCellSet> RefCellMap;
370 
371  enum LinkUpdateType { LINK_MODIFIED, LINK_BROKEN };
372 
378  class SAL_DLLPRIVATE LinkListener
379  {
380  public:
381  LinkListener();
382  virtual ~LinkListener() COVERITY_NOEXCEPT_FALSE = 0;
383  virtual void notify(sal_uInt16 nFileId, LinkUpdateType eType) = 0;
384  };
385 
392  {
393  public:
394  ApiGuard(const ScDocument& rDoc);
395  ~ApiGuard();
396  private:
399  };
400 
401 private:
403  struct SrcShell
404  {
407 
408  SrcShell() : maLastAccess( tools::Time::SYSTEM ) {}
409  };
410 
411  typedef std::unordered_map<sal_uInt16, SrcShell> DocShellMap;
412  typedef std::unordered_map<sal_uInt16, bool> LinkedDocMap;
413 
414  typedef std::unordered_map<sal_uInt16, SvNumberFormatterMergeMap> NumFmtMap;
415 
417  typedef std::unordered_map<sal_uInt16, LinkListeners> LinkListenerMap;
418 
419 public:
421  struct SAL_DLLPRIVATE SrcFileData
422  {
423  OUString maFileName;
424  OUString maRealFileName;
425  OUString maRelativeName;
426  OUString maFilterName;
427  OUString maFilterOptions;
428 
429  void maybeCreateRealFileName(const OUString& rOwnDocName);
430  };
431 
432 public:
433  explicit ScExternalRefManager(ScDocument& rDoc);
434  virtual ~ScExternalRefManager() override;
435 
436  virtual OUString getCacheTableName(sal_uInt16 nFileId, size_t nTabIndex) const override;
437 
448  ScExternalRefCache::TableTypeRef getCacheTable(sal_uInt16 nFileId, size_t nTabIndex) const;
449 
474  ScExternalRefCache::TableTypeRef getCacheTable(sal_uInt16 nFileId, const OUString& rTabName, bool bCreateNew,
475  size_t* pnIndex = nullptr, const OUString* pExtUrl = nullptr);
476 
483  void getAllCachedTableNames(sal_uInt16 nFileId, ::std::vector<OUString>& rTabNames) const;
484 
500  SCTAB getCachedTabSpan(
501  sal_uInt16 nFileId, const OUString& rStartTabName, const OUString& rEndTabName) const;
502 
509  void getAllCachedNumberFormats(::std::vector<sal_uInt32>& rNumFmts) const;
510 
511  sal_uInt16 getExternalFileCount() const;
512 
517  void markUsedByLinkListeners();
518 
519  void markUsedExternalRefCells();
520 
525  bool setCacheTableReferenced( sal_uInt16 nFileId, const OUString& rTabName, size_t nSheets );
526  void setAllCacheTableReferencedStati( bool bReferenced );
527 
532  bool isInReferenceMarking() const { return mbInReferenceMarking; }
533 
534  void storeRangeNameTokens(sal_uInt16 nFileId, const OUString& rName, const ScTokenArray& rArray);
535 
536  ScExternalRefCache::TokenRef getSingleRefToken(
537  sal_uInt16 nFileId, const OUString& rTabName, const ScAddress& rCell,
538  const ScAddress* pCurPos, SCTAB* pTab, ScExternalRefCache::CellFormat* pFmt = nullptr);
539 
553  ScExternalRefCache::TokenArrayRef getDoubleRefTokens(
554  sal_uInt16 nFileId, const OUString& rTabName, const ScRange& rRange, const ScAddress* pCurPos);
555 
567  ScExternalRefCache::TokenArrayRef getRangeNameTokens(
568  sal_uInt16 nFileId, const OUString& rName, const ScAddress* pCurPos = nullptr);
569 
570  bool isValidRangeName(sal_uInt16 nFileId, const OUString& rName);
571 
572  OUString getOwnDocumentName() const;
573  bool isOwnDocument(std::u16string_view rFile) const;
574 
581  void convertToAbsName(OUString& rFile) const;
582  sal_uInt16 getExternalFileId(const OUString& rFile);
583 
597  const OUString* getExternalFileName(sal_uInt16 nFileId, bool bForceOriginal = false);
598 
602  sal_uInt16 convertFileIdToUsedFileId(sal_uInt16 nFileId);
603  void setSkipUnusedFileIds(std::vector<sal_uInt16>& pExternFileIds);
604  void disableSkipUnusedFileIds();
605 
610  std::vector<OUString> getAllCachedExternalFileNames() const;
611 
612  bool hasExternalFile(sal_uInt16 nFileId) const;
613  bool hasExternalFile(const OUString& rFile) const;
614  const SrcFileData* getExternalFileData(sal_uInt16 nFileId) const;
615 
616  const OUString* getRealTableName(sal_uInt16 nFileId, const OUString& rTabName) const;
617  const OUString* getRealRangeName(sal_uInt16 nFileId, const OUString& rRangeName) const;
618  void clearCache(sal_uInt16 nFileId);
619  bool refreshSrcDocument(sal_uInt16 nFileId);
620  void breakLink(sal_uInt16 nFileId);
621  void switchSrcFile(sal_uInt16 nFileId, const OUString& rNewFile, const OUString& rNewFilter);
622 
630  void setRelativeFileName(sal_uInt16 nFileId, const OUString& rRelUrl);
631 
640  void setFilterData(sal_uInt16 nFileId, const OUString& rFilterName, const OUString& rOptions);
641 
642  void clear();
643 
644  bool hasExternalData() const;
645 
654  void resetSrcFileData(const OUString& rBaseFileUrl);
655 
659  void updateAbsAfterLoad();
660 
667  void removeRefCell(ScFormulaCell* pCell);
668 
674  void addLinkListener(sal_uInt16 nFileId, LinkListener* pListener);
675 
680  void removeLinkListener(sal_uInt16 nFileId, LinkListener* pListener);
681 
682  void removeLinkListener(LinkListener* pListener);
683 
690  void notifyAllLinkListeners(sal_uInt16 nFileId, LinkUpdateType eType);
691 
696  bool isFileLoadable(const OUString& rFile) const;
697 
698  virtual void Notify( SfxBroadcaster& rBC, const SfxHint& rHint ) override;
699 
705  bool containsUnsavedReferences() const { return !maUnsavedDocShells.empty(); }
706 
707  void insertRefCell(sal_uInt16 nFileId, const ScAddress& rCell);
711  void insertRefCellFromTemplate( ScFormulaCell* pTemplateCell, ScFormulaCell* pCell );
712 
713  bool hasCellExternalReference(const ScAddress& rCell);
714 
715  void enableDocTimer( bool bEnable );
716 
718  void addFilesToLinkManager();
719 
720 private:
722 
723  void refreshAllRefCells(sal_uInt16 nFileId);
724 
725  void fillCellFormat(sal_uLong nFmtIndex, ScExternalRefCache::CellFormat* pFmt) const;
726 
727  bool getSrcDocTable( const ScDocument& rSrcDoc, const OUString& rTabName, SCTAB& rTab, sal_uInt16 nFileId ) const;
728 
729  ScExternalRefCache::TokenRef getSingleRefTokenFromSrcDoc(
730  sal_uInt16 nFileId, ScDocument& rSrcDoc, const ScAddress& rPos,
732 
747  ScExternalRefCache::TokenArrayRef getDoubleRefTokensFromSrcDoc(
748  const ScDocument& rSrcDoc, const OUString& rTabName, ScRange& rRange,
749  ::std::vector<ScExternalRefCache::SingleRangeData>& rCacheData);
750 
763  static ScExternalRefCache::TokenArrayRef getRangeNameTokensFromSrcDoc(
764  sal_uInt16 nFileId, const ScDocument& rSrcDoc, OUString& rName);
765 
766  ScDocument* getInMemorySrcDocument(sal_uInt16 nFileId);
767  ScDocument* getSrcDocument(sal_uInt16 nFileId);
768  SfxObjectShellRef loadSrcDocument(sal_uInt16 nFileId, OUString& rFilter);
769 
773  ScDocument& cacheNewDocShell( sal_uInt16 nFileId, SrcShell& rSrcShell );
774 
775  void maybeLinkExternalFile( sal_uInt16 nFileId, bool bDeferFilterDetection = false );
776 
788  void maybeCreateRealFileName(sal_uInt16 nFileId);
789 
796  void purgeStaleSrcDocument(sal_Int32 nTimeOut);
797 
798  sal_uInt32 getMappedNumberFormat(sal_uInt16 nFileId, sal_uInt32 nNumFmt, const ScDocument& rSrcDoc);
799 
806  void transformUnsavedRefToSavedRef( SfxObjectShell* pShell );
807 
808 private:
810 
813 
818  DocShellMap maDocShells;
819 
824  DocShellMap maUnsavedDocShells;
825 
827  LinkedDocMap maLinkedDocs;
828 
833  RefCellMap maRefCells;
834 
835  LinkListenerMap maLinkListeners;
836 
837  NumFmtMap maNumFormatMap;
838 
843  std::vector<SrcFileData> maSrcFiles;
844 
846  bool mbInReferenceMarking:1;
847 
852  bool mbUserInteractionEnabled:1;
853 
854  bool mbSkipUnusedFileIds = false;
855  std::vector<sal_uInt16> maConvertFileIdToUsedFileId;
856 
857  bool mbDocTimerEnabled:1;
858 
860  DECL_LINK(TimeOutHdl, Timer*, void);
861 };
862 
863 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
std::unordered_map< sal_uInt16, SrcShell > DocShellMap
bool setCacheDocReferenced(sal_uInt16 nFileId)
Set all tables of a document as referenced, used only during store-to-file.
ScAddress aStart
Definition: address.hxx:499
SC_DLLPUBLIC void setCell(SCCOL nCol, SCROW nRow, TokenRef const &pToken, sal_uLong nFmtIndex=0, bool bSetCacheRange=true)
Add cell value to the cache.
void initializeDoc(sal_uInt16 nFileId, const ::std::vector< OUString > &rTabNames, const OUString &rBaseName)
std::unordered_map< sal_uInt16, SvNumberFormatterMergeMap > NumFmtMap
void getAllTableNames(sal_uInt16 nFileId,::std::vector< OUString > &rTabNames) const
SCROW Row() const
Definition: address.hxx:261
void clearCache(sal_uInt16 nFileId)
Clear all caches including the cache tables.
const OUString * getRealRangeName(sal_uInt16 nFileId, const OUString &rRangeName) const
bool setCacheTableReferenced(sal_uInt16 nFileId, const OUString &rTabName, size_t nSheets)
Set a table as referenced, used only during store-to-file.
std::set< ScFormulaCell * > RefCellSet
sal_uIntPtr sal_uLong
Source document meta-data container.
void getAllNumberFormats(::std::vector< sal_uInt32 > &rNumFmts) const
bool areAllCacheTablesReferenced() const
void setRangeNameTokens(sal_uInt16 nFileId, const OUString &rName, TokenArrayRef pArray)
SC_DLLPUBLIC void setWholeTableCached()
Call this to mark the entire table "cached".
ScAddress aEnd
Definition: address.hxx:500
std::unordered_map< sal_uInt16, RefCellSet > RefCellMap
Cache table for external reference data.
ScExternalRefManager * mpMgr
bool isValidRangeName(sal_uInt16 nFileId, const OUString &rName) const
bool isDocInitialized(sal_uInt16 nFileId)
TableNameIndexMap::const_iterator findTableNameIndex(const OUString &rTabName) const
void getAllCols(SCROW nRow,::std::vector< SCCOL > &rCols, SCCOL nLow=0, SCCOL nHigh=MAXCOL) const
Obtain a sorted vector of columns.
ScRangeList maCachedRanges
Collection of individual cached ranges.
ScExternalRefCache::TokenRef getCellData(sal_uInt16 nFileId, const OUString &rTabName, SCCOL nCol, SCROW nRow, sal_uInt32 *pnFmtIndex)
Get a cached cell data at specified cell location.
OUString maRealFileName
original file name as loaded from the file.
TableName(const OUString &rUpper, const OUString &rReal)
ScExternalRefCache::TokenArrayRef getCellRangeData(sal_uInt16 nFileId, const OUString &rTabName, const ScRange &rRange)
Get a cached cell range data.
std::unordered_map< SCROW, RowDataType > RowsDataType
ScExternalRefCache::TokenArrayRef getRangeNameTokens(sal_uInt16 nFileId, const OUString &rName)
const SCROW MAXROW
Definition: address.hxx:68
bool containsUnsavedReferences() const
If we still contain unsaved files we should warn the user before saving.
::boost::intrusive_ptr< ScMatrix > ScMatrixRef
Definition: types.hxx:25
SCTAB Tab() const
Definition: address.hxx:270
void setReferenced(bool bReferenced)
Set/clear referenced status flag only if current status is not REFERENCED_PERMANENT.
void setCellData(sal_uInt16 nFileId, const OUString &rTabName, SCCOL nCol, SCROW nRow, TokenRef const &pToken, sal_uLong nFmtIndex)
SC_DLLPUBLIC::std::pair< SCCOL, SCCOL > getColRange(SCROW nRow) const
Returns the half-open range of used columns in the specified row. Returns [0,0) if row is empty...
void getAllNumberFormats(::std::vector< sal_uInt32 > &rNumFmts) const
::std::vector< DocReferenced > DocReferencedVec
DocumentType eType
void getAllRows(::std::vector< SCROW > &rRows, SCROW nLow=0, SCROW nHigh=MAXROW) const
Obtain a sorted vector of rows.
struct ScExternalRefCache::ReferencedStatus maReferenced
SCTAB getTabSpan(sal_uInt16 nFileId, const OUString &rStartTabName, const OUString &rEndTabName) const
TokenRef getEmptyOrNullToken(SCCOL nCol, SCROW nRow) const
bool isRangeCached(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2) const
Base class for objects that need to listen to link updates.
SC_DLLPUBLIC TokenRef getCell(SCCOL nCol, SCROW nRow, sal_uInt32 *pnFmtIndex=nullptr) const
OUString maRelativeName
file name created from the relative name.
SC_DLLPUBLIC::std::pair< SCROW, SCROW > getRowRange() const
Returns the half-open range of used rows in this table. Returns [0,0) if table is empty...
void Notify(ScModelObj &rModelObj, const ScRangeList &rChangeRanges, const OUString &rType=OUString("cell-change"), const css::uno::Sequence< css::beans::PropertyValue > &rProperties=css::uno::Sequence< css::beans::PropertyValue >())
Definition: docsh.hxx:478
std::unique_ptr< ScDocument, o3tl::default_delete< ScDocument > > ScDocumentUniquePtr
Definition: document.hxx:2621
sal_Int16 SCCOL
Definition: types.hxx:21
const SCCOL MAXCOL
Definition: address.hxx:69
NamePairMap maRealRangeNameMap
Upper- to real-case mapping for range names.
void setCellRangeData(sal_uInt16 nFileId, const ScRange &rRange, const ::std::vector< SingleRangeData > &rData, const TokenArrayRef &pArray)
::std::vector< TableName > maTableNames
Table name list in correct order, in both upper- and real-case.
const OUString * getRealTableName(sal_uInt16 nFileId, const OUString &rTabName) const
bool isInReferenceMarking() const
Structure that stores segments of boolean flags per column, and perform custom action on those segmen...
std::unordered_map< OUString, OUString > NamePairMap
o3tl::sorted_vector< LinkListener * > LinkListeners
OUString maSingleTableNameAlias
Either the base name that was stored as sheet name for CSV files if sheet name is Sheet1...
::std::vector< TableTypeRef > maTables
The raw cache tables.
void clearCacheTables(sal_uInt16 nFileId)
Clear all caches but keep the tables.
SvNumFormatType
DocShellMap maUnsavedDocShells
DocShells to unsaved but referenced documents.
Represents a single cached table in an external document.
OUString maTableName
This name must be in upper-case.
Shell instance for a source document.
void getAllCachedDataSpans(const ScDocument &rSrcDoc, sal_uInt16 nFileId, sc::ColumnSpanSet &rSet) const
Collect all cached non-empty cell positions, inferred directly from the cached data, not the cached range metadata stored separately in the Table.
std::unordered_map< sal_uInt16, DocItem > DocDataType
LinkListenerMap maLinkListeners
ScExternalRefCache::TableTypeRef getCacheTable(sal_uInt16 nFileId, size_t nTabIndex) const
RefCellMap maRefCells
List of referencing cells that may contain external names.
SCCOL Col() const
Definition: address.hxx:266
std::vector< SrcFileData > maSrcFiles
List of external source document meta-data, used to keep track of external document identifiers...
individual cell within cached external ref table.
bool getSrcDocTable(const ScDocument &rSrcDoc, const OUString &rTabName, SCTAB &rTab, sal_uInt16 nFileId) const
::formula::FormulaTokenRef TokenRef
sal_Int32 SCROW
Definition: types.hxx:17
std::unordered_map< ScRange, TokenArrayRef, RangeHash > RangeArrayMap
void setRangeName(sal_uInt16 nFileId, const OUString &rName)
ScDocumentUniquePtr mxFakeDoc
size_t operator()(const ScRange &rRange) const
void setAllCacheTableReferencedStati(bool bReferenced)
OUString getTableName(sal_uInt16 nFileId, size_t nCacheId) const
const ScDocument * getFakeDoc() const
DocItem * getDocItem(sal_uInt16 nFileId) const
std::shared_ptr< ScTokenArray > TokenArrayRef
std::shared_ptr< Table > TableTypeRef
void setCachedCellRange(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2)
DocShellMap maDocShells
Source document cache.
bool hasRow(SCROW nRow) const
RowsDataType maRows
Data cache.
std::vector< sal_uInt16 > maConvertFileIdToUsedFileId
LinkedDocMap maLinkedDocs
list of source documents that are managed by the link manager.
bool getTableDataIndex(const OUString &rTabName, size_t &rIndex) const
std::unordered_map< sal_uInt16, bool > LinkedDocMap
std::unordered_map< OUString, size_t > TableNameIndexMap
std::unordered_map< OUString, TokenArrayRef > RangeNameMap
void addCacheDocToReferenced(sal_uInt16 nFileId)
ScExternalRefCache maRefCache
cache of referenced ranges and names from source documents.
bool isInCachedRanges(SCCOL nCol, SCROW nRow) const
void addCacheTableToReferenced(sal_uInt16 nFileId, size_t nIndex)
TableNameIndexMap maTableNameIndex
Table name to index map.
RangeArrayMap maRangeArrays
Token array cache for cell ranges.
RangeNameMap maRangeNames
Range name cache.
std::unordered_map< SCCOL, Cell > RowDataType
void setCachedCell(SCCOL nCol, SCROW nRow)
#define SC_DLLPUBLIC
Definition: scdllapi.h:27
sal_Int16 SCTAB
Definition: types.hxx:22
Use this guard when performing something from the API that might query values from external reference...
Represents data cached for a single external document.
bool getSingleTableNameAlternative(OUString &rTabName) const
std::unordered_map< sal_uInt16, LinkListeners > LinkListenerMap