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
31using namespace Calligra::Sheets;
32
33GenValidationStyles::GenValidationStyles()
34{
35
36}
37
38GenValidationStyles::~GenValidationStyles()
39{
40
41}
42
43QString 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
56QString 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
67void 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
109void 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
136QString 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
167QString 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
176QString 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
237QString 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
293QString 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
349QString 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