From 05f6cf3f7788f8bfe5ee589a9f27a89217c67989 Mon Sep 17 00:00:00 2001 From: pescuma Date: Sat, 3 Jan 2009 05:12:30 +0000 Subject: skins: It's ALIVE! git-svn-id: http://pescuma.googlecode.com/svn/trunk/Miranda@121 c086bb3d-8645-0410-b8da-73a8550f86e7 --- Plugins/skins/MirandaField.h | 13 + Plugins/skins/MirandaFont.cpp | 88 +++++ Plugins/skins/MirandaFont.h | 28 ++ Plugins/skins/MirandaIconField.cpp | 19 ++ Plugins/skins/MirandaIconField.h | 21 ++ Plugins/skins/MirandaImageField.cpp | 19 ++ Plugins/skins/MirandaImageField.h | 21 ++ Plugins/skins/MirandaSkinnedDialog.cpp | 205 ++++++++++++ Plugins/skins/MirandaSkinnedDialog.h | 47 +++ Plugins/skins/MirandaTextField.cpp | 27 ++ Plugins/skins/MirandaTextField.h | 27 ++ Plugins/skins/SkinLib/ButtonField.cpp | 2 +- Plugins/skins/SkinLib/ButtonField.h | 2 +- Plugins/skins/SkinLib/ButtonFieldState.cpp | 5 + Plugins/skins/SkinLib/ButtonFieldState.h | 2 + Plugins/skins/SkinLib/ControlField.cpp | 3 +- Plugins/skins/SkinLib/ControlField.h | 2 +- Plugins/skins/SkinLib/Dialog.cpp | 23 ++ Plugins/skins/SkinLib/Dialog.h | 19 +- Plugins/skins/SkinLib/EditField.cpp | 3 +- Plugins/skins/SkinLib/EditField.h | 2 +- Plugins/skins/SkinLib/EditFieldState.cpp | 5 + Plugins/skins/SkinLib/EditFieldState.h | 2 + Plugins/skins/SkinLib/Field.cpp | 10 +- Plugins/skins/SkinLib/Field.h | 6 +- Plugins/skins/SkinLib/FieldState.cpp | 8 +- Plugins/skins/SkinLib/FieldState.h | 2 + Plugins/skins/SkinLib/FieldState.rec | 1 + Plugins/skins/SkinLib/FontState_v8_wrapper.cpp | 18 ++ Plugins/skins/SkinLib/IconField.cpp | 3 +- Plugins/skins/SkinLib/IconField.h | 2 +- Plugins/skins/SkinLib/IconFieldState.cpp | 5 + Plugins/skins/SkinLib/IconFieldState.h | 2 + Plugins/skins/SkinLib/ImageField.cpp | 3 +- Plugins/skins/SkinLib/ImageField.h | 2 +- Plugins/skins/SkinLib/ImageFieldState.cpp | 5 + Plugins/skins/SkinLib/ImageFieldState.h | 2 + Plugins/skins/SkinLib/LabelField.cpp | 3 +- Plugins/skins/SkinLib/LabelField.h | 2 +- Plugins/skins/SkinLib/LabelFieldState.cpp | 5 + Plugins/skins/SkinLib/LabelFieldState.h | 2 + Plugins/skins/SkinLib/SkinnedDialog.cpp | 127 ++++---- Plugins/skins/SkinLib/SkinnedDialog.h | 47 +-- Plugins/skins/SkinLib/TextField.cpp | 3 +- Plugins/skins/SkinLib/TextField.h | 2 +- Plugins/skins/SkinLib/TextFieldState.cpp | 5 + Plugins/skins/SkinLib/TextFieldState.h | 2 + Plugins/skins/SkinLib/V8Script.cpp | 86 ++++- Plugins/skins/SkinLib/V8Script.h | 5 +- Plugins/skins/commons.h | 15 +- Plugins/skins/m_skins.h | 62 ++++ Plugins/skins/m_skins_cpp.h | 102 ++++++ Plugins/skins/skins.cpp | 431 +++++++++++++++++++++++-- Plugins/skins/skins.vcproj | 56 ++++ 54 files changed, 1445 insertions(+), 164 deletions(-) create mode 100644 Plugins/skins/MirandaField.h create mode 100644 Plugins/skins/MirandaFont.cpp create mode 100644 Plugins/skins/MirandaFont.h create mode 100644 Plugins/skins/MirandaIconField.cpp create mode 100644 Plugins/skins/MirandaIconField.h create mode 100644 Plugins/skins/MirandaImageField.cpp create mode 100644 Plugins/skins/MirandaImageField.h create mode 100644 Plugins/skins/MirandaSkinnedDialog.cpp create mode 100644 Plugins/skins/MirandaSkinnedDialog.h create mode 100644 Plugins/skins/MirandaTextField.cpp create mode 100644 Plugins/skins/MirandaTextField.h create mode 100644 Plugins/skins/m_skins_cpp.h diff --git a/Plugins/skins/MirandaField.h b/Plugins/skins/MirandaField.h new file mode 100644 index 0000000..87b8a3d --- /dev/null +++ b/Plugins/skins/MirandaField.h @@ -0,0 +1,13 @@ +#ifndef __MIRANDA_FIELD_H__ +# define __MIRANDA_FIELD_H__ + +class MirandaField +{ +public: + virtual void configure() = 0; +}; + + + + +#endif // __MIRANDA_FIELD_H__ diff --git a/Plugins/skins/MirandaFont.cpp b/Plugins/skins/MirandaFont.cpp new file mode 100644 index 0000000..e8f45d5 --- /dev/null +++ b/Plugins/skins/MirandaFont.cpp @@ -0,0 +1,88 @@ +#include "MirandaFont.h" + +MirandaFont::MirandaFont(Field *aField, const char *description) + : field(aField), hFont(NULL) +{ + ZeroMemory(&fid, sizeof(fid)); + strncpy(fid.name, description, sizeof(fid.name)); +} + +MirandaFont::~MirandaFont() +{ + releaseFont(); +} + +void MirandaFont::registerFont(FontState *font) +{ + if (fid.cbSize != 0) + return; + + MirandaSkinnedDialog * dlg = (MirandaSkinnedDialog *) field->getDialog(); + + HDC hdc = GetDC(NULL); + + // ZeroMemory(&fid, sizeof(fid)); + fid.cbSize = sizeof(fid); + strncpy(fid.group, field->getDialog()->getName(), sizeof(fid.group)); + strncpy(fid.dbSettingsGroup, dlg->getModule(), sizeof(fid.dbSettingsGroup)); + + char tmp[sizeof(fid.prefix)]; + mir_snprintf(tmp, sizeof(tmp), "%s_%s_Font_", field->getDialog()->getName(), field->getName()); + strncpy(fid.prefix, tmp, sizeof(fid.prefix)); + + fid.deffontsettings.colour = font->getColor(); + fid.deffontsettings.size = -MulDiv(font->getSize(), GetDeviceCaps(hdc, LOGPIXELSY), 72); + fid.deffontsettings.style = (font->isBold() ? DBFONTF_BOLD : 0) + | (font->isItalic() ? DBFONTF_ITALIC : 0) + | (font->isUnderline() ? DBFONTF_UNDERLINE : 0) + | (font->isStrikeOut() ? DBFONTF_STRIKEOUT : 0); + fid.deffontsettings.charset = DEFAULT_CHARSET; + strncpy(fid.deffontsettings.szFace, TcharToUtf8(font->getFace()), sizeof(fid.deffontsettings.szFace)); + fid.order = dlg->getIndexOf(field); + fid.flags = FIDF_DEFAULTVALID | FIDF_ALLOWEFFECTS; + + CallService(MS_FONT_REGISTER, (WPARAM)&fid, 0); + + ReleaseDC(NULL, hdc); + + HookEventObj(ME_FONT_RELOAD, staticReloadFont, this); + + reloadFont(); +} + +void MirandaFont::reloadFont() +{ + releaseFont(); + + LOGFONT log_font; + COLORREF color = (COLORREF) CallService(MS_FONT_GET, (WPARAM) &fid, (LPARAM) &log_font); + hFont = CreateFontIndirect(&log_font); + + switch(field->getType()) + { + case SIMPLE_TEXT: + ((TextField *) field)->setFontColor(color); + ((TextField *) field)->setFont(hFont); + break; + case CONTROL_LABEL: + case CONTROL_BUTTON: + case CONTROL_EDIT: + ((ControlField *) field)->setFont(hFont); + break; + } +} + +int MirandaFont::staticReloadFont(void *obj, WPARAM wParam, LPARAM lParam) +{ + ((MirandaFont *) obj)->reloadFont(); + return 0; +} + +void MirandaFont::releaseFont() +{ + if (hFont != NULL) + { + DeleteObject(hFont); + hFont = NULL; + } +} \ No newline at end of file diff --git a/Plugins/skins/MirandaFont.h b/Plugins/skins/MirandaFont.h new file mode 100644 index 0000000..0664ed3 --- /dev/null +++ b/Plugins/skins/MirandaFont.h @@ -0,0 +1,28 @@ +#ifndef __MIRANDA_FONT_H__ +# define __MIRANDA_FONT_H__ + +#include "commons.h" + + +class MirandaFont +{ +public: + MirandaFont(Field *field, const char *description); + ~MirandaFont(); + + void registerFont(FontState *font); + void reloadFont(); + +private: + FontID fid; + HFONT hFont; + Field *field; + + void releaseFont(); + + static int staticReloadFont(void *obj, WPARAM wParam, LPARAM lParam); +}; + + + +#endif // __MIRANDA_FONT_H__ diff --git a/Plugins/skins/MirandaIconField.cpp b/Plugins/skins/MirandaIconField.cpp new file mode 100644 index 0000000..ffa732f --- /dev/null +++ b/Plugins/skins/MirandaIconField.cpp @@ -0,0 +1,19 @@ +#include "MirandaIconField.h" + +MirandaIconField::MirandaIconField(MirandaSkinnedDialog *dlg, const char *name, const char *description) + : IconField(dlg, name) +{ +} + +MirandaIconField::~MirandaIconField() +{ +} + +MirandaSkinnedDialog * MirandaIconField::getDialog() const +{ + return (MirandaSkinnedDialog *) getDialog(); +} + +void MirandaIconField::configure() +{ +} \ No newline at end of file diff --git a/Plugins/skins/MirandaIconField.h b/Plugins/skins/MirandaIconField.h new file mode 100644 index 0000000..0f6f15a --- /dev/null +++ b/Plugins/skins/MirandaIconField.h @@ -0,0 +1,21 @@ +#ifndef __MIRANDA_ICON_FIELD_H__ +# define __MIRANDA_ICON_FIELD_H__ + +#include "commons.h" +#include "MirandaField.h" + + +class MirandaIconField : public IconField, public MirandaField +{ +public: + MirandaIconField(MirandaSkinnedDialog *dlg, const char *name, const char *description); + virtual ~MirandaIconField(); + + virtual MirandaSkinnedDialog * getDialog() const; + + virtual void configure(); +}; + + + +#endif // __MIRANDA_ICON_FIELD_H__ diff --git a/Plugins/skins/MirandaImageField.cpp b/Plugins/skins/MirandaImageField.cpp new file mode 100644 index 0000000..30ca40f --- /dev/null +++ b/Plugins/skins/MirandaImageField.cpp @@ -0,0 +1,19 @@ +#include "MirandaImageField.h" + +MirandaImageField::MirandaImageField(MirandaSkinnedDialog *dlg, const char *name, const char *description) + : ImageField(dlg, name) +{ +} + +MirandaImageField::~MirandaImageField() +{ +} + +MirandaSkinnedDialog * MirandaImageField::getDialog() const +{ + return (MirandaSkinnedDialog *) getDialog(); +} + +void MirandaImageField::configure() +{ +} \ No newline at end of file diff --git a/Plugins/skins/MirandaImageField.h b/Plugins/skins/MirandaImageField.h new file mode 100644 index 0000000..70cd1ce --- /dev/null +++ b/Plugins/skins/MirandaImageField.h @@ -0,0 +1,21 @@ +#ifndef __MIRANDA_IMAGE_FIELD_H__ +# define __MIRANDA_IMAGE_FIELD_H__ + +#include "commons.h" +#include "MirandaField.h" + + +class MirandaImageField : public ImageField, public MirandaField +{ +public: + MirandaImageField(MirandaSkinnedDialog *dlg, const char *name, const char *description); + virtual ~MirandaImageField(); + + virtual MirandaSkinnedDialog * getDialog() const; + + virtual void configure(); +}; + + +#endif // __MIRANDA_IMAGE_FIELD_H__ + diff --git a/Plugins/skins/MirandaSkinnedDialog.cpp b/Plugins/skins/MirandaSkinnedDialog.cpp new file mode 100644 index 0000000..2ec1788 --- /dev/null +++ b/Plugins/skins/MirandaSkinnedDialog.cpp @@ -0,0 +1,205 @@ +#include "commons.h" +#include "MirandaSkinnedDialog.h" + +#define SETTING_NAME_SIZE 256 + + +MirandaSkinnedDialog::MirandaSkinnedDialog(const char *name, const char *aModule) + : SkinnedDialog(name), module(aModule) +{ +} + +MirandaSkinnedDialog::~MirandaSkinnedDialog() +{ +} + +const char * MirandaSkinnedDialog::getModule() const +{ + return module.c_str(); +} + +const TCHAR * MirandaSkinnedDialog::getSkinName() +{ + getSettting("Skin", _T(DEFAULT_SKIN_NAME), skinName); + + return skinName.c_str(); +} + +bool MirandaSkinnedDialog::finishedConfiguring() +{ + SkinOptions * opts = getOpts(); + if (getDefaultState() == NULL || opts == NULL) + return false; + + for(unsigned int i = 0; i < getFieldCount(); ++i) + { + MirandaField *field = dynamic_cast(getField(i)); + field->configure(); + } + + for(unsigned int i = 0; i < opts->getNumOptions(); ++i) + { + SkinOption *opt = opts->getOption(i); + loadFromDB(opt); + opt->setOnChangeCallback(&staticOnOptionChange, this); + } + + return true; +} + +void MirandaSkinnedDialog::updateFilename() +{ + std::tstring filename; + filename = skinsFolder; + filename += _T("\\"); + filename += getSkinName(); + filename += _T("\\"); + filename += Utf8ToTchar(getName()); + filename += _T("."); + filename += _T(SKIN_EXTENSION); + + setFilename(filename.c_str()); +} + +void MirandaSkinnedDialog::loadFromDB(SkinOption *opt) +{ + switch(opt->getType()) + { + case CHECKBOX: + { + opt->setValueCheckbox(getSettting(opt->getName(), opt->getValueCheckbox())); + break; + } + case NUMBER: + { + opt->setValueNumber(getSettting(opt->getName(), opt->getValueNumber())); + break; + } + case TEXT: + { + std::tstring tmp; + getSettting(opt->getName(), opt->getValueText(), tmp); + opt->setValueText(tmp.c_str()); + break; + } + } +} + +void MirandaSkinnedDialog::storeToDB(const SkinOption *opt) +{ + switch(opt->getType()) + { + case CHECKBOX: + { + setSettting(opt->getName(), opt->getValueCheckbox()); + break; + } + case NUMBER: + { + setSettting(opt->getName(), opt->getValueNumber()); + break; + } + case TEXT: + { + setSettting(opt->getName(), opt->getValueText()); + break; + } + } +} + +bool MirandaSkinnedDialog::getSettting(const char *name, bool defVal) +{ + char setting[SETTING_NAME_SIZE]; + getSettingName(setting, name); + + return DBGetContactSettingByte(NULL, getModule(), setting, defVal ? 1 : 0) != 0; +} + +void MirandaSkinnedDialog::setSettting(const char *name, bool val) +{ + char setting[SETTING_NAME_SIZE]; + getSettingName(setting, name); + + DBWriteContactSettingByte(NULL, getModule(), setting, val ? 1 : 0); +} + +int MirandaSkinnedDialog::getSettting(const char *name, int defVal) +{ + char setting[SETTING_NAME_SIZE]; + getSettingName(setting, name); + + return DBGetContactSettingDword(NULL, getModule(), setting, defVal); +} + +void MirandaSkinnedDialog::setSettting(const char *name, int val) +{ + char setting[SETTING_NAME_SIZE]; + getSettingName(setting, name); + + DBWriteContactSettingDword(NULL, getModule(), setting, val); +} + +void MirandaSkinnedDialog::getSettting(const char *name, const WCHAR *defVal, std::wstring &ret) +{ + char setting[SETTING_NAME_SIZE]; + getSettingName(setting, name); + + DBVARIANT dbv = {0}; + if (DBGetContactSettingWString(NULL, getModule(), setting, &dbv)) + { + ret = defVal; + return; + } + + ret = dbv.pwszVal; + DBFreeVariant(&dbv); +} + +void MirandaSkinnedDialog::setSettting(const char *name, const WCHAR *val) +{ + char setting[SETTING_NAME_SIZE]; + getSettingName(setting, name); + + DBWriteContactSettingWString(NULL, getModule(), setting, val); +} + +void MirandaSkinnedDialog::getSettting(const char *name, const char *defVal, std::string &ret) +{ + char setting[SETTING_NAME_SIZE]; + getSettingName(setting, name); + + DBVARIANT dbv = {0}; + if (DBGetContactSettingString(NULL, getModule(), setting, &dbv)) + { + ret = defVal; + return; + } + + ret = dbv.pszVal; + DBFreeVariant(&dbv); +} + +void MirandaSkinnedDialog::setSettting(const char *name, const char *val) +{ + char setting[SETTING_NAME_SIZE]; + getSettingName(setting, name); + + DBWriteContactSettingString(NULL, getModule(), setting, val); +} + +void MirandaSkinnedDialog::getSettingName(char *setting, const char * name) +{ + _snprintf(setting, SETTING_NAME_SIZE, "%s_%s", getName(), name); +} + +void MirandaSkinnedDialog::onOptionChange(const SkinOption *opt) +{ + storeToDB(opt); +} + +void MirandaSkinnedDialog::staticOnOptionChange(void *param, const SkinOption *opt) +{ + _ASSERT(param != NULL); + + ((MirandaSkinnedDialog *) param)->onOptionChange(opt); +} diff --git a/Plugins/skins/MirandaSkinnedDialog.h b/Plugins/skins/MirandaSkinnedDialog.h new file mode 100644 index 0000000..b2c5c30 --- /dev/null +++ b/Plugins/skins/MirandaSkinnedDialog.h @@ -0,0 +1,47 @@ +#ifndef __MIRANDA_SKINNED_DIALOG_H__ +# define __MIRANDA_SKINNED_DIALOG_H__ + +#include "SkinLib\SkinnedDialog.h" + +class SkinOption; + + +class MirandaSkinnedDialog : public SkinnedDialog +{ +public: + MirandaSkinnedDialog(const char *name, const char *module); + virtual ~MirandaSkinnedDialog(); + + virtual const char * getModule() const; + virtual const TCHAR * getSkinName(); + + virtual bool finishedConfiguring(); + + +private: + std::string module; + std::tstring skinName; + + void updateFilename(); + + void loadFromDB(SkinOption *opt); + void storeToDB(const SkinOption *opt); + + bool getSettting(const char *name, bool defVal); + void setSettting(const char *name, bool val); + int getSettting(const char *name, int defVal); + void setSettting(const char *name, int val); + void getSettting(const char *name, const WCHAR *defVal, std::wstring &ret); + void setSettting(const char *name, const WCHAR *val); + void getSettting(const char *name, const char *defVal, std::string &ret); + void setSettting(const char *name, const char *val); + + inline void getSettingName(char *setting, const char * name); + + void onOptionChange(const SkinOption *opt); + + static void staticOnOptionChange(void *param, const SkinOption *opt); +}; + + +#endif // __MIRANDA_SKINNED_DIALOG_H__ diff --git a/Plugins/skins/MirandaTextField.cpp b/Plugins/skins/MirandaTextField.cpp new file mode 100644 index 0000000..2aaf8b3 --- /dev/null +++ b/Plugins/skins/MirandaTextField.cpp @@ -0,0 +1,27 @@ +#include "MirandaTextField.h" +#include "MirandaFont.h" + + +MirandaTextField::MirandaTextField(MirandaSkinnedDialog *dlg, const char *name, const char *aDescription) + : TextField(dlg, name) +{ + font = new MirandaFont(this, aDescription); +} + +MirandaTextField::~MirandaTextField() +{ + delete font; +} + +MirandaSkinnedDialog * MirandaTextField::getDialog() const +{ + return (MirandaSkinnedDialog *) getDialog(); +} + +void MirandaTextField::configure() +{ + TextFieldState *field = (TextFieldState *) getDialog()->getDefaultState()->getField(getName()); + _ASSERT(field != NULL); + + font->registerFont(field->getFont()); +} diff --git a/Plugins/skins/MirandaTextField.h b/Plugins/skins/MirandaTextField.h new file mode 100644 index 0000000..36b7ea7 --- /dev/null +++ b/Plugins/skins/MirandaTextField.h @@ -0,0 +1,27 @@ +#ifndef __MIRANDA_TEXT_FIELD_H__ +# define __MIRANDA_TEXT_FIELD_H__ + +#include "commons.h" +#include "MirandaField.h" + +class MirandaFont; + + +class MirandaTextField : public TextField, public MirandaField +{ +public: + MirandaTextField(MirandaSkinnedDialog *dlg, const char *name, const char *description); + virtual ~MirandaTextField(); + + virtual MirandaSkinnedDialog * getDialog() const; + + virtual void configure(); + +private: + MirandaFont *font; + +}; + + + +#endif // __MIRANDA_TEXT_FIELD_H__ 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 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 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 property, Local value, } +static Handle Get_FontState_color(Local property, const AccessorInfo &info) +{ + Local self = info.Holder(); + Local wrap = Local::Cast(self->GetInternalField(0)); + FontState *tmp = (FontState *) wrap->Value(); + return Int32::New(tmp->getColor()); +} + +static void Set_FontState_color(Local property, Local value, const AccessorInfo& info) +{ + Local self = info.Holder(); + Local wrap = Local::Cast(self->GetInternalField(0)); + FontState *tmp = (FontState *) wrap->Value(); + tmp->setColor(value->Int32Value()); +} + + void AddFontStateAcessors(Handle &templ) { templ->SetAccessor(String::New("face"), Get_FontState_face, Set_FontState_face); @@ -125,4 +142,5 @@ void AddFontStateAcessors(Handle &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 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 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; - context = Context::New(); + Handle 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 get(Local obj, const char *field) return Handle::Cast(obj->Get(String::New(field))); } -Handle V8Script::getOptionsFunction(Dialog *dlg) +Handle V8Script::getConfigureFunction(Dialog *dlg) { DialogState *state = dlg->createState(); @@ -92,47 +138,55 @@ Handle V8Script::getOptionsFunction(Dialog *dlg) delete state; - Handle options_val = context->Global()->Get(String::New("options")); - if (options_val.IsEmpty() || !options_val->IsFunction()) + Handle configure_val = context->Global()->Get(String::New("configure")); + if (configure_val.IsEmpty() || !configure_val->IsFunction()) return Handle(); - Handle options = Handle::Cast(options_val); + Handle configure = Handle::Cast(configure_val); - return handle_scope.Close(options); + return handle_scope.Close(configure); } -SkinOptions * V8Script::createOptions(Dialog *dlg) +std::pair V8Script::configure(Dialog *dlg) { if (!isValid()) - return NULL; + return std::pair(NULL, NULL); SkinOptions *opts = new SkinOptions(); + DialogState *state = dlg->createState(); HandleScope handle_scope; Context::Scope context_scope(context); - Handle options = getOptionsFunction(dlg); - if (options.IsEmpty()) - return opts; + Handle configure = getConfigureFunction(dlg); + if (configure.IsEmpty()) + return std::pair(opts, state); Local 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 result = options->Call(global, 0, NULL); + Handle result = configure->Call(global, 0, NULL); if (result.IsEmpty()) { reportException(&try_catch); delete opts; - return NULL; + delete state; + return std::pair(NULL, NULL);; } - return opts; + return std::pair(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 +#include #include "V8Wrappers.h" typedef void (*ExceptionCallback)(void *param, const TCHAR *err); @@ -18,7 +19,7 @@ public: bool isValid(); - SkinOptions * createOptions(Dialog *dlg); + std::pair configure(Dialog *dlg); bool run(DialogState * state, SkinOptions *opts); @@ -32,7 +33,7 @@ private: ExceptionCallback exceptionCallback; void *exceptionCallbackParam; - v8::Handle getOptionsFunction(Dialog *dlg); + v8::Handle getConfigureFunction(Dialog *dlg); void reportException(v8::TryCatch *try_catch); }; diff --git a/Plugins/skins/commons.h b/Plugins/skins/commons.h index cf7f894..a954d8f 100644 --- a/Plugins/skins/commons.h +++ b/Plugins/skins/commons.h @@ -38,7 +38,7 @@ using namespace std; // Miranda headers -#define MIRANDA_VER 0x0700 +#define MIRANDA_VER 0x0800 #include #include #include @@ -66,14 +66,24 @@ using namespace std; #include "../utils/mir_options.h" #include "../utils/mir_icons.h" #include "../utils/mir_buffer.h" +#include "../utils/utf8_helpers.h" #include "resource.h" #include "m_skins.h" +//#include "m_skins_cpp.h" #include "options.h" +#include "MirandaSkinnedDialog.h" +#include "MirandaField.h" +#include "MirandaTextField.h" +#include "MirandaIconField.h" +#include "MirandaImageField.h" #define MODULE_NAME "Skins" +#define DEFAULT_SKIN_NAME "Default" +#define SKIN_EXTENSION "msk" + // Global Variables extern HINSTANCE hInst; @@ -87,6 +97,9 @@ extern HANDLE hChangedEvent; extern TCHAR skinsFolder[1024]; +extern std::vector dlgs; + + // See if a protocol service exists static __inline int ProtoServiceExists(const char *szModule,const char *szService) diff --git a/Plugins/skins/m_skins.h b/Plugins/skins/m_skins.h index 91f1ca0..25a8502 100644 --- a/Plugins/skins/m_skins.h +++ b/Plugins/skins/m_skins.h @@ -25,6 +25,68 @@ Boston, MA 02111-1307, USA. #define MIID_SKINS { 0x917db7a4, 0xd0fe, 0x4b1c, { 0x8c, 0xa3, 0x6d, 0xc1, 0x44, 0x80, 0xf5, 0xcc } } +typedef void * SKINNED_DIALOG; +typedef void * SKINNED_FIELD; + +/// Some common parameters: +/// - name : internal name and name used inside skin file +/// - description : name shown to the user +/// Do not translate any parameters. +struct SKIN_INTERFACE +{ + int cbSize; + + // Global methods + SKINNED_DIALOG (*RegisterDialog)(const char *name, const char *description, const char *module); + void (*DeleteDialog)(SKINNED_DIALOG dlg); + void (*FinishedConfiguring)(SKINNED_DIALOG dlg); + void (*SetDialogSize)(SKINNED_DIALOG dlg, int width, int height); + + // Dialog methods + SKINNED_FIELD (*AddTextField)(SKINNED_DIALOG dlg, const char *name, const char *description); + SKINNED_FIELD (*AddIconField)(SKINNED_DIALOG dlg, const char *name, const char *description); + SKINNED_FIELD (*AddImageField)(SKINNED_DIALOG dlg, const char *name, const char *description); + SKINNED_FIELD (*GetField)(SKINNED_DIALOG dlg, const char *name); + + // Field methods + RECT (*GetRect)(SKINNED_FIELD field); + BOOL (*IsVisible)(SKINNED_FIELD field); + + // TextField methods + void (*SetText)(SKINNED_FIELD field, const TCHAR *text); + const TCHAR * (*GetText)(SKINNED_FIELD field); + HFONT (*GetFont)(SKINNED_FIELD field); + COLORREF (*GetFontColor)(SKINNED_FIELD field); + + // IconField methods + void (*SetIcon)(SKINNED_FIELD field, HICON hIcon); + HICON (*GetIcon)(SKINNED_FIELD field); + + // ImageField methods + void (*SetImage)(SKINNED_FIELD field, HBITMAP hBmp); + HBITMAP (*GetImage)(SKINNED_FIELD field); +}; + + + +/* +Skins/GetInterface service +Fill the function pointers for a SKIN_INTERFACE struct + +wparam = 0 +lparam = (SKIN_INTERFACE *) struct to be filled +returns: 0 on success +*/ +#define MS_SKINS_GETINTERFACE "Skins/GetInterface" + + + + +static int mir_skins_getInterface(struct SKIN_INTERFACE *dest) +{ + dest->cbSize = sizeof(SKIN_INTERFACE); + return CallService(MS_SKINS_GETINTERFACE, 0, (LPARAM) dest); +} #endif // __M_SKINS_H__ diff --git a/Plugins/skins/m_skins_cpp.h b/Plugins/skins/m_skins_cpp.h new file mode 100644 index 0000000..6e4728e --- /dev/null +++ b/Plugins/skins/m_skins_cpp.h @@ -0,0 +1,102 @@ +/* +Copyright (C) 2008 Ricardo Pescuma Domenecci + +This is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public +License as published by the Free Software Foundation; either +version 2 of the License, or (at your option) any later version. + +This is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with this file; see the file license.txt. If +not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. +*/ + + +#ifndef __M_SKINS_CPP_H__ +# define __M_SKINS_CPP_H__ + +#include "m_skin.h" + +extern struct SKIN_INTERFACE *mski; + + +class SkinField +{ +public: + SkinField(SKINNED_FIELD field) { this->field = field; } + + RECT getRect() { return mski->GetRect(field); } + BOOL isVisible() { return mski->IsVisible(field); } + +protected: + SKINNED_FIELD field; +}; + +class SkinTextField : public SkinField +{ +public: + SkinTextField(SKINNED_FIELD field) : SkinField(field) {} + + void setText(const TCHAR *text) { mski->SetText(field, text); } + const TCHAR * getText() { return mski->GetText(field); } + HFONT getFont() { return mski->GetFont(field); } + COLORREF getFontColor() { return mski->GetFontColor(field); } +}; + +class SkinIconField : public SkinField +{ +public: + SkinIconField(SKINNED_FIELD field) : SkinField(field) {} + + void setIcon(HICON hIcon) { return mski->SetIcon(field, hIcon); } + HICON getIcon() { return mski->GetIcon(field); } +}; + +class SkinImageField : public SkinField +{ +public: + SkinImageField(SKINNED_FIELD field) : SkinField(field) {} + + void setImage(HBITMAP hBmp) { return mski->SetImage(field, hBmp); } + HBITMAP getImage() { return mski->GetImage(field); } +}; + + +class SkinDialog +{ +public: + SkinDialog(const char *name, const char *description, const char *module) + { + dlg = mski->RegisterDialog(name, description, module); + } + + ~SkinDialog() + { + mski->DeleteDialog(dlg); + dlg = NULL; + } + + void finishedConfiguring() { mski->FinishedConfiguring(dlg); } + void setSize(int width, int height) { mski->SetDialogSize(dlg, width, height); } + + + SkinTextField addTextField(const char *name, const char *description) { return SkinTextField( mski->AddTextField(dlg, name, description) ); } + SkinIconField addIconField(const char *name, const char *description) { return SkinIconField( mski->AddIconField(dlg, name, description) ); } + SkinImageField addImageField(const char *name, const char *description) { return SkinImageField( mski->AddImageField(dlg, name, description) ); } + + SkinTextField getTextField(const char *name) { return SkinTextField( mski->GetField(dlg, name) ); } + SkinIconField getIconField(const char *name) { return SkinIconField( mski->GetField(dlg, name) ); } + SkinImageField getImageField(const char *name) { return SkinImageField( mski->GetField(dlg, name) ); } + +private: + SKINNED_DIALOG dlg; +}; + + +#endif // __M_SKINS_CPP_H__ \ No newline at end of file diff --git a/Plugins/skins/skins.cpp b/Plugins/skins/skins.cpp index 022ae45..188018e 100644 --- a/Plugins/skins/skins.cpp +++ b/Plugins/skins/skins.cpp @@ -8,13 +8,13 @@ version 2 of the License, or (at your option) any later version. This is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public -License along with this file; see the file license.txt. If +License along with this file; see the file license.txt. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. +Boston, MA 02111-1307, USA. */ #include "commons.h" @@ -51,6 +51,7 @@ PLUGINLINK *pluginLink; std::vector hHooks; std::vector hServices; +HANDLE hNetlibUser = 0; HANDLE hSkinsFolder = NULL; TCHAR skinsFolder[1024]; @@ -58,12 +59,15 @@ TCHAR skinsFolder[1024]; char *metacontacts_proto = NULL; BOOL loaded = FALSE; +std::vector dlgs; + LIST_INTERFACE li; FI_INTERFACE *fei = NULL; int ModulesLoaded(WPARAM wParam, LPARAM lParam); int PreShutdown(WPARAM wParam, LPARAM lParam); +static int Service_GetInterface(WPARAM wParam, LPARAM lParam); // Functions //////////////////////////////////////////////////////////////////////////// @@ -108,6 +112,36 @@ extern "C" int __declspec(dllexport) Load(PLUGINLINK *link) hHooks.push_back( HookEvent(ME_SYSTEM_MODULESLOADED, ModulesLoaded) ); hHooks.push_back( HookEvent(ME_SYSTEM_PRESHUTDOWN, PreShutdown) ); + NETLIBUSER nl_user = {0}; + nl_user.cbSize = sizeof(nl_user); + nl_user.szSettingsModule = MODULE_NAME; + nl_user.flags = NUF_NOOPTIONS; + nl_user.szDescriptiveName = Translate("Skins"); + hNetlibUser = (HANDLE)CallService(MS_NETLIB_REGISTERUSER, 0, (LPARAM)&nl_user); + + TCHAR mirandaFolder[1024]; + GetModuleFileName(GetModuleHandle(NULL), mirandaFolder, MAX_REGS(mirandaFolder)); + TCHAR *p = _tcsrchr(mirandaFolder, _T('\\')); + if (p != NULL) + *p = _T('\0'); + + // Folders plugin support + if (ServiceExists(MS_FOLDERS_REGISTER_PATH)) + { + hSkinsFolder = (HANDLE) FoldersRegisterCustomPathT(Translate("Skins"), + Translate("Skins"), _T(MIRANDA_PATH) _T("\\Skins")); + + FoldersGetCustomPathT(hSkinsFolder, skinsFolder, MAX_REGS(skinsFolder), _T(".")); + } + else + { + mir_sntprintf(skinsFolder, MAX_REGS(skinsFolder), _T("%s\\Skins"), mirandaFolder); + } + + InitOptions(); + + hServices.push_back( CreateServiceFunction(MS_SKINS_GETINTERFACE, Service_GetInterface) ); + return 0; } @@ -127,14 +161,8 @@ int ModulesLoaded(WPARAM wParam, LPARAM lParam) // add our modules to the KnownModules list CallService("DBEditorpp/RegisterSingleModule", (WPARAM) MODULE_NAME, 0); - TCHAR mirandaFolder[1024]; - GetModuleFileName(GetModuleHandle(NULL), mirandaFolder, MAX_REGS(mirandaFolder)); - TCHAR *p = _tcsrchr(mirandaFolder, _T('\\')); - if (p != NULL) - *p = _T('\0'); - - // updater plugin support - if(ServiceExists(MS_UPDATE_REGISTER)) + // updater plugin support + if(ServiceExists(MS_UPDATE_REGISTER)) { Update upd = {0}; char szCurrentVersion[30]; @@ -157,25 +185,9 @@ int ModulesLoaded(WPARAM wParam, LPARAM lParam) upd.pbVersion = (BYTE *)CreateVersionStringPlugin((PLUGININFO*) &pluginInfo, szCurrentVersion); upd.cpbVersion = strlen((char *)upd.pbVersion); - CallService(MS_UPDATE_REGISTER, 0, (LPARAM)&upd); - } - - // Folders plugin support - if (ServiceExists(MS_FOLDERS_REGISTER_PATH)) - { - hSkinsFolder = (HANDLE) FoldersRegisterCustomPathT(Translate("Skins"), - Translate("Skins"), - _T(MIRANDA_PATH) _T("\\Skins")); - - FoldersGetCustomPathT(hSkinsFolder, skinsFolder, MAX_REGS(skinsFolder), _T(".")); - } - else - { - mir_sntprintf(skinsFolder, MAX_REGS(skinsFolder), _T("%s\\Skins"), mirandaFolder); + CallService(MS_UPDATE_REGISTER, 0, (LPARAM)&upd); } - InitOptions(); - loaded = TRUE; return 0; @@ -264,13 +276,366 @@ BOOL CreatePath(const char *path) void log(const char *fmt, ...) { - va_list va; - char text[1024]; + va_list va; + char text[1024]; - va_start(va, fmt); - mir_vsnprintf(text, sizeof(text), fmt, va); - va_end(va); + va_start(va, fmt); + mir_vsnprintf(text, sizeof(text), fmt, va); + va_end(va); CallService(MS_NETLIB_LOG, (WPARAM) NULL, (LPARAM) text); } + +MirandaSkinnedDialog *GetDialog(const char *name) +{ + _ASSERT(name != NULL); + + for(unsigned int i = 0; i < dlgs.size(); i++) + { + MirandaSkinnedDialog *dlg = dlgs[i]; + if (strcmp(name, dlg->getName()) == 0) + return dlg; + } + + return NULL; +} + + +SKINNED_DIALOG Interface_RegisterDialog(const char *name, const char *description, const char *module) +{ + if (name == NULL || name[0] == 0 || module == NULL || module[0] == 0) + return NULL; + if (GetDialog(name) != NULL) + return NULL; + + // Check if default skin exists + std::tstring filename; + filename = skinsFolder; + filename += _T("\\"); + filename += _T(DEFAULT_SKIN_NAME); + filename += _T("\\"); + filename += Utf8ToTchar(name); + filename += _T("."); + filename += _T(SKIN_EXTENSION); + + if (!FileExists(filename.c_str())) + return NULL; + + MirandaSkinnedDialog *dlg = new MirandaSkinnedDialog(name, module); + dlgs.push_back(dlg); + return (SKINNED_DIALOG) dlg; +} + +void Interface_DeleteDialog(SKINNED_DIALOG aDlg) +{ + if (aDlg == NULL) + return; + + MirandaSkinnedDialog * dlg = (MirandaSkinnedDialog *) aDlg; + for(std::vector::iterator it = dlgs.begin(); it != dlgs.end(); it++) + { + if (*it == dlg) + { + dlgs.erase(it); + break; + } + } + + delete dlg; +} + +void Interface_FinishedConfiguring(SKINNED_DIALOG aDlg) +{ + if (aDlg == NULL) + return; + + MirandaSkinnedDialog *dlg = (MirandaSkinnedDialog *) aDlg; + dlg->finishedConfiguring(); +} + +void Interface_SetDialogSize(SKINNED_DIALOG aDlg, int width, int height) +{ + if (aDlg == NULL) + return; + + MirandaSkinnedDialog *dlg = (MirandaSkinnedDialog *) aDlg; + dlg->setSize(Size(width, height)); +} + +SKINNED_FIELD Interface_AddTextField(SKINNED_DIALOG aDlg, const char *name, const char *description) +{ + if (aDlg == NULL || name == NULL || name[0] == 0) + return NULL; + + MirandaSkinnedDialog *dlg = (MirandaSkinnedDialog *) aDlg; + + MirandaTextField *field = new MirandaTextField(dlg, name, description); + if (!dlg->addField(field)) + { + delete field; + return NULL; + } + + return (SKINNED_FIELD) field; +} + +SKINNED_FIELD Interface_AddIconField(SKINNED_DIALOG aDlg, const char *name, const char *description) +{ + if (aDlg == NULL || name == NULL || name[0] == 0) + return NULL; + + MirandaSkinnedDialog *dlg = (MirandaSkinnedDialog *) aDlg; + + MirandaIconField *field = new MirandaIconField(dlg, name, description); + if (!dlg->addField(field)) + { + delete field; + return NULL; + } + + return (SKINNED_FIELD) field; +} + +SKINNED_FIELD Interface_AddImageField(SKINNED_DIALOG aDlg, const char *name, const char *description) +{ + if (aDlg == NULL || name == NULL || name[0] == 0) + return NULL; + + MirandaSkinnedDialog *dlg = (MirandaSkinnedDialog *) aDlg; + + MirandaImageField *field = new MirandaImageField(dlg, name, description); + if (!dlg->addField(field)) + { + delete field; + return NULL; + } + + return (SKINNED_FIELD) field; +} + +SKINNED_FIELD Interface_GetField(SKINNED_DIALOG aDlg, const char *name) +{ + if (aDlg == NULL || name == NULL || name[0] == 0) + return NULL; + + MirandaSkinnedDialog *dlg = (MirandaSkinnedDialog *) aDlg; + + return (SKINNED_FIELD) dlg->getField(name); +} + +RECT Interface_GetRect(SKINNED_FIELD aField) +{ + RECT ret = { 0, 0, -1, -1 }; + + if (aField == NULL) + return ret; + + Field *field = (Field *) aField; + MirandaSkinnedDialog *dlg = (MirandaSkinnedDialog *) field->getDialog(); + FieldState *fieldState = dlg->getState()->getField(field->getName()); + + if (!fieldState->isVisible()) + return ret; + + ret.left = fieldState->getLeft(); + ret.top = fieldState->getTop(); + ret.right = fieldState->getRight(); + ret.bottom = fieldState->getBottom(); + + return ret; +} + +BOOL Interface_IsVisible(SKINNED_FIELD aField) +{ + if (aField == NULL) + return FALSE; + + Field *field = (Field *) aField; + MirandaSkinnedDialog *dlg = (MirandaSkinnedDialog *) field->getDialog(); + FieldState *fieldState = dlg->getState()->getField(field->getName()); + + return fieldState->isVisible(); +} + +void Interface_SetText(SKINNED_FIELD aField, const TCHAR *text) +{ + if (aField == NULL) + return; + + Field *field = (Field *) aField; + switch(field->getType()) + { + case SIMPLE_TEXT: + ((TextField *) field)->setText(text); + break; + case CONTROL_LABEL: + case CONTROL_BUTTON: + case CONTROL_EDIT: + ((ControlField *) field)->setText(text); + break; + } +} + +const TCHAR * Interface_GetText(SKINNED_FIELD aField) +{ + if (aField == NULL) + return NULL; + + Field *field = (Field *) aField; + MirandaSkinnedDialog *dlg = (MirandaSkinnedDialog *) field->getDialog(); + FieldState *fieldState = dlg->getState()->getField(field->getName()); + + switch(field->getType()) + { + case SIMPLE_TEXT: + return ((TextFieldState *) fieldState)->getText(); + case CONTROL_LABEL: + case CONTROL_BUTTON: + case CONTROL_EDIT: + return ((ControlFieldState *) field)->getText(); + } + + return NULL; +} + +HFONT Interface_GetFont(SKINNED_FIELD aField) +{ + if (aField == NULL) + return NULL; + + Field *field = (Field *) aField; + MirandaSkinnedDialog *dlg = (MirandaSkinnedDialog *) field->getDialog(); + FieldState *fieldState = dlg->getState()->getField(field->getName()); + + switch(field->getType()) + { + case SIMPLE_TEXT: + return ((TextFieldState *) fieldState)->getFont()->getHFONT(); + case CONTROL_LABEL: + case CONTROL_BUTTON: + case CONTROL_EDIT: + return ((ControlFieldState *) field)->getFont()->getHFONT(); + } + + return NULL; +} + +COLORREF Interface_GetFontColor(SKINNED_FIELD aField) +{ + if (aField == NULL) + return RGB(0,0,0); + + Field *field = (Field *) aField; + MirandaSkinnedDialog *dlg = (MirandaSkinnedDialog *) field->getDialog(); + FieldState *fieldState = dlg->getState()->getField(field->getName()); + + switch(field->getType()) + { + case SIMPLE_TEXT: + return ((TextFieldState *) fieldState)->getFont()->getColor(); + case CONTROL_LABEL: + case CONTROL_BUTTON: + case CONTROL_EDIT: + return ((ControlFieldState *) field)->getFont()->getColor(); + } + + return RGB(0,0,0); +} + +void Interface_SetIcon(SKINNED_FIELD aField, HICON hIcon) +{ + if (aField == NULL) + return; + + Field *field = (Field *) aField; + switch(field->getType()) + { + case SIMPLE_ICON: + ((IconField *) field)->setIcon(hIcon); + break; + } +} + +HICON Interface_GetIcon(SKINNED_FIELD aField) +{ + if (aField == NULL) + return NULL; + + Field *field = (Field *) aField; + MirandaSkinnedDialog *dlg = (MirandaSkinnedDialog *) field->getDialog(); + FieldState *fieldState = dlg->getState()->getField(field->getName()); + switch(field->getType()) + { + case SIMPLE_ICON: + return ((IconFieldState *) fieldState)->getIcon(); + } + return NULL; +} + +void Interface_SetImage(SKINNED_FIELD aField, HBITMAP hBmp) +{ + if (aField == NULL) + return; + + Field *field = (Field *) aField; + switch(field->getType()) + { + case SIMPLE_IMAGE: + ((ImageField *) field)->setImage(hBmp); + break; + } +} + +HBITMAP Interface_GetImage(SKINNED_FIELD aField) +{ + if (aField == NULL) + return NULL; + + Field *field = (Field *) aField; + MirandaSkinnedDialog *dlg = (MirandaSkinnedDialog *) field->getDialog(); + FieldState *fieldState = dlg->getState()->getField(field->getName()); + switch(field->getType()) + { + case SIMPLE_IMAGE: + return ((ImageFieldState *) fieldState)->getImage(); + } + return NULL; +} + + +static int Service_GetInterface(WPARAM wParam, LPARAM lParam) +{ + SKIN_INTERFACE *mski = (SKIN_INTERFACE *) lParam; + if (mski == NULL) + return -1; + + if (mski->cbSize < sizeof(SKIN_INTERFACE)) + return -2; + + mski->RegisterDialog = &Interface_RegisterDialog; + mski->DeleteDialog = &Interface_DeleteDialog; + mski->FinishedConfiguring = &Interface_FinishedConfiguring; + mski->SetDialogSize = &Interface_SetDialogSize; + + mski->AddTextField = &Interface_AddTextField; + mski->AddIconField = &Interface_AddIconField; + mski->AddImageField = &Interface_AddImageField; + mski->GetField = &Interface_GetField; + + mski->GetRect = &Interface_GetRect; + mski->IsVisible = &Interface_IsVisible; + + mski->SetText = &Interface_SetText; + mski->GetText = &Interface_GetText; + mski->GetFont = &Interface_GetFont; + mski->GetFontColor = &Interface_GetFontColor; + + mski->SetIcon = &Interface_SetIcon; + mski->GetIcon = &Interface_GetIcon; + + mski->SetImage = &Interface_SetImage; + mski->GetImage = &Interface_GetImage; + + return 0; +} diff --git a/Plugins/skins/skins.vcproj b/Plugins/skins/skins.vcproj index dbef34f..17f588b 100644 --- a/Plugins/skins/skins.vcproj +++ b/Plugins/skins/skins.vcproj @@ -429,6 +429,10 @@ RelativePath="m_skins.h" > + + @@ -617,6 +621,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + +