summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Plugins/skins/MirandaField.h13
-rw-r--r--Plugins/skins/MirandaFont.cpp88
-rw-r--r--Plugins/skins/MirandaFont.h28
-rw-r--r--Plugins/skins/MirandaIconField.cpp19
-rw-r--r--Plugins/skins/MirandaIconField.h21
-rw-r--r--Plugins/skins/MirandaImageField.cpp19
-rw-r--r--Plugins/skins/MirandaImageField.h21
-rw-r--r--Plugins/skins/MirandaSkinnedDialog.cpp205
-rw-r--r--Plugins/skins/MirandaSkinnedDialog.h47
-rw-r--r--Plugins/skins/MirandaTextField.cpp27
-rw-r--r--Plugins/skins/MirandaTextField.h27
-rw-r--r--Plugins/skins/SkinLib/ButtonField.cpp2
-rw-r--r--Plugins/skins/SkinLib/ButtonField.h2
-rw-r--r--Plugins/skins/SkinLib/ButtonFieldState.cpp5
-rw-r--r--Plugins/skins/SkinLib/ButtonFieldState.h2
-rw-r--r--Plugins/skins/SkinLib/ControlField.cpp3
-rw-r--r--Plugins/skins/SkinLib/ControlField.h2
-rw-r--r--Plugins/skins/SkinLib/Dialog.cpp23
-rw-r--r--Plugins/skins/SkinLib/Dialog.h19
-rw-r--r--Plugins/skins/SkinLib/EditField.cpp3
-rw-r--r--Plugins/skins/SkinLib/EditField.h2
-rw-r--r--Plugins/skins/SkinLib/EditFieldState.cpp5
-rw-r--r--Plugins/skins/SkinLib/EditFieldState.h2
-rw-r--r--Plugins/skins/SkinLib/Field.cpp10
-rw-r--r--Plugins/skins/SkinLib/Field.h6
-rw-r--r--Plugins/skins/SkinLib/FieldState.cpp8
-rw-r--r--Plugins/skins/SkinLib/FieldState.h2
-rw-r--r--Plugins/skins/SkinLib/FieldState.rec1
-rw-r--r--Plugins/skins/SkinLib/FontState_v8_wrapper.cpp18
-rw-r--r--Plugins/skins/SkinLib/IconField.cpp3
-rw-r--r--Plugins/skins/SkinLib/IconField.h2
-rw-r--r--Plugins/skins/SkinLib/IconFieldState.cpp5
-rw-r--r--Plugins/skins/SkinLib/IconFieldState.h2
-rw-r--r--Plugins/skins/SkinLib/ImageField.cpp3
-rw-r--r--Plugins/skins/SkinLib/ImageField.h2
-rw-r--r--Plugins/skins/SkinLib/ImageFieldState.cpp5
-rw-r--r--Plugins/skins/SkinLib/ImageFieldState.h2
-rw-r--r--Plugins/skins/SkinLib/LabelField.cpp3
-rw-r--r--Plugins/skins/SkinLib/LabelField.h2
-rw-r--r--Plugins/skins/SkinLib/LabelFieldState.cpp5
-rw-r--r--Plugins/skins/SkinLib/LabelFieldState.h2
-rw-r--r--Plugins/skins/SkinLib/SkinnedDialog.cpp127
-rw-r--r--Plugins/skins/SkinLib/SkinnedDialog.h47
-rw-r--r--Plugins/skins/SkinLib/TextField.cpp3
-rw-r--r--Plugins/skins/SkinLib/TextField.h2
-rw-r--r--Plugins/skins/SkinLib/TextFieldState.cpp5
-rw-r--r--Plugins/skins/SkinLib/TextFieldState.h2
-rw-r--r--Plugins/skins/SkinLib/V8Script.cpp86
-rw-r--r--Plugins/skins/SkinLib/V8Script.h5
-rw-r--r--Plugins/skins/commons.h15
-rw-r--r--Plugins/skins/m_skins.h62
-rw-r--r--Plugins/skins/m_skins_cpp.h102
-rw-r--r--Plugins/skins/skins.cpp431
-rw-r--r--Plugins/skins/skins.vcproj56
54 files changed, 1445 insertions, 164 deletions
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<MirandaField *>(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<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);
};
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 <win2k.h>
#include <newpluginapi.h>
#include <m_system.h>
@@ -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<MirandaSkinnedDialog *> 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<HANDLE> hHooks;
std::vector<HANDLE> 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<MirandaSkinnedDialog *> 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<MirandaSkinnedDialog*>::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
@@ -430,6 +430,10 @@
>
</File>
<File
+ RelativePath=".\m_skins_cpp.h"
+ >
+ </File>
+ <File
RelativePath="..\utils\mir_icons.h"
>
</File>
@@ -617,6 +621,34 @@
</File>
</Filter>
</Filter>
+ <Filter
+ Name="Miranda Wrappers Header Files"
+ >
+ <File
+ RelativePath=".\MirandaField.h"
+ >
+ </File>
+ <File
+ RelativePath=".\MirandaFont.h"
+ >
+ </File>
+ <File
+ RelativePath=".\MirandaIconField.h"
+ >
+ </File>
+ <File
+ RelativePath=".\MirandaImageField.h"
+ >
+ </File>
+ <File
+ RelativePath=".\MirandaSkinnedDialog.h"
+ >
+ </File>
+ <File
+ RelativePath=".\MirandaTextField.h"
+ >
+ </File>
+ </Filter>
</Filter>
<Filter
Name="Resource Files"
@@ -1011,6 +1043,30 @@
</File>
</Filter>
</Filter>
+ <Filter
+ Name="Miranda Wrappers Source Files"
+ >
+ <File
+ RelativePath=".\MirandaFont.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\MirandaIconField.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\MirandaImageField.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\MirandaSkinnedDialog.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\MirandaTextField.cpp"
+ >
+ </File>
+ </Filter>
</Filter>
<Filter
Name="Docs"