{
Miranda IM: the free IM client for Microsoft* Windows*

Copyright 2000-2008 Miranda ICQ/IM project, 
all portions of this codebase are copyrighted to the people 
listed in contributors.txt.

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program 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 General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
}

{$IFNDEF M_SKE}
{$DEFINE M_SKE}

const
//*defaults*/
//  DEFAULT_FIT_MODE   = FM_STRETCH;
//  DEFAULT_STYLE      = ST_BRUSH  ;
//  DEFAULT_BKCOLOUR    GetSysColor(COLOR_3DFACE);
//  DEFAULT_SELBKCOLOUR GetSysColor(COLOR_HIGHLIGHT);

  SIZING_MARGIN = 3;

//* Fit mode */
  FM_STRETCH   = 0;
  FM_TILE_HORZ = 1;
  FM_TILE_VERT = 2;
  FM_TILE_BOTH = 3;

//*Object types*/
  OT_ANY         = 0;
  OT_GLYPHOBJECT = 1;
  OT_FONTOBJECT  = 2;

//*STYLE INDEXEX*/
  ST_SKIP     = 0;
  ST_PARENT   = 1;
  ST_BRUSH    = 2;
  ST_IMAGE    = 3;
  ST_SOLARIZE = 4;  //Not used yet.
  ST_FRAGMENT = 5;
  ST_GRADIENT = 6;

//formats:
  ADT_TOP     = $00000000;
  ADT_LEFT    = $00000000;
  ADT_HCENTER = $00000001;
  ADT_RIGHT   = $00000002;
  ADT_VCENTER = $00000004;
  ADT_BOTTOM  = $00000008;
//  ADT_ECLIPSE = 64;


//*SERVICES*/

//toggle the 'hide offline contacts' flag and call CLUI   
//wParam=0
//lParam=0
  MS_CLIST_TOGGLEHIDEOFFLINE:PAnsiChar = 'CList/ToggleHideOffline';

  MS_CLIST_TOGGLEGROUPS:PAnsiChar = 'CList/ToggleGroups';

  MS_CLIST_TOGGLESOUNDS:PAnsiChar = 'CList/ToggleSounds';

// Add new object to skin object list.
// wParam = pointer to SKINOBJECTDESCRIPTOR structure
// lParam = 0 ( used for internal purposes: pointer to skin object list)
  MS_SKIN_REGISTEROBJECT:PAnsiChar = 'ModernList/RegisterObject';

// Add new object to skin object list.
// wParam = pointer to DEF_SKIN_OBJECT_PARAMS structure
// lParam = 0 ( used for internal purposes: pointer to skin object list)
  MS_SKIN_REGISTERDEFOBJECT:PAnsiChar = 'ModernList/RegisterDefObject';

type
  DEF_SKIN_OBJECT_PARAMS = record
    szObjectID:PAnsiChar;
    defStyle:byte;
    defColor:dword;
    //  Skin: PSKINOBJECTSLIST;
  end;

const
// Request painting glyph object 
// wParam = pointer to SKINDRAWREQUEST structure
// lParam = 0
  MS_SKIN_DRAWGLYPH:PAnsiChar = 'ModernList/DrawGlyph';


//* EVENTS */
  ME_SKIN_SERVICESCREATED:PAnsiChar = 'ModernList/ServicesCreated';

//* DRAWGLYPH Request structure */
type
  PSKINDRAWREQUEST = ^TSKINDRAWREQUEST;
  TSKINDRAWREQUEST = record
    szObjectID:array [0..254] of AnsiChar; // Unic Object ID (path) to paint
    rcDestRect:TRECT;                      // Rectangle to fit
    rcClipRect:TRECT;                      // Rectangle to paint in.
    hDC:HDC;                               // Handler to device context to paint in. 
  end;

//* SKINOBJECTDESCRIPTOR opbject descriptor structure */
type
  PSKINOBJECTDESCRIPTOR = ^TSKINOBJECTDESCRIPTOR;
  TSKINOBJECTDESCRIPTOR = record
    bType:byte;           // One of OT_* values.
    szObjectID:PAnsiChar; // Unic Object ID (path) [255] max
    Data:pointer;         // Pointer to GLYPHOBJECT strycture if bType==OT_GLYPHOBJECT
  end;

