summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Plugins/skins/MirandaField.h1
-rw-r--r--Plugins/skins/MirandaIconField.cpp2
-rw-r--r--Plugins/skins/MirandaImageField.cpp2
-rw-r--r--Plugins/skins/MirandaSkinnedDialog.cpp2
-rw-r--r--Plugins/skins/MirandaTextField.cpp2
-rw-r--r--Plugins/skins/commons.h2
-rw-r--r--Plugins/skins/m_skins.h12
-rw-r--r--Plugins/skins/m_skins_cpp.h73
-rw-r--r--Plugins/skins/skins.cpp122
-rw-r--r--Plugins/skins/skins.vcproj8
10 files changed, 167 insertions, 59 deletions
diff --git a/Plugins/skins/MirandaField.h b/Plugins/skins/MirandaField.h
index 87b8a3d..d89901c 100644
--- a/Plugins/skins/MirandaField.h
+++ b/Plugins/skins/MirandaField.h
@@ -1,6 +1,7 @@
#ifndef __MIRANDA_FIELD_H__
# define __MIRANDA_FIELD_H__
+
class MirandaField
{
public:
diff --git a/Plugins/skins/MirandaIconField.cpp b/Plugins/skins/MirandaIconField.cpp
index ffa732f..7861e11 100644
--- a/Plugins/skins/MirandaIconField.cpp
+++ b/Plugins/skins/MirandaIconField.cpp
@@ -11,7 +11,7 @@ MirandaIconField::~MirandaIconField()
MirandaSkinnedDialog * MirandaIconField::getDialog() const
{
- return (MirandaSkinnedDialog *) getDialog();
+ return (MirandaSkinnedDialog *) IconField::getDialog();
}
void MirandaIconField::configure()
diff --git a/Plugins/skins/MirandaImageField.cpp b/Plugins/skins/MirandaImageField.cpp
index 30ca40f..2c9efe1 100644
--- a/Plugins/skins/MirandaImageField.cpp
+++ b/Plugins/skins/MirandaImageField.cpp
@@ -11,7 +11,7 @@ MirandaImageField::~MirandaImageField()
MirandaSkinnedDialog * MirandaImageField::getDialog() const
{
- return (MirandaSkinnedDialog *) getDialog();
+ return (MirandaSkinnedDialog *) ImageField::getDialog();
}
void MirandaImageField::configure()
diff --git a/Plugins/skins/MirandaSkinnedDialog.cpp b/Plugins/skins/MirandaSkinnedDialog.cpp
index 2ec1788..4e6e83e 100644
--- a/Plugins/skins/MirandaSkinnedDialog.cpp
+++ b/Plugins/skins/MirandaSkinnedDialog.cpp
@@ -27,6 +27,8 @@ const TCHAR * MirandaSkinnedDialog::getSkinName()
bool MirandaSkinnedDialog::finishedConfiguring()
{
+ updateFilename();
+
SkinOptions * opts = getOpts();
if (getDefaultState() == NULL || opts == NULL)
return false;
diff --git a/Plugins/skins/MirandaTextField.cpp b/Plugins/skins/MirandaTextField.cpp
index 2aaf8b3..4a3591a 100644
--- a/Plugins/skins/MirandaTextField.cpp
+++ b/Plugins/skins/MirandaTextField.cpp
@@ -15,7 +15,7 @@ MirandaTextField::~MirandaTextField()
MirandaSkinnedDialog * MirandaTextField::getDialog() const
{
- return (MirandaSkinnedDialog *) getDialog();
+ return (MirandaSkinnedDialog *) TextField::getDialog();
}
void MirandaTextField::configure()
diff --git a/Plugins/skins/commons.h b/Plugins/skins/commons.h
index a954d8f..3a28e47 100644
--- a/Plugins/skins/commons.h
+++ b/Plugins/skins/commons.h
@@ -70,7 +70,7 @@ using namespace std;
#include "resource.h"
#include "m_skins.h"
-//#include "m_skins_cpp.h"
+#include "m_skins_cpp.h"
#include "options.h"
#include "MirandaSkinnedDialog.h"
#include "MirandaField.h"
diff --git a/Plugins/skins/m_skins.h b/Plugins/skins/m_skins.h
index 25a8502..5758588 100644
--- a/Plugins/skins/m_skins.h
+++ b/Plugins/skins/m_skins.h
@@ -21,6 +21,7 @@ Boston, MA 02111-1307, USA.
#ifndef __M_SKINS_H__
# define __M_SKINS_H__
+#include <windows.h>
#define MIID_SKINS { 0x917db7a4, 0xd0fe, 0x4b1c, { 0x8c, 0xa3, 0x6d, 0xc1, 0x44, 0x80, 0xf5, 0xcc } }
@@ -28,9 +29,11 @@ Boston, MA 02111-1307, USA.
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
+/// - module : the module name where the settings will be stored
/// Do not translate any parameters.
struct SKIN_INTERFACE
{
@@ -40,21 +43,24 @@ struct SKIN_INTERFACE
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);
+ void (*SetDialogSize)(SKINNED_DIALOG dlg, int width, int height);
+ RECT (*GetBorders)(SKINNED_DIALOG dlg);
// 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);
+ void (*SetTextA)(SKINNED_FIELD field, const char *text);
+ void (*SetTextW)(SKINNED_FIELD field, const WCHAR *text);
+ char * (*GetTextA)(SKINNED_FIELD field); // You have to free the result
+ WCHAR * (*GetTextW)(SKINNED_FIELD field); // You have to free the result
HFONT (*GetFont)(SKINNED_FIELD field);
COLORREF (*GetFontColor)(SKINNED_FIELD field);
diff --git a/Plugins/skins/m_skins_cpp.h b/Plugins/skins/m_skins_cpp.h
index 6e4728e..7a28a31 100644
--- a/Plugins/skins/m_skins_cpp.h
+++ b/Plugins/skins/m_skins_cpp.h
@@ -21,18 +21,20 @@ Boston, MA 02111-1307, USA.
#ifndef __M_SKINS_CPP_H__
# define __M_SKINS_CPP_H__
-#include "m_skin.h"
+#include "m_skins.h"
-extern struct SKIN_INTERFACE *mski;
+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); }
+
+ BOOL isValid() { return field != NULL; }
+
+ RECT getRect() { return mski.GetRect(field); }
+ BOOL isVisible() { return mski.IsVisible(field); }
protected:
SKINNED_FIELD field;
@@ -41,12 +43,33 @@ protected:
class SkinTextField : public SkinField
{
public:
- SkinTextField(SKINNED_FIELD field) : SkinField(field) {}
+ SkinTextField(SKINNED_FIELD field) : SkinField(field), text(NULL) {}
+ ~SkinTextField() { if (text != NULL) mir_free(text); }
+
+ void setText(const TCHAR *text) {
+#ifdef UNICODE
+ mski.SetTextW(field, text);
+#else
+ mski.SetTextA(field, text);
+#endif
+ }
+ const TCHAR * getText() {
+ if (text != NULL)
+ mir_free(text);
+
+#ifdef UNICODE
+ text = mski.GetTextW(field);
+#else
+ text = mski.GetTextA(field);
+#endif
+ return text;
+ }
- 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); }
+ HFONT getFont() { return mski.GetFont(field); }
+ COLORREF getFontColor() { return mski.GetFontColor(field); }
+
+private:
+ TCHAR *text;
};
class SkinIconField : public SkinField
@@ -54,8 +77,8 @@ 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); }
+ void setIcon(HICON hIcon) { mski.SetIcon(field, hIcon); }
+ HICON getIcon() { return mski.GetIcon(field); }
};
class SkinImageField : public SkinField
@@ -63,8 +86,8 @@ 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); }
+ void setImage(HBITMAP hBmp) { mski.SetImage(field, hBmp); }
+ HBITMAP getImage() { return mski.GetImage(field); }
};
@@ -73,26 +96,28 @@ class SkinDialog
public:
SkinDialog(const char *name, const char *description, const char *module)
{
- dlg = mski->RegisterDialog(name, description, module);
+ dlg = mski.RegisterDialog(name, description, module);
}
~SkinDialog()
{
- mski->DeleteDialog(dlg);
+ mski.DeleteDialog(dlg);
dlg = NULL;
}
- void finishedConfiguring() { mski->FinishedConfiguring(dlg); }
- void setSize(int width, int height) { mski->SetDialogSize(dlg, width, height); }
+ BOOL isValid() { return dlg != NULL; }
+ void finishedConfiguring() { mski.FinishedConfiguring(dlg); }
+ void setSize(int width, int height) { mski.SetDialogSize(dlg, width, height); }
+ RECT getBorders() { return mski.GetBorders(dlg); }
- 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 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) ); }
+ 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;
diff --git a/Plugins/skins/skins.cpp b/Plugins/skins/skins.cpp
index 188018e..dca8ca0 100644
--- a/Plugins/skins/skins.cpp
+++ b/Plugins/skins/skins.cpp
@@ -354,15 +354,6 @@ void Interface_FinishedConfiguring(SKINNED_DIALOG 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)
@@ -424,24 +415,63 @@ SKINNED_FIELD Interface_GetField(SKINNED_DIALOG aDlg, const char *name)
return (SKINNED_FIELD) dlg->getField(name);
}
+void Interface_SetDialogSize(SKINNED_DIALOG aDlg, int width, int height)
+{
+ if (aDlg == NULL)
+ return;
+
+ MirandaSkinnedDialog *dlg = (MirandaSkinnedDialog *) aDlg;
+ dlg->setSize(Size(width, height));
+}
+
+RECT Interface_GetBorders(SKINNED_DIALOG aDlg)
+{
+ RECT ret = {0};
+
+ if (aDlg == NULL)
+ return ret;
+
+ MirandaSkinnedDialog *dlg = (MirandaSkinnedDialog *) aDlg;
+ BorderState *borders = dlg->getState()->getBorders();
+
+ ret.left = borders->getLeft();
+ ret.top = borders->getTop();
+ ret.right = borders->getRight();
+ ret.bottom = borders->getBottom();
+
+ return ret;
+}
+
+static inline int beetween(int val, int minVal, int maxVal)
+{
+ return max(minVal, min(maxVal, val));
+}
+
RECT Interface_GetRect(SKINNED_FIELD aField)
{
- RECT ret = { 0, 0, -1, -1 };
+ RECT ret = { 0, 0, 0, 0 };
if (aField == NULL)
return ret;
Field *field = (Field *) aField;
MirandaSkinnedDialog *dlg = (MirandaSkinnedDialog *) field->getDialog();
- FieldState *fieldState = dlg->getState()->getField(field->getName());
+ DialogState *dlgState = dlg->getState();
+ FieldState *fieldState = dlgState->getField(field->getName());
if (!fieldState->isVisible())
return ret;
- ret.left = fieldState->getLeft();
- ret.top = fieldState->getTop();
- ret.right = fieldState->getRight();
- ret.bottom = fieldState->getBottom();
+ BorderState *borders = dlgState->getBorders();
+ int left = max(0, borders->getLeft());
+ int right = max(left, min(dlgState->getWidth(), dlgState->getWidth() - borders->getRight()));
+ int top = max(0, borders->getTop());
+ int bottom = max(top, min(dlgState->getHeight(), dlgState->getHeight() - borders->getBottom()));
+
+ ret.left = beetween(fieldState->getLeft() + borders->getLeft(), left, right);
+ ret.right = beetween(fieldState->getRight(), left, right);
+ ret.top = beetween(fieldState->getTop() + borders->getTop(), top, bottom);
+ ret.bottom = beetween(fieldState->getBottom(), top, bottom);
return ret;
}
@@ -458,7 +488,7 @@ BOOL Interface_IsVisible(SKINNED_FIELD aField)
return fieldState->isVisible();
}
-void Interface_SetText(SKINNED_FIELD aField, const TCHAR *text)
+void Interface_SetTextA(SKINNED_FIELD aField, const char *text)
{
if (aField == NULL)
return;
@@ -467,17 +497,36 @@ void Interface_SetText(SKINNED_FIELD aField, const TCHAR *text)
switch(field->getType())
{
case SIMPLE_TEXT:
- ((TextField *) field)->setText(text);
+ ((TextField *) field)->setText(CharToTchar(text));
break;
case CONTROL_LABEL:
case CONTROL_BUTTON:
case CONTROL_EDIT:
- ((ControlField *) field)->setText(text);
+ ((ControlField *) field)->setText(CharToTchar(text));
break;
}
}
-const TCHAR * Interface_GetText(SKINNED_FIELD aField)
+void Interface_SetTextW(SKINNED_FIELD aField, const WCHAR *text)
+{
+ if (aField == NULL)
+ return;
+
+ Field *field = (Field *) aField;
+ switch(field->getType())
+ {
+ case SIMPLE_TEXT:
+ ((TextField *) field)->setText(WcharToTchar(text));
+ break;
+ case CONTROL_LABEL:
+ case CONTROL_BUTTON:
+ case CONTROL_EDIT:
+ ((ControlField *) field)->setText(WcharToTchar(text));
+ break;
+ }
+}
+
+char * Interface_GetTextA(SKINNED_FIELD aField)
{
if (aField == NULL)
return NULL;
@@ -489,11 +538,33 @@ const TCHAR * Interface_GetText(SKINNED_FIELD aField)
switch(field->getType())
{
case SIMPLE_TEXT:
- return ((TextFieldState *) fieldState)->getText();
+ return TcharToChar(((TextFieldState *) fieldState)->getText()).detach();
case CONTROL_LABEL:
case CONTROL_BUTTON:
case CONTROL_EDIT:
- return ((ControlFieldState *) field)->getText();
+ return TcharToChar(((ControlFieldState *) field)->getText()).detach();
+ }
+
+ return NULL;
+}
+
+WCHAR * Interface_GetTextW(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 TcharToWchar(((TextFieldState *) fieldState)->getText()).detach();
+ case CONTROL_LABEL:
+ case CONTROL_BUTTON:
+ case CONTROL_EDIT:
+ return TcharToWchar(((ControlFieldState *) field)->getText()).detach();
}
return NULL;
@@ -616,18 +687,21 @@ static int Service_GetInterface(WPARAM wParam, LPARAM lParam)
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->SetDialogSize = &Interface_SetDialogSize;
+ mski->GetBorders = &Interface_GetBorders;
mski->GetRect = &Interface_GetRect;
mski->IsVisible = &Interface_IsVisible;
- mski->SetText = &Interface_SetText;
- mski->GetText = &Interface_GetText;
+ mski->SetTextA = &Interface_SetTextA;
+ mski->SetTextW = &Interface_SetTextW;
+ mski->GetTextA = &Interface_GetTextA;
+ mski->GetTextW = &Interface_GetTextW;
mski->GetFont = &Interface_GetFont;
mski->GetFontColor = &Interface_GetFontColor;
diff --git a/Plugins/skins/skins.vcproj b/Plugins/skins/skins.vcproj
index 17f588b..78d7b66 100644
--- a/Plugins/skins/skins.vcproj
+++ b/Plugins/skins/skins.vcproj
@@ -49,7 +49,7 @@
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="../../include,sdk,libs"
- PreprocessorDefinitions="WIN32;W32;_DEBUG;_WINDOWS;_USRDLL;_CRT_SECURE_NO_WARNINGS"
+ PreprocessorDefinitions="WIN32;W32;_DEBUG;_WINDOWS;_USRDLL;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_WARNINGS"
RuntimeLibrary="1"
PrecompiledHeaderFile=".\Debug/skins.pch"
AssemblerListingLocation=".\Debug/"
@@ -147,7 +147,7 @@
InlineFunctionExpansion="0"
WholeProgramOptimization="true"
AdditionalIncludeDirectories="../../include,sdk,libs"
- PreprocessorDefinitions="WIN32;W32;NDEBUG;_WINDOWS;_USRDLL;_CRT_SECURE_NO_WARNINGS"
+ PreprocessorDefinitions="WIN32;W32;NDEBUG;_WINDOWS;_USRDLL;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_WARNINGS"
StringPooling="true"
RuntimeLibrary="0"
EnableFunctionLevelLinking="true"
@@ -273,7 +273,7 @@
<Tool
Name="VCLinkerTool"
AdditionalOptions="/ALIGN:4096 /filealign:0x200 /ignore:4108 "
- AdditionalDependencies="msimg32.lib comctl32.lib $(ProjectDir)libs\v8_g.lib"
+ AdditionalDependencies="msimg32.lib comctl32.lib $(ProjectDir)libs\v8.lib"
OutputFile="..\..\bin\debug unicode\Plugins\skinsW.dll"
LinkIncremental="2"
SuppressStartupBanner="true"
@@ -347,7 +347,7 @@
FavorSizeOrSpeed="1"
WholeProgramOptimization="true"
AdditionalIncludeDirectories="../../include,sdk,libs"
- PreprocessorDefinitions="WIN32;W32;NDEBUG;_WINDOWS;UNICODE;_USRDLL;_CRT_SECURE_NO_WARNINGS"
+ PreprocessorDefinitions="WIN32;W32;NDEBUG;_WINDOWS;UNICODE;_USRDLL;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_WARNINGS"
StringPooling="true"
RuntimeLibrary="0"
EnableFunctionLevelLinking="true"