1 | /* This file is part of the KDE project |
2 | |
3 | Copyright 2004 Laurent Montel <montel@kde.org> |
4 | |
5 | This library is free software; you can redistribute it and/or |
6 | modify it under the terms of the GNU Library General Public |
7 | License as published by the Free Software Foundation; either |
8 | version 2 of the License, or (at your option) any later version. |
9 | |
10 | This library is distributed in the hope that it will be useful, |
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
13 | Library General Public License for more details. |
14 | |
15 | You should have received a copy of the GNU Library General Public License |
16 | along with this library; see the file COPYING.LIB. If not, write to |
17 | the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, |
18 | Boston, MA 02110-1301, USA. |
19 | */ |
20 | |
21 | // Local |
22 | #include "GenValidationStyle.h" |
23 | |
24 | // Calligra |
25 | #include <KoXmlWriter.h> |
26 | |
27 | // KSpread |
28 | #include "Validity.h" |
29 | #include "ValueConverter.h" |
30 | |
31 | using namespace Calligra::Sheets; |
32 | |
33 | GenValidationStyles::GenValidationStyles() |
34 | { |
35 | |
36 | } |
37 | |
38 | GenValidationStyles::~GenValidationStyles() |
39 | { |
40 | |
41 | } |
42 | |
43 | QString GenValidationStyles::insert(const GenValidationStyle& style) |
44 | { |
45 | StyleMap::iterator it = m_styles.find(style); |
46 | if (it == m_styles.end()) { |
47 | |
48 | QString styleName("val" ); |
49 | styleName = makeUniqueName(styleName); |
50 | m_names.insert(styleName, true); |
51 | it = m_styles.insert(style, styleName); |
52 | } |
53 | return it.value(); |
54 | } |
55 | |
56 | QString GenValidationStyles::makeUniqueName(const QString& base) const |
57 | { |
58 | int num = 1; |
59 | QString name; |
60 | do { |
61 | name = base; |
62 | name += QString::number(num++); |
63 | } while (m_names.find(name) != m_names.end()); |
64 | return name; |
65 | } |
66 | |
67 | void GenValidationStyles::writeStyle(KoXmlWriter& writer) |
68 | { |
69 | if (m_styles.count() > 0) { |
70 | writer.startElement("table:content-validations" ); |
71 | StyleMap::Iterator it; |
72 | for (it = m_styles.begin(); it != m_styles.end(); ++it) { |
73 | writer.startElement("table:content-validation" ); |
74 | writer.addAttribute("table:name" , it.value()); |
75 | writer.addAttribute("table:allow-empty-cell" , it.key().allowEmptyCell); |
76 | writer.addAttribute("table:condition" , it.key().condition); |
77 | |
78 | writer.startElement("table:help-message" ); |
79 | writer.addAttribute("table:title" , it.key().title); |
80 | writer.addAttribute("table:display" , it.key().displayValidationInformation); |
81 | |
82 | QStringList text = it.key().messageInfo.split('\n', QString::SkipEmptyParts); |
83 | for (QStringList::Iterator it2 = text.begin(); it2 != text.end(); ++it2) { |
84 | writer.startElement("text:p" ); |
85 | writer.addTextNode(*it2); |
86 | writer.endElement(); |
87 | } |
88 | writer.endElement(); |
89 | |
90 | writer.startElement("table:error-message" ); |
91 | writer.addAttribute("table:message-type" , it.key().messageType); |
92 | |
93 | writer.addAttribute("table:title" , it.key().titleInfo); |
94 | writer.addAttribute("table:display" , it.key().displayMessage); |
95 | text = it.key().message.split('\n', QString::SkipEmptyParts); |
96 | for (QStringList::Iterator it3 = text.begin(); it3 != text.end(); ++it3) { |
97 | writer.startElement("text:p" ); |
98 | writer.addTextNode(*it3); |
99 | writer.endElement(); |
100 | } |
101 | writer.endElement(); |
102 | |
103 | writer.endElement(); |
104 | } |
105 | writer.endElement();//close sheet:content-validation |
106 | } |
107 | } |
108 | |
109 | void GenValidationStyle::initVal(Validity *validity, const ValueConverter *converter) |
110 | { |
111 | if (validity) { |
112 | allowEmptyCell = (validity->allowEmptyCell() ? "true" : "false" ); |
113 | condition = createValidationCondition(validity, converter); |
114 | title = validity->title(); |
115 | displayValidationInformation = (validity->displayValidationInformation() ? "true" : "false" ); |
116 | messageInfo = validity->messageInfo(); |
117 | |
118 | switch (validity->action()) { |
119 | case Validity::Warning: |
120 | messageType = "warning" ; |
121 | break; |
122 | case Validity::Information: |
123 | messageType = "information" ; |
124 | break; |
125 | case Validity::Stop: |
126 | messageType = "stop" ; |
127 | break; |
128 | } |
129 | |
130 | titleInfo = validity->titleInfo(); |
131 | displayMessage = (validity->displayMessage() ? "true" : "false" ); |
132 | message = validity->message(); |
133 | } |
134 | } |
135 | |
136 | QString GenValidationStyle::createValidationCondition(Validity* validity, const ValueConverter *converter) |
137 | { |
138 | QString result; |
139 | switch (validity->restriction()) { |
140 | case Validity::None: |
141 | //nothing |
142 | break; |
143 | case Validity::Text: |
144 | //doesn't exist into oo spec |
145 | result = "cell-content-is-text()" ; |
146 | break; |
147 | case Validity::Time: |
148 | result = createTimeValidationCondition(validity, converter); |
149 | break; |
150 | case Validity::Date: |
151 | result = createDateValidationCondition(validity, converter); |
152 | break; |
153 | case Validity::Integer: |
154 | case Validity::Number: |
155 | result = createNumberValidationCondition(validity); |
156 | break; |
157 | case Validity::TextLength: |
158 | result = createTextValidationCondition(validity); |
159 | break; |
160 | case Validity::List: |
161 | result = createListValidationCondition(validity); |
162 | break; |
163 | } |
164 | return result; |
165 | } |
166 | |
167 | QString GenValidationStyle::createListValidationCondition(Validity* validity) |
168 | { |
169 | QString result = |
170 | "oooc:cell-content-is-in-list(" + |
171 | validity->validityList().join(";" ) + |
172 | ')'; |
173 | return result; |
174 | } |
175 | |
176 | QString GenValidationStyle::createNumberValidationCondition(Validity* validity) |
177 | { |
178 | QString result; |
179 | if (validity->restriction() == Validity::Number) |
180 | result = "oooc:cell-content-is-whole-number() and " ; |
181 | else if (validity->restriction() == Validity::Integer) |
182 | result = "oooc:cell-content-is-decimal-number() and " ; |
183 | switch (validity->condition()) { |
184 | case Conditional::None: |
185 | case Conditional::IsTrueFormula: |
186 | //nothing |
187 | break; |
188 | case Conditional::Equal: |
189 | result += "cell-content()" |
190 | "=" + |
191 | QString::number((double)numToDouble(validity->minimumValue().asFloat())); |
192 | break; |
193 | case Conditional::Superior: |
194 | result += "cell-content()" |
195 | ">" + |
196 | QString::number((double)numToDouble(validity->minimumValue().asFloat())); |
197 | break; |
198 | case Conditional::Inferior: |
199 | result += "cell-content()" |
200 | "<" + |
201 | QString::number((double)numToDouble(validity->minimumValue().asFloat())); |
202 | break; |
203 | case Conditional::SuperiorEqual: |
204 | result += "cell-content()" |
205 | ">=" + |
206 | QString::number((double)numToDouble(validity->minimumValue().asFloat())); |
207 | break; |
208 | case Conditional::InferiorEqual: |
209 | result += "cell-content()" |
210 | "<=" + |
211 | QString::number((double)numToDouble(validity->minimumValue().asFloat())); |
212 | break; |
213 | case Conditional::Different: |
214 | result += "cell-content()" |
215 | "!=" + |
216 | QString::number((double)numToDouble(validity->minimumValue().asFloat())); |
217 | break; |
218 | case Conditional::Between: |
219 | result += "cell-content-is-between(" + |
220 | QString::number((double)numToDouble(validity->minimumValue().asFloat())) + |
221 | ',' + |
222 | QString::number((double)numToDouble(validity->maximumValue().asFloat())) + |
223 | ')'; |
224 | break; |
225 | case Conditional::DifferentTo: |
226 | result += "cell-content-is-not-between(" + |
227 | QString::number((double)numToDouble(validity->minimumValue().asFloat())) + |
228 | ',' + |
229 | QString::number((double)numToDouble(validity->maximumValue().asFloat())) + |
230 | ')'; |
231 | break; |
232 | } |
233 | return result; |
234 | } |
235 | |
236 | |
237 | QString GenValidationStyle::createTimeValidationCondition(Validity* validity, const ValueConverter *converter) |
238 | { |
239 | QString result("oooc:cell-content-is-time() and " ); |
240 | switch (validity->condition()) { |
241 | case Conditional::None: |
242 | case Conditional::IsTrueFormula: |
243 | //nothing |
244 | break; |
245 | case Conditional::Equal: |
246 | result += "cell-content()" |
247 | "=" + |
248 | converter->asString(validity->minimumValue()).asString(); |
249 | break; |
250 | case Conditional::Superior: |
251 | result += "cell-content()" |
252 | ">" + |
253 | converter->asString(validity->minimumValue()).asString(); |
254 | break; |
255 | case Conditional::Inferior: |
256 | result += "cell-content()" |
257 | "<" + |
258 | converter->asString(validity->minimumValue()).asString(); |
259 | break; |
260 | case Conditional::SuperiorEqual: |
261 | result += "cell-content()" |
262 | ">=" + |
263 | converter->asString(validity->minimumValue()).asString(); |
264 | break; |
265 | case Conditional::InferiorEqual: |
266 | result += "cell-content()" |
267 | "<=" + |
268 | converter->asString(validity->minimumValue()).asString(); |
269 | break; |
270 | case Conditional::Different: |
271 | result += "cell-content()" |
272 | "!=" + |
273 | converter->asString(validity->minimumValue()).asString(); |
274 | break; |
275 | case Conditional::Between: |
276 | result += "cell-content-is-between(" + |
277 | converter->asString(validity->minimumValue()).asString() + |
278 | ',' + |
279 | converter->asString(validity->maximumValue()).asString() + |
280 | ')'; |
281 | break; |
282 | case Conditional::DifferentTo: |
283 | result += "cell-content-is-not-between(" + |
284 | converter->asString(validity->minimumValue()).asString() + |
285 | ',' + |
286 | converter->asString(validity->maximumValue()).asString() + |
287 | ')'; |
288 | break; |
289 | } |
290 | return result; |
291 | } |
292 | |
293 | QString GenValidationStyle::createDateValidationCondition(Validity* validity, const ValueConverter *converter) |
294 | { |
295 | QString result("oooc:cell-content-is-date() and " ); |
296 | switch (validity->condition()) { |
297 | case Conditional::None: |
298 | case Conditional::IsTrueFormula: |
299 | //nothing |
300 | break; |
301 | case Conditional::Equal: |
302 | result += "cell-content()" |
303 | "=" + |
304 | converter->asString(validity->minimumValue()).asString(); |
305 | break; |
306 | case Conditional::Superior: |
307 | result += "cell-content()" |
308 | ">" + |
309 | converter->asString(validity->minimumValue()).asString(); |
310 | break; |
311 | case Conditional::Inferior: |
312 | result += "cell-content()" |
313 | "<" + |
314 | converter->asString(validity->minimumValue()).asString(); |
315 | break; |
316 | case Conditional::SuperiorEqual: |
317 | result += "cell-content()" |
318 | ">=" + |
319 | converter->asString(validity->minimumValue()).asString(); |
320 | break; |
321 | case Conditional::InferiorEqual: |
322 | result += "cell-content()" |
323 | "<=" + |
324 | converter->asString(validity->minimumValue()).asString(); |
325 | break; |
326 | case Conditional::Different: |
327 | result += "cell-content()" |
328 | "!=" + |
329 | converter->asString(validity->minimumValue()).asString(); |
330 | break; |
331 | case Conditional::Between: |
332 | result += "cell-content-is-between(" + |
333 | converter->asString(validity->minimumValue()).asString() + |
334 | ',' + |
335 | converter->asString(validity->maximumValue()).asString() + |
336 | ')'; |
337 | break; |
338 | case Conditional::DifferentTo: |
339 | result += "cell-content-is-not-between(" + |
340 | converter->asString(validity->minimumValue()).asString() + |
341 | ',' + |
342 | converter->asString(validity->maximumValue()).asString() + |
343 | ')'; |
344 | break; |
345 | } |
346 | return result; |
347 | } |
348 | |
349 | QString GenValidationStyle::createTextValidationCondition(Validity* validity) |
350 | { |
351 | QString result; |
352 | switch (validity->condition()) { |
353 | case Conditional::None: |
354 | case Conditional::IsTrueFormula: |
355 | //nothing |
356 | break; |
357 | case Conditional::Equal: |
358 | result += "oooc:cell-content-text-length()" |
359 | "=" + |
360 | QString::number((double)numToDouble(validity->minimumValue().asFloat())); |
361 | break; |
362 | case Conditional::Superior: |
363 | result += "oooc:cell-content-text-length()" |
364 | ">" + |
365 | QString::number((double)numToDouble(validity->minimumValue().asFloat())); |
366 | break; |
367 | case Conditional::Inferior: |
368 | result += "oooc:cell-content-text-length()" |
369 | "<" + |
370 | QString::number((double)numToDouble(validity->minimumValue().asFloat())); |
371 | break; |
372 | case Conditional::SuperiorEqual: |
373 | result += "oooc:cell-content-text-length()" |
374 | ">=" + |
375 | QString::number((double)numToDouble(validity->minimumValue().asFloat())); |
376 | break; |
377 | case Conditional::InferiorEqual: |
378 | result += "oooc:cell-content-text-length()" |
379 | "<=" + |
380 | QString::number((double)numToDouble(validity->minimumValue().asFloat())); |
381 | break; |
382 | case Conditional::Different: |
383 | result += "oooc:cell-content-text-length()" |
384 | "!=" + |
385 | QString::number((double)numToDouble(validity->minimumValue().asFloat())); |
386 | break; |
387 | case Conditional::Between: |
388 | result += "oooc:cell-content-text-length-is-between(" + |
389 | QString::number((double)numToDouble(validity->minimumValue().asFloat())) + |
390 | ',' + |
391 | QString::number((double)numToDouble(validity->maximumValue().asFloat())) + |
392 | ')'; |
393 | break; |
394 | case Conditional::DifferentTo: |
395 | result += "oooc:cell-content-text-length-is-not-between(" + |
396 | QString::number((double)numToDouble(validity->minimumValue().asFloat())) + |
397 | ',' + |
398 | QString::number((double)numToDouble(validity->maximumValue().asFloat())) + |
399 | ')'; |
400 | break; |
401 | } |
402 | return result; |
403 | } |
404 | |