File indexing completed on 2024-05-12 16:35:37
0001 /* This file is part of the KDE project 0002 0003 Copyright 2004 Laurent Montel <montel@kde.org> 0004 0005 This library is free software; you can redistribute it and/or 0006 modify it under the terms of the GNU Library General Public 0007 License as published by the Free Software Foundation; either 0008 version 2 of the License, or (at your option) any later version. 0009 0010 This library is distributed in the hope that it will be useful, 0011 but WITHOUT ANY WARRANTY; without even the implied warranty of 0012 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 0013 Library General Public License for more details. 0014 0015 You should have received a copy of the GNU Library General Public License 0016 along with this library; see the file COPYING.LIB. If not, write to 0017 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 0018 Boston, MA 02110-1301, USA. 0019 */ 0020 0021 // Local 0022 #include "GenValidationStyle.h" 0023 0024 // Calligra 0025 #include <KoXmlWriter.h> 0026 0027 // Sheets 0028 #include "Validity.h" 0029 #include "ValueConverter.h" 0030 0031 using namespace Calligra::Sheets; 0032 0033 GenValidationStyles::GenValidationStyles() 0034 { 0035 0036 } 0037 0038 GenValidationStyles::~GenValidationStyles() 0039 { 0040 0041 } 0042 0043 QString GenValidationStyles::insert(const GenValidationStyle& style) 0044 { 0045 StyleMap::iterator it = m_styles.find(style); 0046 if (it == m_styles.end()) { 0047 0048 QString styleName("val"); 0049 styleName = makeUniqueName(styleName); 0050 m_names.insert(styleName, true); 0051 it = m_styles.insert(style, styleName); 0052 } 0053 return it.value(); 0054 } 0055 0056 QString GenValidationStyles::makeUniqueName(const QString& base) const 0057 { 0058 int num = 1; 0059 QString name; 0060 do { 0061 name = base; 0062 name += QString::number(num++); 0063 } while (m_names.find(name) != m_names.end()); 0064 return name; 0065 } 0066 0067 void GenValidationStyles::writeStyle(KoXmlWriter& writer) const 0068 { 0069 if (m_styles.count() > 0) { 0070 writer.startElement("table:content-validations"); 0071 StyleMap::ConstIterator it; 0072 for (it = m_styles.begin(); it != m_styles.end(); ++it) { 0073 writer.startElement("table:content-validation"); 0074 writer.addAttribute("table:name", it.value()); 0075 writer.addAttribute("table:allow-empty-cell", it.key().allowEmptyCell); 0076 writer.addAttribute("table:condition", it.key().condition); 0077 0078 writer.startElement("table:help-message"); 0079 writer.addAttribute("table:title", it.key().title); 0080 writer.addAttribute("table:display", it.key().displayValidationInformation); 0081 0082 const QStringList helpLines = it.key().messageInfo.split('\n', QString::SkipEmptyParts); 0083 foreach(const QString& helpLine, helpLines) { 0084 writer.startElement("text:p"); 0085 writer.addTextNode(helpLine); 0086 writer.endElement(); 0087 } 0088 writer.endElement(); 0089 0090 writer.startElement("table:error-message"); 0091 writer.addAttribute("table:message-type", it.key().messageType); 0092 0093 writer.addAttribute("table:title", it.key().titleInfo); 0094 writer.addAttribute("table:display", it.key().displayMessage); 0095 0096 const QStringList errorLines = it.key().message.split('\n', QString::SkipEmptyParts); 0097 foreach(const QString& errorLine, errorLines) { 0098 writer.startElement("text:p"); 0099 writer.addTextNode(errorLine); 0100 writer.endElement(); 0101 } 0102 writer.endElement(); 0103 0104 writer.endElement(); 0105 } 0106 writer.endElement();//close sheet:content-validation 0107 } 0108 } 0109 0110 void GenValidationStyle::initVal(Validity *validity, const ValueConverter *converter) 0111 { 0112 if (validity) { 0113 allowEmptyCell = (validity->allowEmptyCell() ? "true" : "false"); 0114 condition = createValidationCondition(validity, converter); 0115 title = validity->title(); 0116 displayValidationInformation = (validity->displayValidationInformation() ? "true" : "false"); 0117 messageInfo = validity->messageInfo(); 0118 0119 switch (validity->action()) { 0120 case Validity::Warning: 0121 messageType = "warning"; 0122 break; 0123 case Validity::Information: 0124 messageType = "information"; 0125 break; 0126 case Validity::Stop: 0127 messageType = "stop"; 0128 break; 0129 } 0130 0131 titleInfo = validity->titleInfo(); 0132 displayMessage = (validity->displayMessage() ? "true" : "false"); 0133 message = validity->message(); 0134 } 0135 } 0136 0137 QString GenValidationStyle::createValidationCondition(Validity* validity, const ValueConverter *converter) 0138 { 0139 QString result; 0140 switch (validity->restriction()) { 0141 case Validity::None: 0142 //nothing 0143 break; 0144 case Validity::Text: 0145 //doesn't exist into oo spec 0146 result = "cell-content-is-text()"; 0147 break; 0148 case Validity::Time: 0149 result = createTimeValidationCondition(validity, converter); 0150 break; 0151 case Validity::Date: 0152 result = createDateValidationCondition(validity, converter); 0153 break; 0154 case Validity::Integer: 0155 case Validity::Number: 0156 result = createNumberValidationCondition(validity); 0157 break; 0158 case Validity::TextLength: 0159 result = createTextValidationCondition(validity); 0160 break; 0161 case Validity::List: 0162 result = createListValidationCondition(validity); 0163 break; 0164 } 0165 return result; 0166 } 0167 0168 QString GenValidationStyle::createListValidationCondition(Validity* validity) 0169 { 0170 QString result = 0171 "oooc:cell-content-is-in-list(" + 0172 validity->validityList().join(";") + 0173 ')'; 0174 return result; 0175 } 0176 0177 QString GenValidationStyle::createNumberValidationCondition(Validity* validity) 0178 { 0179 QString result; 0180 if (validity->restriction() == Validity::Number) 0181 result = "oooc:cell-content-is-whole-number() and "; 0182 else if (validity->restriction() == Validity::Integer) 0183 result = "oooc:cell-content-is-decimal-number() and "; 0184 switch (validity->condition()) { 0185 case Conditional::None: 0186 case Conditional::IsTrueFormula: 0187 //nothing 0188 break; 0189 case Conditional::Equal: 0190 result += "cell-content()" 0191 "=" + 0192 QString::number((double)numToDouble(validity->minimumValue().asFloat())); 0193 break; 0194 case Conditional::Superior: 0195 result += "cell-content()" 0196 ">" + 0197 QString::number((double)numToDouble(validity->minimumValue().asFloat())); 0198 break; 0199 case Conditional::Inferior: 0200 result += "cell-content()" 0201 "<" + 0202 QString::number((double)numToDouble(validity->minimumValue().asFloat())); 0203 break; 0204 case Conditional::SuperiorEqual: 0205 result += "cell-content()" 0206 ">=" + 0207 QString::number((double)numToDouble(validity->minimumValue().asFloat())); 0208 break; 0209 case Conditional::InferiorEqual: 0210 result += "cell-content()" 0211 "<=" + 0212 QString::number((double)numToDouble(validity->minimumValue().asFloat())); 0213 break; 0214 case Conditional::Different: 0215 result += "cell-content()" 0216 "!=" + 0217 QString::number((double)numToDouble(validity->minimumValue().asFloat())); 0218 break; 0219 case Conditional::Between: 0220 result += "cell-content-is-between(" + 0221 QString::number((double)numToDouble(validity->minimumValue().asFloat())) + 0222 ',' + 0223 QString::number((double)numToDouble(validity->maximumValue().asFloat())) + 0224 ')'; 0225 break; 0226 case Conditional::DifferentTo: 0227 result += "cell-content-is-not-between(" + 0228 QString::number((double)numToDouble(validity->minimumValue().asFloat())) + 0229 ',' + 0230 QString::number((double)numToDouble(validity->maximumValue().asFloat())) + 0231 ')'; 0232 break; 0233 } 0234 return result; 0235 } 0236 0237 0238 QString GenValidationStyle::createTimeValidationCondition(Validity* validity, const ValueConverter *converter) 0239 { 0240 QString result("oooc:cell-content-is-time() and "); 0241 switch (validity->condition()) { 0242 case Conditional::None: 0243 case Conditional::IsTrueFormula: 0244 //nothing 0245 break; 0246 case Conditional::Equal: 0247 result += "cell-content()" 0248 "=" + 0249 converter->asString(validity->minimumValue()).asString(); 0250 break; 0251 case Conditional::Superior: 0252 result += "cell-content()" 0253 ">" + 0254 converter->asString(validity->minimumValue()).asString(); 0255 break; 0256 case Conditional::Inferior: 0257 result += "cell-content()" 0258 "<" + 0259 converter->asString(validity->minimumValue()).asString(); 0260 break; 0261 case Conditional::SuperiorEqual: 0262 result += "cell-content()" 0263 ">=" + 0264 converter->asString(validity->minimumValue()).asString(); 0265 break; 0266 case Conditional::InferiorEqual: 0267 result += "cell-content()" 0268 "<=" + 0269 converter->asString(validity->minimumValue()).asString(); 0270 break; 0271 case Conditional::Different: 0272 result += "cell-content()" 0273 "!=" + 0274 converter->asString(validity->minimumValue()).asString(); 0275 break; 0276 case Conditional::Between: 0277 result += "cell-content-is-between(" + 0278 converter->asString(validity->minimumValue()).asString() + 0279 ',' + 0280 converter->asString(validity->maximumValue()).asString() + 0281 ')'; 0282 break; 0283 case Conditional::DifferentTo: 0284 result += "cell-content-is-not-between(" + 0285 converter->asString(validity->minimumValue()).asString() + 0286 ',' + 0287 converter->asString(validity->maximumValue()).asString() + 0288 ')'; 0289 break; 0290 } 0291 return result; 0292 } 0293 0294 QString GenValidationStyle::createDateValidationCondition(Validity* validity, const ValueConverter *converter) 0295 { 0296 QString result("oooc:cell-content-is-date() and "); 0297 switch (validity->condition()) { 0298 case Conditional::None: 0299 case Conditional::IsTrueFormula: 0300 //nothing 0301 break; 0302 case Conditional::Equal: 0303 result += "cell-content()" 0304 "=" + 0305 converter->asString(validity->minimumValue()).asString(); 0306 break; 0307 case Conditional::Superior: 0308 result += "cell-content()" 0309 ">" + 0310 converter->asString(validity->minimumValue()).asString(); 0311 break; 0312 case Conditional::Inferior: 0313 result += "cell-content()" 0314 "<" + 0315 converter->asString(validity->minimumValue()).asString(); 0316 break; 0317 case Conditional::SuperiorEqual: 0318 result += "cell-content()" 0319 ">=" + 0320 converter->asString(validity->minimumValue()).asString(); 0321 break; 0322 case Conditional::InferiorEqual: 0323 result += "cell-content()" 0324 "<=" + 0325 converter->asString(validity->minimumValue()).asString(); 0326 break; 0327 case Conditional::Different: 0328 result += "cell-content()" 0329 "!=" + 0330 converter->asString(validity->minimumValue()).asString(); 0331 break; 0332 case Conditional::Between: 0333 result += "cell-content-is-between(" + 0334 converter->asString(validity->minimumValue()).asString() + 0335 ',' + 0336 converter->asString(validity->maximumValue()).asString() + 0337 ')'; 0338 break; 0339 case Conditional::DifferentTo: 0340 result += "cell-content-is-not-between(" + 0341 converter->asString(validity->minimumValue()).asString() + 0342 ',' + 0343 converter->asString(validity->maximumValue()).asString() + 0344 ')'; 0345 break; 0346 } 0347 return result; 0348 } 0349 0350 QString GenValidationStyle::createTextValidationCondition(Validity* validity) 0351 { 0352 QString result; 0353 switch (validity->condition()) { 0354 case Conditional::None: 0355 case Conditional::IsTrueFormula: 0356 //nothing 0357 break; 0358 case Conditional::Equal: 0359 result += "oooc:cell-content-text-length()" 0360 "=" + 0361 QString::number((double)numToDouble(validity->minimumValue().asFloat())); 0362 break; 0363 case Conditional::Superior: 0364 result += "oooc:cell-content-text-length()" 0365 ">" + 0366 QString::number((double)numToDouble(validity->minimumValue().asFloat())); 0367 break; 0368 case Conditional::Inferior: 0369 result += "oooc:cell-content-text-length()" 0370 "<" + 0371 QString::number((double)numToDouble(validity->minimumValue().asFloat())); 0372 break; 0373 case Conditional::SuperiorEqual: 0374 result += "oooc:cell-content-text-length()" 0375 ">=" + 0376 QString::number((double)numToDouble(validity->minimumValue().asFloat())); 0377 break; 0378 case Conditional::InferiorEqual: 0379 result += "oooc:cell-content-text-length()" 0380 "<=" + 0381 QString::number((double)numToDouble(validity->minimumValue().asFloat())); 0382 break; 0383 case Conditional::Different: 0384 result += "oooc:cell-content-text-length()" 0385 "!=" + 0386 QString::number((double)numToDouble(validity->minimumValue().asFloat())); 0387 break; 0388 case Conditional::Between: 0389 result += "oooc:cell-content-text-length-is-between(" + 0390 QString::number((double)numToDouble(validity->minimumValue().asFloat())) + 0391 ',' + 0392 QString::number((double)numToDouble(validity->maximumValue().asFloat())) + 0393 ')'; 0394 break; 0395 case Conditional::DifferentTo: 0396 result += "oooc:cell-content-text-length-is-not-between(" + 0397 QString::number((double)numToDouble(validity->minimumValue().asFloat())) + 0398 ',' + 0399 QString::number((double)numToDouble(validity->maximumValue().asFloat())) + 0400 ')'; 0401 break; 0402 } 0403 return result; 0404 }