Script.h
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
00029 #ifndef SCRIPT_H
00030 #define SCRIPT_H
00031
00032 #include <QVariant>
00033 #include <QString>
00034 #include <QStringList>
00035 #include <QObject>
00036 #include <QStringList>
00037 #include <QEvent>
00038
00039 #include "customevents.h"
00040 #include "ScriptingEnv.h"
00041
00042 class ApplicationWindow;
00043
00045
00050 class Script : public QObject
00051 {
00052 Q_OBJECT
00053
00054 public:
00055 Script(ScriptingEnv *env, const QString &code, QObject *context=0, const QString &name="<input>")
00056 : Env(env), Code(code), Name(name), compiled(notCompiled)
00057 { Env->incref(); Context = context; EmitErrors=true; }
00058 ~Script() { Env->decref(); }
00059
00061 const QString code() const { return Code; }
00063 QObject* context() const { return Context; }
00065 const QString name() const { return Name; }
00067 bool emitErrors() const { return EmitErrors; }
00069 virtual void addCode(const QString &code) { Code.append(code); compiled = notCompiled; emit codeChanged(); }
00071 virtual void setCode(const QString &code) { Code=code; compiled = notCompiled; emit codeChanged(); }
00073 virtual void setContext(QObject *context) { Context = context; compiled = notCompiled; }
00075 void setName(const QString &name) { Name = name; compiled = notCompiled; }
00077 void setEmitErrors(bool yes) { EmitErrors = yes; }
00078
00079 public slots:
00081 virtual bool compile(bool for_eval=true);
00083 virtual QVariant eval();
00085 virtual bool exec();
00086
00087
00088 virtual bool setQObject(const QObject*, const char*) { return false; }
00089 virtual bool setInt(int, const char*) { return false; }
00090 virtual bool setDouble(double, const char*) { return false; }
00091
00092 signals:
00094 void codeChanged();
00096 void error(const QString & message, const QString & scriptName, int lineNumber);
00098 void print(const QString & output);
00099
00100 protected:
00101 ScriptingEnv *Env;
00102 QString Code, Name;
00103 QObject *Context;
00104 enum compileStatus { notCompiled, isCompiled, compileErr } compiled;
00105 bool EmitErrors;
00106
00107 void emit_error(const QString & message, int lineNumber)
00108 { if(EmitErrors) emit error(message, Name, lineNumber); }
00109 };
00110
00112 class ScriptingLangManager
00113 {
00114 public:
00116 static ScriptingEnv *newEnv(ApplicationWindow *parent);
00118 static ScriptingEnv *newEnv(const char *name, ApplicationWindow *parent);
00120 static QStringList languages();
00122 static int numLanguages();
00123
00124 private:
00125 typedef ScriptingEnv*(*ScriptingEnvConstructor)(ApplicationWindow*);
00126 typedef struct {
00127 const char *name;
00128 ScriptingEnvConstructor constructor;
00129 } ScriptingLang;
00131 static ScriptingLang langs[];
00132 };
00133
00135 class ScriptingChangeEvent : public QEvent
00136 {
00137 public:
00138 ScriptingChangeEvent(ScriptingEnv *e) : QEvent(SCRIPTING_CHANGE_EVENT), env(e) {}
00139 ScriptingEnv *scriptingEnv() const { return env; }
00140 Type type() const { return SCRIPTING_CHANGE_EVENT; }
00141 private:
00142 ScriptingEnv *env;
00143 };
00144
00146
00151 class scripted
00152 {
00153 public:
00154 scripted(ScriptingEnv* env);
00155 ~scripted();
00156 void scriptingChangeEvent(ScriptingChangeEvent*);
00157 ScriptingEnv *scriptingEnv(){return scriptEnv;};
00158
00159 protected:
00160 ScriptingEnv *scriptEnv;
00161 };
00162
00163 #endif