/*
 * services
 */

#define MS_CLNSE_INVOKE "CLN_Skinedit/Invoke"
#define MS_CLNSE_FILLBYCURRENTSEL "CLN_Skinedit/FillByCurrentSel"

/*
 * data structs
 */

struct TWindowData;
class CImageItem;

struct ButtonItem {
    TCHAR   szName[40];
    HWND    hWnd;
    LONG    xOff, yOff;
    LONG    width, height;
    CImageItem *imgNormal, *imgPressed, *imgHover;
    LONG_PTR normalGlyphMetrics[4];
    LONG_PTR hoverGlyphMetrics[4];
    LONG_PTR pressedGlyphMetrics[4];
    DWORD   dwFlags, dwStockFlags;
    DWORD   uId;
    TCHAR   szTip[256];
    char    szService[256];
    char    szModule[256], szSetting[256];
    BYTE    bValuePush[256], bValueRelease[256];
    DWORD   type;
    void    (*pfnAction)(ButtonItem *item, HWND hwndDlg, TWindowData *dat, HWND hwndItem);
    void    (*pfnCallback)(ButtonItem *item, HWND hwndDlg, TWindowData *dat, HWND hwndItem);
    TCHAR   tszLabel[40];
    ButtonItem* nextItem;
	HANDLE  hContact;
	TWindowData *dat;
};

typedef struct _tagButtonSet {
    ButtonItem  *items;
    LONG        left, top, right, bottom;               // client area offsets, calculated from button layout
} ButtonSet;

struct CSkinItem {
    TCHAR szName[40];
    char szDBname[40];
    int statusID;

    BYTE GRADIENT;
    BYTE CORNER;

    DWORD COLOR;
    DWORD COLOR2;

    BYTE COLOR2_TRANSPARENT;

    DWORD TEXTCOLOR;

    int ALPHA;

    int MARGIN_LEFT;
    int MARGIN_TOP;
    int MARGIN_RIGHT;
    int MARGIN_BOTTOM;
    BYTE IGNORED;
    DWORD BORDERSTYLE;
    CImageItem *imageItem;
};

typedef struct _tagSkinDescription {
    DWORD           cbSize;
    CSkinItem   *StatusItems;
    int             lastItem;
    int             firstItem;
    char            szModule[100];
    HWND            hWndParent, hWndTab;
    HWND            hwndCLUI;
    HWND            hwndSkinEdit;                       /* out param */
    HWND            hwndImageEdit;                      /* out param */
    HMENU           hMenuItems;
    void            (*pfnSaveCompleteStruct)(void);
    void            (*pfnClcOptionsChanged )(void);
    void*           (*pfnMalloc)(unsigned int);
    void            (*pfnFree)(void);
    void*           (*pfnRealloc)(void *, unsigned int);
    void*           reserved[20];
} SKINDESCRIPTION;

// defines

// FLAGS
#define CORNER_NONE 0
#define CORNER_ACTIVE 1
#define CORNER_TL 2
#define CORNER_TR 4
#define CORNER_BR 8
#define CORNER_BL 16
#define CORNER_ALL (CORNER_TL | CORNER_TR | CORNER_BR | CORNER_BL | CORNER_ACTIVE)

#define GRADIENT_NONE 0
#define GRADIENT_ACTIVE 1
#define GRADIENT_LR 2
#define GRADIENT_RL 4
#define GRADIENT_TB 8
#define GRADIENT_BT 16

#define IMAGE_PERPIXEL_ALPHA 1
#define IMAGE_FLAG_DIVIDED 2
#define IMAGE_FILLSOLID 4
#define IMAGE_GLYPH 8

#define IMAGE_STRETCH_V 1
#define IMAGE_STRETCH_H 2
#define IMAGE_STRETCH_B 4

#define BUTTON_ISINTERNAL 1
#define BUTTON_ISTOGGLE 2
#define BUTTON_ISSERVICE 4
#define BUTTON_ISPROTOSERVICE 8
#define BUTTON_PASSHCONTACTW 16
#define BUTTON_PASSHCONTACTL 32
#define BUTTON_ISDBACTION    64
#define BUTTON_ISCONTACTDBACTION 128
#define BUTTON_DBACTIONONCONTACT 256
#define BUTTON_ISSIDEBAR 512
#define BUTTON_NORMALGLYPHISICON 1024
#define BUTTON_PRESSEDGLYPHISICON 2048
#define BUTTON_HOVERGLYPHISICON 4096
#define BUTTON_HASLABEL 8192

#define CLCDEFAULT_GRADIENT 0
#define CLCDEFAULT_CORNER 0

#define CLCDEFAULT_COLOR 0xd0d0d0
#define CLCDEFAULT_COLOR2 0xd0d0d0

#define CLCDEFAULT_TEXTCOLOR 0x000000

#define CLCDEFAULT_COLOR2_TRANSPARENT 1

#define CLCDEFAULT_ALPHA 100
#define CLCDEFAULT_MRGN_LEFT 0
#define CLCDEFAULT_MRGN_TOP 0
#define CLCDEFAULT_MRGN_RIGHT 0
#define CLCDEFAULT_MRGN_BOTTOM 0
#define CLCDEFAULT_IGNORE 1