diff options
Diffstat (limited to 'plugins/Modernb/modern_skineditor.cpp')
-rw-r--r-- | plugins/Modernb/modern_skineditor.cpp | 859 |
1 files changed, 859 insertions, 0 deletions
diff --git a/plugins/Modernb/modern_skineditor.cpp b/plugins/Modernb/modern_skineditor.cpp new file mode 100644 index 0000000000..0f3b95a9df --- /dev/null +++ b/plugins/Modernb/modern_skineditor.cpp @@ -0,0 +1,859 @@ +/*
+
+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.
+*/
+#include "hdr/modern_commonheaders.h"
+#include "m_clui.h"
+#include "hdr/modern_clist.h"
+#include "m_clc.h"
+#include "io.h"
+#include "hdr/modern_commonprototypes.h"
+#include "hdr/modern_sync.h"
+
+typedef struct _OPT_OBJECT_DATA
+{
+ char * szName;
+ char * szPath;
+ char * szValue;
+ char * szTempValue;
+} OPT_OBJECT_DATA;
+
+static char *gl_Mask=NULL;
+HWND gl_Dlg=NULL;
+int gl_controlID=0;
+int EnableGroup(HWND hwndDlg, HWND first, BOOL bEnable);
+int ShowGroup(HWND hwndDlg, HWND first, BOOL bEnable);
+BOOL glOtherSkinWasLoaded=FALSE;
+BYTE glSkinWasModified=0; //1- but not applied, 2-stored to DB
+HTREEITEM FindChild(HWND hTree, HTREEITEM Parent, char * Caption)
+{
+ HTREEITEM res=NULL, tmp=NULL;
+ if (Parent)
+ tmp=TreeView_GetChild(hTree,Parent);
+ else
+ tmp=TreeView_GetRoot(hTree);
+ while (tmp)
+ {
+ TVITEMA tvi;
+ char buf[255];
+ tvi.hItem=tmp;
+ tvi.mask=TVIF_TEXT|TVIF_HANDLE;
+ tvi.pszText=(LPSTR)&buf;
+ tvi.cchTextMax=254;
+ TreeView_GetItemA(hTree,&tvi);
+ if (mir_bool_strcmpi(Caption,tvi.pszText))
+ return tmp;
+ tmp=TreeView_GetNextSibling(hTree,tmp);
+ }
+ return tmp;
+}
+
+int TreeAddObject(HWND hwndDlg, int ID, OPT_OBJECT_DATA * data)
+{
+ HTREEITEM rootItem=NULL;
+ HTREEITEM cItem=NULL;
+ char * path;
+ char * ptr;
+ char * ptrE;
+ char buf[255];
+ BOOL ext=FALSE;
+ path=data->szPath?mir_strdup(data->szPath):(data->szName[1]=='$')?mir_strdup((data->szName)+2):NULL;
+ if (!path)
+ {
+ mir_snprintf(buf,SIZEOF(buf),"$(other)/%s",(data->szName)+1);
+ path=mir_strdup(buf);
+ }
+
+ ptr=path;
+ ptrE=path;
+ do
+ {
+
+ while (*ptrE!='/' && *ptrE!='\0') ptrE++;
+ if (*ptrE=='/')
+ {
+ *ptrE='\0';
+ ptrE++;
+ // find item if not - create;
+ {
+ cItem=FindChild(GetDlgItem(hwndDlg,ID),rootItem,ptr);
+ if (!cItem) // not found - create node
+ {
+ TVINSERTSTRUCTA tvis;
+ tvis.hParent=rootItem;
+ tvis.hInsertAfter=TVI_SORT;
+ tvis.item.mask=TVIF_PARAM|TVIF_TEXT|TVIF_PARAM;
+ tvis.item.pszText=ptr;
+ tvis.item.lParam=(LPARAM)NULL;
+ cItem=TreeView_InsertItemA(GetDlgItem(hwndDlg,ID),&tvis);
+
+ }
+ rootItem=cItem;
+ }
+ ptr=ptrE;
+ }
+ else ext=TRUE;
+ }while (!ext);
+ //Insert item node
+ {
+ TVINSERTSTRUCTA tvis;
+ tvis.hParent=rootItem;
+ tvis.hInsertAfter=TVI_SORT;
+ tvis.item.mask=TVIF_PARAM|TVIF_TEXT|TVIF_PARAM;
+ tvis.item.pszText=ptr;
+ tvis.item.lParam=(LPARAM)data;
+ TreeView_InsertItemA(GetDlgItem(hwndDlg,ID),&tvis);
+ }
+ mir_free_and_nill(path);
+ return 0;
+}
+
+int enumDB_SkinObjectsForEditorProc(const char *szSetting,LPARAM lParam)
+{
+ if (wildcmp((char *)szSetting,gl_Mask,0)||wildcmp((char *)szSetting,"$*",0))
+ {
+ char * value;
+ char *desc;
+ char *descKey;
+ descKey=mir_strdup(szSetting);
+ descKey[0]='%';
+ value= ModernGetStringA(NULL,SKIN,szSetting);
+ desc= ModernGetStringA(NULL,SKIN,descKey);
+ if (wildcmp(value,"?lyph*",0))
+ {
+ OPT_OBJECT_DATA * a=(OPT_OBJECT_DATA*)mir_alloc(sizeof(OPT_OBJECT_DATA));
+ a->szPath=desc;
+ a->szName=mir_strdup(szSetting);
+ a->szValue=value;
+ a->szTempValue=NULL;
+ TreeAddObject(gl_Dlg,gl_controlID,a);
+ }
+ else
+ {
+ if (value) mir_free_and_nill(value);
+ if (desc) mir_free_and_nill(desc);
+ }
+ mir_free_and_nill(descKey);
+ }
+ return 0;
+}
+
+int FillObjectTree(HWND hwndDlg, int ObjectTreeID, char * wildmask)
+{
+ DBCONTACTENUMSETTINGS dbces;
+ gl_Dlg=hwndDlg;
+ gl_controlID=ObjectTreeID;
+ gl_Mask=wildmask;
+ dbces.pfnEnumProc=enumDB_SkinObjectsForEditorProc;
+ dbces.szModule=SKIN;
+ dbces.ofsSettings=0;
+ CallService(MS_DB_CONTACT_ENUMSETTINGS,0,(LPARAM)&dbces);
+ return 0;
+}
+TCHAR *TYPES[]={_T("- Empty - (do not draw this object)"),_T("Solid fill object"),_T("Image (draw image)"),_T("Fragment (draw portion of image)")};
+TCHAR *FITMODES[]={_T("Stretch Both directions"),_T("Stretch Vertical, Tile Horizontal"),_T("Tile Vertical, Stretch Horizontal"),_T("Tile Both directions")};
+
+void SetAppropriateGroups(HWND hwndDlg, int Type)
+//str contains default values
+{
+ switch (Type)
+ {
+ case -1:
+ {
+ EnableGroup(hwndDlg,GetDlgItem(hwndDlg,IDC_GROUP_1),FALSE);
+ EnableGroup(hwndDlg,GetDlgItem(hwndDlg,IDC_ST_COLOUR),FALSE);
+ EnableGroup(hwndDlg,GetDlgItem(hwndDlg,IDC_ST_ALPHA),FALSE);
+ EnableGroup(hwndDlg,GetDlgItem(hwndDlg,IDC_GROUP_2),FALSE);
+ EnableGroup(hwndDlg,GetDlgItem(hwndDlg,IDC_GROUP_3),FALSE);
+ ShowWindow(GetDlgItem(hwndDlg,IDC_S_SIZE),FALSE);
+ }
+ break;
+ case 0:
+ {
+ EnableGroup(hwndDlg,GetDlgItem(hwndDlg,IDC_GROUP_1),TRUE);
+ EnableGroup(hwndDlg,GetDlgItem(hwndDlg,IDC_ST_COLOUR),FALSE);
+ EnableGroup(hwndDlg,GetDlgItem(hwndDlg,IDC_ST_ALPHA),FALSE);
+ EnableGroup(hwndDlg,GetDlgItem(hwndDlg,IDC_GROUP_2),FALSE);
+ EnableGroup(hwndDlg,GetDlgItem(hwndDlg,IDC_GROUP_3),FALSE);
+ ShowWindow(GetDlgItem(hwndDlg,IDC_S_SIZE),FALSE);
+ }
+ break;
+ case 1:
+ {
+ EnableGroup(hwndDlg,GetDlgItem(hwndDlg,IDC_GROUP_1),TRUE);
+ EnableGroup(hwndDlg,GetDlgItem(hwndDlg,IDC_ST_COLOUR),TRUE);
+ EnableGroup(hwndDlg,GetDlgItem(hwndDlg,IDC_ST_ALPHA),TRUE);
+ EnableGroup(hwndDlg,GetDlgItem(hwndDlg,IDC_GROUP_2),FALSE);
+ EnableGroup(hwndDlg,GetDlgItem(hwndDlg,IDC_GROUP_3),FALSE);
+ ShowWindow(GetDlgItem(hwndDlg,IDC_S_SIZE),FALSE);
+ //Set Color and alpha
+ }
+ break;
+ case 2:
+ {
+ EnableGroup(hwndDlg,GetDlgItem(hwndDlg,IDC_GROUP_1),TRUE);
+ EnableGroup(hwndDlg,GetDlgItem(hwndDlg,IDC_ST_COLOUR),FALSE);
+ EnableGroup(hwndDlg,GetDlgItem(hwndDlg,IDC_ST_ALPHA),TRUE);
+ EnableGroup(hwndDlg,GetDlgItem(hwndDlg,IDC_GROUP_2),TRUE);
+ EnableGroup(hwndDlg,GetDlgItem(hwndDlg,IDC_GROUP_3),FALSE);
+ ShowWindow(GetDlgItem(hwndDlg,IDC_S_SIZE),TRUE);
+ //Set alpha, image, margins etc.
+ }
+ break;
+ case 3:
+ {
+ EnableGroup(hwndDlg,GetDlgItem(hwndDlg,IDC_GROUP_1),TRUE);
+ EnableGroup(hwndDlg,GetDlgItem(hwndDlg,IDC_ST_COLOUR),FALSE);
+ EnableGroup(hwndDlg,GetDlgItem(hwndDlg,IDC_ST_ALPHA),TRUE);
+ EnableGroup(hwndDlg,GetDlgItem(hwndDlg,IDC_GROUP_2),TRUE);
+ EnableGroup(hwndDlg,GetDlgItem(hwndDlg,IDC_GROUP_3),TRUE);
+ ShowWindow(GetDlgItem(hwndDlg,IDC_S_SIZE),TRUE);
+ //Set alpha, image, margins etc.
+ }
+ break;
+ }
+}
+
+void SetControls(HWND hwndDlg, char * str)
+{
+ char buf[250];
+ int Type=0;
+ if (!str)
+ {
+ SetAppropriateGroups(hwndDlg,-1);
+ return;
+ }
+ GetParamN(str,buf,SIZEOF(buf),1,',',TRUE);
+ if (mir_bool_strcmpi(buf,"Solid")) Type=1;
+ else if (mir_bool_strcmpi(buf,"Image")) Type=2;
+ else if (mir_bool_strcmpi(buf,"Fragment")) Type=3;
+ SendDlgItemMessage(hwndDlg,IDC_TYPE,CB_SETCURSEL,(WPARAM)Type,(LPARAM)0);
+ SetAppropriateGroups(hwndDlg,Type);
+ switch (Type)
+ {
+ case 1:
+ {
+ int r,g,b,a;
+ r=g=b=200;
+ a=255;
+ r=atoi(GetParamN(str,buf,SIZEOF(buf),2,',',TRUE));
+ g=atoi(GetParamN(str,buf,SIZEOF(buf),3,',',TRUE));
+ b=atoi(GetParamN(str,buf,SIZEOF(buf),4,',',TRUE));
+ a=atoi(GetParamN(str,buf,SIZEOF(buf),5,',',TRUE));
+ SendDlgItemMessage(hwndDlg,IDC_COLOR,CPM_SETCOLOUR,(WPARAM)0,(LPARAM)RGB(r,g,b));
+ SendDlgItemMessage(hwndDlg,IDC_COLOR,CPM_SETDEFAULTCOLOUR,(WPARAM)0,(LPARAM)RGB(r,g,b));
+ SendDlgItemMessage(hwndDlg,IDC_SPIN_ALPHA,UDM_SETPOS,0,MAKELONG(a,0));
+ }
+ break;
+ case 2:
+ {
+ int a;
+ int l,t,r,b;
+ int fitmode=0;
+ l=t=r=b=0;
+ a=255;
+
+ l=atoi(GetParamN(str,buf,SIZEOF(buf),4,',',TRUE));
+ t=atoi(GetParamN(str,buf,SIZEOF(buf),5,',',TRUE));
+ r=atoi(GetParamN(str,buf,SIZEOF(buf),6,',',TRUE));
+ b=atoi(GetParamN(str,buf,SIZEOF(buf),7,',',TRUE));
+ a=atoi(GetParamN(str,buf,SIZEOF(buf),8,',',TRUE));
+
+ SendDlgItemMessage(hwndDlg,IDC_SPIN_ALPHA,UDM_SETPOS,0,MAKELONG(a,0));
+ SendDlgItemMessage(hwndDlg,IDC_SPIN_LEFT,UDM_SETPOS,0,MAKELONG(l,0));
+ SendDlgItemMessage(hwndDlg,IDC_SPIN_TOP,UDM_SETPOS,0,MAKELONG(t,0));
+ SendDlgItemMessage(hwndDlg,IDC_SPIN_RIGHT,UDM_SETPOS,0,MAKELONG(r,0));
+ SendDlgItemMessage(hwndDlg,IDC_SPIN_BOTTOM,UDM_SETPOS,0,MAKELONG(b,0));
+
+ GetParamN(str,buf,SIZEOF(buf),2,',',TRUE);
+ SendDlgItemMessageA(hwndDlg,IDC_FILE,WM_SETTEXT,0,(LPARAM)buf);
+
+ GetParamN(str,buf,SIZEOF(buf),3,',',TRUE);
+ if (mir_bool_strcmpi(buf,"TileBoth")) fitmode=FM_TILE_BOTH;
+ else if (mir_bool_strcmpi(buf,"TileVert")) fitmode=FM_TILE_VERT;
+ else if (mir_bool_strcmpi(buf,"TileHorz")) fitmode=FM_TILE_HORZ;
+ else fitmode=0;
+ SendDlgItemMessage(hwndDlg,IDC_FIT,CB_SETCURSEL,(WPARAM)fitmode,(LPARAM)0);
+ }
+
+ break;
+ case 3:
+ {
+ int a;
+ int l,t,r,b;
+ int x,y,w,h;
+ int fitmode=0;
+ l=t=r=b=0;
+ x=y=w=h=0;
+ a=255;
+
+ x=atoi(GetParamN(str,buf,SIZEOF(buf),3,',',TRUE));
+ y=atoi(GetParamN(str,buf,SIZEOF(buf),4,',',TRUE));
+ w=atoi(GetParamN(str,buf,SIZEOF(buf),5,',',TRUE));
+ h=atoi(GetParamN(str,buf,SIZEOF(buf),6,',',TRUE));
+
+ l=atoi(GetParamN(str,buf,SIZEOF(buf),8,',',TRUE));
+ t=atoi(GetParamN(str,buf,SIZEOF(buf),9,',',TRUE));
+ r=atoi(GetParamN(str,buf,SIZEOF(buf),10,',',TRUE));
+ b=atoi(GetParamN(str,buf,SIZEOF(buf),11,',',TRUE));
+ a=atoi(GetParamN(str,buf,SIZEOF(buf),12,',',TRUE));
+
+ SendDlgItemMessage(hwndDlg,IDC_SPIN_ALPHA,UDM_SETPOS,0,MAKELONG(a,0));
+ SendDlgItemMessage(hwndDlg,IDC_SPIN_LEFT,UDM_SETPOS,0,MAKELONG(l,0));
+ SendDlgItemMessage(hwndDlg,IDC_SPIN_TOP,UDM_SETPOS,0,MAKELONG(t,0));
+ SendDlgItemMessage(hwndDlg,IDC_SPIN_RIGHT,UDM_SETPOS,0,MAKELONG(r,0));
+ SendDlgItemMessage(hwndDlg,IDC_SPIN_BOTTOM,UDM_SETPOS,0,MAKELONG(b,0));
+
+ SendDlgItemMessage(hwndDlg,IDC_SPIN_POSLEFT,UDM_SETPOS,0,MAKELONG(x,0));
+ SendDlgItemMessage(hwndDlg,IDC_SPIN_POSTOP,UDM_SETPOS,0,MAKELONG(y,0));
+ SendDlgItemMessage(hwndDlg,IDC_SPIN_WIDTH,UDM_SETPOS,0,MAKELONG(w,0));
+ SendDlgItemMessage(hwndDlg,IDC_SPIN_HEIGHT,UDM_SETPOS,0,MAKELONG(h,0));
+
+ GetParamN(str,buf,SIZEOF(buf),2,',',TRUE);
+ SendDlgItemMessageA(hwndDlg,IDC_FILE,WM_SETTEXT,0,(LPARAM)buf);
+
+ GetParamN(str,buf,SIZEOF(buf),7,',',TRUE);
+ if (mir_bool_strcmpi(buf,"TileBoth")) fitmode=FM_TILE_BOTH;
+ else if (mir_bool_strcmpi(buf,"TileVert")) fitmode=FM_TILE_VERT;
+ else if (mir_bool_strcmpi(buf,"TileHorz")) fitmode=FM_TILE_HORZ;
+ else fitmode=0;
+ SendDlgItemMessage(hwndDlg,IDC_FIT,CB_SETCURSEL,(WPARAM)fitmode,(LPARAM)0);
+ }
+
+ break;
+ }
+}
+
+
+
+int GetShortFileName(char * FullFile)
+{
+ char buf[MAX_PATH]={0};
+ char * f=strrchr(FullFile,'\\');
+ char * file=f?mir_strdup(f+1):0;
+ if (!file) return 0;
+ ske_GetFullFilename(buf,file,0,TRUE);
+ if (mir_bool_strcmpi(buf,FullFile))
+ {
+ _snprintf(FullFile,MAX_PATH,"%s",file);
+ mir_free_and_nill(file);
+ return 1; //skin folder relative
+ }
+ else
+ {
+ CallService(MS_UTILS_PATHTORELATIVE,(WPARAM)FullFile,(LPARAM)buf);
+ if (buf[0]!='\\' && buf[1]!=':')
+ _snprintf(FullFile,MAX_PATH,"\\%s",buf);
+ else
+ _snprintf(FullFile,MAX_PATH,"%s",buf);
+ }
+ mir_free_and_nill(file);
+ return 2; //mirand folder relative
+}
+
+char * MadeString(HWND hwndDlg)
+{
+ char buf[MAX_PATH*2]={0};
+ int i=SendDlgItemMessage(hwndDlg,IDC_TYPE,CB_GETCURSEL,(WPARAM)0,(LPARAM)0);
+ switch (i)
+ {
+ case 0:
+ mir_snprintf(buf,SIZEOF(buf),"Glyph,Skip");
+ break;
+ case 1:
+ {
+ BYTE a;
+ DWORD col;
+ a=(BYTE)SendDlgItemMessage(hwndDlg,IDC_SPIN_ALPHA,UDM_GETPOS,0,0);
+ col=(DWORD)SendDlgItemMessage(hwndDlg,IDC_COLOR,CPM_GETCOLOUR,(WPARAM)0,(LPARAM)0);
+ mir_snprintf(buf,SIZEOF(buf),"Glyph,Solid,%d,%d,%d,%d",GetRValue(col),GetGValue(col),GetBValue(col),a);
+ }
+ break;
+ case 2:
+ {
+ BYTE a;
+ WORD l,t,b,r;
+ char buf_name[MAX_PATH]={0};
+ int i=0;
+ a=(BYTE)SendDlgItemMessage(hwndDlg,IDC_SPIN_ALPHA,UDM_GETPOS,0,0);
+ l=(WORD)SendDlgItemMessage(hwndDlg,IDC_SPIN_LEFT,UDM_GETPOS,0,0);
+ t=(WORD)SendDlgItemMessage(hwndDlg,IDC_SPIN_TOP,UDM_GETPOS,0,0);
+ r=(WORD)SendDlgItemMessage(hwndDlg,IDC_SPIN_RIGHT,UDM_GETPOS,0,0);
+ b=(WORD)SendDlgItemMessage(hwndDlg,IDC_SPIN_BOTTOM,UDM_GETPOS,0,0);
+ SendDlgItemMessageA(hwndDlg,IDC_FILE,WM_GETTEXT,(WPARAM)MAX_PATH,(LPARAM)buf_name);
+ i=SendDlgItemMessage(hwndDlg,IDC_FIT,CB_GETCURSEL,0,0);
+ mir_snprintf(buf,SIZEOF(buf),"Glyph,Image,%s,%s,%d,%d,%d,%d,%d",buf_name,
+ //fitmode
+ (i==FM_TILE_BOTH)?"TileBoth":
+ (i==FM_TILE_VERT)?"TileVert":
+ (i==FM_TILE_HORZ)?"TileHorz":"StretchBoth",
+ l,t,r,b,a);
+ }
+ break;
+ case 3:
+ {
+ BYTE a;
+ WORD l,t,b,r;
+ WORD x,y,w,h;
+ char buf_name[MAX_PATH]={0};
+ int i=0;
+ a=(BYTE)SendDlgItemMessage(hwndDlg,IDC_SPIN_ALPHA,UDM_GETPOS,0,0);
+ l=(WORD)SendDlgItemMessage(hwndDlg,IDC_SPIN_LEFT,UDM_GETPOS,0,0);
+ t=(WORD)SendDlgItemMessage(hwndDlg,IDC_SPIN_TOP,UDM_GETPOS,0,0);
+ r=(WORD)SendDlgItemMessage(hwndDlg,IDC_SPIN_RIGHT,UDM_GETPOS,0,0);
+ b=(WORD)SendDlgItemMessage(hwndDlg,IDC_SPIN_BOTTOM,UDM_GETPOS,0,0);
+
+ x=(WORD)SendDlgItemMessage(hwndDlg,IDC_SPIN_POSLEFT,UDM_GETPOS,0,0);
+ y=(WORD)SendDlgItemMessage(hwndDlg,IDC_SPIN_POSTOP,UDM_GETPOS,0,0);
+
+ w=(WORD)SendDlgItemMessage(hwndDlg,IDC_SPIN_WIDTH,UDM_GETPOS,0,0);
+ h=(WORD)SendDlgItemMessage(hwndDlg,IDC_SPIN_HEIGHT,UDM_GETPOS,0,0);
+
+ SendDlgItemMessageA(hwndDlg,IDC_FILE,WM_GETTEXT,(WPARAM)MAX_PATH,(LPARAM)buf_name);
+ i=SendDlgItemMessage(hwndDlg,IDC_FIT,CB_GETCURSEL,0,0);
+ mir_snprintf(buf,SIZEOF(buf),"Glyph,Fragment,%s,%d,%d,%d,%d,%s,%d,%d,%d,%d,%d",buf_name,x,y,w,h,
+ //fitmode
+ (i==FM_TILE_BOTH)?"TileBoth":
+ (i==FM_TILE_VERT)?"TileVert":
+ (i==FM_TILE_HORZ)?"TileHorz":"StretchBoth",
+ l,t,r,b,a);
+ }
+ break;
+ }
+ if (buf[0]!='\0') return mir_strdup(buf);
+ return 0;
+}
+void UpdateInfo(HWND hwndDlg)
+{
+ char *b=MadeString(hwndDlg);
+ if (!b)
+ {
+ SendDlgItemMessageA(hwndDlg,IDC_EDIT1,WM_SETTEXT,0,(LPARAM)"");
+ return;
+ }
+ SendDlgItemMessageA(hwndDlg,IDC_EDIT1,WM_SETTEXT,0,(LPARAM)b);
+ {
+ OPT_OBJECT_DATA *sd=NULL;
+ HTREEITEM hti=TreeView_GetSelection(GetDlgItem(hwndDlg,IDC_OBJECT_TREE));
+ if (hti)
+ {
+ TVITEMA tvi={0};
+ tvi.hItem=hti;
+ tvi.mask=TVIF_HANDLE|TVIF_PARAM;
+ TreeView_GetItem(GetDlgItem(hwndDlg,IDC_OBJECT_TREE),&tvi);
+ sd=(OPT_OBJECT_DATA*)(tvi.lParam);
+ if (sd)
+ {
+ if (sd->szValue) mir_free_and_nill(sd->szValue);
+ sd->szValue=mir_strdup(b);
+ }
+ }
+ }
+ mir_free_and_nill(b);
+ glSkinWasModified=1;
+}
+
+void StoreTreeNode(HWND hTree, HTREEITEM node, char * section)
+{
+ HTREEITEM tmp;
+ tmp=node;
+ while (tmp)
+ {
+ HTREEITEM tmp2=NULL;
+ TVITEMA tvi;
+ char buf[255];
+ tvi.hItem=tmp;
+ tvi.mask=TVIF_TEXT|TVIF_HANDLE;
+ tvi.pszText=(LPSTR)&buf;
+ tvi.cchTextMax=254;
+ TreeView_GetItemA(hTree,&tvi);
+ if (tvi.lParam)
+ {
+ OPT_OBJECT_DATA * dat =(OPT_OBJECT_DATA*)(tvi.lParam);
+ if (dat->szName && dat->szValue)
+ ModernWriteSettingString(NULL,section,dat->szName,dat->szValue);
+ }
+ tmp2=TreeView_GetChild(hTree,tmp);
+ if (tmp2) StoreTreeNode(hTree,tmp2,section);
+ tmp=TreeView_GetNextSibling(hTree,tmp);
+ }
+ return;
+}
+
+void StoreTreeToDB(HWND hTree, char * section)
+{
+ HTREEITEM tmp=NULL;
+ tmp=TreeView_GetRoot(hTree);
+ StoreTreeNode(hTree,tmp,section);
+ ModernWriteSettingByte(NULL,section,"Modified",1);
+ glSkinWasModified=2;
+}
+static BOOL fileChanged=FALSE;
+static char * object_clipboard=NULL;
+int GetFileSizes(HWND hwndDlg)
+{
+ char buf[MAX_PATH];
+ SIZE sz={0};
+ SendDlgItemMessageA(hwndDlg,IDC_FILE,WM_GETTEXT,(WPARAM)MAX_PATH,(LPARAM)buf);
+ ske_GetFullFilename(buf,buf,0,TRUE);
+ {
+ HBITMAP hbmp=ske_LoadGlyphImage(buf);
+ if (hbmp)
+ {
+ BITMAP bm={0};
+ GetObject(hbmp,sizeof(BITMAP),&bm);
+ sz.cx=bm.bmWidth;
+ sz.cy=bm.bmHeight;
+ ske_UnloadGlyphImage(hbmp);
+ }
+ }
+ _snprintf(buf, MAX_PATH, "%s %d x %d %s",Translate("Image size is"),sz.cx, sz.cy, Translate("pixels"));
+ SendDlgItemMessageA(hwndDlg,IDC_S_SIZE,WM_SETTEXT,0,(LPARAM)buf);
+ return 0;
+}
+INT_PTR CALLBACK DlgSkinEditorOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ switch (msg)
+ {
+ case WM_DESTROY:
+ {
+ if (object_clipboard) mir_free_and_nill(object_clipboard);
+ break;
+ }
+ case WM_WINDOWPOSCHANGED:
+ {
+ WINDOWPOS * wp=(WINDOWPOS *)lParam;
+ if (lParam && wp->flags&SWP_SHOWWINDOW)
+ {
+ if (glOtherSkinWasLoaded)
+ {
+ TreeView_DeleteAllItems(GetDlgItem(hwndDlg,IDC_OBJECT_TREE));
+ FillObjectTree(hwndDlg,IDC_OBJECT_TREE,"$$*");
+ glSkinWasModified=0;
+ glOtherSkinWasLoaded=FALSE;
+ }
+ }
+ break;
+ }
+ case WM_INITDIALOG:
+ {
+ TranslateDialogDefault(hwndDlg);
+ FillObjectTree(hwndDlg,IDC_OBJECT_TREE,"$$*");
+ { //Fill types combo
+ int i=0;
+ for (i=0; i<SIZEOF(TYPES); i++)
+ SendDlgItemMessage(hwndDlg,IDC_TYPE,CB_ADDSTRING,0,(LPARAM)TranslateTS(TYPES[i]));
+ }
+ { //Fill fit combo
+ int i=0;
+ for (i=0; i<SIZEOF(FITMODES); i++)
+ SendDlgItemMessage(hwndDlg,IDC_FIT,CB_ADDSTRING,0,(LPARAM)TranslateTS(FITMODES[i]));
+ }
+ //SPIN Ranges
+ {
+ SendDlgItemMessage(hwndDlg,IDC_SPIN_ALPHA,UDM_SETRANGE,0,MAKELONG(255,0));
+ SendDlgItemMessage(hwndDlg,IDC_SPIN_ALPHA,UDM_SETPOS,0,MAKELONG(255,0));
+
+ SendDlgItemMessage(hwndDlg,IDC_SPIN_TOP,UDM_SETRANGE,0,MAKELONG(900,0));
+ SendDlgItemMessage(hwndDlg,IDC_SPIN_LEFT,UDM_SETRANGE,0,MAKELONG(900,0));
+ SendDlgItemMessage(hwndDlg,IDC_SPIN_BOTTOM,UDM_SETRANGE,0,MAKELONG(900,0));
+ SendDlgItemMessage(hwndDlg,IDC_SPIN_RIGHT,UDM_SETRANGE,0,MAKELONG(900,0));
+
+ SendDlgItemMessage(hwndDlg,IDC_SPIN_POSLEFT,UDM_SETRANGE,0,MAKELONG(1000,0));
+ SendDlgItemMessage(hwndDlg,IDC_SPIN_POSTOP,UDM_SETRANGE,0,MAKELONG(1000,0));
+ SendDlgItemMessage(hwndDlg,IDC_SPIN_WIDTH,UDM_SETRANGE,0,MAKELONG(1000,0));
+ SendDlgItemMessage(hwndDlg,IDC_SPIN_HEIGHT,UDM_SETRANGE,0,MAKELONG(1000,0));
+ }
+ EnableGroup(hwndDlg,GetDlgItem(hwndDlg,IDC_GROUP_1),FALSE);
+ EnableGroup(hwndDlg,GetDlgItem(hwndDlg,IDC_ST_COLOUR),FALSE);
+ EnableGroup(hwndDlg,GetDlgItem(hwndDlg,IDC_ST_ALPHA),FALSE);
+ EnableGroup(hwndDlg,GetDlgItem(hwndDlg,IDC_GROUP_2),FALSE);
+ EnableGroup(hwndDlg,GetDlgItem(hwndDlg,IDC_GROUP_3),FALSE);
+ EnableWindow(GetDlgItem(hwndDlg,IDC_PASTE),FALSE);
+ EnableWindow(GetDlgItem(hwndDlg,IDC_COPY),FALSE);
+ glSkinWasModified=0;
+ glOtherSkinWasLoaded=FALSE;
+ break;
+ }
+
+ case WM_COMMAND:
+ {
+ if (LOWORD(wParam)==IDC_TYPE)
+ {
+ if (HIWORD(wParam)==CBN_SELCHANGE)
+ {
+ int i=SendDlgItemMessage(hwndDlg,IDC_TYPE,CB_GETCURSEL,(WPARAM)0,(LPARAM)0);
+ //if (IsWindowEnabled(GetDlgItem(hwndDlg,IDC_TYPE)))
+ SetAppropriateGroups(hwndDlg,i);
+ if (GetFocus()==GetDlgItem(hwndDlg,IDC_TYPE))
+ SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
+ UpdateInfo(hwndDlg);
+ break;
+ }
+ }
+ else if (LOWORD(wParam)==IDC_COPY)
+ {
+ if (HIWORD(wParam)==BN_CLICKED)
+ {
+ if (object_clipboard) mir_free_and_nill(object_clipboard);
+ object_clipboard=NULL;
+ {
+ OPT_OBJECT_DATA *sd=NULL;
+ HTREEITEM hti=TreeView_GetSelection(GetDlgItem(hwndDlg,IDC_OBJECT_TREE));
+ if (hti!=0)
+ {
+ TVITEM tvi={0};
+ tvi.hItem=hti;
+ tvi.mask=TVIF_HANDLE|TVIF_PARAM;
+ TreeView_GetItem(GetDlgItem(hwndDlg,IDC_OBJECT_TREE),&tvi);
+ sd=(OPT_OBJECT_DATA*)(tvi.lParam);
+ }
+ if (sd && sd->szValue)
+ object_clipboard=mir_strdup(sd->szValue);
+ }
+ EnableWindow(GetDlgItem(hwndDlg,IDC_PASTE),object_clipboard!=NULL);
+ return 0;
+ }
+
+ }
+ else if (LOWORD(wParam)==IDC_PASTE)
+ {
+ if (HIWORD(wParam)==BN_CLICKED)
+ {
+ if (object_clipboard)
+ SetControls(hwndDlg, object_clipboard);
+ SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
+ UpdateInfo(hwndDlg);
+ return 0;
+ }
+ }
+ else if (LOWORD(wParam)==IDC_COLOR)
+ {
+ SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
+ UpdateInfo(hwndDlg);
+ }
+ else if (LOWORD(wParam)==IDC_BROWSE)
+ {
+ if (HIWORD(wParam)==BN_CLICKED)
+ {
+ {
+ char str[MAX_PATH]={0};
+ OPENFILENAMEA ofn={0};
+ char filter[512]={0};
+ int res=0;
+ ofn.lStructSize = OPENFILENAME_SIZE_VERSION_400;
+ ofn.hwndOwner = hwndDlg;
+ ofn.hInstance = NULL;
+ ofn.lpstrFilter = "Images (*.png,*.jpg,*.bmp,*.gif,*.tga)\0*.png;*.jpg;*.jpeg;*.bmp;*.gif;*.tga\0All files (*.*)\0*.*\0\0";
+ ofn.Flags = (OFN_FILEMUSTEXIST | OFN_HIDEREADONLY);
+ SendDlgItemMessageA(hwndDlg,IDC_FILE,WM_GETTEXT,(WPARAM)SIZEOF(str),(LPARAM)str);
+ if (str[0]=='\0' || strchr(str,'%'))
+ {
+ ofn.Flags|=OFN_NOVALIDATE;
+ str[0]='\0';
+ }
+ else
+ {
+ ske_GetFullFilename(str,str,(char*)0,TRUE);
+ }
+ ofn.lpstrFile = str;
+
+ ofn.nMaxFile = SIZEOF(str);
+ ofn.nMaxFileTitle = MAX_PATH;
+ ofn.lpstrDefExt = "*.*";
+// {
+// DWORD tick=GetTickCount();
+ res=GetOpenFileNameA(&ofn);
+// if(!res)
+// if (GetTickCount()-tick<100)
+// {
+// res=GetOpenFileNameA(&ofn);
+// if(!res) break;
+// }
+// else break;
+ //}
+ if (res)
+ {
+ GetShortFileName(ofn.lpstrFile);
+ SendDlgItemMessageA(hwndDlg,IDC_FILE,WM_SETTEXT,(WPARAM)0,(LPARAM)ofn.lpstrFile);
+ SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
+ UpdateInfo(hwndDlg);
+ }
+ }
+ }
+ }
+ else if (LOWORD(wParam)==IDC_FILE)
+ {
+ if (HIWORD(wParam) == EN_CHANGE)
+ {
+ fileChanged=TRUE;
+ if ((HWND)lParam != GetFocus())
+ {
+ GetFileSizes(hwndDlg);
+ fileChanged=FALSE;
+ }
+ }
+ else if (HIWORD(wParam) == EN_KILLFOCUS)
+ {
+ if (fileChanged)
+ {
+ GetFileSizes(hwndDlg);
+ fileChanged=FALSE;
+ }
+ }
+ }
+ else if ((
+ (LOWORD(wParam)==IDC_E_TOP
+ ||LOWORD(wParam)==IDC_E_BOTTOM
+ ||LOWORD(wParam)==IDC_E_LEFT
+ ||LOWORD(wParam)==IDC_E_RIGHT
+ ||LOWORD(wParam)==IDC_E_X
+ ||LOWORD(wParam)==IDC_E_Y
+ ||LOWORD(wParam)==IDC_E_W
+ ||LOWORD(wParam)==IDC_E_H
+ ||LOWORD(wParam)==IDC_EDIT_ALPHA
+ )
+ && HIWORD(wParam) != EN_CHANGE || (HWND)lParam != GetFocus()))
+ {
+ return 0;
+ }
+ else if (LOWORD(wParam)!=IDC_EDIT1)
+ {
+ SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
+ UpdateInfo(hwndDlg);
+ }
+ //check (LOWORD(wParam))
+ //SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
+ break;
+ }
+ case WM_NOTIFY:
+ switch (((LPNMHDR)lParam)->idFrom)
+ {
+ case IDC_OBJECT_TREE:
+ {
+ //Save existed object
+ //Change to new object
+ NMTREEVIEWA * nmtv = (NMTREEVIEWA *) lParam;
+ if (!nmtv) return 0;
+ if (nmtv->hdr.code==TVN_SELCHANGEDA || nmtv->hdr.code==TVN_SELCHANGEDW)
+ {
+ if (nmtv->itemOld.lParam)
+ {
+ OPT_OBJECT_DATA * dataOld=(OPT_OBJECT_DATA*)nmtv->itemOld.lParam;
+ if (dataOld->szValue)
+ {
+ mir_free_and_nill(dataOld->szValue);
+ dataOld->szValue=MadeString(hwndDlg);
+ }
+ }
+ if (nmtv->itemNew.lParam)
+ {
+
+ OPT_OBJECT_DATA * data=(OPT_OBJECT_DATA*)nmtv->itemNew.lParam;
+ char buf[255];
+
+ mir_snprintf(buf,SIZEOF(buf),"%s=%s",data->szName, data->szValue);
+ SendDlgItemMessageA(hwndDlg,IDC_EDIT1,WM_SETTEXT,0,(LPARAM)buf);
+ SetControls(hwndDlg,data->szValue);
+ EnableWindow(GetDlgItem(hwndDlg,IDC_COPY),TRUE);
+ EnableWindow(GetDlgItem(hwndDlg,IDC_PASTE),object_clipboard!=NULL);
+ }
+ else
+ {
+ SendDlgItemMessageA(hwndDlg,IDC_EDIT1,WM_SETTEXT,0,(LPARAM)"");
+ SetControls(hwndDlg,NULL);
+ EnableWindow(GetDlgItem(hwndDlg,IDC_COPY),FALSE);
+ EnableWindow(GetDlgItem(hwndDlg,IDC_PASTE),FALSE);
+ }
+
+ }
+ else if (nmtv->hdr.code==TVN_DELETEITEMA)
+ {
+ OPT_OBJECT_DATA * dataOld=(OPT_OBJECT_DATA*)nmtv->itemOld.lParam;
+ if (dataOld)
+ {
+ if (dataOld->szName) mir_free_and_nill(dataOld->szName);
+ if (dataOld->szPath) mir_free_and_nill(dataOld->szPath);
+ if (dataOld->szTempValue) mir_free_and_nill(dataOld->szTempValue);
+ if (dataOld->szValue) mir_free_and_nill(dataOld->szValue);
+ }
+ }
+ return 0;
+ }
+
+ case 0:
+ switch (((LPNMHDR)lParam)->code)
+ {
+ case PSN_APPLY:
+ if (!glOtherSkinWasLoaded) //store only if skin is same
+ {
+ StoreTreeToDB(GetDlgItem(hwndDlg,IDC_OBJECT_TREE),SKIN);
+ //ReloadSkin
+ ske_LoadSkinFromDB();
+ pcli->pfnClcBroadcast( INTM_RELOADOPTIONS,0,0);
+ Sync(CLUIFrames_OnClistResize_mod,0,0);
+ ske_RedrawCompleteWindow();
+ Sync(CLUIFrames_OnClistResize_mod, (WPARAM)0, (LPARAM)0);
+ {
+ HWND hwnd=pcli->hwndContactList;
+ RECT rc={0};
+ GetWindowRect(hwnd, &rc);
+ Sync(CLUIFrames_OnMoving,hwnd,&rc);
+ }
+ return TRUE;
+ }
+ else
+ return TRUE;
+ }
+ break;
+ }
+ }
+ return FALSE;
+}
+
+int EnableGroup(HWND hwndDlg, HWND first, BOOL bEnable)
+{
+ HWND hwnd=first;
+ BOOL exit=FALSE;
+ if (!hwnd) return 0;
+ do
+ {
+ EnableWindow(hwnd,bEnable);
+ hwnd=GetWindow(hwnd,GW_HWNDNEXT);
+ if (!hwnd || GetWindowLong(hwnd,GWL_STYLE)&WS_GROUP) exit=TRUE;
+ }while (!exit);
+ return 0;
+}
+
+int ShowGroup(HWND hwndDlg, HWND first, BOOL bEnable)
+{
+ HWND hwnd=first;
+ BOOL exit=FALSE;
+ if (!hwnd) return 0;
+ do
+ {
+ ShowWindow(hwnd,bEnable?SW_SHOW:SW_HIDE);
+ hwnd=GetWindow(hwnd,GW_HWNDNEXT);
+ if (!hwnd || GetWindowLong(hwnd,GWL_STYLE)&WS_GROUP) exit=TRUE;
+ }while (!exit);
+ return 0;
+}
+
|