//* SKINOBJECTDESCRIPTOR opbject descriptor structure */
type
  PGLYPHOBJECT = ^TGLYPHOBJECT;
  TGLYPHOBJECT = record
    Style      :byte;        // One of ST_* values 
    hGlyph     :HBITMAP;     // Bitmap handler (for internal use only)
    dwTop,
    dwLeft,
    dwBottom,
    dwRight    :dword;       // Margins 
    szFileName :PAnsiChar;   // FileName of image
    dwColor    :dword;       // Fill color
    dwAlpha    :byte;        // Constant alpha-transparency level
    FitMode    :byte;        // One of FM_* values
    clipArea   :TPOINT;      // Object image rect on full image
    szclipArea :TSIZE;       // Object image rect on full image
    plTextList :PSortedList; // List of GLYPHTEXT
    bmWidth    :long;
    bmHeight   :long;
    bmBitsPixel:byte;
  end;

//* SKINTEXTDESCRIPTOR opbject descriptor structure */
type
  PGLYPHTEXT = ^TGLYPHTEXT;
  TGLYPHTEXT = record
    szGlyphTextID:PAnsiChar;
    stText       :TChar;
    stValueText  :TChar;
    dwFlags      :dword;
    dwColor      :dword;  // Color (InvAA)(RR)(GG)(BB)
    dwShadow     :dword;  //ToDo: Color2/Shaddow
    iLeft,iTop,iRight,iBottom:int;
    RelativeFlags:byte;
    szFontID     :PAnsiChar;
    hFont        :HFONT;
    szObjectName :PAnsiChar;
  end;

//* SKINTEXTDESCRIPTOR opbject descriptor structure */
type
  PSKINFONT = ^TSKINFONT;
  TSKINFONT = record
    szFontID:PAnsiChar;
    hFont   :HFONT;
  end;

//* HELPER FUNCTIONS */
(*
//Paint  ObjectID as parent background for frame hwndIn
int __inline SkinDrawWindowBack(HWND hwndIn, HDC hdc, RECT * rcClip, char * objectID)
{
	SKINDRAWREQUEST rq;
	POINT pt={0};
	RECT rc,r1;

	HWND hwnd=(HWND)CallService(MS_CLUI_GETHWND,0,0);
	if (!objectID) return 0;
	GetWindowRect(hwndIn,&r1);
	pt.x=r1.left;
	pt.y=r1.top;
	//ClientToScreen(hwndIn,&pt);
	GetWindowRect(hwnd,&rc);
	OffsetRect(&rc,-pt.x ,-pt.y);
	rq.hDC=hdc;
	rq.rcDestRect=rc;
	rq.rcClipRect=*rcClip;
	lstrcpynA(rq.szObjectID,objectID,sizeof(rq.szObjectID));
	///ske_Service_DrawGlyph((WPARAM)&rq,0);    //$$$
	return CallService(MS_SKIN_DRAWGLYPH,(WPARAM)&rq,0);
}


//Paint  ObjectID
int __inline SkinDrawGlyph(HDC hdc, RECT * rcSize, RECT * rcClip, char * objectID);

//Register object with predefined style
int __inline CreateGlyphedObjectDefStyle(char * ObjID,BYTE defStyle);
int __inline CreateGlyphedObjectDefColor(char * ObjID,dword defColor);
//Register default object
int __inline CreateGlyphedObject(char * ObjID);


//// Creating and registering objects
//int __inline CreateGlyphedObject(char * ObjID)
//{   
//    DEF_SKIN_OBJECT_PARAMS prm={0};
//    prm.defColor=DEFAULT_BKCOLOUR;
//    prm.defStyle=DEFAULT_STYLE;
//    prm.szObjectID=ObjID;   
//    return CallService(MS_SKIN_REGISTERDEFOBJECT,(WPARAM)&prm,0);
//}
static BOOL __inline ScreenToClientRect(HWND hWnd, LPRECT lpRect)
{
	BOOL ret;

	POINT pt;

	pt.x = lpRect->left;
	pt.y = lpRect->top;

	ret = ScreenToClient(hWnd, &pt);

	if (!ret) return ret;

	lpRect->left = pt.x;
	lpRect->top = pt.y;


	pt.x = lpRect->right;
	pt.y = lpRect->bottom;

	ret = ScreenToClient(hWnd, &pt);

	lpRect->right = pt.x;
	lpRect->bottom = pt.y;

	return ret;
}

//int __inline CreateGlyphedObjectDefStyle(char * ObjID,BYTE defStyle)
//{
//    DEF_SKIN_OBJECT_PARAMS prm={0};
//    prm.defColor=DEFAULT_BKCOLOUR;
//    prm.defStyle=defStyle;
//    prm.szObjectID=ObjID;
//    return CallService(MS_SKIN_REGISTERDEFOBJECT,(WPARAM)&prm,0);
//}  
//int __inline CreateGlyphedObjectDefColor(char * ObjID,dword defColor)
//{
//    DEF_SKIN_OBJECT_PARAMS prm={0};
//    prm.defColor=defColor;
//    prm.defStyle=ST_BRUSH;
//    prm.szObjectID=ObjID;
//    return CallService(MS_SKIN_REGISTERDEFOBJECT,(WPARAM)&prm,0);
//}  
static int __inline SkinDrawGlyph(HDC hdc, RECT * rcSize, RECT * rcClip, char * objectID)
{
	SKINDRAWREQUEST rq;
	if (!objectID) return 0;
	rq.hDC=hdc;
	rq.rcDestRect=*rcSize;
	rq.rcClipRect=*rcClip;  
	lstrcpynA(rq.szObjectID,objectID,sizeof(rq.szObjectID));
	return CallService(MS_SKIN_DRAWGLYPH,(WPARAM)&rq,0);
}
*)
//#include "../hdr/modern_skin_selector.h"

//////////////////////////////////////////////
//                                          //
//  New Painting sequence servises          //
//                                          //
//////////////////////////////////////////////

type
  sPaintRequest = record
    dStructSize :dword;                 // size of structure
    hWnd        :HWND;                  // called by window
    hDC         :HDC;                   // context to draw on
    rcUpdate    :TRECT;                 // rectangle to be painted in (relative to Top-Left corner of Main window)
    dwFlags     :dword;                 // drawing flags
    CallbackData:pointer;               // Data for passing to callback procedure
    Reserved    :array [0..15] of byte; // reserved for farther usage;
  end;

const
// Request to register sub for callback painting frame area
// wParam = hWnd of called frame
// lParam = pointer to tPaintCallBackProc    (or NULL to remove)
// return 1 - succes, 0 - failure
  MS_SKINENG_REGISTERPAINTSUB:PAnsiChar = 'SkinEngine/ske_Service_RegisterFramePaintCallbackProcedure';

// Request to repaint frame or change/drop callback data immeadeately
// wParam = hWnd of called frame
// lParam = pointer to sPaintRequest (or NULL to redraw all)
  MS_SKINENG_UPTATEFRAMEIMAGE:PAnsiChar = 'SkinEngine/ske_Service_UpdateFrameImage';

// Request to repaint frame or change/drop callback data
// wParam = hWnd of called frame
// lParam = pointer to sPaintRequest (or NULL to redraw all)
// return 2 - already queued, data updated, 1-have been queued, 0 - failure
  MS_SKINENG_INVALIDATEFRAMEIMAGE:PAnsiChar = 'SkinEngine/ske_Service_InvalidateFrameImage';

// Callback proc type
type
  tPaintCallbackProc = function(hWnd:HWND; hDC:HDC; rcPaint:PRECT; rgnUpdate:HRGN;
       dFlags:dword; CallBackData:pointer):int;

// HELPER TO UPDATEIMAGEFRAME

