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 }