bump product version to 7.6.3.2-android
[LibreOffice.git] / sc / inc / conditio.hxx
blob47f5fdb3addb28ee803e8fccc2696c59c90df976
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3 * This file is part of the LibreOffice project.
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/.
9 * This file incorporates work covered by the following license notice:
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 .
20 #pragma once
22 #include <tools/solar.h>
23 #include <tools/color.hxx>
24 #include "address.hxx"
25 #include <formula/grammar.hxx>
26 #include "scdllapi.h"
27 #include "rangelst.hxx"
28 #include "tokenarray.hxx"
30 #include <svl/listener.hxx>
32 #include <com/sun/star/sheet/ConditionOperator.hpp>
34 #include <rtl/math.hxx>
35 #include <tools/date.hxx>
36 #include <tools/link.hxx>
38 #include <optional>
39 #include <map>
40 #include <memory>
41 #include <set>
43 class ScFormulaCell;
44 class ScTokenArray;
45 struct ScRefCellValue;
47 namespace sc {
49 struct RefUpdateContext;
50 struct RefUpdateInsertTabContext;
51 struct RefUpdateDeleteTabContext;
52 struct RefUpdateMoveTabContext;
56 // nOptions Flags
57 #define SC_COND_NOBLANKS 1
59 enum class ScConditionMode
61 Equal,
62 Less,
63 Greater,
64 EqLess,
65 EqGreater,
66 NotEqual,
67 Between,
68 NotBetween,
69 Duplicate,
70 NotDuplicate,
71 Direct,
72 Top10,
73 Bottom10,
74 TopPercent,
75 BottomPercent,
76 AboveAverage,
77 BelowAverage,
78 AboveEqualAverage,
79 BelowEqualAverage,
80 Error,
81 NoError,
82 BeginsWith,
83 EndsWith,
84 ContainsText,
85 NotContainsText,
86 NONE
89 // For use in SAL_DEBUG etc. Output format not guaranteed to be stable.
90 template<typename charT, typename traits>
91 inline std::basic_ostream<charT, traits> & operator <<(std::basic_ostream<charT, traits> & stream, const ScConditionMode& rMode)
93 switch (rMode)
95 case ScConditionMode::Equal:
96 stream << "EQUAL";
97 break;
98 case ScConditionMode::Less:
99 stream << "LESS";
100 break;
101 case ScConditionMode::Greater:
102 stream << "GREATER";
103 break;
104 case ScConditionMode::EqLess:
105 stream << "EQLESS";
106 break;
107 case ScConditionMode::EqGreater:
108 stream << "EQGREATER";
109 break;
110 case ScConditionMode::NotEqual:
111 stream << "NOTEQUAL";
112 break;
113 case ScConditionMode::Between:
114 stream << "BETWEEN";
115 break;
116 case ScConditionMode::NotBetween:
117 stream << "NOTBETWEEN";
118 break;
119 case ScConditionMode::Duplicate:
120 stream << "DUPLICATE";
121 break;
122 case ScConditionMode::NotDuplicate:
123 stream << "NOTDUPLICATE";
124 break;
125 case ScConditionMode::Direct:
126 stream << "DIRECT";
127 break;
128 case ScConditionMode::Top10:
129 stream << "TOP10";
130 break;
131 case ScConditionMode::Bottom10:
132 stream << "BOTTOM10";
133 break;
134 case ScConditionMode::TopPercent:
135 stream << "TOPPERCENT";
136 break;
137 case ScConditionMode::BottomPercent:
138 stream << "BOTTOMPERCENT";
139 break;
140 case ScConditionMode::AboveAverage:
141 stream << "ABOVEAVERAGE";
142 break;
143 case ScConditionMode::BelowAverage:
144 stream << "BELOWAVERAGE";
145 break;
146 case ScConditionMode::AboveEqualAverage:
147 stream << "ABOVEEQUALAVERAGE";
148 break;
149 case ScConditionMode::BelowEqualAverage:
150 stream << "BELOWEQUALAVERAGE";
151 break;
152 case ScConditionMode::Error:
153 stream << "ERROR";
154 break;
155 case ScConditionMode::NoError:
156 stream << "NOERROR";
157 break;
158 case ScConditionMode::BeginsWith:
159 stream << "BEGINSWITH";
160 break;
161 case ScConditionMode::EndsWith:
162 stream << "ENDSWITH";
163 break;
164 case ScConditionMode::ContainsText:
165 stream << "CONTAINSTEXT";
166 break;
167 case ScConditionMode::NotContainsText:
168 stream << "NOTCONTAINSTEXT";
169 break;
170 case ScConditionMode::NONE:
171 stream << "NONE";
172 break;
173 default:
174 stream << "?(" << static_cast<int>(rMode) << ")";
175 break;
178 return stream;
181 class ScFormulaListener final : public SvtListener
183 private:
184 mutable bool mbDirty;
185 ScDocument& mrDoc;
186 std::function<void()> maCallbackFunction;
188 void startListening(const ScTokenArray* pTokens, const ScRange& rPos);
189 void startListening(const ScRangeList& rPos);
191 public:
192 explicit ScFormulaListener(ScFormulaCell* pCell);
193 explicit ScFormulaListener(ScDocument& rDoc);
194 explicit ScFormulaListener(ScDocument& rDoc, const ScRangeList& rRange);
195 virtual ~ScFormulaListener() override;
197 void Notify( const SfxHint& rHint ) override;
199 bool NeedsRepaint() const;
201 void addTokenArray(const ScTokenArray* pTokens, const ScRange& rRange);
202 void stopListening();
203 void setCallback(const std::function<void()>& aCallbackFunction);
207 class ScConditionalFormat;
208 struct ScDataBarInfo;
209 struct ScIconSetInfo;
211 struct SC_DLLPUBLIC ScCondFormatData
213 ScCondFormatData();
214 ScCondFormatData(ScCondFormatData&&);
215 ~ScCondFormatData();
217 std::optional<Color> mxColorScale;
218 std::unique_ptr<ScDataBarInfo> pDataBar;
219 std::unique_ptr<ScIconSetInfo> pIconSet;
220 OUString aStyleName;
223 class SC_DLLPUBLIC ScFormatEntry
225 public:
226 ScFormatEntry(ScDocument* pDoc);
227 virtual ~ScFormatEntry() {}
229 enum class Type
231 Condition,
232 ExtCondition,
233 Colorscale,
234 Databar,
235 Iconset,
236 Date
239 virtual Type GetType() const = 0;
240 virtual void UpdateReference( sc::RefUpdateContext& rCxt ) = 0;
241 virtual void UpdateInsertTab( sc::RefUpdateInsertTabContext& rCxt ) = 0;
242 virtual void UpdateDeleteTab( sc::RefUpdateDeleteTabContext& rCxt ) = 0;
243 virtual void UpdateMoveTab( sc::RefUpdateMoveTabContext& rCxt ) = 0;
245 virtual ScFormatEntry* Clone( ScDocument* pDoc ) const = 0;
247 virtual void SetParent( ScConditionalFormat* pNew ) = 0;
249 bool operator==( const ScFormatEntry& ) const;
250 virtual bool IsEqual( const ScFormatEntry&, bool bIgnoreSrcPos ) const;
252 virtual void startRendering();
253 virtual void endRendering();
254 virtual void updateValues();
255 protected:
256 ScDocument* mpDoc;
260 template<typename charT, typename traits>
261 inline std::basic_ostream<charT, traits> & operator <<(std::basic_ostream<charT, traits> & stream, const ScFormatEntry::Type& rType)
263 switch (rType)
265 case ScFormatEntry::Type::Condition:
266 stream << "Condition";
267 break;
268 case ScFormatEntry::Type::ExtCondition:
269 stream << "ExtCondition";
270 break;
271 case ScFormatEntry::Type::Colorscale:
272 stream << "Colorscale";
273 break;
274 case ScFormatEntry::Type::Databar:
275 stream << "Databar";
276 break;
277 case ScFormatEntry::Type::Iconset:
278 stream << "Iconset";
279 break;
280 case ScFormatEntry::Type::Date:
281 stream << "Date";
282 break;
283 default:
284 stream << "?(" << static_cast<int>(rType) << ")";
285 break;
287 return stream;
290 class approx_less
292 public:
293 bool operator() (double nVal1, double nVal2) const
295 if(nVal1 < nVal2 && !rtl::math::approxEqual(nVal1, nVal2))
296 return true;
298 return false;
302 class SC_DLLPUBLIC ScConditionEntry : public ScFormatEntry
304 // stored data:
305 ScConditionMode eOp;
306 sal_uInt16 nOptions;
307 double nVal1; // input or calculated
308 double nVal2;
309 OUString aStrVal1; // input or calculated
310 OUString aStrVal2;
311 const OUString aStrNmsp1; // namespace to be used on (re)compilation, e.g. in XML import
312 const OUString aStrNmsp2; // namespace to be used on (re)compilation, e.g. in XML import
313 const formula::FormulaGrammar::Grammar eTempGrammar1; // grammar to be used on (re)compilation, e.g. in XML import
314 const formula::FormulaGrammar::Grammar eTempGrammar2; // grammar to be used on (re)compilation, e.g. in XML import
315 bool bIsStr1; // for recognition of empty strings
316 bool bIsStr2;
317 std::unique_ptr<ScTokenArray> pFormula1; // entered formula
318 std::unique_ptr<ScTokenArray> pFormula2;
319 ScAddress aSrcPos; // source position for formulas
320 // temporary data:
321 OUString aSrcString; // formula source position as text during XML import
322 std::unique_ptr<ScFormulaCell> pFCell1;
323 std::unique_ptr<ScFormulaCell> pFCell2;
324 bool bRelRef1;
325 bool bRelRef2;
326 bool bFirstRun;
327 std::unique_ptr<ScFormulaListener> mpListener;
328 Type eConditionType; //It can be Condition or ExtCondition
330 static void SimplifyCompiledFormula( std::unique_ptr<ScTokenArray>& rFormula,
331 double& rVal,
332 bool& rIsStr,
333 OUString& rStrVal );
335 void MakeCells( const ScAddress& rPos );
336 void Compile( const OUString& rExpr1, const OUString& rExpr2,
337 const OUString& rExprNmsp1, const OUString& rExprNmsp2,
338 formula::FormulaGrammar::Grammar eGrammar1,
339 formula::FormulaGrammar::Grammar eGrammar2,
340 bool bTextToReal );
341 void Interpret( const ScAddress& rPos );
343 bool IsValid( double nArg, const ScAddress& rPos ) const;
344 bool IsValidStr( const OUString& rArg, const ScAddress& rPos ) const;
345 void StartListening();
347 public:
348 ScConditionEntry( ScConditionMode eOper,
349 const OUString& rExpr1, const OUString& rExpr2,
350 ScDocument& rDocument, const ScAddress& rPos,
351 const OUString& rExprNmsp1, const OUString& rExprNmsp2,
352 formula::FormulaGrammar::Grammar eGrammar1,
353 formula::FormulaGrammar::Grammar eGrammar2,
354 Type eType = Type::Condition );
355 ScConditionEntry( ScConditionMode eOper,
356 const ScTokenArray* pArr1, const ScTokenArray* pArr2,
357 ScDocument& rDocument, const ScAddress& rPos );
358 ScConditionEntry( const ScConditionEntry& r ); // flat copy of formulas
359 // true copy of formulas (for Ref-Undo):
360 ScConditionEntry( ScDocument& rDocument, const ScConditionEntry& r );
361 virtual ~ScConditionEntry() override;
363 bool IsEqual( const ScFormatEntry& r, bool bIgnoreSrcPos ) const override;
365 virtual void SetParent( ScConditionalFormat* pNew ) override;
367 bool IsCellValid( ScRefCellValue& rCell, const ScAddress& rPos ) const;
369 ScConditionMode GetOperation() const { return eOp; }
370 void SetOperation(ScConditionMode eMode);
371 bool IsIgnoreBlank() const { return ( nOptions & SC_COND_NOBLANKS ) == 0; }
372 void SetIgnoreBlank(bool bSet);
373 const OUString& GetSrcString() const { return aSrcString; }
374 const ScAddress& GetSrcPos() const { return aSrcPos; }
376 ScAddress GetValidSrcPos() const; // adjusted to allow textual representation of expressions
378 void SetSrcString( const OUString& rNew ); // for XML import
380 void SetFormula1( const ScTokenArray& rArray );
381 void SetFormula2( const ScTokenArray& rArray );
383 OUString GetExpression( const ScAddress& rCursor, sal_uInt16 nPos, sal_uInt32 nNumFmt = 0,
384 const formula::FormulaGrammar::Grammar eGrammar = formula::FormulaGrammar::GRAM_DEFAULT ) const;
386 /** Create a flat copy using ScTokenArray copy-ctor with
387 shared tokens. */
388 std::unique_ptr<ScTokenArray> CreateFlatCopiedTokenArray( sal_uInt16 nPos ) const;
390 void CompileAll();
391 void CompileXML();
392 virtual void UpdateReference( sc::RefUpdateContext& rCxt ) override;
393 virtual void UpdateInsertTab( sc::RefUpdateInsertTabContext& rCxt ) override;
394 virtual void UpdateDeleteTab( sc::RefUpdateDeleteTabContext& rCxt ) override;
395 virtual void UpdateMoveTab( sc::RefUpdateMoveTabContext& rCxt ) override;
397 bool MarkUsedExternalReferences() const;
399 virtual Type GetType() const override { return eConditionType; }
401 virtual ScFormatEntry* Clone(ScDocument* pDoc) const override;
403 static ScConditionMode GetModeFromApi(css::sheet::ConditionOperator nOperator);
405 virtual void endRendering() override;
406 virtual void startRendering() override;
408 bool NeedsRepaint() const;
409 void CalcAll();
411 protected:
412 virtual void DataChanged() const;
413 ScDocument* GetDocument() const { return mpDoc; }
414 ScConditionalFormat* pCondFormat;
416 private:
418 bool IsDuplicate(double nArg, const OUString& rStr) const;
419 bool IsTopNElement( double nArg ) const;
420 bool IsTopNPercent( double nArg ) const;
421 bool IsBottomNElement( double nArg ) const;
422 bool IsBottomNPercent( double nArg ) const;
423 bool IsAboveAverage( double nArg, bool bEqual ) const;
424 bool IsBelowAverage( double nArg, bool bEqual ) const;
426 bool IsError( const ScAddress& rPos ) const;
428 void FillCache() const;
430 struct ScConditionEntryCache
432 typedef std::map<OUString, sal_Int32> StringCacheType;
433 StringCacheType maStrings;
434 typedef std::map<double, sal_Int32, approx_less> ValueCacheType;
435 ValueCacheType maValues;
437 // cache them for easier access
438 size_t nValueItems;
440 ScConditionEntryCache():
441 nValueItems(0) {}
444 mutable std::unique_ptr<ScConditionEntryCache> mpCache;
447 // single condition entry for conditional formatting
448 class SC_DLLPUBLIC ScCondFormatEntry final : public ScConditionEntry
450 OUString aStyleName;
451 Type eCondFormatType = Type::Condition;
453 public:
454 ScCondFormatEntry( ScConditionMode eOper,
455 const OUString& rExpr1, const OUString& rExpr2,
456 ScDocument& rDocument, const ScAddress& rPos,
457 OUString aStyle,
458 const OUString& rExprNmsp1 = OUString(),
459 const OUString& rExprNmsp2 = OUString(),
460 formula::FormulaGrammar::Grammar eGrammar1 = formula::FormulaGrammar::GRAM_DEFAULT,
461 formula::FormulaGrammar::Grammar eGrammar2 = formula::FormulaGrammar::GRAM_DEFAULT,
462 Type eType = Type::Condition);
463 ScCondFormatEntry( ScConditionMode eOper,
464 const ScTokenArray* pArr1, const ScTokenArray* pArr2,
465 ScDocument& rDocument, const ScAddress& rPos,
466 OUString aStyle );
467 ScCondFormatEntry( const ScCondFormatEntry& r );
468 ScCondFormatEntry( ScDocument& rDocument, const ScCondFormatEntry& r );
469 virtual ~ScCondFormatEntry() override;
471 bool IsEqual( const ScFormatEntry& r, bool bIgnoreSrcPos ) const override;
473 const OUString& GetStyle() const { return aStyleName; }
474 void UpdateStyleName(const OUString& rNew) { aStyleName=rNew; }
475 virtual ScFormatEntry* Clone(ScDocument* pDoc) const override;
476 virtual Type GetType() const override { return eCondFormatType; }
478 private:
479 virtual void DataChanged() const override;
482 namespace condformat {
484 enum ScCondFormatDateType
486 TODAY,
487 YESTERDAY,
488 TOMORROW,
489 LAST7DAYS,
490 THISWEEK,
491 LASTWEEK,
492 NEXTWEEK,
493 THISMONTH,
494 LASTMONTH,
495 NEXTMONTH,
496 THISYEAR,
497 LASTYEAR,
498 NEXTYEAR
503 class SC_DLLPUBLIC ScCondDateFormatEntry final : public ScFormatEntry
505 public:
506 ScCondDateFormatEntry(ScDocument* pDoc);
507 ScCondDateFormatEntry(ScDocument* pDoc, const ScCondDateFormatEntry& rEntry);
509 bool IsValid( const ScAddress& rPos ) const;
511 void SetDateType(condformat::ScCondFormatDateType eType);
512 condformat::ScCondFormatDateType GetDateType() const { return meType;}
514 const OUString& GetStyleName() const { return maStyleName;}
515 void SetStyleName( const OUString& rStyleName );
517 virtual Type GetType() const override { return Type::Date; }
518 virtual void UpdateReference( sc::RefUpdateContext& ) override {}
519 virtual void UpdateInsertTab( sc::RefUpdateInsertTabContext& ) override {}
520 virtual void UpdateDeleteTab( sc::RefUpdateDeleteTabContext& ) override {}
521 virtual void UpdateMoveTab( sc::RefUpdateMoveTabContext& ) override {}
523 virtual ScFormatEntry* Clone( ScDocument* pDoc ) const override;
525 virtual void SetParent( ScConditionalFormat* ) override {}
527 virtual void startRendering() override;
528 virtual void endRendering() override;
530 private:
531 condformat::ScCondFormatDateType meType;
533 mutable std::unique_ptr<Date> mpCache;
535 OUString maStyleName;
538 // complete conditional formatting
539 class SC_DLLPUBLIC ScConditionalFormat
541 ScDocument* pDoc;
542 sal_uInt32 nKey; // Index in attributes
544 std::vector<std::unique_ptr<ScFormatEntry>> maEntries;
545 ScRangeList maRanges; // Ranges for conditional format
547 public:
548 ScConditionalFormat(sal_uInt32 nNewKey, ScDocument* pDocument);
549 ~ScConditionalFormat();
550 ScConditionalFormat(const ScConditionalFormat&) = delete;
551 const ScConditionalFormat& operator=(const ScConditionalFormat&) = delete;
553 // true copy of formulas (for Ref-Undo / between documents)
554 std::unique_ptr<ScConditionalFormat> Clone(ScDocument* pNewDoc = nullptr) const;
556 void AddEntry( ScFormatEntry* pNew );
557 void RemoveEntry(size_t nIndex);
558 void SetRange( const ScRangeList& rRanges );
559 const ScRangeList& GetRange() const { return maRanges; }
560 // don't use the same name as for the const version
561 ScRangeList& GetRangeList() { return maRanges; }
563 bool IsEmpty() const;
564 size_t size() const;
566 ScDocument* GetDocument();
568 void CompileAll();
569 void CompileXML();
570 void UpdateReference( sc::RefUpdateContext& rCxt, bool bCopyAsMove = false );
571 void UpdateInsertTab( sc::RefUpdateInsertTabContext& rCxt );
572 void UpdateDeleteTab( sc::RefUpdateDeleteTabContext& rCxt );
573 void UpdateMoveTab( sc::RefUpdateMoveTabContext& rCxt );
575 void InsertRow(SCTAB nTab, SCCOL nColStart, SCCOL nColEnd, SCROW nRowStart, SCSIZE nSize);
576 void InsertCol(SCTAB nTab, SCROW nRowStart, SCROW nRowEnd, SCCOL nColStart, SCSIZE nSize);
578 void DeleteArea( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2 );
579 void RenameCellStyle( std::u16string_view rOld, const OUString& rNew );
581 const ScFormatEntry* GetEntry( sal_uInt16 nPos ) const;
583 OUString GetCellStyle( ScRefCellValue& rCell, const ScAddress& rPos ) const;
585 ScCondFormatData GetData( ScRefCellValue& rCell, const ScAddress& rPos ) const;
587 bool EqualEntries( const ScConditionalFormat& r, bool bIgnoreSrcPos = false ) const;
589 void DoRepaint();
591 sal_uInt32 GetKey() const { return nKey; }
592 void SetKey(sal_uInt32 nNew) { nKey = nNew; } // only if not inserted!
594 bool MarkUsedExternalReferences() const;
596 // sorted (via std::set) by Index
597 bool operator < ( const ScConditionalFormat& r ) const { return nKey < r.nKey; }
599 void startRendering();
600 void endRendering();
602 void updateValues();
604 // Forced recalculation for formulas
605 void CalcAll();
608 struct CompareScConditionalFormat
610 using is_transparent = void;
611 bool operator()(std::unique_ptr<ScConditionalFormat> const& lhs,
612 std::unique_ptr<ScConditionalFormat> const& rhs) const
614 return (*lhs) < (*rhs);
616 bool operator()(sal_uInt32 nKey, std::unique_ptr<ScConditionalFormat> const& rpFormat) const
618 return nKey < rpFormat->GetKey();
620 bool operator()(std::unique_ptr<ScConditionalFormat> const& rpFormat, sal_uInt32 nKey) const
622 return rpFormat->GetKey() < nKey;
626 // List of all conditional formats in a sheet
627 class SC_DLLPUBLIC ScConditionalFormatList
629 private:
630 typedef std::set<std::unique_ptr<ScConditionalFormat>,
631 CompareScConditionalFormat> ConditionalFormatContainer;
632 ConditionalFormatContainer m_ConditionalFormats;
634 void operator =(ScConditionalFormatList const &) = delete;
636 public:
637 ScConditionalFormatList() {}
638 ScConditionalFormatList(const ScConditionalFormatList& rList);
639 ScConditionalFormatList(ScDocument& rDoc, const ScConditionalFormatList& rList);
641 void InsertNew( std::unique_ptr<ScConditionalFormat> pNew );
644 * Checks that all cond formats have a non empty range.
645 * Deletes empty cond formats. Optionally call rLink
646 * on the empty format before deleting it.
647 * @return true if all cond formats were valid
649 bool CheckAllEntries(const Link<ScConditionalFormat*,void>& rLink = Link<ScConditionalFormat*,void>());
651 ScConditionalFormat* GetFormat( sal_uInt32 nKey );
652 const ScConditionalFormat* GetFormat( sal_uInt32 nKey ) const;
654 void CompileAll();
655 void CompileXML();
656 void UpdateReference( sc::RefUpdateContext& rCxt );
657 void UpdateInsertTab( sc::RefUpdateInsertTabContext& rCxt );
658 void UpdateDeleteTab( sc::RefUpdateDeleteTabContext& rCxt );
659 void UpdateMoveTab( sc::RefUpdateMoveTabContext& rCxt );
661 void InsertRow(SCTAB nTab, SCCOL nColStart, SCCOL nColEnd, SCROW nRowStart, SCSIZE nSize);
662 void InsertCol(SCTAB nTab, SCROW nRowStart, SCROW nRowEnd, SCCOL nColStart, SCSIZE nSize);
664 void RenameCellStyle( std::u16string_view rOld, const OUString& rNew );
665 void DeleteArea( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2 );
667 typedef ConditionalFormatContainer::iterator iterator;
668 typedef ConditionalFormatContainer::const_iterator const_iterator;
670 ScRangeList GetCombinedRange() const;
672 void RemoveFromDocument(ScDocument& rDoc) const;
673 void AddToDocument(ScDocument& rDoc) const;
675 iterator begin();
676 const_iterator begin() const;
677 iterator end();
678 const_iterator end() const;
680 size_t size() const;
681 bool empty() const;
683 void erase(sal_uLong nIndex);
684 void clear();
686 void startRendering();
687 void endRendering();
689 void updateValues();
691 sal_uInt32 getMaxKey() const;
693 /// Forced recalculation of formulas
694 void CalcAll();
697 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */