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 const QObject* context() const { return Context; }
00065 const QString name() const { return Name; }
00067 const 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