NanoXLSX.Core 3.2.1
Loading...
Searching...
No Matches
FeatureSet.cs
1namespace NanoXLSX.Internal
2{
7 internal sealed class FeatureSet
8 {
12 private enum FeatureSetType
13 {
15 Aggregate,
17 Formula,
19 DefinedName
20 }
21
22 private FeatureSetType type;
23 private FeatureSet parent;
24
28 internal int FormulaCount { get; private set; }
29
33 internal int DefinedNameCount { get; private set; }
34
38 internal int DefinedNameFormulaCount { get; private set; }
39
44 internal int DefinedNameReferenceFormulaCount { get; private set; }
45
49 internal int WorksheetFormulaCount
50 {
51 get
52 {
53 return FormulaCount - DefinedNameFormulaCount;
54 }
55 }
56
60 internal int ExternalLinkCount { get; private set; }
61
65 internal bool ContainsFormulas => FormulaCount > 0;
69 internal bool ContainsDefinedNames => DefinedNameCount > 0;
73 internal bool ContainsDefinedNameFormulas => DefinedNameFormulaCount > 0;
77 internal bool ContainsDefinedNameReferences => DefinedNameReferenceFormulaCount > 0;
81 internal bool ContainsWorksheetFormulas => WorksheetFormulaCount > 0;
85 internal bool ContainsExternalLinks => ExternalLinkCount > 0;
86
87
91 internal static FeatureSet CreateFormula()
92 {
93 return new FeatureSet(FeatureSetType.Formula);
94 }
95
100 internal static FeatureSet CreateDefinedName()
101 {
102 return new FeatureSet(FeatureSetType.DefinedName);
103 }
107 internal FeatureSet()
108 {
109 type = FeatureSetType.Aggregate;
110 }
111
116 private FeatureSet(FeatureSetType type)
117 {
118 this.type = type;
119 if (type == FeatureSetType.Formula)
120 {
121 FormulaCount = 1;
122 }
123 else if (type == FeatureSetType.DefinedName)
124 {
125 DefinedNameCount = 1;
126 }
127 }
128
133 internal void Add(FeatureSet parent)
134 {
135 parent.ApplyDelta(
136 FormulaCount,
137 DefinedNameCount,
138 DefinedNameFormulaCount,
139 DefinedNameReferenceFormulaCount,
140 ExternalLinkCount);
141
142 this.parent = parent;
143 }
144
150 internal void Remove(FeatureSet parent)
151 {
152 parent.ApplyDelta(
153 -FormulaCount,
154 -DefinedNameCount,
155 -DefinedNameFormulaCount,
156 -DefinedNameReferenceFormulaCount,
157 -ExternalLinkCount);
158
159 this.parent = null;
160 }
161
167 internal void SetFormulaFeatures(bool containsDefinedName, bool containsExternalLink)
168 {
169 int newDefinedNameReferenceFormulaCount = containsDefinedName ? 1 : 0;
170 int newExternalLinkCount = containsExternalLink ? 1 : 0;
171
172 int definedNameReferenceFormulaDelta =
173 newDefinedNameReferenceFormulaCount - DefinedNameReferenceFormulaCount;
174
175 int externalLinkDelta =
176 newExternalLinkCount - ExternalLinkCount;
177
178 if (definedNameReferenceFormulaDelta == 0 && externalLinkDelta == 0)
179 {
180 return;
181 }
182
183 if (parent != null)
184 {
185 parent.ApplyDelta(
186 0,
187 0,
188 0,
189 definedNameReferenceFormulaDelta,
190 externalLinkDelta);
191 }
192
193 DefinedNameReferenceFormulaCount = newDefinedNameReferenceFormulaCount;
194 ExternalLinkCount = newExternalLinkCount;
195 }
196
202 internal void SetDefinedNameFeatures(bool isFormula, bool containsExternalLink)
203 {
204 int newFormulaCount = isFormula ? 1 : 0;
205 int formulaDelta = newFormulaCount - FormulaCount;
206
207 int newDefinedNameFormulaCount = isFormula ? 1 : 0;
208 int definedNameFormulaDelta = newDefinedNameFormulaCount - DefinedNameFormulaCount;
209
210 int newExternalLinkCount = containsExternalLink ? 1 : 0;
211 int externalLinkDelta = newExternalLinkCount - ExternalLinkCount;
212
213 if (externalLinkDelta == 0 && formulaDelta == 0 && definedNameFormulaDelta == 0)
214 {
215 return;
216 }
217
218 if (parent != null)
219 {
220 parent.ApplyDelta(formulaDelta, 0, definedNameFormulaDelta, 0, externalLinkDelta);
221 }
222
223 FormulaCount = newFormulaCount;
224 DefinedNameFormulaCount = newDefinedNameFormulaCount;
225 ExternalLinkCount = newExternalLinkCount;
226 }
227
236 private void ApplyDelta(
237 int formulaDelta,
238 int definedNameDelta,
239 int definedNameFormulaDelta,
240 int definedNameReferenceFormulaDelta,
241 int externalLinkDelta)
242 {
243 FormulaCount += formulaDelta;
244 DefinedNameCount += definedNameDelta;
245 DefinedNameFormulaCount += definedNameFormulaDelta;
246 DefinedNameReferenceFormulaCount += definedNameReferenceFormulaDelta;
247 ExternalLinkCount += externalLinkDelta;
248
249 if (parent != null)
250 {
251 parent.ApplyDelta(
252 formulaDelta,
253 definedNameDelta,
254 definedNameFormulaDelta,
255 definedNameReferenceFormulaDelta,
256 externalLinkDelta);
257 }
258 }
259
265 internal FeatureSet Copy()
266 {
267 FeatureSet copy = new FeatureSet(type)
268 {
269 FormulaCount = FormulaCount,
270 DefinedNameCount = DefinedNameCount,
271 DefinedNameFormulaCount = DefinedNameFormulaCount,
272 DefinedNameReferenceFormulaCount = DefinedNameReferenceFormulaCount,
273 ExternalLinkCount = ExternalLinkCount
274 };
275
276 return copy;
277 }
278 }
279}