[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [calligra] sheets/odf: oops
From:       Tomas Mecir <mecirt () gmail ! com>
Date:       2016-03-06 20:17:11
Message-ID: E1acf71-0002JA-5v () scm ! kde ! org
[Download RAW message or body]

Git commit 659ea23c600de737853a7d901401f66920bf81a1 by Tomas Mecir.
Committed on 06/03/2016 at 20:17.
Pushed by mecir into branch 'master'.

oops

A  +273  -0    sheets/odf/SheetsOdfValidity.cpp     [License: LGPL (v2+)]

http://commits.kde.org/calligra/659ea23c600de737853a7d901401f66920bf81a1

diff --git a/sheets/odf/SheetsOdfValidity.cpp b/sheets/odf/SheetsOdfValidity.cpp
new file mode 100644
index 0000000..d123f29
--- /dev/null
+++ b/sheets/odf/SheetsOdfValidity.cpp
@@ -0,0 +1,273 @@
+/* This file is part of the KDE project
+   Copyright 2016 Tomas Mecir <mecirt@gmail.com>
+   Copyright 2006 Stefan Nikolaus <stefan.nikolaus@kdemail.net>
+
+   This library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public
+   License as published by the Free Software Foundation; either
+   version 2 of the License, or (at your option) any later version.
+
+   This library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public License
+   along with this library; see the file COPYING.LIB.  If not, write to
+   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+   Boston, MA 02110-1301, USA.
+*/
+
+#include "SheetsOdf.h"
+#include "SheetsOdfPrivate.h"
+
+#include "Cell.h"
+#include "Map.h"
+#include "Sheet.h"
+#include "Validity.h"
+#include "ValueParser.h"
+
+#include <KoXmlReader.h>
+#include <KoXmlNS.h>
+
+#include "OdfLoadingContext.h"
+
+namespace Calligra {
+namespace Sheets {
+
+namespace Odf {
+    void loadValidationCondition(Validity *validity, QString &valExpression, const \
ValueParser *parser); +    void loadValidationValue(Validity *validity, const \
QStringList &listVal, const ValueParser *parser); +}
+
+void Odf::loadValidation(Validity *validity, Cell* const cell, const QString& \
validationName, +                                 OdfLoadingContext& tableContext)
+{
+    KoXmlElement element = tableContext.validities.value(validationName);
+    if (element.hasAttributeNS(KoXmlNS::table, "condition")) {
+        QString valExpression = element.attributeNS(KoXmlNS::table, "condition", \
QString()); +        debugSheetsODF << " element.attribute( table:condition )" << \
valExpression; +        //Condition ::= ExtendedTrueCondition | TrueFunction 'and' \
TrueCondition +        //TrueFunction ::= cell-content-is-whole-number() | \
cell-content-is-decimal-number() | cell-content-is-date() | cell-content-is-time() +  \
//ExtendedTrueCondition ::= ExtendedGetFunction | cell-content-text-length() Operator \
Value +        //TrueCondition ::= GetFunction | cell-content() Operator Value
+        //GetFunction ::= cell-content-is-between(Value, Value) | \
cell-content-is-not-between(Value, Value) +        //ExtendedGetFunction ::= \
cell-content-text-length-is-between(Value, Value) | \
cell-content-text-length-is-not-between(Value, Value) +        //Operator ::= '<' | \
'>' | '<=' | '>=' | '=' | '!=' +        //Value ::= NumberValue | String | Formula
+        //A Formula is a formula without an equals (=) sign at the beginning. See \
section 8.1.3 for more information. +        //A String comprises one or more \
characters surrounded by quotation marks. +        //A NumberValue is a whole or \
decimal number. It must not contain comma separators for numbers of 1000 or greater. \
+ +        //ExtendedTrueCondition
+        if (valExpression.contains("cell-content-text-length()")) {
+            //"cell-content-text-length()>45"
+            valExpression = valExpression.remove("oooc:cell-content-text-length()");
+            debugSheetsODF << " valExpression = :" << valExpression;
+            validity->setRestriction(Validity::TextLength);
+
+            loadValidationCondition(validity, valExpression, \
cell->sheet()->map()->parser()); +        } else if \
(valExpression.contains("cell-content-is-text()")) { +            \
validity->setRestriction(Validity::Text); +        }
+        //cell-content-text-length-is-between(Value, Value) | \
cell-content-text-length-is-not-between(Value, Value) | cell-content-is-in-list( \
StringList ) +        else if \
(valExpression.contains("cell-content-text-length-is-between")) { +            \
validity->setRestriction(Validity::TextLength); +            \
validity->setCondition(Conditional::Between); +            \
valExpression.remove("oooc:cell-content-text-length-is-between("); +            \
debugSheetsODF << " valExpression :" << valExpression; +            \
valExpression.remove(')'); +            QStringList listVal = \
valExpression.split(',', QString::SkipEmptyParts); +            \
loadValidationValue(validity, listVal, cell->sheet()->map()->parser()); +        } \
else if (valExpression.contains("cell-content-text-length-is-not-between")) { +       \
validity->setRestriction(Validity::TextLength); +            \
validity->setCondition(Conditional::Different); +            \
valExpression.remove("oooc:cell-content-text-length-is-not-between("); +            \
debugSheetsODF << " valExpression :" << valExpression; +            \
valExpression.remove(')'); +            debugSheetsODF << " valExpression :" << \
valExpression; +            QStringList listVal = valExpression.split(',', \
QString::SkipEmptyParts); +            loadValidationValue(validity, listVal, \
cell->sheet()->map()->parser()); +        } else if \
(valExpression.contains("cell-content-is-in-list(")) { +            \
validity->setRestriction(Validity::List); +            \
valExpression.remove("oooc:cell-content-is-in-list("); +            debugSheetsODF << \
" valExpression :" << valExpression; +            valExpression.remove(')');
+            validity->setValidityList(valExpression.split(';',  \
QString::SkipEmptyParts)); +        }
+        //TrueFunction ::= cell-content-is-whole-number() | \
cell-content-is-decimal-number() | cell-content-is-date() | cell-content-is-time() +  \
else { +            if (valExpression.contains("cell-content-is-whole-number()")) {
+                validity->setRestriction(Validity::Number);
+                valExpression.remove("oooc:cell-content-is-whole-number() and ");
+            } else if (valExpression.contains("cell-content-is-decimal-number()")) {
+                validity->setRestriction(Validity::Integer);
+                valExpression.remove("oooc:cell-content-is-decimal-number() and ");
+            } else if (valExpression.contains("cell-content-is-date()")) {
+                validity->setRestriction(Validity::Date);
+                valExpression.remove("oooc:cell-content-is-date() and ");
+            } else if (valExpression.contains("cell-content-is-time()")) {
+                validity->setRestriction(Validity::Time);
+                valExpression.remove("oooc:cell-content-is-time() and ");
+            }
+            debugSheetsODF << "valExpression :" << valExpression;
+
+            if (valExpression.contains("cell-content()")) {
+                valExpression.remove("cell-content()");
+                loadValidationCondition(validity, valExpression, \
cell->sheet()->map()->parser()); +            }
+            //GetFunction ::= cell-content-is-between(Value, Value) | \
cell-content-is-not-between(Value, Value) +            //for the moment we support \
just int/double value, not text/date/time :( +            if \
(valExpression.contains("cell-content-is-between(")) { +                \
valExpression.remove("cell-content-is-between("); +                \
valExpression.remove(')'); +                QStringList listVal = \
valExpression.split(',', QString::SkipEmptyParts); +                \
loadValidationValue(validity, listVal, cell->sheet()->map()->parser()); +             \
validity->setCondition(Conditional::Between); +            }
+            if (valExpression.contains("cell-content-is-not-between(")) {
+                valExpression.remove("cell-content-is-not-between(");
+                valExpression.remove(')');
+                QStringList listVal = valExpression.split(',', \
QString::SkipEmptyParts); +                loadValidationValue(validity, listVal, \
cell->sheet()->map()->parser()); +                \
validity->setCondition(Conditional::Different); +            }
+        }
+    }
+    if (element.hasAttributeNS(KoXmlNS::table, "allow-empty-cell")) {
+        debugSheetsODF << " element.hasAttribute( table:allow-empty-cell ) :" << \
element.hasAttributeNS(KoXmlNS::table, "allow-empty-cell"); +        \
validity->setAllowEmptyCell(((element.attributeNS(KoXmlNS::table, "allow-empty-cell", \
QString()) == "true") ? true : false)); +    }
+    if (element.hasAttributeNS(KoXmlNS::table, "base-cell-address")) {
+        //todo what is it ?
+    }
+
+    KoXmlElement help = KoXml::namedItemNS(element, KoXmlNS::table, "help-message");
+    if (!help.isNull()) {
+        if (help.hasAttributeNS(KoXmlNS::table, "title")) {
+            debugSheetsODF << "help.attribute( table:title ) :" << \
help.attributeNS(KoXmlNS::table, "title", QString()); +            \
validity->setTitleInfo(help.attributeNS(KoXmlNS::table, "title", QString())); +       \
} +        if (help.hasAttributeNS(KoXmlNS::table, "display")) {
+            debugSheetsODF << "help.attribute( table:display ) :" << \
help.attributeNS(KoXmlNS::table, "display", QString()); +            \
validity->setDisplayValidationInformation(((help.attributeNS(KoXmlNS::table, \
"display", QString()) == "true") ? true : false)); +        }
+        KoXmlElement attrText = KoXml::namedItemNS(help, KoXmlNS::text, "p");
+        if (!attrText.isNull()) {
+            debugSheetsODF << "help text :" << attrText.text();
+            validity->setMessageInfo(attrText.text());
+        }
+    }
+
+    KoXmlElement error = KoXml::namedItemNS(element, KoXmlNS::table, \
"error-message"); +    if (!error.isNull()) {
+        if (error.hasAttributeNS(KoXmlNS::table, "title"))
+            validity->setTitle(error.attributeNS(KoXmlNS::table, "title", \
QString())); +        if (error.hasAttributeNS(KoXmlNS::table, "message-type")) {
+            QString str = error.attributeNS(KoXmlNS::table, "message-type", \
QString()); +            if (str == "warning")
+                validity->setAction(Validity::Warning);
+            else if (str == "information")
+                validity->setAction(Validity::Information);
+            else if (str == "stop")
+                validity->setAction(Validity::Stop);
+            else
+                debugSheetsODF << "validation : message type unknown  :" << str;
+        }
+
+        if (error.hasAttributeNS(KoXmlNS::table, "display")) {
+            debugSheetsODF << " display message :" << \
error.attributeNS(KoXmlNS::table, "display", QString()); +            \
validity->setDisplayMessage((error.attributeNS(KoXmlNS::table, "display", QString()) \
== "true")); +        }
+        KoXmlElement attrText = KoXml::namedItemNS(error, KoXmlNS::text, "p");
+        if (!attrText.isNull())
+            validity->setMessage(attrText.text());
+    }
+}
+
+void Odf::loadValidationValue(Validity *validity, const QStringList &listVal, const \
ValueParser *parser) +{
+    bool ok = false;
+    debugSheetsODF << " listVal[0] :" << listVal[0] << " listVal[1] :" << \
listVal[1]; +
+    if (validity->restriction() == Validity::Date) {
+        validity->setMinimumValue(parser->tryParseDate(listVal[0]));
+        validity->setMaximumValue(parser->tryParseDate(listVal[1]));
+    } else if (validity->restriction() == Validity::Time) {
+        validity->setMinimumValue(parser->tryParseTime(listVal[0]));
+        validity->setMaximumValue(parser->tryParseTime(listVal[1]));
+    } else {
+        validity->setMinimumValue(Value(listVal[0].toDouble(&ok)));
+        if (!ok) {
+            validity->setMinimumValue(Value(listVal[0].toInt(&ok)));
+            if (!ok)
+                debugSheetsODF << " Try to parse this value :" << listVal[0];
+
+#if 0
+            if (!ok)
+                validity->setMinimumValue(listVal[0]);
+#endif
+        }
+        ok = false;
+        validity->setMaximumValue(Value(listVal[1].toDouble(&ok)));
+        if (!ok) {
+            validity->setMaximumValue(Value(listVal[1].toInt(&ok)));
+            if (!ok)
+                debugSheetsODF << " Try to parse this value :" << listVal[1];
+
+#if 0
+            if (!ok)
+                validity->setMaximumValue(listVal[1]);
+#endif
+        }
+    }
+}
+
+void Odf::loadValidationCondition(Validity *validity, QString &valExpression, const \
ValueParser *parser) +{
+    if (validity->isEmpty()) return;
+    QString value;
+    if (valExpression.indexOf("<=") == 0) {
+        value = valExpression.remove(0, 2);
+        validity->setCondition(Conditional::InferiorEqual);
+    } else if (valExpression.indexOf(">=") == 0) {
+        value = valExpression.remove(0, 2);
+        validity->setCondition(Conditional::SuperiorEqual);
+    } else if (valExpression.indexOf("!=") == 0) {
+        //add Differentto attribute
+        value = valExpression.remove(0, 2);
+        validity->setCondition(Conditional::DifferentTo);
+    } else if (valExpression.indexOf('<') == 0) {
+        value = valExpression.remove(0, 1);
+        validity->setCondition(Conditional::Inferior);
+    } else if (valExpression.indexOf('>') == 0) {
+        value = valExpression.remove(0, 1);
+        validity->setCondition(Conditional::Superior);
+    } else if (valExpression.indexOf('=') == 0) {
+        value = valExpression.remove(0, 1);
+        validity->setCondition(Conditional::Equal);
+    } else
+        debugSheetsODF << " I don't know how to parse it :" << valExpression;
+    if (validity->restriction() == Validity::Date) {
+        validity->setMinimumValue(parser->tryParseDate(value));
+    } else if (validity->restriction() == Validity::Date) {
+        validity->setMinimumValue(parser->tryParseTime(value));
+    } else {
+        bool ok = false;
+        validity->setMinimumValue(Value(value.toDouble(&ok)));
+        if (!ok) {
+            validity->setMinimumValue(Value(value.toInt(&ok)));
+            if (!ok)
+                debugSheetsODF << " Try to parse this value :" << value;
+
+#if 0
+            if (!ok)
+                validity->setMinimumValue(value);
+#endif
+        }
+    }
+}
+
+
+}  // Sheets
+}  // Calligra


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic