Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef EXPRESSIONACTION_H
00029 #define EXPRESSIONACTION_H
00030
00031
00032 #include "XMLClass.h"
00033 #include "ExpressionStorage.h"
00034 #include "ExpressionContext.h"
00035 #include "Global.h"
00036 #include "QGpCoreToolsDLLExport.h"
00037
00038 namespace QGpCoreTools {
00039
00040 class ExpressionContext;
00041
00042 class QGPCORETOOLS_EXPORT ExpressionAction : public XMLClass
00043 {
00044 TRANSLATIONS("ExpressionAction")
00045 public:
00046 enum Type {NoOperator, Assign, Sum, SumAssign, Subtract, SubtractAssign, Mult, MultAssign, FloatDiv,
00047 FloatDivAssign, IntMod, IntDiv, Coma, OpenBracket, CloseBracket, EndAction, Function, Equal,
00048 NotEqual, GreaterThan, GreaterOrEqual, LessThan, LessOrEqual, OpenSquareBracket, CloseSquareBracket,
00049 VariableArray};
00050 ExpressionAction() {_parent=0;}
00051 virtual ~ExpressionAction() {}
00052
00053 virtual const QString& xml_tagName() const {return xmlExpressionActionTag;}
00054 static const QString xmlExpressionActionTag;
00055
00056 virtual bool isReadOnly() const {return true;}
00057 virtual QVariant value() const=0;
00058 virtual void setValue(const QVariant& ) {}
00059
00060 virtual int priority() const {return 4;}
00061 virtual ExpressionAction * parent() const {return _parent;}
00062 void setParent(ExpressionAction * p) {_parent=p;}
00063 ExpressionAction * superParent();
00064 virtual ExpressionAction * close(ExpressionAction::Type t);
00065
00066 bool addAction(ExpressionAction * a);
00067 virtual bool addArgument(ExpressionAction * a)=0;
00068 virtual void replaceArgument(ExpressionAction * oldA, ExpressionAction * newA)=0;
00069 protected:
00070 static QVariant sum(const QVariant& op1, const QVariant& op2);
00071 static QVariant subtract(const QVariant& op1, const QVariant& op2);
00072 static QVariant mult(const QVariant& op1, const QVariant& op2);
00073 static QVariant floatDiv(const QVariant& op1, const QVariant& op2);
00074 static int compare(const QVariant& op1, const QVariant& op2, bool& ok);
00075
00076 ExpressionAction * _parent;
00077 protected:
00078
00079 };
00080
00081 class QGPCORETOOLS_EXPORT ExpressionVariable : public ExpressionAction
00082 {
00083 public:
00084 ExpressionVariable(QString name, ExpressionContext * c);
00085 ~ExpressionVariable() {delete _index;}
00086
00087 virtual const QString& xml_tagName() const {return xmlExpressionVariableTag;}
00088 static const QString xmlExpressionVariableTag;
00089
00090 virtual ExpressionAction * parent() const {if(_open) return 0; else return _parent;}
00091 virtual bool isReadOnly() const;
00092 virtual QVariant value() const;
00093 virtual void setValue(const QVariant& val);
00094 virtual bool addArgument(ExpressionAction * a);
00095 virtual void replaceArgument(ExpressionAction *, ExpressionAction *);
00096 virtual ExpressionAction * close(Type t);
00097 protected:
00098 virtual void xml_writeProperties(XML_WRITEPROPERTIES_ARGS) const;
00099 virtual void xml_writeChildren(XML_WRITECHILDREN_ARGS) const;
00100
00101 private:
00102 ExpressionAction * _index;
00103 ExpressionContext * _context;
00104 bool _open;
00105 int _varIndex;
00106 };
00107
00108 class QGPCORETOOLS_EXPORT ExpressionValue : public ExpressionAction
00109 {
00110 public:
00111 ExpressionValue(QVariant val) {_val=val;}
00112
00113 virtual const QString& xml_tagName() const {return xmlExpressionValueTag;}
00114 static const QString xmlExpressionValueTag;
00115
00116 virtual QVariant value() const {return _val;}
00117 virtual bool addArgument(ExpressionAction *) {return false;}
00118 virtual void replaceArgument(ExpressionAction *, ExpressionAction *) {ASSERT(false);}
00119 private:
00120 QVariant _val;
00121 protected:
00122 virtual void xml_writeProperties(XML_WRITEPROPERTIES_ARGS) const;
00123
00124 };
00125
00126 class QGPCORETOOLS_EXPORT ExpressionBracket : public ExpressionAction
00127 {
00128 public:
00129 ExpressionBracket() {_open=true; _arg=0;}
00130 ~ExpressionBracket() {delete _arg;}
00131
00132 virtual const QString& xml_tagName() const {return xmlExpressionBracketTag;}
00133 static const QString xmlExpressionBracketTag;
00134
00135 virtual ExpressionAction * parent() const {if(_open) return 0; else return _parent;}
00136 virtual bool isReadOnly() const {return _arg->isReadOnly();}
00137 virtual QVariant value() const {return _arg ? _arg->value() : QVariant();}
00138 virtual ExpressionAction * close(Type t);
00139 virtual bool addArgument(ExpressionAction *);
00140 virtual void replaceArgument(ExpressionAction * oldA, ExpressionAction * newA);
00141 private:
00142 ExpressionAction * _arg;
00143 bool _open;
00144 protected:
00145 virtual void xml_writeChildren(XML_WRITECHILDREN_ARGS) const;
00146 virtual void xml_writeProperties(XML_WRITEPROPERTIES_ARGS) const;
00147
00148 };
00149
00150 class QGPCORETOOLS_EXPORT ExpressionOperator : public ExpressionAction
00151 {
00152 public:
00153 ExpressionOperator(Type type) {_type=type;_operand1=0;_operand2=0;}
00154 virtual ~ExpressionOperator() {delete _operand1; delete _operand2;}
00155
00156 virtual const QString& xml_tagName() const {return xmlExpressionOperatorTag;}
00157 static const QString xmlExpressionOperatorTag;
00158
00159 virtual QVariant value() const;
00160 virtual int priority() const {
00161 switch (_type) {
00162 case Mult:
00163 case FloatDiv:
00164 case IntMod:
00165 case IntDiv:
00166 return 3;
00167 case Sum:
00168 case Subtract:
00169 return 2;
00170 default:
00171 return 1;
00172 }
00173 }
00174 virtual bool addArgument(ExpressionAction * a);
00175 virtual void replaceArgument(ExpressionAction * oldA, ExpressionAction * newA);
00176 private:
00177 Type _type;
00178 ExpressionAction * _operand1;
00179 ExpressionAction * _operand2;
00180 protected:
00181 virtual void xml_writeChildren(XML_WRITECHILDREN_ARGS) const;
00182 virtual void xml_writeProperties(XML_WRITEPROPERTIES_ARGS) const;
00183
00184 };
00185
00186 class QGPCORETOOLS_EXPORT ExpressionFunction : public ExpressionAction
00187 {
00188 public:
00189 ExpressionFunction(QString name, ExpressionContext * context) {_name=name; _open=true; _currentArg=0; _context=context;}
00190 virtual ~ExpressionFunction() {qDeleteAll(_args);}
00191
00192 virtual const QString& xml_tagName() const {return xmlExpressionFunctionTag;}
00193 static const QString xmlExpressionFunctionTag;
00194
00195 virtual ExpressionAction * parent() const {if(_open) return 0; else return _parent;}
00196 virtual QVariant value() const {return _context->functionValue(_name, _args);}
00197 virtual bool addArgument(ExpressionAction * a);
00198 virtual void replaceArgument(ExpressionAction * oldA, ExpressionAction * newA);
00199 virtual ExpressionAction * close(Type t);
00200 private:
00201 bool _open;
00202 QString _name;
00203 ExpressionAction * _currentArg;
00204 QVector<ExpressionAction *> _args;
00205 ExpressionContext * _context;
00206 protected:
00207 virtual void xml_writeChildren(XML_WRITECHILDREN_ARGS) const;
00208 virtual void xml_writeProperties(XML_WRITEPROPERTIES_ARGS) const;
00209
00210 };
00211
00212 }
00213
00214 #endif // EXPRESSIONACTION_H