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  */
10 
11 #pragma once
12 
13 #include <address.hxx>
14 #include <rangelst.hxx>
15 
16 #include <map>
17 #include <vector>
18 
19 class FormulaTemplate
20 {
21 private:
22     OUString            mTemplate;
23     ScDocument*         mpDoc;
24     bool                mbUse3D;
25 
26     typedef std::map<OUString, ScRange>   RangeReplacementMap;
27     typedef std::map<OUString, ScAddress> AddressReplacementMap;
28 
29     AddressReplacementMap mAddressReplacementMap;
30     RangeReplacementMap   mRangeReplacementMap;
31 
32 public:
33     FormulaTemplate(ScDocument* pDoc);
34 
35     void      setTemplate(const OUString& aTemplate);
36     void      setTemplate(const char* aTemplate);
37     const OUString& getTemplate();
38 
39     void      autoReplaceRange(const OUString& aVariable, const ScRange& rRange);
40     void      autoReplaceAddress(const OUString& aVariable, ScAddress const & aAddress);
autoReplaceUses3D(bool bUse3D)41     void      autoReplaceUses3D(bool bUse3D) { mbUse3D = bUse3D; }
42 
43     void      applyRange(std::u16string_view aVariable, const ScRange& aRange, bool b3D = true);
44     void      applyRangeList(std::u16string_view aVariable, const ScRangeList& aRangeList, sal_Unicode cDelimiter );
45     void      applyAddress(std::u16string_view aVariable, const ScAddress& aAddress, bool b3D = true);
46     void      applyString(std::u16string_view aVariable, std::u16string_view aValue);
47     void      applyNumber(std::u16string_view aVariable, sal_Int32 aValue);
48 };
49 
50 class AddressWalker
51 {
52 public:
53     std::vector<ScAddress> mAddressStack;
54 
55     ScAddress mCurrentAddress;
56     ScAddress mMinimumAddress;
57     ScAddress mMaximumAddress;
58 
59     AddressWalker(const ScAddress& aInitialAddress);
60 
61     ScAddress current(SCCOL aRelativeCol = 0, SCROW aRelativeRow = 0, SCTAB aRelativeTab = 0);
62 
63     void reset();
64     void resetColumn();
65     void resetRow();
66     void nextColumn();
67     void nextRow();
68     void newLine();
69     void push(SCCOL aRelativeCol = 0, SCROW aRelativeRow = 0, SCTAB aRelativeTab = 0);
70 };
71 
72 class AddressWalkerWriter : public AddressWalker
73 {
74 public:
75     ScDocShell*                         mpDocShell;
76     ScDocument&                         mrDocument;
77     formula::FormulaGrammar::Grammar    meGrammar;
78 
79     AddressWalkerWriter(const ScAddress& aInitialAddress, ScDocShell* pDocShell, ScDocument& rDocument,
80             formula::FormulaGrammar::Grammar eGrammar );
81 
82     void writeFormula(const OUString& aFormula);
83     void writeFormulas(const std::vector<OUString>& rFormulas);
84     void writeMatrixFormula(const OUString& aFormula, SCCOL nCols = 1, SCROW nRows = 1);
85     void writeString(const OUString& aString);
86     void writeString(const char* aCharArray);
87     void writeBoldString(const OUString& aString);
88     void writeValue(double aValue);
89 };
90 
91 class DataCellIterator final
92 {
93 private:
94     ScRange mInputRange;
95     bool    mByColumn;
96     SCCOL   mCol;
97     SCROW   mRow;
98 
99 public:
100     DataCellIterator(const ScRange& aInputRange, bool aByColumn);
101     ~DataCellIterator();
102 
103     bool hasNext() const;
104     ScAddress get();
105     void next();
106     ScAddress getRelative(int aDelta);
107 };
108 
109 class DataRangeIterator
110 {
111 protected:
112     ScRange   mInputRange;
113     sal_Int32 mIndex;
114 
115 public:
116     DataRangeIterator(const ScRange& aInputRange);
117     virtual ~DataRangeIterator();
118 
119     virtual bool hasNext() = 0;
120     virtual ScRange get() = 0;
121     virtual size_t size() = 0;
122     virtual void next() = 0;
123     virtual void reset() = 0;
124 
125     sal_Int32 index();
126 
127     virtual DataCellIterator iterateCells() = 0;
128 };
129 
130 class DataRangeByColumnIterator final : public DataRangeIterator
131 {
132     SCCOL mCol;
133 
134 public:
135     DataRangeByColumnIterator(const ScRange& aInputRange);
136 
137     virtual bool hasNext() override;
138     virtual void next() override;
139     virtual ScRange get() override;
140     virtual size_t size() override;
141     virtual void reset() override;
142     virtual DataCellIterator iterateCells() override;
143 };
144 
145 class DataRangeByRowIterator final : public DataRangeIterator
146 {
147     SCROW mRow;
148 
149 public:
150     DataRangeByRowIterator(const ScRange& aInputRange);
151 
152     virtual bool hasNext() override;
153     virtual void next() override;
154     virtual ScRange get() override;
155     virtual size_t size() override;
156     virtual void reset() override;
157     virtual DataCellIterator iterateCells() override;
158 };
159 
160 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
161