(*
inline BOOL isSkinEngineEnabled()
{
	return ServiceExists(MS_SKINENG_REGISTERPAINTSUB) && !DBGetContactSettingByte(NULL, "ModernData", "DisableEngine", FALSE);
}


inline BOOL isLayeredEnabled()
{
	return isSkinEngineEnabled() && DBGetContactSettingByte(NULL, "ModernData", "EnableLayering", TRUE);
}

int __inline SkinEngUpdateImageFrame(HWND hwnd, RECT * rcUpdate, dword dwFlags, void * CallBackData)
{
  sPaintRequest sr={0};
  sr.dStructSize=sizeof(sPaintRequest);
  sr.hWnd=hwnd;
  if (rcUpdate)
    sr.rcUpdate=*rcUpdate;
  sr.dwFlags=dwFlags;
  sr.CallbackData=CallBackData;
  return CallService(MS_SKINENG_UPTATEFRAMEIMAGE,(WPARAM)hwnd,(LPARAM)&sr);
}

int __inline SkinEngInvalidateImageFrame(HWND hwnd, CONST RECT * rcUpdate, dword dwFlags, void * CallBackData)
{
  sPaintRequest sr={0};
  if (hwnd && !isLayeredEnabled()) return InvalidateRect(hwnd,rcUpdate,dwFlags);
  sr.dStructSize=sizeof(sPaintRequest);
  sr.hWnd=hwnd;
  if (rcUpdate)
    sr.rcUpdate=*rcUpdate;
  sr.dwFlags=dwFlags;
  sr.CallbackData=CallBackData;
  return CallService(MS_SKINENG_INVALIDATEFRAMEIMAGE,(WPARAM)hwnd,(LPARAM)&sr);
}


int __inline SkinInvalidateFrame(HWND hWnd, CONST RECT* lpRect,BOOL bErase)
{
	return SkinEngInvalidateImageFrame(hWnd,lpRect,0,0);
}
*)
// Alpha channel GDI replacements/helpers

const
// 
// Paints text with correct alpha channel
// wParam - pointer to AlphaTextOutParams
  MS_SKINENG_ALPHATEXTOUT:PAnsiChar = 'SkinEngine/ske_AlphaTextOut';

type
  TAlphaTextOutParams = record
    HDC      :HDC;
    lpString :TChar;
    nCount   :int;
    lpRect   :PRECT;
    forma    :uint;
    ARGBcolor:dword;
    reserv   :array [0..15] of byte;
  end;
(*
int __inline AlphaText(HDC hDC, LPCTSTR lpString, int nCount, RECT * lpRect, UINT format, dword ARGBcolor)
{
  AlphaTextOutParams ap={0};
  ap.hDC=hDC;
  ap.lpString=lpString;
  ap.nCount=nCount;
  ap.lpRect=lpRect;
  ap.format=format;
  ap.ARGBcolor=ARGBcolor;
  return CallService(MS_SKINENG_ALPHATEXTOUT,(WPARAM)&ap,0);
}
*)
type
  ImageListFixParam = record
    himl :THANDLE; //HIMAGELIST;
    index:int;
    hicon:HICON;
  end;

type
  DrawIconFixParam = record
    hdc               :HDC;
    xLeft             :int;
    yTop              :int;
    hIcon             :HICON;
    cxWidth           :int;
    cyWidth           :int;
    istepIfAniCur     :uint;
    hbrFlickerFreeDraw:HBRUSH;
    diFlags           :uint;
  end;

const
//wParam - pointer to DrawIconFixParam
  MS_SKINENG_DRAWICONEXFIX:PAnsiChar = 'SkinEngine/DrawIconEx_Fix';
(*
int __inline mod_DrawIconEx_helper(HDC hdc,int xLeft,int yTop,HICON hIcon,int cxWidth,int cyWidth, UINT istepIfAniCur, HBRUSH hbrFlickerFreeDraw, UINT diFlags)
{
  DrawIconFixParam p={0};
  p.hdc=hdc;
  p.xLeft=xLeft;
  p.yTop=yTop;
  p.hIcon=hIcon;
  p.cxWidth=cxWidth;
  p.cyWidth=cyWidth;
  p.istepIfAniCur=istepIfAniCur;
  p.hbrFlickerFreeDraw=hbrFlickerFreeDraw;
  p.diFlags=diFlags;
  return CallService(MS_SKINENG_DRAWICONEXFIX,(WPARAM)&p,0);
}
*)
const
//  Register of plugin's user
//
//  wParam = (WPARAM)szSetting - string that describes a user
//           format: Category/ModuleName,
//           eg: "Contact list background/CLUI",
//               "Status bar background/StatusBar"
//  lParam = (LPARAM)dwFlags
//
  MS_BACKGROUNDCONFIG_REGISTER:PAnsiChar = 'ModernBkgrCfg/Register';

//
//  Notification about changed background
//  wParam = ModuleName
//  lParam = 0
  ME_BACKGROUNDCONFIG_CHANGED:PAnsiChar = 'ModernBkgrCfg/Changed';


{$ENDIF}