#include "globals.h" #include "V8Script.h" #include using namespace v8; V8Script::V8Script() : exceptionCallback(NULL), exceptionCallbackParam(NULL) { } V8Script::~V8Script() { dispose(); } static Handle IsEmptyCallback(const Arguments& args) { if (args.Length() < 1) return Undefined(); HandleScope scope; for(int i = 0; i < args.Length(); i++) { Local arg = args[0]; if (arg.IsEmpty() || arg->IsNull() || arg->IsUndefined()) { return Boolean::New(true); } else if (arg->IsExternal()) { Local wrap = Local::Cast(arg); FieldState *field = (FieldState *) wrap->Value(); if (field->isEmpty()) return Boolean::New(true); } else if (arg->IsString()) { Local str = Local::Cast(arg); if (str->Length() <= 0) return Boolean::New(true); } } return Boolean::New(false); } static Handle RGBCallback(const Arguments& args) { if (args.Length() != 3) return Undefined(); COLORREF color = RGB(args[0]->Int32Value(), args[1]->Int32Value(), args[2]->Int32Value()); return Int32::New(color); } bool V8Script::compile(const TCHAR *source, Dialog *dlg) { dispose(); HandleScope handle_scope; Handle global = ObjectTemplate::New(); global->Set(String::New("IsEmpty"), FunctionTemplate::New(&IsEmptyCallback)); global->Set(String::New("RGB"), FunctionTemplate::New(&RGBCallback)); global->Set(String::New("NUMBER"), String::New("NUMBER")); global->Set(String::New("CHECKBOX"), String::New("CHECKBOX")); global->Set(String::New("TEXT"), String::New("TEXT")); global->Set(String::New("LEFT"), String::New("LEFT")); global->Set(String::New("CENTER"), String::New("CENTER")); global->Set(String::New("RIGHT"), String::New("RIGHT")); context = Context::New(NULL, global); Context::Scope context_scope(context); context->Global()->Set(String::New("window"), wrappers.createDialogWrapper(), ReadOnly); context->Global()->Set(String::New("opts"), wrappers.createOptionsWrapper(), ReadOnly); for(unsigned int i = 0; i < dlg->getFieldCount(); i++) { Field *field = dlg->getField(i); context->Global()->Set(String::New(field->getName()), wrappers.createWrapper(field->getType()), ReadOnly); } wrappers.clearTemplates(); TryCatch try_catch; Local