diff options
Diffstat (limited to 'Plugins/skins/SkinLib')
38 files changed, 298 insertions, 130 deletions
diff --git a/Plugins/skins/SkinLib/ButtonField.cpp b/Plugins/skins/SkinLib/ButtonField.cpp index 267f34f..c96c65f 100644 --- a/Plugins/skins/SkinLib/ButtonField.cpp +++ b/Plugins/skins/SkinLib/ButtonField.cpp @@ -3,7 +3,7 @@ #include "ButtonFieldState.h"
-ButtonField::ButtonField(const char *name, HWND hwnd) : ControlField(name, hwnd)
+ButtonField::ButtonField(Dialog *dlg, const char *name, HWND hwnd) : ControlField(dlg, name, hwnd)
{
}
diff --git a/Plugins/skins/SkinLib/ButtonField.h b/Plugins/skins/SkinLib/ButtonField.h index 101ab14..9ad0357 100644 --- a/Plugins/skins/SkinLib/ButtonField.h +++ b/Plugins/skins/SkinLib/ButtonField.h @@ -6,7 +6,7 @@ class ButtonField : public ControlField
{
public:
- ButtonField(const char *name, HWND hwnd);
+ ButtonField(Dialog *dlg, const char *name, HWND hwnd);
virtual ~ButtonField();
virtual FieldType getType() const;
diff --git a/Plugins/skins/SkinLib/ButtonFieldState.cpp b/Plugins/skins/SkinLib/ButtonFieldState.cpp index 92e7676..da26650 100644 --- a/Plugins/skins/SkinLib/ButtonFieldState.cpp +++ b/Plugins/skins/SkinLib/ButtonFieldState.cpp @@ -21,4 +21,9 @@ Size ButtonFieldState::getPreferedSize() const ret.y += 10;
return ret;
+}
+
+bool ButtonFieldState::isEmpty() const
+{
+ return false;
}
\ No newline at end of file diff --git a/Plugins/skins/SkinLib/ButtonFieldState.h b/Plugins/skins/SkinLib/ButtonFieldState.h index 405fea2..eabab8a 100644 --- a/Plugins/skins/SkinLib/ButtonFieldState.h +++ b/Plugins/skins/SkinLib/ButtonFieldState.h @@ -11,6 +11,8 @@ public: virtual Size getPreferedSize() const;
+ virtual bool isEmpty() const;
+
private:
ButtonFieldState(ControlField *field);
diff --git a/Plugins/skins/SkinLib/ControlField.cpp b/Plugins/skins/SkinLib/ControlField.cpp index 3c9d692..dd9d702 100644 --- a/Plugins/skins/SkinLib/ControlField.cpp +++ b/Plugins/skins/SkinLib/ControlField.cpp @@ -3,7 +3,8 @@ #include "ControlFieldState.h"
-ControlField::ControlField(const char *name, HWND aHwnd) : Field(name), hwnd(aHwnd), textSet(false), hFont(NULL)
+ControlField::ControlField(Dialog *dlg, const char *name, HWND aHwnd)
+ : Field(dlg, name), hwnd(aHwnd), textSet(false), hFont(NULL)
{
}
diff --git a/Plugins/skins/SkinLib/ControlField.h b/Plugins/skins/SkinLib/ControlField.h index 6bf4e91..014ee04 100644 --- a/Plugins/skins/SkinLib/ControlField.h +++ b/Plugins/skins/SkinLib/ControlField.h @@ -6,7 +6,7 @@ class ControlField : public Field
{
public:
- ControlField(const char *name, HWND hwnd);
+ ControlField(Dialog *dlg, const char *name, HWND hwnd);
virtual ~ControlField();
virtual HWND getHWND();
diff --git a/Plugins/skins/SkinLib/Dialog.cpp b/Plugins/skins/SkinLib/Dialog.cpp index 712b85a..d07119e 100644 --- a/Plugins/skins/SkinLib/Dialog.cpp +++ b/Plugins/skins/SkinLib/Dialog.cpp @@ -48,6 +48,29 @@ Field * Dialog::getField(const char *name) const return NULL;
}
+Field * Dialog::getField(unsigned int pos) const
+{
+ if (pos >= fields.size())
+ return NULL;
+ return fields[pos];
+}
+
+int Dialog::getIndexOf(Field *field) const
+{
+ for(unsigned int i = 0; i < fields.size(); i++)
+ {
+ Field *f = fields[i];
+ if (field == f)
+ return i;
+ }
+
+ return -1;
+}
+
+unsigned int Dialog::getFieldCount() const
+{
+ return fields.size();
+}
const Size & Dialog::getSize() const
{
diff --git a/Plugins/skins/SkinLib/Dialog.h b/Plugins/skins/SkinLib/Dialog.h index ae98077..90701cf 100644 --- a/Plugins/skins/SkinLib/Dialog.h +++ b/Plugins/skins/SkinLib/Dialog.h @@ -12,21 +12,24 @@ class Dialog {
public:
Dialog(const char *name);
- ~Dialog();
+ virtual ~Dialog();
- const char * getName() const;
+ virtual const char * getName() const;
- std::vector<Field *> fields;
- bool addField(Field *field);
- Field * getField(const char *name) const;
+ virtual bool addField(Field *field);
+ virtual Field * getField(const char *name) const;
+ virtual Field * getField(unsigned int pos) const;
+ virtual int getIndexOf(Field *field) const;
+ virtual unsigned int getFieldCount() const;
- const Size & getSize() const;
- void setSize(const Size &size);
+ virtual const Size & getSize() const;
+ virtual void setSize(const Size &size);
- DialogState * createState();
+ virtual DialogState * createState();
private:
const std::string name;
+ std::vector<Field *> fields;
Size size;
};
diff --git a/Plugins/skins/SkinLib/EditField.cpp b/Plugins/skins/SkinLib/EditField.cpp index 0032b5b..3324885 100644 --- a/Plugins/skins/SkinLib/EditField.cpp +++ b/Plugins/skins/SkinLib/EditField.cpp @@ -3,7 +3,8 @@ #include "EditFieldState.h"
-EditField::EditField(const char *name, HWND hwnd) : ControlField(name, hwnd)
+EditField::EditField(Dialog *dlg, const char *name, HWND hwnd)
+ : ControlField(dlg, name, hwnd)
{
}
diff --git a/Plugins/skins/SkinLib/EditField.h b/Plugins/skins/SkinLib/EditField.h index 912b1c5..66a2ba1 100644 --- a/Plugins/skins/SkinLib/EditField.h +++ b/Plugins/skins/SkinLib/EditField.h @@ -7,7 +7,7 @@ class EditField : public ControlField
{
public:
- EditField(const char *name, HWND hwnd);
+ EditField(Dialog *dlg, const char *name, HWND hwnd);
virtual ~EditField();
virtual FieldType getType() const;
diff --git a/Plugins/skins/SkinLib/EditFieldState.cpp b/Plugins/skins/SkinLib/EditFieldState.cpp index 927e788..5b7f1f8 100644 --- a/Plugins/skins/SkinLib/EditFieldState.cpp +++ b/Plugins/skins/SkinLib/EditFieldState.cpp @@ -49,4 +49,9 @@ Size EditFieldState::getPreferedSize() const }
return ret;
+}
+
+bool EditFieldState::isEmpty() const
+{
+ return false;
}
\ No newline at end of file diff --git a/Plugins/skins/SkinLib/EditFieldState.h b/Plugins/skins/SkinLib/EditFieldState.h index 33a0382..e4abcd5 100644 --- a/Plugins/skins/SkinLib/EditFieldState.h +++ b/Plugins/skins/SkinLib/EditFieldState.h @@ -12,6 +12,8 @@ public: virtual Size getPreferedSize() const;
+ virtual bool isEmpty() const;
+
private:
EditFieldState(EditField *field);
diff --git a/Plugins/skins/SkinLib/Field.cpp b/Plugins/skins/SkinLib/Field.cpp index 6083a41..033090c 100644 --- a/Plugins/skins/SkinLib/Field.cpp +++ b/Plugins/skins/SkinLib/Field.cpp @@ -3,7 +3,8 @@ #include "FieldState.h"
-Field::Field(const char *aName) : name(aName), onChangeCallback(NULL), onChangeCallbackParam(NULL)
+Field::Field(Dialog *aDlg, const char *aName)
+ : dlg(aDlg), name(aName), onChangeCallback(NULL), onChangeCallbackParam(NULL)
{
}
@@ -11,6 +12,11 @@ Field::~Field() {
}
+Dialog * Field::getDialog() const
+{
+ return dlg;
+}
+
const char * Field::getName() const
{
return name.c_str();
@@ -26,4 +32,4 @@ void Field::fireOnChange() const {
if (onChangeCallback != NULL)
onChangeCallback(onChangeCallbackParam, this);
-}
\ No newline at end of file +}
diff --git a/Plugins/skins/SkinLib/Field.h b/Plugins/skins/SkinLib/Field.h index 76fa68d..fb244a4 100644 --- a/Plugins/skins/SkinLib/Field.h +++ b/Plugins/skins/SkinLib/Field.h @@ -8,7 +8,6 @@ #include "Position.h"
-
enum FieldType
{
SIMPLE_TEXT = 1,
@@ -20,6 +19,7 @@ enum FieldType USER_DEFINED = 0x100
};
+class Dialog;
class Field;
class FieldState;
@@ -29,9 +29,10 @@ typedef void (*FieldCallback)(void *param, const Field *field); class Field
{
public:
- Field(const char *name);
+ Field(Dialog *dlg, const char *name);
virtual ~Field();
+ virtual Dialog * getDialog() const;
virtual const char * getName() const;
virtual FieldType getType() const = 0;
@@ -43,6 +44,7 @@ protected: void fireOnChange() const;
private:
+ Dialog *dlg;
const std::string name;
FieldCallback onChangeCallback;
diff --git a/Plugins/skins/SkinLib/FieldState.cpp b/Plugins/skins/SkinLib/FieldState.cpp index 7186b0c..c92b057 100644 --- a/Plugins/skins/SkinLib/FieldState.cpp +++ b/Plugins/skins/SkinLib/FieldState.cpp @@ -172,4 +172,10 @@ void FieldState::setBottom(int botom) }
SET(usingY, END);
-}
\ No newline at end of file +}
+
+//bool FieldState::isEmpty() const
+//{
+// Size s = getPreferedSize();
+// return s.x <= 0 || s.y <= 0;
+//}
\ No newline at end of file diff --git a/Plugins/skins/SkinLib/FieldState.h b/Plugins/skins/SkinLib/FieldState.h index 95b2fc5..6d44ef6 100644 --- a/Plugins/skins/SkinLib/FieldState.h +++ b/Plugins/skins/SkinLib/FieldState.h @@ -40,6 +40,8 @@ public: virtual bool isVisible() const;
virtual void setVisible(bool visible);
+ virtual bool isEmpty() const = 0;
+
protected:
FieldState(Field *field);
diff --git a/Plugins/skins/SkinLib/FieldState.rec b/Plugins/skins/SkinLib/FieldState.rec index 202bfc8..69ab8c1 100644 --- a/Plugins/skins/SkinLib/FieldState.rec +++ b/Plugins/skins/SkinLib/FieldState.rec @@ -35,6 +35,7 @@ struct FontState Boolean bold;
Boolean underline;
Boolean strikeOut;
+ Int32 color;
};
struct BorderState
diff --git a/Plugins/skins/SkinLib/FontState_v8_wrapper.cpp b/Plugins/skins/SkinLib/FontState_v8_wrapper.cpp index 38e3390..fd0cb5f 100644 --- a/Plugins/skins/SkinLib/FontState_v8_wrapper.cpp +++ b/Plugins/skins/SkinLib/FontState_v8_wrapper.cpp @@ -117,6 +117,23 @@ static void Set_FontState_strikeOut(Local<String> property, Local<Value> value, }
+static Handle<Value> Get_FontState_color(Local<String> property, const AccessorInfo &info)
+{
+ Local<Object> self = info.Holder();
+ Local<External> wrap = Local<External>::Cast(self->GetInternalField(0));
+ FontState *tmp = (FontState *) wrap->Value();
+ return Int32::New(tmp->getColor());
+}
+
+static void Set_FontState_color(Local<String> property, Local<Value> value, const AccessorInfo& info)
+{
+ Local<Object> self = info.Holder();
+ Local<External> wrap = Local<External>::Cast(self->GetInternalField(0));
+ FontState *tmp = (FontState *) wrap->Value();
+ tmp->setColor(value->Int32Value());
+}
+
+
void AddFontStateAcessors(Handle<ObjectTemplate> &templ)
{
templ->SetAccessor(String::New("face"), Get_FontState_face, Set_FontState_face);
@@ -125,4 +142,5 @@ void AddFontStateAcessors(Handle<ObjectTemplate> &templ) templ->SetAccessor(String::New("bold"), Get_FontState_bold, Set_FontState_bold);
templ->SetAccessor(String::New("underline"), Get_FontState_underline, Set_FontState_underline);
templ->SetAccessor(String::New("strikeOut"), Get_FontState_strikeOut, Set_FontState_strikeOut);
+ templ->SetAccessor(String::New("color"), Get_FontState_color, Set_FontState_color);
}
diff --git a/Plugins/skins/SkinLib/IconField.cpp b/Plugins/skins/SkinLib/IconField.cpp index 2a6054c..dcd1d2f 100644 --- a/Plugins/skins/SkinLib/IconField.cpp +++ b/Plugins/skins/SkinLib/IconField.cpp @@ -3,7 +3,8 @@ #include "IconFieldState.h"
-IconField::IconField(const char *name) : Field(name), hIcon(NULL)
+IconField::IconField(Dialog *dlg, const char *name)
+ : Field(dlg, name), hIcon(NULL)
{
}
diff --git a/Plugins/skins/SkinLib/IconField.h b/Plugins/skins/SkinLib/IconField.h index 730f477..efbb128 100644 --- a/Plugins/skins/SkinLib/IconField.h +++ b/Plugins/skins/SkinLib/IconField.h @@ -7,7 +7,7 @@ class IconField : public Field
{
public:
- IconField(const char *name);
+ IconField(Dialog *dlg, const char *name);
virtual ~IconField();
virtual FieldType getType() const;
diff --git a/Plugins/skins/SkinLib/IconFieldState.cpp b/Plugins/skins/SkinLib/IconFieldState.cpp index 1a89fb8..9180f4d 100644 --- a/Plugins/skins/SkinLib/IconFieldState.cpp +++ b/Plugins/skins/SkinLib/IconFieldState.cpp @@ -29,3 +29,8 @@ HICON IconFieldState::getIcon() const {
return getField()->getIcon();
}
+
+bool IconFieldState::isEmpty() const
+{
+ return getIcon() != NULL;
+}
\ No newline at end of file diff --git a/Plugins/skins/SkinLib/IconFieldState.h b/Plugins/skins/SkinLib/IconFieldState.h index 9519d71..3aeeffd 100644 --- a/Plugins/skins/SkinLib/IconFieldState.h +++ b/Plugins/skins/SkinLib/IconFieldState.h @@ -16,6 +16,8 @@ public: virtual HICON getIcon() const;
+ virtual bool isEmpty() const;
+
private:
IconFieldState(IconField *field);
diff --git a/Plugins/skins/SkinLib/ImageField.cpp b/Plugins/skins/SkinLib/ImageField.cpp index 8e6dd4b..01f9d14 100644 --- a/Plugins/skins/SkinLib/ImageField.cpp +++ b/Plugins/skins/SkinLib/ImageField.cpp @@ -3,7 +3,8 @@ #include "ImageFieldState.h"
-ImageField::ImageField(const char *name) : Field(name), hBmp(NULL)
+ImageField::ImageField(Dialog *dlg, const char *name)
+ : Field(dlg, name), hBmp(NULL)
{
}
diff --git a/Plugins/skins/SkinLib/ImageField.h b/Plugins/skins/SkinLib/ImageField.h index 486d5c2..ae00b5a 100644 --- a/Plugins/skins/SkinLib/ImageField.h +++ b/Plugins/skins/SkinLib/ImageField.h @@ -6,7 +6,7 @@ class ImageField : public Field
{
public:
- ImageField(const char *name);
+ ImageField(Dialog *dlg, const char *name);
virtual ~ImageField();
virtual FieldType getType() const;
diff --git a/Plugins/skins/SkinLib/ImageFieldState.cpp b/Plugins/skins/SkinLib/ImageFieldState.cpp index 95d244c..6f8556d 100644 --- a/Plugins/skins/SkinLib/ImageFieldState.cpp +++ b/Plugins/skins/SkinLib/ImageFieldState.cpp @@ -28,4 +28,9 @@ Size ImageFieldState::getPreferedSize() const HBITMAP ImageFieldState::getImage() const
{
return getField()->getImage();
+}
+
+bool ImageFieldState::isEmpty() const
+{
+ return getImage() != NULL;
}
\ No newline at end of file diff --git a/Plugins/skins/SkinLib/ImageFieldState.h b/Plugins/skins/SkinLib/ImageFieldState.h index faba7cc..af48816 100644 --- a/Plugins/skins/SkinLib/ImageFieldState.h +++ b/Plugins/skins/SkinLib/ImageFieldState.h @@ -16,6 +16,8 @@ public: virtual HBITMAP getImage() const;
+ virtual bool isEmpty() const;
+
private:
ImageFieldState(ImageField *field);
diff --git a/Plugins/skins/SkinLib/LabelField.cpp b/Plugins/skins/SkinLib/LabelField.cpp index 162ccc2..f4b3d79 100644 --- a/Plugins/skins/SkinLib/LabelField.cpp +++ b/Plugins/skins/SkinLib/LabelField.cpp @@ -3,7 +3,8 @@ #include "LabelFieldState.h"
-LabelField::LabelField(const char *name, HWND hwnd) : ControlField(name, hwnd)
+LabelField::LabelField(Dialog *dlg, const char *name, HWND hwnd)
+ : ControlField(dlg, name, hwnd)
{
}
diff --git a/Plugins/skins/SkinLib/LabelField.h b/Plugins/skins/SkinLib/LabelField.h index b62d1aa..9b02d33 100644 --- a/Plugins/skins/SkinLib/LabelField.h +++ b/Plugins/skins/SkinLib/LabelField.h @@ -7,7 +7,7 @@ class LabelField : public ControlField
{
public:
- LabelField(const char *name, HWND hwnd);
+ LabelField(Dialog *dlg, const char *name, HWND hwnd);
virtual ~LabelField();
virtual FieldType getType() const;
diff --git a/Plugins/skins/SkinLib/LabelFieldState.cpp b/Plugins/skins/SkinLib/LabelFieldState.cpp index dd00ce7..15b8e66 100644 --- a/Plugins/skins/SkinLib/LabelFieldState.cpp +++ b/Plugins/skins/SkinLib/LabelFieldState.cpp @@ -26,4 +26,9 @@ Size LabelFieldState::getPreferedSize() const ret.y += 2 * border;
return ret;
+}
+
+bool LabelFieldState::isEmpty() const
+{
+ return lstrlen(getText()) <= 0;
}
\ No newline at end of file diff --git a/Plugins/skins/SkinLib/LabelFieldState.h b/Plugins/skins/SkinLib/LabelFieldState.h index 7596322..ebad19e 100644 --- a/Plugins/skins/SkinLib/LabelFieldState.h +++ b/Plugins/skins/SkinLib/LabelFieldState.h @@ -12,6 +12,8 @@ public: virtual Size getPreferedSize() const;
+ virtual bool isEmpty() const;
+
private:
LabelFieldState(LabelField *field);
diff --git a/Plugins/skins/SkinLib/SkinnedDialog.cpp b/Plugins/skins/SkinLib/SkinnedDialog.cpp index 34a4294..046fffe 100644 --- a/Plugins/skins/SkinLib/SkinnedDialog.cpp +++ b/Plugins/skins/SkinLib/SkinnedDialog.cpp @@ -8,8 +8,8 @@ SkinnedDialog::SkinnedDialog(const char *name)
- : dlg(name), fileChangedTime(0),
- script(NULL), state(NULL), opts(NULL),
+ : Dialog(name), fileChangedTime(0),
+ script(NULL), state(NULL), opts(NULL), defaultState(NULL),
errorCallback(NULL), errorCallbackParam(NULL),
traceCallback(NULL), traceCallbackParam(NULL)
{
@@ -26,10 +26,8 @@ const TCHAR * SkinnedDialog::getFilename() const return filename.c_str();
}
-void SkinnedDialog::setFilename(const char *skin, const TCHAR *filename)
+void SkinnedDialog::setFilename(const TCHAR *filename)
{
- this->skin = skin;
-
if (this->filename == filename)
return;
@@ -40,7 +38,7 @@ void SkinnedDialog::setFilename(const char *skin, const TCHAR *filename) bool SkinnedDialog::addField(Field *field)
{
- if (dlg.addField(field))
+ if (Dialog::addField(field))
{
releaseCompiledScript();
releaseState();
@@ -51,81 +49,69 @@ bool SkinnedDialog::addField(Field *field) return false;
}
-Field * SkinnedDialog::getField(const char *name) const
-{
- return dlg.getField(name);
-}
-
-Field * SkinnedDialog::getField(unsigned int pos) const
-{
- if (pos >= dlg.fields.size())
- return NULL;
- return dlg.fields[pos];
-}
-
-int SkinnedDialog::getFieldCount() const
-{
- return dlg.fields.size();
-}
-
-const Size & SkinnedDialog::getSize() const
-{
- return dlg.getSize();
-}
-
void SkinnedDialog::setSize(const Size &size)
{
- if (dlg.getSize() == size)
+ if (getSize() == size)
return;
- dlg.setSize(size);
+ Dialog::setSize(size);
releaseState();
}
-DialogState * SkinnedDialog::getState()
-{
+bool SkinnedDialog::compile()
+{
bool changed = fileChanged();
- if (state != NULL && !changed)
- return state;
+ if (!changed)
+ return true;
- releaseState();
+ releaseCompiledScript();
- if (filename.size() <= 0)
- return NULL;
+ struct _stat st = {0};
+ if (_tstat(filename.c_str(), &st) != 0)
+ return false;
- if (changed || script == NULL)
+ std::tstring text;
+ readFile(text);
+ if (text.size() <= 0)
+ return false;
+
+ script = new V8Script();
+ script->setExceptionCallback(errorCallback, errorCallbackParam);
+
+ if (!script->compile(text.c_str(), this))
{
releaseCompiledScript();
+ return false;
+ }
- struct _stat st = {0};
- if (_tstat(filename.c_str(), &st) != 0)
- return NULL;
+ std::pair<SkinOptions *,DialogState *> pair = script->configure(this);
+ opts = pair.first;
+ defaultState = pair.second;
+ if (opts == NULL)
+ {
+ releaseCompiledScript();
+ return false;
+ }
+
+ fileChangedTime = st.st_mtime;
- std::tstring text;
- readFile(text);
- if (text.size() <= 0)
- return NULL;
+ return true;
+}
- script = new V8Script();
- script->setExceptionCallback(errorCallback, errorCallbackParam);
+DialogState * SkinnedDialog::getState()
+{
+ if (state != NULL && !fileChanged())
+ return state;
- if (!script->compile(text.c_str(), &dlg))
- {
- releaseCompiledScript();
- return NULL;
- }
+ releaseState();
- opts = script->createOptions(&dlg);
- if (opts == NULL)
- {
- releaseCompiledScript();
- return NULL;
- }
+ if (filename.size() <= 0)
+ return NULL;
- fileChangedTime = st.st_mtime;
- }
+ if (!compile())
+ return NULL;
- state = dlg.createState();
+ state = Dialog::createState();
if (!script->run(state, opts))
{
releaseState();
@@ -142,6 +128,9 @@ void SkinnedDialog::releaseCompiledScript() delete opts;
opts = NULL;
+
+ delete defaultState;
+ defaultState = NULL;
}
void SkinnedDialog::releaseState()
@@ -155,10 +144,10 @@ DialogState * SkinnedDialog::createState(const TCHAR *text, MessageCallback erro V8Script script;
script.setExceptionCallback(errorCallback, errorCallbackParam);
- if (!script.compile(text, &dlg))
+ if (!script.compile(text, this))
return NULL;
- DialogState *state = dlg.createState();
+ DialogState *state = Dialog::createState();
if (!script.run(state, opts))
{
delete state;
@@ -249,4 +238,16 @@ void SkinnedDialog::trace(TCHAR *msg, ...) va_end(args);
traceCallback(traceCallbackParam, buff);
+}
+
+SkinOptions * SkinnedDialog::getOpts()
+{
+ compile();
+ return opts;
+}
+
+DialogState * SkinnedDialog::getDefaultState()
+{
+ compile();
+ return defaultState;
}
\ No newline at end of file diff --git a/Plugins/skins/SkinLib/SkinnedDialog.h b/Plugins/skins/SkinLib/SkinnedDialog.h index 54c0887..6cbb4a3 100644 --- a/Plugins/skins/SkinLib/SkinnedDialog.h +++ b/Plugins/skins/SkinLib/SkinnedDialog.h @@ -23,48 +23,56 @@ #include "LabelFieldState.h"
#include "TextFieldState.h"
+#include "SkinOptions.h"
+
class V8Script;
-class SkinOptions;
+
typedef void (*MessageCallback)(void *param, const TCHAR *err);
-class SkinnedDialog
+class SkinnedDialog : public Dialog
{
public:
SkinnedDialog(const char *name);
- ~SkinnedDialog();
+ virtual ~SkinnedDialog();
- const TCHAR * getFilename() const;
- void setFilename(const char *skin, const TCHAR *filename);
+ virtual const TCHAR * getFilename() const;
+ virtual void setFilename(const TCHAR *filename);
- bool addField(Field *field);
- Field * getField(const char *name) const;
- Field * getField(unsigned int pos) const;
- int getFieldCount() const;
+ virtual bool addField(Field *field);
- const Size & getSize() const;
- void setSize(const Size &size);
+ virtual void setSize(const Size &size);
/// Return the cached state. Do not free the result.
/// Each call to this method can potentially create the state, so don't cache it.
- DialogState * getState();
+ virtual DialogState * getState();
/// Create a state based on the script passed in text. the caller have to free the DialogState *
- DialogState * createState(const TCHAR *text, MessageCallback errorCallback = NULL, void *errorCallbackParam = NULL);
+ virtual DialogState * createState(const TCHAR *text, MessageCallback errorCallback = NULL, void *errorCallbackParam = NULL);
+
+ virtual void setErrorCallback(MessageCallback cb, void *param = NULL);
+ virtual void setTraceCallback(MessageCallback cb, void *param = NULL);
+
+ virtual SkinOptions * getOpts();
+ virtual DialogState * getDefaultState();
- void setErrorCallback(MessageCallback cb, void *param = NULL);
- void setTraceCallback(MessageCallback cb, void *param = NULL);
+protected:
+ virtual bool fileChanged();
+ virtual bool compile();
+
+ virtual void trace(TCHAR *msg, ...);
+
+ virtual void onFieldChange(const Field *field);
private:
- Dialog dlg;
- std::string skin;
std::tstring filename;
__time64_t fileChangedTime;
V8Script *script;
DialogState *state;
SkinOptions *opts;
+ DialogState *defaultState;
MessageCallback errorCallback;
void *errorCallbackParam;
@@ -73,13 +81,8 @@ private: void releaseCompiledScript();
void releaseState();
- bool fileChanged();
void readFile(std::tstring &ret);
- void trace(TCHAR *msg, ...);
-
- void onFieldChange(const Field *field);
-
static void staticOnFieldChange(void *param, const Field *field);
};
diff --git a/Plugins/skins/SkinLib/TextField.cpp b/Plugins/skins/SkinLib/TextField.cpp index 69f9bfe..d7187a6 100644 --- a/Plugins/skins/SkinLib/TextField.cpp +++ b/Plugins/skins/SkinLib/TextField.cpp @@ -3,7 +3,8 @@ #include "TextFieldState.h"
-TextField::TextField(const char *name) : Field(name), hFont(NULL), fontColor(RGB(0,0,0))
+TextField::TextField(Dialog *dlg, const char *name)
+ : Field(dlg, name), hFont(NULL), fontColor(RGB(0,0,0))
{
}
diff --git a/Plugins/skins/SkinLib/TextField.h b/Plugins/skins/SkinLib/TextField.h index 5a4ee8f..708331b 100644 --- a/Plugins/skins/SkinLib/TextField.h +++ b/Plugins/skins/SkinLib/TextField.h @@ -7,7 +7,7 @@ class TextField : public Field
{
public:
- TextField(const char *name);
+ TextField(Dialog *dlg, const char *name);
virtual ~TextField();
virtual FieldType getType() const;
diff --git a/Plugins/skins/SkinLib/TextFieldState.cpp b/Plugins/skins/SkinLib/TextFieldState.cpp index 5014a04..340f337 100644 --- a/Plugins/skins/SkinLib/TextFieldState.cpp +++ b/Plugins/skins/SkinLib/TextFieldState.cpp @@ -55,4 +55,9 @@ FontState * TextFieldState::getFont() const FontState * TextFieldState::getFont() const
{
return &font;
+}
+
+bool TextFieldState::isEmpty() const
+{
+ return lstrlen(getText()) <= 0;
}
\ No newline at end of file diff --git a/Plugins/skins/SkinLib/TextFieldState.h b/Plugins/skins/SkinLib/TextFieldState.h index 17d0a82..7e3fca1 100644 --- a/Plugins/skins/SkinLib/TextFieldState.h +++ b/Plugins/skins/SkinLib/TextFieldState.h @@ -21,6 +21,8 @@ public: virtual FontState * getFont();
virtual const FontState * getFont() const;
+ virtual bool isEmpty() const;
+
private:
TextFieldState(TextField *field);
diff --git a/Plugins/skins/SkinLib/V8Script.cpp b/Plugins/skins/SkinLib/V8Script.cpp index 9fa5767..b18bdf2 100644 --- a/Plugins/skins/SkinLib/V8Script.cpp +++ b/Plugins/skins/SkinLib/V8Script.cpp @@ -16,21 +16,67 @@ V8Script::~V8Script() dispose();
}
+static Handle<Value> IsEmptyCallback(const Arguments& args)
+{
+ if (args.Length() < 1)
+ return Undefined();
+
+ HandleScope scope;
+
+ for(int i = 0; i < args.Length(); i++)
+ {
+ Local<Value> arg = args[0];
+
+ if (arg.IsEmpty() || arg->IsNull() || arg->IsUndefined())
+ {
+ return Boolean::New(true);
+ }
+ else if (arg->IsExternal())
+ {
+ Local<External> wrap = Local<External>::Cast(arg);
+ FieldState *field = (FieldState *) wrap->Value();
+ if (field->isEmpty())
+ return Boolean::New(true);
+ }
+ else if (arg->IsString())
+ {
+ Local<String> str = Local<String>::Cast(arg);
+ if (str->Length() <= 0)
+ return Boolean::New(true);
+ }
+ }
+
+ return Boolean::New(false);
+}
+
+static Handle<Value> 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;
- context = Context::New();
+ Handle<ObjectTemplate> global = ObjectTemplate::New();
+ global->Set(String::New("IsEmpty"), FunctionTemplate::New(&IsEmptyCallback));
+ global->Set(String::New("RGB"), FunctionTemplate::New(&RGBCallback));
+
+ 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->fields.size(); i++)
+ for(unsigned int i = 0; i < dlg->getFieldCount(); i++)
{
- Field *field = dlg->fields[i];
+ Field *field = dlg->getField(i);
context->Global()->Set(String::New(field->getName()), wrappers.createWrapper(field->getType()), ReadOnly);
}
wrappers.clearTemplates();
@@ -68,7 +114,7 @@ static Handle<Object> get(Local<Object> obj, const char *field) return Handle<Object>::Cast(obj->Get(String::New(field)));
}
-Handle<Function> V8Script::getOptionsFunction(Dialog *dlg)
+Handle<Function> V8Script::getConfigureFunction(Dialog *dlg)
{
DialogState *state = dlg->createState();
@@ -92,47 +138,55 @@ Handle<Function> V8Script::getOptionsFunction(Dialog *dlg) delete state;
- Handle<Value> options_val = context->Global()->Get(String::New("options"));
- if (options_val.IsEmpty() || !options_val->IsFunction())
+ Handle<Value> configure_val = context->Global()->Get(String::New("configure"));
+ if (configure_val.IsEmpty() || !configure_val->IsFunction())
return Handle<Function>();
- Handle<Function> options = Handle<Function>::Cast(options_val);
+ Handle<Function> configure = Handle<Function>::Cast(configure_val);
- return handle_scope.Close(options);
+ return handle_scope.Close(configure);
}
-SkinOptions * V8Script::createOptions(Dialog *dlg)
+std::pair<SkinOptions *,DialogState *> V8Script::configure(Dialog *dlg)
{
if (!isValid())
- return NULL;
+ return std::pair<SkinOptions *,DialogState *>(NULL, NULL);
SkinOptions *opts = new SkinOptions();
+ DialogState *state = dlg->createState();
HandleScope handle_scope;
Context::Scope context_scope(context);
- Handle<Function> options = getOptionsFunction(dlg);
- if (options.IsEmpty())
- return opts;
+ Handle<Function> configure = getConfigureFunction(dlg);
+ if (configure.IsEmpty())
+ return std::pair<SkinOptions *,DialogState *>(opts, state);
Local<Object> global = context->Global();
wrappers.fillWrapper(get(global, "opts"), opts, true);
+ wrappers.fillWrapper(get(global, "window"), state);
+ for(unsigned int i = 0; i < state->fields.size(); i++)
+ {
+ FieldState *field = state->fields[i];
+ wrappers.fillWrapper(get(global, field->getField()->getName()), field);
+ }
global->Set(String::New("NUMBER"), String::New("NUMBER"));
global->Set(String::New("CHECKBOX"), String::New("CHECKBOX"));
global->Set(String::New("TEXT"), String::New("TEXT"));
TryCatch try_catch;
- Handle<Value> result = options->Call(global, 0, NULL);
+ Handle<Value> result = configure->Call(global, 0, NULL);
if (result.IsEmpty())
{
reportException(&try_catch);
delete opts;
- return NULL;
+ delete state;
+ return std::pair<SkinOptions *,DialogState *>(NULL, NULL);;
}
- return opts;
+ return std::pair<SkinOptions *,DialogState *>(opts, state);
}
bool V8Script::run(DialogState * state, SkinOptions *opts)
diff --git a/Plugins/skins/SkinLib/V8Script.h b/Plugins/skins/SkinLib/V8Script.h index 2611f47..8ff7cb5 100644 --- a/Plugins/skins/SkinLib/V8Script.h +++ b/Plugins/skins/SkinLib/V8Script.h @@ -2,6 +2,7 @@ # define __V8_SCRIPT_H__
#include <v8.h>
+#include <utility>
#include "V8Wrappers.h"
typedef void (*ExceptionCallback)(void *param, const TCHAR *err);
@@ -18,7 +19,7 @@ public: bool isValid();
- SkinOptions * createOptions(Dialog *dlg);
+ std::pair<SkinOptions *,DialogState *> configure(Dialog *dlg);
bool run(DialogState * state, SkinOptions *opts);
@@ -32,7 +33,7 @@ private: ExceptionCallback exceptionCallback;
void *exceptionCallbackParam;
- v8::Handle<v8::Function> getOptionsFunction(Dialog *dlg);
+ v8::Handle<v8::Function> getConfigureFunction(Dialog *dlg);
void reportException(v8::TryCatch *try_catch);
};
|