summaryrefslogtreecommitdiff
path: root/plugins/Mwclist
diff options
context:
space:
mode:
authorKirill Volinsky <mataes2007@gmail.com>2012-05-18 22:10:43 +0000
committerKirill Volinsky <mataes2007@gmail.com>2012-05-18 22:10:43 +0000
commit725f68b6808a8a30778f58223fac75386f082785 (patch)
treeccba410760749d45139e5e78fd5e08f416ade1a0 /plugins/Mwclist
parentf920ef497f3299ae24fe783ce03bdd93b419f764 (diff)
plugins folders renaming
git-svn-id: http://svn.miranda-ng.org/main/trunk@61 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c
Diffstat (limited to 'plugins/Mwclist')
-rw-r--r--plugins/Mwclist/BkgrCfg.c367
-rw-r--r--plugins/Mwclist/BkgrCfg.h18
-rw-r--r--plugins/Mwclist/CLUIFrames/cluiframes.c3428
-rw-r--r--plugins/Mwclist/CLUIFrames/cluiframes.h44
-rw-r--r--plugins/Mwclist/CLUIFrames/extraimage.c406
-rw-r--r--plugins/Mwclist/CLUIFrames/framesmenu.c231
-rw-r--r--plugins/Mwclist/CLUIFrames/statusbar.c630
-rw-r--r--plugins/Mwclist/IcoLib.h35
-rw-r--r--plugins/Mwclist/clc.c292
-rw-r--r--plugins/Mwclist/clc.h206
-rw-r--r--plugins/Mwclist/clcidents.c338
-rw-r--r--plugins/Mwclist/clcitems.c695
-rw-r--r--plugins/Mwclist/clcopts.c1109
-rw-r--r--plugins/Mwclist/clcpaint.c748
-rw-r--r--plugins/Mwclist/clcutils.c296
-rw-r--r--plugins/Mwclist/clist.h60
-rw-r--r--plugins/Mwclist/clist_mw_10.vcxproj739
-rw-r--r--plugins/Mwclist/clist_mw_10.vcxproj.filters292
-rw-r--r--plugins/Mwclist/clistmenus.c61
-rw-r--r--plugins/Mwclist/clistmod.c153
-rw-r--r--plugins/Mwclist/clistopts.c224
-rw-r--r--plugins/Mwclist/clistsettings.c377
-rw-r--r--plugins/Mwclist/clisttray.c305
-rw-r--r--plugins/Mwclist/clui.c953
-rw-r--r--plugins/Mwclist/cluiopts.c439
-rw-r--r--plugins/Mwclist/cluiservices.c180
-rw-r--r--plugins/Mwclist/commonheaders.c29
-rw-r--r--plugins/Mwclist/commonheaders.h128
-rw-r--r--plugins/Mwclist/contact.c197
-rw-r--r--plugins/Mwclist/groupmenu.c751
-rw-r--r--plugins/Mwclist/init.c266
-rw-r--r--plugins/Mwclist/keyboard.c68
-rw-r--r--plugins/Mwclist/m_fontservice.h30
-rw-r--r--plugins/Mwclist/m_mwclc.h27
-rw-r--r--plugins/Mwclist/res/1.icobin0 -> 2550 bytes
-rw-r--r--plugins/Mwclist/res/2.icobin0 -> 2550 bytes
-rw-r--r--plugins/Mwclist/res/3.icobin0 -> 2550 bytes
-rw-r--r--plugins/Mwclist/res/4.icobin0 -> 2550 bytes
-rw-r--r--plugins/Mwclist/res/5.icobin0 -> 2550 bytes
-rw-r--r--plugins/Mwclist/res/6.icobin0 -> 2550 bytes
-rw-r--r--plugins/Mwclist/res/7.icobin0 -> 2550 bytes
-rw-r--r--plugins/Mwclist/res/8.icobin0 -> 2550 bytes
-rw-r--r--plugins/Mwclist/res/Miranda.icobin0 -> 2550 bytes
-rw-r--r--plugins/Mwclist/res/addgoupp.icobin0 -> 2550 bytes
-rw-r--r--plugins/Mwclist/res/blank.icobin0 -> 318 bytes
-rw-r--r--plugins/Mwclist/res/blank1.icobin0 -> 318 bytes
-rw-r--r--plugins/Mwclist/res/delete.icobin0 -> 2550 bytes
-rw-r--r--plugins/Mwclist/res/dragcopy.curbin0 -> 326 bytes
-rw-r--r--plugins/Mwclist/res/dropuser.curbin0 -> 1086 bytes
-rw-r--r--plugins/Mwclist/res/globus.icobin0 -> 2550 bytes
-rw-r--r--plugins/Mwclist/res/hyperlin.curbin0 -> 326 bytes
-rw-r--r--plugins/Mwclist/res/icon1.icobin0 -> 2038 bytes
-rw-r--r--plugins/Mwclist/res/icon2.icobin0 -> 2550 bytes
-rw-r--r--plugins/Mwclist/res/mirandaclassic.icobin0 -> 2294 bytes
-rw-r--r--plugins/Mwclist/res/notick.icobin0 -> 2550 bytes
-rw-r--r--plugins/Mwclist/res/notick1.icobin0 -> 2550 bytes
-rw-r--r--plugins/Mwclist/res/rename.icobin0 -> 2550 bytes
-rw-r--r--plugins/Mwclist/res/sendmail.icobin0 -> 2550 bytes
-rw-r--r--plugins/Mwclist/res/sms.icobin0 -> 2550 bytes
-rw-r--r--plugins/Mwclist/resource.h655
-rw-r--r--plugins/Mwclist/resource.rc926
-rw-r--r--plugins/Mwclist/statusmodes.h40
62 files changed, 15743 insertions, 0 deletions
diff --git a/plugins/Mwclist/BkgrCfg.c b/plugins/Mwclist/BkgrCfg.c
new file mode 100644
index 0000000000..3bddc786af
--- /dev/null
+++ b/plugins/Mwclist/BkgrCfg.c
@@ -0,0 +1,367 @@
+
+#include "commonheaders.h"
+
+#define DEFAULT_BKCOLOUR GetSysColor(COLOR_3DFACE)
+#define DEFAULT_USEBITMAP 0
+#define DEFAULT_BKBMPUSE CLB_STRETCH
+#define DEFAULT_SELBKCOLOUR GetSysColor(COLOR_HIGHLIGHT)
+
+
+extern HINSTANCE g_hInst;
+
+char **bkgrList = NULL;
+int bkgrCount = 0;
+HANDLE hEventBkgrChanged;
+
+#define M_BKGR_UPDATE (WM_USER+10)
+#define M_BKGR_SETSTATE (WM_USER+11)
+#define M_BKGR_GETSTATE (WM_USER+12)
+
+#define M_BKGR_BACKCOLOR 0x01
+#define M_BKGR_SELECTCOLOR 0x02
+#define M_BKGR_ALLOWBITMAPS 0x04
+#define M_BKGR_STRETCH 0x08
+#define M_BKGR_TILE 0x10
+
+#define ARRAY_SIZE(arr) (sizeof(arr)/sizeof(arr[0]))
+static const int bitmapRelatedControls[] = {
+ IDC_FILENAME,IDC_BROWSE,IDC_STRETCHH,IDC_STRETCHV,IDC_TILEH,IDC_TILEV,
+ IDC_SCROLL,IDC_PROPORTIONAL,IDC_TILEVROWH
+};
+struct BkgrItem
+{
+ BYTE changed;
+ BYTE useBitmap;
+ COLORREF bkColor, selColor;
+ char filename[MAX_PATH];
+ WORD flags;
+};
+struct BkgrData
+{
+ struct BkgrItem *item;
+ int indx;
+ int count;
+};
+static INT_PTR CALLBACK DlgProcBkgOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ struct BkgrData *dat = (struct BkgrData *)GetWindowLongPtr(hwndDlg, GWLP_USERDATA);
+ switch (msg)
+ {
+ case WM_INITDIALOG:
+ {
+ int indx;
+ HWND hList = GetDlgItem(hwndDlg, IDC_BKGRLIST);
+ TranslateDialogDefault(hwndDlg);
+
+ dat=(struct BkgrData*)mir_alloc(sizeof(struct BkgrData));
+ SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)dat);
+ dat->count = bkgrCount;
+ dat->item = (struct BkgrItem*)mir_alloc(sizeof(struct BkgrItem)*dat->count);
+ dat->indx = CB_ERR;
+ for(indx = 0; indx < dat->count; indx++)
+ {
+ char *module = bkgrList[indx] + strlen(bkgrList[indx]) + 1;
+ int jndx;
+
+ dat->item[indx].changed = FALSE;
+ dat->item[indx].useBitmap = DBGetContactSettingByte(NULL,module, "UseBitmap", DEFAULT_USEBITMAP);
+ dat->item[indx].bkColor = DBGetContactSettingDword(NULL,module, "BkColour", DEFAULT_BKCOLOUR);
+ dat->item[indx].selColor = DBGetContactSettingDword(NULL,module, "SelBkColour", DEFAULT_SELBKCOLOUR);
+ {
+ DBVARIANT dbv;
+ if(!DBGetContactSettingString(NULL,module,"BkBitmap",&dbv))
+ {
+ int retval = CallService(MS_UTILS_PATHTOABSOLUTE, (WPARAM)dbv.pszVal, (LPARAM)dat->item[indx].filename);
+ if(!retval || retval == CALLSERVICE_NOTFOUND)
+ lstrcpynA(dat->item[indx].filename, dbv.pszVal, MAX_PATH);
+ mir_free(dbv.pszVal);
+ }
+ else
+ *dat->item[indx].filename = 0;
+ }
+ dat->item[indx].flags = DBGetContactSettingWord(NULL,module,"BkBmpUse", DEFAULT_BKBMPUSE);
+ jndx = SendMessageA(hList, CB_ADDSTRING, 0, (LPARAM)Translate(bkgrList[indx]));
+ SendMessage(hList, CB_SETITEMDATA, jndx, indx);
+ }
+ SendMessage(hList, CB_SETCURSEL, 0, 0);
+ PostMessage(hwndDlg, WM_COMMAND, MAKEWPARAM(IDC_BKGRLIST, CBN_SELCHANGE), 0);
+ {
+ HRESULT (STDAPICALLTYPE *MySHAutoComplete)(HWND,DWORD);
+ MySHAutoComplete=(HRESULT (STDAPICALLTYPE*)(HWND,DWORD))GetProcAddress(GetModuleHandleA("shlwapi"),"SHAutoComplete");
+ if(MySHAutoComplete) MySHAutoComplete(GetDlgItem(hwndDlg,IDC_FILENAME),1);
+ }
+ return TRUE;
+ }
+ case WM_DESTROY:
+ if(dat)
+ {
+ if(dat->item) mir_free(dat->item);
+ mir_free(dat);
+ }
+
+ return TRUE;
+
+ case M_BKGR_GETSTATE:
+ {
+ int indx = wParam;
+ if(indx == CB_ERR || indx >= dat->count) break;
+ indx = SendDlgItemMessage(hwndDlg, IDC_BKGRLIST, CB_GETITEMDATA, indx, 0);
+
+ dat->item[indx].useBitmap = IsDlgButtonChecked(hwndDlg,IDC_BITMAP);
+ dat->item[indx].bkColor = SendDlgItemMessage(hwndDlg, IDC_BKGCOLOUR, CPM_GETCOLOUR,0,0);
+ dat->item[indx].selColor = SendDlgItemMessage(hwndDlg, IDC_SELCOLOUR, CPM_GETCOLOUR,0,0);
+ GetDlgItemTextA(hwndDlg, IDC_FILENAME, dat->item[indx].filename, sizeof(dat->item[indx].filename));
+ {
+ WORD flags = 0;
+ if(IsDlgButtonChecked(hwndDlg,IDC_STRETCHH)) flags |= CLB_STRETCHH;
+ if(IsDlgButtonChecked(hwndDlg,IDC_STRETCHV)) flags |= CLB_STRETCHV;
+ if(IsDlgButtonChecked(hwndDlg,IDC_TILEH)) flags |= CLBF_TILEH;
+ if(IsDlgButtonChecked(hwndDlg,IDC_TILEV)) flags |= CLBF_TILEV;
+ if(IsDlgButtonChecked(hwndDlg,IDC_SCROLL)) flags |= CLBF_SCROLL;
+ if(IsDlgButtonChecked(hwndDlg,IDC_PROPORTIONAL)) flags |= CLBF_PROPORTIONAL;
+ if(IsDlgButtonChecked(hwndDlg,IDC_TILEVROWH)) flags |= CLBF_TILEVTOROWHEIGHT;
+ dat->item[indx].flags = flags;
+ }
+ break;
+ }
+ case M_BKGR_SETSTATE:
+ {
+ int indx = wParam;
+ int flags = dat->item[indx].flags;
+ if(indx == CB_ERR || indx >= dat->count) break;
+ indx = SendDlgItemMessage(hwndDlg, IDC_BKGRLIST, CB_GETITEMDATA, indx, 0);
+
+ CheckDlgButton(hwndDlg, IDC_BITMAP, dat->item[indx].useBitmap?BST_CHECKED:BST_UNCHECKED);
+
+ SendDlgItemMessage(hwndDlg, IDC_BKGCOLOUR, CPM_SETDEFAULTCOLOUR, 0, DEFAULT_BKCOLOUR);
+ SendDlgItemMessage(hwndDlg, IDC_BKGCOLOUR, CPM_SETCOLOUR, 0, dat->item[indx].bkColor);
+ SendDlgItemMessage(hwndDlg, IDC_SELCOLOUR, CPM_SETDEFAULTCOLOUR, 0, DEFAULT_SELBKCOLOUR);
+ SendDlgItemMessage(hwndDlg, IDC_SELCOLOUR, CPM_SETCOLOUR, 0, dat->item[indx].selColor);
+ SetDlgItemTextA(hwndDlg, IDC_FILENAME, dat->item[indx].filename);
+
+ CheckDlgButton(hwndDlg,IDC_STRETCHH, flags&CLB_STRETCHH?BST_CHECKED:BST_UNCHECKED);
+ CheckDlgButton(hwndDlg,IDC_STRETCHV,flags&CLB_STRETCHV?BST_CHECKED:BST_UNCHECKED);
+ CheckDlgButton(hwndDlg,IDC_TILEH,flags&CLBF_TILEH?BST_CHECKED:BST_UNCHECKED);
+ CheckDlgButton(hwndDlg,IDC_TILEV,flags&CLBF_TILEV?BST_CHECKED:BST_UNCHECKED);
+ CheckDlgButton(hwndDlg,IDC_SCROLL,flags&CLBF_SCROLL?BST_CHECKED:BST_UNCHECKED);
+ CheckDlgButton(hwndDlg,IDC_PROPORTIONAL,flags&CLBF_PROPORTIONAL?BST_CHECKED:BST_UNCHECKED);
+ CheckDlgButton(hwndDlg,IDC_TILEVROWH,flags&CLBF_TILEVTOROWHEIGHT?BST_CHECKED:BST_UNCHECKED);
+/*
+ {
+ WORD visibility;
+ int cy = 55;
+ char *sz = bkgrList[indx] + strlen(bkgrList[indx]) + 1;
+ sz += strlen(sz) + 1;
+ visibility = (WORD)~(*(DWORD*)(sz));
+//M_BKGR_BACKCOLOR,M_BKGR_SELECTCOLOR,M_BKGR_ALLOWBITMAPS,M_BKGR_STRETCH,M_BKGR_TILE}
+ if(visibility & M_BKGR_BACKCOLOR)
+ {
+ SetWindowPos(GetDlgItem(hwndDlg, IDC_BC_STATIC), 0,
+ 20, cy,
+ 0, 0,
+ SWP_NOACTIVATE|SWP_NOZORDER|SWP_NOSIZE);
+ SetWindowPos(GetDlgItem(hwndDlg, IDC_BKGCOLOUR), 0,
+ 130, cy,
+ 0, 0,
+ SWP_NOACTIVATE|SWP_NOZORDER|SWP_NOSIZE);
+ cy += 25;
+ }
+ if(visibility & M_BKGR_SELECTCOLOR)
+ {
+ SetWindowPos(GetDlgItem(hwndDlg, IDC_SC_STATIC), 0,
+ 20, cy,
+ 0, 0,
+ SWP_NOACTIVATE|SWP_NOZORDER|SWP_NOSIZE);
+ SetWindowPos(GetDlgItem(hwndDlg, IDC_SELCOLOUR), 0,
+ 130, cy,
+ 0, 0,
+ SWP_NOACTIVATE|SWP_NOZORDER|SWP_NOSIZE);
+ cy += 25;
+ }
+ ShowWindow(GetDlgItem(hwndDlg,IDC_STRETCHH), visibility&CLB_STRETCHH?SW_SHOW:SW_HIDE);
+ ShowWindow(GetDlgItem(hwndDlg,IDC_STRETCHV), visibility&CLB_STRETCHV?SW_SHOW:SW_HIDE);
+ ShowWindow(GetDlgItem(hwndDlg,IDC_TILEH), visibility&CLBF_TILEH?SW_SHOW:SW_HIDE);
+ ShowWindow(GetDlgItem(hwndDlg,IDC_TILEV), visibility&CLBF_TILEV?SW_SHOW:SW_HIDE);
+ ShowWindow(GetDlgItem(hwndDlg,IDC_SCROLL), visibility&CLBF_SCROLL?SW_SHOW:SW_HIDE);
+ ShowWindow(GetDlgItem(hwndDlg,IDC_PROPORTIONAL), visibility&CLBF_PROPORTIONAL?SW_SHOW:SW_HIDE);
+ ShowWindow(GetDlgItem(hwndDlg,IDC_TILEVROWH), visibility&CLBF_TILEVTOROWHEIGHT?SW_SHOW:SW_HIDE);
+ }
+*/
+
+ SendMessage(hwndDlg, M_BKGR_UPDATE, 0,0);
+ break;
+ }
+ case M_BKGR_UPDATE:
+ {
+ int isChecked = IsDlgButtonChecked(hwndDlg,IDC_BITMAP);
+ int indx;
+ for(indx = 0; indx < ARRAY_SIZE(bitmapRelatedControls); indx++)
+ EnableWindow(GetDlgItem(hwndDlg, bitmapRelatedControls[indx]),isChecked);
+ break;
+ }
+ case WM_COMMAND:
+ if(LOWORD(wParam) == IDC_BROWSE)
+ {
+ char str[MAX_PATH];
+ OPENFILENAMEA ofn={0};
+ char filter[512];
+
+ GetDlgItemTextA(hwndDlg,IDC_FILENAME, str, sizeof(str));
+ ofn.lStructSize = OPENFILENAME_SIZE_VERSION_400;
+ ofn.hwndOwner = hwndDlg;
+ ofn.hInstance = NULL;
+ CallService(MS_UTILS_GETBITMAPFILTERSTRINGS, sizeof(filter), (LPARAM)filter);
+ ofn.lpstrFilter = filter;
+ ofn.lpstrFile = str;
+ ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
+ ofn.nMaxFile = sizeof(str);
+ ofn.nMaxFileTitle = MAX_PATH;
+ ofn.lpstrDefExt = "bmp";
+ if(!GetOpenFileNameA(&ofn)) break;
+ SetDlgItemTextA(hwndDlg, IDC_FILENAME, str);
+ }
+ else
+ if(LOWORD(wParam) == IDC_FILENAME && HIWORD(wParam) != EN_CHANGE) break;
+ if(LOWORD(wParam) == IDC_BITMAP)
+ SendMessage(hwndDlg, M_BKGR_UPDATE, 0,0);
+ if(LOWORD(wParam) == IDC_FILENAME && (HIWORD(wParam) != EN_CHANGE || (HWND)lParam != GetFocus()))
+ return 0;
+ if(LOWORD(wParam) == IDC_BKGRLIST)
+ {
+ if(HIWORD(wParam) == CBN_SELCHANGE)
+ {
+ SendMessage(hwndDlg, M_BKGR_GETSTATE, dat->indx, 0);
+ SendMessage(hwndDlg, M_BKGR_SETSTATE, dat->indx = SendDlgItemMessage(hwndDlg, IDC_BKGRLIST, CB_GETCURSEL, 0,0), 0);
+ }
+ return 0;
+ }
+ {
+ int indx = SendDlgItemMessage(hwndDlg, IDC_BKGRLIST, CB_GETCURSEL, 0,0);
+ if(indx != CB_ERR && indx < dat->count)
+ {
+ indx = SendDlgItemMessage(hwndDlg, IDC_BKGRLIST, CB_GETITEMDATA, indx, 0);
+ dat->item[indx].changed = TRUE;
+
+ }
+ SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0,0);
+ }
+ break;
+ case WM_NOTIFY:
+ switch(((LPNMHDR)lParam)->idFrom)
+ {
+ case 0:
+ switch (((LPNMHDR)lParam)->code)
+ {
+ case PSN_APPLY:
+ {
+ int indx;
+ SendMessage(hwndDlg, M_BKGR_GETSTATE, SendDlgItemMessage(hwndDlg, IDC_BKGRLIST, CB_GETCURSEL, 0,0), 0);
+ for(indx = 0; indx < dat->count; indx++)
+ if(dat->item[indx].changed)
+ {
+ char *module = bkgrList[indx] + strlen(bkgrList[indx]) + 1;
+ DBWriteContactSettingByte(NULL, module, "UseBitmap", (BYTE)dat->item[indx].useBitmap);
+ {
+ COLORREF col;
+
+ if((col = dat->item[indx].bkColor) == DEFAULT_BKCOLOUR)
+ DBDeleteContactSetting(NULL, module, "BkColour");
+ else
+ DBWriteContactSettingDword(NULL, module, "BkColour", col);
+
+ if((col = dat->item[indx].selColor) == DEFAULT_SELBKCOLOUR)
+ DBDeleteContactSetting(NULL, module, "SelBkColour");
+ else
+ DBWriteContactSettingDword(NULL, module, "SelBkColour", col);
+ }
+ {
+ char str[MAX_PATH];
+ int retval = CallService(MS_UTILS_PATHTOABSOLUTE,
+ (WPARAM)dat->item[indx].filename,
+ (LPARAM)str);
+ if(!retval || retval == CALLSERVICE_NOTFOUND)
+ DBWriteContactSettingString(NULL, module, "BkBitmap", dat->item[indx].filename);
+ else
+ DBWriteContactSettingString(NULL, module, "BkBitmap", str);
+ }
+ DBWriteContactSettingWord(NULL, module, "BkBmpUse", dat->item[indx].flags);
+ dat->item[indx].changed = FALSE;
+ NotifyEventHooks(hEventBkgrChanged, (WPARAM)module, 0);
+ }
+ return TRUE;
+ }
+ }
+ break;
+ }
+ break;
+ }
+ return FALSE;
+}
+
+static INT_PTR BkgrCfg_Register(WPARAM wParam,LPARAM lParam)
+{
+ char *szSetting = (char *)wParam;
+ char *value, *tok;
+ size_t len = strlen(szSetting) + 1;
+
+ value = (char *)mir_alloc(len + 4); // add room for flags (DWORD)
+ memcpy(value, szSetting, len);
+ tok = strchr(value, '/');
+ if(tok == NULL)
+ {
+ mir_free(value);
+ return 1;
+ }
+ *tok = 0;
+ *(DWORD*)(value + len) = lParam;
+
+ bkgrList = (char **)mir_realloc(bkgrList, sizeof(char*)*(bkgrCount+1));
+ bkgrList[bkgrCount] = value;
+ bkgrCount++;
+
+ return 0;
+}
+
+int OnOptionsInit(WPARAM wParam,LPARAM lParam)
+{
+ OPTIONSDIALOGPAGE odp;
+
+ ZeroMemory(&odp,sizeof(odp));
+ odp.cbSize = sizeof(odp);
+ odp.position = 0;
+ odp.hInstance = g_hInst;
+ odp.pszGroup = LPGEN("Customize");
+ odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPT_CLCBKG2);
+ odp.pszTitle = LPGEN("Backgrounds");
+ odp.pfnDlgProc = DlgProcBkgOpts;
+ odp.flags = ODPF_BOLDGROUPS;
+
+ CallService(MS_OPT_ADDPAGE,wParam,(LPARAM)&odp);
+
+ return 0;
+}
+
+int BGModuleLoad()
+{
+ HookEvent(ME_OPT_INITIALISE, OnOptionsInit);
+
+ CreateServiceFunction(MS_BACKGROUNDCONFIG_REGISTER, BkgrCfg_Register);
+
+ hEventBkgrChanged = CreateHookableEvent(ME_BACKGROUNDCONFIG_CHANGED);
+ return 0;
+}
+
+int BGModuleUnload(void)
+{
+ if(bkgrList != NULL)
+ {
+ int indx;
+ for(indx = 0; indx < bkgrCount; indx++)
+ if(bkgrList[indx] != NULL)
+ mir_free(bkgrList[indx]);
+ mir_free(bkgrList);
+ }
+ DestroyHookableEvent(hEventBkgrChanged);
+
+ return 0;
+}
diff --git a/plugins/Mwclist/BkgrCfg.h b/plugins/Mwclist/BkgrCfg.h
new file mode 100644
index 0000000000..a47b53a603
--- /dev/null
+++ b/plugins/Mwclist/BkgrCfg.h
@@ -0,0 +1,18 @@
+//
+// 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
+//
+#define MS_BACKGROUNDCONFIG_REGISTER "BkgrCfg/Register"
+
+//
+// Notification about changed background
+// wParam = ModuleName
+// lParam = 0
+#define ME_BACKGROUNDCONFIG_CHANGED "BkgrCfg/Changed"
+
+#define CLBF_TILEVTOROWHEIGHT 0x0100
diff --git a/plugins/Mwclist/CLUIFrames/cluiframes.c b/plugins/Mwclist/CLUIFrames/cluiframes.c
new file mode 100644
index 0000000000..223a5eae8b
--- /dev/null
+++ b/plugins/Mwclist/CLUIFrames/cluiframes.c
@@ -0,0 +1,3428 @@
+/*
+Miranda IM: the free IM client for Microsoft* Windows*
+
+Copyright 2000-2003 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 "../commonheaders.h"
+
+extern HINSTANCE g_hInst;
+
+//we use dynamic frame list,
+//but who wants so huge number of frames ??
+#define MAX_FRAMES 16
+
+#define UNCOLLAPSED_FRAME_SIZE 0
+#define DEFAULT_TITLEBAR_HEIGHT 20
+
+//legacy menu support
+#define frame_menu_lock 1
+#define frame_menu_visible 2
+#define frame_menu_showtitlebar 3
+#define frame_menu_floating 4
+extern int ModifyMenuItemProxy(WPARAM wParam,LPARAM lParam);
+static int UpdateTBToolTip(int framepos);
+INT_PTR CLUIFrameSetFloat(WPARAM wParam,LPARAM lParam);
+int CLUIFrameResizeFloatingFrame(int framepos);
+extern int ProcessCommandProxy(WPARAM wParam,LPARAM lParam);
+extern int InitFramesMenus(void);
+int GapBetweenTitlebar;
+
+LOGFONTA TitleBarLogFont={0};
+
+boolean FramesSysNotStarted=TRUE;
+
+HANDLE hService[20], hHook[4];
+
+typedef struct
+{
+ int order;
+ int realpos;
+}
+ SortData;
+
+static int sortfunc(const void *a,const void *b)
+{
+ SortData *sd1,*sd2;
+ sd1=(SortData *)a;
+ sd2=(SortData *)b;
+ if (sd1->order > sd2->order){return(1);}
+ if (sd1->order < sd2->order){return(-1);}
+ //if (sd1->order = sd2->order){return(0);}
+ return (0);
+}
+
+
+//============
+#define CLUIFRAMESSETALIGN "CLUIFramesSetAlign"
+
+#define CLUIFRAMESSETALIGNALTOP "CLUIFramesSetAlignalTop"
+#define CLUIFRAMESSETALIGNALCLIENT "CLUIFramesSetAlignalClient"
+#define CLUIFRAMESSETALIGNALBOTTOM "CLUIFramesSetAlignalBottom"
+
+#define CLUIFRAMESMOVEUPDOWN "CLUIFramesMoveUpDown"
+typedef struct tagMenuHandles
+{
+ HANDLE MainMenuItem;
+ HANDLE MIVisible,MITitle,MITBVisible,MILock,MIColl,MIFloating,MIAlignRoot;
+ HANDLE MIAlignTop,MIAlignClient,MIAlignBottom;
+ HANDLE MIBorder;
+} FrameMenuHandles;
+
+typedef struct tagFrameTitleBar{
+ HWND hwnd;
+ HWND TitleBarbutt;
+ HWND hwndTip;
+
+ LPTSTR tbname;
+ LPTSTR tooltip;
+ HMENU hmenu;
+ HICON hicon;
+
+ BOOLEAN ShowTitleBar;
+ BOOLEAN ShowTitleBarTip;
+ COLORREF BackColour;
+ int oldstyles;
+ POINT oldpos;
+ RECT wndSize;
+} FrameTitleBar;
+
+typedef struct _DockOpt
+{
+ HWND hwndLeft;
+ HWND hwndRight;
+}
+DockOpt;
+
+typedef struct {
+ int id;
+ HWND hWnd ;
+ RECT wndSize;
+ LPTSTR name;
+ int align;
+ int height;
+ int dwFlags;
+ BOOLEAN Locked;
+ BOOLEAN visible;
+ BOOLEAN needhide;
+ BOOLEAN collapsed;
+ int prevvisframe;
+ int HeightWhenCollapsed;
+ FrameTitleBar TitleBar;
+ FrameMenuHandles MenuHandles;
+ int oldstyles;
+ BOOLEAN floating;
+ HWND ContainerWnd;
+ POINT FloatingPos;
+ POINT FloatingSize;
+ BOOLEAN minmaxenabled;
+ BOOLEAN UseBorder;
+ int order;
+ DockOpt dockOpt;
+} wndFrame;
+
+//static wndFrame Frames[MAX_FRAMES];
+static wndFrame *Frames=NULL;
+
+static int nFramescount=0;
+static int alclientFrame=-1;//for fast access to frame with alclient properties
+static int NextFrameId=100;
+
+HFONT TitleBarFont;
+static TitleBarH=DEFAULT_TITLEBAR_HEIGHT;
+static boolean resizing=FALSE;
+
+// menus
+static HANDLE contMIVisible,contMITitle,contMITBVisible,contMILock,contMIColl,contMIFloating;
+static HANDLE contMIAlignRoot;
+static HANDLE contMIAlignTop,contMIAlignClient,contMIAlignBottom;
+static HANDLE contMIBorder;
+static HANDLE MainMIRoot=(HANDLE)-1;
+
+// others
+static int ContactListHeight;
+static int LastStoreTick=0;
+
+static int lbypos=-1;
+static int oldframeheight=-1;
+static int curdragbar=-1;
+static CRITICAL_SECTION csFrameHook;
+
+static BOOLEAN CLUIFramesFitInSize(void);
+static int RemoveItemFromList(int pos,wndFrame **lpFrames,int *FrameItemCount);
+HWND hWndExplorerToolBar;
+static int GapBetweenFrames=1;
+
+static int RemoveItemFromList(int pos,wndFrame **lpFrames,int *FrameItemCount)
+{
+ memcpy(&((*lpFrames)[pos]),&((*lpFrames)[pos+1]),sizeof(wndFrame)*(*FrameItemCount-pos-1));
+ (*FrameItemCount)--;
+ (*lpFrames)=(wndFrame*)realloc((*lpFrames),sizeof(wndFrame)*(*FrameItemCount));
+ return 0;
+}
+
+static int id2pos(int id)
+{
+ int i;
+
+ if (FramesSysNotStarted) return -1;
+
+ for (i=0;i<nFramescount;i++)
+ {
+ if (Frames[i].id==id) return(i);
+ }
+ return(-1);
+}
+
+static int btoint(BOOLEAN b)
+{
+ if(b) return 1;
+ return 0;
+}
+
+static void __inline lockfrm()
+{
+ EnterCriticalSection(&csFrameHook);
+}
+
+static void __inline ulockfrm()
+{
+ LeaveCriticalSection(&csFrameHook);
+}
+
+//////////screen docking,code from "floating contacts" plugin.
+
+static wndFrame* FindFrameByWnd( HWND hwnd )
+{
+ BOOL bFound = FALSE;
+ int i;
+
+ if ( hwnd == NULL ) return( NULL );
+
+ for(i=0;i<nFramescount;i++)
+ {
+ if ((Frames[i].floating)&&(Frames[i].ContainerWnd==hwnd) ){return(&Frames[i]);}
+ }
+
+ return( NULL);
+}
+
+
+static void DockThumbs( wndFrame *pThumbLeft, wndFrame *pThumbRight, BOOL bMoveLeft )
+{
+ if ( ( pThumbRight->dockOpt.hwndLeft == NULL ) && ( pThumbLeft->dockOpt.hwndRight == NULL ) )
+ {
+ pThumbRight->dockOpt.hwndLeft = pThumbLeft->ContainerWnd;
+ pThumbLeft->dockOpt.hwndRight = pThumbRight->ContainerWnd;
+ }
+}
+
+
+static void UndockThumbs( wndFrame *pThumb1, wndFrame *pThumb2 )
+{
+ if ( ( pThumb1 == NULL ) || ( pThumb2 == NULL ) )
+ {
+ return;
+ }
+
+ if ( pThumb1->dockOpt.hwndRight == pThumb2->ContainerWnd )
+ {
+ pThumb1->dockOpt.hwndRight = NULL;
+ }
+
+ if ( pThumb1->dockOpt.hwndLeft == pThumb2->ContainerWnd )
+ {
+ pThumb1->dockOpt.hwndLeft = NULL;
+ }
+
+ if ( pThumb2->dockOpt.hwndRight == pThumb1->ContainerWnd )
+ {
+ pThumb2->dockOpt.hwndRight = NULL;
+ }
+
+ if ( pThumb2->dockOpt.hwndLeft == pThumb1->ContainerWnd )
+ {
+ pThumb2->dockOpt.hwndLeft = NULL;
+ }
+}
+
+BOOLEAN bMoveTogether;
+
+static void PositionThumb( wndFrame *pThumb, short nX, short nY )
+{
+ wndFrame *pCurThumb = &Frames[0];
+ wndFrame *pDockThumb = pThumb;
+ wndFrame fakeMainWindow;
+ wndFrame fakeTaskBarWindow;
+ RECT rc;
+ RECT rcThumb;
+ RECT rcOld;
+ SIZE sizeScreen;
+ int nNewX;
+ int nNewY;
+ int nOffs = 10;
+ int nWidth;
+ int nHeight;
+ POINT pt;
+ RECT rcLeft;
+ RECT rcTop;
+ RECT rcRight;
+ RECT rcBottom;
+ BOOL bDocked;
+ BOOL bDockedLeft;
+ BOOL bDockedRight;
+ BOOL bLeading;
+ int frmidx=0;
+
+ if ( pThumb == NULL ) return;
+
+ sizeScreen.cx = GetSystemMetrics( SM_CXSCREEN );
+ sizeScreen.cy = GetSystemMetrics( SM_CYSCREEN );
+
+ // Get thumb dimnsions
+ GetWindowRect( pThumb->ContainerWnd, &rcThumb );
+ nWidth = rcThumb.right - rcThumb.left;
+ nHeight = rcThumb.bottom - rcThumb.top;
+
+ // Docking to the edges of the screen
+ nNewX = nX < nOffs ? 0 : nX;
+ nNewX = nNewX > ( sizeScreen.cx - nWidth - nOffs ) ? ( sizeScreen.cx - nWidth ) : nNewX;
+ nNewY = nY < nOffs ? 0 : nY;
+ nNewY = nNewY > ( sizeScreen.cy - nHeight - nOffs ) ? ( sizeScreen.cy - nHeight ) : nNewY;
+
+ bLeading = pThumb->dockOpt.hwndRight != NULL;
+
+ if ( bMoveTogether )
+ {
+ UndockThumbs( pThumb, FindFrameByWnd( pThumb->dockOpt.hwndLeft ) );
+ GetWindowRect( pThumb->ContainerWnd, &rcOld );
+ }
+
+ memset(&fakeMainWindow,0,sizeof(fakeMainWindow));
+ fakeMainWindow.ContainerWnd=pcli->hwndContactList;
+ fakeMainWindow.floating=TRUE;
+
+ memset(&fakeTaskBarWindow,0,sizeof(fakeTaskBarWindow));
+ fakeTaskBarWindow.ContainerWnd=hWndExplorerToolBar;
+ fakeTaskBarWindow.floating=TRUE;
+
+
+ while( pCurThumb != NULL )
+ {
+ if (pCurThumb->floating) {
+
+ if ( pCurThumb != pThumb )
+ {
+ GetWindowRect( pThumb->ContainerWnd, &rcThumb );
+ OffsetRect( &rcThumb, nX - rcThumb.left, nY - rcThumb.top );
+
+ GetWindowRect( pCurThumb->ContainerWnd, &rc );
+
+ // These are rects we will dock into
+
+ rcLeft.left = rc.left - nOffs;
+ rcLeft.top = rc.top - nOffs;
+ rcLeft.right = rc.left + nOffs;
+ rcLeft.bottom = rc.bottom + nOffs;
+
+ rcTop.left = rc.left - nOffs;
+ rcTop.top = rc.top - nOffs;
+ rcTop.right = rc.right + nOffs;
+ rcTop.bottom = rc.top + nOffs;
+
+ rcRight.left = rc.right - nOffs;
+ rcRight.top = rc.top - nOffs;
+ rcRight.right = rc.right + nOffs;
+ rcRight.bottom = rc.bottom + nOffs;
+
+ rcBottom.left = rc.left - nOffs;
+ rcBottom.top = rc.bottom - nOffs;
+ rcBottom.right = rc.right + nOffs;
+ rcBottom.bottom = rc.bottom + nOffs;
+
+
+ bDockedLeft = FALSE;
+ bDockedRight = FALSE;
+
+ // Upper-left
+ pt.x = rcThumb.left;
+ pt.y = rcThumb.top;
+ bDocked = FALSE;
+
+ if ( PtInRect( &rcRight, pt ) )
+ {
+ nNewX = rc.right;
+ bDocked = TRUE;
+ }
+
+ if ( PtInRect( &rcBottom, pt ) )
+ {
+ nNewY = rc.bottom;
+
+ if ( PtInRect( &rcLeft, pt ) )
+ {
+ nNewX = rc.left;
+ }
+ }
+
+ if ( PtInRect( &rcTop, pt ) )
+ {
+ nNewY = rc.top;
+ bDockedLeft = bDocked;
+ }
+
+ // Upper-right
+ pt.x = rcThumb.right;
+ pt.y = rcThumb.top;
+ bDocked = FALSE;
+
+ if ( !bLeading && PtInRect( &rcLeft, pt ) )
+ {
+ if ( !bDockedLeft )
+ {
+ nNewX = rc.left - nWidth;
+ bDocked = TRUE;
+ }
+ else if ( rc.right == rcThumb.left )
+ {
+ bDocked = TRUE;
+ }
+ }
+
+
+ if ( PtInRect( &rcBottom, pt ) )
+ {
+ nNewY = rc.bottom;
+
+ if ( PtInRect( &rcRight, pt ) )
+ {
+ nNewX = rc.right - nWidth;
+ }
+ }
+
+ if ( !bLeading && PtInRect( &rcTop, pt ) )
+ {
+ nNewY = rc.top;
+ bDockedRight = bDocked;
+ }
+
+ if ( bMoveTogether )
+ {
+ if ( bDockedRight )
+ {
+ DockThumbs( pThumb, pCurThumb, TRUE );
+ }
+
+ if ( bDockedLeft )
+ {
+ DockThumbs( pCurThumb, pThumb, FALSE );
+ }
+ }
+
+ // Lower-left
+ pt.x = rcThumb.left;
+ pt.y = rcThumb.bottom;
+
+ if ( PtInRect( &rcRight, pt ) )
+ {
+ nNewX = rc.right;
+ }
+
+ if ( PtInRect( &rcTop, pt ) )
+ {
+ nNewY = rc.top - nHeight;
+
+ if ( PtInRect( &rcLeft, pt ) )
+ {
+ nNewX = rc.left;
+ }
+ }
+
+
+ // Lower-right
+ pt.x = rcThumb.right;
+ pt.y = rcThumb.bottom;
+
+ if ( !bLeading && PtInRect( &rcLeft, pt ) )
+ {
+ nNewX = rc.left - nWidth;
+ }
+
+ if ( !bLeading && PtInRect( &rcTop, pt ) )
+ {
+ nNewY = rc.top - nHeight;
+
+ if ( PtInRect( &rcRight, pt ) )
+ {
+ nNewX = rc.right - nWidth;
+ }
+ }
+ }
+
+ }
+ frmidx++;
+ if (pCurThumb->ContainerWnd==fakeTaskBarWindow.ContainerWnd){break;}
+ if (pCurThumb->ContainerWnd==fakeMainWindow.ContainerWnd){
+ pCurThumb=&fakeTaskBarWindow;continue;}
+ if (frmidx==nFramescount){
+ pCurThumb=&fakeMainWindow;continue;
+ }
+
+ pCurThumb = &Frames[frmidx];
+
+
+
+ }
+
+ // Adjust coords once again
+ nNewX = nNewX < nOffs ? 0 : nNewX;
+ nNewX = nNewX > ( sizeScreen.cx - nWidth - nOffs ) ? ( sizeScreen.cx - nWidth ) : nNewX;
+ nNewY = nNewY < nOffs ? 0 : nNewY;
+ nNewY = nNewY > ( sizeScreen.cy - nHeight - nOffs ) ? ( sizeScreen.cy - nHeight ) : nNewY;
+
+
+ SetWindowPos( pThumb->ContainerWnd,
+ HWND_TOPMOST,
+ nNewX,
+ nNewY,
+ 0,
+ 0,
+ SWP_NOSIZE | SWP_NOZORDER );
+
+
+ // OK, move all docked thumbs
+ if ( bMoveTogether )
+ {
+ pDockThumb = FindFrameByWnd( pDockThumb->dockOpt.hwndRight );
+
+ PositionThumb( pDockThumb, (short)( nNewX + nWidth ), (short)nNewY );
+ }
+}
+
+
+//////////
+
+
+
+void GetBorderSize(HWND hwnd,RECT *rect)
+{
+ RECT wr,cr;
+ POINT pt1,pt2;
+
+ GetWindowRect(hwnd,&wr);
+ GetClientRect(hwnd,&cr);
+ pt1.y=cr.top;pt1.x=cr.left;
+ pt2.y=cr.bottom;pt2.x=cr.right;
+
+ ClientToScreen(hwnd,&pt1);
+ ClientToScreen(hwnd,&pt2);
+
+ cr.top=pt1.y;cr.left=pt1.x;
+ cr.bottom=pt2.y;cr.right=pt2.x;
+
+ rect->top=cr.top-wr.top;
+ rect->left=cr.left-wr.left;
+ rect->right=wr.right-cr.right;
+ rect->bottom=wr.bottom-cr.bottom;
+ //if (rect->top+rect->bottom>10){rect->top=rect->bottom=2;}
+ //if (rect->left+rect->right>10){rect->top=rect->bottom=2;}
+
+}
+
+//append string
+char __inline *AS(char *str,const char *setting,char *addstr)
+{
+ if(str!=NULL) {
+ strcpy(str,setting);
+ strcat(str,addstr);
+ }
+ return str;
+}
+
+int DBLoadFrameSettingsAtPos(int pos,int Frameid)
+{
+ char sadd[15];
+ char buf[255];
+// char *oldtb;
+
+ _itoa(pos,sadd,10);
+
+ //DBWriteContactSettingTString(0,CLUIFrameModule,strcat("Name",sadd),Frames[Frameid].tname);
+
+ //boolean
+ Frames[Frameid].collapsed=DBGetContactSettingByte(0,CLUIFrameModule,AS(buf,"Collapse",sadd),Frames[Frameid].collapsed);
+
+ Frames[Frameid].Locked =DBGetContactSettingByte(0,CLUIFrameModule,AS(buf,"Locked",sadd),Frames[Frameid].Locked);
+ Frames[Frameid].visible =DBGetContactSettingByte(0,CLUIFrameModule,AS(buf,"Visible",sadd),Frames[Frameid].visible);
+ Frames[Frameid].TitleBar.ShowTitleBar =DBGetContactSettingByte(0,CLUIFrameModule,AS(buf,"TBVisile",sadd),Frames[Frameid].TitleBar.ShowTitleBar);
+
+ Frames[Frameid].height =DBGetContactSettingWord(0,CLUIFrameModule,AS(buf,"Height",sadd),Frames[Frameid].height);
+ Frames[Frameid].HeightWhenCollapsed =DBGetContactSettingWord(0,CLUIFrameModule,AS(buf,"HeightCollapsed",sadd),0);
+ Frames[Frameid].align =DBGetContactSettingWord(0,CLUIFrameModule,AS(buf,"Align",sadd),Frames[Frameid].align);
+
+ Frames[Frameid].FloatingPos.x =DBGetContactSettingRangedWord(0,CLUIFrameModule,AS(buf,"FloatX",sadd),100,0,1024);
+ Frames[Frameid].FloatingPos.y =DBGetContactSettingRangedWord(0,CLUIFrameModule,AS(buf,"FloatY",sadd),100,0,1024);
+ Frames[Frameid].FloatingSize.x =DBGetContactSettingRangedWord(0,CLUIFrameModule,AS(buf,"FloatW",sadd),100,0,1024);
+ Frames[Frameid].FloatingSize.y =DBGetContactSettingRangedWord(0,CLUIFrameModule,AS(buf,"FloatH",sadd),100,0,1024);
+
+ Frames[Frameid].floating =DBGetContactSettingByte(0,CLUIFrameModule,AS(buf,"Floating",sadd),0);
+ Frames[Frameid].order =DBGetContactSettingWord(0,CLUIFrameModule,AS(buf,"Order",sadd),0);
+
+ Frames[Frameid].UseBorder =DBGetContactSettingByte(0,CLUIFrameModule,AS(buf,"UseBorder",sadd),Frames[Frameid].UseBorder);
+
+ return 0;
+}
+
+int DBStoreFrameSettingsAtPos(int pos,int Frameid)
+{
+ char sadd[16];
+ char buf[255];
+
+ _itoa(pos,sadd,10);
+
+ DBWriteContactSettingTString(0,CLUIFrameModule,AS(buf,"Name",sadd),Frames[Frameid].name);
+ //boolean
+ DBWriteContactSettingByte(0,CLUIFrameModule,AS(buf,"Collapse",sadd),(BYTE)btoint(Frames[Frameid].collapsed));
+ DBWriteContactSettingByte(0,CLUIFrameModule,AS(buf,"Locked",sadd),(BYTE)btoint(Frames[Frameid].Locked));
+ DBWriteContactSettingByte(0,CLUIFrameModule,AS(buf,"Visible",sadd),(BYTE)btoint(Frames[Frameid].visible));
+ DBWriteContactSettingByte(0,CLUIFrameModule,AS(buf,"TBVisile",sadd),(BYTE)btoint(Frames[Frameid].TitleBar.ShowTitleBar));
+
+ DBWriteContactSettingWord(0,CLUIFrameModule,AS(buf,"Height",sadd),(WORD)Frames[Frameid].height);
+ DBWriteContactSettingWord(0,CLUIFrameModule,AS(buf,"HeightCollapsed",sadd),(WORD)Frames[Frameid].HeightWhenCollapsed);
+ DBWriteContactSettingWord(0,CLUIFrameModule,AS(buf,"Align",sadd),(WORD)Frames[Frameid].align);
+ //FloatingPos
+ DBWriteContactSettingWord(0,CLUIFrameModule,AS(buf,"FloatX",sadd),(WORD)Frames[Frameid].FloatingPos.x);
+ DBWriteContactSettingWord(0,CLUIFrameModule,AS(buf,"FloatY",sadd),(WORD)Frames[Frameid].FloatingPos.y);
+ DBWriteContactSettingWord(0,CLUIFrameModule,AS(buf,"FloatW",sadd),(WORD)Frames[Frameid].FloatingSize.x);
+ DBWriteContactSettingWord(0,CLUIFrameModule,AS(buf,"FloatH",sadd),(WORD)Frames[Frameid].FloatingSize.y);
+
+ DBWriteContactSettingByte(0,CLUIFrameModule,AS(buf,"Floating",sadd),(BYTE)btoint(Frames[Frameid].floating));
+ DBWriteContactSettingByte(0,CLUIFrameModule,AS(buf,"UseBorder",sadd),(BYTE)btoint(Frames[Frameid].UseBorder));
+ DBWriteContactSettingWord(0,CLUIFrameModule,AS(buf,"Order",sadd),(WORD)Frames[Frameid].order);
+ //DBWriteContactSettingString(0,CLUIFrameModule,AS(buf,"TBName",sadd),Frames[Frameid].TitleBar.tbname);
+ return 0;
+}
+
+int LocateStorePosition(int Frameid,int maxstored)
+{
+ int i;
+ LPTSTR frmname;
+ char settingname[255];
+ if(Frames[Frameid].name==NULL) return -1;
+
+ for(i=0;i<maxstored;i++) {
+ mir_snprintf(settingname,sizeof(settingname),"Name%d",i);
+ frmname=DBGetStringT(0,CLUIFrameModule,settingname);
+ if(frmname==NULL) continue;
+ if(lstrcmpi(frmname,Frames[Frameid].name)==0) {
+ mir_free(frmname);
+ return i;
+ }
+ mir_free(frmname);
+ }
+ return -1;
+}
+
+int CLUIFramesLoadFrameSettings(int Frameid)
+{
+ int storpos,maxstored;
+
+ //lockfrm();must locked in caller
+ if(Frameid<0||Frameid>=nFramescount) return -1;
+
+ maxstored=DBGetContactSettingWord(0,CLUIFrameModule,"StoredFrames",-1);
+ if(maxstored==-1) return 0;
+
+ storpos=LocateStorePosition(Frameid,maxstored);
+ if(storpos==-1) return 0;
+
+ DBLoadFrameSettingsAtPos(storpos,Frameid);
+ //ulockfrm();
+ return 0;
+}
+
+int CLUIFramesStoreFrameSettings(int Frameid)
+{
+ int maxstored,storpos;
+
+ //lockfrm();
+ if(Frameid<0||Frameid>=nFramescount) return -1;
+
+ maxstored=DBGetContactSettingWord(0,CLUIFrameModule,"StoredFrames",-1);
+ if(maxstored==-1) maxstored=0;
+
+ storpos=LocateStorePosition(Frameid,maxstored);
+ if(storpos==-1) {storpos=maxstored; maxstored++;}
+
+ DBStoreFrameSettingsAtPos(storpos,Frameid);
+ DBWriteContactSettingWord(0,CLUIFrameModule,"StoredFrames",(WORD)maxstored);
+ //ulockfrm();
+ return 0;
+}
+
+int CLUIFramesStoreAllFrames()
+{
+ int i;
+ lockfrm();
+ for(i=0;i<nFramescount;i++)
+ CLUIFramesStoreFrameSettings(i);
+ ulockfrm();
+ return 0;
+}
+
+// Get client frame
+int CLUIFramesGetalClientFrame(void)
+{
+ int i;
+ if(alclientFrame!=-1)
+ return alclientFrame;
+
+ if(alclientFrame!=-1) {
+ /* this value could become invalid if RemoveItemFromList was called,
+ * so we double-check */
+ if (alclientFrame<nFramescount) {
+ if(Frames[alclientFrame].align==alClient) {
+ return alclientFrame;
+ }
+ }
+}
+
+ for(i=0;i<nFramescount;i++)
+ if(Frames[i].align==alClient) {
+ alclientFrame=i;
+ return i;
+ }
+ //pluginLink
+ return -1;
+}
+
+HMENU CLUIFramesCreateMenuForFrame(int frameid,int root,int popuppos,char *addservice)
+{
+ CLISTMENUITEM mi;
+ //TMO_MenuItem tmi;
+ HANDLE menuid;
+ int framepos=id2pos(frameid);
+
+ ZeroMemory(&mi,sizeof(mi));
+
+ mi.cbSize=sizeof(mi);
+ mi.hIcon=LoadIcon(g_hInst,MAKEINTRESOURCE(IDI_CLIENTMIRANDA));
+ mi.pszPopupName=(char *)root;
+ mi.popupPosition=frameid;
+ mi.position=popuppos++;
+ mi.pszName=LPGEN("&FrameTitle");
+ mi.flags=CMIF_CHILDPOPUP|CMIF_GRAYED;
+ mi.pszContactOwner=(char *)0;
+ menuid=(HANDLE)CallService(addservice,0,(LPARAM)&mi);
+ if(frameid==-1) contMITitle=menuid;
+ else Frames[framepos].MenuHandles.MITitle=menuid;
+
+ popuppos+=100000;
+ mi.hIcon=NULL;
+ mi.cbSize=sizeof(mi);
+ mi.pszPopupName=(char *)root;
+ mi.popupPosition=frameid;
+ mi.position=popuppos++;
+ mi.pszName=LPGEN("&Visible");
+ mi.flags=CMIF_CHILDPOPUP|CMIF_CHECKED;
+ mi.pszContactOwner=(char *)0;
+ mi.pszService=MS_CLIST_FRAMES_SHFRAME;
+ menuid=(HANDLE)CallService(addservice,0,(LPARAM)&mi);
+ if(frameid==-1) contMIVisible=menuid;
+ else Frames[framepos].MenuHandles.MIVisible=menuid;
+
+ mi.pszPopupName=(char *)root;
+ mi.popupPosition=frameid;
+ mi.position=popuppos++;
+ mi.pszName=LPGEN("&Show TitleBar");
+ mi.flags=CMIF_CHILDPOPUP|CMIF_CHECKED;
+ mi.pszService=MS_CLIST_FRAMES_SHFRAMETITLEBAR;
+ mi.pszContactOwner=(char *)0;
+ menuid=(HANDLE)CallService(addservice,0,(LPARAM)&mi);
+ if(frameid==-1) contMITBVisible=menuid;
+ else Frames[framepos].MenuHandles.MITBVisible=menuid;
+
+
+ popuppos+=100000;
+
+ mi.pszPopupName=(char *)root;
+ mi.popupPosition=frameid;
+ mi.position=popuppos++;
+ mi.pszName=LPGEN("&Locked");
+ mi.flags=CMIF_CHILDPOPUP|CMIF_CHECKED;
+ mi.pszService=MS_CLIST_FRAMES_ULFRAME;
+ mi.pszContactOwner=(char *)0;
+ menuid=(HANDLE)CallService(addservice,0,(LPARAM)&mi);
+ if(frameid==-1) contMILock=menuid;
+ else Frames[framepos].MenuHandles.MILock=menuid;
+
+ mi.pszPopupName=(char *)root;
+ mi.popupPosition=frameid;
+ mi.position=popuppos++;
+ mi.pszName=LPGEN("&Collapsed");
+ mi.flags=CMIF_CHILDPOPUP|CMIF_CHECKED;
+ mi.pszService=MS_CLIST_FRAMES_UCOLLFRAME;
+ mi.pszContactOwner=(char *)0;
+ menuid=(HANDLE)CallService(addservice,0,(LPARAM)&mi);
+ if(frameid==-1) contMIColl=menuid;
+ else Frames[framepos].MenuHandles.MIColl=menuid;
+
+ //floating
+ mi.pszPopupName=(char *)root;
+ mi.popupPosition=frameid;
+ mi.position=popuppos++;
+ mi.pszName=LPGEN("&Floating Mode");
+ mi.flags=CMIF_CHILDPOPUP;
+ mi.pszService="Set_Floating";
+ mi.pszContactOwner=(char *)0;
+ menuid=(HANDLE)CallService(addservice,0,(LPARAM)&mi);
+ if(frameid==-1) contMIFloating=menuid;
+ else Frames[framepos].MenuHandles.MIFloating=menuid;
+
+
+ popuppos+=100000;
+
+ mi.pszPopupName=(char *)root;
+ mi.popupPosition=frameid;
+ mi.position=popuppos++;
+ mi.pszName=LPGEN("&Border");
+ mi.flags=CMIF_CHILDPOPUP|CMIF_CHECKED;
+ mi.pszService=MS_CLIST_FRAMES_SETUNBORDER;
+ mi.pszContactOwner=(char *)0;
+ menuid=(HANDLE)CallService(addservice,0,(LPARAM)&mi);
+ if(frameid==-1) contMIBorder=menuid;
+ else Frames[framepos].MenuHandles.MIBorder=menuid;
+
+ popuppos+=100000;
+
+ {
+ //alignment root
+ mi.pszPopupName=(char *)root;
+ mi.popupPosition=frameid;
+ mi.position=popuppos++;
+ mi.pszName=LPGEN("&Align");
+ mi.flags=CMIF_CHILDPOPUP|CMIF_ROOTPOPUP;
+ mi.pszService="";
+ mi.pszContactOwner=(char *)0;
+ menuid=(HANDLE)CallService(addservice,0,(LPARAM)&mi);
+ if(frameid==-1) contMIAlignRoot=menuid;
+ else Frames[framepos].MenuHandles.MIAlignRoot=menuid;
+
+ mi.flags=CMIF_CHILDPOPUP;
+ //align top
+ mi.pszPopupName=(char *)menuid;
+ mi.popupPosition=frameid;
+ mi.position=popuppos++;
+ mi.pszName=LPGEN("&Top");
+ mi.pszService=CLUIFRAMESSETALIGNALTOP;
+ mi.pszContactOwner=(char *)alTop;
+ menuid=(HANDLE)CallService(addservice,0,(LPARAM)&mi);
+ if(frameid==-1) contMIAlignTop=menuid;
+ else Frames[framepos].MenuHandles.MIAlignTop=menuid;
+
+
+ //align client
+ mi.position=popuppos++;
+ mi.pszName=LPGEN("&Client");
+ mi.pszService=CLUIFRAMESSETALIGNALCLIENT;
+ mi.pszContactOwner=(char *)alClient;
+ menuid=(HANDLE)CallService(addservice,0,(LPARAM)&mi);
+ if(frameid==-1) contMIAlignClient=menuid;
+ else Frames[framepos].MenuHandles.MIAlignClient=menuid;
+
+ //align bottom
+ mi.position=popuppos++;
+ mi.pszName=LPGEN("&Bottom");
+ mi.pszService=CLUIFRAMESSETALIGNALBOTTOM;
+ mi.pszContactOwner=(char *)alBottom;
+ menuid=(HANDLE)CallService(addservice,0,(LPARAM)&mi);
+ if(frameid==-1) contMIAlignBottom=menuid;
+ else Frames[framepos].MenuHandles.MIAlignBottom=menuid;
+
+ }
+
+ { //position
+ //position root
+ mi.pszPopupName=(char *)root;
+ mi.popupPosition=frameid;
+ mi.position=popuppos++;
+ mi.pszName=LPGEN("&Position");
+ mi.flags=CMIF_CHILDPOPUP|CMIF_ROOTPOPUP;
+ mi.pszService="";
+ mi.pszContactOwner=(char *)0;
+ menuid=(HANDLE)CallService(addservice,0,(LPARAM)&mi);
+
+ mi.pszPopupName=(char *)menuid;
+ mi.popupPosition=frameid;
+ mi.position=popuppos++;
+ mi.pszName=LPGEN("&Up");
+ mi.flags=CMIF_CHILDPOPUP;
+ mi.pszService=CLUIFRAMESMOVEUPDOWN;
+ mi.pszContactOwner=(char *)1;
+ CallService(addservice,0,(LPARAM)&mi);
+
+ mi.pszPopupName=(char *)menuid;
+ mi.popupPosition=frameid;
+ mi.position=popuppos++;
+ mi.pszName=LPGEN("&Down");
+ mi.flags=CMIF_CHILDPOPUP;
+ mi.pszService=CLUIFRAMESMOVEUPDOWN;
+ mi.pszContactOwner=(char *)-1;
+ CallService(addservice,0,(LPARAM)&mi);
+
+ }
+
+ return 0;
+}
+
+INT_PTR ModifyMItem(WPARAM wParam,LPARAM lParam)
+{
+return ModifyMenuItemProxy(wParam,lParam);
+}
+
+
+static int CLUIFramesModifyContextMenuForFrame(WPARAM wParam,LPARAM lParam)
+{
+ int pos;
+ CLISTMENUITEM mi;
+ //TMO_MenuItem tmi;
+
+ lockfrm();
+ pos=id2pos(wParam);
+
+ if(pos>=0&&pos<nFramescount) {
+ memset(&mi,0,sizeof(mi));
+ mi.cbSize=sizeof(mi);
+ mi.flags=CMIM_NAME|CMIF_CHILDPOPUP|CMIF_TCHAR;
+ mi.ptszName=Frames[pos].TitleBar.tbname ? Frames[pos].TitleBar.tbname : Frames[pos].name;
+ ModifyMItem((WPARAM)contMITitle,(LPARAM)&mi);
+
+ mi.flags=CMIM_FLAGS|CMIF_CHILDPOPUP;
+ if(Frames[pos].visible) mi.flags|=CMIF_CHECKED;
+ ModifyMItem((WPARAM)contMIVisible,(LPARAM)&mi);
+
+ mi.flags=CMIM_FLAGS|CMIF_CHILDPOPUP;
+ if(Frames[pos].Locked) mi.flags|=CMIF_CHECKED;
+ ModifyMItem((WPARAM)contMILock,(LPARAM)&mi);
+
+ mi.flags=CMIM_FLAGS|CMIF_CHILDPOPUP;
+ if(Frames[pos].TitleBar.ShowTitleBar) mi.flags|=CMIF_CHECKED;
+ ModifyMItem((WPARAM)contMITBVisible,(LPARAM)&mi);
+
+ mi.flags=CMIM_FLAGS|CMIF_CHILDPOPUP;
+ if(Frames[pos].floating) mi.flags|=CMIF_CHECKED;
+ ModifyMItem((WPARAM)contMIFloating,(LPARAM)&mi);
+
+ mi.flags=CMIM_FLAGS|CMIF_CHILDPOPUP;
+ if((Frames[pos].UseBorder)) mi.flags|=CMIF_CHECKED;
+ ModifyMItem((WPARAM)contMIBorder,(LPARAM)&mi);
+
+
+
+ mi.flags=CMIM_FLAGS|CMIF_CHILDPOPUP;
+ if(Frames[pos].align&alTop) mi.flags|=CMIF_CHECKED;
+ ModifyMItem((WPARAM)contMIAlignTop,(LPARAM)&mi);
+
+ mi.flags=CMIM_FLAGS|CMIF_CHILDPOPUP;
+ if(Frames[pos].align&alClient) mi.flags|=CMIF_CHECKED;
+ ModifyMItem((WPARAM)contMIAlignClient,(LPARAM)&mi);
+
+ mi.flags=CMIM_FLAGS|CMIF_CHILDPOPUP;
+ if(Frames[pos].align&alBottom) mi.flags|=CMIF_CHECKED;
+ ModifyMItem((WPARAM)contMIAlignBottom,(LPARAM)&mi);
+
+
+ mi.flags=CMIM_FLAGS|CMIF_CHILDPOPUP;
+ if(Frames[pos].collapsed) mi.flags|=CMIF_CHECKED;
+ if((!Frames[pos].visible)||(Frames[pos].Locked)||(pos==CLUIFramesGetalClientFrame())) mi.flags|=CMIF_GRAYED;
+ ModifyMItem((WPARAM)contMIColl,(LPARAM)&mi);
+ }
+ ulockfrm();
+ return 0;
+}
+
+INT_PTR CLUIFramesModifyMainMenuItems(WPARAM wParam,LPARAM lParam)
+{
+ int pos;
+ CLISTMENUITEM mi;
+ //TMO_MenuItem tmi;
+
+ lockfrm();
+ pos=id2pos(wParam);
+
+ if (pos>=0&&pos<nFramescount) {
+ memset(&mi,0,sizeof(mi));
+ mi.cbSize=sizeof(mi);
+ mi.flags=CMIM_NAME|CMIF_CHILDPOPUP|CMIF_TCHAR;
+ mi.ptszName=Frames[pos].TitleBar.tbname ? Frames[pos].TitleBar.tbname : Frames[pos].name;
+ CallService(MS_CLIST_MODIFYMENUITEM,(WPARAM)Frames[pos].MenuHandles.MITitle,(LPARAM)&mi);
+
+ mi.flags=CMIM_FLAGS|CMIF_CHILDPOPUP;
+ if(Frames[pos].visible) mi.flags|=CMIF_CHECKED;
+ CallService(MS_CLIST_MODIFYMENUITEM,(WPARAM)Frames[pos].MenuHandles.MIVisible,(LPARAM)&mi);
+
+ mi.flags=CMIM_FLAGS|CMIF_CHILDPOPUP;
+ if(Frames[pos].Locked) mi.flags|=CMIF_CHECKED;
+ CallService(MS_CLIST_MODIFYMENUITEM,(WPARAM)Frames[pos].MenuHandles.MILock,(LPARAM)&mi);
+
+ mi.flags=CMIM_FLAGS|CMIF_CHILDPOPUP;
+ if(Frames[pos].TitleBar.ShowTitleBar) mi.flags|=CMIF_CHECKED;
+ CallService(MS_CLIST_MODIFYMENUITEM,(WPARAM)Frames[pos].MenuHandles.MITBVisible,(LPARAM)&mi);
+
+ mi.flags=CMIM_FLAGS|CMIF_CHILDPOPUP;
+ if(Frames[pos].floating) mi.flags|=CMIF_CHECKED;
+ CallService(MS_CLIST_MODIFYMENUITEM,(WPARAM)Frames[pos].MenuHandles.MIFloating,(LPARAM)&mi);
+
+ mi.flags=CMIM_FLAGS|CMIF_CHILDPOPUP;
+ if((Frames[pos].UseBorder)) mi.flags|=CMIF_CHECKED;
+ CallService(MS_CLIST_MODIFYMENUITEM,(WPARAM)Frames[pos].MenuHandles.MIBorder,(LPARAM)&mi);
+
+ mi.flags=CMIM_FLAGS|CMIF_CHILDPOPUP|((Frames[pos].align&alClient)?CMIF_GRAYED:0);
+ if(Frames[pos].align&alTop) mi.flags|=CMIF_CHECKED;
+ CallService(MS_CLIST_MODIFYMENUITEM,(WPARAM)Frames[pos].MenuHandles.MIAlignTop,(LPARAM)&mi);
+
+ mi.flags=CMIM_FLAGS|CMIF_CHILDPOPUP;
+ if(Frames[pos].align&alClient) mi.flags|=CMIF_CHECKED;
+ CallService(MS_CLIST_MODIFYMENUITEM,(WPARAM)Frames[pos].MenuHandles.MIAlignClient,(LPARAM)&mi);
+
+ mi.flags=CMIM_FLAGS|CMIF_CHILDPOPUP|((Frames[pos].align&alClient)?CMIF_GRAYED:0);
+ if(Frames[pos].align&alBottom) mi.flags|=CMIF_CHECKED;
+ CallService(MS_CLIST_MODIFYMENUITEM,(WPARAM)Frames[pos].MenuHandles.MIAlignBottom,(LPARAM)&mi);
+
+/*
+ mi.flags=CMIM_FLAGS|CMIF_CHILDPOPUP|((Frames[pos].align&alClient)?CMIF_GRAYED:0);
+ if(Frames[pos].align&alTop) mi.flags|=CMIF_CHECKED;
+ ModifyMItem((WPARAM)contMIAlignTop,(LPARAM)&mi);
+
+ mi.flags=CMIM_FLAGS|CMIF_CHILDPOPUP|CMIF_GRAYED;
+ if(Frames[pos].align&alClient) mi.flags|=CMIF_CHECKED;
+ ModifyMItem((WPARAM)contMIAlignClient,(LPARAM)&mi);
+
+ mi.flags=CMIM_FLAGS|CMIF_CHILDPOPUP|((Frames[pos].align&alClient)?CMIF_GRAYED:0);
+ if(Frames[pos].align&alBottom) mi.flags|=CMIF_CHECKED;
+ ModifyMItem((WPARAM)contMIAlignBottom,(LPARAM)&mi);
+
+*/
+
+
+
+ mi.flags=CMIM_FLAGS|CMIF_CHILDPOPUP;
+ if(Frames[pos].collapsed) mi.flags|=CMIF_CHECKED;
+ if((!Frames[pos].visible)||Frames[pos].Locked||(pos==CLUIFramesGetalClientFrame())) mi.flags|=CMIF_GRAYED;
+ CallService(MS_CLIST_MODIFYMENUITEM,(WPARAM)Frames[pos].MenuHandles.MIColl,(LPARAM)&mi);
+ }
+ ulockfrm();
+ return 0;
+}
+
+//hiword(wParam)=frameid,loword(wParam)=flag
+INT_PTR CLUIFramesGetFrameOptions(WPARAM wParam,LPARAM lParam)
+{
+ int pos;
+ INT_PTR retval;
+
+ if (FramesSysNotStarted) return 0;
+
+ lockfrm();
+ pos=id2pos(HIWORD(wParam));
+ if(pos<0||pos>=nFramescount) {
+ ulockfrm();
+ return -1;
+ }
+
+ switch(LOWORD(wParam))
+ {
+ case FO_FLAGS:
+ retval=0;
+ if(Frames[pos].visible) retval|=F_VISIBLE;
+ if(!Frames[pos].collapsed) retval|=F_UNCOLLAPSED;
+ if(Frames[pos].Locked) retval|=F_LOCKED;
+ if(Frames[pos].TitleBar.ShowTitleBar) retval|=F_SHOWTB;
+ if(Frames[pos].TitleBar.ShowTitleBarTip) retval|=F_SHOWTBTIP;
+ if(!(GetWindowLong(Frames[pos].hWnd,GWL_STYLE)&WS_BORDER)) retval|=F_NOBORDER;
+ break;
+
+ case FO_NAME:
+ retval=(INT_PTR)Frames[pos].name;
+ break;
+
+ case FO_TBNAME:
+ retval=(INT_PTR)Frames[pos].TitleBar.tbname;
+ break;
+
+ case FO_TBTIPNAME:
+ retval=(INT_PTR)Frames[pos].TitleBar.tooltip;
+ break;
+
+ case FO_TBSTYLE:
+ retval=GetWindowLong(Frames[pos].TitleBar.hwnd,GWL_STYLE);
+ break;
+
+ case FO_TBEXSTYLE:
+ retval=GetWindowLong(Frames[pos].TitleBar.hwnd,GWL_EXSTYLE);
+ break;
+
+ case FO_ICON:
+ retval=(INT_PTR)Frames[pos].TitleBar.hicon;
+ break;
+
+ case FO_HEIGHT:
+ retval=(INT_PTR)Frames[pos].height;
+ break;
+
+ case FO_ALIGN:
+ retval=(INT_PTR)Frames[pos].align;
+ break;
+ case FO_FLOATING:
+ retval=(INT_PTR)Frames[pos].floating;
+ break;
+ default:
+ retval=-1;
+ break;
+ }
+ ulockfrm();
+ return retval;
+}
+
+//hiword(wParam)=frameid,loword(wParam)=flag
+INT_PTR CLUIFramesSetFrameOptions(WPARAM wParam,LPARAM lParam)
+{
+ int pos;
+ INT_PTR retval; // value to be returned
+
+ lockfrm();
+ pos=id2pos(HIWORD(wParam));
+ if(pos<0||pos>=nFramescount) {
+ ulockfrm();
+ return -1;
+ }
+
+ switch(LOWORD(wParam) & ~FO_UNICODETEXT)
+ {
+ case FO_FLAGS:{
+ int flag=lParam;
+ int style;
+
+ Frames[pos].dwFlags=flag;
+ Frames[pos].visible=FALSE;
+ if(flag&F_VISIBLE) Frames[pos].visible=TRUE;
+
+ Frames[pos].collapsed=TRUE;
+ if(flag&F_UNCOLLAPSED) Frames[pos].collapsed=FALSE;
+
+ Frames[pos].Locked=FALSE;
+ if(flag&F_LOCKED) Frames[pos].Locked=TRUE;
+
+ Frames[pos].UseBorder=TRUE;
+ if(flag&F_NOBORDER) Frames[pos].UseBorder=FALSE;
+
+ Frames[pos].TitleBar.ShowTitleBar=FALSE;
+ if(flag&F_SHOWTB) Frames[pos].TitleBar.ShowTitleBar=TRUE;
+
+ Frames[pos].TitleBar.ShowTitleBarTip=FALSE;
+ if(flag&F_SHOWTBTIP) Frames[pos].TitleBar.ShowTitleBarTip=TRUE;
+
+ SendMessage(Frames[pos].TitleBar.hwndTip,TTM_ACTIVATE,(WPARAM)Frames[pos].TitleBar.ShowTitleBarTip,0);
+
+ style=(int)GetWindowLong(Frames[pos].hWnd,GWL_STYLE);
+ style|=WS_BORDER;
+ if(flag&F_NOBORDER) {style&=(~WS_BORDER);}
+ SetWindowLong(Frames[pos].hWnd,GWL_STYLE,(LONG)style);
+ ulockfrm();
+ CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,(LPARAM)0);
+ return 0;
+ }
+
+ case FO_NAME:
+ if(lParam==(LPARAM)NULL) {ulockfrm(); return -1;}
+ mir_free(Frames[pos].name);
+ Frames[pos].name=mir_tstrdup((LPTSTR)lParam);
+ ulockfrm();
+ return 0;
+
+ case FO_TBNAME:
+ if(lParam==(LPARAM)NULL) {ulockfrm(); return(-1);}
+ mir_free(Frames[pos].TitleBar.tbname);
+ Frames[pos].TitleBar.tbname=mir_tstrdup((LPTSTR)lParam);
+ ulockfrm();
+ if (Frames[pos].floating&&(Frames[pos].TitleBar.tbname!=NULL)){SetWindowText(Frames[pos].ContainerWnd,Frames[pos].TitleBar.tbname);}
+ return 0;
+
+ case FO_TBTIPNAME:
+ if(lParam==(LPARAM)NULL) {ulockfrm(); return(-1);}
+ mir_free(Frames[pos].TitleBar.tooltip);
+ Frames[pos].TitleBar.tooltip=mir_tstrdup((LPTSTR)lParam);
+ UpdateTBToolTip(pos);
+ ulockfrm();
+ return 0;
+
+ case FO_TBSTYLE:
+ SetWindowLong(Frames[pos].TitleBar.hwnd,GWL_STYLE,lParam);
+ ulockfrm();
+ return 0;
+
+ case FO_TBEXSTYLE:
+ SetWindowLong(Frames[pos].TitleBar.hwnd,GWL_EXSTYLE,lParam);
+ ulockfrm();
+ return 0;
+
+ case FO_ICON:
+ Frames[pos].TitleBar.hicon=(HICON)lParam;
+ ulockfrm();
+ return 0;
+
+ case FO_HEIGHT:
+ if(lParam<0) {ulockfrm(); return -1;}
+ retval=Frames[pos].height;
+ Frames[pos].height=lParam;
+ if(!CLUIFramesFitInSize()) Frames[pos].height=retval;
+ retval=Frames[pos].height;
+ ulockfrm();
+
+ return retval;
+
+ case FO_FLOATING:
+ if(lParam<0) {ulockfrm(); return -1;}
+
+ {
+ int id=Frames[pos].id;
+ Frames[pos].floating=!(lParam);
+ ulockfrm();
+
+ CLUIFrameSetFloat(id,1);//lparam=1 use stored width and height
+ return(wParam);
+ }
+
+ case FO_ALIGN:
+ if (!(lParam&alTop||lParam&alBottom||lParam&alClient))
+ {
+ OutputDebugStringA("Wrong align option \r\n");
+ return (-1);
+ }
+
+ if((lParam&alClient)&&(CLUIFramesGetalClientFrame()>=0)) { //only one alClient frame possible
+ alclientFrame=-1;//recalc it
+ ulockfrm();
+ return -1;
+ }
+ Frames[pos].align=lParam;
+
+ ulockfrm();
+ return(0);
+ }
+ ulockfrm();
+ CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,(LPARAM)0);
+ return -1;
+}
+
+//wparam=lparam=0
+static INT_PTR CLUIFramesShowAll(WPARAM wParam,LPARAM lParam)
+{
+ int i;
+ for(i=0;i<nFramescount;i++)
+ Frames[i].visible=TRUE;
+ CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,(LPARAM)0);
+ return 0;
+}
+
+//wparam=lparam=0
+INT_PTR CLUIFramesShowAllTitleBars(WPARAM wParam,LPARAM lParam)
+{
+ int i;
+ for(i=0;i<nFramescount;i++)
+ Frames[i].TitleBar.ShowTitleBar=TRUE;
+ CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,(LPARAM)0);
+ return 0;
+}
+
+//wparam=lparam=0
+INT_PTR CLUIFramesHideAllTitleBars(WPARAM wParam,LPARAM lParam)
+{
+ int i;
+ for(i=0;i<nFramescount;i++)
+ Frames[i].TitleBar.ShowTitleBar=FALSE;
+ CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,(LPARAM)0);
+ return 0;
+}
+
+//wparam=frameid
+INT_PTR CLUIFramesShowHideFrame(WPARAM wParam,LPARAM lParam)
+{
+ int pos;
+
+ lockfrm();
+ pos=id2pos(wParam);
+ if(pos>=0&&(int)pos<nFramescount)
+ Frames[pos].visible=!Frames[pos].visible;
+ if (Frames[pos].floating){CLUIFrameResizeFloatingFrame(pos);}
+ ulockfrm();
+ if (!Frames[pos].floating) CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,(LPARAM)0);
+ return 0;
+}
+
+//wparam=frameid
+INT_PTR CLUIFramesShowHideFrameTitleBar(WPARAM wParam,LPARAM lParam)
+{
+ int pos;
+
+ lockfrm();
+ pos=id2pos(wParam);
+ if(pos>=0&&(int)pos<nFramescount)
+ Frames[pos].TitleBar.ShowTitleBar=!Frames[pos].TitleBar.ShowTitleBar;
+ //if (Frames[pos].height>
+
+ ulockfrm();
+
+ CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,(LPARAM)0);
+
+
+ return 0;
+}
+//wparam=frameid
+//lparam=-1 up ,1 down
+INT_PTR CLUIFramesMoveUpDown(WPARAM wParam,LPARAM lParam)
+{
+ int pos,i,curpos,curalign,v,tmpval;
+
+ lockfrm();
+ pos=id2pos(wParam);
+ if(pos>=0&&(int)pos<nFramescount) {
+ SortData *sd;
+ curpos=Frames[pos].order;
+ curalign=Frames[pos].align;
+ v=0;
+ sd=(SortData*)malloc(sizeof(SortData)*nFramescount);
+ memset(sd,0,sizeof(SortData)*nFramescount);
+ for (i=0;i<nFramescount;i++)
+ {
+ if (Frames[i].floating||(!Frames[i].visible)||(Frames[i].align!=curalign)){continue;}
+
+ sd[v].order=Frames[i].order;
+ sd[v].realpos=i;
+ v++;
+ }
+ if (v==0){ulockfrm();return(0);}
+ qsort(sd,v,sizeof(SortData),sortfunc);
+ for (i=0;i<v;i++)
+ {
+ if (sd[i].realpos==pos)
+ {
+ if (lParam==-1)
+ {
+ if (i>=v-1) break;
+ tmpval=Frames[sd[i+1].realpos].order;
+ Frames[sd[i+1].realpos].order=Frames[pos].order;
+ Frames[pos].order=tmpval;
+ break;
+ }
+ if (lParam==+1)
+ {
+ if (i<1) break;
+ tmpval=Frames[sd[i-1].realpos].order;
+ Frames[sd[i-1].realpos].order=Frames[pos].order;
+ Frames[pos].order=tmpval;
+ break;
+ }
+
+
+ }
+ }
+
+ if (sd!=NULL){free(sd);}
+ CLUIFramesStoreFrameSettings(pos);
+ CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,0);
+
+ }
+ ulockfrm();
+ return(0);
+}
+
+
+
+//wparam=frameid
+//lparam=alignment
+INT_PTR CLUIFramesSetAlign(WPARAM wParam,LPARAM lParam)
+{
+ CLUIFramesSetFrameOptions(MAKEWPARAM(FO_ALIGN,wParam),lParam);
+ CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,0);
+ return(0);
+}
+INT_PTR CLUIFramesSetAlignalTop(WPARAM wParam,LPARAM lParam)
+{
+ return CLUIFramesSetAlign(wParam,alTop);
+}
+INT_PTR CLUIFramesSetAlignalBottom(WPARAM wParam,LPARAM lParam)
+{
+ return CLUIFramesSetAlign(wParam,alBottom);
+}
+INT_PTR CLUIFramesSetAlignalClient(WPARAM wParam,LPARAM lParam)
+{
+ return CLUIFramesSetAlign(wParam,alClient);
+}
+
+
+//wparam=frameid
+INT_PTR CLUIFramesLockUnlockFrame(WPARAM wParam,LPARAM lParam)
+{
+ int pos;
+
+ lockfrm();
+ pos=id2pos(wParam);
+ if(pos>=0&&(int)pos<nFramescount) {
+ Frames[pos].Locked=!Frames[pos].Locked;
+ CLUIFramesStoreFrameSettings(pos);
+ }
+ ulockfrm();
+ return 0;
+}
+
+//wparam=frameid
+INT_PTR CLUIFramesSetUnSetBorder(WPARAM wParam,LPARAM lParam)
+{
+ RECT rc;
+ int FrameId,oldflags;
+ HWND hw;
+ boolean flt;
+
+ lockfrm();
+ FrameId=id2pos(wParam);
+ if (FrameId==-1){ulockfrm();return(-1);}
+ flt=
+ oldflags=CallService(MS_CLIST_FRAMES_GETFRAMEOPTIONS,MAKEWPARAM(FO_FLAGS,wParam),0);
+ if (oldflags&F_NOBORDER)
+ {
+ oldflags&=(~F_NOBORDER);
+ }
+ else
+ {
+ oldflags|=F_NOBORDER;
+ }
+ hw = Frames[FrameId].hWnd;
+ GetWindowRect(hw,&rc);
+
+ ulockfrm();
+ CallService(MS_CLIST_FRAMES_SETFRAMEOPTIONS,MAKEWPARAM(FO_FLAGS,wParam),oldflags);
+// CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,(LPARAM)0);
+ /*
+ if (Frames[FrameId].floating){
+ CLUIFrameResizeFloatingFrame(FrameId);
+ }
+ */
+
+ {
+ SetWindowPos(hw,0,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE|SWP_DRAWFRAME);
+ }
+ return(0);
+}
+//wparam=frameid
+INT_PTR CLUIFramesCollapseUnCollapseFrame(WPARAM wParam,LPARAM lParam)
+{
+ int FrameId;
+
+ lockfrm();
+ FrameId=id2pos(wParam);
+ if(FrameId>=0&&FrameId<nFramescount)
+ {
+ int oldHeight;
+
+ // do not collapse/uncollapse client/locked/invisible frames
+ if(Frames[FrameId].align==alClient&&!(Frames[FrameId].Locked||(!Frames[FrameId].visible)||Frames[FrameId].floating))
+ {
+ RECT rc;
+ if(CallService(MS_CLIST_DOCKINGISDOCKED,0,0)) {ulockfrm();return 0;}
+ if(DBGetContactSettingByte(NULL,"CLUI","AutoSize",0)) {ulockfrm();return 0;}
+ GetWindowRect(pcli->hwndContactList,&rc);
+
+ if(Frames[FrameId].collapsed==TRUE) {
+ rc.bottom-=rc.top;
+ rc.bottom-=Frames[FrameId].height;
+ Frames[FrameId].HeightWhenCollapsed=Frames[FrameId].height;
+ Frames[FrameId].collapsed=FALSE;
+ }
+ else
+ {
+ rc.bottom-=rc.top;
+ rc.bottom+=Frames[FrameId].HeightWhenCollapsed;
+ Frames[FrameId].collapsed=TRUE;
+ }
+
+ SetWindowPos(pcli->hwndContactList,NULL,0,0,rc.right-rc.left,rc.bottom,SWP_NOZORDER|SWP_NOACTIVATE|SWP_NOMOVE);
+
+ CLUIFramesStoreAllFrames();
+ ulockfrm();
+ return 0;
+
+ }
+ if(Frames[FrameId].Locked||(!Frames[FrameId].visible)) return 0;
+
+ oldHeight=Frames[FrameId].height;
+
+ // if collapsed, uncollapse
+ if(Frames[FrameId].collapsed==TRUE) {
+ Frames[FrameId].HeightWhenCollapsed=Frames[FrameId].height;
+ Frames[FrameId].height=UNCOLLAPSED_FRAME_SIZE;
+ Frames[FrameId].collapsed=FALSE;
+ }
+ // if uncollapsed, collapse
+ else {
+ Frames[FrameId].height=Frames[FrameId].HeightWhenCollapsed;
+ Frames[FrameId].collapsed=TRUE;
+ }
+
+ if (!Frames[FrameId].floating)
+ {
+
+ if(!CLUIFramesFitInSize()) {
+ //cant collapse,we can resize only for height<alclient frame height
+ int alfrm=CLUIFramesGetalClientFrame();
+
+ if(alfrm!=-1) {
+ Frames[FrameId].collapsed=FALSE;
+ if(Frames[alfrm].height>2*UNCOLLAPSED_FRAME_SIZE) {
+ oldHeight=Frames[alfrm].height-UNCOLLAPSED_FRAME_SIZE;
+ Frames[FrameId].collapsed=TRUE;
+ }
+ }else
+ {
+ int i,sumheight=0;
+ for(i=0;i<nFramescount;i++) {
+ if((Frames[i].align!=alClient)&&(!Frames[i].floating)&&(Frames[i].visible)&&(!Frames[i].needhide)) {
+ sumheight+=(Frames[i].height)+(TitleBarH*btoint(Frames[i].TitleBar.ShowTitleBar))+2;
+ return FALSE;
+ }
+ if(sumheight>ContactListHeight-0-2)
+ {
+ Frames[FrameId].height=(ContactListHeight-0-2)-sumheight;
+ }
+
+ }
+ }
+
+ Frames[FrameId].height=oldHeight;
+
+ if(Frames[FrameId].collapsed==FALSE) {
+
+ if (!Frames[FrameId].floating)
+ {
+ }
+ else
+ {
+ //SetWindowPos(Frames[FrameId].hWnd,HWND_TOP,0,0,Frames[FrameId].wndSize.right-Frames[FrameId].wndSize.left,Frames[FrameId].height,SWP_SHOWWINDOW|SWP_NOMOVE);
+ SetWindowPos(Frames[FrameId].ContainerWnd,HWND_TOP,0,0,Frames[FrameId].wndSize.right-Frames[FrameId].wndSize.left+6,Frames[FrameId].height+DEFAULT_TITLEBAR_HEIGHT+4,SWP_SHOWWINDOW|SWP_NOMOVE);
+ }
+
+
+ ulockfrm();return -1;}//redraw not needed
+ }
+ }//floating test
+ ulockfrm();
+ //CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,0);
+ if (!Frames[FrameId].floating)
+ {
+ CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,0);
+ }
+ else
+ {
+ //SetWindowPos(Frames[FrameId].hWnd,HWND_TOP,0,0,Frames[FrameId].wndSize.right-Frames[FrameId].wndSize.left,Frames[FrameId].height,SWP_SHOWWINDOW|SWP_NOMOVE);
+ RECT contwnd;
+ GetWindowRect(Frames[FrameId].ContainerWnd,&contwnd);
+ contwnd.top=contwnd.bottom-contwnd.top;//height
+ contwnd.left=contwnd.right-contwnd.left;//width
+
+ contwnd.top-=(oldHeight-Frames[FrameId].height);//newheight
+ SetWindowPos(Frames[FrameId].ContainerWnd,HWND_TOP,0,0,contwnd.left,contwnd.top,SWP_SHOWWINDOW|SWP_NOMOVE);
+ }
+ CLUIFramesStoreAllFrames();
+ return(0);
+ }
+ else
+ return -1;
+
+ ulockfrm();
+
+ return 0;
+}
+
+static int CLUIFramesLoadMainMenu()
+{
+ CLISTMENUITEM mi;
+ //TMO_MenuItem tmi;
+ int i,separator;
+
+ if (!(ServiceExists(MS_CLIST_REMOVEMAINMENUITEM)))
+ {
+ //hmm new menu system not used..so display only two items and warning message
+ ZeroMemory(&mi,sizeof(mi));
+ mi.cbSize=sizeof(mi);
+ // create "show all frames" menu
+ mi.hIcon=NULL;//LoadIcon(g_hInst,MAKEINTRESOURCE(IDI_MIRANDA));
+ mi.flags=CMIF_GRAYED;
+ mi.position=10000000;
+ mi.pszPopupName=LPGEN("Frames");
+ mi.pszName=LPGEN("New Menu System not Found...");
+ mi.pszService="";
+ CallService(MS_CLIST_ADDMAINMENUITEM,0,(LPARAM)&mi);
+
+ // create "show all frames" menu
+ mi.hIcon=NULL;//LoadIcon(g_hInst,MAKEINTRESOURCE(IDI_MIRANDA));
+ mi.flags=0;
+ mi.position=10100000;
+ mi.pszPopupName=LPGEN("Frames");
+ mi.pszName=LPGEN("Show All Frames");
+ mi.pszService=MS_CLIST_FRAMES_SHOWALLFRAMES;
+ CallService(MS_CLIST_ADDMAINMENUITEM,0,(LPARAM)&mi);
+
+ mi.hIcon=NULL;//LoadIcon(g_hInst,MAKEINTRESOURCE(IDI_HELP));
+ mi.position=10100001;
+ mi.pszPopupName=LPGEN("Frames");
+ mi.flags=CMIF_CHILDPOPUP;
+ mi.pszName=LPGEN("Show All Titlebars");
+ mi.pszService=MS_CLIST_FRAMES_SHOWALLFRAMESTB;
+ CallService(MS_CLIST_ADDMAINMENUITEM,0,(LPARAM)&mi);
+
+ return(0);
+ }
+
+
+ if(MainMIRoot!=(HANDLE)-1) { CallService(MS_CLIST_REMOVEMAINMENUITEM,(WPARAM)MainMIRoot,0); MainMIRoot=(HANDLE)-1;}
+
+ ZeroMemory(&mi,sizeof(mi));
+ mi.cbSize=sizeof(mi);
+
+ // create root menu
+ mi.hIcon=LoadIcon(g_hInst,MAKEINTRESOURCE(IDI_CLIENTMIRANDA));
+ mi.flags=CMIF_ROOTPOPUP;
+ mi.position=3000090000;
+ mi.pszPopupName=(char*)-1;
+ mi.pszName=LPGEN("Frames");
+ mi.pszService=0;
+ MainMIRoot=(HANDLE)CallService(MS_CLIST_ADDMAINMENUITEM,0,(LPARAM)&mi);
+
+ // create frames menu
+ separator=3000200000;
+ for (i=0;i<nFramescount;i++) {
+ mi.hIcon=Frames[i].TitleBar.hicon;
+ mi.flags=CMIF_CHILDPOPUP|CMIF_ROOTPOPUP|CMIF_TCHAR;
+ mi.position=separator;
+ mi.pszPopupName=(char*)MainMIRoot;
+ mi.ptszName=Frames[i].TitleBar.tbname ? Frames[i].TitleBar.tbname : Frames[i].name;
+ mi.pszService=0;
+ Frames[i].MenuHandles.MainMenuItem=(HANDLE)CallService(MS_CLIST_ADDMAINMENUITEM,0,(LPARAM)&mi);
+ CLUIFramesCreateMenuForFrame(Frames[i].id,(int)Frames[i].MenuHandles.MainMenuItem,separator,MS_CLIST_ADDMAINMENUITEM);
+ CLUIFramesModifyMainMenuItems(Frames[i].id,0);
+ //NotifyEventHooks(hPreBuildFrameMenuEvent,i,(LPARAM)Frames[i].MenuHandles.MainMenuItem);
+ CallService(MS_CLIST_FRAMEMENUNOTIFY,(WPARAM)Frames[i].id,(LPARAM)Frames[i].MenuHandles.MainMenuItem);
+ separator++;
+ }
+
+ separator+=100000;
+
+ // create "show all frames" menu
+ mi.hIcon=NULL;//LoadIcon(g_hInst,MAKEINTRESOURCE(IDI_MIRANDA));
+ mi.flags=CMIF_CHILDPOPUP;
+ mi.position=separator++;
+ mi.pszPopupName=(char*)MainMIRoot;
+ mi.pszName=LPGEN("Show All Frames");
+ mi.pszService=MS_CLIST_FRAMES_SHOWALLFRAMES;
+ CallService(MS_CLIST_ADDMAINMENUITEM,0,(LPARAM)&mi);
+
+ // create "show all titlebars" menu
+ mi.hIcon=NULL;//LoadIcon(g_hInst,MAKEINTRESOURCE(IDI_HELP));
+ mi.position=separator++;
+ mi.pszPopupName=(char*)MainMIRoot;
+ mi.flags=CMIF_CHILDPOPUP;
+ mi.pszName=LPGEN("Show All Titlebars");
+ mi.pszService=MS_CLIST_FRAMES_SHOWALLFRAMESTB;
+ CallService(MS_CLIST_ADDMAINMENUITEM,0,(LPARAM)&mi);
+
+ // create "hide all titlebars" menu
+ mi.hIcon=NULL;//LoadIcon(g_hInst,MAKEINTRESOURCE(IDI_HELP));
+ mi.position=separator++;
+ mi.pszPopupName=(char*)MainMIRoot;
+ mi.flags=CMIF_CHILDPOPUP;
+ mi.pszName=LPGEN("Hide All Titlebars");
+ mi.pszService=MS_CLIST_FRAMES_HIDEALLFRAMESTB;
+ CallService(MS_CLIST_ADDMAINMENUITEM,0,(LPARAM)&mi);
+
+ return 0;
+}
+
+static HFONT CLUILoadTitleBarFont()
+{
+ char facename[]="MS Shell Dlg";
+ HFONT hfont;
+ LOGFONT logfont;
+ memset(&logfont,0,sizeof(logfont));
+ memcpy(logfont.lfFaceName,facename,sizeof(facename));
+ logfont.lfWeight=FW_NORMAL;
+ logfont.lfHeight=-10;
+ hfont=CreateFontIndirect(&logfont);
+ return hfont;
+}
+
+static int UpdateTBToolTip(int framepos)
+{
+ {
+ TOOLINFO ti;
+
+ ZeroMemory(&ti,sizeof(ti));
+ ti.cbSize=sizeof(ti);
+ ti.lpszText=Frames[framepos].TitleBar.tooltip;
+ ti.hinst=g_hInst;
+ ti.uFlags=TTF_IDISHWND|TTF_SUBCLASS ;
+ ti.uId=(UINT_PTR)Frames[framepos].TitleBar.hwnd;
+
+ return(SendMessage(Frames[framepos].TitleBar.hwndTip,TTM_UPDATETIPTEXT,(WPARAM)0,(LPARAM)&ti));
+ }
+
+}
+
+//wparam=(CLISTFrame*)clfrm
+INT_PTR CLUIFramesAddFrame(WPARAM wParam,LPARAM lParam)
+{
+ int style,retval;
+ CLISTFrame *clfrm=(CLISTFrame *)wParam;
+
+ if(pcli->hwndContactList==0) return -1;
+ if (FramesSysNotStarted) return -1;
+ if(clfrm->cbSize!=sizeof(CLISTFrame)) return -1;
+ if(!(TitleBarFont)) TitleBarFont=CLUILoadTitleBarFont();
+
+ lockfrm();
+ if(nFramescount>=MAX_FRAMES) { ulockfrm(); return -1;}
+ Frames=(wndFrame*)realloc(Frames,sizeof(wndFrame)*(nFramescount+1));
+
+ memset(&Frames[nFramescount],0,sizeof(wndFrame));
+ Frames[nFramescount].id=NextFrameId++;
+ Frames[nFramescount].align=clfrm->align;
+ Frames[nFramescount].hWnd=clfrm->hWnd;
+ Frames[nFramescount].height=clfrm->height;
+ Frames[nFramescount].TitleBar.hicon=clfrm->hIcon;
+ Frames[nFramescount].TitleBar.BackColour;
+ Frames[nFramescount].floating=FALSE;
+
+
+ //override tbbtip
+ //clfrm->Flags|=F_SHOWTBTIP;
+ //
+ if (DBGetContactSettingByte(0,CLUIFrameModule,"RemoveAllBorders",0)==1)
+ {
+ clfrm->Flags|=F_NOBORDER;
+ }
+ Frames[nFramescount].dwFlags=clfrm->Flags;
+
+ if (clfrm->name==NULL||((clfrm->Flags&F_UNICODE) ? lstrlenW(clfrm->wname) : lstrlenA(clfrm->name))==0) {
+ Frames[nFramescount].name=(LPTSTR)malloc(255 * sizeof(TCHAR));
+ GetClassName(Frames[nFramescount].hWnd,Frames[nFramescount].name,255);
+ }
+ else
+ Frames[nFramescount].name=(clfrm->Flags&F_UNICODE) ? mir_u2t(clfrm->wname) : mir_a2t(clfrm->name);
+ if (IsBadCodePtr((FARPROC)clfrm->TBname) || clfrm->TBname==NULL
+ || ((clfrm->Flags&F_UNICODE) ? lstrlenW(clfrm->TBwname) : lstrlenA(clfrm->TBname)) == 0)
+ Frames[nFramescount].TitleBar.tbname=mir_tstrdup(Frames[nFramescount].name);
+ else
+ Frames[nFramescount].TitleBar.tbname=(clfrm->Flags&F_UNICODE) ? mir_u2t(clfrm->TBwname) : mir_a2t(clfrm->TBname);
+ Frames[nFramescount].needhide=FALSE;
+ Frames[nFramescount].TitleBar.ShowTitleBar=(clfrm->Flags&F_SHOWTB?TRUE:FALSE);
+ Frames[nFramescount].TitleBar.ShowTitleBarTip=(clfrm->Flags&F_SHOWTBTIP?TRUE:FALSE);
+
+ Frames[nFramescount].collapsed = clfrm->Flags&F_UNCOLLAPSED?FALSE:TRUE;
+ Frames[nFramescount].Locked = clfrm->Flags&F_LOCKED?TRUE:FALSE;
+ Frames[nFramescount].visible = clfrm->Flags&F_VISIBLE?TRUE:FALSE;
+
+ Frames[nFramescount].UseBorder=(clfrm->Flags&F_NOBORDER)?FALSE:TRUE;
+
+
+ // create frame
+ Frames[nFramescount].TitleBar.hwnd
+ =CreateWindow(CLUIFrameTitleBarClassName,Frames[nFramescount].name,
+ (DBGetContactSettingByte(0,CLUIFrameModule,"RemoveAllTitleBarBorders",0)?0:WS_BORDER)
+
+ |WS_CHILD|WS_CLIPCHILDREN|
+ (Frames[nFramescount].TitleBar.ShowTitleBar?WS_VISIBLE:0)|
+ WS_CLIPCHILDREN,
+ 0,0,0,0,pcli->hwndContactList,NULL,g_hInst,NULL);
+ SetWindowLongPtr(Frames[nFramescount].TitleBar.hwnd,GWLP_USERDATA,Frames[nFramescount].id);
+
+ Frames[nFramescount].TitleBar.hwndTip
+ =CreateWindowEx(0, TOOLTIPS_CLASS, NULL,
+ WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP,
+ CW_USEDEFAULT, CW_USEDEFAULT,
+ CW_USEDEFAULT, CW_USEDEFAULT,
+ pcli->hwndContactList, NULL, g_hInst,
+ NULL);
+
+SetWindowPos(Frames[nFramescount].TitleBar.hwndTip, HWND_TOPMOST,0, 0, 0, 0,
+ SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
+ {
+ TOOLINFOA ti;
+ int res;
+
+ ZeroMemory(&ti,sizeof(ti));
+ ti.cbSize=sizeof(ti);
+ ti.lpszText="";
+ ti.hinst=g_hInst;
+ ti.uFlags=TTF_IDISHWND|TTF_SUBCLASS ;
+ ti.uId=(UINT_PTR)Frames[nFramescount].TitleBar.hwnd;
+ res=SendMessage(Frames[nFramescount].TitleBar.hwndTip,TTM_ADDTOOL,(WPARAM)0,(LPARAM)&ti);
+ }
+
+SendMessage(Frames[nFramescount].TitleBar.hwndTip,TTM_ACTIVATE,(WPARAM)Frames[nFramescount].TitleBar.ShowTitleBarTip,0);
+
+ Frames[nFramescount].oldstyles=GetWindowLong(Frames[nFramescount].hWnd,GWL_STYLE);
+ Frames[nFramescount].TitleBar.oldstyles=GetWindowLong(Frames[nFramescount].TitleBar.hwnd,GWL_STYLE);
+ //Frames[nFramescount].FloatingPos.x=
+
+ retval=Frames[nFramescount].id;
+ Frames[nFramescount].order=nFramescount+1;
+ nFramescount++;
+
+ CLUIFramesLoadFrameSettings(id2pos(retval));
+ style=GetWindowLong(Frames[nFramescount-1].hWnd,GWL_STYLE);
+ style&=(~WS_BORDER);
+ style|=((Frames[nFramescount-1].UseBorder)?WS_BORDER:0);
+ SetWindowLong(Frames[nFramescount-1].hWnd,GWL_STYLE,style);
+
+
+ if (Frames[nFramescount-1].order==0){Frames[nFramescount-1].order=nFramescount;}
+ ulockfrm();
+
+
+ alclientFrame=-1;//recalc it
+ CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,0);
+
+ if (Frames[nFramescount-1].floating)
+ {
+
+ Frames[nFramescount-1].floating=FALSE;
+ //SetWindowPos(Frames[nFramescount-1].hw
+ CLUIFrameSetFloat(retval,1);//lparam=1 use stored width and height
+ }
+
+ return retval;
+}
+
+static INT_PTR CLUIFramesRemoveFrame(WPARAM wParam,LPARAM lParam)
+{
+ int pos;
+ if (FramesSysNotStarted) return -1;
+ lockfrm();
+ pos=id2pos(wParam);
+
+ if (pos<0||pos>nFramescount){ulockfrm();return(-1);}
+
+ mir_free(Frames[pos].name);
+ mir_free(Frames[pos].TitleBar.tbname);
+ mir_free(Frames[pos].TitleBar.tooltip);
+
+ DestroyWindow(Frames[pos].hWnd);
+ Frames[pos].hWnd=(HWND)-1;
+ DestroyWindow(Frames[pos].TitleBar.hwnd);
+ Frames[pos].TitleBar.hwnd=(HWND)-1;
+ DestroyWindow(Frames[pos].ContainerWnd);
+ Frames[pos].ContainerWnd=(HWND)-1;
+ DestroyMenu(Frames[pos].TitleBar.hmenu);
+
+ RemoveItemFromList(pos,&Frames,&nFramescount);
+
+ ulockfrm();
+ InvalidateRect(pcli->hwndContactList,NULL,TRUE);
+ CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,0);
+ InvalidateRect(pcli->hwndContactList,NULL,TRUE);
+
+ return(0);
+}
+
+
+int CLUIFramesForceUpdateTB(const wndFrame *Frame)
+{
+ if (Frame->TitleBar.hwnd!=0) RedrawWindow(Frame->TitleBar.hwnd,NULL,NULL,RDW_ALLCHILDREN|RDW_UPDATENOW|RDW_ERASE|RDW_INVALIDATE|RDW_FRAME);
+ //UpdateWindow(Frame->TitleBar.hwnd);
+ return 0;
+}
+
+int CLUIFramesForceUpdateFrame(const wndFrame *Frame)
+{
+
+ if (Frame->hWnd!=0)
+ {
+ RedrawWindow(Frame->hWnd,NULL,NULL,RDW_UPDATENOW|RDW_FRAME|RDW_ERASE|RDW_INVALIDATE);
+ UpdateWindow(Frame->hWnd);
+ }
+ if(Frame->floating)
+ {
+ if (Frame->ContainerWnd!=0) RedrawWindow(Frame->ContainerWnd,NULL,NULL,RDW_UPDATENOW|RDW_ALLCHILDREN|RDW_ERASE|RDW_INVALIDATE|RDW_FRAME);
+ //UpdateWindow(Frame->ContainerWnd);
+ }
+ return 0;
+}
+
+int CLUIFrameMoveResize(const wndFrame *Frame)
+{
+ //int b;
+ // we need to show or hide the frame?
+ if(Frame->visible&&(!Frame->needhide)) {
+ ShowWindow(Frame->hWnd,SW_SHOW);
+ ShowWindow(Frame->TitleBar.hwnd,Frame->TitleBar.ShowTitleBar==TRUE?SW_SHOW:SW_HIDE);
+ }
+ else {
+ ShowWindow(Frame->hWnd,SW_HIDE);
+ ShowWindow(Frame->TitleBar.hwnd,SW_HIDE);
+ return(0);
+ }
+
+ // set frame position
+ SetWindowPos(Frame->hWnd,NULL,Frame->wndSize.left,Frame->wndSize.top,
+ Frame->wndSize.right-Frame->wndSize.left,
+ Frame->wndSize.bottom-Frame->wndSize.top,SWP_NOZORDER|SWP_NOREDRAW);
+ // set titlebar position
+ if(Frame->TitleBar.ShowTitleBar) {
+ SetWindowPos(Frame->TitleBar.hwnd,NULL,Frame->wndSize.left,Frame->wndSize.top-TitleBarH-GapBetweenTitlebar,
+ Frame->wndSize.right-Frame->wndSize.left,
+ TitleBarH,SWP_NOZORDER|SWP_NOREDRAW );
+ }
+// Sleep(0);
+ return 0;
+}
+
+BOOLEAN CLUIFramesFitInSize(void)
+{
+ int i;
+ int sumheight=0;
+ int tbh=0; // title bar height
+ int clientfrm;
+
+ clientfrm=CLUIFramesGetalClientFrame();
+ if(clientfrm!=-1)
+ tbh=TitleBarH*btoint(Frames[clientfrm].TitleBar.ShowTitleBar);
+
+ for(i=0;i<nFramescount;i++) {
+ if((Frames[i].align!=alClient)&&(!Frames[i].floating)&&(Frames[i].visible)&&(!Frames[i].needhide)) {
+ sumheight+=(Frames[i].height)+(TitleBarH*btoint(Frames[i].TitleBar.ShowTitleBar))+2;
+ if(sumheight>ContactListHeight-tbh-2)
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+
+int CLUIFramesGetMinHeight()
+{
+ int i,tbh,clientfrm,sumheight=0;
+ RECT border;
+ int allbord=0;
+ if(pcli->hwndContactList==NULL) return 0;
+ lockfrm();
+
+ // search for alClient frame and get the titlebar's height
+ tbh=0;
+ clientfrm=CLUIFramesGetalClientFrame();
+ if(clientfrm!=-1)
+ tbh=TitleBarH*btoint(Frames[clientfrm].TitleBar.ShowTitleBar);
+
+ for(i=0;i<nFramescount;i++)
+ {
+ if((Frames[i].align!=alClient)&&(Frames[i].visible)&&(!Frames[i].needhide)&&(!Frames[i].floating))
+ {
+ RECT wsize;
+
+ GetWindowRect(Frames[i].hWnd,&wsize);
+ sumheight+=(wsize.bottom-wsize.top)+(TitleBarH*btoint(Frames[i].TitleBar.ShowTitleBar))+3;
+ }
+ }
+ ulockfrm();
+ GetBorderSize(pcli->hwndContactList,&border);
+
+ //GetWindowRect(pcli->hwndContactList,&winrect);
+ //GetClientRect(pcli->hwndContactList,&clirect);
+// clirect.bottom-=clirect.top;
+// clirect.bottom+=border.top+border.bottom;
+ //allbord=(winrect.bottom-winrect.top)-(clirect.bottom-clirect.top);
+ return (sumheight+border.top+border.bottom+allbord+tbh+3);
+}
+
+
+int CLUIFramesResize(const RECT newsize)
+{
+ int sumheight=9999999,newheight;
+ int prevframe,prevframebottomline;
+ int tbh,curfrmtbh;
+ int drawitems;
+ int clientfrm;
+ int i,j;
+ int sepw=GapBetweenFrames;
+ SortData *sdarray;
+
+
+ GapBetweenTitlebar=(int)DBGetContactSettingDword(NULL,"CLUIFrames","GapBetweenTitleBar",1);
+ GapBetweenFrames=DBGetContactSettingDword(NULL,"CLUIFrames","GapBetweenFrames",1);
+ TitleBarH=DBGetContactSettingDword(NULL,"CLUIFrames","TitleBarH",DEFAULT_TITLEBAR_HEIGHT);
+
+ sepw=GapBetweenFrames;
+
+ if(nFramescount<1) return 0;
+
+
+ newheight=newsize.bottom-newsize.top;
+
+
+
+ // search for alClient frame and get the titlebar's height
+ tbh=0;
+ clientfrm=CLUIFramesGetalClientFrame();
+ if(clientfrm!=-1)
+ tbh=(TitleBarH+GapBetweenTitlebar)*btoint(Frames[clientfrm].TitleBar.ShowTitleBar);
+
+ for(i=0;i<nFramescount;i++)
+ {
+ if (!Frames[i].floating)
+ {
+ Frames[i].needhide=FALSE;
+ Frames[i].wndSize.left=0;
+ Frames[i].wndSize.right=newsize.right-0;
+ }
+ }
+ {
+ //sorting stuff
+ sdarray=(SortData*)malloc(sizeof(SortData)*nFramescount);
+ if (sdarray==NULL){return(-1);}
+ for(i=0;i<nFramescount;i++)
+ { sdarray[i].order=Frames[i].order;
+ sdarray[i].realpos=i;
+ }
+ qsort(sdarray,nFramescount,sizeof(SortData),sortfunc);
+
+ }
+
+ drawitems=nFramescount;
+
+ while(sumheight>(newheight-tbh)&&drawitems>0) {
+ sumheight=0;
+ drawitems=0;
+ for(i=0;i<nFramescount;i++) {
+ if(((Frames[i].align!=alClient))&&(!Frames[i].floating)&&(Frames[i].visible)&&(!Frames[i].needhide)) {
+ drawitems++;
+ curfrmtbh=(TitleBarH+GapBetweenTitlebar)*btoint(Frames[i].TitleBar.ShowTitleBar);
+ sumheight+=(Frames[i].height)+curfrmtbh+sepw+(Frames[i].UseBorder?2:0);
+ if(sumheight>newheight-tbh) {
+ sumheight-=(Frames[i].height)+curfrmtbh+sepw;
+ Frames[i].needhide=TRUE;
+ drawitems--;
+ break;
+ }
+ }
+ }
+ }
+
+ prevframe=-1;
+ prevframebottomline=0;
+ for(j=0;j<nFramescount;j++) {
+ //move all alTop frames
+ i=sdarray[j].realpos;
+ if((!Frames[i].needhide)&&(!Frames[i].floating)&&(Frames[i].visible)&&(Frames[i].align==alTop)) {
+ curfrmtbh=(TitleBarH+GapBetweenTitlebar)*btoint(Frames[i].TitleBar.ShowTitleBar);
+ Frames[i].wndSize.top=prevframebottomline+sepw+(curfrmtbh);
+ Frames[i].wndSize.bottom=Frames[i].height+Frames[i].wndSize.top+(Frames[i].UseBorder?2:0);
+ Frames[i].prevvisframe=prevframe;
+ prevframe=i;
+ prevframebottomline=Frames[i].wndSize.bottom;
+ if(prevframebottomline>newheight){
+ //prevframebottomline-=Frames[i].height+(curfrmtbh+1);
+ //Frames[i].needhide=TRUE;
+ }
+ }
+ }
+
+ if(sumheight<newheight) {
+ for(j=0;j<nFramescount;j++) {
+ //move alClient frame
+ i=sdarray[j].realpos;
+ if((!Frames[i].needhide)&&(!Frames[i].floating)&&(Frames[i].visible)&&(Frames[i].align==alClient)) {
+ int oldh;
+ Frames[i].wndSize.top=prevframebottomline+sepw+(tbh);
+ Frames[i].wndSize.bottom=Frames[i].wndSize.top+newheight-sumheight-tbh-sepw;
+
+ oldh=Frames[i].height;
+ Frames[i].height=Frames[i].wndSize.bottom-Frames[i].wndSize.top;
+ Frames[i].prevvisframe=prevframe;
+ prevframe=i;
+ prevframebottomline=Frames[i].wndSize.bottom;
+ if(prevframebottomline>newheight) {
+ //prevframebottomline-=Frames[i].height+(tbh+1);
+ //Frames[i].needhide=TRUE;
+ }
+ break;
+ }
+ }
+ }
+
+ //newheight
+ prevframebottomline=newheight+sepw;
+ //prevframe=-1;
+ for(j=nFramescount-1;j>=0;j--) {
+ //move all alBottom frames
+ i=sdarray[j].realpos;
+ if((Frames[i].visible)&&(!Frames[i].floating)&&(!Frames[i].needhide)&&(Frames[i].align==alBottom)) {
+ curfrmtbh=(TitleBarH+GapBetweenTitlebar)*btoint(Frames[i].TitleBar.ShowTitleBar);
+
+ Frames[i].wndSize.bottom=prevframebottomline-sepw;
+ Frames[i].wndSize.top=Frames[i].wndSize.bottom-Frames[i].height-(Frames[i].UseBorder?2:0);
+ Frames[i].prevvisframe=prevframe;
+ prevframe=i;
+ prevframebottomline=Frames[i].wndSize.top/*-1*/-curfrmtbh;
+ if(prevframebottomline>newheight) {
+
+ }
+ }
+ }
+
+ if (sdarray!=NULL){free(sdarray);sdarray=NULL;}
+
+ for(i=0;i<nFramescount;i++){
+
+ if (Frames[i].floating){
+ CLUIFrameResizeFloatingFrame(i);
+ }else
+ {
+ CLUIFrameMoveResize(&Frames[i]);
+ }
+
+ }
+ return 0;
+}
+
+INT_PTR CLUIFramesUpdateFrame(WPARAM wParam,LPARAM lParam)
+{
+ if (FramesSysNotStarted) return -1;
+ if(wParam==-1) { CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,(LPARAM)0); return 0;}
+ if(lParam&FU_FMPOS) CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,1);
+ lockfrm();
+ wParam=id2pos(wParam);
+ if(wParam<0||(int)wParam>=nFramescount) { ulockfrm(); return -1;}
+ if(lParam&FU_TBREDRAW) CLUIFramesForceUpdateTB(&Frames[wParam]);
+ if(lParam&FU_FMREDRAW) CLUIFramesForceUpdateFrame(&Frames[wParam]);
+ //if (){}
+ ulockfrm();
+
+ return 0;
+}
+
+int CLUIFramesOnClistResize(WPARAM wParam,LPARAM lParam)
+{
+ RECT nRect,rcStatus;
+ int tick,i;
+
+ if (FramesSysNotStarted) return -1;
+ lockfrm();
+ //if (resizing){return(0);}
+ //resizing=TRUE;
+ GetClientRect(pcli->hwndContactList,&nRect);
+
+ //if(DBGetContactSettingByte(NULL,"CLUI","ShowSBar",1)) GetWindowRect(pcli->hwndStatus,&rcStatus);
+ //else rcStatus.top=rcStatus.bottom=0;
+ rcStatus.top=rcStatus.bottom=0;
+
+
+ nRect.bottom-=nRect.top;
+ nRect.bottom-=(rcStatus.bottom-rcStatus.top);
+ nRect.right-=nRect.left;
+ nRect.left=0;
+ nRect.top=0;
+ ContactListHeight=nRect.bottom;
+
+ tick=GetTickCount();
+
+
+ CLUIFramesResize(nRect);
+
+ for (i=0;i<nFramescount;i++)
+ {
+ CLUIFramesForceUpdateFrame(&Frames[i]);
+ CLUIFramesForceUpdateTB(&Frames[i]);
+
+ }
+
+ //resizing=FALSE;
+ ulockfrm();
+ tick=GetTickCount()-tick;
+
+ if (pcli->hwndContactList!=0) InvalidateRect(pcli->hwndContactList,NULL,TRUE);
+ if (pcli->hwndContactList!=0) UpdateWindow(pcli->hwndContactList);
+
+ //if(lParam==2) RedrawWindow(pcli->hwndContactList,NULL,NULL,RDW_UPDATENOW|RDW_ALLCHILDREN|RDW_ERASE|RDW_INVALIDATE);
+
+
+ Sleep(0);
+
+ //dont save to database too many times
+ if(GetTickCount()-LastStoreTick>1000){ CLUIFramesStoreAllFrames();LastStoreTick=GetTickCount();}
+
+ return 0;
+}
+
+static HBITMAP hBmpBackground;
+static int backgroundBmpUse;
+static COLORREF bkColour;
+static COLORREF SelBkColour;
+boolean AlignCOLLIconToLeft; //will hide frame icon
+
+int OnFrameTitleBarBackgroundChange()
+{
+ DBVARIANT dbv;
+
+ AlignCOLLIconToLeft=DBGetContactSettingByte(NULL,"FrameTitleBar","AlignCOLLIconToLeft",0);
+
+ bkColour=DBGetContactSettingDword(NULL,"FrameTitleBar","BkColour",CLCDEFAULT_BKCOLOUR);
+ //SelBkColour=DBGetContactSettingDword(NULL,"FrameTitleBar","SelBkColour",0);
+
+ if(hBmpBackground) {DeleteObject(hBmpBackground); hBmpBackground=NULL;}
+ if(DBGetContactSettingByte(NULL,"FrameTitleBar","UseBitmap",CLCDEFAULT_USEBITMAP)) {
+ if(!DBGetContactSetting(NULL,"FrameTitleBar","BkBitmap",&dbv)) {
+ hBmpBackground=(HBITMAP)CallService(MS_UTILS_LOADBITMAP,0,(LPARAM)dbv.pszVal);
+ mir_free(dbv.pszVal);
+ }
+ }
+ backgroundBmpUse=DBGetContactSettingWord(NULL,"FrameTitleBar","BkBmpUse",CLCDEFAULT_BKBMPUSE);
+
+ CLUIFramesOnClistResize(0,0);
+ return 0;
+}
+
+void DrawBackGroundTTB(HWND hwnd,HDC mhdc)
+{
+ HDC hdcMem,hdc;
+ RECT clRect,*rcPaint;
+
+ int yScroll=0;
+ int y;
+ PAINTSTRUCT paintst={0};
+ HBITMAP hBmpOsb,hOldBmp;
+ DWORD style=GetWindowLong(hwnd,GWL_STYLE);
+ int grey=0;
+ HFONT oFont;
+ HBRUSH hBrushAlternateGrey=NULL;
+
+ HFONT hFont;
+
+ //InvalidateRect(hwnd,0,FALSE);
+
+ hFont=(HFONT)SendMessage(hwnd,WM_GETFONT,0,0);
+
+ if (mhdc)
+ {
+ hdc=mhdc;
+ rcPaint=NULL;
+ }else
+ {
+ hdc=BeginPaint(hwnd,&paintst);
+ rcPaint=&(paintst.rcPaint);
+ }
+
+ GetClientRect(hwnd,&clRect);
+ if(rcPaint==NULL) rcPaint=&clRect;
+ if (rcPaint->right-rcPaint->left==0||rcPaint->top-rcPaint->bottom==0) rcPaint=&clRect;
+ y=-yScroll;
+ hdcMem=CreateCompatibleDC(hdc);
+ hBmpOsb=CreateBitmap(clRect.right,clRect.bottom,1,GetDeviceCaps(hdc,BITSPIXEL),NULL);
+ hOldBmp=SelectObject(hdcMem,hBmpOsb);
+ oFont=SelectObject(hdcMem,hFont);
+ SetBkMode(hdcMem,TRANSPARENT);
+ { HBRUSH hBrush,hoBrush;
+
+ hBrush=CreateSolidBrush(bkColour);
+ hoBrush=(HBRUSH)SelectObject(hdcMem,hBrush);
+ FillRect(hdcMem,rcPaint,hBrush);
+ SelectObject(hdcMem,hoBrush);
+ DeleteObject(hBrush);
+ if(hBmpBackground) {
+ BITMAP bmp;
+ HDC hdcBmp;
+ int x,y;
+ int maxx,maxy;
+ int destw,desth;
+
+ GetObject(hBmpBackground,sizeof(bmp),&bmp);
+ hdcBmp=CreateCompatibleDC(hdcMem);
+ SelectObject(hdcBmp,hBmpBackground);
+ y=backgroundBmpUse&CLBF_SCROLL?-yScroll:0;
+ maxx=backgroundBmpUse&CLBF_TILEH?clRect.right:1;
+ maxy=backgroundBmpUse&CLBF_TILEV?maxy=rcPaint->bottom:y+1;
+ switch(backgroundBmpUse&CLBM_TYPE) {
+ case CLB_STRETCH:
+ if(backgroundBmpUse&CLBF_PROPORTIONAL) {
+ if(clRect.right*bmp.bmHeight<clRect.bottom*bmp.bmWidth) {
+ desth=clRect.bottom;
+ destw=desth*bmp.bmWidth/bmp.bmHeight;
+ }
+ else {
+ destw=clRect.right;
+ desth=destw*bmp.bmHeight/bmp.bmWidth;
+ }
+ }
+ else {
+ destw=clRect.right;
+ desth=clRect.bottom;
+ }
+ break;
+ case CLB_STRETCHH:
+ if(backgroundBmpUse&CLBF_PROPORTIONAL) {
+ destw=clRect.right;
+ desth=destw*bmp.bmHeight/bmp.bmWidth;
+ }
+ else {
+ destw=clRect.right;
+ desth=bmp.bmHeight;
+ }
+ break;
+ case CLB_STRETCHV:
+ if(backgroundBmpUse&CLBF_PROPORTIONAL) {
+ desth=clRect.bottom;
+ destw=desth*bmp.bmWidth/bmp.bmHeight;
+ }
+ else {
+ destw=bmp.bmWidth;
+ desth=clRect.bottom;
+ }
+ break;
+ default: //clb_topleft
+ destw=bmp.bmWidth;
+ desth=bmp.bmHeight;
+ break;
+ }
+ desth=clRect.bottom -clRect.top;
+ for(;y<maxy;y+=desth) {
+ if(y<rcPaint->top-desth) continue;
+ for(x=0;x<maxx;x+=destw)
+ StretchBlt(hdcMem,x,y,destw,desth,hdcBmp,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);
+ }
+ DeleteDC(hdcBmp);
+ }
+ }
+
+ {
+
+ BitBlt(hdc,rcPaint->left,rcPaint->top,rcPaint->right-rcPaint->left,rcPaint->bottom-rcPaint->top,hdcMem,rcPaint->left,rcPaint->top,SRCCOPY);
+
+ SelectObject(hdcMem,hOldBmp);
+ SelectObject(hdcMem,oFont);
+ DeleteObject(hBmpOsb);
+ DeleteDC(hdcMem);
+ paintst.fErase=FALSE;
+ //DeleteObject(hFont);
+ if (!mhdc)
+ {
+ EndPaint(hwnd,&paintst);
+ }
+ }
+}
+
+
+static int DrawTitleBar(HDC dc,RECT rect,int Frameid)
+{
+ HDC hdcMem;
+ HBITMAP hBmpOsb,hoBmp;
+ HBRUSH hBack,hoBrush;
+ HDC paintDC;
+ int pos;
+ HFONT hoTTBFont;
+
+
+ //GetClientRect(hwnd,&rect);
+ paintDC=dc;
+
+// paintDC = BeginPaint(hwnd, &paintStruct);
+ //rect=paintStruct.rcPaint;
+
+
+ hdcMem=CreateCompatibleDC(paintDC);
+ hBmpOsb=CreateBitmap(rect.right,rect.bottom,1,GetDeviceCaps(paintDC,BITSPIXEL),NULL);
+ hoBmp=SelectObject(hdcMem,hBmpOsb);
+
+ hoTTBFont=SelectObject(hdcMem,TitleBarFont);
+ SetBkMode(hdcMem,TRANSPARENT);
+
+ hBack=GetSysColorBrush(COLOR_3DFACE);
+ hoBrush=SelectObject(hdcMem,hBack);
+
+ //FillRect(hdcMem,&rect,hBack);
+
+
+ lockfrm();
+ pos=id2pos(Frameid);
+
+ if (pos>=0&&pos<nFramescount)
+ {
+
+ GetClientRect(Frames[pos].TitleBar.hwnd,&Frames[pos].TitleBar.wndSize);
+ {
+ //set font charset
+ HFONT oFont;
+ HFONT hf=GetStockObject(DEFAULT_GUI_FONT);
+
+ if (TitleBarLogFont.lfHeight!=0)
+ {
+ hf=CreateFontIndirectA(&TitleBarLogFont);
+ }
+
+ oFont=SelectObject(hdcMem,hf);
+
+ DrawBackGroundTTB(Frames[pos].TitleBar.hwnd,hdcMem);
+ //hFront=CreateSolidPe (SelBkColour);
+ //SelectObject(hdcMem,hFront);
+ SelBkColour=DBGetContactSettingDword(NULL,"CLUIFrames","FramesTitleBarFontCol",0);
+ if (SelBkColour) SetTextColor(hdcMem,SelBkColour);
+
+
+ if (!AlignCOLLIconToLeft)
+ {
+
+ if(Frames[pos].TitleBar.hicon!=NULL) {
+ //(TitleBarH>>1)-(GetSystemMetrics(SM_CXSMICON)>>1)
+ DrawIconEx(hdcMem,2,((TitleBarH>>1)-(GetSystemMetrics(SM_CYSMICON)>>1)),Frames[pos].TitleBar.hicon,GetSystemMetrics(SM_CXSMICON),GetSystemMetrics(SM_CYSMICON),0,NULL,DI_NORMAL);
+ TextOut(hdcMem,GetSystemMetrics(SM_CYSMICON)+4,0,Frames[pos].TitleBar.tbname,lstrlen(Frames[pos].TitleBar.tbname));
+ }
+ else
+ TextOut(hdcMem,2,0,Frames[pos].TitleBar.tbname,lstrlen(Frames[pos].TitleBar.tbname));
+
+ }else
+ {
+ TextOut(hdcMem,GetSystemMetrics(SM_CXSMICON)+2,0,Frames[pos].TitleBar.tbname,lstrlen(Frames[pos].TitleBar.tbname));
+ }
+
+
+ if (!AlignCOLLIconToLeft)
+ {
+ DrawIconEx(hdcMem,Frames[pos].TitleBar.wndSize.right-GetSystemMetrics(SM_CXSMICON)-2,((TitleBarH>>1)-(GetSystemMetrics(SM_CXSMICON)>>1)),Frames[pos].collapsed?LoadSkinnedIcon(SKINICON_OTHER_GROUPOPEN):LoadSkinnedIcon(SKINICON_OTHER_GROUPSHUT),GetSystemMetrics(SM_CXSMICON),GetSystemMetrics(SM_CYSMICON),0,NULL,DI_NORMAL);
+ }
+ else
+ {
+ DrawIconEx(hdcMem,0,((TitleBarH>>1)-(GetSystemMetrics(SM_CXSMICON)>>1)),Frames[pos].collapsed?LoadSkinnedIcon(SKINICON_OTHER_GROUPOPEN):LoadSkinnedIcon(SKINICON_OTHER_GROUPSHUT),GetSystemMetrics(SM_CXSMICON),GetSystemMetrics(SM_CYSMICON),0,NULL,DI_NORMAL);
+ }
+
+ DeleteObject(hf);
+ SelectObject(hdcMem,oFont);
+ //DeleteObject(hFront);
+ }
+ }
+ ulockfrm();
+
+ BitBlt(paintDC,rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top,hdcMem,rect.left,rect.top,SRCCOPY);
+
+ SelectObject(hdcMem,hoBmp);
+ SelectObject(hdcMem,hoBrush);
+ SelectObject(hdcMem,hoTTBFont);
+ DeleteDC(hdcMem);
+ DeleteObject(hBack);
+ DeleteObject(hBmpOsb);
+ //EndPaint(hwnd, &paintStruct);
+ return 0;
+
+}
+
+//for old multiwindow
+#define MPCF_CONTEXTFRAMEMENU 3
+POINT ptOld;
+short nLeft = 0;
+short nTop = 0;
+
+LRESULT CALLBACK CLUIFrameTitleBarProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ RECT rect;
+ int Frameid,Framemod,direction;
+ int xpos,ypos;
+
+ Frameid=(GetWindowLongPtr(hwnd,GWLP_USERDATA));
+ memset(&rect,0,sizeof(rect));
+
+
+ switch(msg)
+ {
+ case WM_CREATE:
+ SendMessage(hwnd,WM_SETFONT,(WPARAM)TitleBarFont,0);
+ return FALSE;
+ case WM_MEASUREITEM:
+ return CallService(MS_CLIST_MENUMEASUREITEM,wParam,lParam);
+ case WM_DRAWITEM:
+ return CallService(MS_CLIST_MENUDRAWITEM,wParam,lParam);
+
+ case WM_ENABLE:
+ if (hwnd!=0) InvalidateRect(hwnd,NULL,FALSE);
+ return 0;
+ /*
+ case WM_PRINT:
+ case WM_PRINTCLIENT:
+ InvalidateRect(hwnd,NULL,FALSE);
+ {
+ RECT rect;
+ HDC dc;
+ GetClientRect(hwnd,&rect);
+ //DrawTitleBar(wParam,rect,Frameid);
+ SendMessage(hwnd,WM_PAINT,0,0);
+ SendMessage(hwnd,WM_NCPAINT,1,0);
+ dc=GetDC(hwnd);
+ SendMessage(hwnd,WM_ERASEBKGND,dc,0);
+ ReleaseDC(hwnd,dc);
+ SendMessage(hwnd,WM_PAINT,0,0);
+// UpdateWindow(hwnd);
+ return(0);
+ }
+ */
+ /*
+ case WM_NCPAINT:
+ {
+
+ // if(wParam==1) break;
+ { POINT ptTopLeft={0,0}
+ HRGN hClientRgn;
+ ClientToScreen(hwnd,&ptTopLeft);
+ hClientRgn=CreateRectRgn(0,0,1,1);
+ CombineRgn(hClientRgn,(HRGN)wParam,NULL,RGN_COPY);
+ OffsetRgn(hClientRgn,-ptTopLeft.x,-ptTopLeft.y);
+ InvalidateRgn(hwnd,hClientRgn,FALSE);
+ DeleteObject(hClientRgn);
+ UpdateWindow(hwnd);
+ }
+ //return(0);
+ }
+ */
+
+
+ case WM_COMMAND:
+
+
+ if (ServiceExists(MO_CREATENEWMENUOBJECT))
+ {
+ //if ( CallService(MS_CLIST_MENUPROCESSCOMMAND,MAKEWPARAM(LOWORD(wParam),0),(LPARAM)Frameid) ){break;}
+ if (ProcessCommandProxy(MAKEWPARAM(LOWORD(wParam),0),(LPARAM)Frameid) ) break;
+ }else
+ {
+ if ( CallService(MS_CLIST_MENUPROCESSCOMMAND,MAKEWPARAM(LOWORD(wParam),MPCF_CONTEXTFRAMEMENU),(LPARAM)Frameid) ){break;}
+
+ }
+
+
+ if(HIWORD(wParam)==0) {//mouse events for self created menu
+ int framepos=id2pos(Frameid);
+ if (framepos==-1){break;}
+
+ switch(LOWORD(wParam))
+ {
+ case frame_menu_lock:
+ Frames[framepos].Locked=!Frames[framepos].Locked;
+ break;
+ case frame_menu_visible:
+ Frames[framepos].visible=!Frames[framepos].visible;
+ break;
+ case frame_menu_showtitlebar:
+ Frames[framepos].TitleBar.ShowTitleBar=!Frames[framepos].TitleBar.ShowTitleBar;
+ break;
+ case frame_menu_floating:
+ CLUIFrameSetFloat(Frameid,0);
+ break;
+ }
+ CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,(LPARAM)0);
+ }
+
+ break;
+ case WM_RBUTTONDOWN:
+ {
+ HMENU hmenu;
+ POINT pt;
+ GetCursorPos(&pt);
+
+ if (ServiceExists(MS_CLIST_MENUBUILDFRAMECONTEXT))
+ {
+ hmenu=(HMENU)CallService(MS_CLIST_MENUBUILDFRAMECONTEXT,Frameid,0);
+ }
+ else
+ {//legacy menu support
+ int framepos=id2pos(Frameid);
+ lockfrm();
+ if (framepos==-1){ulockfrm();break;}
+ hmenu=CreatePopupMenu();
+// Frames[Frameid].TitleBar.hmenu=hmenu;
+ AppendMenu(hmenu,MF_STRING|MF_DISABLED|MF_GRAYED,15,Frames[framepos].name);
+ AppendMenu(hmenu,MF_SEPARATOR,16,_T(""));
+
+ if (Frames[framepos].Locked)
+ {AppendMenu(hmenu,MF_STRING|MF_CHECKED,frame_menu_lock,TranslateT("Lock Frame"));}
+ else{AppendMenu(hmenu,MF_STRING,frame_menu_lock,TranslateT("Lock Frame"));}
+
+ if (Frames[framepos].visible)
+ {AppendMenu(hmenu,MF_STRING|MF_CHECKED,frame_menu_visible,TranslateT("Visible"));}
+ else{AppendMenu(hmenu,MF_STRING,frame_menu_visible,TranslateT("Visible") );}
+
+ if (Frames[framepos].TitleBar.ShowTitleBar)
+ {AppendMenu(hmenu,MF_STRING|MF_CHECKED,frame_menu_showtitlebar,TranslateT("Show TitleBar") );}
+ else{AppendMenu(hmenu,MF_STRING,frame_menu_showtitlebar,TranslateT("Show TitleBar") );}
+
+ if (Frames[framepos].floating)
+ {AppendMenu(hmenu,MF_STRING|MF_CHECKED,frame_menu_floating,TranslateT("Floating") );}
+ else{AppendMenu(hmenu,MF_STRING,frame_menu_floating,TranslateT("Floating") );}
+
+ //err=GetMenuItemCount(hmenu)
+ ulockfrm();
+ }
+
+ TrackPopupMenu(hmenu,TPM_LEFTALIGN,pt.x,pt.y,0,hwnd,0);
+ DestroyMenu(hmenu);
+ }
+ break;
+ case WM_LBUTTONDBLCLK:
+ {
+ Framemod=-1;
+ lbypos=-1;oldframeheight=-1;ReleaseCapture();
+ CallService(MS_CLIST_FRAMES_UCOLLFRAME,Frameid,0);
+ lbypos=-1;oldframeheight=-1;ReleaseCapture();
+ }
+ break;
+
+ case WM_LBUTTONUP:
+ {
+ if(GetCapture()!=hwnd){break;}
+ curdragbar=-1;lbypos=-1;oldframeheight=-1;ReleaseCapture();
+ break;
+ }
+ case WM_LBUTTONDOWN:
+ {
+
+ int framepos=id2pos(Frameid);
+ lockfrm();
+ if (framepos==-1){ulockfrm();break;}
+ {
+ if (Frames[framepos].floating)
+ {
+
+ POINT pt;
+ GetCursorPos(&pt);
+ Frames[framepos].TitleBar.oldpos=pt;
+ }
+ }
+
+ //ScreenToClient(Frames[framepos].ContainerWnd,&Frames[framepos].TitleBar.oldpos);
+
+ if ((!(wParam&MK_CONTROL))&&Frames[framepos].Locked&&(!(Frames[framepos].floating)))
+ {
+ if (DBGetContactSettingByte(NULL,"CLUI","ClientAreaDrag",0)) {
+ POINT pt;
+ //pt=nm->pt;
+ GetCursorPos(&pt);
+ return SendMessage(GetParent(hwnd), WM_SYSCOMMAND, SC_MOVE|HTCAPTION,MAKELPARAM(pt.x,pt.y));
+ }
+ }
+
+ if (Frames[framepos].floating)
+ {
+ RECT rc;
+ GetCursorPos(&ptOld);
+ //ClientToScreen(hwnd,&ptOld);
+ GetWindowRect( hwnd, &rc );
+
+ nLeft = (short)rc.left;
+ nTop = (short)rc.top;
+ }
+ ulockfrm();
+ SetCapture(hwnd);
+
+
+ break;
+ }
+ case WM_MOUSEMOVE:
+ {
+ POINT pt,pt2;
+ RECT wndr;
+ int pos;
+//tbinfo
+{
+ char TBcapt[255];
+
+ lockfrm();
+ pos=id2pos(Frameid);
+
+ if (pos!=-1)
+ {
+ int oldflags;
+ wsprintfA(TBcapt,"%s - h:%d, vis:%d, fl:%d, fl:(%d,%d,%d,%d),or: %d",
+ Frames[pos].name,Frames[pos].height,Frames[pos].visible,Frames[pos].floating,
+ Frames[pos].FloatingPos.x,Frames[pos].FloatingPos.y,
+ Frames[pos].FloatingSize.x,Frames[pos].FloatingSize.y,
+ Frames[pos].order
+ );
+
+ oldflags=CallService(MS_CLIST_FRAMES_GETFRAMEOPTIONS,MAKEWPARAM(FO_FLAGS,Frames[pos].id),(LPARAM)0);
+ if (!(oldflags&F_SHOWTBTIP))
+ {
+ oldflags|=F_SHOWTBTIP;
+ //CallService(MS_CLIST_FRAMES_SETFRAMEOPTIONS,MAKEWPARAM(FO_FLAGS,Frames[pos].id),(LPARAM)oldflags);
+ }
+ //CallService(MS_CLIST_FRAMES_SETFRAMEOPTIONS,MAKEWPARAM(FO_TBTIPNAME,Frames[pos].id),(LPARAM)TBcapt);
+ }
+
+ ulockfrm();
+
+}
+//
+ if ((wParam&MK_LBUTTON)/*&&(wParam&MK_CONTROL)*/)
+ {
+ RECT rcMiranda;
+ RECT rcwnd,rcOverlap;
+ POINT newpt,ofspt,curpt,newpos;
+ //if(GetCapture()!=hwnd){break;}
+ //curdragbar=-1;lbypos=-1;oldframeheight=-1;ReleaseCapture();
+ lockfrm();
+ pos=id2pos(Frameid);
+ if (Frames[pos].floating)
+ {
+
+ GetCursorPos(&curpt);
+ rcwnd.bottom=curpt.y+5;
+ rcwnd.top=curpt.y;
+ rcwnd.left=curpt.x;
+ rcwnd.right=curpt.x+5;
+
+ GetWindowRect(pcli->hwndContactList, &rcMiranda );
+ //GetWindowRect( Frames[pos].ContainerWnd, &rcwnd );
+ //IntersectRect( &rcOverlap, &rcwnd, &rcMiranda )
+ if (IsWindowVisible(pcli->hwndContactList) &&IntersectRect( &rcOverlap, &rcwnd, &rcMiranda ))
+ {
+ int id=Frames[pos].id;
+
+
+ ulockfrm();
+
+ ofspt.x=0;ofspt.y=0;
+ ClientToScreen(Frames[pos].TitleBar.hwnd,&ofspt);
+ ofspt.x=curpt.x-ofspt.x;ofspt.y=curpt.y-ofspt.y;
+
+ CLUIFrameSetFloat(id,0);
+ newpt.x=0;newpt.y=0;
+ ClientToScreen(Frames[pos].TitleBar.hwnd,&newpt);
+ SetCursorPos(newpt.x+ofspt.x,newpt.y+ofspt.y);
+ GetCursorPos(&curpt);
+ lockfrm();
+ Frames[pos].TitleBar.oldpos=curpt;
+ ulockfrm();
+ return(0);
+ }
+
+ }
+ else
+ {
+ int id=Frames[pos].id;
+
+ GetCursorPos(&curpt);
+ rcwnd.bottom=curpt.y+5;
+ rcwnd.top=curpt.y;
+ rcwnd.left=curpt.x;
+ rcwnd.right=curpt.x+5;
+
+ GetWindowRect(pcli->hwndContactList, &rcMiranda );
+ //GetWindowRect( Frames[pos].ContainerWnd, &rcwnd );
+ //IntersectRect( &rcOverlap, &rcwnd, &rcMiranda )
+
+
+ if (!IntersectRect( &rcOverlap, &rcwnd, &rcMiranda ) )
+ {
+
+
+ ulockfrm();
+ GetCursorPos(&curpt);
+ GetWindowRect( Frames[pos].hWnd, &rcwnd );
+ rcwnd.left=rcwnd.right-rcwnd.left;
+ rcwnd.top=rcwnd.bottom-rcwnd.top;
+ newpos.x=curpt.x;newpos.y=curpt.y;
+ if (curpt.x>=(rcMiranda.right-1)){newpos.x=curpt.x+5;}
+ if (curpt.x<=(rcMiranda.left+1)){newpos.x=curpt.x-(rcwnd.left)-5;}
+
+ if (curpt.y>=(rcMiranda.bottom-1)){newpos.y=curpt.y+5;}
+ if (curpt.y<=(rcMiranda.top+1)){newpos.y=curpt.y-(rcwnd.top)-5;}
+
+
+ ofspt.x=0;ofspt.y=0;
+ //ClientToScreen(Frames[pos].TitleBar.hwnd,&ofspt);
+ GetWindowRect(Frames[pos].TitleBar.hwnd,&rcwnd);
+ ofspt.x=curpt.x-ofspt.x;ofspt.y=curpt.y-ofspt.y;
+
+ Frames[pos].FloatingPos.x=newpos.x;
+ Frames[pos].FloatingPos.y=newpos.y;
+ CLUIFrameSetFloat(id,0);
+ //SetWindowPos(Frames[pos].ContainerWnd,0,newpos.x,newpos.y,0,0,SWP_NOSIZE);
+
+ lockfrm();
+ newpt.x=0;newpt.y=0;
+ ClientToScreen(Frames[pos].TitleBar.hwnd,&newpt);
+
+ GetWindowRect( Frames[pos].hWnd, &rcwnd );
+ SetCursorPos(newpt.x+(rcwnd.right-rcwnd.left)/2,newpt.y+(rcwnd.bottom-rcwnd.top)/2);
+ GetCursorPos(&curpt);
+
+ Frames[pos].TitleBar.oldpos=curpt;
+ ulockfrm();
+
+ return(0);
+ }
+
+ }
+ ulockfrm();
+ //return(0);
+ }
+
+ if(wParam&MK_LBUTTON) {
+ int newh=-1,prevold;
+
+ if(GetCapture()!=hwnd){break;}
+
+ lockfrm();
+ pos=id2pos(Frameid);
+
+ if (Frames[pos].floating)
+ {
+ GetCursorPos(&pt);
+ if ((Frames[pos].TitleBar.oldpos.x!=pt.x)||(Frames[pos].TitleBar.oldpos.y!=pt.y))
+ {
+
+ pt2=pt;
+ ScreenToClient(hwnd,&pt2);
+ GetWindowRect(Frames[pos].ContainerWnd,&wndr);
+ {
+ int dX,dY;
+ POINT ptNew;
+
+ ptNew.x = pt.x;
+ ptNew.y = pt.y;
+ //ClientToScreen( hwnd, &ptNew );
+
+ dX = ptNew.x - ptOld.x;
+ dY = ptNew.y - ptOld.y;
+
+ nLeft += (short)dX;
+ nTop += (short)dY;
+
+ if (!(wParam&MK_CONTROL))
+ {
+ PositionThumb( &Frames[pos], nLeft, nTop );
+ }else
+ {
+
+ SetWindowPos( Frames[pos].ContainerWnd,
+ HWND_TOPMOST,
+ nLeft,
+ nTop,
+ 0,
+ 0,
+ SWP_NOSIZE | SWP_NOZORDER );
+ }
+
+ ptOld = ptNew;
+
+
+
+ }
+
+ pt.x=nLeft;
+ pt.y=nTop;
+ Frames[pos].TitleBar.oldpos=pt;
+ }
+ ulockfrm();
+ //break;
+ return(0);
+ }
+
+
+ if(Frames[pos].prevvisframe!=-1) {
+ GetCursorPos(&pt);
+
+ if ((Frames[pos].TitleBar.oldpos.x==pt.x)&&(Frames[pos].TitleBar.oldpos.y==pt.y))
+ {ulockfrm();break;}
+
+ ypos=rect.top+pt.y;xpos=rect.left+pt.x;
+ Framemod=-1;
+
+ if(Frames[pos].align==alBottom) {
+ direction=-1;
+ Framemod=pos;
+ }
+ else {
+ direction=1;
+ Framemod=Frames[pos].prevvisframe;
+ }
+ if(Frames[Framemod].Locked) {ulockfrm();break;}
+ if(curdragbar!=-1&&curdragbar!=pos) {ulockfrm();break;}
+
+ if(lbypos==-1) {
+ curdragbar=pos;
+ lbypos=ypos;
+ oldframeheight=Frames[Framemod].height;
+ SetCapture(hwnd);
+ {ulockfrm();break;}
+ }
+ else
+ {
+ // if(GetCapture()!=hwnd){ulockfrm();break;}
+ }
+
+ newh=oldframeheight+direction*(ypos-lbypos);
+ if(newh>0) {
+ prevold=Frames[Framemod].height;
+ Frames[Framemod].height=newh;
+ if(!CLUIFramesFitInSize()) { Frames[Framemod].height=prevold; ulockfrm();return TRUE;}
+ Frames[Framemod].height=newh;
+ if(newh>3) Frames[Framemod].collapsed=TRUE;
+
+ }
+ Frames[pos].TitleBar.oldpos=pt;
+ }
+ ulockfrm();
+ if (newh>0){CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,(LPARAM)0);}
+ break;
+ }
+ curdragbar=-1;lbypos=-1;oldframeheight=-1;ReleaseCapture();
+ }
+ break;
+ case WM_PRINTCLIENT:
+ {
+ if (lParam&PRF_CLIENT)
+ {
+ GetClientRect(hwnd,&rect);
+ DrawTitleBar((HDC)wParam,rect,Frameid);
+ }
+ }
+ case WM_PAINT:
+ {
+ HDC paintDC;
+ PAINTSTRUCT paintStruct;
+
+ //GetClientRect(hwnd,&rect);
+ paintDC = BeginPaint(hwnd, &paintStruct);
+ rect=paintStruct.rcPaint;
+ DrawTitleBar(paintDC,rect,Frameid);
+ EndPaint(hwnd, &paintStruct);
+ return 0;
+ }
+ default:return DefWindowProc(hwnd, msg, wParam, lParam);
+ }
+ return TRUE;
+}
+int CLUIFrameResizeFloatingFrame(int framepos)
+{
+
+ int width,height;
+ RECT rect;
+
+ if (!Frames[framepos].floating){return(0);}
+ if (Frames[framepos].ContainerWnd==0){return(0);}
+ GetClientRect(Frames[framepos].ContainerWnd,&rect);
+
+ width=rect.right-rect.left;
+ height=rect.bottom-rect.top;
+
+ Frames[framepos].visible?ShowWindow(Frames[framepos].ContainerWnd,SW_SHOW):ShowWindow(Frames[framepos].ContainerWnd,SW_HIDE);
+
+
+
+ if (Frames[framepos].TitleBar.ShowTitleBar)
+ {
+ ShowWindow(Frames[framepos].TitleBar.hwnd,SW_SHOW);
+ //if (Frames[framepos].Locked){return(0);}
+ Frames[framepos].height=height-DEFAULT_TITLEBAR_HEIGHT;
+
+ SetWindowPos(Frames[framepos].TitleBar.hwnd,HWND_TOP,0,0,width,DEFAULT_TITLEBAR_HEIGHT,SWP_SHOWWINDOW|SWP_DRAWFRAME);
+ SetWindowPos(Frames[framepos].hWnd,HWND_TOP,0,DEFAULT_TITLEBAR_HEIGHT,width,height-DEFAULT_TITLEBAR_HEIGHT,SWP_SHOWWINDOW);
+
+ }
+ else
+ {
+ //SetWindowPos(Frames[framepos].TitleBar.hwnd,HWND_TOP,0,0,width,DEFAULT_TITLEBAR_HEIGHT,SWP_SHOWWINDOW|SWP_NOMOVE);
+ //if (Frames[framepos].Locked){return(0);}
+ Frames[framepos].height=height;
+ ShowWindow(Frames[framepos].TitleBar.hwnd,SW_HIDE);
+ SetWindowPos(Frames[framepos].hWnd,HWND_TOP,0,0,width,height,SWP_SHOWWINDOW);
+
+ }
+// CLUIFramesForceUpdateFrame(&Frames[framepos]);
+ if (Frames[framepos].ContainerWnd!=0) UpdateWindow(Frames[framepos].ContainerWnd);
+ //GetClientRect(Frames[framepos].TitleBar.hwnd,&Frames[framepos].TitleBar.wndSize);
+ GetWindowRect(Frames[framepos].hWnd,&Frames[framepos].wndSize);
+ //Frames[framepos].height=Frames[framepos].wndSize.bottom-Frames[framepos].wndSize.top;
+ //GetClientRect(Frames[framepos].hWnd,&Frames[framepos].wndSize);
+ //Frames[framepos].height=Frames[framepos].wndSize.bottom-Frames[framepos].wndSize.top;
+ return(0);
+}
+
+static int CLUIFrameOnMainMenuBuild(WPARAM wParam,LPARAM lParam)
+{
+ CLUIFramesLoadMainMenu();
+ return 0;
+}
+//static int CLUIFrameContainerWndProc
+LRESULT CALLBACK CLUIFrameContainerWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+
+ RECT rect;
+ int Frameid;
+
+ Frameid=(GetWindowLongPtr(hwnd,GWLP_USERDATA));
+ memset(&rect,0,sizeof(rect));
+/*
+if ((msg == WM_MOVE) || (msg == WM_MOVING) || (msg == WM_NCLBUTTONDOWN) || (msg == WM_SYSCOMMAND) )
+{
+ if (ServiceExists("Utils/SnapWindowProc"))
+ {
+ SnapWindowProc_t SnapInfo;
+ memset(&SnapInfo,0,sizeof(SnapInfo));
+
+ SnapInfo.hWnd = hwnd;
+ SnapInfo.wParam = wParam;
+ SnapInfo.lParam = lParam;
+ if (CallService("Utils/SnapWindowProc",(WPARAM)&SnapInfo,msg)!=0){return(TRUE);}
+ }
+}
+*/
+ switch(msg)
+ {
+ case WM_CREATE:
+ {
+ int framepos;
+ lockfrm();
+ framepos=id2pos(Frameid);
+ //SetWindowPos(Frames[framepos].TitleBar.hwndTip, HWND_TOPMOST,0, 0, 0, 0,SWP_NOMOVE | SWP_NOSIZE );
+ ulockfrm();
+ return(0);
+ }
+ case WM_GETMINMAXINFO:
+ //DefWindowProc(hwnd,msg,wParam,lParam);
+ {
+ int framepos;
+ MINMAXINFO minmax;
+
+ lockfrm();
+ framepos=id2pos(Frameid);
+ if(framepos<0||framepos>=nFramescount){ulockfrm();break;}
+ if (!Frames[framepos].minmaxenabled){ulockfrm();break;}
+ if (Frames[framepos].ContainerWnd==0){ulockfrm();break;}
+
+ if (Frames[framepos].Locked)
+ {
+ RECT rct;
+
+ GetWindowRect(hwnd,&rct);
+ ((LPMINMAXINFO)lParam)->ptMinTrackSize.x=rct.right-rct.left;
+ ((LPMINMAXINFO)lParam)->ptMinTrackSize.y=rct.bottom-rct.top;
+ ((LPMINMAXINFO)lParam)->ptMaxTrackSize.x=rct.right-rct.left;
+ ((LPMINMAXINFO)lParam)->ptMaxTrackSize.y=rct.bottom-rct.top;
+ //ulockfrm();
+ //return(0);
+ }
+
+
+ memset(&minmax,0,sizeof(minmax));
+ if (SendMessage(Frames[framepos].hWnd,WM_GETMINMAXINFO,(WPARAM)0,(LPARAM)&minmax)==0)
+ {
+ RECT border;
+ int tbh=TitleBarH*btoint(Frames[framepos].TitleBar.ShowTitleBar);
+ GetBorderSize(hwnd,&border);
+ if (minmax.ptMaxTrackSize.x!=0&&minmax.ptMaxTrackSize.y!=0){
+
+ ((LPMINMAXINFO)lParam)->ptMinTrackSize.x=minmax.ptMinTrackSize.x;
+ ((LPMINMAXINFO)lParam)->ptMinTrackSize.y=minmax.ptMinTrackSize.y;
+ ((LPMINMAXINFO)lParam)->ptMaxTrackSize.x=minmax.ptMaxTrackSize.x+border.left+border.right;
+ ((LPMINMAXINFO)lParam)->ptMaxTrackSize.y=minmax.ptMaxTrackSize.y+tbh+border.top+border.bottom;
+ }
+
+ }
+ else
+ {
+
+ ulockfrm();
+ return(DefWindowProc(hwnd, msg, wParam, lParam));
+ }
+ ulockfrm();
+
+
+ }
+ //return 0;
+
+ case WM_MOVE:
+ {
+ int framepos;
+ RECT rect;
+
+
+ lockfrm();
+ framepos=id2pos(Frameid);
+
+ if(framepos<0||framepos>=nFramescount){ulockfrm();break;}
+ if (Frames[framepos].ContainerWnd==0){ulockfrm();return(0);}
+
+ GetWindowRect(Frames[framepos].ContainerWnd,&rect);
+ Frames[framepos].FloatingPos.x=rect.left;
+ Frames[framepos].FloatingPos.y=rect.top;
+ Frames[framepos].FloatingSize.x=rect.right-rect.left;
+ Frames[framepos].FloatingSize.y=rect.bottom-rect.top;
+
+ CLUIFramesStoreFrameSettings(framepos);
+ ulockfrm();
+
+ return(0);
+ }
+ case WM_SIZE:
+ {
+ int framepos;
+ RECT rect;
+
+
+ lockfrm();
+ framepos=id2pos(Frameid);
+
+ if(framepos<0||framepos>=nFramescount){ulockfrm();break;}
+ if (Frames[framepos].ContainerWnd==0){ulockfrm();return(0);}
+ CLUIFrameResizeFloatingFrame(framepos);
+
+ GetWindowRect(Frames[framepos].ContainerWnd,&rect);
+ Frames[framepos].FloatingPos.x=rect.left;
+ Frames[framepos].FloatingPos.y=rect.top;
+ Frames[framepos].FloatingSize.x=rect.right-rect.left;
+ Frames[framepos].FloatingSize.y=rect.bottom-rect.top;
+
+ CLUIFramesStoreFrameSettings(framepos);
+ ulockfrm();
+
+ return(0);
+ }
+ case WM_CLOSE:
+ {
+ DestroyWindow(hwnd);
+ break;
+ }
+ case WM_DESTROY:
+ {
+ //{ CLUIFramesStoreAllFrames();}
+ return(0);
+ }
+ /*
+ case WM_COMMAND:
+ case WM_NOTIFY:
+ return(SendMessage(pcli->hwndContactList,msg,wParam,lParam));
+ */
+
+
+ }
+ return DefWindowProc(hwnd, msg, wParam, lParam);
+}
+
+static HWND CreateContainerWindow(HWND parent,int x,int y,int width,int height)
+{
+ return(CreateWindowA("FramesContainer","aaaa",WS_POPUP|WS_THICKFRAME,x,y,width,height,parent,0,g_hInst,0));
+}
+
+INT_PTR CLUIFrameSetFloat(WPARAM wParam,LPARAM lParam)
+{
+ HWND hwndtmp, hwndtooltiptmp;
+ wndFrame *frame;
+ int pos;
+
+ lockfrm();
+
+ pos = id2pos(wParam);
+ if (pos < 0 || pos > nFramescount)
+ {
+ ulockfrm();
+ return 0;
+ }
+
+ frame = &Frames[pos];
+
+ //parent=GetParent(Frames[wParam].hWnd);
+ if (frame->floating)
+ {
+ //SetWindowLong(frame->hWnd,GWL_STYLE,Frames[wParam].oldstyles);
+ //SetWindowLong(frame->TitleBar.hwnd,GWL_STYLE,Frames[wParam].TitleBar.oldstyles);
+ SetParent(frame->hWnd,pcli->hwndContactList);
+ SetParent(frame->TitleBar.hwnd,pcli->hwndContactList);
+ frame->floating=FALSE;
+ DestroyWindow(frame->ContainerWnd);
+ frame->ContainerWnd=NULL;
+ }
+ else
+ {
+ RECT recttb,rectw,border;
+ int temp;
+ int neww,newh;
+ BOOLEAN locked;
+
+ frame->oldstyles=GetWindowLong(frame->hWnd,GWL_STYLE);
+ frame->TitleBar.oldstyles=GetWindowLong(frame->TitleBar.hwnd,GWL_STYLE);
+ locked=frame->Locked;
+ frame->Locked=FALSE;
+ frame->minmaxenabled=FALSE;
+
+ GetWindowRect(frame->hWnd,&rectw);
+ GetWindowRect(frame->TitleBar.hwnd,&recttb);
+ if (!frame->TitleBar.ShowTitleBar){
+ recttb.top=recttb.bottom=recttb.left=recttb.right=0;
+ }
+
+ frame->ContainerWnd=CreateContainerWindow(pcli->hwndContactList,frame->FloatingPos.x,frame->FloatingPos.y,10,10);
+
+
+
+
+ SetParent(frame->hWnd,frame->ContainerWnd);
+ SetParent(frame->TitleBar.hwnd,frame->ContainerWnd);
+
+ //SetWindowPos(frame->TitleBar.hwnd,HWND_TOP,0,0,0,0,SWP_NOSIZE);
+ //SetWindowPos(frame->hWnd,HWND_TOP,0,recttb.bottom-recttb.top,0,0,SWP_NOSIZE);
+ GetBorderSize(frame->ContainerWnd,&border);
+
+
+ SetWindowLongPtr(frame->ContainerWnd, GWLP_USERDATA, frame->id);
+ if ((lParam==1))
+ {
+ if ((frame->FloatingPos.x!=0)&&(frame->FloatingPos.y!=0))
+ {
+ if (frame->FloatingPos.x<20){frame->FloatingPos.x=40;}
+ if (frame->FloatingPos.y<20){frame->FloatingPos.y=40;}
+
+ SetWindowPos(frame->ContainerWnd,HWND_TOPMOST,frame->FloatingPos.x,frame->FloatingPos.y,frame->FloatingSize.x,frame->FloatingSize.y,SWP_HIDEWINDOW);
+ }else
+ {
+ SetWindowPos(frame->ContainerWnd,HWND_TOPMOST,120,120,140,140,SWP_HIDEWINDOW);
+ }
+ }
+ else
+ {
+ neww=rectw.right-rectw.left+border.left+border.right;
+ newh=(rectw.bottom-rectw.top)+(recttb.bottom-recttb.top)+border.top+border.bottom;
+ if (neww<20){neww=40;}
+ if (newh<20){newh=40;}
+ if (frame->FloatingPos.x<20){frame->FloatingPos.x=40;}
+ if (frame->FloatingPos.y<20){frame->FloatingPos.y=40;}
+
+ SetWindowPos(frame->ContainerWnd,HWND_TOPMOST,frame->FloatingPos.x,frame->FloatingPos.y,neww,newh,SWP_HIDEWINDOW);
+ }
+
+
+ SetWindowText(frame->ContainerWnd,frame->TitleBar.tbname);
+
+ temp=GetWindowLong(frame->ContainerWnd,GWL_EXSTYLE);
+ temp|=WS_EX_TOOLWINDOW|WS_EX_TOPMOST ;
+ SetWindowLong(frame->ContainerWnd,GWL_EXSTYLE,temp);
+
+ //SetWindowLong(frame->hWnd,GWL_STYLE,WS_POPUP|(frame->oldstyles&(~WS_CHILD)));
+ //SetWindowLong(frame->TitleBar.hwnd,GWL_STYLE,WS_POPUP|(frame->TitleBar.oldstyles&(~WS_CHILD)));
+
+ frame->floating=TRUE;
+ frame->Locked=locked;
+
+ }
+ CLUIFramesStoreFrameSettings(pos);
+ frame->minmaxenabled=TRUE;
+ hwndtooltiptmp=frame->TitleBar.hwndTip;
+
+ hwndtmp=frame->ContainerWnd;
+ ulockfrm();
+ CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList, 0);
+ SendMessage(hwndtmp,WM_SIZE,0,0);
+
+ SetWindowPos(hwndtooltiptmp, HWND_TOPMOST,0, 0, 0, 0,SWP_NOMOVE | SWP_NOSIZE );
+ return 0;
+}
+
+static int CLUIFrameOnFontChange(WPARAM wParam,LPARAM lParam)
+{
+ FontID fid={0};
+ fid.cbSize=sizeof(fid);
+ memset(&TitleBarLogFont,0,sizeof(TitleBarLogFont));
+
+ strcpy(fid.group,LPGEN("Frames"));
+ strcpy(fid.name,LPGEN("TitleBarFont"));
+ strcpy(fid.dbSettingsGroup,"CLUIFrames");
+ strcpy(fid.prefix,"FramesTitleBarFont");
+
+ CallService(MS_FONT_GET,(WPARAM)&fid,(LPARAM)&TitleBarLogFont);
+ CLUIFramesOnClistResize(0,0);
+
+
+ return 0;
+}
+
+static void CLUIRegisterFonts()
+{
+ if (ServiceExists(MS_FONT_REGISTER))
+ {
+ FontID fid={0};
+
+ fid.cbSize=sizeof(fid);
+ strcpy(fid.group,LPGEN("Frames"));
+ strcpy(fid.name,LPGEN("TitleBarFont"));
+ strcpy(fid.dbSettingsGroup,"CLUIFrames");
+ strcpy(fid.prefix,"FramesTitleBarFont");
+
+ CallService(MS_FONT_REGISTER,(WPARAM)&fid,0);
+ CLUIFrameOnFontChange(0,0);
+ HookEvent(ME_FONT_RELOAD,CLUIFrameOnFontChange);
+} }
+
+static int CLUIFrameOnModulesLoad(WPARAM wParam,LPARAM lParam)
+{
+ CLUIFramesLoadMainMenu(0,0);
+ CLUIFramesCreateMenuForFrame(-1,-1,000010000,MS_CLIST_ADDCONTEXTFRAMEMENUITEM);
+ CLUIRegisterFonts();
+ return 0;
+}
+
+static int CLUIFrameOnModulesUnload(WPARAM wParam,LPARAM lParam)
+{
+ CallService( MS_CLIST_REMOVECONTEXTFRAMEMENUITEM, ( LPARAM )contMIVisible, 0 );
+ CallService( MS_CLIST_REMOVECONTEXTFRAMEMENUITEM, ( LPARAM )contMITitle, 0 );
+ CallService( MS_CLIST_REMOVECONTEXTFRAMEMENUITEM, ( LPARAM )contMITBVisible, 0 );
+ CallService( MS_CLIST_REMOVECONTEXTFRAMEMENUITEM, ( LPARAM )contMILock, 0 );
+ CallService( MS_CLIST_REMOVECONTEXTFRAMEMENUITEM, ( LPARAM )contMIColl, 0 );
+ CallService( MS_CLIST_REMOVECONTEXTFRAMEMENUITEM, ( LPARAM )contMIFloating, 0 );
+ CallService( MS_CLIST_REMOVECONTEXTFRAMEMENUITEM, ( LPARAM )contMIAlignRoot, 0 );
+ CallService( MS_CLIST_REMOVECONTEXTFRAMEMENUITEM, ( LPARAM )contMIAlignTop, 0 );
+ CallService( MS_CLIST_REMOVECONTEXTFRAMEMENUITEM, ( LPARAM )contMIAlignClient, 0 );
+ CallService( MS_CLIST_REMOVECONTEXTFRAMEMENUITEM, ( LPARAM )contMIAlignBottom, 0 );
+ CallService( MS_CLIST_REMOVECONTEXTFRAMEMENUITEM, ( LPARAM )contMIBorder, 0 );
+ return 0;
+}
+
+static INT_PTR CLUIGetCapsService(WPARAM wParam,LPARAM lParam)
+{
+ switch (wParam) {
+ case CLUICAPS_FLAGS1:
+ return CLUIF_HIDEEMPTYGROUPS | CLUIF_DISABLEGROUPS | CLUIF_HASONTOPOPTION | CLUIF_HASAUTOHIDEOPTION;
+ case CLUICAPS_FLAGS2:
+ return MAKELONG(EXTRACOLUMNCOUNT,1);
+ }
+ return 0;
+}
+
+int LoadCLUIFramesModule(void)
+{
+ WNDCLASS wndclass;
+ WNDCLASS cntclass;
+
+ wndclass.style = CS_DBLCLKS|CS_HREDRAW|CS_VREDRAW ;
+ wndclass.lpfnWndProc = CLUIFrameTitleBarProc;
+ wndclass.cbClsExtra = 0;
+ wndclass.cbWndExtra = 0;
+ wndclass.hInstance = g_hInst;
+ wndclass.hIcon = NULL;
+ wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
+ wndclass.hbrBackground = NULL;
+ wndclass.lpszMenuName = NULL;
+ wndclass.lpszClassName = CLUIFrameTitleBarClassName;
+ RegisterClass(&wndclass);
+
+ //container helper
+
+ cntclass.style = CS_DBLCLKS|CS_HREDRAW|CS_VREDRAW|( IsWinVerXPPlus() ? CS_DROPSHADOW : 0);
+ cntclass.lpfnWndProc = CLUIFrameContainerWndProc;
+ cntclass.cbClsExtra = 0;
+ cntclass.cbWndExtra = 0;
+ cntclass.hInstance = g_hInst;
+ cntclass.hIcon = NULL;
+ cntclass.hCursor = LoadCursor(NULL, IDC_ARROW);
+ cntclass.hbrBackground = NULL;
+ cntclass.lpszMenuName = NULL;
+ cntclass.lpszClassName = _T("FramesContainer");
+ RegisterClass(&cntclass);
+ //end container helper
+
+ GapBetweenFrames=DBGetContactSettingDword(NULL,"CLUIFrames","GapBetweenFrames",1);
+
+ nFramescount=0;
+ InitializeCriticalSection(&csFrameHook);
+ InitFramesMenus();
+
+ hHook[0] = HookEvent(ME_SYSTEM_MODULESLOADED,CLUIFrameOnModulesLoad);
+ hHook[1] = HookEvent(ME_CLIST_PREBUILDFRAMEMENU,CLUIFramesModifyContextMenuForFrame);
+ hHook[2] = HookEvent(ME_CLIST_PREBUILDMAINMENU,CLUIFrameOnMainMenuBuild);
+
+ hService[0] = CreateServiceFunction(MS_CLIST_FRAMES_ADDFRAME,CLUIFramesAddFrame);
+ hService[1] = CreateServiceFunction(MS_CLIST_FRAMES_REMOVEFRAME,CLUIFramesRemoveFrame);
+
+ hService[2] = CreateServiceFunction(MS_CLIST_FRAMES_SETFRAMEOPTIONS,CLUIFramesSetFrameOptions);
+ hService[3] = CreateServiceFunction(MS_CLIST_FRAMES_GETFRAMEOPTIONS,CLUIFramesGetFrameOptions);
+ hService[4] = CreateServiceFunction(MS_CLIST_FRAMES_UPDATEFRAME,CLUIFramesUpdateFrame);
+
+ hService[5] = CreateServiceFunction(MS_CLIST_FRAMES_SHFRAMETITLEBAR,CLUIFramesShowHideFrameTitleBar);
+ hService[6] = CreateServiceFunction(MS_CLIST_FRAMES_SHOWALLFRAMESTB,CLUIFramesShowAllTitleBars);
+ hService[7] = CreateServiceFunction(MS_CLIST_FRAMES_HIDEALLFRAMESTB,CLUIFramesHideAllTitleBars);
+ hService[8] = CreateServiceFunction(MS_CLIST_FRAMES_SHFRAME,CLUIFramesShowHideFrame);
+ hService[9] = CreateServiceFunction(MS_CLIST_FRAMES_SHOWALLFRAMES,CLUIFramesShowAll);
+
+ hService[10] = CreateServiceFunction(MS_CLIST_FRAMES_ULFRAME,CLUIFramesLockUnlockFrame);
+ hService[11] = CreateServiceFunction(MS_CLIST_FRAMES_UCOLLFRAME,CLUIFramesCollapseUnCollapseFrame);
+ hService[12] = CreateServiceFunction(MS_CLIST_FRAMES_SETUNBORDER,CLUIFramesSetUnSetBorder);
+
+ hService[13] = CreateServiceFunction(MS_CLUI_GETCAPS,CLUIGetCapsService);
+
+ hService[14] = CreateServiceFunction(CLUIFRAMESSETALIGN,CLUIFramesSetAlign);
+ hService[15] = CreateServiceFunction(CLUIFRAMESMOVEUPDOWN,CLUIFramesMoveUpDown);
+
+ hService[16] = CreateServiceFunction(CLUIFRAMESSETALIGNALTOP,CLUIFramesSetAlignalTop);
+ hService[17] = CreateServiceFunction(CLUIFRAMESSETALIGNALCLIENT,CLUIFramesSetAlignalClient);
+ hService[18] = CreateServiceFunction(CLUIFRAMESSETALIGNALBOTTOM,CLUIFramesSetAlignalBottom);
+
+ hService[19] = CreateServiceFunction("Set_Floating",CLUIFrameSetFloat);
+ hWndExplorerToolBar =FindWindowExA(0,0,"Shell_TrayWnd",NULL);
+ OnFrameTitleBarBackgroundChange(0,0);
+ FramesSysNotStarted=FALSE;
+ hHook[3] = HookEvent(ME_SYSTEM_PRESHUTDOWN, CLUIFrameOnModulesUnload);
+ return 0;
+}
+
+int UnLoadCLUIFramesModule(void)
+{
+ int i;
+ FramesSysNotStarted=TRUE;
+
+ for (i=0; i<SIZEOF(hService); ++i)
+ DestroyServiceFunction(hService[i]);
+
+ for (i=0; i<SIZEOF(hHook); ++i)
+ UnhookEvent(hHook[i]);
+
+ CLUIFramesOnClistResize((WPARAM)pcli->hwndContactList,0);
+ CLUIFramesStoreAllFrames();
+ lockfrm();
+ for (i=0;i<nFramescount;i++) {
+ DestroyWindow(Frames[i].hWnd);
+ Frames[i].hWnd=(HWND)-1;
+ DestroyWindow(Frames[i].TitleBar.hwnd);
+ Frames[i].TitleBar.hwnd=(HWND)-1;
+ DestroyWindow(Frames[i].ContainerWnd);
+ Frames[i].ContainerWnd=(HWND)-1;
+ DestroyMenu(Frames[i].TitleBar.hmenu);
+
+ mir_free(Frames[i].name);
+ mir_free(Frames[i].TitleBar.tbname);
+ mir_free(Frames[i].TitleBar.tooltip);
+ }
+ if(Frames) free(Frames);
+ Frames=NULL;
+ nFramescount=0;
+ UnregisterClass(CLUIFrameTitleBarClassName,g_hInst);
+ DeleteObject(TitleBarFont);
+ ulockfrm();
+ DeleteCriticalSection(&csFrameHook);
+ return 0;
+}
diff --git a/plugins/Mwclist/CLUIFrames/cluiframes.h b/plugins/Mwclist/CLUIFrames/cluiframes.h
new file mode 100644
index 0000000000..6430c6655d
--- /dev/null
+++ b/plugins/Mwclist/CLUIFrames/cluiframes.h
@@ -0,0 +1,44 @@
+/*
+Miranda ICQ: the free icq client for MS Windows
+Copyright (C) 2000-2 Richard Hughes, Roland Rabien & Tristan Van de Vreede
+
+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.
+*/
+
+int LoadCLUIFramesModule(void);
+int UnLoadCLUIFramesModule(void);
+int CLUIFramesGetMinHeight();
+int CLUIFramesOnClistResize(WPARAM wParam,LPARAM lParam);
+
+typedef struct tagProtocolData {
+ char *RealName;
+ int protopos;
+ boolean show;
+} ProtocolData;
+
+#define OFFSET_PROTOPOS 200
+#define OFFSET_VISIBLE 400
+
+#define CLUIFrameTitleBarClassName _T("CLUIFrameTitleBar")
+#define CLUIFrameModule "CLUIFrames"
+
+//integrated menu module
+#define MS_INT_MENUMEASUREITEM "CLUIFrames/IntMenuMeasureItem"
+#define MS_INT_MENUDRAWITEM "CLUIFrames/IntMenuDrawItem"
+#define MS_INT_MENUPROCESSCOMMAND "CLUIFrames/IntMenuProcessCommand"
+#define MS_INT_MODIFYMENUITEM "CLUIFrames/IntModifyMenuItem"
+
+
+
diff --git a/plugins/Mwclist/CLUIFrames/extraimage.c b/plugins/Mwclist/CLUIFrames/extraimage.c
new file mode 100644
index 0000000000..941732c4ff
--- /dev/null
+++ b/plugins/Mwclist/CLUIFrames/extraimage.c
@@ -0,0 +1,406 @@
+#include "../commonheaders.h"
+
+extern int DefaultImageListColorDepth;
+
+int EnabledColumnCount=0;
+boolean visar[EXTRACOLUMNCOUNT];
+#define ExtraImageIconsIndexCount 3
+int ExtraImageIconsIndex[ExtraImageIconsIndexCount];
+
+static HANDLE hExtraImageListRebuilding,hExtraImageApplying;
+HANDLE hExtraImageClick;
+
+static HIMAGELIST hExtraImageList;
+extern HINSTANCE g_hInst;
+extern HIMAGELIST hCListImages;
+
+extern int ClcIconsChanged(WPARAM,LPARAM);
+
+void SetAllExtraIcons(HWND hwndList,HANDLE hContact);
+void LoadExtraImageFunc();
+extern HICON LoadIconFromExternalFile (char *filename,int i,boolean UseLibrary,boolean registerit,char *IconName,char *SectName,char *Description,int internalidx);
+boolean ImageCreated=FALSE;
+void ReloadExtraIcons();
+BYTE ExtraOrder[]=
+{
+ 0, // EXTRA_ICON_EMAIL
+ 1, // EXTRA_ICON_PROTO
+ 2, // EXTRA_ICON_SMS
+ 3, // EXTRA_ICON_ADV1
+ 4, // EXTRA_ICON_ADV2
+ 5, // EXTRA_ICON_WEB
+ 6, // EXTRA_ICON_CLIENT
+ 7, // EXTRA_ICON_ADV3
+ 8, // EXTRA_ICON_ADV4
+};
+
+BOOL HasExtraIconsService()
+{
+ return ServiceExists("ExtraIcon/Register");
+}
+
+boolean isColumnVisible(int extra)
+{
+ int i=0;
+
+ if (HasExtraIconsService())
+ return TRUE;
+
+ for (i=0; i<sizeof(ExtraOrder)/sizeof(ExtraOrder[0]); i++)
+ if (ExtraOrder[i]==extra)
+ {
+ switch(i+1)
+ {
+ case EXTRA_ICON_EMAIL: return(DBGetContactSettingByte(NULL,CLUIFrameModule,"EXTRA_ICON_EMAIL",1));
+ case EXTRA_ICON_PROTO: return(DBGetContactSettingByte(NULL,CLUIFrameModule,"EXTRA_ICON_PROTO",1));
+ case EXTRA_ICON_SMS: return(DBGetContactSettingByte(NULL,CLUIFrameModule,"EXTRA_ICON_SMS",1));
+ case EXTRA_ICON_ADV1: return(DBGetContactSettingByte(NULL,CLUIFrameModule,"EXTRA_ICON_ADV1",1));
+ case EXTRA_ICON_ADV2: return(DBGetContactSettingByte(NULL,CLUIFrameModule,"EXTRA_ICON_ADV2",1));
+ case EXTRA_ICON_WEB: return(DBGetContactSettingByte(NULL,CLUIFrameModule,"EXTRA_ICON_WEB",1));
+ case EXTRA_ICON_CLIENT: return(DBGetContactSettingByte(NULL,CLUIFrameModule,"EXTRA_ICON_CLIENT",1));
+ case EXTRA_ICON_ADV3: return(DBGetContactSettingByte(NULL,CLUIFrameModule,"EXTRA_ICON_ADV3",0));
+ case EXTRA_ICON_ADV4: return(DBGetContactSettingByte(NULL,CLUIFrameModule,"EXTRA_ICON_ADV4",0));
+ }
+ break;
+ }
+ return(FALSE);
+}
+
+void GetVisColumns()
+{
+ visar[0]=isColumnVisible(0);
+ visar[1]=isColumnVisible(1);
+ visar[2]=isColumnVisible(2);
+ visar[3]=isColumnVisible(3);
+ visar[4]=isColumnVisible(4);
+ visar[5]=isColumnVisible(5);
+ visar[6]=isColumnVisible(6);
+ visar[7]=isColumnVisible(7);
+ visar[8]=isColumnVisible(8);
+};
+
+__inline int bti(boolean b)
+{
+ return(b?1:0);
+};
+int colsum(int from,int to)
+{
+ int i,sum;
+ if (from<0||from>=EXTRACOLUMNCOUNT){return(-1);};
+ if (to<0||to>=EXTRACOLUMNCOUNT){return(-1);};
+ if (to<from){return(-1);};
+
+ sum=0;
+ for (i=from;i<=to;i++)
+ {
+ sum+=bti(visar[i]);
+ };
+ return(sum);
+};
+
+int ExtraToColumnNum(int extra)
+{
+ if (HasExtraIconsService())
+ {
+ if (extra < 1 || extra > EXTRACOLUMNCOUNT)
+ return -1;
+ else
+ return extra-1;
+ }
+ else
+ {
+ int cnt=EnabledColumnCount;
+ int extracnt=EXTRACOLUMNCOUNT-1;
+ int ord=ExtraOrder[extra-1];
+ if (!visar[ord]) return -1;
+ return (colsum(0,ord)-1);
+ }
+};
+
+int ColumnNumToExtra(int column)
+{
+ int i;
+
+ if (HasExtraIconsService())
+ return column+1;
+
+ for (i=0; i<sizeof(ExtraOrder)/sizeof(ExtraOrder[0]); i++)
+ if (ExtraOrder[i]==column)
+ return i+1;
+
+ return -1;
+}
+
+INT_PTR SetIconForExtraColumn(WPARAM wParam,LPARAM lParam)
+{
+ pIconExtraColumn piec;
+ int icol;
+ HANDLE hItem;
+
+ if (pcli->hwndContactTree==0){return(-1);};
+ if (wParam==0||lParam==0){return(-1);};
+ piec=(pIconExtraColumn)lParam;
+
+ if (piec->cbSize!=sizeof(IconExtraColumn)){return(-1);};
+ icol=ExtraToColumnNum(piec->ColumnType);
+ if (icol==-1){return(-1);};
+ hItem=(HANDLE)SendMessage(pcli->hwndContactTree,CLM_FINDCONTACT,(WPARAM)wParam,0);
+ if (hItem==0){return(-1);};
+
+ SendMessage(pcli->hwndContactTree,CLM_SETEXTRAIMAGE,(WPARAM)hItem,MAKELPARAM(icol,piec->hImage));
+ return(0);
+};
+
+//wparam=hIcon
+//return hImage on success,-1 on failure
+INT_PTR AddIconToExtraImageList(WPARAM wParam,LPARAM lParam)
+{
+ if (hExtraImageList==0||wParam==0){return(-1);};
+ return((int)ImageList_AddIcon(hExtraImageList,(HICON)wParam));
+}
+
+void SetNewExtraColumnCount()
+{
+ int newcount;
+
+ GetVisColumns();
+ newcount=colsum(0,EXTRACOLUMNCOUNT-1);
+ DBWriteContactSettingByte(NULL,CLUIFrameModule,"EnabledColumnCount",(BYTE)newcount);
+ EnabledColumnCount=newcount;
+ SendMessage(pcli->hwndContactTree,CLM_SETEXTRACOLUMNS,EnabledColumnCount,0);
+}
+
+int OnIconLibIconChanged(WPARAM wParam,LPARAM lParam)
+{
+ HICON hicon;
+ hicon=LoadIconFromExternalFile("clisticons.dll",0,TRUE,FALSE,"Email","Contact List","Email Icon",-IDI_EMAIL);
+ ExtraImageIconsIndex[0]=ImageList_ReplaceIcon(hExtraImageList,ExtraImageIconsIndex[0],hicon );
+
+ hicon=LoadIconFromExternalFile("clisticons.dll",1,TRUE,FALSE,"Sms","Contact List","Sms Icon",-IDI_SMS);
+ ExtraImageIconsIndex[1]=ImageList_ReplaceIcon(hExtraImageList,ExtraImageIconsIndex[1],hicon );
+
+ hicon=LoadIconFromExternalFile("clisticons.dll",4,TRUE,FALSE,"Web","Contact List","Web Icon",-IDI_GLOBUS);
+ ExtraImageIconsIndex[2]=ImageList_ReplaceIcon(hExtraImageList,ExtraImageIconsIndex[2],hicon );
+
+ NotifyEventHooks(ME_SKIN_ICONSCHANGED,0,0);
+ pcli->pfnClcBroadcast( INTM_INVALIDATE,0,0);
+ return 0;
+}
+
+void ReloadExtraIcons()
+{
+ int count,i;
+ PROTOACCOUNT **accs;
+ HICON hicon;
+
+ SendMessage(pcli->hwndContactTree,CLM_SETEXTRACOLUMNSSPACE,DBGetContactSettingByte(NULL,"CLUI","ExtraColumnSpace",18),0);
+ SendMessage(pcli->hwndContactTree,CLM_SETEXTRAIMAGELIST,0,(LPARAM)NULL);
+ if (hExtraImageList){ImageList_Destroy(hExtraImageList);};
+ hExtraImageList=ImageList_Create(GetSystemMetrics(SM_CXSMICON),GetSystemMetrics(SM_CYSMICON),ILC_COLOR32|ILC_MASK,1,256);
+
+ if (!HasExtraIconsService())
+ {
+ //loading icons
+ hicon=LoadIconFromExternalFile("clisticons.dll",0,TRUE,TRUE,"Email","Contact List","Email Icon",-IDI_EMAIL);
+ if (!hicon) hicon=LoadIcon(g_hInst, MAKEINTRESOURCE(IDI_EMAIL));
+ ExtraImageIconsIndex[0]=ImageList_AddIcon(hExtraImageList,hicon );
+
+
+ hicon=LoadIconFromExternalFile("clisticons.dll",1,TRUE,TRUE,"Sms","Contact List","Sms Icon",-IDI_SMS);
+ if (!hicon) hicon=LoadIcon(g_hInst, MAKEINTRESOURCE(IDI_SMS));
+ ExtraImageIconsIndex[1]=ImageList_AddIcon(hExtraImageList,hicon );
+
+ hicon=LoadIconFromExternalFile("clisticons.dll",4,TRUE,TRUE,"Web","Contact List","Web Icon",-IDI_GLOBUS);
+ if (!hicon) hicon=LoadIcon(g_hInst, MAKEINTRESOURCE(IDI_GLOBUS));
+ ExtraImageIconsIndex[2]=ImageList_AddIcon(hExtraImageList,hicon );
+
+ //calc only needed protocols
+ ProtoEnumAccounts( &count, &accs );
+ for ( i=0; i < count; i++ )
+ if ( IsAccountEnabled( accs[i] ) && CallProtoService( accs[i]->szModuleName, PS_GETCAPS, PFLAGNUM_2, 0 ))
+ ImageList_AddIcon( hExtraImageList, LoadSkinnedProtoIcon( accs[i]->szModuleName, ID_STATUS_ONLINE ));
+ }
+
+ SendMessage(pcli->hwndContactTree,CLM_SETEXTRAIMAGELIST,0,(LPARAM)hExtraImageList);
+
+ //SetAllExtraIcons(hImgList);
+ SetNewExtraColumnCount();
+ NotifyEventHooks(hExtraImageListRebuilding,0,0);
+ ImageCreated=TRUE;
+}
+
+void ClearExtraIcons();
+
+void ReAssignExtraIcons()
+{
+ ClearExtraIcons();
+ SetNewExtraColumnCount();
+ SetAllExtraIcons(pcli->hwndContactTree,0);
+ SendMessage(pcli->hwndContactTree,CLM_AUTOREBUILD,0,0);
+}
+
+void ClearExtraIcons()
+{
+ int i;
+ HANDLE hContact,hItem;
+
+ //EnabledColumnCount=DBGetContactSettingByte(NULL,CLUIFrameModule,"EnabledColumnCount",5);
+ //SendMessage(pcli->hwndContactTree,CLM_SETEXTRACOLUMNS,EnabledColumnCount,0);
+ SetNewExtraColumnCount();
+
+ hContact=(HANDLE)CallService(MS_DB_CONTACT_FINDFIRST,0,0);
+ do {
+
+ hItem=(HANDLE)SendMessage(pcli->hwndContactTree,CLM_FINDCONTACT,(WPARAM)hContact,0);
+ if (hItem==0){continue;};
+ for (i=0;i<EnabledColumnCount;i++)
+ {
+ SendMessage(pcli->hwndContactTree,CLM_SETEXTRAIMAGE,(WPARAM)hItem,MAKELPARAM(i,0xFF));
+ };
+
+ } while(hContact=(HANDLE)CallService(MS_DB_CONTACT_FINDNEXT,(WPARAM)hContact,0));
+};
+
+void SetAllExtraIcons(HWND hwndList,HANDLE hContact)
+{
+ HANDLE hItem;
+ boolean hcontgiven=FALSE;
+ char *szProto;
+ char *ImgIndex[64];
+ int maxpr,count,i;
+ PROTOACCOUNT **accs;
+ pdisplayNameCacheEntry pdnce;
+ int em,pr,sms,a1,a2,w1,c1;
+ int tick=0;
+ BOOL hasExtraIconsService;
+ hcontgiven=(hContact!=0);
+
+ if (pcli->hwndContactTree==0){return;};
+ tick=GetTickCount();
+ if (ImageCreated==FALSE) ReloadExtraIcons();
+
+ SetNewExtraColumnCount();
+
+ hasExtraIconsService = HasExtraIconsService();
+ if (!hasExtraIconsService)
+ {
+ em=ExtraToColumnNum(EXTRA_ICON_EMAIL);
+ pr=ExtraToColumnNum(EXTRA_ICON_PROTO);
+ sms=ExtraToColumnNum(EXTRA_ICON_SMS);
+ a1=ExtraToColumnNum(EXTRA_ICON_ADV1);
+ a2=ExtraToColumnNum(EXTRA_ICON_ADV2);
+ w1=ExtraToColumnNum(EXTRA_ICON_WEB);
+ c1=ExtraToColumnNum(EXTRA_ICON_CLIENT);
+
+ memset(ImgIndex,0,sizeof(ImgIndex));
+ ProtoEnumAccounts( &count, &accs );
+
+ maxpr=0;
+ //calc only needed protocols
+ for( i=0; i < count; i++ ) {
+ if ( !IsAccountEnabled( accs[i] ) || CallProtoService( accs[i]->szModuleName, PS_GETCAPS, PFLAGNUM_2, 0 ) == 0 )
+ continue;
+ ImgIndex[maxpr] = accs[i]->szModuleName;
+ maxpr++;
+ }
+ }
+
+ if ( hContact == NULL )
+ hContact=(HANDLE)CallService(MS_DB_CONTACT_FINDFIRST,0,0);
+
+ do {
+ szProto=NULL;
+ hItem=hContact;
+ if (hItem==0){continue;};
+ pdnce=(pdisplayNameCacheEntry)pcli->pfnGetCacheEntry(hItem);
+ if (pdnce==NULL) {continue;};
+
+ // szProto=(char*)CallService(MS_PROTO_GETCONTACTBASEPROTO,(WPARAM)hContact,0);
+ szProto=pdnce->szProto;
+
+ if (!hasExtraIconsService)
+ {
+ if (ExtraToColumnNum(EXTRA_ICON_WEB)!=-1)
+ {
+ boolean showweb=FALSE;
+
+ if (szProto != NULL)
+ {
+ char *homepage;
+ homepage=DBGetStringA(pdnce->hContact,"UserInfo", "Homepage");
+ if (!homepage)
+ homepage=DBGetStringA(pdnce->hContact,pdnce->szProto, "Homepage");
+ if (homepage!=NULL)
+ {
+ showweb=TRUE;
+ mir_free(homepage);
+ }
+ }
+
+ SendMessage(hwndList,CLM_SETEXTRAIMAGE,(WPARAM)hItem,MAKELPARAM(ExtraToColumnNum(EXTRA_ICON_WEB),(showweb)?2:0xFF));
+ }
+
+ if (ExtraToColumnNum(EXTRA_ICON_EMAIL)!=-1)
+ {
+ DBVARIANT dbv={0};
+ boolean showemail=TRUE;
+
+ if (szProto == NULL || DBGetContactSettingString(hContact, szProto, "e-mail",&dbv))
+ {
+ DBFreeVariant(&dbv);
+ if (DBGetContactSettingString(hContact, "UserInfo", "Mye-mail0", &dbv))
+ showemail=FALSE;
+ }
+ DBFreeVariant(&dbv);
+
+ SendMessage(hwndList,CLM_SETEXTRAIMAGE,(WPARAM)hItem,MAKELPARAM(ExtraToColumnNum(EXTRA_ICON_EMAIL),(showemail)?0:0xFF));
+ }
+
+ if (ExtraToColumnNum(EXTRA_ICON_SMS)!=-1)
+ {
+ DBVARIANT dbv={0};
+ boolean showsms=TRUE;
+
+ if (szProto == NULL || DBGetContactSettingString(hContact, szProto, "Cellular",&dbv)) {
+ DBFreeVariant(&dbv);
+ if (DBGetContactSettingString(hContact, "UserInfo", "MyPhone0", &dbv))
+ showsms=FALSE;
+ }
+ SendMessage(hwndList,CLM_SETEXTRAIMAGE,(WPARAM)hItem,MAKELPARAM(ExtraToColumnNum(EXTRA_ICON_SMS),(showsms)?1:0xFF));
+ DBFreeVariant(&dbv);
+ }
+
+ if(ExtraToColumnNum(EXTRA_ICON_PROTO)!=-1)
+ {
+ for (i=0;i<maxpr;i++)
+ {
+ if(!MyStrCmp(ImgIndex[i],szProto))
+ {
+ SendMessage(hwndList,CLM_SETEXTRAIMAGE,(WPARAM)hItem,MAKELPARAM(ExtraToColumnNum(EXTRA_ICON_PROTO),i+3));
+ break;
+ }
+ }
+ }
+ }
+
+ NotifyEventHooks(hExtraImageApplying,(WPARAM)hContact,0);
+ if (hcontgiven) break;
+ Sleep(0);
+ }
+ while(hContact=(HANDLE)CallService(MS_DB_CONTACT_FINDNEXT,(WPARAM)hContact,0));
+
+ tick=GetTickCount()-tick;
+ InvalidateRect(hwndList,NULL,FALSE);
+ Sleep(0);
+}
+
+void LoadExtraImageFunc()
+{
+ CreateServiceFunction(MS_CLIST_EXTRA_SET_ICON,SetIconForExtraColumn);
+ CreateServiceFunction(MS_CLIST_EXTRA_ADD_ICON,AddIconToExtraImageList);
+
+ hExtraImageListRebuilding=CreateHookableEvent(ME_CLIST_EXTRA_LIST_REBUILD);
+ hExtraImageApplying=CreateHookableEvent(ME_CLIST_EXTRA_IMAGE_APPLY);
+ hExtraImageClick=CreateHookableEvent(ME_CLIST_EXTRA_CLICK);
+ HookEvent(ME_SKIN2_ICONSCHANGED,OnIconLibIconChanged);
+}
diff --git a/plugins/Mwclist/CLUIFrames/framesmenu.c b/plugins/Mwclist/CLUIFrames/framesmenu.c
new file mode 100644
index 0000000000..efc8254995
--- /dev/null
+++ b/plugins/Mwclist/CLUIFrames/framesmenu.c
@@ -0,0 +1,231 @@
+#include "../commonheaders.h"
+
+//==========================Frames
+HANDLE hFrameMenuObject;
+static HANDLE hPreBuildFrameMenuEvent;
+extern int InitCustomMenus(void);
+
+//contactmenu exec param(ownerdata)
+//also used in checkservice
+typedef struct{
+ char *szServiceName;
+ int Frameid;
+ INT_PTR param1;
+}FrameMenuExecParam,*lpFrameMenuExecParam;
+
+void FreeAndNil( void **p )
+{
+ if ( p == NULL )
+ return;
+
+ if ( *p != NULL ) {
+ mir_free( *p );
+ *p = NULL;
+} }
+
+INT_PTR FreeOwnerDataFrameMenu (WPARAM wParam,LPARAM lParam)
+{
+ lpFrameMenuExecParam cmep;
+
+ cmep=(lpFrameMenuExecParam)lParam;
+ if (cmep!=NULL){
+ FreeAndNil(&cmep->szServiceName);
+ FreeAndNil(&cmep);
+ }
+ return(0);
+}
+
+static INT_PTR AddContextFrameMenuItem(WPARAM wParam,LPARAM lParam)
+{
+ CLISTMENUITEM *mi=(CLISTMENUITEM*)lParam;
+ TMO_MenuItem tmi;
+
+ if(mi->cbSize!=sizeof(CLISTMENUITEM)) return 0;
+
+ memset(&tmi,0,sizeof(tmi));
+
+ tmi.cbSize=sizeof(tmi);
+ tmi.flags=mi->flags;
+ tmi.hIcon=mi->hIcon;
+ tmi.hotKey=mi->hotKey;
+ tmi.position=mi->position;
+ tmi.pszName=mi->pszName;
+
+ if(mi->flags&CMIF_ROOTPOPUP||mi->flags&CMIF_CHILDPOPUP)
+ tmi.root = mi->hParentMenu;
+ {
+ lpFrameMenuExecParam fmep;
+ fmep=(lpFrameMenuExecParam)mir_alloc(sizeof(FrameMenuExecParam));
+ if (fmep==NULL){return(0);}
+ fmep->szServiceName=mir_strdup(mi->pszService);
+ fmep->Frameid=mi->popupPosition;
+ fmep->param1=(INT_PTR)mi->pszContactOwner;
+
+ tmi.ownerdata=fmep;
+ }
+
+ return(CallService(MO_ADDNEWMENUITEM,(WPARAM)hFrameMenuObject,(LPARAM)&tmi));
+}
+
+static INT_PTR RemoveContextFrameMenuItem(WPARAM wParam,LPARAM lParam)
+{
+ /* this do by free service
+ lpFrameMenuExecParam fmep;
+ fmep=(lpFrameMenuExecParam)CallService(MO_MENUITEMGETOWNERDATA,wParam,lParam);
+ if (fmep!=NULL){
+ if (fmep->szServiceName!=NULL){
+ mir_free(fmep->szServiceName);
+ fmep->szServiceName=NULL;
+ }
+ mir_free(fmep);
+ }
+ */
+ CallService(MO_REMOVEMENUITEM,wParam,0);
+ return 0;
+}
+
+//called with:
+//wparam - ownerdata
+//lparam - lparam from winproc
+INT_PTR FrameMenuExecService(WPARAM wParam,LPARAM lParam)
+{
+ lpFrameMenuExecParam fmep=(lpFrameMenuExecParam)wParam;
+ if (fmep==NULL){return(-1);}
+ CallService(fmep->szServiceName,lParam,fmep->param1);
+
+ return(0);
+}
+
+//true - ok,false ignore
+INT_PTR FrameMenuCheckService(WPARAM wParam,LPARAM lParam)
+{
+ PCheckProcParam pcpp=(PCheckProcParam)wParam;
+ lpFrameMenuExecParam fmep;
+ TMO_MenuItem mi;
+
+ if (pcpp==NULL){return(FALSE);}
+ if (CallService(MO_GETMENUITEM,(WPARAM)pcpp->MenuItemHandle,(LPARAM)&mi)==0)
+ {
+ fmep=mi.ownerdata;
+ if (fmep!=NULL)
+ {
+ //pcpp->wParam - frameid
+ if (((WPARAM)fmep->Frameid==pcpp->wParam)||fmep->Frameid==-1) return(TRUE);
+ }
+ }
+ return(FALSE);
+}
+
+static INT_PTR ContextFrameMenuNotify(WPARAM wParam,LPARAM lParam)
+{
+ NotifyEventHooks(hPreBuildFrameMenuEvent,wParam,lParam);
+ return(0);
+}
+
+static INT_PTR BuildContextFrameMenu(WPARAM wParam,LPARAM lParam)
+{
+ CLISTMENUITEM *mi=(CLISTMENUITEM*)lParam;
+ HMENU hMenu;
+ ListParam param = { 0 };
+ param.MenuObjectHandle=hFrameMenuObject;
+ param.wParam=wParam;
+ param.lParam=lParam;
+
+ hMenu=CreatePopupMenu();
+ //NotifyEventHooks(hPreBuildFrameMenuEvent,wParam,-1);
+ ContextFrameMenuNotify(wParam,-1);
+ CallService(MO_BUILDMENU,(WPARAM)hMenu,(LPARAM)&param);
+ return (INT_PTR)hMenu;
+}
+
+//==========================Frames end
+boolean InternalGenMenuModule=FALSE;
+
+int MeasureItemProxy(WPARAM wParam,LPARAM lParam)
+{
+ int val;
+ if (InternalGenMenuModule)
+ {
+ val=CallService(MS_INT_MENUMEASUREITEM,wParam,lParam);
+ if (val) return(val);
+ }
+ return CallService(MS_CLIST_MENUMEASUREITEM,wParam,lParam);
+}
+
+int DrawItemProxy(WPARAM wParam,LPARAM lParam)
+{
+ if (InternalGenMenuModule)
+ {
+ int val;
+ val=CallService(MS_INT_MENUDRAWITEM,wParam,lParam);
+ if (val) return(val);
+ }
+ return CallService(MS_CLIST_MENUDRAWITEM,wParam,lParam);
+}
+
+int ProcessCommandProxy(WPARAM wParam,LPARAM lParam)
+{
+ if (InternalGenMenuModule)
+ {
+ int val;
+ val=CallService(MS_INT_MENUPROCESSCOMMAND,wParam,lParam);
+ if (val) return(val);
+ }
+
+ return CallService(MS_CLIST_MENUPROCESSCOMMAND,wParam,lParam);
+
+}
+
+int ModifyMenuItemProxy(WPARAM wParam,LPARAM lParam)
+{
+ if (InternalGenMenuModule)
+ {
+ int val;
+ val=CallService(MS_INT_MODIFYMENUITEM,wParam,lParam);
+ if (val) return(val);
+ }
+
+ return CallService(MS_CLIST_MODIFYMENUITEM,wParam,lParam);
+}
+
+int InitFramesMenus(void)
+{
+ TMenuParam tmp;
+
+ if (!ServiceExists(MO_REMOVEMENUOBJECT))
+ {
+
+ InitCustomMenus();
+ InternalGenMenuModule=TRUE;
+ }
+
+ if (ServiceExists(MO_REMOVEMENUOBJECT))
+ {
+ CreateServiceFunction("FrameMenuExecService",FrameMenuExecService);
+ CreateServiceFunction("FrameMenuCheckService",FrameMenuCheckService);
+ CreateServiceFunction("FrameMenuFreeService",FreeOwnerDataFrameMenu);
+
+
+ CreateServiceFunction(MS_CLIST_REMOVECONTEXTFRAMEMENUITEM,RemoveContextFrameMenuItem);
+ CreateServiceFunction(MS_CLIST_ADDCONTEXTFRAMEMENUITEM,AddContextFrameMenuItem);
+ CreateServiceFunction(MS_CLIST_MENUBUILDFRAMECONTEXT,BuildContextFrameMenu);
+ CreateServiceFunction(MS_CLIST_FRAMEMENUNOTIFY,ContextFrameMenuNotify);
+ hPreBuildFrameMenuEvent=CreateHookableEvent(ME_CLIST_PREBUILDFRAMEMENU);
+
+ //frame menu object
+ memset(&tmp,0,sizeof(tmp));
+ tmp.cbSize=sizeof(tmp);
+ tmp.CheckService="FrameMenuCheckService";
+ tmp.ExecService="FrameMenuExecService";
+ tmp.name="FrameMenu";
+ hFrameMenuObject=(HANDLE)CallService(MO_CREATENEWMENUOBJECT,0,(LPARAM)&tmp);
+ {
+ OptParam op;
+ op.Handle=hFrameMenuObject;
+ op.Setting=OPT_MENUOBJECT_SET_FREE_SERVICE;
+ op.Value=(INT_PTR)"FrameMenuFreeService";
+ CallService(MO_SETOPTIONSMENUOBJECT,(WPARAM)0,(LPARAM)&op);
+ }
+ }
+ return 0;
+}
diff --git a/plugins/Mwclist/CLUIFrames/statusbar.c b/plugins/Mwclist/CLUIFrames/statusbar.c
new file mode 100644
index 0000000000..4e84805214
--- /dev/null
+++ b/plugins/Mwclist/CLUIFrames/statusbar.c
@@ -0,0 +1,630 @@
+#include "../commonheaders.h"
+
+extern HINSTANCE g_hInst;
+HANDLE hStatusBarShowToolTipEvent,hStatusBarHideToolTipEvent;
+boolean canloadstatusbar=FALSE;
+HWND helperhwnd=0;
+HANDLE hFrameHelperStatusBar;
+extern int CluiProtocolStatusChanged(WPARAM wParam,LPARAM lParam);
+extern INT_PTR GetConnectingIconService (WPARAM wParam,LPARAM lParam);
+extern int CluiProtocolStatusChanged(WPARAM wParam,LPARAM lParam);
+int RecreateStatusBar();
+
+int UseOwnerDrawStatusBar;
+
+
+#define TM_STATUSBAR 23435234
+#define TM_STATUSBARHIDE 23435235
+boolean tooltipshoing;
+WNDPROC OldWindowProc=NULL;
+
+
+POINT lastpnt;
+RECT OldRc={0};
+static HBITMAP hBmpBackground;
+static int backgroundBmpUse;
+static COLORREF bkColour;
+extern BYTE showOpts;
+int extraspace;
+
+int OnStatusBarBackgroundChange()
+{
+ {
+ DBVARIANT dbv;
+ showOpts=DBGetContactSettingByte(NULL,"CLUI","SBarShow",1);
+ bkColour=DBGetContactSettingDword(NULL,"StatusBar","BkColour",CLCDEFAULT_BKCOLOUR);
+ if(hBmpBackground) {DeleteObject(hBmpBackground); hBmpBackground=NULL;}
+ if(DBGetContactSettingByte(NULL,"StatusBar","UseBitmap",CLCDEFAULT_USEBITMAP)) {
+ if(!DBGetContactSettingString(NULL,"StatusBar","BkBitmap",&dbv)) {
+ hBmpBackground=(HBITMAP)CallService(MS_UTILS_LOADBITMAP,0,(LPARAM)dbv.pszVal);
+ mir_free(dbv.pszVal);
+ }
+ }
+ backgroundBmpUse=DBGetContactSettingWord(NULL,"StatusBar","BkBmpUse",CLCDEFAULT_BKBMPUSE);
+ extraspace=DBGetContactSettingDword(NULL,"StatusBar","BkExtraSpace",0);
+ }
+
+ RecreateStatusBar(pcli->hwndContactList);
+ if (pcli->hwndStatus) InvalidateRect(pcli->hwndStatus,NULL,TRUE);
+ return 0;
+}
+
+
+void DrawDataForStatusBar(LPDRAWITEMSTRUCT dis)
+{
+ //LPDRAWITEMSTRUCT dis=(LPDRAWITEMSTRUCT)lParam;
+ ProtocolData *PD=(ProtocolData *)dis->itemData;
+ char *szProto=(char*)dis->itemData;
+ int status,x;
+ SIZE textSize;
+ boolean NeedDestroy=FALSE;
+ HICON hIcon;
+ HRGN hrgn;
+
+
+ if (PD==NULL){return;}
+ if (dis->hDC==NULL) {return;}
+
+ //clip it
+
+ hrgn = CreateRectRgn(dis->rcItem.left, dis->rcItem.top,
+ dis->rcItem.right, dis->rcItem.bottom);
+
+ SelectClipRgn(dis->hDC, hrgn);
+
+ szProto=PD->RealName;
+#ifdef _DEBUG
+ {
+ //char buf[512];
+ //sprintf(buf,"proto: %s draw at pos: %d\r\n",szProto,dis->rcItem.left);
+ //OutputDebugStringA(buf);
+ }
+#endif
+
+ status=CallProtoService(szProto,PS_GETSTATUS,0,0);
+ SetBkMode(dis->hDC,TRANSPARENT);
+ x=dis->rcItem.left+extraspace;
+
+ if(showOpts&1)
+ {
+ if ((DBGetContactSettingByte(NULL,"CLUI","UseConnectingIcon",1)==1) && status < ID_STATUS_OFFLINE)
+ {
+ hIcon=(HICON)GetConnectingIconService((WPARAM)szProto,0);
+
+ if (hIcon)
+ {
+ NeedDestroy=TRUE;
+ }else
+ {
+ hIcon=LoadSkinnedProtoIcon(szProto,status);
+ }
+
+ }else
+ {
+ hIcon=LoadSkinnedProtoIcon(szProto,status);
+ }
+ DrawIconEx(dis->hDC,x,(dis->rcItem.top+dis->rcItem.bottom-GetSystemMetrics(SM_CYSMICON))>>1,hIcon,GetSystemMetrics(SM_CXSMICON),GetSystemMetrics(SM_CYSMICON),0,NULL,DI_NORMAL);
+ if (NeedDestroy) DestroyIcon(hIcon);
+ x+=GetSystemMetrics(SM_CXSMICON)+2;
+ }
+ else x+=2;
+ if(showOpts&2) {
+ TCHAR szName[64];
+
+ PROTOACCOUNT* pa = ProtoGetAccount(szProto);
+ mir_sntprintf(szName, SIZEOF(szName), _T("%s%s"), pa->tszAccountName, showOpts&4 ? _T(" ") : _T(""));
+ GetTextExtentPoint32(dis->hDC, szName, (int)_tcslen(szName), &textSize);
+
+ TextOut(dis->hDC,x,(dis->rcItem.top+dis->rcItem.bottom-textSize.cy)>>1,szName,lstrlen(szName));
+ x+=textSize.cx;
+ }
+ if(showOpts&4) {
+ TCHAR *szStatus = pcli->pfnGetStatusModeDescription(status, 0);
+ if (!szStatus) szStatus = _T("");
+ GetTextExtentPoint32(dis->hDC,szStatus,lstrlen(szStatus),&textSize);
+ TextOut(dis->hDC,x,(dis->rcItem.top+dis->rcItem.bottom-textSize.cy)>>1,szStatus,lstrlen(szStatus));
+ }
+ SelectClipRgn(dis->hDC, NULL);
+ DeleteObject(hrgn);
+}
+
+void DrawBackGround(HWND hwnd,HDC mhdc)
+{
+ HDC hdcMem,hdc;
+ RECT clRect,*rcPaint;
+
+ int yScroll=0;
+ int y;
+ PAINTSTRUCT paintst={0};
+ HBITMAP hBmpOsb,holdbmp;
+ DWORD style=GetWindowLong(hwnd,GWL_STYLE);
+ int grey=0;
+ HFONT oFont;
+ HBRUSH hBrushAlternateGrey=NULL;
+
+ HFONT hFont;
+
+ //InvalidateRect(hwnd,0,FALSE);
+
+ hFont=(HFONT)SendMessage(hwnd,WM_GETFONT,0,0);
+
+ if (mhdc)
+ {
+ hdc=mhdc;
+ rcPaint=NULL;
+ }else
+ {
+ hdc=BeginPaint(hwnd,&paintst);
+ rcPaint=&(paintst.rcPaint);
+ }
+
+ GetClientRect(hwnd,&clRect);
+ if(rcPaint==NULL) rcPaint=&clRect;
+ if (rcPaint->right-rcPaint->left==0||rcPaint->top-rcPaint->bottom==0) rcPaint=&clRect;
+ y=-yScroll;
+ hdcMem=CreateCompatibleDC(hdc);
+ hBmpOsb=CreateBitmap(clRect.right,clRect.bottom,1,GetDeviceCaps(hdc,BITSPIXEL),NULL);
+ holdbmp=SelectObject(hdcMem,hBmpOsb);
+ oFont=SelectObject(hdcMem,hFont);
+ SetBkMode(hdcMem,TRANSPARENT);
+ { HBRUSH hBrush,hoBrush;
+
+ hBrush=CreateSolidBrush(bkColour);
+ hoBrush=(HBRUSH)SelectObject(hdcMem,hBrush);
+ FillRect(hdcMem,rcPaint,hBrush);
+ SelectObject(hdcMem,hoBrush);
+ DeleteObject(hBrush);
+ if(hBmpBackground) {
+ BITMAP bmp;
+ HDC hdcBmp,holdbackbmp;
+ int x,y;
+ int maxx,maxy;
+ int destw,desth;
+
+ GetObject(hBmpBackground,sizeof(bmp),&bmp);
+ hdcBmp=CreateCompatibleDC(hdcMem);
+ holdbackbmp=SelectObject(hdcBmp,hBmpBackground);
+ y=backgroundBmpUse&CLBF_SCROLL?-yScroll:0;
+ maxx=backgroundBmpUse&CLBF_TILEH?clRect.right:1;
+ maxy=backgroundBmpUse&CLBF_TILEV?maxy=rcPaint->bottom:y+1;
+ switch(backgroundBmpUse&CLBM_TYPE) {
+ case CLB_STRETCH:
+ if(backgroundBmpUse&CLBF_PROPORTIONAL) {
+ if(clRect.right*bmp.bmHeight<clRect.bottom*bmp.bmWidth) {
+ desth=clRect.bottom;
+ destw=desth*bmp.bmWidth/bmp.bmHeight;
+ }
+ else {
+ destw=clRect.right;
+ desth=destw*bmp.bmHeight/bmp.bmWidth;
+ }
+ }
+ else {
+ destw=clRect.right;
+ desth=clRect.bottom;
+ }
+ break;
+ case CLB_STRETCHH:
+ if(backgroundBmpUse&CLBF_PROPORTIONAL) {
+ destw=clRect.right;
+ desth=destw*bmp.bmHeight/bmp.bmWidth;
+ }
+ else {
+ destw=clRect.right;
+ desth=bmp.bmHeight;
+ }
+ break;
+ case CLB_STRETCHV:
+ if(backgroundBmpUse&CLBF_PROPORTIONAL) {
+ desth=clRect.bottom;
+ destw=desth*bmp.bmWidth/bmp.bmHeight;
+ }
+ else {
+ destw=bmp.bmWidth;
+ desth=clRect.bottom;
+ }
+ break;
+ default: //clb_topleft
+ destw=bmp.bmWidth;
+ desth=bmp.bmHeight;
+ break;
+ }
+ desth=clRect.bottom -clRect.top;
+ for(;y<maxy;y+=desth) {
+ if(y<rcPaint->top-desth) continue;
+ for(x=0;x<maxx;x+=destw)
+ StretchBlt(hdcMem,x,y,destw,desth,hdcBmp,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);
+ }
+ SelectObject(hdcBmp,holdbackbmp);
+ DeleteDC(hdcBmp);
+ }
+ }
+
+ //call to draw icons
+ {
+ DRAWITEMSTRUCT ds;
+ int nParts,nPanel;
+ ProtocolData *PD;
+ RECT rc,clrc;
+ int startoffset,sectwidth;
+
+ memset(&ds,0,sizeof(ds));
+ ds.hwndItem=hwnd;
+ ds.hDC=hdcMem;
+
+
+ startoffset=DBGetContactSettingDword(NULL,"StatusBar","FirstIconOffset",0);
+ extraspace=DBGetContactSettingDword(NULL,"StatusBar","BkExtraSpace",0);
+
+ nParts=SendMessage(hwnd,SB_GETPARTS,0,0);
+ memset(&rc,0,sizeof(RECT));
+ GetClientRect(hwnd,&clrc);
+ clrc.right-=clrc.left;
+ clrc.right-=startoffset;
+ sectwidth=clrc.right/nParts;
+
+ for (nPanel=0;nPanel<nParts;nPanel++)
+ {
+ PD=(ProtocolData *)SendMessage(pcli->hwndStatus,SB_GETTEXT,(WPARAM)nPanel,(LPARAM)0);
+ if(PD==NULL){
+ continue;
+ }
+ SendMessage(hwnd,SB_GETRECT,(WPARAM)nPanel,(LPARAM)&rc);
+ //rc.left+=startoffset;
+ //if (rc.left>=rc.right) rc.left=rc.right-1;
+ rc.top=0;
+ rc.left=nPanel*sectwidth+startoffset;
+ rc.right=rc.left+sectwidth-1;
+ ds.rcItem=rc;
+ ds.itemData=(ULONG_PTR)PD;
+ ds.itemID=nPanel;
+
+ DrawDataForStatusBar(&ds);
+ } }
+
+ BitBlt(hdc,rcPaint->left,rcPaint->top,rcPaint->right-rcPaint->left,rcPaint->bottom-rcPaint->top,hdcMem,rcPaint->left,rcPaint->top,SRCCOPY);
+
+ SelectObject(hdcMem,holdbmp);
+ SelectObject(hdcMem,oFont);
+ DeleteObject(hBmpOsb);
+ DeleteDC(hdcMem);
+ paintst.fErase=FALSE;
+ //DeleteObject(hFont);
+ if (!mhdc)
+ EndPaint(hwnd,&paintst);
+}
+
+LRESULT CALLBACK StatusBarOwnerDrawProc( HWND hwnd,
+ UINT uMsg,
+ WPARAM wParam,
+ LPARAM lParam
+)
+{
+if (UseOwnerDrawStatusBar)
+{
+ switch(uMsg)
+ {
+ case WM_ERASEBKGND:
+ {
+
+ //DrawBackGround(hwnd);
+ return 0;
+ }
+ case WM_PRINT:
+ {
+ DrawBackGround(hwnd,(HDC)wParam);
+ return 0;
+ }
+ case WM_PAINT:
+ {
+ DrawBackGround(hwnd,0);
+ return 0;
+ }
+ }
+
+}
+return (CallWindowProc(OldWindowProc,hwnd,uMsg,wParam,lParam)
+ );
+}
+
+LRESULT CALLBACK StatusHelperProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ switch(msg)
+ {
+ case WM_CREATE:
+ {
+ {
+ tooltipshoing=FALSE;
+ //HWND label;
+ //label=CreateWindow("static","Top window",WS_VISIBLE|WS_CHILD ,2,2,120,60,hwnd,NULL,g_hInst,0);
+ //SendMessage(label,WM_SETFONT,(WPARAM)TitleBarFont,0);
+ }
+ return(FALSE);
+
+ }
+ case WM_GETMINMAXINFO:{
+ RECT rct;
+ if (pcli->hwndStatus==0){break;}
+ GetWindowRect(pcli->hwndStatus,&rct);
+ memset((LPMINMAXINFO)lParam,0,sizeof(MINMAXINFO));
+ ((LPMINMAXINFO)lParam)->ptMinTrackSize.x=5;
+ ((LPMINMAXINFO)lParam)->ptMinTrackSize.y=rct.bottom-rct.top;
+ ((LPMINMAXINFO)lParam)->ptMaxTrackSize.x=1600;
+ ((LPMINMAXINFO)lParam)->ptMaxTrackSize.y=rct.bottom-rct.top;
+ return(0);
+ }
+
+ case WM_NCHITTEST:
+ {
+
+ }
+ case WM_SHOWWINDOW:
+ {
+ {
+ int res;
+ if (hFrameHelperStatusBar)
+ {
+ res=CallService(MS_CLIST_FRAMES_GETFRAMEOPTIONS, MAKEWPARAM(FO_FLAGS,hFrameHelperStatusBar),0);
+ DBWriteContactSettingByte(0,"CLUI","ShowSBar",(BYTE)((res&F_VISIBLE)?1:0));
+ }
+ }
+
+
+ if (tooltipshoing){
+ NotifyEventHooks(hStatusBarHideToolTipEvent,0,0);
+ tooltipshoing=FALSE;
+ }
+ return(0);
+ //
+ }
+ case WM_TIMER:
+ {
+ if (wParam==TM_STATUSBARHIDE)
+ {
+ KillTimer(hwnd,TM_STATUSBARHIDE);
+
+ if (tooltipshoing){
+ NotifyEventHooks(hStatusBarHideToolTipEvent,0,0);
+ tooltipshoing=FALSE;
+ }
+
+
+ }
+
+ if (wParam==TM_STATUSBAR)
+ {
+ POINT pt;
+ KillTimer(hwnd,TM_STATUSBAR);
+
+ GetCursorPos(&pt);
+ if (pt.x==lastpnt.x&&pt.y==lastpnt.y)
+ {
+ {
+ int i,nParts;
+ ProtocolData *PD;
+ RECT rc;
+ ScreenToClient(pcli->hwndStatus,&pt);
+ nParts=SendMessage(pcli->hwndStatus,SB_GETPARTS,0,0);
+ for(i=0;i<nParts;i++) {
+ SendMessage(pcli->hwndStatus,SB_GETRECT,i,(LPARAM)&rc);
+ if(PtInRect(&rc,pt)) {
+ PD=(ProtocolData *)SendMessage(pcli->hwndStatus,SB_GETTEXT,i,(LPARAM)0);
+ if(PD==NULL){return(0);}
+
+ NotifyEventHooks(hStatusBarShowToolTipEvent,(WPARAM)PD->RealName,0);
+ SetTimer(hwnd,TM_STATUSBARHIDE,DBGetContactSettingWord(NULL,"CLUIFrames","HideToolTipTime",5000),0);
+ tooltipshoing=TRUE;
+
+ break;
+ }
+ }
+
+
+
+ }
+
+
+
+ }
+
+ }
+
+ return(0);
+ }
+
+ case WM_SETCURSOR:
+ {
+
+ {
+ POINT pt;
+ GetCursorPos(&pt);
+ if (pt.x==lastpnt.x&&pt.y==lastpnt.y)
+ {
+ return(0);
+ }
+ lastpnt=pt;
+ if (tooltipshoing){
+ KillTimer(hwnd,TM_STATUSBARHIDE);
+ NotifyEventHooks(hStatusBarHideToolTipEvent,0,0);
+ tooltipshoing=FALSE;
+ }
+ KillTimer(hwnd,TM_STATUSBAR);
+ SetTimer(hwnd,TM_STATUSBAR,DBGetContactSettingWord(NULL,"CLC","InfoTipHoverTime",750),0);
+ return(0);
+ }
+
+ }
+ case WM_NOTIFY:
+ {
+ if (lParam==0){return(0);}
+ if (((LPNMHDR)lParam)->hwndFrom == pcli->hwndStatus)
+ {
+
+ if (((LPNMHDR)lParam)->code == WM_NCHITTEST)
+ {
+ LPNMMOUSE lpnmmouse = (LPNMMOUSE) lParam;
+ /*
+ {
+ GetCursorPos(&lastpnt);
+ if (tooltipshoing){
+ KillTimer(hwnd,TM_STATUSBARHIDE);
+ NotifyEventHooks(hStatusBarHideToolTipEvent,0,0);
+ tooltipshoing=FALSE;
+ }
+ KillTimer(hwnd,TM_STATUSBAR);
+ SetTimer(hwnd,TM_STATUSBAR,DBGetContactSettingWord(NULL,"CLC","InfoTipHoverTime",750),0);
+ return(0);
+ }
+ */
+ } ;
+ }
+ }
+
+
+
+
+ case WM_CONTEXTMENU:
+ KillTimer(hwnd,TM_STATUSBARHIDE);
+
+ if (tooltipshoing){
+ NotifyEventHooks(hStatusBarHideToolTipEvent,0,0);
+ }
+ tooltipshoing=FALSE;
+
+
+ case WM_MEASUREITEM:
+ case WM_DRAWITEM:
+ {
+ //parent do all work for us
+ return(SendMessage(pcli->hwndContactList,msg,wParam,lParam));
+ }
+/*
+ case WM_PAINT:
+ {
+ return(0);
+ }
+*/
+ case WM_MOVE:
+ PostMessage(pcli->hwndStatus,WM_MOVE,wParam,lParam);
+ case WM_SIZE:
+ {
+ RECT rc;
+ int b;
+ if (pcli->hwndStatus!=0)
+ {
+
+
+
+ GetClientRect(hwnd,&rc);
+
+ b=LOWORD(lParam);
+ if (b!=0&&(rc.right-rc.left)!=(OldRc.right-OldRc.left))
+ {
+ OldRc=rc;
+ if (canloadstatusbar)
+ {
+ if(DBGetContactSettingByte(NULL,"CLUI","UseOwnerDrawStatusBar",0)||DBGetContactSettingByte(NULL,"CLUI","EqualSections",1)) {
+ CluiProtocolStatusChanged(0,0);
+ }
+ }
+ }
+ if(msg==WM_SIZE) PostMessage(pcli->hwndStatus,WM_SIZE,wParam,lParam);
+ if (pcli->hwndStatus!=0) InvalidateRect(pcli->hwndStatus,NULL,TRUE);
+ return(0);
+ }
+ }
+
+ default:
+ return DefWindowProc(hwnd, msg, wParam, lParam);
+
+ }
+ return DefWindowProc(hwnd, msg, wParam, lParam);
+}
+
+HWND CreateStatusHelper(HWND parent)
+{
+ WNDCLASS wndclass={0};
+ TCHAR pluginname[] = _T("Statushelper");
+
+ if (GetClassInfo(g_hInst,pluginname,&wndclass) == 0 ) {
+ wndclass.style = 0;
+ wndclass.lpfnWndProc = StatusHelperProc;
+ wndclass.cbClsExtra = 0;
+ wndclass.cbWndExtra = 0;
+ wndclass.hInstance = g_hInst;
+ wndclass.hIcon = NULL;
+ wndclass.hCursor = LoadCursor (NULL, IDC_ARROW);
+ wndclass.hbrBackground = (HBRUSH)(COLOR_3DFACE+1);
+ wndclass.lpszMenuName = NULL;
+ wndclass.lpszClassName = pluginname;
+ RegisterClass(&wndclass);
+ }
+
+ return(CreateWindow(pluginname,pluginname,
+ /*WS_THICKFRAME|*/WS_CHILD|WS_VISIBLE|WS_CLIPCHILDREN,
+ 0,0,0,0,parent,NULL,g_hInst,NULL));
+}
+
+HANDLE CreateStatusBarFrame()
+{
+ CLISTFrame Frame;
+ int h;
+ RECT rc;
+
+ memset(&Frame,0,sizeof(Frame));
+ Frame.cbSize=sizeof(CLISTFrame);
+ Frame.hWnd=helperhwnd;
+ Frame.align=alBottom;
+ Frame.hIcon=LoadSkinnedIcon (SKINICON_OTHER_MIRANDA);
+ Frame.Flags=(DBGetContactSettingByte(NULL,"CLUI","ShowSBar",1)?F_VISIBLE:0)|F_LOCKED|F_NOBORDER|F_TCHAR;
+ GetWindowRect(helperhwnd,&rc);
+ h=rc.bottom-rc.top;
+ Frame.height=(h==0)?20:h;
+
+
+ Frame.tname=_T("Status");
+ Frame.TBtname=TranslateT("Status Bar");
+ hFrameHelperStatusBar=(HANDLE)CallService(MS_CLIST_FRAMES_ADDFRAME,(WPARAM)&Frame,(LPARAM)0);
+
+
+ return hFrameHelperStatusBar;
+}
+
+int RecreateStatusBar(HWND parent)
+{
+ if (pcli->hwndStatus) {
+ FreeProtocolData();
+ DestroyWindow(pcli->hwndStatus);
+ }
+ pcli->hwndStatus=0;
+ if (hFrameHelperStatusBar) CallService(MS_CLIST_FRAMES_REMOVEFRAME,(WPARAM)hFrameHelperStatusBar,0);
+
+ helperhwnd=CreateStatusHelper(parent);
+ UseOwnerDrawStatusBar=DBGetContactSettingByte(NULL,"CLUI","UseOwnerDrawStatusBar",0);
+
+ //create the status wnd
+ pcli->hwndStatus = CreateStatusWindow(
+ ( DBGetContactSettingByte(0,"CLUI","SBarUseSizeGrip",TRUE) && (!UseOwnerDrawStatusBar)?SBARS_SIZEGRIP:0)|
+ WS_CHILD | (DBGetContactSettingByte(NULL,"CLUI","ShowSBar",1)?WS_VISIBLE:0), _T(""), helperhwnd, 0);
+
+ OldWindowProc=(WNDPROC)GetWindowLongPtr(pcli->hwndStatus,GWLP_WNDPROC);
+ SetWindowLongPtr(pcli->hwndStatus,GWLP_WNDPROC,(LONG_PTR)&StatusBarOwnerDrawProc);
+ CreateStatusBarFrame();
+ {
+ SetWindowPos(helperhwnd,NULL,1,1,1,1,SWP_NOZORDER);
+ CluiProtocolStatusChanged(0,0);
+ CallService(MS_CLIST_FRAMES_UPDATEFRAME,-1,0);
+ }
+
+ return 0;
+}
+
+HWND CreateStatusBarhWnd(HWND parent)
+{
+ RecreateStatusBar(parent);
+ OnStatusBarBackgroundChange();
+
+ hStatusBarShowToolTipEvent=CreateHookableEvent(ME_CLIST_FRAMES_SB_SHOW_TOOLTIP);
+ hStatusBarHideToolTipEvent=CreateHookableEvent(ME_CLIST_FRAMES_SB_HIDE_TOOLTIP);
+ return pcli->hwndStatus;
+}
diff --git a/plugins/Mwclist/IcoLib.h b/plugins/Mwclist/IcoLib.h
new file mode 100644
index 0000000000..bc8261d661
--- /dev/null
+++ b/plugins/Mwclist/IcoLib.h
@@ -0,0 +1,35 @@
+typedef struct {
+ int cbSize;
+ char *pszSection; //section name used to group icons
+ char *pszDescription; //description for options dialog
+ char *pszName; //name to refer to icon when playing and in db
+ char *pszDefaultFile; //default icon file to use
+ int iDefaultIndex;
+} SKINICONDESC;
+
+typedef struct {
+ int cbSize;
+ char *pszSection; //section name used to group icons
+ char *pszDescription; //description for options dialog
+ char *pszName; //name to refer to icon when playing and in db
+ char *pszDefaultFile; //default icon file to use
+ int iDefaultIndex;
+ HICON hDefaultIcon;
+} SKINICONDESC2;
+
+//
+// Add a icon into options UI
+//
+// wParam = (WPARAM)0
+// lParam = (LPARAM)(SKINICONDESC*)sid;
+//
+#define MS_SKIN2_ADDICON "Skin2/Icons/AddIcon"
+//
+// Retrieve HICON with name specified in lParam
+// Returned HICON SHOULDN'T be destroyed, it managed by IcoLib
+//
+#define MS_SKIN2_GETICON "Skin2/Icons/GetIcon"
+//
+// Icons change notification
+//
+#define ME_SKIN2_ICONSCHANGED "Skin2/IconsChanged"
diff --git a/plugins/Mwclist/clc.c b/plugins/Mwclist/clc.c
new file mode 100644
index 0000000000..831e4e5eb6
--- /dev/null
+++ b/plugins/Mwclist/clc.c
@@ -0,0 +1,292 @@
+/*
+
+Miranda IM: the free IM client for Microsoft* Windows*
+
+Copyright 2000-2003 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 "commonheaders.h"
+
+int DefaultImageListColorDepth=ILC_COLOR32;
+
+HIMAGELIST himlCListClc;
+
+static HANDLE hSettingChanged1;
+
+int BgStatusBarChange(WPARAM wParam,LPARAM lParam);
+
+int BgClcChange(WPARAM wParam,LPARAM lParam);
+int OnFrameTitleBarBackgroundChange(WPARAM wParam,LPARAM lParam);
+
+void InitDisplayNameCache(SortedList *list);
+void FreeDisplayNameCache(SortedList *list);
+void LoadExtraImageFunc( void );
+
+void LoadExtraImageFunc( void );
+void UnloadCLUIModule( void );
+
+extern int sortByStatus;
+struct ClcContact * hitcontact=NULL;
+
+extern LRESULT ( CALLBACK *saveContactListControlWndProc )(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
+
+static int stopStatusUpdater = 0;
+void StatusUpdaterThread(HWND hwndDlg)
+{
+ int i,curdelay,lastcheck=0;
+ HANDLE hContact = (HANDLE) CallService(MS_DB_CONTACT_FINDFIRST, 0, 0);
+
+ SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_LOWEST);
+
+ while (!stopStatusUpdater) {
+ curdelay=DBGetContactSettingByte(hContact,"CList","StatusMsgAutoDelay",15000);
+ if (curdelay<5000) curdelay=5000;
+
+ if ((int)(GetTickCount()-lastcheck)>curdelay)
+ {
+ lastcheck=GetTickCount();
+ if (DBGetContactSettingByte(hContact,"CList","StatusMsgAuto",0)) {
+ for (i=0; i<5; i++) {
+ if (hContact!=NULL) {
+ pdisplayNameCacheEntry pdnce =(pdisplayNameCacheEntry)pcli->pfnGetCacheEntry((HANDLE)hContact);
+ if (pdnce && !pdnce->protoNotExists && pdnce->szProto)
+ {
+ CallContactService(hContact, PSS_GETAWAYMSG, 0, 0);
+ }
+ hContact = (HANDLE) CallService(MS_DB_CONTACT_FINDNEXT, (WPARAM) hContact, 0);
+ }
+ if (hContact==NULL) {
+ hContact = (HANDLE) CallService(MS_DB_CONTACT_FINDFIRST, 0, 0);
+ if (hContact==NULL) break;
+ }
+ Sleep(500);
+ }
+ }
+ }
+ //Sleep(DBGetContactSettingByte(hContact,"CList","StatusMsgAutoDelay",100));
+ Sleep(200);
+ }
+}
+
+HMENU BuildGroupPopupMenu( struct ClcGroup* group )
+{
+ return (HMENU)CallService(MS_CLIST_MENUBUILDSUBGROUP,(WPARAM)group,0);
+}
+
+void SortClcByTimer (HWND hwnd)
+{
+ KillTimer(hwnd,TIMERID_DELAYEDRESORTCLC);
+ SetTimer(hwnd,TIMERID_DELAYEDRESORTCLC,DBGetContactSettingByte(NULL,"CLUI","DELAYEDTIMER",200),NULL);
+}
+
+static int ClcSettingChanged(WPARAM wParam, LPARAM lParam)
+{
+ DBCONTACTWRITESETTING *cws=(DBCONTACTWRITESETTING*)lParam;
+
+ if ((HANDLE)wParam != NULL && !strcmp(cws->szModule,"MetaContacts") && !strcmp(cws->szSetting,"Handle"))
+ pcli->pfnClcBroadcast( INTM_NAMEORDERCHANGED, 0, 0 );
+
+ if ((HANDLE)wParam!=NULL&&!strcmp(cws->szModule,"CList")) {
+ if( !strcmp( cws->szSetting, "noOffline" ))
+ pcli->pfnClcBroadcast( INTM_NAMEORDERCHANGED, wParam, lParam );
+ else if(!strcmp(cws->szSetting,"StatusMsg"))
+ pcli->pfnClcBroadcast( INTM_STATUSMSGCHANGED, wParam, lParam );
+ }
+ return 0;
+}
+
+static int ClcModulesLoaded(WPARAM wParam,LPARAM lParam)
+{
+ CallService(MS_BACKGROUNDCONFIG_REGISTER,(WPARAM)"StatusBar Background/StatusBar",0);
+ CallService(MS_BACKGROUNDCONFIG_REGISTER,(WPARAM)"List Background/CLC",0);
+ CallService(MS_BACKGROUNDCONFIG_REGISTER,(WPARAM)"Frames TitleBar BackGround/FrameTitleBar",0);
+ HookEvent(ME_BACKGROUNDCONFIG_CHANGED,BgClcChange);
+ HookEvent(ME_BACKGROUNDCONFIG_CHANGED,BgStatusBarChange);
+ HookEvent(ME_BACKGROUNDCONFIG_CHANGED,OnFrameTitleBarBackgroundChange);
+ return 0;
+}
+
+static int ClcShutdown(WPARAM wParam, LPARAM lParam)
+{
+ UnhookEvent(hSettingChanged1);
+ UnloadCLUIModule();
+ return 0;
+}
+
+LRESULT CALLBACK ContactListControlWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ struct ClcData *dat = (struct ClcData*)GetWindowLongPtr(hwnd,0);
+ if ( msg >= CLM_FIRST && msg < CLM_LAST )
+ return pcli->pfnProcessExternalMessages(hwnd,dat,msg,wParam,lParam);
+
+ switch (msg) {
+ case WM_CREATE:
+ dat = (struct ClcData*)mir_calloc( sizeof(struct ClcData));
+ SetWindowLong(hwnd,0,(LPARAM)dat);
+ InitDisplayNameCache(&dat->lCLCContactsCache);
+ break;
+
+ case INTM_ICONCHANGED:
+ { struct ClcContact *contact=NULL;
+ struct ClcGroup *group=NULL;
+ int recalcScrollBar=0,shouldShow;
+ HANDLE hSelItem=NULL;
+ struct ClcContact *selcontact=NULL;
+ pdisplayNameCacheEntry cacheEntry = GetContactFullCacheEntry((HANDLE)wParam);
+
+ WORD status;
+ int NeedResort=0;
+
+ char *szProto = cacheEntry->szProto;
+ if(szProto==NULL) status=ID_STATUS_OFFLINE;
+ else status=cacheEntry->status;
+
+ shouldShow=(GetWindowLong(hwnd,GWL_STYLE)&CLS_SHOWHIDDEN || !cacheEntry->Hidden) && (!pcli->pfnIsHiddenMode(dat,status)||cacheEntry->noHiddenOffline || CallService(MS_CLIST_GETCONTACTICON,wParam,0)!=LOWORD(lParam)); //this means an offline msg is flashing, so the contact should be shown
+ if(!FindItem(hwnd,dat,(HANDLE)wParam,&contact,&group,NULL)) {
+ if(shouldShow && CallService(MS_DB_CONTACT_IS, wParam, 0)) {
+ if(dat->selection>=0 && GetRowByIndex(dat,dat->selection,&selcontact,NULL)!=-1)
+ hSelItem=pcli->pfnContactToHItem(selcontact);
+ AddContactToTree(hwnd,dat,(HANDLE)wParam,0,0);
+ NeedResort=1;
+ recalcScrollBar=1;
+ FindItem(hwnd,dat,(HANDLE)wParam,&contact,NULL,NULL);
+ if (contact) {
+ contact->iImage=(WORD)lParam;
+ pcli->pfnNotifyNewContact(hwnd,(HANDLE)wParam);
+ dat->NeedResort=1;
+ }
+ }
+ }
+ else {
+ //item in list already
+ DWORD style=GetWindowLong(hwnd,GWL_STYLE);
+ if(contact->iImage== (WORD)lParam) break;
+ if (sortByStatus) dat->NeedResort=1;
+
+ if(!shouldShow && !(style&CLS_NOHIDEOFFLINE) && (style&CLS_HIDEOFFLINE || group->hideOffline)) {
+ if(dat->selection>=0 && GetRowByIndex(dat,dat->selection,&selcontact,NULL)!=-1)
+ hSelItem=pcli->pfnContactToHItem(selcontact);
+ RemoveItemFromGroup(hwnd,group,contact,0);
+ recalcScrollBar=1;
+ dat->NeedResort=1;
+ }
+ else {
+ int oldflags;
+ contact->iImage=(WORD)lParam;
+ oldflags=contact->flags;
+ if(!pcli->pfnIsHiddenMode(dat,status)||cacheEntry->noHiddenOffline) contact->flags|=CONTACTF_ONLINE;
+ else contact->flags&=~CONTACTF_ONLINE;
+ if (oldflags!=contact->flags)
+ dat->NeedResort=1;
+ } }
+ if(hSelItem) {
+ struct ClcGroup *selgroup;
+ if(FindItem(hwnd,dat,hSelItem,&selcontact,&selgroup,NULL))
+ dat->selection=GetRowsPriorTo(&dat->list,selgroup,li.List_IndexOf((SortedList*)&selgroup->cl, selcontact));
+ else
+ dat->selection=-1;
+ }
+
+ SortClcByTimer(hwnd);
+ if(recalcScrollBar) RecalcScrollBar(hwnd,dat);
+ goto LBL_Exit;
+ }
+ case INTM_STATUSMSGCHANGED:
+ { struct ClcContact *contact=NULL;
+ struct ClcGroup *group=NULL;
+ DBVARIANT dbv;
+
+ if (!(dat->style&CLS_SHOWSTATUSMESSAGES)) break;
+ if(FindItem(hwnd,dat,(HANDLE)wParam,&contact,&group,NULL) && contact!=NULL) {
+ contact->flags &= ~CONTACTF_STATUSMSG;
+ if (!DBGetContactSettingTString((HANDLE)wParam, "CList", "StatusMsg", &dbv)) {
+ int j;
+ if (dbv.ptszVal==NULL||_tcslen(dbv.ptszVal)==0) break;
+ lstrcpyn(contact->szStatusMsg, dbv.ptszVal, SIZEOF(contact->szStatusMsg));
+ for (j=(int)_tcslen(contact->szStatusMsg)-1;j>=0;j--) {
+ if (contact->szStatusMsg[j]=='\r' || contact->szStatusMsg[j]=='\n' || contact->szStatusMsg[j]=='\t') {
+ contact->szStatusMsg[j] = ' ';
+ }
+ }
+ DBFreeVariant(&dbv);
+ if (_tcslen(contact->szStatusMsg)>0) {
+ contact->flags |= CONTACTF_STATUSMSG;
+ dat->NeedResort=TRUE;
+ }
+ }
+ }
+
+ InvalidateRect(hwnd,NULL,TRUE);
+
+ SortClcByTimer(hwnd);
+ RecalcScrollBar(hwnd,dat);
+ goto LBL_Exit;
+ }
+ case WM_TIMER:
+ if (wParam==TIMERID_DELAYEDREPAINT) {
+ KillTimer(hwnd,TIMERID_DELAYEDREPAINT);
+ InvalidateRect(hwnd,NULL,FALSE);
+ break;
+ }
+
+ if ( wParam == TIMERID_SUBEXPAND) {
+ KillTimer(hwnd,TIMERID_SUBEXPAND);
+ if (hitcontact) {
+ if (hitcontact->SubExpanded) hitcontact->SubExpanded=0; else hitcontact->SubExpanded=1;
+ DBWriteContactSettingByte(hitcontact->hContact,"CList","Expanded",hitcontact->SubExpanded);
+ }
+ hitcontact=NULL;
+ dat->NeedResort=1;
+ SortCLC(hwnd,dat,1);
+ RecalcScrollBar(hwnd,dat);
+ break;
+ }
+ break;
+
+ case WM_DESTROY:
+ FreeDisplayNameCache(&dat->lCLCContactsCache);
+ stopStatusUpdater = 1;
+ break;
+ }
+
+ { LRESULT res = saveContactListControlWndProc(hwnd, msg, wParam, lParam);
+ switch (msg) {
+ case WM_CREATE:
+ mir_forkthread(StatusUpdaterThread,0);
+ break;
+ }
+ return res;
+ }
+
+LBL_Exit:
+ return DefWindowProc(hwnd, msg, wParam, lParam);
+}
+
+int LoadCLCModule(void)
+{
+ LoadCLUIFramesModule();
+ LoadExtraImageFunc();
+
+ himlCListClc=(HIMAGELIST)CallService(MS_CLIST_GETICONSIMAGELIST,0,0);
+
+ HookEvent(ME_SYSTEM_MODULESLOADED,ClcModulesLoaded);
+ hSettingChanged1=HookEvent(ME_DB_CONTACT_SETTINGCHANGED,ClcSettingChanged);
+ HookEvent(ME_OPT_INITIALISE,ClcOptInit);
+ HookEvent(ME_SYSTEM_SHUTDOWN,ClcShutdown);
+ return 0;
+}
diff --git a/plugins/Mwclist/clc.h b/plugins/Mwclist/clc.h
new file mode 100644
index 0000000000..8083b91dec
--- /dev/null
+++ b/plugins/Mwclist/clc.h
@@ -0,0 +1,206 @@
+/*
+
+Miranda IM: the free IM client for Microsoft* Windows*
+
+Copyright 2000-2003 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 _CLC_H_
+#define _CLC_H_
+
+#define CLB_TOPLEFT 0
+#define CLB_STRETCHV 1
+#define CLB_STRETCHH 2 //and tile vertically
+#define CLB_STRETCH 3
+
+#define CLBM_TYPE 0x00FF
+
+#define CLBF_TILEH 0x1000
+#define CLBF_TILEV 0x2000
+#define CLBF_PROPORTIONAL 0x4000
+#define CLBF_SCROLL 0x8000
+#define CLBF_TILEVTOROWHEIGHT 0x0100
+
+#define FONTID_CONTACTS 0
+#define FONTID_INVIS 1
+#define FONTID_OFFLINE 2
+#define FONTID_NOTONLIST 3
+#define FONTID_GROUPS 4
+#define FONTID_GROUPCOUNTS 5
+#define FONTID_DIVIDERS 6
+#define FONTID_OFFINVIS 7
+#define FONTID_STATUSMSG 8
+#define FONTID_GROUPSCLOSED 9
+#define FONTID_CONTACTSHOVER 10
+
+#define TIMERID_DELAYEDREPAINT 16
+#define TIMERID_SUBEXPAND 21
+
+#define CONTACTF_STATUSMSG 64
+
+#define INTM_STATUSMSGCHANGED (WM_USER+26)
+
+#define CLS_SHOWSTATUSMESSAGES 0x800
+
+#define CLS_EX_MULTICOLUMNALIGNLEFT 0x00001000
+
+#define MAXSTATUSMSGLEN 256
+
+struct ClcContact {
+ BYTE type;
+ BYTE flags;
+ union {
+ struct {
+ WORD iImage;
+ HANDLE hContact;
+ };
+ struct {
+ WORD groupId;
+ struct ClcGroup *group;
+ };
+ };
+ BYTE iExtraImage[MAXEXTRACOLUMNS];
+ TCHAR szText[120-MAXEXTRACOLUMNS];
+ char * proto; // MS_PROTO_GETBASEPROTO
+
+ struct ClcContact *subcontacts;
+ BYTE SubAllocated;
+ BYTE SubExpanded;
+ BYTE isSubcontact;
+ TCHAR szStatusMsg[MAXSTATUSMSGLEN];
+};
+
+struct ClcData {
+ struct ClcGroup list;
+ int rowHeight;
+ int yScroll;
+ int selection;
+ struct ClcFontInfo fontInfo[FONTID_MAX+1];
+ int scrollTime;
+ HIMAGELIST himlHighlight;
+ int groupIndent;
+ TCHAR szQuickSearch[128];
+ int iconXSpace;
+ HWND hwndRenameEdit;
+ COLORREF bkColour,selBkColour,selTextColour,hotTextColour,quickSearchColour;
+ int iDragItem,iInsertionMark;
+ int dragStage;
+ POINT ptDragStart;
+ int dragAutoScrolling;
+ int dragAutoScrollHeight;
+ int leftMargin;
+ int insertionMarkHitHeight;
+ HBITMAP hBmpBackground;
+ int backgroundBmpUse,bkChanged;
+ int iHotTrack;
+ int gammaCorrection;
+ DWORD greyoutFlags; //see m_clc.h
+ DWORD offlineModes;
+ DWORD exStyle;
+ POINT ptInfoTip;
+ int infoTipTimeout;
+ HANDLE hInfoTipItem;
+ HIMAGELIST himlExtraColumns;
+ int extraColumnsCount;
+ int extraColumnSpacing;
+ int checkboxSize;
+ int showSelAlways;
+ int showIdle;
+ int noVScrollbar;
+ int useWindowsColours;
+ int NeedResort;
+
+ DWORD style;
+ SortedList lCLCContactsCache;
+ BYTE HiLightMode;
+ BYTE doubleClickExpand;
+ int MetaIgnoreEmptyExtra;
+};
+
+//clcidents.c
+int GetRowsPriorTo(struct ClcGroup *group,struct ClcGroup *subgroup,int contactIndex);
+int FindItem(HWND hwnd,struct ClcData *dat,HANDLE hItem,struct ClcContact **contact,struct ClcGroup **subgroup,int *isVisible);
+int GetRowByIndex(struct ClcData *dat,int testindex,struct ClcContact **contact,struct ClcGroup **subgroup);
+void ClearRowByIndexCache();
+
+//clcitems.c
+struct ClcGroup *AddGroup(HWND hwnd,struct ClcData *dat,const TCHAR *szName,DWORD flags,int groupId,int calcTotalMembers);
+void FreeGroup(struct ClcGroup *group);
+int AddInfoItemToGroup(struct ClcGroup *group,int flags,const TCHAR *pszText);
+void FreeContact(struct ClcContact *p);
+void RebuildEntireList(HWND hwnd,struct ClcData *dat);
+struct ClcGroup *RemoveItemFromGroup(HWND hwnd,struct ClcGroup *group,struct ClcContact *contact,int updateTotalCount);
+void DeleteItemFromTree(HWND hwnd,HANDLE hItem);
+void AddContactToTree(HWND hwnd,struct ClcData *dat,HANDLE hContact,int updateTotalCount,int checkHideOffline);
+void SortCLC(HWND hwnd,struct ClcData *dat,int useInsertionSort);
+int GetGroupContentsCount(struct ClcGroup *group,int visibleOnly);
+int GetNewSelection(struct ClcGroup *group,int selection, int direction);
+void SaveStateAndRebuildList(HWND hwnd,struct ClcData *dat);
+
+//clcmsgs.c
+LRESULT ProcessExternalMessages(HWND hwnd,struct ClcData *dat,UINT msg,WPARAM wParam,LPARAM lParam);
+
+//clcutils.c
+void RecalcScrollBar(HWND hwnd,struct ClcData *dat);
+void BeginRenameSelection(HWND hwnd,struct ClcData *dat);
+int HitTest(HWND hwnd,struct ClcData *dat,int testx,int testy,struct ClcContact **contact,struct ClcGroup **group,DWORD *flags);
+void ScrollTo(HWND hwnd,struct ClcData *dat,int desty,int noSmooth);
+void LoadClcOptions(HWND hwnd,struct ClcData *dat);
+
+//clcpaint.c
+void PaintClc(HWND hwnd,struct ClcData *dat,HDC hdc,RECT *rcPaint);
+
+//clcopts.c
+int ClcOptInit(WPARAM wParam,LPARAM lParam);
+
+//clcfiledrop.c
+void InitFileDropping(void);
+void FreeFileDropping(void);
+void RegisterFileDropping(HWND hwnd);
+void UnregisterFileDropping(HWND hwnd);
+
+//cluiservices.c
+void FreeProtocolData( void );
+
+int GetContactCachedStatus(HANDLE hContact);
+char *GetContactCachedProtocol(HANDLE hContact);
+
+#define CLUI_SetDrawerService "CLUI/SETDRAWERSERVICE"
+typedef struct {
+ int cbSize;
+ char *PluginName;
+ char *Comments;
+ char *GetDrawFuncsServiceName;
+
+} DrawerServiceStruct,*pDrawerServiceStruct ;
+
+#define CLUI_EXT_FUNC_PAINTCLC 1
+
+typedef struct {
+ int cbSize;
+ void (*PaintClc)(HWND,struct ClcData *,HDC,RECT *,int ,ClcProtoStatus *,HIMAGELIST);
+
+} ExternDrawer,*pExternDrawer ;
+
+ExternDrawer SED;
+
+#define CLM_SETEXTRACOLUMNSSPACE (CLM_FIRST+73) //wParam=extra space between icons
+
+void FreeAndNil( void** p );
+
+#endif /* _CLC_H_ */
diff --git a/plugins/Mwclist/clcidents.c b/plugins/Mwclist/clcidents.c
new file mode 100644
index 0000000000..be6be4c2d6
--- /dev/null
+++ b/plugins/Mwclist/clcidents.c
@@ -0,0 +1,338 @@
+/*
+
+Miranda IM: the free IM client for Microsoft* Windows*
+
+Copyright 2000-2003 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 "commonheaders.h"
+#include "m_clc.h"
+#include "clc.h"
+
+/* the CLC uses 3 different ways to identify elements in its list, this file
+contains routines to convert between them.
+
+1) struct ClcContact/struct ClcGroup pair. Only ever used within the duration
+of a single operation, but used at some point in nearly everything
+2) index integer. The 0-based number of the item from the top. Only visible
+items are counted (ie not closed groups). Used for saving selection and drag
+highlight
+3) hItem handle. Either the hContact or (hGroup|HCONTACT_ISGROUP). Used
+exclusively externally
+
+1->2: GetRowsPriorTo()
+1->3: ContactToHItem()
+3->1: FindItem()
+2->1: GetRowByIndex()
+*/
+
+int GetRowsPriorTo(struct ClcGroup *group,struct ClcGroup *subgroup,int contactIndex)
+{
+ int count=0;
+
+ group->scanIndex=0;
+ for(;;) {
+ if(group->scanIndex==group->cl.count) {
+ group=group->parent;
+ if(group==NULL) break;
+ group->scanIndex++;
+ continue;
+ }
+ if(group==subgroup && contactIndex==group->scanIndex) return count;
+ count++;
+ if ((group->cl.items[group->scanIndex]->type==CLCIT_CONTACT) && (group->cl.items[group->scanIndex]->flags & CONTACTF_STATUSMSG)) {
+ count++;
+ }
+
+ if(group->cl.items[group->scanIndex]->type==CLCIT_GROUP) {
+ if(group->cl.items[group->scanIndex]->group==subgroup && contactIndex==-1)
+ return count-1;
+ if(group->cl.items[group->scanIndex]->group->expanded) {
+ group=group->cl.items[group->scanIndex]->group;
+ group->scanIndex=0;
+ continue;
+ }
+ }
+ if(group->cl.items[group->scanIndex]->type==CLCIT_CONTACT)
+ {
+ count+=group->cl.items[group->scanIndex]->SubAllocated*group->cl.items[group->scanIndex]->SubExpanded;
+ }
+ group->scanIndex++;
+ }
+ return -1;
+}
+
+pdisplayNameCacheEntry GetCLCFullCacheEntry(struct ClcData *dat,HANDLE hContact)
+{
+ int idx;
+ displayNameCacheEntry dnce, *pdnce,*pdnce2;
+
+ if (hContact==0) return NULL;
+ dnce.hContact=hContact;
+
+ pdnce=li.List_Find(&dat->lCLCContactsCache,&dnce);
+
+ if (pdnce==NULL)
+ {
+ pdnce=mir_calloc(sizeof(displayNameCacheEntry));
+ pdnce->hContact=hContact;
+ li.List_GetIndex(&dat->lCLCContactsCache,pdnce,&idx);
+ li.List_Insert(&dat->lCLCContactsCache,pdnce,idx);
+
+ pdnce2=li.List_Find(&dat->lCLCContactsCache,&dnce);//for check
+ if (pdnce2->hContact!=pdnce->hContact)
+ {
+ return (NULL);
+ }
+
+ if (pdnce2!=pdnce)
+ {
+ return (NULL);
+ }
+ }
+
+ return (pdnce);
+}
+
+void ClearClcContactCache(struct ClcData *dat,HANDLE hContact)
+{
+
+ pdisplayNameCacheEntry cacheEntry;
+
+ if (hContact==INVALID_HANDLE_VALUE)
+ {
+ int i,tick;
+ tick=GetTickCount();
+
+ for(i=0;i<(dat->lCLCContactsCache.realCount);i++)
+ {
+ pdisplayNameCacheEntry pdnce = dat->lCLCContactsCache.items[i];
+ pdnce->ClcContact = NULL;
+ }
+ tick=GetTickCount()-tick;
+
+ { char buf[256];
+ sprintf (buf,"Clear full cache %d ms\r\n",tick);
+ OutputDebugStringA(buf);
+ }
+ }
+ if(!IsHContactGroup(hContact)&&!IsHContactInfo(hContact))
+ {
+ cacheEntry=GetCLCFullCacheEntry(dat,hContact);
+ if (cacheEntry!=NULL)
+ cacheEntry->ClcContact=NULL;
+ }
+}
+
+void SetClcContactCacheItem(struct ClcData *dat,HANDLE hContact,void *contact)
+{
+ pdisplayNameCacheEntry cacheEntry;
+ if(!IsHContactGroup(hContact)&&!IsHContactInfo(hContact))
+ {
+ cacheEntry=GetCLCFullCacheEntry(dat,hContact);
+ if (cacheEntry!=NULL)
+ {
+ cacheEntry->ClcContact=contact;
+ }
+ }
+
+}
+
+
+
+int FindItem(HWND hwnd,struct ClcData *dat,HANDLE hItem,struct ClcContact **contact,struct ClcGroup **subgroup,int *isVisible)
+{
+ int index=0, i;
+ int nowVisible=1;
+ struct ClcGroup *group=&dat->list;
+
+ group->scanIndex=0;
+
+ if (isVisible==NULL&&hItem!=NULL&&subgroup==NULL&&!IsHContactGroup(hItem)&&!IsHContactInfo(hItem))
+ {
+ //try use cache
+ pdisplayNameCacheEntry cacheEntry;
+ cacheEntry=GetCLCFullCacheEntry(dat,hItem);
+ if (cacheEntry!=NULL)
+ {
+ if (cacheEntry->ClcContact==NULL)
+ {
+ int *isv={0};
+ void *z={0};
+ int ret;
+ ret=FindItem(hwnd,dat,hItem,(struct ClcContact ** )&z,(struct ClcGroup** )&isv,NULL);
+ if (ret=0) {return (0);}
+ cacheEntry->ClcContact=(void *)z;
+ }
+ if (cacheEntry->ClcContact!=NULL)
+ {
+ if (contact!=NULL)
+ *contact=(struct ClcContact *)cacheEntry->ClcContact;
+
+ {
+ /*
+ void *p={0}
+ int *isv={0}
+ int ret;
+ ret=FindItem(hwnd,dat,hItem,&p,&isv,NULL);
+ if (ret=0) {return (0);}
+ if (p!=cacheEntry->ClcContact)
+ {
+ MessageBox(0,"hITEM FAILEDDDDDDDD!!!!!","",0);
+ //cacheEntry->ClcContact=p;
+ }
+ */
+ }
+ return 1;
+ }
+ }
+ }
+
+ group=&dat->list;
+
+ for(;;) {
+ if(group->scanIndex==group->cl.count) {
+ struct ClcGroup *tgroup;
+ group=group->parent;
+ if(group==NULL) break;
+ nowVisible=1;
+ for(tgroup=group;tgroup;tgroup=tgroup->parent)
+ if(!group->expanded) {nowVisible=0; break;}
+ group->scanIndex++;
+ continue;
+ }
+ if(nowVisible) index++;
+ if((IsHContactGroup(hItem) && group->cl.items[group->scanIndex]->type==CLCIT_GROUP && ((UINT_PTR)hItem&~HCONTACT_ISGROUP)==group->cl.items[group->scanIndex]->groupId) ||
+ (IsHContactContact(hItem) && group->cl.items[group->scanIndex]->type==CLCIT_CONTACT && group->cl.items[group->scanIndex]->hContact==hItem) ||
+ (IsHContactInfo(hItem) && group->cl.items[group->scanIndex]->type==CLCIT_INFO && group->cl.items[group->scanIndex]->hContact==(HANDLE)((UINT_PTR)hItem&~HCONTACT_ISINFO))) {
+ if(isVisible) {
+ if(!nowVisible) *isVisible=0;
+ else {
+ if((index+1)*dat->rowHeight<dat->yScroll) *isVisible=0;
+ else {
+ RECT clRect;
+ GetClientRect(hwnd,&clRect);
+ if(index*dat->rowHeight>=dat->yScroll+clRect.bottom) *isVisible=0;
+ else *isVisible=1;
+ } } }
+
+ if(contact) *contact=group->cl.items[group->scanIndex];
+ if(subgroup) *subgroup=group;
+ return 1;
+ }
+
+ if (group->cl.items[group->scanIndex]->type==CLCIT_CONTACT &&
+ group->cl.items[group->scanIndex]->SubAllocated>0)
+ for (i=1; i<=group->cl.items[group->scanIndex]->SubAllocated; i++)
+ if (IsHContactContact(hItem) && group->cl.items[group->scanIndex]->subcontacts[i-1].hContact==hItem)
+ {
+ if(contact) *contact=&group->cl.items[group->scanIndex]->subcontacts[i-1];
+ if(subgroup) *subgroup=group;
+ return 1;
+ }
+
+ if(group->cl.items[group->scanIndex]->type==CLCIT_GROUP) {
+ struct ClcGroup* save = group;
+ group=group->cl.items[group->scanIndex]->group;
+ group->scanIndex=0;
+ nowVisible&=group->expanded;
+ continue;
+ }
+ group->scanIndex++;
+ }
+ return 0;
+}
+#define CacheArrSize 255
+struct ClcGroup *CacheIndex[CacheArrSize]={NULL};
+boolean CacheIndexClear=TRUE;
+void ClearRowByIndexCache()
+{
+ if (!CacheIndexClear)
+ {
+ memset(CacheIndex,0,sizeof(CacheIndex));
+ CacheIndexClear=TRUE;
+ }
+
+}
+int GetRowByIndex(struct ClcData *dat,int testindex,struct ClcContact **contact,struct ClcGroup **subgroup)
+{
+ int index=0,i;
+ struct ClcGroup *group=&dat->list;
+
+ if (testindex<0) return (-1);
+ // if (FALSE&&(testindex>0)&&testindex<CacheArrSize&&CacheIndex[testindex]!=NULL)
+ // {
+ // if(contact) *contact=&(CacheIndex[testindex])->cl.items[group->scanIndex];
+ // if(subgroup) *subgroup=(CacheIndex[testindex]);
+ // return (testindex);
+ // }else
+ {
+ group->scanIndex=0;
+ for(;;) {
+ if(group->scanIndex==group->cl.count) {
+ group=group->parent;
+ if(group==NULL) break;
+ group->scanIndex++;
+ continue;
+ }
+ if ((index>0) && (index<CacheArrSize))
+ {
+ CacheIndex[index]=group;
+ CacheIndexClear=FALSE;
+ }
+
+ if(testindex==index) {
+ if(contact) *contact = group->cl.items[group->scanIndex];
+ if(subgroup) *subgroup = group;
+ return index;
+ }
+
+ if (group->cl.items[group->scanIndex]->type==CLCIT_CONTACT)
+ if (group->cl.items[group->scanIndex]->SubAllocated)
+ if (group->cl.items[group->scanIndex]->SubExpanded)
+ {
+ for (i=0;i<group->cl.items[group->scanIndex]->SubAllocated;i++)
+ {
+ if ((index>0) && (index<CacheArrSize))
+ {
+ CacheIndex[index]=group;
+ CacheIndexClear=FALSE;
+ }
+ index++;
+ if(testindex==index) {
+ if(contact) *contact=&group->cl.items[group->scanIndex]->subcontacts[i];
+ if(subgroup) *subgroup=group;
+ return index;
+ }
+ }
+ }
+ index++;
+ if ((group->cl.items[group->scanIndex]->type==CLCIT_CONTACT) && (group->cl.items[group->scanIndex]->flags & CONTACTF_STATUSMSG)) {
+ index++;
+ }
+
+ if(group->cl.items[group->scanIndex]->type==CLCIT_GROUP && group->cl.items[group->scanIndex]->group->expanded) {
+ group=group->cl.items[group->scanIndex]->group;
+ group->scanIndex=0;
+ continue;
+ }
+ group->scanIndex++;
+ }
+ }
+ return -1;
+}
diff --git a/plugins/Mwclist/clcitems.c b/plugins/Mwclist/clcitems.c
new file mode 100644
index 0000000000..9a0f1548f3
--- /dev/null
+++ b/plugins/Mwclist/clcitems.c
@@ -0,0 +1,695 @@
+/*
+
+Miranda IM: the free IM client for Microsoft* Windows*
+
+Copyright 2000-2003 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 "commonheaders.h"
+#include "m_clc.h"
+#include "clc.h"
+#include "clist.h"
+#include "m_metacontacts.h"
+
+
+extern int ( *saveAddItemToGroup )( struct ClcGroup *group, int iAboveItem );
+extern int ( *saveAddInfoItemToGroup )(struct ClcGroup *group,int flags,const TCHAR *pszText);
+extern struct ClcGroup* ( *saveAddGroup )(HWND hwnd,struct ClcData *dat,const TCHAR *szName,DWORD flags,int groupId,int calcTotalMembers);
+extern void (*saveFreeContact)(struct ClcContact *p);
+extern void (*saveFreeGroup)(struct ClcGroup *p);
+
+//routines for managing adding/removal of items in the list, including sorting
+
+extern void ClearClcContactCache(struct ClcData *dat,HANDLE hContact);
+
+void AddSubcontacts(struct ClcContact * cont)
+{
+ int subcount,i,j;
+ HANDLE hsub;
+ pdisplayNameCacheEntry cacheEntry;
+ cacheEntry=GetContactFullCacheEntry(cont->hContact);
+ OutputDebugStringA("Proceed AddSubcontacts\r\n");
+ subcount=(int)CallService(MS_MC_GETNUMCONTACTS,(WPARAM)cont->hContact,0);
+ cont->SubExpanded=DBGetContactSettingByte(cont->hContact,"CList","Expanded",0);
+ cont->isSubcontact=0;
+ cont->subcontacts=(struct ClcContact *) mir_realloc(cont->subcontacts, sizeof(struct ClcContact)*subcount);
+ cont->SubAllocated=subcount;
+ i=0;
+ for (j=0; j<subcount; j++)
+ {
+ hsub=(HANDLE)CallService(MS_MC_GETSUBCONTACT,(WPARAM)cont->hContact,j);
+ cacheEntry=GetContactFullCacheEntry(hsub);
+ if (!(DBGetContactSettingByte(NULL,"CLC","MetaHideOfflineSub",1) && DBGetContactSettingByte(NULL,"CList","HideOffline",SETTING_HIDEOFFLINE_DEFAULT) )||
+ cacheEntry->status!=ID_STATUS_OFFLINE )
+ {
+ cont->subcontacts[i].hContact=cacheEntry->hContact;
+ cont->subcontacts[i].iImage=CallService(MS_CLIST_GETCONTACTICON,(WPARAM)cacheEntry->hContact,0);
+ memset(cont->subcontacts[i].iExtraImage,0xFF,SIZEOF(cont->subcontacts[i].iExtraImage));
+ cont->subcontacts[i].proto=cacheEntry->szProto;
+ lstrcpyn(cont->subcontacts[i].szText,cacheEntry->name,SIZEOF(cont->subcontacts[i].szText));
+ cont->subcontacts[i].type=CLCIT_CONTACT;
+ //cont->flags=0;//CONTACTF_ONLINE;
+ cont->subcontacts[i].isSubcontact=1;
+ i++;
+ }
+ }
+ cont->SubAllocated=i;
+ if (!i) mir_free(cont->subcontacts);
+}
+
+void FreeContact(struct ClcContact *p)
+{
+ if ( p->SubAllocated && !p->isSubcontact)
+ mir_free(p->subcontacts);
+
+ saveFreeContact( p );
+}
+
+int AddItemToGroup(struct ClcGroup *group,int iAboveItem)
+{
+ iAboveItem = saveAddItemToGroup( group, iAboveItem );
+ ClearRowByIndexCache();
+ return iAboveItem;
+}
+
+struct ClcGroup *AddGroup(HWND hwnd,struct ClcData *dat,const TCHAR *szName,DWORD flags,int groupId,int calcTotalMembers)
+{
+ struct ClcGroup* result;
+
+ ClearRowByIndexCache();
+ dat->NeedResort=1;
+ result = saveAddGroup( hwnd, dat, szName, flags, groupId, calcTotalMembers);
+ ClearRowByIndexCache();
+ return result;
+}
+
+void FreeGroup(struct ClcGroup *group)
+{
+ saveFreeGroup( group );
+ ClearRowByIndexCache();
+}
+
+int AddInfoItemToGroup(struct ClcGroup *group,int flags,const TCHAR *pszText)
+{
+ int i = saveAddInfoItemToGroup( group, flags, pszText );
+ ClearRowByIndexCache();
+ return i;
+}
+
+static struct ClcContact * AddContactToGroup(struct ClcData *dat,struct ClcGroup *group,pdisplayNameCacheEntry cacheEntry)
+{
+ char *szProto;
+ WORD apparentMode;
+ DWORD idleMode;
+ HANDLE hContact;
+ DBVARIANT dbv;
+ int i;
+ char AdvancedService[255]={0};
+ int img =-1;
+ int basicIcon = 0;
+
+ if (cacheEntry==NULL) return NULL;
+ if (group==NULL) return NULL;
+ if (dat==NULL) return NULL;
+
+ hContact=cacheEntry->hContact;
+ //ClearClcContactCache(hContact);
+
+ dat->NeedResort=1;
+ for(i=group->cl.count-1;i>=0;i--)
+ if(group->cl.items[i]->type!=CLCIT_INFO || !(group->cl.items[i]->flags&CLCIIF_BELOWCONTACTS)) break;
+ i=AddItemToGroup(group,i+1);
+ group->cl.items[i]->type = CLCIT_CONTACT;
+ group->cl.items[i]->SubAllocated = 0;
+ group->cl.items[i]->isSubcontact = 0;
+ group->cl.items[i]->subcontacts = NULL;
+
+ _snprintf(AdvancedService,sizeof(AdvancedService),"%s%s",cacheEntry->szProto,"/GetAdvancedStatusIcon");
+
+ if (ServiceExists(AdvancedService))
+ img = CallService(AdvancedService,(WPARAM)hContact, (LPARAM)0);
+
+ if (img==-1 || !(LOWORD(img))) img = CallService(MS_CLIST_GETCONTACTICON,(WPARAM)hContact,0);
+
+ group->cl.items[i]->iImage = img;
+
+ cacheEntry=GetContactFullCacheEntry(hContact);
+ group->cl.items[i]->hContact=hContact;
+
+ //cacheEntry->ClcContact=&(group->cl.items[i]);
+ //SetClcContactCacheItem(dat,hContact,&(group->cl.items[i]));
+
+ szProto=cacheEntry->szProto;
+ if(szProto!=NULL&&!pcli->pfnIsHiddenMode(dat,cacheEntry->status))
+ group->cl.items[i]->flags|=CONTACTF_ONLINE;
+ apparentMode=szProto!=NULL?cacheEntry->ApparentMode:0;
+ if(apparentMode==ID_STATUS_OFFLINE) group->cl.items[i]->flags|=CONTACTF_INVISTO;
+ else if(apparentMode==ID_STATUS_ONLINE) group->cl.items[i]->flags|=CONTACTF_VISTO;
+ else if(apparentMode) group->cl.items[i]->flags|=CONTACTF_VISTO|CONTACTF_INVISTO;
+ if(cacheEntry->NotOnList) group->cl.items[i]->flags|=CONTACTF_NOTONLIST;
+ idleMode=szProto!=NULL?cacheEntry->IdleTS:0;
+ if (idleMode) group->cl.items[i]->flags|=CONTACTF_IDLE;
+
+ lstrcpyn(group->cl.items[i]->szText,cacheEntry->name, SIZEOF(group->cl.items[i]->szText));
+ group->cl.items[i]->proto = szProto;
+
+
+ if (dat->style&CLS_SHOWSTATUSMESSAGES)
+ {
+ if (!DBGetContactSettingTString(hContact, "CList", "StatusMsg", &dbv)) {
+ int j;
+ lstrcpyn(group->cl.items[i]->szStatusMsg, dbv.ptszVal, SIZEOF(group->cl.items[i]->szStatusMsg));
+ for (j=(int)_tcslen(group->cl.items[i]->szStatusMsg)-1;j>=0;j--) {
+ if (group->cl.items[i]->szStatusMsg[j]=='\r' || group->cl.items[i]->szStatusMsg[j]=='\n' || group->cl.items[i]->szStatusMsg[j]=='\t') {
+ group->cl.items[i]->szStatusMsg[j] = ' ';
+ }
+ }
+ DBFreeVariant(&dbv);
+ if (_tcslen(group->cl.items[i]->szStatusMsg)>0) {
+ group->cl.items[i]->flags |= CONTACTF_STATUSMSG;
+ }
+ }
+ }
+
+ ClearRowByIndexCache();
+ return group->cl.items[i];
+}
+
+void AddContactToTree(HWND hwnd,struct ClcData *dat,HANDLE hContact,int updateTotalCount,int checkHideOffline)
+{
+ struct ClcGroup *group;
+ struct ClcContact * cont;
+ pdisplayNameCacheEntry cacheEntry;
+ DWORD style=GetWindowLong(hwnd,GWL_STYLE);
+ WORD status;
+ char *szProto;
+
+ if (FindItem(hwnd,dat,hContact,NULL,NULL,NULL)==1){return;}
+ cacheEntry=GetContactFullCacheEntry(hContact);
+ if (cacheEntry==NULL) return;
+ szProto=cacheEntry->szProto;
+
+
+ //char *szProto=(char*)CallService(MS_PROTO_GETCONTACTBASEPROTO,(WPARAM)hContact,0);
+
+ dat->NeedResort=1;
+ ClearRowByIndexCache();
+ ClearClcContactCache(dat,hContact);
+
+ if(style&CLS_NOHIDEOFFLINE) checkHideOffline=0;
+ if(checkHideOffline) {
+ if(szProto==NULL) status=ID_STATUS_OFFLINE;
+ else status=cacheEntry->status;
+ }
+
+ if(lstrlen(cacheEntry->szGroup)==0)
+ group=&dat->list;
+ else {
+ group=AddGroup(hwnd,dat,cacheEntry->szGroup,(DWORD)-1,0,0);
+ if(group==NULL) {
+ int i,len;
+ DWORD groupFlags;
+ TCHAR *szGroupName;
+ if(!(style&CLS_HIDEEMPTYGROUPS)) {/*mir_free(dbv.pszVal);*/return;}
+ if(checkHideOffline && pcli->pfnIsHiddenMode(dat,status)) {
+ for(i=1;;i++) {
+ szGroupName = pcli->pfnGetGroupName(i,&groupFlags);
+ if(szGroupName==NULL) {/*mir_free(dbv.pszVal);*/ return;} //never happens
+ if(!lstrcmp(szGroupName,cacheEntry->szGroup)) break;
+ }
+ if(groupFlags&GROUPF_HIDEOFFLINE) {/*mir_free(dbv.pszVal);*/ return;}
+ }
+ for(i=1;;i++) {
+ szGroupName=pcli->pfnGetGroupName(i,&groupFlags);
+ if(szGroupName==NULL) {/*mir_free(dbv.pszVal);*/ return;} //never happens
+ if(!lstrcmp(szGroupName,cacheEntry->szGroup)) break;
+ len=lstrlen(szGroupName);
+ if(!_tcsncmp(szGroupName,cacheEntry->szGroup,len) && cacheEntry->szGroup[len]=='\\')
+ AddGroup(hwnd,dat,szGroupName,groupFlags,i,1);
+ }
+ group=AddGroup(hwnd,dat,cacheEntry->szGroup,groupFlags,i,1);
+ }
+ // mir_free(dbv.pszVal);
+ }
+ if(checkHideOffline) {
+ if(pcli->pfnIsHiddenMode(dat,status) && (style&CLS_HIDEOFFLINE || group->hideOffline)) {
+ if(updateTotalCount) group->totalMembers++;
+ return;
+ }
+ }
+ cont=AddContactToGroup(dat,group,cacheEntry);
+ if (cont)
+ if (cont->proto)
+ {
+ cont->SubAllocated=0;
+ if (strcmp(cont->proto,"MetaContacts")==0)
+ AddSubcontacts(cont);
+ }
+ if(updateTotalCount) group->totalMembers++;
+ ClearRowByIndexCache();
+}
+
+extern struct ClcGroup* ( *saveRemoveItemFromGroup )(HWND hwnd,struct ClcGroup *group,struct ClcContact *contact,int updateTotalCount);
+
+struct ClcGroup *RemoveItemFromGroup(HWND hwnd,struct ClcGroup *group,struct ClcContact *contact,int updateTotalCount)
+{
+ ClearRowByIndexCache();
+ if(contact->type==CLCIT_CONTACT) {
+ struct ClcData* dat = (struct ClcData*)GetWindowLongPtr(hwnd,0);
+ ClearClcContactCache(dat,contact->hContact);
+ }
+
+ group = saveRemoveItemFromGroup(hwnd, group, contact, updateTotalCount);
+
+ ClearRowByIndexCache();
+ return group;
+}
+
+void DeleteItemFromTree(HWND hwnd,HANDLE hItem)
+{
+ struct ClcContact *contact;
+ struct ClcGroup *group;
+ struct ClcData *dat=(struct ClcData*)GetWindowLongPtr(hwnd,0);
+
+ ClearRowByIndexCache();
+ dat->NeedResort=1;
+
+ if(!FindItem(hwnd,dat,hItem,&contact,&group,NULL)) {
+ DBVARIANT dbv;
+ int i,nameOffset;
+ if(!IsHContactContact(hItem)) return;
+ ClearClcContactCache(dat,hItem);
+
+ if(DBGetContactSettingTString(hItem,"CList","Group",&dbv)) return;
+
+ //decrease member counts of all parent groups too
+ group=&dat->list;
+ nameOffset=0;
+ for(i=0;;i++) {
+ if(group->scanIndex==group->cl.count) break;
+ if(group->cl.items[i]->type==CLCIT_GROUP) {
+ int len=lstrlen(group->cl.items[i]->szText);
+ if(!_tcsncmp(group->cl.items[i]->szText,dbv.ptszVal+nameOffset,len) && (dbv.ptszVal[nameOffset+len]=='\\' || dbv.pszVal[nameOffset+len]=='\0')) {
+ group->totalMembers--;
+ if(dbv.pszVal[nameOffset+len]=='\0') break;
+ }
+ }
+ }
+ mir_free(dbv.pszVal);
+ }
+ else RemoveItemFromGroup(hwnd,group,contact,1);
+
+ ClearRowByIndexCache();
+}
+
+
+
+void RebuildEntireList(HWND hwnd,struct ClcData *dat)
+{
+// char *szProto;
+ DWORD style=GetWindowLong(hwnd,GWL_STYLE);
+ HANDLE hContact;
+ struct ClcContact * cont;
+ struct ClcGroup *group;
+ //DBVARIANT dbv;
+ int tick=GetTickCount();
+
+ ClearRowByIndexCache();
+ ClearClcContactCache(dat,INVALID_HANDLE_VALUE);
+
+ dat->list.expanded=1;
+ dat->list.hideOffline=DBGetContactSettingByte(NULL,"CLC","HideOfflineRoot",0);
+ memset( &dat->list.cl, 0, sizeof( dat->list.cl ));
+ dat->list.cl.increment = 30;
+ dat->NeedResort=1;
+ dat->selection=-1;
+ dat->HiLightMode=DBGetContactSettingByte(NULL,"CLC","HiLightMode",0);
+ {
+ int i;
+ TCHAR *szGroupName;
+ DWORD groupFlags;
+
+ for(i=1;;i++) {
+ szGroupName=pcli->pfnGetGroupName(i,&groupFlags);
+ if(szGroupName==NULL) break;
+ AddGroup(hwnd,dat,szGroupName,groupFlags,i,0);
+ }
+ }
+
+ hContact=(HANDLE)CallService(MS_DB_CONTACT_FINDFIRST,0,0);
+ while(hContact) {
+
+ pdisplayNameCacheEntry cacheEntry;
+ cont=NULL;
+ cacheEntry=GetContactFullCacheEntry(hContact);
+ //cacheEntry->ClcContact=NULL;
+ ClearClcContactCache(dat,hContact);
+ if (cacheEntry==NULL)
+ {
+ MessageBoxA(0,"Fail To Get CacheEntry for hContact","!!!!!!!!",0);
+ }
+
+
+ if(style&CLS_SHOWHIDDEN || !cacheEntry->Hidden) {
+ if(lstrlen(cacheEntry->szGroup)==0)
+ group=&dat->list;
+ else {
+ group=AddGroup(hwnd,dat,cacheEntry->szGroup,(DWORD)-1,0,0);
+ //mir_free(dbv.pszVal);
+ }
+
+ if(group!=NULL) {
+ group->totalMembers++;
+ if(!(style&CLS_NOHIDEOFFLINE) && (style&CLS_HIDEOFFLINE || group->hideOffline)) {
+ //szProto=(char*)CallService(MS_PROTO_GETCONTACTBASEPROTO,(WPARAM)hContact,0);
+ if(cacheEntry->szProto==NULL) {
+ if(!pcli->pfnIsHiddenMode(dat,ID_STATUS_OFFLINE)||cacheEntry->noHiddenOffline)
+ cont=AddContactToGroup(dat,group,cacheEntry);
+ }
+ else
+ if(!pcli->pfnIsHiddenMode(dat,cacheEntry->status)||cacheEntry->noHiddenOffline)
+ cont=AddContactToGroup(dat,group,cacheEntry);
+ }
+ else cont=AddContactToGroup(dat,group,cacheEntry);
+ }
+ }
+ if (cont)
+ if (cont->proto)
+ {
+ cont->SubAllocated=0;
+ if (strcmp(cont->proto,"MetaContacts")==0)
+ AddSubcontacts(cont);
+ }
+ hContact=(HANDLE)CallService(MS_DB_CONTACT_FINDNEXT,(WPARAM)hContact,0);
+ }
+
+ if(style&CLS_HIDEEMPTYGROUPS) {
+ group=&dat->list;
+ group->scanIndex=0;
+ for(;;) {
+ if(group->scanIndex==group->cl.count) {
+ group=group->parent;
+ if(group==NULL) break;
+ }
+ else if(group->cl.items[group->scanIndex]->type==CLCIT_GROUP) {
+ if(group->cl.items[group->scanIndex]->group->cl.count==0) {
+ group=RemoveItemFromGroup(hwnd,group,group->cl.items[group->scanIndex],0);
+ }
+ else {
+ group=group->cl.items[group->scanIndex]->group;
+ group->scanIndex=0;
+ }
+ continue;
+ }
+ group->scanIndex++;
+ }
+ }
+
+ SortCLC(hwnd,dat,0);
+ tick=GetTickCount()-tick;
+ {
+ char buf[255];
+ //sprintf(buf,"%s %s took %i ms",__FILE__,__LINE__,tick);
+ sprintf(buf,"RebuildEntireList %d \r\n",tick);
+
+ OutputDebugStringA(buf);
+ DBWriteContactSettingDword((HANDLE)0,"CLUI","PF:Last RebuildEntireList Time:",tick);
+ }
+}
+
+
+int GetNewSelection(struct ClcGroup *group, int selection, int direction)
+{
+ int lastcount=0, count=0;//group->cl.count;
+ struct ClcGroup *topgroup=group;
+ if (selection<0) {
+ return 0;
+ }
+ group->scanIndex=0;
+ for(;;) {
+ if(group->scanIndex==group->cl.count) {
+ group=group->parent;
+ if(group==NULL) break;
+ group->scanIndex++;
+ continue;
+ }
+ if (count>=selection) return count;
+ lastcount = count;
+ count++;
+ if ((group->cl.items[group->scanIndex]->type==CLCIT_CONTACT) && (group->cl.items[group->scanIndex]->flags & CONTACTF_STATUSMSG)) {
+ count++;
+ }
+ if (!direction) {
+ if (count>selection) return lastcount;
+ }
+ if(group->cl.items[group->scanIndex]->type==CLCIT_GROUP && (group->cl.items[group->scanIndex]->group->expanded)) {
+ group=group->cl.items[group->scanIndex]->group;
+ group->scanIndex=0;
+ // count+=group->cl.count;
+ continue;
+ }
+ group->scanIndex++;
+ }
+ return lastcount;
+ }
+
+int GetGroupContentsCount(struct ClcGroup *group,int visibleOnly)
+{
+ int count=0;//group->cl.count;
+ struct ClcGroup *topgroup=group;
+
+ group->scanIndex=0;
+ for(;;) {
+ if(group->scanIndex==group->cl.count) {
+ if(group==topgroup) break;
+ group=group->parent;
+ group->scanIndex++;
+ continue;
+
+ }
+// else if (group->cl.items[group->scanIndex]->type==CLCIT_CONTACT && (group->cl.items[group->scanIndex]->SubAllocated>0) && visibleOnly && group->cl.items[group->scanIndex]->SubExpanded)
+// {
+// count+=group->cl.items[group->scanIndex]->SubAllocated;
+ count++;
+ if ((group->cl.items[group->scanIndex]->type==CLCIT_CONTACT) && (group->cl.items[group->scanIndex]->flags & CONTACTF_STATUSMSG)) {
+ count++;
+
+ }
+// else if(group->cl.items[group->scanIndex]->type==CLCIT_GROUP && (!visibleOnly || group->cl.items[group->scanIndex]->group->expanded)) {
+ if(group->cl.items[group->scanIndex]->type==CLCIT_GROUP && (!visibleOnly || group->cl.items[group->scanIndex]->group->expanded)) {
+ group=group->cl.items[group->scanIndex]->group;
+ group->scanIndex=0;
+// count+=group->cl.count;
+ continue;
+ }
+ group->scanIndex++;
+ }
+ return count;
+}
+
+extern void ( *saveSortCLC )(HWND hwnd,struct ClcData *dat,int useInsertionSort);
+
+void SortCLC(HWND hwnd,struct ClcData *dat,int useInsertionSort)
+{
+#ifdef _DEBUG
+ DWORD tick = GetTickCount();
+#endif
+ int oldSort = dat->NeedResort;
+ saveSortCLC(hwnd, dat, useInsertionSort);
+ if ( oldSort )
+ ClearRowByIndexCache();
+
+#ifdef _DEBUG
+ {
+ char buf[255];
+ //sprintf(buf,"%s %s took %i ms",__FILE__,__LINE__,tick);
+ tick = GetTickCount()-tick;
+ if (tick>5)
+ {
+ sprintf(buf,"SortCLC %d \r\n",tick);
+ OutputDebugStringA(buf);
+ DBWriteContactSettingDword((HANDLE)0,"CLUI","PF:Last SortCLC Time:",tick);
+ }
+ }
+#endif
+}
+
+struct SavedContactState_t {
+ HANDLE hContact;
+ BYTE iExtraImage[MAXEXTRACOLUMNS];
+ int checked;
+};
+
+struct SavedGroupState_t
+{
+ int groupId, expanded;
+};
+
+struct SavedInfoState_t
+{
+ int parentId;
+ struct ClcContact contact;
+};
+
+void SaveStateAndRebuildList(HWND hwnd,struct ClcData *dat)
+{
+ NMCLISTCONTROL nm;
+ int i,j;
+ struct SavedGroupState_t *savedGroup=NULL;
+ int savedGroupCount=0,savedGroupAlloced=0;
+ struct SavedContactState_t *savedContact=NULL;
+ int savedContactCount=0,savedContactAlloced=0;
+ struct SavedInfoState_t *savedInfo=NULL;
+ int savedInfoCount=0,savedInfoAlloced=0;
+ struct ClcGroup *group;
+ struct ClcContact *contact;
+
+ int tick=GetTickCount();
+ int allocstep=1024;
+ pcli->pfnHideInfoTip(hwnd,dat);
+ KillTimer(hwnd,TIMERID_INFOTIP);
+ KillTimer(hwnd,TIMERID_RENAME);
+ pcli->pfnEndRename(hwnd,dat,1);
+
+ group = &dat->list;
+ group->scanIndex=0;
+ for(;;) {
+ if(group->scanIndex==group->cl.count) {
+ group=group->parent;
+ if(group==NULL) break;
+ }
+ else if(group->cl.items[group->scanIndex]->type==CLCIT_GROUP) {
+ group=group->cl.items[group->scanIndex]->group;
+ group->scanIndex=0;
+ if(++savedGroupCount>savedGroupAlloced) {
+ savedGroupAlloced+=allocstep;
+ savedGroup=(struct SavedGroupState_t*)mir_realloc(savedGroup,sizeof(struct SavedGroupState_t)*savedGroupAlloced);
+ }
+ savedGroup[savedGroupCount-1].groupId=group->groupId;
+ savedGroup[savedGroupCount-1].expanded=group->expanded;
+ continue;
+ }
+ else if(group->cl.items[group->scanIndex]->type==CLCIT_CONTACT) {
+ if(++savedContactCount>savedContactAlloced) {
+ savedContactAlloced+=allocstep;
+ savedContact=(struct SavedContactState_t*)mir_realloc(savedContact,sizeof(struct SavedContactState_t)*savedContactAlloced);
+ }
+ savedContact[savedContactCount-1].hContact = group->cl.items[group->scanIndex]->hContact;
+ CopyMemory(savedContact[savedContactCount-1].iExtraImage, group->cl.items[group->scanIndex]->iExtraImage, MAXEXTRACOLUMNS);
+ savedContact[savedContactCount-1].checked = group->cl.items[group->scanIndex]->flags&CONTACTF_CHECKED;
+ if (group->cl.items[group->scanIndex]->SubAllocated>0)
+ {
+ int l;
+ for (l=0; l<group->cl.items[group->scanIndex]->SubAllocated; l++)
+ {
+ if(++savedContactCount>savedContactAlloced) {
+ savedContactAlloced+=allocstep;
+ savedContact=(struct SavedContactState_t*)mir_realloc(savedContact,sizeof(struct SavedContactState_t)*savedContactAlloced);
+ }
+ savedContact[savedContactCount-1].hContact = group->cl.items[group->scanIndex]->subcontacts[l].hContact;
+ CopyMemory(savedContact[savedContactCount-1].iExtraImage ,group->cl.items[group->scanIndex]->subcontacts[l].iExtraImage,MAXEXTRACOLUMNS);
+ savedContact[savedContactCount-1].checked=group->cl.items[group->scanIndex]->subcontacts[l].flags&CONTACTF_CHECKED;
+ }
+ }
+ }
+ else if(group->cl.items[group->scanIndex]->type==CLCIT_INFO) {
+ if(++savedInfoCount>savedInfoAlloced) {
+ savedInfoAlloced+=allocstep;
+ savedInfo=(struct SavedInfoState_t*)mir_realloc(savedInfo,sizeof(struct SavedInfoState_t)*savedInfoAlloced);
+ }
+ if(group->parent==NULL) savedInfo[savedInfoCount-1].parentId=-1;
+ else savedInfo[savedInfoCount-1].parentId=group->groupId;
+ savedInfo[savedInfoCount-1].contact = *group->cl.items[group->scanIndex];
+ }
+ group->scanIndex++;
+ }
+
+ pcli->pfnFreeGroup(&dat->list);
+ RebuildEntireList(hwnd,dat);
+
+ group=&dat->list;
+ group->scanIndex=0;
+ for(;;) {
+ if(group->scanIndex==group->cl.count) {
+ group=group->parent;
+ if(group==NULL) break;
+ }
+ else if(group->cl.items[group->scanIndex]->type==CLCIT_GROUP) {
+ group=group->cl.items[group->scanIndex]->group;
+ group->scanIndex=0;
+ for(i=0;i<savedGroupCount;i++)
+ if(savedGroup[i].groupId==group->groupId) {
+ group->expanded=savedGroup[i].expanded;
+ break;
+ }
+ continue;
+ }
+ else if(group->cl.items[group->scanIndex]->type==CLCIT_CONTACT) {
+ for(i=0;i<savedContactCount;i++)
+ if(savedContact[i].hContact == group->cl.items[group->scanIndex]->hContact) {
+ CopyMemory(group->cl.items[group->scanIndex]->iExtraImage,savedContact[i].iExtraImage,MAXEXTRACOLUMNS);
+ if(savedContact[i].checked) group->cl.items[group->scanIndex]->flags|=CONTACTF_CHECKED;
+ break;
+ }
+ if (group->cl.items[group->scanIndex]->SubAllocated>0)
+ {
+ int l;
+ for (l=0; l<group->cl.items[group->scanIndex]->SubAllocated; l++)
+ for(i=0;i<savedContactCount;i++)
+ if(savedContact[i].hContact == group->cl.items[group->scanIndex]->subcontacts[l].hContact) {
+ CopyMemory(group->cl.items[group->scanIndex]->subcontacts[l].iExtraImage,savedContact[i].iExtraImage,MAXEXTRACOLUMNS);
+ if(savedContact[i].checked) group->cl.items[group->scanIndex]->subcontacts[l].flags|=CONTACTF_CHECKED;
+ break;
+ }
+ }
+ }
+ group->scanIndex++;
+ }
+ if(savedGroup) mir_free(savedGroup);
+ if(savedContact) mir_free(savedContact);
+ for(i=0;i<savedInfoCount;i++) {
+ if(savedInfo[i].parentId==-1) group=&dat->list;
+ else {
+ if(!FindItem(hwnd,dat,(HANDLE)(savedInfo[i].parentId|HCONTACT_ISGROUP),&contact,NULL,NULL)) continue;
+ group=contact->group;
+ }
+ j=AddInfoItemToGroup(group,savedInfo[i].contact.flags,_T(""));
+ *group->cl.items[j] = savedInfo[i].contact;
+ }
+ if(savedInfo) mir_free(savedInfo);
+ pcli->pfnRecalculateGroupCheckboxes(hwnd,dat);
+
+ RecalcScrollBar(hwnd,dat);
+ nm.hdr.code=CLN_LISTREBUILT;
+ nm.hdr.hwndFrom=hwnd;
+ nm.hdr.idFrom=GetDlgCtrlID(hwnd);
+
+
+ //srand(GetTickCount());
+
+ tick=GetTickCount()-tick;
+ {
+ char buf[255];
+ //sprintf(buf,"%s %s took %i ms",__FILE__,__LINE__,tick);
+ sprintf(buf,"SaveStateAndRebuildList %d \r\n",tick);
+
+ OutputDebugStringA(buf);
+ }
+ ClearRowByIndexCache();
+ SendMessage(GetParent(hwnd),WM_NOTIFY,0,(LPARAM)&nm);
+}
diff --git a/plugins/Mwclist/clcopts.c b/plugins/Mwclist/clcopts.c
new file mode 100644
index 0000000000..11fe5c1b86
--- /dev/null
+++ b/plugins/Mwclist/clcopts.c
@@ -0,0 +1,1109 @@
+/*
+
+Miranda IM: the free IM client for Microsoft* Windows*
+
+Copyright 2000-2003 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 "commonheaders.h"
+#include "m_clc.h"
+#include "clc.h"
+
+#define DBFONTF_BOLD 1
+#define DBFONTF_ITALIC 2
+#define DBFONTF_UNDERLINE 4
+
+static INT_PTR CALLBACK DlgProcClcMainOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam);
+static INT_PTR CALLBACK DlgProcClcMetaOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam);
+static INT_PTR CALLBACK DlgProcClcBkgOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam);
+static INT_PTR CALLBACK DlgProcClcTextOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam);
+
+static INT_PTR CALLBACK DlgProcStatusBarBkgOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam);
+extern void OnStatusBarBackgroundChange();
+
+int BgClcChange(WPARAM wParam,LPARAM lParam)
+{
+ pcli->pfnClcOptionsChanged();
+ return 0;
+}
+
+int BgStatusBarChange(WPARAM wParam,LPARAM lParam)
+{
+ pcli->pfnClcOptionsChanged();
+ OnStatusBarBackgroundChange();
+ return 0;
+}
+
+int ClcOptInit(WPARAM wParam,LPARAM lParam)
+{
+ OPTIONSDIALOGPAGE odp;
+
+ ZeroMemory(&odp,sizeof(odp));
+ odp.cbSize=sizeof(odp);
+ odp.position=0;
+ odp.hInstance=g_hInst;
+ odp.pszGroup=LPGEN("Contact List");
+ odp.pszTemplate=MAKEINTRESOURCEA(IDD_OPT_CLC);
+ odp.pszTitle=LPGEN("List");
+ odp.pfnDlgProc=DlgProcClcMainOpts;
+ odp.flags=ODPF_BOLDGROUPS|ODPF_EXPERTONLY;
+ CallService(MS_OPT_ADDPAGE,wParam,(LPARAM)&odp);
+
+ if (!ServiceExists(MS_BACKGROUNDCONFIG_REGISTER))
+ {
+ odp.pszTemplate=MAKEINTRESOURCEA(IDD_OPT_CLCBKG);
+ odp.pszTitle=LPGEN("List Background");
+ odp.pfnDlgProc=DlgProcClcBkgOpts;
+ odp.flags=ODPF_BOLDGROUPS;
+ CallService(MS_OPT_ADDPAGE,wParam,(LPARAM)&odp);
+ }
+
+ odp.pszTemplate=MAKEINTRESOURCEA(IDD_OPT_CLCTEXT);
+ odp.pszTitle=LPGEN("List Text");
+ odp.pfnDlgProc=DlgProcClcTextOpts;
+ CallService(MS_OPT_ADDPAGE,wParam,(LPARAM)&odp);
+
+ odp.pszTemplate=MAKEINTRESOURCEA(IDD_OPT_META_CLC);
+ odp.pszTitle=LPGEN("List MetaContacts");
+ odp.pfnDlgProc=DlgProcClcMetaOpts;
+ CallService(MS_OPT_ADDPAGE,wParam,(LPARAM)&odp);
+
+ if (!ServiceExists(MS_BACKGROUNDCONFIG_REGISTER))
+ {
+ odp.pszTemplate=MAKEINTRESOURCEA(IDD_OPT_CLCBKG);
+ odp.pszTitle=LPGEN("StatusBar Background");
+ odp.pfnDlgProc=DlgProcStatusBarBkgOpts;
+ odp.flags=ODPF_BOLDGROUPS;
+ CallService(MS_OPT_ADDPAGE,wParam,(LPARAM)&odp);
+ }
+
+ return 0;
+}
+
+struct CheckBoxToStyleEx_t {
+ int id;
+ DWORD flag;
+ int not;
+} static const checkBoxToStyleEx[]={
+ {IDC_DISABLEDRAGDROP,CLS_EX_DISABLEDRAGDROP,0},
+ {IDC_NOTEDITLABELS,CLS_EX_EDITLABELS,1},
+ {IDC_SHOWSELALWAYS,CLS_EX_SHOWSELALWAYS,0},
+ {IDC_TRACKSELECT,CLS_EX_TRACKSELECT,0},
+ {IDC_SHOWGROUPCOUNTS,CLS_EX_SHOWGROUPCOUNTS,0},
+ {IDC_HIDECOUNTSWHENEMPTY,CLS_EX_HIDECOUNTSWHENEMPTY,0},
+ {IDC_DIVIDERONOFF,CLS_EX_DIVIDERONOFF,0},
+ {IDC_NOTNOTRANSLUCENTSEL,CLS_EX_NOTRANSLUCENTSEL,1},
+ {IDC_LINEWITHGROUPS,CLS_EX_LINEWITHGROUPS,0},
+ {IDC_QUICKSEARCHVISONLY,CLS_EX_QUICKSEARCHVISONLY,0},
+ {IDC_SORTGROUPSALPHA,CLS_EX_SORTGROUPSALPHA,0},
+ {IDC_NOTNOSMOOTHSCROLLING,CLS_EX_NOSMOOTHSCROLLING,1}};
+
+struct CheckBoxValues_t {
+ DWORD style;
+ TCHAR *szDescr;
+};
+static const struct CheckBoxValues_t greyoutValues[] =
+{
+ {GREYF_UNFOCUS, _T("Not focused") },
+ {MODEF_OFFLINE, _T("Offline") },
+ {PF2_ONLINE, _T("Online") },
+ {PF2_SHORTAWAY, _T("Away") },
+ {PF2_LONGAWAY, _T("NA") },
+ {PF2_LIGHTDND, _T("Occupied") },
+ {PF2_HEAVYDND, _T("DND") },
+ {PF2_FREECHAT, _T("Free for chat") },
+ {PF2_INVISIBLE, _T("Invisible") },
+ {PF2_OUTTOLUNCH, _T("Out to lunch") },
+ {PF2_ONTHEPHONE, _T("On the phone") }
+};
+
+static const struct CheckBoxValues_t offlineValues[] =
+{
+ {MODEF_OFFLINE, _T("Offline") },
+ {PF2_ONLINE, _T("Online") },
+ {PF2_SHORTAWAY, _T("Away") },
+ {PF2_LONGAWAY, _T("NA") },
+ {PF2_LIGHTDND, _T("Occupied") },
+ {PF2_HEAVYDND, _T("DND") },
+ {PF2_FREECHAT, _T("Free for chat") },
+ {PF2_INVISIBLE, _T("Invisible") },
+ {PF2_OUTTOLUNCH, _T("Out to lunch") },
+ {PF2_ONTHEPHONE, _T("On the phone") }
+};
+
+static void FillCheckBoxTree(HWND hwndTree,const struct CheckBoxValues_t *values,int nValues,DWORD style)
+{
+ TVINSERTSTRUCT tvis;
+ int i;
+
+ tvis.hParent=NULL;
+ tvis.hInsertAfter=TVI_LAST;
+ tvis.item.mask=TVIF_PARAM|TVIF_TEXT|TVIF_STATE;
+ for(i=0;i<nValues;i++) {
+ tvis.item.lParam = values[i].style;
+ tvis.item.pszText = TranslateTS(values[i].szDescr);
+ tvis.item.stateMask = TVIS_STATEIMAGEMASK;
+ tvis.item.state = INDEXTOSTATEIMAGEMASK((style&tvis.item.lParam)!=0?2:1);
+ TreeView_InsertItem(hwndTree,&tvis);
+ }
+}
+
+static DWORD MakeCheckBoxTreeFlags(HWND hwndTree)
+{
+ DWORD flags=0;
+ TVITEM tvi;
+
+ tvi.mask=TVIF_HANDLE|TVIF_PARAM|TVIF_STATE;
+ tvi.hItem=TreeView_GetRoot(hwndTree);
+ while(tvi.hItem) {
+ TreeView_GetItem(hwndTree,&tvi);
+ if(((tvi.state&TVIS_STATEIMAGEMASK)>>12==2)) flags|=tvi.lParam;
+ tvi.hItem=TreeView_GetNextSibling(hwndTree,tvi.hItem);
+ }
+ return flags;
+}
+
+static INT_PTR CALLBACK DlgProcClcMetaOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ LPNMHDR t;
+ t=((LPNMHDR)lParam);
+ switch (msg)
+ {
+ case WM_INITDIALOG:
+ TranslateDialogDefault(hwndDlg);
+
+ CheckDlgButton(hwndDlg, IDC_META, DBGetContactSettingByte(NULL,"CLC","Meta",0) ? BST_CHECKED : BST_UNCHECKED); /// by FYR
+ CheckDlgButton(hwndDlg, IDC_METADBLCLK, DBGetContactSettingByte(NULL,"CLC","MetaDoubleClick",0) ? BST_CHECKED : BST_UNCHECKED); /// by FYR
+ CheckDlgButton(hwndDlg, IDC_METASUBEXTRA, DBGetContactSettingByte(NULL,"CLC","MetaHideExtra",0) ? BST_CHECKED : BST_UNCHECKED); /// by FYR
+ CheckDlgButton(hwndDlg, IDC_METASUBEXTRA_IGN, DBGetContactSettingByte(NULL,"CLC","MetaIgnoreEmptyExtra",1) ? BST_CHECKED : BST_UNCHECKED); /// by FYR
+ CheckDlgButton(hwndDlg, IDC_METASUB_HIDEOFFLINE, DBGetContactSettingByte(NULL,"CLC","MetaHideOfflineSub",1) ? BST_CHECKED : BST_UNCHECKED); /// by FYR
+ return TRUE;
+ case WM_COMMAND:
+ SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
+ return TRUE;
+ case WM_NOTIFY:
+
+ switch(t->idFrom)
+ {
+ case 0:
+ switch (t->code)
+ {
+ case PSN_APPLY:
+ DBWriteContactSettingByte(NULL,"CLC","Meta",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_META)); // by FYR
+ DBWriteContactSettingByte(NULL,"CLC","MetaDoubleClick",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_METADBLCLK)); // by FYR
+ DBWriteContactSettingByte(NULL,"CLC","MetaHideExtra",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_METASUBEXTRA)); // by FYR
+ DBWriteContactSettingByte(NULL,"CLC","MetaIgnoreEmptyExtra",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_METASUBEXTRA_IGN)); // by FYR
+ DBWriteContactSettingByte(NULL,"CLC","MetaHideOfflineSub",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_METASUB_HIDEOFFLINE)); // by FYR
+ pcli->pfnClcOptionsChanged();
+ return TRUE;
+ }
+ break;
+ }
+ break;
+ }
+ return FALSE;
+
+
+
+
+}
+
+static INT_PTR CALLBACK DlgProcClcMainOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ switch (msg)
+ {
+ case WM_INITDIALOG:
+ TranslateDialogDefault(hwndDlg);
+ SetWindowLong(GetDlgItem(hwndDlg,IDC_GREYOUTOPTS),GWL_STYLE,GetWindowLong(GetDlgItem(hwndDlg,IDC_GREYOUTOPTS),GWL_STYLE)|TVS_NOHSCROLL|TVS_CHECKBOXES);
+ SetWindowLong(GetDlgItem(hwndDlg,IDC_HIDEOFFLINEOPTS),GWL_STYLE,GetWindowLong(GetDlgItem(hwndDlg,IDC_HIDEOFFLINEOPTS),GWL_STYLE)|TVS_NOHSCROLL|TVS_CHECKBOXES);
+ { int i;
+ DWORD exStyle=DBGetContactSettingDword(NULL,"CLC","ExStyle",pcli->pfnGetDefaultExStyle());
+ for(i=0;i < SIZEOF(checkBoxToStyleEx); i++)
+ CheckDlgButton(hwndDlg,checkBoxToStyleEx[i].id,(exStyle&checkBoxToStyleEx[i].flag)^(checkBoxToStyleEx[i].flag*checkBoxToStyleEx[i].not)?BST_CHECKED:BST_UNCHECKED);
+ }
+ { UDACCEL accel[2]={{0,10},{2,50}};
+ SendDlgItemMessage(hwndDlg,IDC_SMOOTHTIMESPIN,UDM_SETRANGE,0,MAKELONG(999,0));
+ SendDlgItemMessage(hwndDlg,IDC_SMOOTHTIMESPIN,UDM_SETACCEL,SIZEOF(accel), (LPARAM)&accel );
+ SendDlgItemMessage(hwndDlg,IDC_SMOOTHTIMESPIN,UDM_SETPOS,0,MAKELONG(DBGetContactSettingWord(NULL,"CLC","ScrollTime",CLCDEFAULT_SCROLLTIME),0));
+ }
+ CheckDlgButton(hwndDlg,IDC_IDLE,DBGetContactSettingByte(NULL,"CLC","ShowIdle",CLCDEFAULT_SHOWIDLE)?BST_CHECKED:BST_UNCHECKED);
+
+ /* CheckDlgButton(hwndDlg, IDC_META, DBGetContactSettingByte(NULL,"CLC","Meta",0) ? BST_CHECKED : BST_UNCHECKED); /// by FYR
+ CheckDlgButton(hwndDlg, IDC_METADBLCLK, DBGetContactSettingByte(NULL,"CLC","MetaDoubleClick",0) ? BST_CHECKED : BST_UNCHECKED); /// by FYR
+ CheckDlgButton(hwndDlg, IDC_METASUBEXTRA, DBGetContactSettingByte(NULL,"CLC","MetaHideExtra",1) ? BST_CHECKED : BST_UNCHECKED); /// by FYR
+ */
+ SendDlgItemMessage(hwndDlg,IDC_LEFTMARGINSPIN,UDM_SETRANGE,0,MAKELONG(64,0));
+ SendDlgItemMessage(hwndDlg,IDC_LEFTMARGINSPIN,UDM_SETPOS,0,MAKELONG(DBGetContactSettingByte(NULL,"CLC","LeftMargin",CLCDEFAULT_LEFTMARGIN),0));
+ SendDlgItemMessage(hwndDlg,IDC_GROUPINDENTSPIN,UDM_SETRANGE,0,MAKELONG(50,0));
+ SendDlgItemMessage(hwndDlg,IDC_GROUPINDENTSPIN,UDM_SETPOS,0,MAKELONG(DBGetContactSettingByte(NULL,"CLC","GroupIndent",CLCDEFAULT_GROUPINDENT),0));
+ CheckDlgButton(hwndDlg,IDC_GREYOUT,DBGetContactSettingDword(NULL,"CLC","GreyoutFlags",CLCDEFAULT_GREYOUTFLAGS)?BST_CHECKED:BST_UNCHECKED);
+
+
+ EnableWindow(GetDlgItem(hwndDlg,IDC_SMOOTHTIME),IsDlgButtonChecked(hwndDlg,IDC_NOTNOSMOOTHSCROLLING));
+ EnableWindow(GetDlgItem(hwndDlg,IDC_GREYOUTOPTS),IsDlgButtonChecked(hwndDlg,IDC_GREYOUT));
+ FillCheckBoxTree(GetDlgItem(hwndDlg,IDC_GREYOUTOPTS),greyoutValues,SIZEOF(greyoutValues),DBGetContactSettingDword(NULL,"CLC","FullGreyoutFlags",CLCDEFAULT_FULLGREYOUTFLAGS));
+ FillCheckBoxTree(GetDlgItem(hwndDlg,IDC_HIDEOFFLINEOPTS),offlineValues,SIZEOF(offlineValues),DBGetContactSettingDword(NULL,"CLC","OfflineModes",CLCDEFAULT_OFFLINEMODES));
+ CheckDlgButton(hwndDlg,IDC_NOSCROLLBAR,DBGetContactSettingByte(NULL,"CLC","NoVScrollBar",0)?BST_CHECKED:BST_UNCHECKED);
+ return TRUE;
+ case WM_VSCROLL:
+ SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
+ break;
+ case WM_COMMAND:
+ if(LOWORD(wParam)==IDC_NOTNOSMOOTHSCROLLING)
+ EnableWindow(GetDlgItem(hwndDlg,IDC_SMOOTHTIME),IsDlgButtonChecked(hwndDlg,IDC_NOTNOSMOOTHSCROLLING));
+ if(LOWORD(wParam)==IDC_GREYOUT)
+ EnableWindow(GetDlgItem(hwndDlg,IDC_GREYOUTOPTS),IsDlgButtonChecked(hwndDlg,IDC_GREYOUT));
+ if((LOWORD(wParam)==IDC_LEFTMARGIN || LOWORD(wParam)==IDC_SMOOTHTIME || LOWORD(wParam)==IDC_GROUPINDENT) && (HIWORD(wParam)!=EN_CHANGE || (HWND)lParam!=GetFocus())) return 0;
+ SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
+ break;
+ case WM_NOTIFY:
+ switch(((LPNMHDR)lParam)->idFrom) {
+ case IDC_GREYOUTOPTS:
+ case IDC_HIDEOFFLINEOPTS:
+ if(((LPNMHDR)lParam)->code==NM_CLICK) {
+ TVHITTESTINFO hti;
+ hti.pt.x=(short)LOWORD(GetMessagePos());
+ hti.pt.y=(short)HIWORD(GetMessagePos());
+ ScreenToClient(((LPNMHDR)lParam)->hwndFrom,&hti.pt);
+ if(TreeView_HitTest(((LPNMHDR)lParam)->hwndFrom,&hti))
+ if(hti.flags&TVHT_ONITEMSTATEICON) {
+ TVITEM tvi;
+ tvi.mask=TVIF_HANDLE|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
+ tvi.hItem=hti.hItem;
+ TreeView_GetItem(((LPNMHDR)lParam)->hwndFrom,&tvi);
+ tvi.iImage=tvi.iSelectedImage=tvi.iImage==1?2:1;
+ TreeView_SetItem(((LPNMHDR)lParam)->hwndFrom,&tvi);
+ SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
+ }
+ }
+ break;
+ case 0:
+ switch (((LPNMHDR)lParam)->code)
+ {
+ case PSN_APPLY:
+ { int i;
+ DWORD exStyle=0;
+ for(i=0;i < SIZEOF(checkBoxToStyleEx);i++)
+ if((IsDlgButtonChecked(hwndDlg,checkBoxToStyleEx[i].id)==0)==checkBoxToStyleEx[i].not)
+ exStyle|=checkBoxToStyleEx[i].flag;
+ DBWriteContactSettingDword(NULL,"CLC","ExStyle",exStyle);
+ }
+ { DWORD fullGreyoutFlags=MakeCheckBoxTreeFlags(GetDlgItem(hwndDlg,IDC_GREYOUTOPTS));
+ DBWriteContactSettingDword(NULL,"CLC","FullGreyoutFlags",fullGreyoutFlags);
+ if(IsDlgButtonChecked(hwndDlg,IDC_GREYOUT))
+ DBWriteContactSettingDword(NULL,"CLC","GreyoutFlags",fullGreyoutFlags);
+ else
+ DBWriteContactSettingDword(NULL,"CLC","GreyoutFlags",0);
+ }
+ /* DBWriteContactSettingByte(NULL,"CLC","Meta",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_META)); // by FYR
+ DBWriteContactSettingByte(NULL,"CLC","MetaDoubleClick",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_METADBLCLK)); // by FYR
+ DBWriteContactSettingByte(NULL,"CLC","MetaHideExtra",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_METASUBEXTRA)); // by FYR
+
+ */
+ DBWriteContactSettingByte(NULL,"CLC","ShowIdle",(BYTE)(IsDlgButtonChecked(hwndDlg,IDC_IDLE)?1:0));
+ DBWriteContactSettingDword(NULL,"CLC","OfflineModes",MakeCheckBoxTreeFlags(GetDlgItem(hwndDlg,IDC_HIDEOFFLINEOPTS)));
+ DBWriteContactSettingByte(NULL,"CLC","LeftMargin",(BYTE)SendDlgItemMessage(hwndDlg,IDC_LEFTMARGINSPIN,UDM_GETPOS,0,0));
+ DBWriteContactSettingWord(NULL,"CLC","ScrollTime",(WORD)SendDlgItemMessage(hwndDlg,IDC_SMOOTHTIMESPIN,UDM_GETPOS,0,0));
+ DBWriteContactSettingByte(NULL,"CLC","GroupIndent",(BYTE)SendDlgItemMessage(hwndDlg,IDC_GROUPINDENTSPIN,UDM_GETPOS,0,0));
+ DBWriteContactSettingByte(NULL,"CLC","NoVScrollBar",(BYTE)(IsDlgButtonChecked(hwndDlg,IDC_NOSCROLLBAR)?1:0));
+
+
+ pcli->pfnClcOptionsChanged();
+ return TRUE;
+ }
+ break;
+ }
+ break;
+ case WM_DESTROY:
+ ImageList_Destroy(TreeView_GetImageList(GetDlgItem(hwndDlg,IDC_GREYOUTOPTS),TVSIL_NORMAL));
+ break;
+ }
+ return FALSE;
+}
+
+static INT_PTR CALLBACK DlgProcStatusBarBkgOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ switch (msg) {
+ case WM_INITDIALOG:
+ TranslateDialogDefault(hwndDlg);
+ CheckDlgButton(hwndDlg,IDC_BITMAP,DBGetContactSettingByte(NULL,"StatusBar","UseBitmap",CLCDEFAULT_USEBITMAP)?BST_CHECKED:BST_UNCHECKED);
+ SendMessage(hwndDlg,WM_USER+10,0,0);
+ SendDlgItemMessage(hwndDlg,IDC_BKGCOLOUR,CPM_SETDEFAULTCOLOUR,0,CLCDEFAULT_BKCOLOUR);
+ SendDlgItemMessage(hwndDlg,IDC_BKGCOLOUR,CPM_SETCOLOUR,0,DBGetContactSettingDword(NULL,"StatusBar","BkColour",CLCDEFAULT_BKCOLOUR));
+ SendDlgItemMessage(hwndDlg,IDC_SELCOLOUR,CPM_SETDEFAULTCOLOUR,0,CLCDEFAULT_SELBKCOLOUR);
+ SendDlgItemMessage(hwndDlg,IDC_SELCOLOUR,CPM_SETCOLOUR,0,DBGetContactSettingDword(NULL,"StatusBar","SelBkColour",CLCDEFAULT_SELBKCOLOUR));
+ { DBVARIANT dbv;
+ if(!DBGetContactSettingString(NULL,"StatusBar","BkBitmap",&dbv)) {
+ SetDlgItemTextA(hwndDlg,IDC_FILENAME,dbv.pszVal);
+ if (ServiceExists(MS_UTILS_PATHTOABSOLUTE)) {
+ char szPath[MAX_PATH];
+
+ if (CallService(MS_UTILS_PATHTOABSOLUTE, (WPARAM)dbv.pszVal, (LPARAM)szPath))
+ SetDlgItemTextA(hwndDlg,IDC_FILENAME,szPath);
+ }
+ else
+ mir_free(dbv.pszVal);
+ }
+ }
+
+ CheckDlgButton(hwndDlg,IDC_HILIGHTMODE,DBGetContactSettingByte(NULL,"StatusBar","HiLightMode",0)==0?BST_CHECKED:BST_UNCHECKED);
+ CheckDlgButton(hwndDlg,IDC_HILIGHTMODE1,DBGetContactSettingByte(NULL,"StatusBar","HiLightMode",0)==1?BST_CHECKED:BST_UNCHECKED);
+ CheckDlgButton(hwndDlg,IDC_HILIGHTMODE2,DBGetContactSettingByte(NULL,"StatusBar","HiLightMode",0)==2?BST_CHECKED:BST_UNCHECKED);
+ CheckDlgButton(hwndDlg,IDC_HILIGHTMODE3,DBGetContactSettingByte(NULL,"StatusBar","HiLightMode",0)==3?BST_CHECKED:BST_UNCHECKED);
+
+ { WORD bmpUse=DBGetContactSettingWord(NULL,"StatusBar","BkBmpUse",CLCDEFAULT_BKBMPUSE);
+ CheckDlgButton(hwndDlg,IDC_STRETCHH,bmpUse&CLB_STRETCHH?BST_CHECKED:BST_UNCHECKED);
+ CheckDlgButton(hwndDlg,IDC_STRETCHV,bmpUse&CLB_STRETCHV?BST_CHECKED:BST_UNCHECKED);
+ CheckDlgButton(hwndDlg,IDC_TILEH,bmpUse&CLBF_TILEH?BST_CHECKED:BST_UNCHECKED);
+ CheckDlgButton(hwndDlg,IDC_TILEV,bmpUse&CLBF_TILEV?BST_CHECKED:BST_UNCHECKED);
+ CheckDlgButton(hwndDlg,IDC_SCROLL,bmpUse&CLBF_SCROLL?BST_CHECKED:BST_UNCHECKED);
+ CheckDlgButton(hwndDlg,IDC_PROPORTIONAL,bmpUse&CLBF_PROPORTIONAL?BST_CHECKED:BST_UNCHECKED);
+ CheckDlgButton(hwndDlg,IDC_TILEVROWH,bmpUse&CLBF_TILEVTOROWHEIGHT?BST_CHECKED:BST_UNCHECKED);
+
+ }
+ { HRESULT (STDAPICALLTYPE *MySHAutoComplete)(HWND,DWORD);
+ MySHAutoComplete=(HRESULT (STDAPICALLTYPE*)(HWND,DWORD))GetProcAddress(GetModuleHandleA("shlwapi"),"SHAutoComplete");
+ if(MySHAutoComplete) MySHAutoComplete(GetDlgItem(hwndDlg,IDC_FILENAME),1);
+ }
+ return TRUE;
+
+ case WM_USER+10:
+ EnableWindow(GetDlgItem(hwndDlg,IDC_FILENAME),IsDlgButtonChecked(hwndDlg,IDC_BITMAP));
+ EnableWindow(GetDlgItem(hwndDlg,IDC_BROWSE),IsDlgButtonChecked(hwndDlg,IDC_BITMAP));
+ EnableWindow(GetDlgItem(hwndDlg,IDC_STRETCHH),IsDlgButtonChecked(hwndDlg,IDC_BITMAP));
+ EnableWindow(GetDlgItem(hwndDlg,IDC_STRETCHV),IsDlgButtonChecked(hwndDlg,IDC_BITMAP));
+ EnableWindow(GetDlgItem(hwndDlg,IDC_TILEH),IsDlgButtonChecked(hwndDlg,IDC_BITMAP));
+ EnableWindow(GetDlgItem(hwndDlg,IDC_TILEV),IsDlgButtonChecked(hwndDlg,IDC_BITMAP));
+ EnableWindow(GetDlgItem(hwndDlg,IDC_SCROLL),IsDlgButtonChecked(hwndDlg,IDC_BITMAP));
+ EnableWindow(GetDlgItem(hwndDlg,IDC_PROPORTIONAL),IsDlgButtonChecked(hwndDlg,IDC_BITMAP));
+ EnableWindow(GetDlgItem(hwndDlg,IDC_TILEVROWH),IsDlgButtonChecked(hwndDlg,IDC_BITMAP));
+ break;
+
+ case WM_COMMAND:
+ if(LOWORD(wParam)==IDC_BROWSE) {
+ char str[MAX_PATH];
+ OPENFILENAMEA ofn={0};
+ char filter[512];
+
+ GetDlgItemTextA(hwndDlg,IDC_FILENAME,str,SIZEOF(str));
+ ofn.lStructSize = OPENFILENAME_SIZE_VERSION_400;
+ ofn.hwndOwner = hwndDlg;
+ ofn.hInstance = NULL;
+ CallService(MS_UTILS_GETBITMAPFILTERSTRINGS,SIZEOF(filter),(LPARAM)filter);
+ ofn.lpstrFilter = filter;
+ ofn.lpstrFile = str;
+ ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
+ ofn.nMaxFile = SIZEOF(str);
+ ofn.nMaxFileTitle = MAX_PATH;
+ ofn.lpstrDefExt = "bmp";
+ if(!GetOpenFileNameA(&ofn)) break;
+ SetDlgItemTextA(hwndDlg,IDC_FILENAME,str);
+ }
+ else if(LOWORD(wParam)==IDC_FILENAME && HIWORD(wParam)!=EN_CHANGE) break;
+ if(LOWORD(wParam)==IDC_BITMAP) SendMessage(hwndDlg,WM_USER+10,0,0);
+ if(LOWORD(wParam)==IDC_FILENAME && (HIWORD(wParam)!=EN_CHANGE || (HWND)lParam!=GetFocus())) return 0;
+ SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
+ break;
+ case WM_NOTIFY:
+ switch(((LPNMHDR)lParam)->idFrom) {
+ case 0:
+ switch (((LPNMHDR)lParam)->code) {
+ case PSN_APPLY:
+ DBWriteContactSettingByte(NULL,"StatusBar","UseBitmap",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_BITMAP));
+ { COLORREF col;
+ col=SendDlgItemMessage(hwndDlg,IDC_BKGCOLOUR,CPM_GETCOLOUR,0,0);
+ if(col==CLCDEFAULT_BKCOLOUR) DBDeleteContactSetting(NULL,"StatusBar","BkColour");
+ else DBWriteContactSettingDword(NULL,"StatusBar","BkColour",col);
+ col=SendDlgItemMessage(hwndDlg,IDC_SELCOLOUR,CPM_GETCOLOUR,0,0);
+ if(col==CLCDEFAULT_SELBKCOLOUR) DBDeleteContactSetting(NULL,"StatusBar","SelBkColour");
+ else DBWriteContactSettingDword(NULL,"StatusBar","SelBkColour",col);
+ }
+ {
+ char str[MAX_PATH],strrel[MAX_PATH];
+ GetDlgItemTextA(hwndDlg,IDC_FILENAME,str,SIZEOF(str));
+ if (ServiceExists(MS_UTILS_PATHTORELATIVE)) {
+ if (CallService(MS_UTILS_PATHTORELATIVE, (WPARAM)str, (LPARAM)strrel))
+ DBWriteContactSettingString(NULL,"StatusBar","BkBitmap",strrel);
+ else DBWriteContactSettingString(NULL,"StatusBar","BkBitmap",str);
+ }
+ else DBWriteContactSettingString(NULL,"StatusBar","BkBitmap",str);
+
+ }
+ { WORD flags=0;
+ if(IsDlgButtonChecked(hwndDlg,IDC_STRETCHH)) flags|=CLB_STRETCHH;
+ if(IsDlgButtonChecked(hwndDlg,IDC_STRETCHV)) flags|=CLB_STRETCHV;
+ if(IsDlgButtonChecked(hwndDlg,IDC_TILEH)) flags|=CLBF_TILEH;
+ if(IsDlgButtonChecked(hwndDlg,IDC_TILEV)) flags|=CLBF_TILEV;
+ if(IsDlgButtonChecked(hwndDlg,IDC_SCROLL)) flags|=CLBF_SCROLL;
+ if(IsDlgButtonChecked(hwndDlg,IDC_PROPORTIONAL)) flags|=CLBF_PROPORTIONAL;
+ if(IsDlgButtonChecked(hwndDlg,IDC_TILEVROWH)) flags|=CLBF_TILEVTOROWHEIGHT;
+
+ DBWriteContactSettingWord(NULL,"StatusBar","BkBmpUse",flags);
+ }
+ {
+ int hil=0;
+ if (IsDlgButtonChecked(hwndDlg,IDC_HILIGHTMODE1)) hil=1;
+ if (IsDlgButtonChecked(hwndDlg,IDC_HILIGHTMODE2)) hil=2;
+ if (IsDlgButtonChecked(hwndDlg,IDC_HILIGHTMODE3)) hil=3;
+
+ DBWriteContactSettingByte(NULL,"StatusBar","HiLightMode",(BYTE)hil);
+ }
+
+ pcli->pfnClcOptionsChanged();
+ OnStatusBarBackgroundChange();
+ return TRUE;
+ }
+ break;
+ }
+ break;
+ }
+ return FALSE;
+}
+
+static INT_PTR CALLBACK DlgProcClcBkgOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ switch (msg) {
+ case WM_INITDIALOG:
+ TranslateDialogDefault(hwndDlg);
+ CheckDlgButton(hwndDlg,IDC_BITMAP,DBGetContactSettingByte(NULL,"CLC","UseBitmap",CLCDEFAULT_USEBITMAP)?BST_CHECKED:BST_UNCHECKED);
+ SendMessage(hwndDlg,WM_USER+10,0,0);
+ SendDlgItemMessage(hwndDlg,IDC_BKGCOLOUR,CPM_SETDEFAULTCOLOUR,0,CLCDEFAULT_BKCOLOUR);
+ SendDlgItemMessage(hwndDlg,IDC_BKGCOLOUR,CPM_SETCOLOUR,0,DBGetContactSettingDword(NULL,"CLC","BkColour",CLCDEFAULT_BKCOLOUR));
+ SendDlgItemMessage(hwndDlg,IDC_SELCOLOUR,CPM_SETDEFAULTCOLOUR,0,CLCDEFAULT_SELBKCOLOUR);
+ SendDlgItemMessage(hwndDlg,IDC_SELCOLOUR,CPM_SETCOLOUR,0,DBGetContactSettingDword(NULL,"CLC","SelBkColour",CLCDEFAULT_SELBKCOLOUR));
+ { DBVARIANT dbv;
+ if(!DBGetContactSettingString(NULL,"CLC","BkBitmap",&dbv)) {
+ SetDlgItemTextA(hwndDlg,IDC_FILENAME,dbv.pszVal);
+ if (ServiceExists(MS_UTILS_PATHTOABSOLUTE)) {
+ char szPath[MAX_PATH];
+
+ if (CallService(MS_UTILS_PATHTOABSOLUTE, (WPARAM)dbv.pszVal, (LPARAM)szPath))
+ SetDlgItemTextA(hwndDlg,IDC_FILENAME,szPath);
+ }
+ else mir_free(dbv.pszVal);
+ }
+ }
+
+ { WORD bmpUse=DBGetContactSettingWord(NULL,"CLC","BkBmpUse",CLCDEFAULT_BKBMPUSE);
+ CheckDlgButton(hwndDlg,IDC_STRETCHH,bmpUse&CLB_STRETCHH?BST_CHECKED:BST_UNCHECKED);
+ CheckDlgButton(hwndDlg,IDC_STRETCHV,bmpUse&CLB_STRETCHV?BST_CHECKED:BST_UNCHECKED);
+ CheckDlgButton(hwndDlg,IDC_TILEH,bmpUse&CLBF_TILEH?BST_CHECKED:BST_UNCHECKED);
+ CheckDlgButton(hwndDlg,IDC_TILEV,bmpUse&CLBF_TILEV?BST_CHECKED:BST_UNCHECKED);
+ CheckDlgButton(hwndDlg,IDC_SCROLL,bmpUse&CLBF_SCROLL?BST_CHECKED:BST_UNCHECKED);
+ CheckDlgButton(hwndDlg,IDC_PROPORTIONAL,bmpUse&CLBF_PROPORTIONAL?BST_CHECKED:BST_UNCHECKED);
+ CheckDlgButton(hwndDlg,IDC_TILEVROWH,bmpUse&CLBF_TILEVTOROWHEIGHT?BST_CHECKED:BST_UNCHECKED);
+
+ }
+ { HRESULT (STDAPICALLTYPE *MySHAutoComplete)(HWND,DWORD);
+ MySHAutoComplete=(HRESULT (STDAPICALLTYPE*)(HWND,DWORD))GetProcAddress(GetModuleHandleA("shlwapi"),"SHAutoComplete");
+ if(MySHAutoComplete) MySHAutoComplete(GetDlgItem(hwndDlg,IDC_FILENAME),1);
+ }
+ return TRUE;
+ case WM_USER+10:
+ EnableWindow(GetDlgItem(hwndDlg,IDC_FILENAME),IsDlgButtonChecked(hwndDlg,IDC_BITMAP));
+ EnableWindow(GetDlgItem(hwndDlg,IDC_BROWSE),IsDlgButtonChecked(hwndDlg,IDC_BITMAP));
+ EnableWindow(GetDlgItem(hwndDlg,IDC_STRETCHH),IsDlgButtonChecked(hwndDlg,IDC_BITMAP));
+ EnableWindow(GetDlgItem(hwndDlg,IDC_STRETCHV),IsDlgButtonChecked(hwndDlg,IDC_BITMAP));
+ EnableWindow(GetDlgItem(hwndDlg,IDC_TILEH),IsDlgButtonChecked(hwndDlg,IDC_BITMAP));
+ EnableWindow(GetDlgItem(hwndDlg,IDC_TILEV),IsDlgButtonChecked(hwndDlg,IDC_BITMAP));
+ EnableWindow(GetDlgItem(hwndDlg,IDC_SCROLL),IsDlgButtonChecked(hwndDlg,IDC_BITMAP));
+ EnableWindow(GetDlgItem(hwndDlg,IDC_PROPORTIONAL),IsDlgButtonChecked(hwndDlg,IDC_BITMAP));
+ EnableWindow(GetDlgItem(hwndDlg,IDC_TILEVROWH),IsDlgButtonChecked(hwndDlg,IDC_BITMAP));
+ break;
+ case WM_COMMAND:
+ if(LOWORD(wParam)==IDC_BROWSE) {
+ char str[MAX_PATH];
+ OPENFILENAMEA ofn={0};
+ char filter[512];
+
+ GetDlgItemTextA(hwndDlg,IDC_FILENAME,str,SIZEOF(str));
+ ofn.lStructSize = OPENFILENAME_SIZE_VERSION_400;
+ ofn.hwndOwner = hwndDlg;
+ ofn.hInstance = NULL;
+ CallService(MS_UTILS_GETBITMAPFILTERSTRINGS,SIZEOF(filter),(LPARAM)filter);
+ ofn.lpstrFilter = filter;
+ ofn.lpstrFile = str;
+ ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
+ ofn.nMaxFile = SIZEOF(str);
+ ofn.nMaxFileTitle = MAX_PATH;
+ ofn.lpstrDefExt = "bmp";
+ if(!GetOpenFileNameA(&ofn)) break;
+ SetDlgItemTextA(hwndDlg,IDC_FILENAME,str);
+ }
+ else if(LOWORD(wParam)==IDC_FILENAME && HIWORD(wParam)!=EN_CHANGE) break;
+ if(LOWORD(wParam)==IDC_BITMAP) SendMessage(hwndDlg,WM_USER+10,0,0);
+ if(LOWORD(wParam)==IDC_FILENAME && (HIWORD(wParam)!=EN_CHANGE || (HWND)lParam!=GetFocus())) return 0;
+ SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
+ break;
+ case WM_NOTIFY:
+ switch(((LPNMHDR)lParam)->idFrom) {
+ case 0:
+ switch (((LPNMHDR)lParam)->code) {
+ case PSN_APPLY:
+ DBWriteContactSettingByte(NULL,"CLC","UseBitmap",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_BITMAP));
+ { COLORREF col;
+ col=SendDlgItemMessage(hwndDlg,IDC_BKGCOLOUR,CPM_GETCOLOUR,0,0);
+ if(col==CLCDEFAULT_BKCOLOUR) DBDeleteContactSetting(NULL,"CLC","BkColour");
+ else DBWriteContactSettingDword(NULL,"CLC","BkColour",col);
+ col=SendDlgItemMessage(hwndDlg,IDC_SELCOLOUR,CPM_GETCOLOUR,0,0);
+ if(col==CLCDEFAULT_SELBKCOLOUR) DBDeleteContactSetting(NULL,"CLC","SelBkColour");
+ else DBWriteContactSettingDword(NULL,"CLC","SelBkColour",col);
+ }
+ {
+ char str[MAX_PATH],strrel[MAX_PATH];
+ GetDlgItemTextA(hwndDlg,IDC_FILENAME,str,SIZEOF(str));
+ if (ServiceExists(MS_UTILS_PATHTORELATIVE)) {
+ if (CallService(MS_UTILS_PATHTORELATIVE, (WPARAM)str, (LPARAM)strrel))
+ DBWriteContactSettingString(NULL,"CLC","BkBitmap",strrel);
+ else DBWriteContactSettingString(NULL,"CLC","BkBitmap",str);
+ }
+ else DBWriteContactSettingString(NULL,"CLC","BkBitmap",str);
+ }
+ { WORD flags=0;
+ if(IsDlgButtonChecked(hwndDlg,IDC_STRETCHH)) flags|=CLB_STRETCHH;
+ if(IsDlgButtonChecked(hwndDlg,IDC_STRETCHV)) flags|=CLB_STRETCHV;
+ if(IsDlgButtonChecked(hwndDlg,IDC_TILEH)) flags|=CLBF_TILEH;
+ if(IsDlgButtonChecked(hwndDlg,IDC_TILEV)) flags|=CLBF_TILEV;
+ if(IsDlgButtonChecked(hwndDlg,IDC_SCROLL)) flags|=CLBF_SCROLL;
+ if(IsDlgButtonChecked(hwndDlg,IDC_PROPORTIONAL)) flags|=CLBF_PROPORTIONAL;
+ if(IsDlgButtonChecked(hwndDlg,IDC_TILEVROWH)) flags|=CLBF_TILEVTOROWHEIGHT;
+
+ DBWriteContactSettingWord(NULL,"CLC","BkBmpUse",flags);
+ }
+
+ pcli->pfnClcOptionsChanged();
+ return TRUE;
+ }
+ break;
+ }
+ break;
+ }
+ return FALSE;
+}
+
+static const TCHAR *szFontIdDescr[FONTID_MAX+1]=
+{
+ LPGENT("Standard contacts"),
+ LPGENT("Online contacts to whom you have a different visibility"),
+ LPGENT("Offline contacts"),
+ LPGENT("Contacts which are 'not on list'"),
+ LPGENT("Groups"),
+ LPGENT("Group member counts"),
+ LPGENT("Dividers"),
+ LPGENT("Offline contacts to whom you have a different visibility"),
+ LPGENT("Status messages"),
+ LPGENT("Group Closed"),
+ LPGENT("Hover Contacts")
+};
+
+#define SAMEASF_FACE 1
+#define SAMEASF_SIZE 2
+#define SAMEASF_STYLE 4
+#define SAMEASF_COLOUR 8
+#include <pshpack1.h>
+struct {
+ BYTE sameAsFlags,sameAs;
+ COLORREF colour;
+ char size;
+ BYTE style;
+ BYTE charset;
+ TCHAR szFace[LF_FACESIZE];
+} static fontSettings[FONTID_MAX+1];
+#include <poppack.h>
+static const WORD fontSameAsDefault[FONTID_MAX+1]={0x00FF,0x0B00,0x0F00,0x0700,0x0B00,0x0104,0x0D00,0x0B02,0x0B00,0x0700};
+static const char *fontSizes[]={"7","8","10","14","16","18","20","24","28","16","7"};
+static const int fontListOrder[FONTID_MAX+1]={FONTID_CONTACTS,FONTID_INVIS,FONTID_OFFLINE,FONTID_OFFINVIS,FONTID_NOTONLIST,FONTID_GROUPS,FONTID_GROUPCOUNTS,FONTID_DIVIDERS,FONTID_STATUSMSG,FONTID_GROUPSCLOSED,FONTID_CONTACTSHOVER};
+
+#define M_REBUILDFONTGROUP (WM_USER+10)
+#define M_REMAKESAMPLE (WM_USER+11)
+#define M_RECALCONEFONT (WM_USER+12)
+#define M_RECALCOTHERFONTS (WM_USER+13)
+#define M_SAVEFONT (WM_USER+14)
+#define M_REFRESHSAMEASBOXES (WM_USER+15)
+#define M_FILLSCRIPTCOMBO (WM_USER+16)
+#define M_REDOROWHEIGHT (WM_USER+17)
+#define M_LOADFONT (WM_USER+18)
+#define M_GUESSSAMEASBOXES (WM_USER+19)
+#define M_SETSAMEASBOXES (WM_USER+20)
+
+static int CALLBACK EnumFontsProc(ENUMLOGFONTEX *lpelfe,NEWTEXTMETRICEX *lpntme,int FontType,LPARAM lParam)
+{
+ if(!IsWindow((HWND)lParam)) return FALSE;
+ if(SendMessage((HWND)lParam,CB_FINDSTRINGEXACT,-1,(LPARAM)lpelfe->elfLogFont.lfFaceName)==CB_ERR)
+ SendMessage((HWND)lParam,CB_ADDSTRING,0,(LPARAM)lpelfe->elfLogFont.lfFaceName);
+ return TRUE;
+}
+
+void FillFontListThread(HWND hwndDlg)
+{
+ LOGFONT lf={0};
+ HDC hdc=GetDC(hwndDlg);
+ lf.lfCharSet=DEFAULT_CHARSET;
+ lf.lfFaceName[0]=0;
+ lf.lfPitchAndFamily=0;
+ EnumFontFamiliesEx(hdc,&lf,(FONTENUMPROC)EnumFontsProc,(LPARAM)GetDlgItem(hwndDlg,IDC_TYPEFACE),0);
+ ReleaseDC(hwndDlg,hdc);
+ return;
+}
+
+static int CALLBACK EnumFontScriptsProc(ENUMLOGFONTEX *lpelfe,NEWTEXTMETRICEX *lpntme,int FontType,LPARAM lParam)
+{
+ if(SendMessage((HWND)lParam,CB_FINDSTRINGEXACT,-1,(LPARAM)lpelfe->elfScript)==CB_ERR) {
+ int i=SendMessage((HWND)lParam,CB_ADDSTRING,0,(LPARAM)lpelfe->elfScript);
+ SendMessage((HWND)lParam,CB_SETITEMDATA,i,lpelfe->elfLogFont.lfCharSet);
+ }
+ return TRUE;
+}
+
+static int TextOptsDlgResizer(HWND hwndDlg,LPARAM lParam,UTILRESIZECONTROL *urc)
+{
+ return RD_ANCHORX_LEFT|RD_ANCHORY_TOP;
+}
+
+static void SwitchTextDlgToMode(HWND hwndDlg,int expert)
+{
+ ShowWindow(GetDlgItem(hwndDlg,IDC_GAMMACORRECT),expert?SW_SHOW:SW_HIDE);
+ ShowWindow(GetDlgItem(hwndDlg,IDC_STSAMETEXT),expert?SW_SHOW:SW_HIDE);
+ ShowWindow(GetDlgItem(hwndDlg,IDC_SAMETYPE),expert?SW_SHOW:SW_HIDE);
+ ShowWindow(GetDlgItem(hwndDlg,IDC_SAMESIZE),expert?SW_SHOW:SW_HIDE);
+ ShowWindow(GetDlgItem(hwndDlg,IDC_SAMESTYLE),expert?SW_SHOW:SW_HIDE);
+ ShowWindow(GetDlgItem(hwndDlg,IDC_SAMECOLOUR),expert?SW_SHOW:SW_HIDE);
+ ShowWindow(GetDlgItem(hwndDlg,IDC_STSIZETEXT),expert?SW_HIDE:SW_SHOW);
+ ShowWindow(GetDlgItem(hwndDlg,IDC_STCOLOURTEXT),expert?SW_HIDE:SW_SHOW);
+ SetDlgItemText(hwndDlg,IDC_STASTEXT,TranslateTS( expert ? _T("as:") : _T("based on:" )));
+ { UTILRESIZEDIALOG urd={0};
+ urd.cbSize=sizeof(urd);
+ urd.hwndDlg=hwndDlg;
+ urd.hInstance=g_hInst;
+ urd.lpTemplate=MAKEINTRESOURCEA(expert?IDD_OPT_CLCTEXT:IDD_OPT_CLCTEXTSIMPLE);
+ urd.pfnResizer=TextOptsDlgResizer;
+ CallService(MS_UTILS_RESIZEDIALOG,0,(LPARAM)&urd);
+ }
+ //resizer breaks the sizing of the edit box
+ SendDlgItemMessage(hwndDlg,IDC_ROWHEIGHTSPIN,UDM_SETBUDDY,(WPARAM)GetDlgItem(hwndDlg,IDC_ROWHEIGHT),0);
+ SendMessage(hwndDlg,M_REFRESHSAMEASBOXES,SendDlgItemMessage(hwndDlg,IDC_FONTID,CB_GETITEMDATA,SendDlgItemMessage(hwndDlg,IDC_FONTID,CB_GETCURSEL,0,0),0),0);
+}
+
+static INT_PTR CALLBACK DlgProcClcTextOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ static HFONT hFontSample;
+
+ switch (msg) {
+ case WM_INITDIALOG:
+ hFontSample=NULL;
+ SetDlgItemTextA(hwndDlg,IDC_SAMPLE,"Sample");
+ TranslateDialogDefault(hwndDlg);
+ if(!SendMessage(GetParent(hwndDlg),PSM_ISEXPERT,0,0))
+ SwitchTextDlgToMode(hwndDlg,0);
+ mir_forkthread(FillFontListThread,hwndDlg);
+ {
+ int i,itemId,fontId;
+ LOGFONT lf;
+ COLORREF colour;
+ WORD sameAs;
+ char str[32];
+
+ for(i=0;i<=FONTID_MAX;i++) {
+ fontId=fontListOrder[i];
+ pcli->pfnGetFontSetting(fontId,&lf,&colour);
+ wsprintfA(str,"Font%dAs",fontId);
+ sameAs=DBGetContactSettingWord(NULL,"CLC",str,fontSameAsDefault[fontId]);
+ fontSettings[fontId].sameAsFlags=HIBYTE(sameAs);
+ fontSettings[fontId].sameAs=LOBYTE(sameAs);
+ fontSettings[fontId].style=(lf.lfWeight==FW_NORMAL?0:DBFONTF_BOLD)|(lf.lfItalic?DBFONTF_ITALIC:0)|(lf.lfUnderline?DBFONTF_UNDERLINE:0);
+ if(lf.lfHeight<0) {
+ HDC hdc;
+ SIZE size;
+ HFONT hFont=CreateFontIndirect(&lf);
+ hdc=GetDC(hwndDlg);
+ SelectObject(hdc,hFont);
+ GetTextExtentPoint32A(hdc,"_W",2,&size);
+ ReleaseDC(hwndDlg,hdc);
+ DeleteObject(hFont);
+ fontSettings[fontId].size=(char)size.cy;
+ }
+ else fontSettings[fontId].size=(char)lf.lfHeight;
+ fontSettings[fontId].charset=lf.lfCharSet;
+ fontSettings[fontId].colour=colour;
+ lstrcpy(fontSettings[fontId].szFace,lf.lfFaceName);
+ itemId=SendDlgItemMessage(hwndDlg,IDC_FONTID,CB_ADDSTRING,0,(LPARAM)TranslateTS(szFontIdDescr[fontId]));
+ SendDlgItemMessage(hwndDlg,IDC_FONTID,CB_SETITEMDATA,itemId,fontId);
+ }
+ SendDlgItemMessage(hwndDlg,IDC_FONTID,CB_SETCURSEL,0,0);
+ for(i=0; i < SIZEOF(fontSizes);i++)
+ SendDlgItemMessageA(hwndDlg,IDC_FONTSIZE,CB_ADDSTRING,0,(LPARAM)fontSizes[i]);
+ }
+ SendDlgItemMessage(hwndDlg,IDC_ROWHEIGHTSPIN,UDM_SETRANGE,0,MAKELONG(255,0));
+ SendDlgItemMessage(hwndDlg,IDC_ROWHEIGHTSPIN,UDM_SETPOS,0,MAKELONG(DBGetContactSettingByte(NULL,"CLC","RowHeight",CLCDEFAULT_ROWHEIGHT),0));
+ SendMessage(hwndDlg,M_REBUILDFONTGROUP,0,0);
+ SendMessage(hwndDlg,M_SAVEFONT,0,0);
+ SendDlgItemMessage(hwndDlg,IDC_HOTCOLOUR,CPM_SETDEFAULTCOLOUR,0,CLCDEFAULT_HOTTEXTCOLOUR);
+ SendDlgItemMessage(hwndDlg,IDC_HOTCOLOUR,CPM_SETCOLOUR,0,DBGetContactSettingDword(NULL,"CLC","HotTextColour",CLCDEFAULT_HOTTEXTCOLOUR));
+ CheckDlgButton(hwndDlg,IDC_GAMMACORRECT,DBGetContactSettingByte(NULL,"CLC","GammaCorrect",CLCDEFAULT_GAMMACORRECT)?BST_CHECKED:BST_UNCHECKED);
+ SendDlgItemMessage(hwndDlg,IDC_SELCOLOUR,CPM_SETDEFAULTCOLOUR,0,CLCDEFAULT_SELTEXTCOLOUR);
+ SendDlgItemMessage(hwndDlg,IDC_SELCOLOUR,CPM_SETCOLOUR,0,DBGetContactSettingDword(NULL,"CLC","SelTextColour",CLCDEFAULT_SELTEXTCOLOUR));
+ SendDlgItemMessage(hwndDlg,IDC_QUICKCOLOUR,CPM_SETDEFAULTCOLOUR,0,CLCDEFAULT_QUICKSEARCHCOLOUR);
+ SendDlgItemMessage(hwndDlg,IDC_QUICKCOLOUR,CPM_SETCOLOUR,0,DBGetContactSettingDword(NULL,"CLC","QuickSearchColour",CLCDEFAULT_QUICKSEARCHCOLOUR));
+
+ CheckDlgButton(hwndDlg,IDC_HILIGHTMODE,DBGetContactSettingByte(NULL,"CLC","HiLightMode",0)==0?BST_CHECKED:BST_UNCHECKED);
+ CheckDlgButton(hwndDlg,IDC_HILIGHTMODE1,DBGetContactSettingByte(NULL,"CLC","HiLightMode",0)==1?BST_CHECKED:BST_UNCHECKED);
+ CheckDlgButton(hwndDlg,IDC_HILIGHTMODE2,DBGetContactSettingByte(NULL,"CLC","HiLightMode",0)==2?BST_CHECKED:BST_UNCHECKED);
+ CheckDlgButton(hwndDlg,IDC_HILIGHTMODE3,DBGetContactSettingByte(NULL,"CLC","HiLightMode",0)==3?BST_CHECKED:BST_UNCHECKED);
+ return TRUE;
+
+ case M_REBUILDFONTGROUP: //remake all the needed controls when the user changes the font selector at the top
+ { int i=SendDlgItemMessage(hwndDlg,IDC_FONTID,CB_GETITEMDATA,SendDlgItemMessage(hwndDlg,IDC_FONTID,CB_GETCURSEL,0,0),0);
+ SendMessage(hwndDlg,M_SETSAMEASBOXES,i,0);
+ { int j,id,itemId;
+ TCHAR szText[256];
+ SendDlgItemMessage(hwndDlg,IDC_SAMEAS,CB_RESETCONTENT,0,0);
+ itemId=SendDlgItemMessage(hwndDlg,IDC_SAMEAS,CB_ADDSTRING,0,(LPARAM)TranslateT("<none>"));
+ SendDlgItemMessage(hwndDlg,IDC_SAMEAS,CB_SETITEMDATA,itemId,0xFF);
+ if(0xFF==fontSettings[i].sameAs)
+ SendDlgItemMessage(hwndDlg,IDC_SAMEAS,CB_SETCURSEL,itemId,0);
+ for(j=0;j<=FONTID_MAX;j++) {
+ SendDlgItemMessage(hwndDlg,IDC_FONTID,CB_GETLBTEXT,j,(LPARAM)szText);
+ id=SendDlgItemMessage(hwndDlg,IDC_FONTID,CB_GETITEMDATA,j,0);
+ if(id==i) continue;
+ itemId=SendDlgItemMessage(hwndDlg,IDC_SAMEAS,CB_ADDSTRING,0,(LPARAM)szText);
+ SendDlgItemMessage(hwndDlg,IDC_SAMEAS,CB_SETITEMDATA,itemId,id);
+ if(id==fontSettings[i].sameAs)
+ SendDlgItemMessage(hwndDlg,IDC_SAMEAS,CB_SETCURSEL,itemId,0);
+ }
+ }
+ SendMessage(hwndDlg,M_LOADFONT,i,0);
+ SendMessage(hwndDlg,M_REFRESHSAMEASBOXES,i,0);
+ SendMessage(hwndDlg,M_REMAKESAMPLE,0,0);
+ break;
+ }
+ case M_SETSAMEASBOXES: //set the check mark in the 'same as' boxes to the right value for fontid wParam
+ CheckDlgButton(hwndDlg,IDC_SAMETYPE,fontSettings[wParam].sameAsFlags&SAMEASF_FACE?BST_CHECKED:BST_UNCHECKED);
+ CheckDlgButton(hwndDlg,IDC_SAMESIZE,fontSettings[wParam].sameAsFlags&SAMEASF_SIZE?BST_CHECKED:BST_UNCHECKED);
+ CheckDlgButton(hwndDlg,IDC_SAMESTYLE,fontSettings[wParam].sameAsFlags&SAMEASF_STYLE?BST_CHECKED:BST_UNCHECKED);
+ CheckDlgButton(hwndDlg,IDC_SAMECOLOUR,fontSettings[wParam].sameAsFlags&SAMEASF_COLOUR?BST_CHECKED:BST_UNCHECKED);
+ break;
+ case M_FILLSCRIPTCOMBO: //fill the script combo box and set the selection to the value for fontid wParam
+ { LOGFONT lf={0};
+ int i;
+ HDC hdc=GetDC(hwndDlg);
+ lf.lfCharSet=DEFAULT_CHARSET;
+ GetDlgItemText(hwndDlg,IDC_TYPEFACE,lf.lfFaceName,SIZEOF(lf.lfFaceName));
+ lf.lfPitchAndFamily=0;
+ SendDlgItemMessage(hwndDlg,IDC_SCRIPT,CB_RESETCONTENT,0,0);
+ EnumFontFamiliesEx(hdc,&lf,(FONTENUMPROC)EnumFontScriptsProc,(LPARAM)GetDlgItem(hwndDlg,IDC_SCRIPT),0);
+ ReleaseDC(hwndDlg,hdc);
+ for(i=SendDlgItemMessage(hwndDlg,IDC_SCRIPT,CB_GETCOUNT,0,0)-1;i>=0;i--) {
+ if(SendDlgItemMessage(hwndDlg,IDC_SCRIPT,CB_GETITEMDATA,i,0)==fontSettings[wParam].charset) {
+ SendDlgItemMessage(hwndDlg,IDC_SCRIPT,CB_SETCURSEL,i,0);
+ break;
+ }
+ }
+ if(i<0) SendDlgItemMessage(hwndDlg,IDC_SCRIPT,CB_SETCURSEL,0,0);
+ break;
+ }
+ case WM_CTLCOLORSTATIC:
+ if((HWND)lParam==GetDlgItem(hwndDlg,IDC_SAMPLE)) {
+ SetTextColor((HDC)wParam,SendDlgItemMessage(hwndDlg,IDC_COLOUR,CPM_GETCOLOUR,0,0));
+ SetBkColor((HDC)wParam,GetSysColor(COLOR_3DFACE));
+ return (INT_PTR)GetSysColorBrush(COLOR_3DFACE);
+ }
+ break;
+ case M_REFRESHSAMEASBOXES: //set the disabled flag on the 'same as' checkboxes to the values for fontid wParam
+ EnableWindow(GetDlgItem(hwndDlg,IDC_SAMETYPE),fontSettings[wParam].sameAs!=0xFF);
+ EnableWindow(GetDlgItem(hwndDlg,IDC_SAMESIZE),fontSettings[wParam].sameAs!=0xFF);
+ EnableWindow(GetDlgItem(hwndDlg,IDC_SAMESTYLE),fontSettings[wParam].sameAs!=0xFF);
+ EnableWindow(GetDlgItem(hwndDlg,IDC_SAMECOLOUR),fontSettings[wParam].sameAs!=0xFF);
+ if(SendMessage(GetParent(hwndDlg),PSM_ISEXPERT,0,0)) {
+ EnableWindow(GetDlgItem(hwndDlg,IDC_TYPEFACE),fontSettings[wParam].sameAs==0xFF || !(fontSettings[wParam].sameAsFlags&SAMEASF_FACE));
+ EnableWindow(GetDlgItem(hwndDlg,IDC_SCRIPT),fontSettings[wParam].sameAs==0xFF || !(fontSettings[wParam].sameAsFlags&SAMEASF_FACE));
+ EnableWindow(GetDlgItem(hwndDlg,IDC_FONTSIZE),fontSettings[wParam].sameAs==0xFF || !(fontSettings[wParam].sameAsFlags&SAMEASF_SIZE));
+ EnableWindow(GetDlgItem(hwndDlg,IDC_BOLD),fontSettings[wParam].sameAs==0xFF || !(fontSettings[wParam].sameAsFlags&SAMEASF_STYLE));
+ EnableWindow(GetDlgItem(hwndDlg,IDC_ITALIC),fontSettings[wParam].sameAs==0xFF || !(fontSettings[wParam].sameAsFlags&SAMEASF_STYLE));
+ EnableWindow(GetDlgItem(hwndDlg,IDC_UNDERLINE),fontSettings[wParam].sameAs==0xFF || !(fontSettings[wParam].sameAsFlags&SAMEASF_STYLE));
+ EnableWindow(GetDlgItem(hwndDlg,IDC_COLOUR),fontSettings[wParam].sameAs==0xFF || !(fontSettings[wParam].sameAsFlags&SAMEASF_COLOUR));
+ }
+ else {
+ EnableWindow(GetDlgItem(hwndDlg,IDC_TYPEFACE),TRUE);
+ EnableWindow(GetDlgItem(hwndDlg,IDC_SCRIPT),TRUE);
+ EnableWindow(GetDlgItem(hwndDlg,IDC_FONTSIZE),TRUE);
+ EnableWindow(GetDlgItem(hwndDlg,IDC_BOLD),TRUE);
+ EnableWindow(GetDlgItem(hwndDlg,IDC_ITALIC),TRUE);
+ EnableWindow(GetDlgItem(hwndDlg,IDC_UNDERLINE),TRUE);
+ EnableWindow(GetDlgItem(hwndDlg,IDC_COLOUR),TRUE);
+ }
+ break;
+ case M_REMAKESAMPLE: //remake the sample edit box font based on the settings in the controls
+ { LOGFONT lf;
+ if(hFontSample) {
+ SendDlgItemMessage(hwndDlg,IDC_SAMPLE,WM_SETFONT,SendDlgItemMessage(hwndDlg,IDC_FONTID,WM_GETFONT,0,0),0);
+ DeleteObject(hFontSample);
+ }
+ lf.lfHeight=GetDlgItemInt(hwndDlg,IDC_FONTSIZE,NULL,FALSE);
+ {
+ HDC hdc=GetDC(NULL);
+ lf.lfHeight=-MulDiv(lf.lfHeight, GetDeviceCaps(hdc, LOGPIXELSY), 72);
+ ReleaseDC(NULL,hdc);
+ }
+ lf.lfWidth=lf.lfEscapement=lf.lfOrientation=0;
+ lf.lfWeight=IsDlgButtonChecked(hwndDlg,IDC_BOLD)?FW_BOLD:FW_NORMAL;
+ lf.lfItalic=IsDlgButtonChecked(hwndDlg,IDC_ITALIC);
+ lf.lfUnderline=IsDlgButtonChecked(hwndDlg,IDC_UNDERLINE);
+ lf.lfStrikeOut=0;
+ lf.lfCharSet=(BYTE)SendDlgItemMessage(hwndDlg,IDC_SCRIPT,CB_GETITEMDATA,SendDlgItemMessage(hwndDlg,IDC_SCRIPT,CB_GETCURSEL,0,0),0);
+ lf.lfOutPrecision=OUT_DEFAULT_PRECIS;
+ lf.lfClipPrecision=CLIP_DEFAULT_PRECIS;
+ lf.lfQuality=DEFAULT_QUALITY;
+ lf.lfPitchAndFamily=DEFAULT_PITCH|FF_DONTCARE;
+ GetDlgItemText(hwndDlg,IDC_TYPEFACE,lf.lfFaceName,SIZEOF(lf.lfFaceName));
+ hFontSample=CreateFontIndirect(&lf);
+ SendDlgItemMessage(hwndDlg,IDC_SAMPLE,WM_SETFONT,(WPARAM)hFontSample,TRUE);
+ break;
+ }
+ case M_RECALCONEFONT: //copy the 'same as' settings for fontid wParam from their sources
+ if(fontSettings[wParam].sameAs==0xFF) break;
+ if(fontSettings[wParam].sameAsFlags&SAMEASF_FACE) {
+ lstrcpy(fontSettings[wParam].szFace,fontSettings[fontSettings[wParam].sameAs].szFace);
+ fontSettings[wParam].charset=fontSettings[fontSettings[wParam].sameAs].charset;
+ }
+ if(fontSettings[wParam].sameAsFlags&SAMEASF_SIZE)
+ fontSettings[wParam].size=fontSettings[fontSettings[wParam].sameAs].size;
+ if(fontSettings[wParam].sameAsFlags&SAMEASF_STYLE)
+ fontSettings[wParam].style=fontSettings[fontSettings[wParam].sameAs].style;
+ if(fontSettings[wParam].sameAsFlags&SAMEASF_COLOUR)
+ fontSettings[wParam].colour=fontSettings[fontSettings[wParam].sameAs].colour;
+ break;
+ case M_RECALCOTHERFONTS: //recalculate the 'same as' settings for all fonts but wParam
+ { int i;
+ for(i=0;i<=FONTID_MAX;i++) {
+ if(i==(int)wParam) continue;
+ SendMessage(hwndDlg,M_RECALCONEFONT,i,0);
+ }
+ break;
+ }
+ case M_SAVEFONT: //save the font settings from the controls to font wParam
+ fontSettings[wParam].sameAsFlags=(IsDlgButtonChecked(hwndDlg,IDC_SAMETYPE)?SAMEASF_FACE:0)|(IsDlgButtonChecked(hwndDlg,IDC_SAMESIZE)?SAMEASF_SIZE:0)|(IsDlgButtonChecked(hwndDlg,IDC_SAMESTYLE)?SAMEASF_STYLE:0)|(IsDlgButtonChecked(hwndDlg,IDC_SAMECOLOUR)?SAMEASF_COLOUR:0);
+ fontSettings[wParam].sameAs=(BYTE)SendDlgItemMessage(hwndDlg,IDC_SAMEAS,CB_GETITEMDATA,SendDlgItemMessage(hwndDlg,IDC_SAMEAS,CB_GETCURSEL,0,0),0);
+ GetDlgItemText(hwndDlg,IDC_TYPEFACE,fontSettings[wParam].szFace,SIZEOF(fontSettings[wParam].szFace));
+ fontSettings[wParam].charset=(BYTE)SendDlgItemMessage(hwndDlg,IDC_SCRIPT,CB_GETITEMDATA,SendDlgItemMessage(hwndDlg,IDC_SCRIPT,CB_GETCURSEL,0,0),0);
+ fontSettings[wParam].size=(char)GetDlgItemInt(hwndDlg,IDC_FONTSIZE,NULL,FALSE);
+ fontSettings[wParam].style=(IsDlgButtonChecked(hwndDlg,IDC_BOLD)?DBFONTF_BOLD:0)|(IsDlgButtonChecked(hwndDlg,IDC_ITALIC)?DBFONTF_ITALIC:0)|(IsDlgButtonChecked(hwndDlg,IDC_UNDERLINE)?DBFONTF_UNDERLINE:0);
+ fontSettings[wParam].colour=SendDlgItemMessage(hwndDlg,IDC_COLOUR,CPM_GETCOLOUR,0,0);
+ SendMessage(hwndDlg,M_REDOROWHEIGHT,0,0);
+ break;
+ case M_REDOROWHEIGHT: //recalculate the minimum feasible row height
+ { int i;
+ int minHeight=1;//GetSystemMetrics(SM_CYSMICON) +1;
+ for(i=0;i<=FONTID_MAX;i++)
+ {
+ SIZE fontSize;
+ HFONT hFont, oldfnt;
+ HDC hdc=GetDC(NULL);
+ LOGFONT lf;
+ lf.lfHeight=fontSettings[i].size;
+ {
+ HDC hdc=GetDC(NULL);
+ lf.lfHeight=-MulDiv(lf.lfHeight, GetDeviceCaps(hdc, LOGPIXELSY), 72);
+ ReleaseDC(NULL,hdc);
+ }
+ lf.lfWidth=lf.lfEscapement=lf.lfOrientation=0;
+ lf.lfWeight=(fontSettings[i].style&DBFONTF_BOLD)?FW_BOLD:FW_NORMAL;
+ lf.lfItalic=fontSettings[i].style&DBFONTF_ITALIC;
+ lf.lfUnderline=fontSettings[i].style&DBFONTF_UNDERLINE;
+ lf.lfStrikeOut=0;
+ lf.lfCharSet=(BYTE)fontSettings[i].charset;
+ lf.lfOutPrecision=OUT_DEFAULT_PRECIS;
+ lf.lfClipPrecision=CLIP_DEFAULT_PRECIS;
+ lf.lfQuality=DEFAULT_QUALITY;
+ lf.lfPitchAndFamily=DEFAULT_PITCH|FF_DONTCARE;
+ _tcscpy(lf.lfFaceName,fontSettings[i].szFace);
+
+ hFont=CreateFontIndirect(&lf);
+ oldfnt=(HFONT)SelectObject(hdc,(HFONT)hFont);
+ GetTextExtentPoint32A(hdc,"x",1,&fontSize);
+ if(fontSize.cy+2>minHeight) minHeight=fontSize.cy+2;
+ SelectObject(hdc,oldfnt);
+ DeleteObject(hFont);
+ ReleaseDC(NULL,hdc);
+
+
+ }
+ //i=SendDlgItemMessage(hwndDlg,IDC_ROWHEIGHTSPIN,UDM_GETPOS,0,0);
+ //if(i<minHeight) SendDlgItemMessage(hwndDlg,IDC_ROWHEIGHTSPIN,UDM_SETPOS,0,MAKELONG(minHeight,0));
+ minHeight=1;
+ SendDlgItemMessage(hwndDlg,IDC_ROWHEIGHTSPIN,UDM_SETRANGE,0,MAKELONG(255,minHeight));
+ break;
+ }
+
+ case M_LOADFONT: //load font wParam into the controls
+ SetDlgItemText(hwndDlg,IDC_TYPEFACE,fontSettings[wParam].szFace);
+ SendMessage(hwndDlg,M_FILLSCRIPTCOMBO,wParam,0);
+ SetDlgItemInt(hwndDlg,IDC_FONTSIZE,fontSettings[wParam].size,FALSE);
+ CheckDlgButton(hwndDlg,IDC_BOLD,fontSettings[wParam].style&DBFONTF_BOLD?BST_CHECKED:BST_UNCHECKED);
+ CheckDlgButton(hwndDlg,IDC_ITALIC,fontSettings[wParam].style&DBFONTF_ITALIC?BST_CHECKED:BST_UNCHECKED);
+ CheckDlgButton(hwndDlg,IDC_UNDERLINE,fontSettings[wParam].style&DBFONTF_UNDERLINE?BST_CHECKED:BST_UNCHECKED);
+ { LOGFONT lf;
+ COLORREF colour;
+ pcli->pfnGetDefaultFontSetting(wParam,&lf,&colour);
+ SendDlgItemMessage(hwndDlg,IDC_COLOUR,CPM_SETDEFAULTCOLOUR,0,colour);
+ }
+ SendDlgItemMessage(hwndDlg,IDC_COLOUR,CPM_SETCOLOUR,0,fontSettings[wParam].colour);
+ break;
+ case M_GUESSSAMEASBOXES: //guess suitable values for the 'same as' checkboxes for fontId wParam
+ fontSettings[wParam].sameAsFlags=0;
+ if(fontSettings[wParam].sameAs==0xFF) break;
+ if(!lstrcmp(fontSettings[wParam].szFace,fontSettings[fontSettings[wParam].sameAs].szFace) &&
+ fontSettings[wParam].charset==fontSettings[fontSettings[wParam].sameAs].charset)
+ fontSettings[wParam].sameAsFlags|=SAMEASF_FACE;
+ if(fontSettings[wParam].size==fontSettings[fontSettings[wParam].sameAs].size)
+ fontSettings[wParam].sameAsFlags|=SAMEASF_SIZE;
+ if(fontSettings[wParam].style==fontSettings[fontSettings[wParam].sameAs].style)
+ fontSettings[wParam].sameAsFlags|=SAMEASF_STYLE;
+ if(fontSettings[wParam].colour==fontSettings[fontSettings[wParam].sameAs].colour)
+ fontSettings[wParam].sameAsFlags|=SAMEASF_COLOUR;
+ SendMessage(hwndDlg,M_SETSAMEASBOXES,wParam,0);
+ break;
+ case WM_VSCROLL:
+ SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
+ break;
+ case WM_COMMAND:
+ { int fontId=SendDlgItemMessage(hwndDlg,IDC_FONTID,CB_GETITEMDATA,SendDlgItemMessage(hwndDlg,IDC_FONTID,CB_GETCURSEL,0,0),0);
+ switch(LOWORD(wParam)) {
+ case IDC_FONTID:
+ if(HIWORD(wParam)!=CBN_SELCHANGE) return FALSE;
+ SendMessage(hwndDlg,M_REBUILDFONTGROUP,0,0);
+ return 0;
+ case IDC_SAMETYPE:
+ case IDC_SAMESIZE:
+ case IDC_SAMESTYLE:
+ case IDC_SAMECOLOUR:
+ SendMessage(hwndDlg,M_SAVEFONT,fontId,0);
+ SendMessage(hwndDlg,M_RECALCONEFONT,fontId,0);
+ SendMessage(hwndDlg,M_REMAKESAMPLE,0,0);
+ SendMessage(hwndDlg,M_REFRESHSAMEASBOXES,fontId,0);
+ break;
+ case IDC_SAMEAS:
+ if(HIWORD(wParam)!=CBN_SELCHANGE) return FALSE;
+ if(SendDlgItemMessage(hwndDlg,IDC_SAMEAS,CB_GETITEMDATA,SendDlgItemMessage(hwndDlg,IDC_SAMEAS,CB_GETCURSEL,0,0),0)==fontId)
+ SendDlgItemMessage(hwndDlg,IDC_SAMEAS,CB_SETCURSEL,0,0);
+ if(!SendMessage(GetParent(hwndDlg),PSM_ISEXPERT,0,0)) {
+ int sameAs=SendDlgItemMessage(hwndDlg,IDC_SAMEAS,CB_GETITEMDATA,SendDlgItemMessage(hwndDlg,IDC_SAMEAS,CB_GETCURSEL,0,0),0);
+ if(sameAs!=0xFF) SendMessage(hwndDlg,M_LOADFONT,sameAs,0);
+ SendMessage(hwndDlg,M_SAVEFONT,fontId,0);
+ SendMessage(hwndDlg,M_GUESSSAMEASBOXES,fontId,0);
+ }
+ else SendMessage(hwndDlg,M_SAVEFONT,fontId,0);
+ SendMessage(hwndDlg,M_RECALCONEFONT,fontId,0);
+ SendMessage(hwndDlg,M_FILLSCRIPTCOMBO,fontId,0);
+ SendMessage(hwndDlg,M_REMAKESAMPLE,0,0);
+ SendMessage(hwndDlg,M_REFRESHSAMEASBOXES,fontId,0);
+ break;
+ case IDC_TYPEFACE:
+ case IDC_SCRIPT:
+ case IDC_FONTSIZE:
+ if(HIWORD(wParam)!=CBN_EDITCHANGE && HIWORD(wParam)!=CBN_SELCHANGE) return FALSE;
+ if(HIWORD(wParam)==CBN_SELCHANGE) {
+ SendDlgItemMessage(hwndDlg,LOWORD(wParam),CB_SETCURSEL,SendDlgItemMessage(hwndDlg,LOWORD(wParam),CB_GETCURSEL,0,0),0);
+ }
+ if(LOWORD(wParam)==IDC_TYPEFACE)
+ SendMessage(hwndDlg,M_FILLSCRIPTCOMBO,fontId,0);
+ //fall through
+ case IDC_BOLD:
+ case IDC_ITALIC:
+ case IDC_UNDERLINE:
+ case IDC_COLOUR:
+ SendMessage(hwndDlg,M_SAVEFONT,fontId,0);
+ if(!SendMessage(GetParent(hwndDlg),PSM_ISEXPERT,0,0)) {
+ SendMessage(hwndDlg,M_GUESSSAMEASBOXES,fontId,0);
+ SendMessage(hwndDlg,M_REFRESHSAMEASBOXES,fontId,0);
+ }
+ SendMessage(hwndDlg,M_RECALCOTHERFONTS,fontId,0);
+ SendMessage(hwndDlg,M_REMAKESAMPLE,0,0);
+ SendMessage(hwndDlg,M_REDOROWHEIGHT,0,0);
+ break;
+ case IDC_SAMPLE:
+ return 0;
+ case IDC_ROWHEIGHT:
+ if(HIWORD(wParam)!=EN_CHANGE || (HWND)lParam!=GetFocus()) return 0;
+ break;
+ }
+ SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
+ break;
+ }
+ case WM_NOTIFY:
+ switch(((LPNMHDR)lParam)->idFrom) {
+ case 0:
+ switch (((LPNMHDR)lParam)->code) {
+ case PSN_APPLY:
+ { int i;
+ char str[20];
+
+ for(i=0;i<=FONTID_MAX;i++) {
+ wsprintfA(str,"Font%dName",i);
+ DBWriteContactSettingTString(NULL,"CLC",str,fontSettings[i].szFace);
+ wsprintfA(str,"Font%dSet",i);
+ DBWriteContactSettingByte(NULL,"CLC",str,fontSettings[i].charset);
+ wsprintfA(str,"Font%dSize",i);
+ DBWriteContactSettingByte(NULL,"CLC",str,fontSettings[i].size);
+ wsprintfA(str,"Font%dSty",i);
+ DBWriteContactSettingByte(NULL,"CLC",str,fontSettings[i].style);
+ wsprintfA(str,"Font%dCol",i);
+ DBWriteContactSettingDword(NULL,"CLC",str,fontSettings[i].colour);
+ wsprintfA(str,"Font%dAs",i);
+ DBWriteContactSettingWord(NULL,"CLC",str,(WORD)((fontSettings[i].sameAsFlags<<8)|fontSettings[i].sameAs));
+ }
+ }
+ { COLORREF col;
+ col=SendDlgItemMessage(hwndDlg,IDC_SELCOLOUR,CPM_GETCOLOUR,0,0);
+ if(col==CLCDEFAULT_SELTEXTCOLOUR) DBDeleteContactSetting(NULL,"CLC","SelTextColour");
+ else DBWriteContactSettingDword(NULL,"CLC","SelTextColour",col);
+ col=SendDlgItemMessage(hwndDlg,IDC_HOTCOLOUR,CPM_GETCOLOUR,0,0);
+ if(col==CLCDEFAULT_HOTTEXTCOLOUR) DBDeleteContactSetting(NULL,"CLC","HotTextColour");
+ else DBWriteContactSettingDword(NULL,"CLC","HotTextColour",col);
+ col=SendDlgItemMessage(hwndDlg,IDC_QUICKCOLOUR,CPM_GETCOLOUR,0,0);
+ if(col==CLCDEFAULT_QUICKSEARCHCOLOUR) DBDeleteContactSetting(NULL,"CLC","QuickSearchColour");
+ else DBWriteContactSettingDword(NULL,"CLC","QuickSearchColour",col);
+ }
+ DBWriteContactSettingByte(NULL,"CLC","RowHeight",(BYTE)SendDlgItemMessage(hwndDlg,IDC_ROWHEIGHTSPIN,UDM_GETPOS,0,0));
+ DBWriteContactSettingByte(NULL,"CLC","GammaCorrect",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_GAMMACORRECT));
+ {
+ int hil=0;
+ if (IsDlgButtonChecked(hwndDlg,IDC_HILIGHTMODE1)) hil=1;
+ if (IsDlgButtonChecked(hwndDlg,IDC_HILIGHTMODE2)) hil=2;
+ if (IsDlgButtonChecked(hwndDlg,IDC_HILIGHTMODE3)) hil=3;
+
+ DBWriteContactSettingByte(NULL,"CLC","HiLightMode",(BYTE)hil);
+ }
+
+ pcli->pfnClcOptionsChanged();
+ return TRUE;
+ case PSN_EXPERTCHANGED:
+ SwitchTextDlgToMode(hwndDlg,((PSHNOTIFY*)lParam)->lParam);
+ break;
+ }
+ break;
+ }
+ break;
+ case WM_DESTROY:
+ if(hFontSample) {
+ SendDlgItemMessage(hwndDlg,IDC_SAMPLE,WM_SETFONT,SendDlgItemMessage(hwndDlg,IDC_FONTID,WM_GETFONT,0,0),0);
+ DeleteObject(hFontSample);
+ }
+ break;
+ }
+ return FALSE;
+}
diff --git a/plugins/Mwclist/clcpaint.c b/plugins/Mwclist/clcpaint.c
new file mode 100644
index 0000000000..a150c30836
--- /dev/null
+++ b/plugins/Mwclist/clcpaint.c
@@ -0,0 +1,748 @@
+/*
+
+Miranda IM: the free IM client for Microsoft* Windows*
+
+Copyright 2000-2003 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 "commonheaders.h"
+#include "m_clc.h"
+#include "clc.h"
+//#include <gdiplus.h>
+
+extern HIMAGELIST himlCListClc;
+static BYTE divide3[765]={255};
+int MetaIgnoreEmptyExtra;
+
+static void ChangeToFont(HDC hdc,struct ClcData *dat,int id,int *fontHeight)
+{
+ SelectObject(hdc,dat->fontInfo[id].hFont);
+ SetTextColor(hdc,dat->fontInfo[id].colour);
+ if(fontHeight) *fontHeight=dat->fontInfo[id].fontHeight;
+}
+
+static void __inline SetHotTrackColour(HDC hdc,struct ClcData *dat)
+{
+ if(dat->gammaCorrection) {
+ COLORREF oldCol,newCol;
+ int oldLum,newLum;
+
+ oldCol=GetTextColor(hdc);
+ oldLum=(GetRValue(oldCol)*30+GetGValue(oldCol)*59+GetBValue(oldCol)*11)/100;
+ newLum=(GetRValue(dat->hotTextColour)*30+GetGValue(dat->hotTextColour)*59+GetBValue(dat->hotTextColour)*11)/100;
+ if(newLum==0) {
+ SetTextColor(hdc,dat->hotTextColour);
+ return;
+ }
+ if(newLum>=oldLum+20) {
+ oldLum+=20;
+ newCol=RGB(GetRValue(dat->hotTextColour)*oldLum/newLum,GetGValue(dat->hotTextColour)*oldLum/newLum,GetBValue(dat->hotTextColour)*oldLum/newLum);
+ }
+ else if(newLum<=oldLum) {
+ int r,g,b;
+ r=GetRValue(dat->hotTextColour)*oldLum/newLum;
+ g=GetGValue(dat->hotTextColour)*oldLum/newLum;
+ b=GetBValue(dat->hotTextColour)*oldLum/newLum;
+ if(r>255) {
+ g+=(r-255)*3/7;
+ b+=(r-255)*3/7;
+ r=255;
+ }
+ if(g>255) {
+ r+=(g-255)*59/41;
+ if(r>255) r=255;
+ b+=(g-255)*59/41;
+ g=255;
+ }
+ if(b>255) {
+ r+=(b-255)*11/89;
+ if(r>255) r=255;
+ g+=(b-255)*11/89;
+ if(g>255) g=255;
+ b=255;
+ }
+ newCol=RGB(r,g,b);
+ }
+ else newCol=dat->hotTextColour;
+ SetTextColor(hdc,newCol);
+ }
+ else
+ SetTextColor(hdc,dat->hotTextColour);
+}
+
+static int GetStatusOnlineness(int status)
+{
+ switch(status) {
+ case ID_STATUS_FREECHAT: return 110;
+ case ID_STATUS_ONLINE: return 100;
+ case ID_STATUS_OCCUPIED: return 60;
+ case ID_STATUS_ONTHEPHONE: return 50;
+ case ID_STATUS_DND: return 40;
+ case ID_STATUS_AWAY: return 30;
+ case ID_STATUS_OUTTOLUNCH: return 20;
+ case ID_STATUS_NA: return 10;
+ case ID_STATUS_INVISIBLE: return 5;
+ }
+ return 0;
+}
+
+static int GetGeneralisedStatus(void)
+{
+ int i,status,thisStatus,statusOnlineness,thisOnlineness;
+
+ status=ID_STATUS_OFFLINE;
+ statusOnlineness=0;
+
+ for (i=0;i<pcli->hClcProtoCount;i++) {
+ thisStatus = pcli->clcProto[i].dwStatus;
+ if(thisStatus==ID_STATUS_INVISIBLE) return ID_STATUS_INVISIBLE;
+ thisOnlineness=GetStatusOnlineness(thisStatus);
+ if(thisOnlineness>statusOnlineness) {
+ status=thisStatus;
+ statusOnlineness=thisOnlineness;
+ }
+ }
+ return status;
+}
+
+static int GetRealStatus(struct ClcContact * contact, int status)
+{
+ int i;
+ char *szProto=contact->proto;
+ if (!szProto) return status;
+ for (i=0;i<pcli->hClcProtoCount;i++) {
+ if (!lstrcmpA(pcli->clcProto[i].szProto,szProto)) {
+ return pcli->clcProto[i].dwStatus;
+ }
+ }
+ return status;
+}
+
+static HMODULE themeAPIHandle = NULL; // handle to uxtheme.dll
+static HANDLE (WINAPI *MyOpenThemeData)(HWND,LPCWSTR);
+static HRESULT (WINAPI *MyCloseThemeData)(HANDLE);
+static HRESULT (WINAPI *MyDrawThemeBackground)(HANDLE,HDC,int,int,const RECT *,const RECT *);
+
+#define MGPROC(x) GetProcAddress(themeAPIHandle,x)
+void InternalPaintClc(HWND hwnd,struct ClcData *dat,HDC hdc,RECT *rcPaint)
+{
+ HDC hdcMem;
+ HBITMAP oldbmp;
+ HBITMAP oldbm;
+ HFONT oldfont;
+ RECT clRect;
+ int y,indent,index,fontHeight, subindex, subident;
+ struct ClcContact *Drawing;
+ struct ClcGroup *group;
+ HBITMAP hBmpOsb;
+ DWORD style=GetWindowLong(hwnd,GWL_STYLE);
+ int status=GetGeneralisedStatus();
+ int grey=0,groupCountsFontTopShift;
+ HBRUSH hBrushAlternateGrey=NULL;
+ POINT pt;
+ RECT testrc;
+
+
+ // yes I know about GetSysColorBrush()
+ COLORREF tmpbkcolour = style&CLS_CONTACTLIST ? ( /*dat->useWindowsColours ? GetSysColor(COLOR_3DFACE) :*/ dat->bkColour ) : dat->bkColour;
+//
+
+
+ if(dat->greyoutFlags & pcli->pfnClcStatusToPf2(status) || style&WS_DISABLED) grey=1;
+ else if(GetFocus()!=hwnd && dat->greyoutFlags&GREYF_UNFOCUS) grey=1;
+ GetClientRect(hwnd,&clRect);
+
+ if(rcPaint==NULL) rcPaint=&clRect;
+ //rcPaint=&clRect;
+
+ if(IsRectEmpty(rcPaint)) return;
+ GetCursorPos(&pt);
+ ScreenToClient(hwnd,&pt);
+
+
+ y=-dat->yScroll;
+ hdcMem=CreateCompatibleDC(hdc);
+ hBmpOsb=CreateBitmap(clRect.right,clRect.bottom,1,GetDeviceCaps(hdc,BITSPIXEL),NULL);
+ oldbmp=(HBITMAP)SelectObject(hdcMem,hBmpOsb);
+ { TEXTMETRIC tm;
+
+
+ oldfont=SelectObject(hdcMem,dat->fontInfo[FONTID_GROUPS].hFont);
+
+ GetTextMetrics(hdcMem,&tm);
+ groupCountsFontTopShift=tm.tmAscent;
+ SelectObject(hdcMem,dat->fontInfo[FONTID_GROUPCOUNTS].hFont);
+ GetTextMetrics(hdcMem,&tm);
+ groupCountsFontTopShift-=tm.tmAscent;
+ SelectObject(hdcMem,oldfont);
+ }
+ if(style&CLS_GREYALTERNATE)
+ hBrushAlternateGrey=CreateSolidBrush(GetNearestColor(hdcMem,RGB(GetRValue(tmpbkcolour)-10,GetGValue(tmpbkcolour)-10,GetBValue(tmpbkcolour)-10)));
+ ChangeToFont(hdcMem,dat,FONTID_CONTACTS,&fontHeight);
+ SetBkMode(hdcMem,TRANSPARENT);
+ { HBRUSH hBrush,hoBrush;
+
+ hBrush=CreateSolidBrush(tmpbkcolour);
+ hoBrush=(HBRUSH)SelectObject(hdcMem,hBrush);
+ FillRect(hdcMem,rcPaint,hBrush);
+ SelectObject(hdcMem,hoBrush);
+ DeleteObject(hBrush);
+ if(dat->hBmpBackground) {
+ BITMAP bmp;
+ HDC hdcBmp;
+ int x,y;
+ int maxx,maxy;
+ int destw,desth;
+
+ // XXX: Halftone isnt supported on 9x, however the scretch problems dont happen on 98.
+ SetStretchBltMode(hdcMem, HALFTONE);
+
+
+ GetObject(dat->hBmpBackground,sizeof(bmp),&bmp);
+ hdcBmp=CreateCompatibleDC(hdcMem);
+ oldbm=SelectObject(hdcBmp,dat->hBmpBackground);
+ y=dat->backgroundBmpUse&CLBF_SCROLL?-dat->yScroll:0;
+ maxx=dat->backgroundBmpUse&CLBF_TILEH?clRect.right:1;
+ maxy=dat->backgroundBmpUse&CLBF_TILEV?maxy=rcPaint->bottom:y+1;
+ switch(dat->backgroundBmpUse&CLBM_TYPE) {
+ case CLB_STRETCH:
+ if(dat->backgroundBmpUse&CLBF_PROPORTIONAL) {
+ if(clRect.right*bmp.bmHeight<clRect.bottom*bmp.bmWidth) {
+ desth=clRect.bottom;
+ destw=desth*bmp.bmWidth/bmp.bmHeight;
+ }
+ else {
+ destw=clRect.right;
+ desth=destw*bmp.bmHeight/bmp.bmWidth;
+ }
+ }
+ else {
+ destw=clRect.right;
+ desth=clRect.bottom;
+ }
+ break;
+ case CLB_STRETCHH:
+ if(dat->backgroundBmpUse&CLBF_PROPORTIONAL) {
+ destw=clRect.right;
+ desth=destw*bmp.bmHeight/bmp.bmWidth;
+ }
+ else {
+ destw=clRect.right;
+ desth=bmp.bmHeight;
+ if (dat->backgroundBmpUse&CLBF_TILEVTOROWHEIGHT)
+ {
+ desth=dat->rowHeight;
+ }
+
+ }
+ break;
+ case CLB_STRETCHV:
+ if(dat->backgroundBmpUse&CLBF_PROPORTIONAL) {
+ desth=clRect.bottom;
+ destw=desth*bmp.bmWidth/bmp.bmHeight;
+ }
+ else {
+ destw=bmp.bmWidth;
+ desth=clRect.bottom;
+ }
+ break;
+ default: //clb_topleft
+ destw=bmp.bmWidth;
+ desth=bmp.bmHeight;
+ if (dat->backgroundBmpUse&CLBF_TILEVTOROWHEIGHT)
+ {
+ desth=dat->rowHeight;
+ }
+ break;
+ }
+ for(;y<maxy;y+=desth) {
+ if(y<rcPaint->top-desth) continue;
+ for(x=0;x<maxx;x+=destw)
+ StretchBlt(hdcMem,x,y,destw,desth,hdcBmp,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);
+ }
+ SelectObject(hdcBmp,oldbm);
+ DeleteDC(hdcBmp);
+ }
+ }
+ group=&dat->list;
+ group->scanIndex=0;
+ indent=0;
+ subindex=-1;
+ for(index=0;y<rcPaint->bottom;)
+ {
+ if (subindex==-1)
+ if (group->scanIndex==group->cl.count)
+ {
+ group=group->parent;
+ indent--;
+ if(group==NULL) break;
+ group->scanIndex++;
+ continue;
+ }
+ //if(group==NULL) break;
+ if(y>rcPaint->top-dat->rowHeight )
+ {
+
+
+ int iImage=-1;
+ int selected;
+ int hottrack;
+ SIZE textSize,countsSize,spaceSize;
+ int width,checkboxWidth;
+ char *szCounts;
+
+ if (subindex==-1)
+ {
+ Drawing=group->cl.items[group->scanIndex];
+ subident=0;
+ }
+ else
+ {
+ Drawing=&(group->cl.items[group->scanIndex]->subcontacts[subindex]);
+ subident=dat->rowHeight/2;
+ }
+ //alternating grey
+
+ selected=index==dat->selection && (dat->showSelAlways || dat->exStyle&CLS_EX_SHOWSELALWAYS || GetFocus()==hwnd) && Drawing->type!=CLCIT_DIVIDER;
+ hottrack=dat->exStyle&CLS_EX_TRACKSELECT && Drawing->type!=CLCIT_DIVIDER && dat->iHotTrack==index;
+
+ if(style&CLS_GREYALTERNATE && index&1) {
+ RECT rc;
+ rc.top=y; rc.bottom=rc.top+dat->rowHeight;
+ rc.left=0; rc.right=clRect.right;
+ FillRect(hdcMem,&rc,hBrushAlternateGrey);
+ }
+
+ //setup
+ if(Drawing->type==CLCIT_GROUP)
+ {
+ if (Drawing->group->expanded)
+ {
+ ChangeToFont(hdcMem,dat,FONTID_GROUPS,&fontHeight);
+ }
+ else
+ {
+ ChangeToFont(hdcMem,dat,FONTID_GROUPSCLOSED,&fontHeight);
+ }
+ }
+ else if(Drawing->type==CLCIT_INFO) {
+ if(Drawing->flags&CLCIIF_GROUPFONT) ChangeToFont(hdcMem,dat,FONTID_GROUPS,&fontHeight);
+ else ChangeToFont(hdcMem,dat,FONTID_CONTACTS,&fontHeight);
+ }
+ else if(Drawing->type==CLCIT_DIVIDER)
+ ChangeToFont(hdcMem,dat,FONTID_DIVIDERS,&fontHeight);
+ else if(Drawing->type==CLCIT_CONTACT && (Drawing->flags&CONTACTF_NOTONLIST) && (!Drawing->isSubcontact) )
+ ChangeToFont(hdcMem,dat,FONTID_NOTONLIST,&fontHeight);
+ else if ( Drawing->type==CLCIT_CONTACT &&
+ (
+ (Drawing->flags&CONTACTF_INVISTO && (!Drawing->isSubcontact) && GetRealStatus(group->cl.items[group->scanIndex], status) != ID_STATUS_INVISIBLE )
+ ||
+ (Drawing->flags&CONTACTF_VISTO && (!Drawing->isSubcontact) && GetRealStatus(group->cl.items[group->scanIndex], status)==ID_STATUS_INVISIBLE)
+ )
+ )
+ {
+ // the contact is in the always visible list and the proto is invisible
+ // the contact is in the always invisible and the proto is in any other mode
+ ChangeToFont(hdcMem,dat, Drawing->flags&CONTACTF_ONLINE ? FONTID_INVIS:FONTID_OFFINVIS ,&fontHeight);
+ }
+ else if(Drawing->type==CLCIT_CONTACT && (!(Drawing->flags&CONTACTF_ONLINE) && (!Drawing->isSubcontact)))
+ ChangeToFont(hdcMem,dat,FONTID_OFFLINE,&fontHeight);
+ else
+ ChangeToFont(hdcMem,dat,FONTID_CONTACTS,&fontHeight);
+ GetTextExtentPoint32(hdcMem,Drawing->szText,lstrlen(Drawing->szText),&textSize);
+ width=textSize.cx;
+ if(Drawing->type==CLCIT_GROUP) {
+
+ szCounts = pcli->pfnGetGroupCountsText(dat,group->cl.items[group->scanIndex]);
+ if(szCounts[0]) {
+ GetTextExtentPoint32A(hdcMem," ",1,&spaceSize);
+ ChangeToFont(hdcMem,dat,FONTID_GROUPCOUNTS,&fontHeight);
+ GetTextExtentPoint32A(hdcMem,szCounts,lstrlenA(szCounts),&countsSize);
+ width+=spaceSize.cx+countsSize.cx;
+ }
+ }
+
+ if((style&CLS_CHECKBOXES && Drawing->type==CLCIT_CONTACT) ||
+ (style&CLS_GROUPCHECKBOXES && Drawing->type==CLCIT_GROUP) ||
+ (Drawing->type==CLCIT_INFO && Drawing->flags&CLCIIF_CHECKBOX))
+ checkboxWidth=dat->checkboxSize+2;
+ else checkboxWidth=0;
+
+ //background
+ if(selected) {
+ switch (dat->HiLightMode)
+ {
+ case 0:
+ {
+ int x=dat->leftMargin+indent*dat->groupIndent+checkboxWidth+dat->iconXSpace-2+subident;
+ ImageList_DrawEx(dat->himlHighlight,0,hdcMem,x,y,min(width+5,clRect.right-x),dat->rowHeight,CLR_NONE,CLR_NONE,dat->exStyle&CLS_EX_NOTRANSLUCENTSEL?ILD_NORMAL:ILD_BLEND25);
+ SetTextColor(hdcMem,dat->selTextColour);
+ break;
+ }
+ case 1:
+ {
+ ImageList_DrawEx(dat->himlHighlight,0,hdcMem,0,y,clRect.right,
+ dat->rowHeight,CLR_NONE,CLR_NONE,
+ dat->exStyle&CLS_EX_NOTRANSLUCENTSEL?ILD_NORMAL:ILD_BLEND25);
+ SetTextColor(hdcMem,dat->selTextColour);
+ break;
+ }
+
+ case 2:
+ {
+ ImageList_DrawEx(dat->himlHighlight,0,hdcMem,1,y+1,clRect.right-2,
+ dat->rowHeight-1,CLR_NONE,CLR_NONE,
+ dat->exStyle&CLS_EX_NOTRANSLUCENTSEL?ILD_NORMAL:ILD_BLEND25);
+ SetTextColor(hdcMem,dat->selTextColour);
+ break;
+ }
+ case 3:
+ {
+ SetTextColor(hdcMem,dat->selTextColour);
+ break;
+ }
+ }
+ }
+ else if(hottrack)
+ SetHotTrackColour(hdcMem,dat);
+
+ //checkboxes
+ if(checkboxWidth && (subindex==-1 ||1)) {
+ RECT rc;
+ HANDLE hTheme = NULL;
+
+ // THEME
+ if (IsWinVerXPPlus()) {
+ if (!themeAPIHandle) {
+ themeAPIHandle = GetModuleHandleA("uxtheme");
+ if (themeAPIHandle) {
+ MyOpenThemeData = (HANDLE (WINAPI *)(HWND,LPCWSTR))MGPROC("OpenThemeData");
+ MyCloseThemeData = (HRESULT (WINAPI *)(HANDLE))MGPROC("CloseThemeData");
+ MyDrawThemeBackground = (HRESULT (WINAPI *)(HANDLE,HDC,int,int,const RECT *,const RECT *))MGPROC("DrawThemeBackground");
+ }
+ }
+ // Make sure all of these methods are valid (i would hope either all or none work)
+ if (MyOpenThemeData
+ &&MyCloseThemeData
+ &&MyDrawThemeBackground) {
+ hTheme = MyOpenThemeData(hwnd,L"BUTTON");
+ }
+ }
+ rc.left=dat->leftMargin+indent*dat->groupIndent+subident;
+ rc.right=rc.left+dat->checkboxSize;
+ rc.top=y+((dat->rowHeight-dat->checkboxSize)>>1);
+ rc.bottom=rc.top+dat->checkboxSize;
+ if (hTheme) {
+ MyDrawThemeBackground(hTheme, hdcMem, BP_CHECKBOX, Drawing->flags&CONTACTF_CHECKED?(hottrack?CBS_CHECKEDHOT:CBS_CHECKEDNORMAL):(hottrack?CBS_UNCHECKEDHOT:CBS_UNCHECKEDNORMAL), &rc, &rc);
+ }
+ else DrawFrameControl(hdcMem,&rc,DFC_BUTTON,DFCS_BUTTONCHECK|DFCS_FLAT|(Drawing->flags&CONTACTF_CHECKED?DFCS_CHECKED:0)|(hottrack?DFCS_HOT:0));
+ if (hTheme&&MyCloseThemeData) {
+ MyCloseThemeData(hTheme);
+ hTheme = NULL;
+ }
+ }
+
+ //icon
+ if(Drawing->type==CLCIT_GROUP)
+ iImage=Drawing->group->expanded?IMAGE_GROUPOPEN:IMAGE_GROUPSHUT;
+ else if(Drawing->type==CLCIT_CONTACT)
+ iImage=Drawing->iImage;
+ if(iImage!=-1) {
+ /*COLORREF colourFg=dat->selBkColour;
+ int mode=ILD_NORMAL;
+ if(selected) mode=ILD_SELECTED;
+ else if(hottrack) {mode=ILD_FOCUS; colourFg=dat->hotTextColour;}
+ else if(Drawing->type==CLCIT_CONTACT && Drawing->flags&CONTACTF_NOTONLIST) {colourFg=dat->fontInfo[FONTID_NOTONLIST].colour; mode=ILD_BLEND50;}
+ ImageList_DrawEx(himlCListClc,iImage,hdcMem,dat->leftMargin+indent*dat->groupIndent+checkboxWidth,y+((dat->rowHeight-16)>>1),0,0,CLR_NONE,colourFg,mode);
+ */
+ COLORREF colourFg=dat->selBkColour;
+ int mode=ILD_NORMAL;
+ if(hottrack) {colourFg=dat->hotTextColour;}
+ else if(Drawing->type==CLCIT_CONTACT && Drawing->flags&CONTACTF_NOTONLIST && (!Drawing->isSubcontact)) {colourFg=dat->fontInfo[FONTID_NOTONLIST].colour; mode=ILD_BLEND50;}
+ if (Drawing->type==CLCIT_CONTACT && dat->showIdle && (Drawing->flags&CONTACTF_IDLE)&& (!Drawing->isSubcontact) && GetRealStatus(group->cl.items[group->scanIndex],ID_STATUS_OFFLINE)!=ID_STATUS_OFFLINE)
+ mode=ILD_SELECTED;
+ ImageList_DrawEx(himlCListClc,iImage,hdcMem,dat->leftMargin+subident+indent*dat->groupIndent+checkboxWidth,y+((dat->rowHeight-16)>>1),0,0,CLR_NONE,colourFg,mode);
+ }
+
+ //text
+ if(Drawing->type==CLCIT_DIVIDER) {
+ RECT rc;
+ rc.top=y+(dat->rowHeight>>1); rc.bottom=rc.top+2;
+ rc.left=dat->leftMargin+indent*dat->groupIndent;
+ rc.right=rc.left+((clRect.right-rc.left-textSize.cx)>>1)-3;
+ DrawEdge(hdcMem,&rc,BDR_SUNKENOUTER,BF_RECT);
+ TextOut(hdcMem,rc.right+3,y+((dat->rowHeight-fontHeight)>>1),Drawing->szText,lstrlen(Drawing->szText));
+ rc.left=rc.right+6+textSize.cx;
+ rc.right=clRect.right;
+ DrawEdge(hdcMem,&rc,BDR_SUNKENOUTER,BF_RECT);
+ }
+ else if(Drawing->type==CLCIT_GROUP) {
+ RECT rc;
+ if(szCounts[0]) {
+ struct ClcGroup *clcg;
+
+ clcg=(struct ClcGroup *)Drawing;
+
+ fontHeight=dat->fontInfo[FONTID_GROUPS].fontHeight;
+
+ rc.left=dat->leftMargin+indent*dat->groupIndent+checkboxWidth+dat->iconXSpace;
+ rc.right=min(clRect.right-countsSize.cx,rc.left+textSize.cx+spaceSize.cx);
+ rc.top=y+((dat->rowHeight-fontHeight)>>1);
+ rc.bottom=rc.top+textSize.cy;
+ if(rc.right<rc.left+4) rc.right=clRect.right+1;
+ else TextOutA(hdcMem,rc.right,rc.top+groupCountsFontTopShift,szCounts,lstrlenA(szCounts));
+
+ //ChangeToFont(hdcMem,dat,FONTID_GROUPS,&fontHeight);
+ if (Drawing->group->expanded)
+ {
+ ChangeToFont(hdcMem,dat,FONTID_GROUPS,&fontHeight);
+ }
+ else
+ {
+ ChangeToFont(hdcMem,dat,FONTID_GROUPSCLOSED,&fontHeight);
+ }
+
+ if(selected)
+ SetTextColor(hdcMem,dat->selTextColour);
+ else if(hottrack)
+ SetHotTrackColour(hdcMem,dat);
+ rc.right--;
+ ExtTextOut(hdcMem,rc.left,rc.top,ETO_CLIPPED,&rc,Drawing->szText,lstrlen(Drawing->szText),NULL);
+ }
+ else TextOut(hdcMem,dat->leftMargin+indent*dat->groupIndent+checkboxWidth+dat->iconXSpace,y+((dat->rowHeight-fontHeight)>>1),Drawing->szText,lstrlen(Drawing->szText));
+ if(dat->exStyle&CLS_EX_LINEWITHGROUPS) {
+ //calc if extra icons present
+ int enabledextraicons=0;
+ for(iImage=0;iImage<dat->extraColumnsCount;iImage++) {
+ if(Drawing->iExtraImage[iImage]==0xFF) continue;
+ enabledextraicons++;
+ }
+ rc.top=y+(dat->rowHeight>>1); rc.bottom=rc.top+2;
+ rc.left=dat->leftMargin+subident+indent*dat->groupIndent+checkboxWidth+dat->iconXSpace+width+3;
+ rc.right=clRect.right-1-dat->extraColumnSpacing*enabledextraicons;
+ if(rc.right-rc.left>1) DrawEdge(hdcMem,&rc,BDR_SUNKENOUTER,BF_RECT);
+ }
+ }
+ else
+ {
+ RECT rc;
+ rc.left=dat->leftMargin+subident+indent*dat->groupIndent+checkboxWidth+dat->iconXSpace;
+ rc.top=y+((dat->rowHeight-fontHeight)>>1);
+ rc.bottom=rc.top+dat->rowHeight;
+ rc.right=clRect.right;
+ if (Drawing->type=CLCIT_CONTACT)
+ {
+ if (hottrack/*PtInRect(&rc,pt)*/)
+ {
+ ChangeToFont(hdcMem,dat,FONTID_CONTACTSHOVER,&fontHeight);
+ }
+ }
+
+ DrawText(hdcMem,Drawing->szText,lstrlen(Drawing->szText),&rc,DT_END_ELLIPSIS);
+
+ }
+ if(selected) {
+ if(Drawing->type!=CLCIT_DIVIDER) {
+ SetTextColor(hdcMem,dat->quickSearchColour);
+ TextOut(hdcMem,dat->leftMargin+subident+indent*dat->groupIndent+checkboxWidth+dat->iconXSpace,y+((dat->rowHeight-fontHeight)>>1),Drawing->szText,lstrlen(dat->szQuickSearch));
+ }
+ }
+
+ if (dat->style&CLS_SHOWSTATUSMESSAGES)
+ {
+ // status message
+ if (group->cl.items[group->scanIndex]->type==CLCIT_CONTACT && group->cl.items[group->scanIndex]->flags & CONTACTF_STATUSMSG) {
+ TCHAR * szText = group->cl.items[group->scanIndex]->szStatusMsg;
+ RECT rc;
+ rc.left=dat->leftMargin+indent*dat->groupIndent+checkboxWidth+dat->iconXSpace;
+ rc.top=y+dat->rowHeight+((dat->rowHeight-fontHeight)>>1);
+ rc.right=(clRect.right - clRect.left);
+ rc.bottom=rc.top+dat->rowHeight;
+ ChangeToFont(hdcMem,dat,FONTID_STATUSMSG,&fontHeight);
+ //ExtTextOut(hdcMem,rc.left,rc.top,ETO_CLIPPED,&rc,szText,lstrlen(szText),NULL);
+ DrawText(hdcMem, szText, lstrlen(szText), &rc, DT_SINGLELINE | DT_EDITCONTROL | DT_NOPREFIX | DT_NOCLIP | DT_WORD_ELLIPSIS);
+ }
+ }
+
+ if (!Drawing->isSubcontact || (DBGetContactSettingByte(NULL,"CLC","MetaHideExtra",0)==0))
+ {
+
+ //extra icons
+ if (!(style&CLS_EX_MULTICOLUMNALIGNLEFT))
+ {
+ int c=dat->extraColumnsCount;
+ for(iImage=dat->extraColumnsCount-1;iImage>=0;iImage--) {
+ COLORREF colourFg=dat->selBkColour;
+ int mode=ILD_NORMAL;
+
+ if(Drawing->iExtraImage[iImage]==0xFF) continue;
+ if(selected) mode=ILD_SELECTED;
+ else if(hottrack) {mode=ILD_FOCUS; colourFg=dat->hotTextColour;}
+ else if(Drawing->type==CLCIT_CONTACT && Drawing->flags&CONTACTF_NOTONLIST) {colourFg=dat->fontInfo[FONTID_NOTONLIST].colour; mode=ILD_BLEND50;}
+ {
+
+ }
+ if (dat->MetaIgnoreEmptyExtra) c--; else c=iImage;
+
+ testrc.left=clRect.right-dat->extraColumnSpacing*(dat->extraColumnsCount-c);
+ testrc.top=(y+((dat->rowHeight-16)>>1));
+ testrc.right=testrc.left+16;
+ testrc.bottom=testrc.top+16;
+ if (!PtInRect(&testrc,pt))
+ {
+ mode=ILD_NORMAL;
+ }
+
+ ImageList_DrawEx(dat->himlExtraColumns,Drawing->iExtraImage[iImage],hdcMem,clRect.right-dat->extraColumnSpacing*(dat->extraColumnsCount-c),y+((dat->rowHeight-16)>>1),0,0,CLR_NONE,colourFg,mode);
+ }
+ }
+ else
+ {
+ int ic=0;
+ for(iImage=0;iImage<dat->extraColumnsCount;iImage++) {
+ COLORREF colourFg=dat->selBkColour;
+ int mode=ILD_NORMAL;
+ int x;
+
+ //if(group->cl.items[group->scanIndex].iExtraImage[iImage]==0xFF) continue;
+ /*
+ if(selected) mode=ILD_SELECTED;
+ else if(hottrack) {mode=ILD_FOCUS; colourFg=dat->hotTextColour;}
+ else if(group->cl.items[group->scanIndex]->type==CLCIT_CONTACT && group->cl.items[group->scanIndex]->flags&CONTACTF_NOTONLIST) {colourFg=dat->fontInfo[FONTID_NOTONLIST].colour; mode=ILD_BLEND50;}
+
+ x=(dat->leftMargin+indent*dat->groupIndent+checkboxWidth+dat->iconXSpace-2+width);
+ x+=16;
+ x=x+dat->extraColumnSpacing*(ic);
+ if (iImage==dat->extraColumnsCount-1) {x=clRect.right-18;}
+ ImageList_DrawEx(dat->himlExtraColumns,group->cl.items[group->scanIndex].iExtraImage[iImage],hdcMem,
+ x,
+ y+((dat->rowHeight-16)>>1),0,0,CLR_NONE,colourFg,mode);
+ */
+ if(Drawing->iExtraImage[iImage]==0xFF) continue;
+ //if(selected) mode=ILD_SELECTED;
+ else if(hottrack) {mode=ILD_FOCUS; colourFg=dat->hotTextColour;}
+ else if(Drawing->type==CLCIT_CONTACT && Drawing->flags&CONTACTF_NOTONLIST) {colourFg=dat->fontInfo[FONTID_NOTONLIST].colour; mode=ILD_BLEND50;}
+
+ x=(dat->leftMargin+indent*dat->groupIndent+checkboxWidth+dat->iconXSpace-2+width);
+ x+=16;
+ x=x+dat->extraColumnSpacing*(ic);
+ if (iImage==dat->extraColumnsCount-1) {x=clRect.right-18;}
+ ImageList_DrawEx(dat->himlExtraColumns,Drawing->iExtraImage[iImage],hdcMem,
+ x,
+ y+((dat->rowHeight-16)>>1),0,0,CLR_NONE,colourFg,mode);
+
+ ic++;
+ }
+ }
+ }
+ }
+ index++;
+ y+=dat->rowHeight;
+
+ if (group->cl.items[group->scanIndex]->type==CLCIT_CONTACT && group->cl.items[group->scanIndex]->flags & CONTACTF_STATUSMSG) {
+ y+=dat->rowHeight;
+ index++;
+ }
+
+ //increment by subcontacts
+ if (group->cl.items[group->scanIndex]->subcontacts!=NULL && group->cl.items[group->scanIndex]->type!=CLCIT_GROUP)
+ if (group->cl.items[group->scanIndex]->SubExpanded)
+ if (subindex<group->cl.items[group->scanIndex]->SubAllocated-1)
+ subindex++;
+ else subindex=-1;
+
+ if(subindex==-1) {
+ if(group->cl.items[group->scanIndex]->type==CLCIT_GROUP && group->cl.items[group->scanIndex]->group->expanded)
+ {
+ group=group->cl.items[group->scanIndex]->group;
+ indent++;
+ group->scanIndex=0;
+ subindex=-1;
+ continue;
+ }
+ group->scanIndex++;
+ }
+ }
+ if(dat->iInsertionMark!=-1) { //insertion mark
+ HBRUSH hBrush,hoBrush;
+ POINT pts[8];
+ HRGN hRgn;
+
+ pts[0].x=dat->leftMargin; pts[0].y=dat->iInsertionMark*dat->rowHeight-dat->yScroll-4;
+ pts[1].x=pts[0].x+2; pts[1].y=pts[0].y+3;
+ pts[2].x=clRect.right-4; pts[2].y=pts[1].y;
+ pts[3].x=clRect.right-1; pts[3].y=pts[0].y-1;
+ pts[4].x=pts[3].x; pts[4].y=pts[0].y+7;
+ pts[5].x=pts[2].x+1; pts[5].y=pts[1].y+2;
+ pts[6].x=pts[1].x; pts[6].y=pts[5].y;
+ pts[7].x=pts[0].x; pts[7].y=pts[4].y;
+ hRgn=CreatePolygonRgn(pts,SIZEOF(pts),ALTERNATE);
+ hBrush=CreateSolidBrush(dat->fontInfo[FONTID_CONTACTS].colour);
+ hoBrush=(HBRUSH)SelectObject(hdcMem,hBrush);
+ FillRgn(hdcMem,hRgn,hBrush);
+ SelectObject(hdcMem,hoBrush);
+ DeleteObject(hBrush);
+ }
+ if(!grey)
+ BitBlt(hdc,rcPaint->left,rcPaint->top,rcPaint->right-rcPaint->left,rcPaint->bottom-rcPaint->top,hdcMem,rcPaint->left,rcPaint->top,SRCCOPY);
+ //DeleteDC(hdcMem);
+ if(hBrushAlternateGrey) DeleteObject(hBrushAlternateGrey);
+ if(grey) {
+ PBYTE bits;
+ BITMAPINFOHEADER bmih={0};
+ int i;
+ int greyRed,greyGreen,greyBlue;
+ COLORREF greyColour;
+ bmih.biBitCount=32;
+ bmih.biSize=sizeof(bmih);
+ bmih.biCompression=BI_RGB;
+ bmih.biHeight=-clRect.bottom;
+ bmih.biPlanes=1;
+ bmih.biWidth=clRect.right;
+ bits=(PBYTE)mir_alloc(4*bmih.biWidth*-bmih.biHeight);
+ GetDIBits(hdc,hBmpOsb,0,clRect.bottom,bits,(BITMAPINFO*)&bmih,DIB_RGB_COLORS);
+ greyColour=GetSysColor(COLOR_3DFACE);
+ greyRed=GetRValue(greyColour)*2;
+ greyGreen=GetGValue(greyColour)*2;
+ greyBlue=GetBValue(greyColour)*2;
+ if(divide3[0]==255) {
+ for(i=0; i < SIZEOF(divide3); i++) divide3[i]=(i+1)/3;
+ }
+ for(i=4*clRect.right*clRect.bottom-4;i>=0;i-=4) {
+ bits[i]=divide3[bits[i]+greyBlue];
+ bits[i+1]=divide3[bits[i+1]+greyGreen];
+ bits[i+2]=divide3[bits[i+2]+greyRed];
+ }
+ SetDIBitsToDevice(hdc,0,0,clRect.right,clRect.bottom,0,0,0,clRect.bottom,bits,(BITMAPINFO*)&bmih,DIB_RGB_COLORS);
+ mir_free(bits);
+ }
+ SelectObject(hdcMem,oldfont);
+ SelectObject(hdcMem,oldbmp);
+ DeleteObject(hBmpOsb);
+ DeleteDC(hdcMem);
+}
+
+void PaintClc(HWND hwnd,struct ClcData *dat,HDC hdc,RECT *rcPaint)
+{
+ if (SED.cbSize==sizeof(SED)&&SED.PaintClc!=NULL)
+ {
+ SED.PaintClc(hwnd,dat,hdc,rcPaint,pcli->hClcProtoCount,pcli->clcProto,himlCListClc);
+ return;
+ }
+ InternalPaintClc(hwnd,dat,hdc,rcPaint);
+}
diff --git a/plugins/Mwclist/clcutils.c b/plugins/Mwclist/clcutils.c
new file mode 100644
index 0000000000..5a7aa3d992
--- /dev/null
+++ b/plugins/Mwclist/clcutils.c
@@ -0,0 +1,296 @@
+/*
+
+Miranda IM: the free IM client for Microsoft* Windows*
+
+Copyright 2000-2003 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 "commonheaders.h"
+#include "m_clc.h"
+#include "clc.h"
+
+//loads of stuff that didn't really fit anywhere else
+
+int HitTest(HWND hwnd,struct ClcData *dat,int testx,int testy,struct ClcContact **contact,struct ClcGroup **group,DWORD *flags)
+{
+ struct ClcContact *hitcontact;
+ struct ClcGroup *hitgroup;
+ int hit,indent,width,i,cxSmIcon;
+ int checkboxWidth, subident,ic=0;
+ SIZE textSize;
+ HDC hdc;
+ HFONT oldfont;
+ RECT clRect;
+ DWORD style=GetWindowLong(hwnd,GWL_STYLE);
+
+ if(flags) *flags=0;
+ GetClientRect(hwnd,&clRect);
+ if(testx<0 || testy<0 || testy>=clRect.bottom || testx>=clRect.right) {
+ if(flags) {
+ if(testx<0) *flags|=CLCHT_TOLEFT;
+ else if(testx>=clRect.right) *flags|=CLCHT_TORIGHT;
+ if(testy<0) *flags|=CLCHT_ABOVE;
+ else if(testy>=clRect.bottom) *flags|=CLCHT_BELOW;
+ }
+ return -1;
+ }
+ if(testx<dat->leftMargin) {
+ if(flags) *flags|=CLCHT_INLEFTMARGIN|CLCHT_NOWHERE;
+ return -1;
+ }
+ hit=GetRowByIndex(dat ,(testy+dat->yScroll)/dat->rowHeight,&hitcontact,&hitgroup);
+ if(hit==-1) {
+ if(flags) *flags|=CLCHT_NOWHERE|CLCHT_BELOWITEMS;
+ return -1;
+ }
+ if(contact) *contact=hitcontact;
+ if(group) *group=hitgroup;
+ /////////
+ if (hitcontact->type==CLCIT_CONTACT && hitcontact->isSubcontact)
+ subident=dat->rowHeight/2;
+ else
+ subident=0;
+
+ for(indent=0;hitgroup->parent;indent++,hitgroup=hitgroup->parent);
+ if(testx<dat->leftMargin+indent*dat->groupIndent+subident) {
+ if(flags) *flags|=CLCHT_ONITEMINDENT;
+ return hit;
+ }
+ checkboxWidth=0;
+ if(style&CLS_CHECKBOXES && hitcontact->type==CLCIT_CONTACT) checkboxWidth=dat->checkboxSize+2;
+ if(style&CLS_GROUPCHECKBOXES && hitcontact->type==CLCIT_GROUP) checkboxWidth=dat->checkboxSize+2;
+ if(hitcontact->type==CLCIT_INFO && hitcontact->flags&CLCIIF_CHECKBOX) checkboxWidth=dat->checkboxSize+2;
+ if(testx<dat->leftMargin+indent*dat->groupIndent+checkboxWidth+subident) {
+ if(flags) *flags|=CLCHT_ONITEMCHECK;
+ return hit;
+ }
+ if(testx<dat->leftMargin+indent*dat->groupIndent+checkboxWidth+dat->iconXSpace+subident) {
+ if(flags) *flags|=CLCHT_ONITEMICON;
+ return hit;
+ }
+
+ hdc=GetDC(hwnd);
+ GetTextExtentPoint32(hdc,hitcontact->szText,lstrlen(hitcontact->szText),&textSize);
+ width=textSize.cx;
+
+ cxSmIcon=GetSystemMetrics(SM_CXSMICON);
+
+ for(i=0;i<dat->extraColumnsCount;i++) {
+ int x;
+ if(hitcontact->iExtraImage[i]==0xFF) continue;
+
+ if ((style&CLS_EX_MULTICOLUMNALIGNLEFT))
+ {
+ x=(dat->leftMargin+indent*dat->groupIndent+checkboxWidth+dat->iconXSpace-2+width);
+ x+=16;
+ x=x+dat->extraColumnSpacing*(ic);
+ if (i==dat->extraColumnsCount-1) {x=clRect.right-18;}
+ }else
+ {
+ int ir;
+ if (dat->MetaIgnoreEmptyExtra)
+ {
+ int j;
+ ir = 0;
+ for(j=i;j<dat->extraColumnsCount;j++)
+ if(hitcontact->iExtraImage[j]!=0xFF)
+ ir++;
+ }else
+ ir = dat->extraColumnsCount-i;
+
+ x=clRect.right-dat->extraColumnSpacing*ir;
+ }
+ ic++;
+
+ if(testx>=x &&
+ testx<x+cxSmIcon) {
+ if(flags) *flags|=CLCHT_ONITEMEXTRA|(i<<24);
+
+ ReleaseDC(hwnd,hdc);
+ return hit;
+ } }
+
+ if(hitcontact->type==CLCIT_GROUP)
+ oldfont=SelectObject(hdc,dat->fontInfo[FONTID_GROUPS].hFont);
+ else oldfont=SelectObject(hdc,dat->fontInfo[FONTID_CONTACTS].hFont);
+ if (DBGetContactSettingByte(NULL,"CLC","HiLightMode",0)==1)
+ {
+ if(flags) *flags|=CLCHT_ONITEMLABEL;
+ SelectObject(hdc,oldfont);
+ ReleaseDC(hwnd,hdc);
+ return hit;
+ }
+
+ GetTextExtentPoint32(hdc,hitcontact->szText,lstrlen(hitcontact->szText),&textSize);
+ width=textSize.cx;
+ if(hitcontact->type==CLCIT_GROUP) {
+ char *szCounts;
+ szCounts = pcli->pfnGetGroupCountsText(dat,hitcontact);
+ if(szCounts[0]) {
+ GetTextExtentPoint32A(hdc," ",1,&textSize);
+ width+=textSize.cx;
+ SelectObject(hdc,dat->fontInfo[FONTID_GROUPCOUNTS].hFont);
+ GetTextExtentPoint32A(hdc,szCounts,lstrlenA(szCounts),&textSize);
+ width+=textSize.cx;
+ }
+ }
+ SelectObject(hdc,oldfont);
+ ReleaseDC(hwnd,hdc);
+ if(testx<dat->leftMargin+indent*dat->groupIndent+checkboxWidth+dat->iconXSpace+width+4+subident) {
+ if(flags) *flags|=CLCHT_ONITEMLABEL;
+ return hit;
+ }
+ if(flags) *flags|=CLCHT_NOWHERE;
+ return -1;
+}
+
+void ScrollTo(HWND hwnd,struct ClcData *dat,int desty,int noSmooth)
+{
+ DWORD startTick,nowTick;
+ int oldy=dat->yScroll;
+ RECT clRect,rcInvalidate;
+ int maxy,previousy;
+
+ if(dat->iHotTrack!=-1 && dat->yScroll != desty) {
+ pcli->pfnInvalidateItem(hwnd,dat,dat->iHotTrack);
+ dat->iHotTrack=-1;
+ ReleaseCapture();
+ }
+ GetClientRect(hwnd,&clRect);
+ rcInvalidate=clRect;
+ maxy=dat->rowHeight*GetGroupContentsCount(&dat->list,2)-clRect.bottom;
+ if(desty>maxy) desty=maxy;
+ if(desty<0) desty=0;
+ if(abs(desty-dat->yScroll)<4) noSmooth=1;
+ if(!noSmooth && dat->exStyle&CLS_EX_NOSMOOTHSCROLLING) noSmooth=1;
+ previousy=dat->yScroll;
+ if(!noSmooth) {
+ startTick=GetTickCount();
+ for(;;) {
+ nowTick=GetTickCount();
+ if(nowTick>=startTick+dat->scrollTime) break;
+ dat->yScroll=oldy+(desty-oldy)*(int)(nowTick-startTick)/dat->scrollTime;
+ if(dat->backgroundBmpUse&CLBF_SCROLL || dat->hBmpBackground==NULL)
+ ScrollWindowEx(hwnd,0,previousy-dat->yScroll,NULL,NULL,NULL,NULL,SW_INVALIDATE);
+ else
+ InvalidateRect(hwnd,NULL,FALSE);
+ previousy=dat->yScroll;
+ SetScrollPos(hwnd,SB_VERT,dat->yScroll,TRUE);
+ UpdateWindow(hwnd);
+ }
+ }
+ dat->yScroll=desty;
+ if(dat->backgroundBmpUse&CLBF_SCROLL || dat->hBmpBackground==NULL)
+ ScrollWindowEx(hwnd,0,previousy-dat->yScroll,NULL,NULL,NULL,NULL,SW_INVALIDATE);
+ else
+ InvalidateRect(hwnd,NULL,FALSE);
+ SetScrollPos(hwnd,SB_VERT,dat->yScroll,TRUE);
+}
+
+void RecalcScrollBar(HWND hwnd,struct ClcData *dat)
+{
+ SCROLLINFO si={0};
+ RECT clRect;
+ NMCLISTCONTROL nm;
+ boolean sbar=FALSE;
+
+ GetClientRect(hwnd,&clRect);
+
+ si.cbSize=sizeof(si);
+ si.fMask=SIF_ALL;
+ si.nMin=0;
+ si.nMax=dat->rowHeight*GetGroupContentsCount(&dat->list,2)-1;
+ si.nPage=clRect.bottom;
+ si.nPos=dat->yScroll;
+
+ nm.hdr.code=CLN_LISTSIZECHANGE;
+ nm.hdr.hwndFrom=hwnd;
+ nm.hdr.idFrom=GetDlgCtrlID(hwnd);
+ nm.pt.y=si.nMax;
+ SendMessage(GetParent(hwnd),WM_NOTIFY,0,(LPARAM)&nm);
+
+ GetClientRect(hwnd,&clRect);
+ si.cbSize=sizeof(si);
+ si.fMask=SIF_ALL;
+ si.nMin=0;
+ si.nMax=dat->rowHeight*GetGroupContentsCount(&dat->list,2)-1;
+ si.nPage=clRect.bottom;
+ si.nPos=dat->yScroll;
+
+ sbar=(dat->noVScrollbar==1||(int)si.nPage>si.nMax);
+
+ ShowScrollBar(hwnd,SB_VERT,sbar? FALSE : TRUE);
+ if (!sbar) {
+ if ( GetWindowLong(hwnd,GWL_STYLE)&CLS_CONTACTLIST ) {
+ if ( dat->noVScrollbar==0 ) SetScrollInfo(hwnd,SB_VERT,&si,TRUE);
+ else SetScrollInfo(hwnd,SB_VERT,&si,FALSE);
+ }
+ else SetScrollInfo(hwnd,SB_VERT,&si,TRUE);
+ }
+ ScrollTo(hwnd,dat,dat->yScroll,1);
+}
+
+void CalcEipPosition( struct ClcData *dat, struct ClcContact *contact, struct ClcGroup *group, POINT *result)
+{
+ int indent;
+ for (indent = 0; group->parent; indent++, group = group->parent);
+ result->x = indent * dat->groupIndent + dat->iconXSpace - 2;
+ result->y = dat->selection * dat->rowHeight - dat->yScroll;
+
+ if (contact->type == CLCIT_CONTACT && contact->isSubcontact)
+ result->x += dat->rowHeight/2;
+}
+
+void GetDefaultFontSetting(int i,LOGFONT *lf,COLORREF *colour)
+{
+ SystemParametersInfo(SPI_GETICONTITLELOGFONT,sizeof(LOGFONT),lf,FALSE);
+ *colour=GetSysColor(COLOR_WINDOWTEXT);
+ switch(i) {
+ case FONTID_GROUPS:
+ lf->lfWeight=FW_BOLD;
+ break;
+ case FONTID_GROUPCOUNTS:
+ lf->lfHeight=(int)(lf->lfHeight*.75);
+ *colour=GetSysColor(COLOR_3DSHADOW);
+ break;
+ case FONTID_OFFINVIS:
+ case FONTID_INVIS:
+ lf->lfItalic=!lf->lfItalic;
+ break;
+ case FONTID_DIVIDERS:
+ lf->lfHeight=(int)(lf->lfHeight*.75);
+ break;
+ case FONTID_NOTONLIST:
+ *colour=GetSysColor(COLOR_3DSHADOW);
+ break;
+} }
+
+extern void ( *saveLoadClcOptions )(HWND hwnd,struct ClcData *dat);
+
+void LoadClcOptions(HWND hwnd,struct ClcData *dat)
+{
+ int i;
+
+ dat->style=GetWindowLong(hwnd,GWL_STYLE);
+ dat->MetaIgnoreEmptyExtra=DBGetContactSettingByte(NULL,"CLC","MetaIgnoreEmptyExtra",1);
+ saveLoadClcOptions( hwnd, dat );
+
+ for (i = 0; i <= FONTID_MAX; i++)
+ if (dat->fontInfo[i].fontHeight > dat->rowHeight)
+ dat->rowHeight = dat->fontInfo[i].fontHeight;
+}
diff --git a/plugins/Mwclist/clist.h b/plugins/Mwclist/clist.h
new file mode 100644
index 0000000000..9277f7d471
--- /dev/null
+++ b/plugins/Mwclist/clist.h
@@ -0,0 +1,60 @@
+/*
+
+Miranda IM: the free IM client for Microsoft* Windows*
+
+Copyright 2000-2003 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 _CLIST_H_
+#define _CLIST_H_
+
+void LoadContactTree(void);
+int ExtIconFromStatusMode(HANDLE hContact, const char *szProto,int status);
+HTREEITEM GetTreeItemByHContact(HANDLE hContact);
+void TrayIconUpdateWithImageList(int iImage,const char *szNewTip,char *szPreferredProto);
+void SortContacts(void);
+void ChangeContactIcon(HANDLE hContact,int iIcon,int add);
+int GetContactInfosForSort(HANDLE hContact,char **Proto,TCHAR **Name,int *Status);
+
+typedef struct {
+ HANDLE hContact;
+ TCHAR *name;
+ #if defined( _UNICODE )
+ char *szName;
+ #endif
+ TCHAR* szGroup;
+ int Hidden;
+ int noHiddenOffline;
+
+ char *szProto;
+ boolean protoNotExists;
+ int status;
+
+ int i;
+ int ApparentMode;
+ int NotOnList;
+ int IdleTS;
+ void *ClcContact;
+ BYTE IsExpanded;
+ boolean isUnknown;
+}
+ displayNameCacheEntry,*pdisplayNameCacheEntry;
+
+pdisplayNameCacheEntry GetContactFullCacheEntry(HANDLE hContact);
+
+#endif \ No newline at end of file
diff --git a/plugins/Mwclist/clist_mw_10.vcxproj b/plugins/Mwclist/clist_mw_10.vcxproj
new file mode 100644
index 0000000000..c7f85bbc0d
--- /dev/null
+++ b/plugins/Mwclist/clist_mw_10.vcxproj
@@ -0,0 +1,739 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectName>clist_mw</ProjectName>
+ <ProjectGuid>{56997126-0098-407A-94E1-7C5748C1C9EF}</ProjectGuid>
+ <RootNamespace>clist_mw</RootNamespace>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <CharacterSet>Unicode</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <CharacterSet>Unicode</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30128.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Configuration)/Plugins\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Configuration)/Obj/$(ProjectName)\</IntDir>
+ <IgnoreImportLibrary Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</IgnoreImportLibrary>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)$(Configuration)64/Plugins\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)$(Configuration)64/Obj/$(ProjectName)\</IntDir>
+ <IgnoreImportLibrary Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</IgnoreImportLibrary>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)/Plugins\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)/Obj/$(ProjectName)\</IntDir>
+ <IgnoreImportLibrary Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</IgnoreImportLibrary>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)$(Configuration)64/Plugins\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)$(Configuration)64/Obj/$(ProjectName)\</IntDir>
+ <IgnoreImportLibrary Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</IgnoreImportLibrary>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <Midl>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TargetEnvironment>Win32</TargetEnvironment>
+ <TypeLibraryName>.\Debug/clist_mw.tlb</TypeLibraryName>
+ <HeaderFileName>
+ </HeaderFileName>
+ </Midl>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>../../include;../../plugins/ExternalAPI;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;clist_mw_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>false</StringPooling>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <FloatingPointModel>Precise</FloatingPointModel>
+ <PrecompiledHeader>Use</PrecompiledHeader>
+ <PrecompiledHeaderFile>commonheaders.h</PrecompiledHeaderFile>
+ <AssemblerListingLocation>
+ </AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ <CompileAs>Default</CompileAs>
+ <DisableSpecificWarnings>4996;%(DisableSpecificWarnings)</DisableSpecificWarnings>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x0809</Culture>
+ <AdditionalIncludeDirectories>../../include;../../include/msapi/;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ </ResourceCompile>
+ <Link>
+ <AdditionalDependencies>comctl32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(TargetDir)$(TargetName).pdb</ProgramDatabaseFile>
+ <GenerateMapFile>false</GenerateMapFile>
+ <MapFileName>
+ </MapFileName>
+ <BaseAddress>0x6590000</BaseAddress>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <Midl>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TargetEnvironment>X64</TargetEnvironment>
+ <TypeLibraryName>.\Debug/clist_mw.tlb</TypeLibraryName>
+ <HeaderFileName>
+ </HeaderFileName>
+ </Midl>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>../../include;../../plugins/ExternalAPI;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;clist_mw_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>false</StringPooling>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <FloatingPointModel>Precise</FloatingPointModel>
+ <PrecompiledHeader>Use</PrecompiledHeader>
+ <PrecompiledHeaderFile>commonheaders.h</PrecompiledHeaderFile>
+ <AssemblerListingLocation>
+ </AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ <CompileAs>Default</CompileAs>
+ <DisableSpecificWarnings>4996;%(DisableSpecificWarnings)</DisableSpecificWarnings>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x0809</Culture>
+ <AdditionalIncludeDirectories>../../include;../../include/msapi/;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ </ResourceCompile>
+ <Link>
+ <AdditionalDependencies>comctl32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <AdditionalManifestDependencies>type=%27Win32%27 name=%27Microsoft.Windows.Common-Controls%27 version=%276.0.0.0%27 processorArchitecture=%27*%27 publicKeyToken=%276595b64144ccf1df%27 language=%27*%27;%(AdditionalManifestDependencies)</AdditionalManifestDependencies>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(TargetDir)$(TargetName).pdb</ProgramDatabaseFile>
+ <GenerateMapFile>false</GenerateMapFile>
+ <MapFileName>
+ </MapFileName>
+ <BaseAddress>0x6590000</BaseAddress>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <Midl>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TargetEnvironment>Win32</TargetEnvironment>
+ <TypeLibraryName>.\Release/clist_mw.tlb</TypeLibraryName>
+ <HeaderFileName>
+ </HeaderFileName>
+ </Midl>
+ <ClCompile>
+ <Optimization>MinSpace</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <FavorSizeOrSpeed>Size</FavorSizeOrSpeed>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <AdditionalIncludeDirectories>../../include;../../plugins/ExternalAPI;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;clist_mw_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <FloatingPointModel>Fast</FloatingPointModel>
+ <RuntimeTypeInfo>false</RuntimeTypeInfo>
+ <PrecompiledHeader>Use</PrecompiledHeader>
+ <PrecompiledHeaderFile>commonheaders.h</PrecompiledHeaderFile>
+ <AssemblerListingLocation>
+ </AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ <CompileAs>Default</CompileAs>
+ <DisableSpecificWarnings>4996;%(DisableSpecificWarnings)</DisableSpecificWarnings>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x0809</Culture>
+ <AdditionalIncludeDirectories>../../include;../../include/msapi/;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ </ResourceCompile>
+ <Link>
+ <AdditionalDependencies>comctl32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalManifestDependencies>type=%27Win32%27 name=%27Microsoft.Windows.Common-Controls%27 version=%276.0.0.0%27 processorArchitecture=%27X86%27 publicKeyToken=%276595b64144ccf1df%27 language=%27*%27;%(AdditionalManifestDependencies)</AdditionalManifestDependencies>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
+ <BaseAddress>0x6590000</BaseAddress>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <Midl>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TargetEnvironment>X64</TargetEnvironment>
+ <TypeLibraryName>.\Release/clist_mw.tlb</TypeLibraryName>
+ <HeaderFileName>
+ </HeaderFileName>
+ </Midl>
+ <ClCompile>
+ <Optimization>MinSpace</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <FavorSizeOrSpeed>Size</FavorSizeOrSpeed>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <AdditionalIncludeDirectories>../../include;../../plugins/ExternalAPI;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;clist_mw_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <FloatingPointModel>Fast</FloatingPointModel>
+ <RuntimeTypeInfo>false</RuntimeTypeInfo>
+ <PrecompiledHeader>Use</PrecompiledHeader>
+ <PrecompiledHeaderFile>commonheaders.h</PrecompiledHeaderFile>
+ <AssemblerListingLocation>
+ </AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ <CompileAs>Default</CompileAs>
+ <DisableSpecificWarnings>4996;%(DisableSpecificWarnings)</DisableSpecificWarnings>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x0809</Culture>
+ <AdditionalIncludeDirectories>../../include;../../include/msapi/;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ </ResourceCompile>
+ <Link>
+ <AdditionalDependencies>comctl32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalManifestDependencies>type=%27Win32%27 name=%27Microsoft.Windows.Common-Controls%27 version=%276.0.0.0%27 processorArchitecture=%27*%27 publicKeyToken=%276595b64144ccf1df%27 language=%27*%27;%(AdditionalManifestDependencies)</AdditionalManifestDependencies>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
+ <BaseAddress>0x6590000</BaseAddress>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="BkgrCfg.c" />
+ <ClCompile Include="clc.c">
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Disabled</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">EnableFastChecks</BasicRuntimeChecks>
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Full</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Use</PrecompiledHeader>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">commonheaders.h</PrecompiledHeaderFile>
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Full</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Use</PrecompiledHeader>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|x64'">commonheaders.h</PrecompiledHeaderFile>
+ </ClCompile>
+ <ClCompile Include="clcidents.c">
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Disabled</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">EnableFastChecks</BasicRuntimeChecks>
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Full</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Use</PrecompiledHeader>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">commonheaders.h</PrecompiledHeaderFile>
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Full</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Use</PrecompiledHeader>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|x64'">commonheaders.h</PrecompiledHeaderFile>
+ </ClCompile>
+ <ClCompile Include="clcitems.c">
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Disabled</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">EnableFastChecks</BasicRuntimeChecks>
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Full</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Use</PrecompiledHeader>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">commonheaders.h</PrecompiledHeaderFile>
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Full</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Use</PrecompiledHeader>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|x64'">commonheaders.h</PrecompiledHeaderFile>
+ </ClCompile>
+ <ClCompile Include="clcopts.c">
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Disabled</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">EnableFastChecks</BasicRuntimeChecks>
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Full</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Use</PrecompiledHeader>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">commonheaders.h</PrecompiledHeaderFile>
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Full</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Use</PrecompiledHeader>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|x64'">commonheaders.h</PrecompiledHeaderFile>
+ </ClCompile>
+ <ClCompile Include="clcpaint.c">
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Disabled</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">EnableFastChecks</BasicRuntimeChecks>
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Full</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Use</PrecompiledHeader>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">commonheaders.h</PrecompiledHeaderFile>
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Full</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Use</PrecompiledHeader>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|x64'">commonheaders.h</PrecompiledHeaderFile>
+ </ClCompile>
+ <ClCompile Include="clcutils.c">
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Disabled</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">EnableFastChecks</BasicRuntimeChecks>
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Full</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Use</PrecompiledHeader>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">commonheaders.h</PrecompiledHeaderFile>
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Full</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Use</PrecompiledHeader>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|x64'">commonheaders.h</PrecompiledHeaderFile>
+ </ClCompile>
+ <ClCompile Include="clistmenus.c">
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Disabled</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">EnableFastChecks</BasicRuntimeChecks>
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Full</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Use</PrecompiledHeader>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">commonheaders.h</PrecompiledHeaderFile>
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Full</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Use</PrecompiledHeader>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|x64'">commonheaders.h</PrecompiledHeaderFile>
+ </ClCompile>
+ <ClCompile Include="clistmod.c">
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Disabled</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">EnableFastChecks</BasicRuntimeChecks>
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Full</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Use</PrecompiledHeader>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">commonheaders.h</PrecompiledHeaderFile>
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Full</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Use</PrecompiledHeader>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|x64'">commonheaders.h</PrecompiledHeaderFile>
+ </ClCompile>
+ <ClCompile Include="clistopts.c">
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Disabled</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">EnableFastChecks</BasicRuntimeChecks>
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Full</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Use</PrecompiledHeader>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">commonheaders.h</PrecompiledHeaderFile>
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Full</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Use</PrecompiledHeader>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|x64'">commonheaders.h</PrecompiledHeaderFile>
+ </ClCompile>
+ <ClCompile Include="clistsettings.c">
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Disabled</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">EnableFastChecks</BasicRuntimeChecks>
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Full</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Use</PrecompiledHeader>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">commonheaders.h</PrecompiledHeaderFile>
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Full</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Use</PrecompiledHeader>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|x64'">commonheaders.h</PrecompiledHeaderFile>
+ </ClCompile>
+ <ClCompile Include="clisttray.c">
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Disabled</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">EnableFastChecks</BasicRuntimeChecks>
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Full</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Use</PrecompiledHeader>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">commonheaders.h</PrecompiledHeaderFile>
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Full</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Use</PrecompiledHeader>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|x64'">commonheaders.h</PrecompiledHeaderFile>
+ </ClCompile>
+ <ClCompile Include="clui.c">
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Disabled</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">EnableFastChecks</BasicRuntimeChecks>
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Full</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Use</PrecompiledHeader>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">commonheaders.h</PrecompiledHeaderFile>
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Full</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Use</PrecompiledHeader>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|x64'">commonheaders.h</PrecompiledHeaderFile>
+ </ClCompile>
+ <ClCompile Include="cluiopts.c">
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Disabled</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">EnableFastChecks</BasicRuntimeChecks>
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Full</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Use</PrecompiledHeader>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">commonheaders.h</PrecompiledHeaderFile>
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Full</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Use</PrecompiledHeader>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|x64'">commonheaders.h</PrecompiledHeaderFile>
+ </ClCompile>
+ <ClCompile Include="cluiservices.c">
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Disabled</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">EnableFastChecks</BasicRuntimeChecks>
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Full</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Use</PrecompiledHeader>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">commonheaders.h</PrecompiledHeaderFile>
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Full</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Use</PrecompiledHeader>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|x64'">commonheaders.h</PrecompiledHeaderFile>
+ </ClCompile>
+ <ClCompile Include="commonheaders.c">
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Disabled</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">EnableFastChecks</BasicRuntimeChecks>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Full</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">commonheaders.h</PrecompiledHeaderFile>
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Full</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|x64'">commonheaders.h</PrecompiledHeaderFile>
+ </ClCompile>
+ <ClCompile Include="contact.c">
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Disabled</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">EnableFastChecks</BasicRuntimeChecks>
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Full</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Use</PrecompiledHeader>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">commonheaders.h</PrecompiledHeaderFile>
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Full</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Use</PrecompiledHeader>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|x64'">commonheaders.h</PrecompiledHeaderFile>
+ </ClCompile>
+ <ClCompile Include="groupmenu.c">
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Full</Optimization>
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Full</Optimization>
+ </ClCompile>
+ <ClCompile Include="init.c">
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Disabled</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">EnableFastChecks</BasicRuntimeChecks>
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Full</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Use</PrecompiledHeader>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">commonheaders.h</PrecompiledHeaderFile>
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Full</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Use</PrecompiledHeader>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|x64'">commonheaders.h</PrecompiledHeaderFile>
+ </ClCompile>
+ <ClCompile Include="keyboard.c">
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Disabled</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">EnableFastChecks</BasicRuntimeChecks>
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Full</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Use</PrecompiledHeader>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">commonheaders.h</PrecompiledHeaderFile>
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Full</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Use</PrecompiledHeader>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|x64'">commonheaders.h</PrecompiledHeaderFile>
+ </ClCompile>
+ <ClCompile Include="CLUIFrames\cluiframes.c">
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../commonheaders.h</PrecompiledHeaderFile>
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Disabled</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">EnableFastChecks</BasicRuntimeChecks>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">../commonheaders.h</PrecompiledHeaderFile>
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Full</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../commonheaders.h</PrecompiledHeaderFile>
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Full</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|x64'">../commonheaders.h</PrecompiledHeaderFile>
+ </ClCompile>
+ <ClCompile Include="CLUIFrames\extraimage.c">
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../commonheaders.h</PrecompiledHeaderFile>
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Disabled</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">EnableFastChecks</BasicRuntimeChecks>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">../commonheaders.h</PrecompiledHeaderFile>
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Full</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../commonheaders.h</PrecompiledHeaderFile>
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Full</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|x64'">../commonheaders.h</PrecompiledHeaderFile>
+ </ClCompile>
+ <ClCompile Include="CLUIFrames\framesmenu.c">
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../commonheaders.h</PrecompiledHeaderFile>
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Disabled</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">EnableFastChecks</BasicRuntimeChecks>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">../commonheaders.h</PrecompiledHeaderFile>
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Full</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../commonheaders.h</PrecompiledHeaderFile>
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Full</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|x64'">../commonheaders.h</PrecompiledHeaderFile>
+ </ClCompile>
+ <ClCompile Include="CLUIFrames\statusbar.c">
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../commonheaders.h</PrecompiledHeaderFile>
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Disabled</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">EnableFastChecks</BasicRuntimeChecks>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">../commonheaders.h</PrecompiledHeaderFile>
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Full</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../commonheaders.h</PrecompiledHeaderFile>
+ <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Full</Optimization>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|x64'">../commonheaders.h</PrecompiledHeaderFile>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="CLUIFrames\cluiframes.h" />
+ <ClInclude Include="clc.h" />
+ <ClInclude Include="clist.h" />
+ <ClInclude Include="commonheaders.h" />
+ <ClInclude Include="resource.h" />
+ <ClInclude Include="statusmodes.h" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="res\&amp;RQ.ico" />
+ <None Include="res\1.ico" />
+ <None Include="res\2.ico" />
+ <None Include="res\3.ico" />
+ <None Include="res\4.ico" />
+ <None Include="res\5.ico" />
+ <None Include="res\6.ico" />
+ <None Include="res\7.ico" />
+ <None Include="res\8.ico" />
+ <None Include="res\addgoupp.ico" />
+ <None Include="res\AgileMobile.ico" />
+ <None Include="res\AlIcq.ico" />
+ <None Include="res\blank.ico" />
+ <None Include="res\Center.ico" />
+ <None Include="res\delete.ico" />
+ <None Include="res\dragcopy.cur" />
+ <None Include="res\dropuser.cur" />
+ <None Include="res\Gaim.ico" />
+ <None Include="res\globus.ico" />
+ <None Include="res\Gnomeicu.ico" />
+ <None Include="res\hyperlin.cur" />
+ <None Include="res\ico00001.ico" />
+ <None Include="res\ico00002.ico" />
+ <None Include="res\ico00003.ico" />
+ <None Include="res\ico00004.ico" />
+ <None Include="res\ico00005.ico" />
+ <None Include="res\icon2.ico" />
+ <None Include="res\IcqMac.ico" />
+ <None Include="res\IM+.ico" />
+ <None Include="res\IM2.ico" />
+ <None Include="res\Kopete.ico" />
+ <None Include="res\L.ico" />
+ <None Include="res\L4.ico" />
+ <None Include="res\L5.ico" />
+ <None Include="res\LibIcq2000.ico" />
+ <None Include="res\Licq.ico" />
+ <None Include="res\Micq.ico" />
+ <None Include="res\miranda.ico" />
+ <None Include="res\Mob2Icq.ico" />
+ <None Include="res\MobiCQ2.ico" />
+ <None Include="res\NICQ2.ico" />
+ <None Include="res\notick.ico" />
+ <None Include="res\notick1.ico" />
+ <None Include="res\PSI.ico" />
+ <None Include="res\QIP.ico" />
+ <None Include="res\rename.ico" />
+ <None Include="res\sendmail.ico" />
+ <None Include="res\Sim.ico" />
+ <None Include="res\sms.ico" />
+ <None Include="res\Spambot.ico" />
+ <None Include="res\Sticq.ico" />
+ <None Include="res\Stricq.ico" />
+ <None Include="res\Trillian.ico" />
+ <None Include="res\Vicq.ico" />
+ <None Include="res\WebIcq.ico" />
+ <None Include="res\Yamigo.ico" />
+ <None Include="res\Ysm.ico" />
+ </ItemGroup>
+ <ItemGroup>
+ <ResourceCompile Include="resource.rc" />
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/plugins/Mwclist/clist_mw_10.vcxproj.filters b/plugins/Mwclist/clist_mw_10.vcxproj.filters
new file mode 100644
index 0000000000..0febb4bf2d
--- /dev/null
+++ b/plugins/Mwclist/clist_mw_10.vcxproj.filters
@@ -0,0 +1,292 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Source Files">
+ <UniqueIdentifier>{6c881602-dfa1-45ce-8613-13d8c6bd3ad5}</UniqueIdentifier>
+ <Extensions>cpp;c;cxx;rc;def;r;odl;idl;hpj;bat</Extensions>
+ </Filter>
+ <Filter Include="Source Files\CLUIFrames">
+ <UniqueIdentifier>{eb8ace08-5854-4e7e-8dce-295b258ca064}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Header Files">
+ <UniqueIdentifier>{56b79972-29f3-40b1-bf23-ccffb8791acd}</UniqueIdentifier>
+ <Extensions>h;hpp;hxx;hm;inl</Extensions>
+ </Filter>
+ <Filter Include="Resource Files">
+ <UniqueIdentifier>{a32ba414-7a6a-4ff3-9127-2fba358accda}</UniqueIdentifier>
+ <Extensions>ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe</Extensions>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="BkgrCfg.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="clc.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="clcidents.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="clcitems.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="clcopts.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="clcpaint.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="clcutils.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="clistmenus.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="clistmod.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="clistopts.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="clistsettings.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="clisttray.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="clui.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="cluiopts.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="cluiservices.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="commonheaders.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="contact.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="groupmenu.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="init.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="keyboard.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="CLUIFrames\cluiframes.c">
+ <Filter>Source Files\CLUIFrames</Filter>
+ </ClCompile>
+ <ClCompile Include="CLUIFrames\extraimage.c">
+ <Filter>Source Files\CLUIFrames</Filter>
+ </ClCompile>
+ <ClCompile Include="CLUIFrames\framesmenu.c">
+ <Filter>Source Files\CLUIFrames</Filter>
+ </ClCompile>
+ <ClCompile Include="CLUIFrames\statusbar.c">
+ <Filter>Source Files\CLUIFrames</Filter>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="CLUIFrames\cluiframes.h">
+ <Filter>Source Files\CLUIFrames</Filter>
+ </ClInclude>
+ <ClInclude Include="clc.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="clist.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="commonheaders.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="resource.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="statusmodes.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="res\&amp;RQ.ico">
+ <Filter>Resource Files</Filter>
+ </None>
+ <None Include="res\1.ico">
+ <Filter>Resource Files</Filter>
+ </None>
+ <None Include="res\2.ico">
+ <Filter>Resource Files</Filter>
+ </None>
+ <None Include="res\3.ico">
+ <Filter>Resource Files</Filter>
+ </None>
+ <None Include="res\4.ico">
+ <Filter>Resource Files</Filter>
+ </None>
+ <None Include="res\5.ico">
+ <Filter>Resource Files</Filter>
+ </None>
+ <None Include="res\6.ico">
+ <Filter>Resource Files</Filter>
+ </None>
+ <None Include="res\7.ico">
+ <Filter>Resource Files</Filter>
+ </None>
+ <None Include="res\8.ico">
+ <Filter>Resource Files</Filter>
+ </None>
+ <None Include="res\addgoupp.ico">
+ <Filter>Resource Files</Filter>
+ </None>
+ <None Include="res\AgileMobile.ico">
+ <Filter>Resource Files</Filter>
+ </None>
+ <None Include="res\AlIcq.ico">
+ <Filter>Resource Files</Filter>
+ </None>
+ <None Include="res\blank.ico">
+ <Filter>Resource Files</Filter>
+ </None>
+ <None Include="res\Center.ico">
+ <Filter>Resource Files</Filter>
+ </None>
+ <None Include="res\delete.ico">
+ <Filter>Resource Files</Filter>
+ </None>
+ <None Include="res\dragcopy.cur">
+ <Filter>Resource Files</Filter>
+ </None>
+ <None Include="res\dropuser.cur">
+ <Filter>Resource Files</Filter>
+ </None>
+ <None Include="res\Gaim.ico">
+ <Filter>Resource Files</Filter>
+ </None>
+ <None Include="res\globus.ico">
+ <Filter>Resource Files</Filter>
+ </None>
+ <None Include="res\Gnomeicu.ico">
+ <Filter>Resource Files</Filter>
+ </None>
+ <None Include="res\hyperlin.cur">
+ <Filter>Resource Files</Filter>
+ </None>
+ <None Include="res\ico00001.ico">
+ <Filter>Resource Files</Filter>
+ </None>
+ <None Include="res\ico00002.ico">
+ <Filter>Resource Files</Filter>
+ </None>
+ <None Include="res\ico00003.ico">
+ <Filter>Resource Files</Filter>
+ </None>
+ <None Include="res\ico00004.ico">
+ <Filter>Resource Files</Filter>
+ </None>
+ <None Include="res\ico00005.ico">
+ <Filter>Resource Files</Filter>
+ </None>
+ <None Include="res\icon2.ico">
+ <Filter>Resource Files</Filter>
+ </None>
+ <None Include="res\IcqMac.ico">
+ <Filter>Resource Files</Filter>
+ </None>
+ <None Include="res\IM+.ico">
+ <Filter>Resource Files</Filter>
+ </None>
+ <None Include="res\IM2.ico">
+ <Filter>Resource Files</Filter>
+ </None>
+ <None Include="res\Kopete.ico">
+ <Filter>Resource Files</Filter>
+ </None>
+ <None Include="res\L.ico">
+ <Filter>Resource Files</Filter>
+ </None>
+ <None Include="res\L4.ico">
+ <Filter>Resource Files</Filter>
+ </None>
+ <None Include="res\L5.ico">
+ <Filter>Resource Files</Filter>
+ </None>
+ <None Include="res\LibIcq2000.ico">
+ <Filter>Resource Files</Filter>
+ </None>
+ <None Include="res\Licq.ico">
+ <Filter>Resource Files</Filter>
+ </None>
+ <None Include="res\Micq.ico">
+ <Filter>Resource Files</Filter>
+ </None>
+ <None Include="res\miranda.ico">
+ <Filter>Resource Files</Filter>
+ </None>
+ <None Include="res\Mob2Icq.ico">
+ <Filter>Resource Files</Filter>
+ </None>
+ <None Include="res\MobiCQ2.ico">
+ <Filter>Resource Files</Filter>
+ </None>
+ <None Include="res\NICQ2.ico">
+ <Filter>Resource Files</Filter>
+ </None>
+ <None Include="res\notick.ico">
+ <Filter>Resource Files</Filter>
+ </None>
+ <None Include="res\notick1.ico">
+ <Filter>Resource Files</Filter>
+ </None>
+ <None Include="res\PSI.ico">
+ <Filter>Resource Files</Filter>
+ </None>
+ <None Include="res\QIP.ico">
+ <Filter>Resource Files</Filter>
+ </None>
+ <None Include="res\rename.ico">
+ <Filter>Resource Files</Filter>
+ </None>
+ <None Include="res\sendmail.ico">
+ <Filter>Resource Files</Filter>
+ </None>
+ <None Include="res\Sim.ico">
+ <Filter>Resource Files</Filter>
+ </None>
+ <None Include="res\sms.ico">
+ <Filter>Resource Files</Filter>
+ </None>
+ <None Include="res\Spambot.ico">
+ <Filter>Resource Files</Filter>
+ </None>
+ <None Include="res\Sticq.ico">
+ <Filter>Resource Files</Filter>
+ </None>
+ <None Include="res\Stricq.ico">
+ <Filter>Resource Files</Filter>
+ </None>
+ <None Include="res\Trillian.ico">
+ <Filter>Resource Files</Filter>
+ </None>
+ <None Include="res\Vicq.ico">
+ <Filter>Resource Files</Filter>
+ </None>
+ <None Include="res\WebIcq.ico">
+ <Filter>Resource Files</Filter>
+ </None>
+ <None Include="res\Yamigo.ico">
+ <Filter>Resource Files</Filter>
+ </None>
+ <None Include="res\Ysm.ico">
+ <Filter>Resource Files</Filter>
+ </None>
+ </ItemGroup>
+ <ItemGroup>
+ <ResourceCompile Include="resource.rc">
+ <Filter>Resource Files</Filter>
+ </ResourceCompile>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/plugins/Mwclist/clistmenus.c b/plugins/Mwclist/clistmenus.c
new file mode 100644
index 0000000000..3d03b81b90
--- /dev/null
+++ b/plugins/Mwclist/clistmenus.c
@@ -0,0 +1,61 @@
+/*
+
+Miranda IM: the free IM client for Microsoft* Windows*
+
+Copyright 2000-2006 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 "commonheaders.h"
+#pragma hdrstop
+
+static HMENU hMainMenu, hMainStatusMenu;
+
+void DestroyTrayMenu(HMENU hMenu)
+{
+ int i, cnt;
+
+ cnt = GetMenuItemCount(hMenu);
+ for (i=0; i<cnt; ++i)
+ {
+ HMENU hSubMenu = GetSubMenu(hMenu, i);
+ if (hSubMenu == hMainStatusMenu || hSubMenu == hMainMenu)
+ RemoveMenu(hMenu, i--, MF_BYPOSITION);
+ }
+ DestroyMenu(hMenu);
+}
+
+INT_PTR CloseAction(WPARAM wParam,LPARAM lParam)
+{
+ if (CallService(MS_SYSTEM_OKTOEXIT,(WPARAM)0,(LPARAM)0))
+ DestroyWindow(pcli->hwndContactList);
+
+ return(0);
+}
+
+int InitCustomMenus(void)
+{
+ CreateServiceFunction("CloseAction",CloseAction);
+ hMainStatusMenu = (HMENU)CallService(MS_CLIST_MENUGETSTATUS,0,0);
+ hMainMenu = (HMENU)CallService(MS_CLIST_MENUGETMAIN,0,0);
+
+ return 0;
+}
+
+void UninitCustomMenus(void)
+{
+}
diff --git a/plugins/Mwclist/clistmod.c b/plugins/Mwclist/clistmod.c
new file mode 100644
index 0000000000..962925d9aa
--- /dev/null
+++ b/plugins/Mwclist/clistmod.c
@@ -0,0 +1,153 @@
+/*
+
+Miranda IM: the free IM client for Microsoft* Windows*
+
+Copyright 2000-2003 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 "commonheaders.h"
+
+extern int DefaultImageListColorDepth;
+
+int InitCustomMenus(void);
+void UninitCustomMenus(void);
+int ContactSettingChanged(WPARAM wParam,LPARAM lParam);
+int CListOptInit(WPARAM wParam,LPARAM lParam);
+INT_PTR ContactChangeGroup(WPARAM wParam,LPARAM lParam);
+INT_PTR HotkeysProcessMessage(WPARAM wParam,LPARAM lParam) { return pcli->pfnHotkeysProcessMessage(wParam, lParam); }
+void InitTrayMenus(void);
+
+HIMAGELIST hCListImages;
+
+HANDLE hContactIconChangedEvent;
+extern BYTE nameOrder[];
+
+static HANDLE hSettingChanged, hProtoAckHook;
+
+/////////// End by FYR ////////
+int cli_IconFromStatusMode(const char *szProto,int nStatus, HANDLE hContact)
+{
+ int result=-1;
+ if (hContact && szProto) {
+ char * szActProto=(char*)szProto;
+ char AdvancedService[255]={0};
+ int nActStatus=nStatus;
+ HANDLE hActContact=hContact;
+ if (!DBGetContactSettingByte(NULL,"CLC","Meta",0) && !strcmp(szActProto,"MetaContacts")) {
+ // substitute params by mostonline contact datas
+ HANDLE hMostOnlineContact=(HANDLE)CallService(MS_MC_GETMOSTONLINECONTACT,(WPARAM)hActContact,0);
+ if (hMostOnlineContact && hMostOnlineContact != (HANDLE)CALLSERVICE_NOTFOUND) {
+ pdisplayNameCacheEntry cacheEntry;
+ cacheEntry=(pdisplayNameCacheEntry)pcli->pfnGetCacheEntry(hMostOnlineContact);
+ if (cacheEntry && cacheEntry->szProto) {
+ szActProto=cacheEntry->szProto;
+ nActStatus=cacheEntry->status;
+ hActContact=hMostOnlineContact;
+ }
+ }
+ }
+ _snprintf(AdvancedService,sizeof(AdvancedService),"%s%s",szActProto,"/GetAdvancedStatusIcon");
+
+ if (ServiceExists(AdvancedService))
+ result = CallService(AdvancedService,(WPARAM)hActContact, (LPARAM)0);
+
+ if (result==-1 || !(LOWORD(result)))
+ // result == -1 means no Advanced icon. LOWORD(result) == 0 happens when Advanced icon returned by ICQ (i.e. no transpot)
+ result = saveIconFromStatusMode(szActProto,nActStatus,NULL);
+ }
+ else result=saveIconFromStatusMode(szProto,nStatus,NULL);
+ return result;
+}
+
+
+////////// By FYR/////////////
+int ExtIconFromStatusMode(HANDLE hContact, const char *szProto,int status)
+{
+/* if ( DBGetContactSettingByte( NULL, "CLC", "Meta", 0 ) == 1 )
+ return pcli->pfnIconFromStatusMode(szProto,status,hContact);
+
+ if ( szProto != NULL ) {
+ if (strcmp(szProto,"MetaContacts") == 0 ) {
+ hContact=(HANDLE)CallService(MS_MC_GETMOSTONLINECONTACT,(UINT)hContact,0);
+ if ( hContact != 0 ) {
+ szProto=(char*)CallService(MS_PROTO_GETCONTACTBASEPROTO,(UINT)hContact,0);
+ status=DBGetContactSettingWord(hContact,szProto,"Status",ID_STATUS_OFFLINE);
+ }
+ }
+ }*/
+
+ return pcli->pfnIconFromStatusMode(szProto,status,hContact);
+}
+
+/////////// End by FYR ////////
+
+static int ProtocolAck(WPARAM wParam,LPARAM lParam)
+{
+ ACKDATA *ack=(ACKDATA*)lParam;
+ if (ack->type==ACKTYPE_AWAYMSG && ack->lParam) {
+ DBVARIANT dbv;
+ if (!DBGetContactSettingString(ack->hContact, "CList", "StatusMsg", &dbv)) {
+ if (!strcmp(dbv.pszVal, (char *)ack->lParam)) {
+ DBFreeVariant(&dbv);
+ return 0;
+ }
+ DBFreeVariant(&dbv);
+ }
+ if ( DBGetContactSettingByte(NULL,"CList","ShowStatusMsg",0) || DBGetContactSettingByte(ack->hContact,"CList","StatusMsgAuto",0))
+ DBWriteContactSettingString(ack->hContact, "CList", "StatusMsg", (char *)ack->lParam);
+ }
+
+ return 0;
+}
+
+static INT_PTR GetStatusMode(WPARAM wParam, LPARAM lParam)
+{
+ return pcli->currentDesiredStatusMode;
+}
+
+static int ContactListShutdownProc(WPARAM wParam,LPARAM lParam)
+{
+ UnhookEvent(hProtoAckHook);
+ UninitCustomMenus();
+ return 0;
+}
+
+int LoadContactListModule(void)
+{
+ HANDLE hContact = (HANDLE) CallService(MS_DB_CONTACT_FINDFIRST, 0, 0);
+ while (hContact!=NULL) {
+ DBWriteContactSettingString(hContact, "CList", "StatusMsg", "");
+ hContact = (HANDLE) CallService(MS_DB_CONTACT_FINDNEXT, (WPARAM) hContact, 0);
+ }
+
+ hCListImages = (HIMAGELIST)CallService(MS_CLIST_GETICONSIMAGELIST, 0, 0);
+ DefaultImageListColorDepth=DBGetContactSettingDword(NULL,"CList","DefaultImageListColorDepth",ILC_COLOR32);
+
+ hProtoAckHook = (HANDLE) HookEvent(ME_PROTO_ACK, ProtocolAck);
+ HookEvent(ME_OPT_INITIALISE,CListOptInit);
+ HookEvent(ME_SYSTEM_SHUTDOWN,ContactListShutdownProc);
+ hSettingChanged=HookEvent(ME_DB_CONTACT_SETTINGCHANGED,ContactSettingChanged);
+ hContactIconChangedEvent=CreateHookableEvent(ME_CLIST_CONTACTICONCHANGED);
+ CreateServiceFunction(MS_CLIST_CONTACTCHANGEGROUP,ContactChangeGroup);
+ CreateServiceFunction(MS_CLIST_HOTKEYSPROCESSMESSAGE,HotkeysProcessMessage);
+ CreateServiceFunction(MS_CLIST_GETSTATUSMODE, GetStatusMode);
+
+ InitCustomMenus();
+ InitTrayMenus();
+ return 0;
+}
diff --git a/plugins/Mwclist/clistopts.c b/plugins/Mwclist/clistopts.c
new file mode 100644
index 0000000000..07cef251af
--- /dev/null
+++ b/plugins/Mwclist/clistopts.c
@@ -0,0 +1,224 @@
+/*
+
+Miranda IM: the free IM client for Microsoft* Windows*
+
+Copyright 2000-2003 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 "commonheaders.h"
+#include "m_clui.h"
+#include "clist.h"
+#include "m_clc.h"
+
+int HotKeysRegister(HWND hwnd);
+void HotKeysUnregister(HWND hwnd);
+void LoadContactTree(void);
+void SortContacts(void);
+
+static INT_PTR CALLBACK DlgProcGenOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam);
+
+static UINT expertOnlyControls[]={IDC_ALWAYSSTATUS};
+int CListOptInit(WPARAM wParam,LPARAM lParam)
+{
+ OPTIONSDIALOGPAGE odp;
+
+ ZeroMemory(&odp,sizeof(odp));
+ odp.cbSize=sizeof(odp);
+ odp.position=-1000000000;
+ odp.hInstance=g_hInst;
+ odp.pszTemplate=MAKEINTRESOURCEA(IDD_OPT_CLIST);
+ odp.pszTitle=LPGEN("Contact List");
+ odp.pfnDlgProc=DlgProcGenOpts;
+ odp.flags=ODPF_BOLDGROUPS;
+ odp.nIDBottomSimpleControl=IDC_STCLISTGROUP;
+ odp.expertOnlyControls=expertOnlyControls;
+ odp.nExpertOnlyControls=sizeof(expertOnlyControls)/sizeof(expertOnlyControls[0]);
+ CallService(MS_OPT_ADDPAGE,wParam,(LPARAM)&odp);
+ return 0;
+}
+
+static INT_PTR CALLBACK DlgProcGenOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ switch (msg)
+ {
+ case WM_USER+1:
+ {
+ HANDLE hContact=(HANDLE)wParam;
+ DBCONTACTWRITESETTING * ws = (DBCONTACTWRITESETTING *)lParam;
+ if ( hContact == NULL && ws != NULL && ws->szModule != NULL && ws->szSetting != NULL
+ && lstrcmpiA(ws->szModule,"CList")==0 && lstrcmpiA(ws->szSetting,"UseGroups")==0
+ && IsWindowVisible(hwndDlg) ) {
+ CheckDlgButton(hwndDlg,IDC_DISABLEGROUPS,ws->value.bVal == 0);
+ }
+ break;
+ }
+ case WM_DESTROY:
+ {
+ UnhookEvent( (HANDLE)GetWindowLongPtr(hwndDlg,GWLP_USERDATA) );
+ break;
+ }
+
+ case WM_INITDIALOG:
+ TranslateDialogDefault(hwndDlg);
+ SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)HookEventMessage(ME_DB_CONTACT_SETTINGCHANGED,hwndDlg,WM_USER+1));
+
+ CheckDlgButton(hwndDlg, IDC_ONTOP, DBGetContactSettingByte(NULL,"CList","OnTop",SETTING_ONTOP_DEFAULT) ? BST_CHECKED : BST_UNCHECKED);
+ CheckDlgButton(hwndDlg, IDC_HIDEOFFLINE, DBGetContactSettingByte(NULL,"CList","HideOffline",SETTING_HIDEOFFLINE_DEFAULT) ? BST_CHECKED : BST_UNCHECKED);
+ CheckDlgButton(hwndDlg, IDC_HIDEEMPTYGROUPS, DBGetContactSettingByte(NULL,"CList","HideEmptyGroups",SETTING_HIDEEMPTYGROUPS_DEFAULT) ? BST_CHECKED : BST_UNCHECKED);
+ CheckDlgButton(hwndDlg, IDC_DISABLEGROUPS, DBGetContactSettingByte(NULL,"CList","UseGroups",SETTING_USEGROUPS_DEFAULT) ? BST_UNCHECKED : BST_CHECKED);
+ CheckDlgButton(hwndDlg, IDC_SORTBYNAME,
+ !DBGetContactSettingByte(NULL,"CList","SortByStatus",SETTING_SORTBYSTATUS_DEFAULT) &&
+ !DBGetContactSettingByte(NULL,"CList","SortByProto",SETTING_SORTBYPROTO_DEFAULT) ? BST_CHECKED : BST_UNCHECKED);
+
+ CheckDlgButton(hwndDlg, IDC_SORTBYSTATUS, DBGetContactSettingByte(NULL,"CList","SortByStatus",SETTING_SORTBYSTATUS_DEFAULT) ? BST_CHECKED : BST_UNCHECKED);
+ CheckDlgButton(hwndDlg, IDC_NOOFFLINEMOVE, DBGetContactSettingByte(NULL,"CList","NoOfflineBottom",SETTING_NOOFFLINEBOTTOM_DEFAULT) ? BST_CHECKED : BST_UNCHECKED);
+
+ CheckDlgButton(hwndDlg, IDC_SORTBYPROTO, DBGetContactSettingByte(NULL,"CList","SortByProto",SETTING_SORTBYPROTO_DEFAULT) ? BST_CHECKED : BST_UNCHECKED);
+ CheckDlgButton(hwndDlg, IDC_CONFIRMDELETE, DBGetContactSettingByte(NULL,"CList","ConfirmDelete",SETTING_CONFIRMDELETE_DEFAULT) ? BST_CHECKED : BST_UNCHECKED);
+ CheckDlgButton(hwndDlg, IDC_AUTOHIDE, DBGetContactSettingByte(NULL,"CList","AutoHide",SETTING_AUTOHIDE_DEFAULT) ? BST_CHECKED : BST_UNCHECKED);
+ EnableWindow(GetDlgItem(hwndDlg,IDC_HIDETIME),IsDlgButtonChecked(hwndDlg,IDC_AUTOHIDE));
+ EnableWindow(GetDlgItem(hwndDlg,IDC_HIDETIMESPIN),IsDlgButtonChecked(hwndDlg,IDC_AUTOHIDE));
+ { DWORD caps=CallService(MS_CLUI_GETCAPS,CLUICAPS_FLAGS1,0);
+ if(!(caps&CLUIF_HIDEEMPTYGROUPS)) ShowWindow(GetDlgItem(hwndDlg,IDC_HIDEEMPTYGROUPS),SW_HIDE);
+ if(!(caps&CLUIF_DISABLEGROUPS)) ShowWindow(GetDlgItem(hwndDlg,IDC_DISABLEGROUPS),SW_HIDE);
+ if(caps&CLUIF_HASONTOPOPTION) ShowWindow(GetDlgItem(hwndDlg,IDC_ONTOP),SW_HIDE);
+ if(caps&CLUIF_HASAUTOHIDEOPTION) {
+ ShowWindow(GetDlgItem(hwndDlg,IDC_AUTOHIDE),SW_HIDE);
+ ShowWindow(GetDlgItem(hwndDlg,IDC_HIDETIME),SW_HIDE);
+ ShowWindow(GetDlgItem(hwndDlg,IDC_HIDETIMESPIN),SW_HIDE);
+ ShowWindow(GetDlgItem(hwndDlg,IDC_STAUTOHIDESECS),SW_HIDE);
+ }
+ }
+ SendDlgItemMessage(hwndDlg,IDC_HIDETIMESPIN,UDM_SETRANGE,0,MAKELONG(900,1));
+ SendDlgItemMessage(hwndDlg,IDC_HIDETIMESPIN,UDM_SETPOS,0,MAKELONG(DBGetContactSettingWord(NULL,"CList","HideTime",SETTING_HIDETIME_DEFAULT),0));
+ CheckDlgButton(hwndDlg, IDC_ONECLK, DBGetContactSettingByte(NULL,"CList","Tray1Click",SETTING_TRAY1CLICK_DEFAULT) ? BST_CHECKED : BST_UNCHECKED);
+ CheckDlgButton(hwndDlg, IDC_ALWAYSSTATUS, DBGetContactSettingByte(NULL,"CList","AlwaysStatus",SETTING_ALWAYSSTATUS_DEFAULT) ? BST_CHECKED : BST_UNCHECKED);
+ CheckDlgButton(hwndDlg, IDC_ALWAYSMULTI, !DBGetContactSettingByte(NULL,"CList","AlwaysMulti",SETTING_ALWAYSMULTI_DEFAULT) ? BST_CHECKED : BST_UNCHECKED);
+ CheckDlgButton(hwndDlg, IDC_DONTCYCLE, DBGetContactSettingByte(NULL,"CList","TrayIcon",SETTING_TRAYICON_DEFAULT)==SETTING_TRAYICON_SINGLE ? BST_CHECKED : BST_UNCHECKED);
+ CheckDlgButton(hwndDlg, IDC_CYCLE, DBGetContactSettingByte(NULL,"CList","TrayIcon",SETTING_TRAYICON_DEFAULT)==SETTING_TRAYICON_CYCLE ? BST_CHECKED : BST_UNCHECKED);
+ CheckDlgButton(hwndDlg, IDC_MULTITRAY, DBGetContactSettingByte(NULL,"CList","TrayIcon",SETTING_TRAYICON_DEFAULT)==SETTING_TRAYICON_MULTI ? BST_CHECKED : BST_UNCHECKED);
+ CheckDlgButton(hwndDlg, IDC_DISABLEBLINK, DBGetContactSettingByte(NULL,"CList","DisableTrayFlash",0) == 1 ? BST_CHECKED : BST_UNCHECKED);
+ CheckDlgButton(hwndDlg, IDC_ICONBLINK, DBGetContactSettingByte(NULL,"CList","NoIconBlink",0) == 1 ? BST_CHECKED : BST_UNCHECKED );
+
+ if(IsDlgButtonChecked(hwndDlg,IDC_DONTCYCLE)) {
+ EnableWindow(GetDlgItem(hwndDlg,IDC_CYCLETIMESPIN),FALSE);
+ EnableWindow(GetDlgItem(hwndDlg,IDC_CYCLETIME),FALSE);
+ EnableWindow(GetDlgItem(hwndDlg,IDC_ALWAYSMULTI),FALSE);
+ }
+ if(IsDlgButtonChecked(hwndDlg,IDC_CYCLE)) {
+ EnableWindow(GetDlgItem(hwndDlg,IDC_PRIMARYSTATUS),FALSE);
+ EnableWindow(GetDlgItem(hwndDlg,IDC_ALWAYSMULTI),FALSE);
+ }
+ if(IsDlgButtonChecked(hwndDlg,IDC_MULTITRAY)) {
+ EnableWindow(GetDlgItem(hwndDlg,IDC_CYCLETIMESPIN),FALSE);
+ EnableWindow(GetDlgItem(hwndDlg,IDC_CYCLETIME),FALSE);
+ EnableWindow(GetDlgItem(hwndDlg,IDC_PRIMARYSTATUS),FALSE);
+ }
+ SendDlgItemMessage(hwndDlg,IDC_CYCLETIMESPIN,UDM_SETRANGE,0,MAKELONG(120,1));
+ SendDlgItemMessage(hwndDlg,IDC_CYCLETIMESPIN,UDM_SETPOS,0,MAKELONG(DBGetContactSettingWord(NULL,"CList","CycleTime",SETTING_CYCLETIME_DEFAULT),0));
+ { int i,count,item;
+ PROTOACCOUNT **accs;
+ DBVARIANT dbv={DBVT_DELETED};
+ DBGetContactSettingString(NULL,"CList","PrimaryStatus",&dbv);
+ ProtoEnumAccounts( &count, &accs );
+ item=SendDlgItemMessage(hwndDlg,IDC_PRIMARYSTATUS,CB_ADDSTRING,0,(LPARAM)TranslateT("Global"));
+ SendDlgItemMessage(hwndDlg,IDC_PRIMARYSTATUS,CB_SETITEMDATA,item,(LPARAM)0);
+ for ( i=0; i < count; i++ ) {
+ if ( !IsAccountEnabled( accs[i] ) || CallProtoService( accs[i]->szModuleName, PS_GETCAPS, PFLAGNUM_2, 0 ) == 0 )
+ continue;
+
+ item=SendDlgItemMessage(hwndDlg,IDC_PRIMARYSTATUS,CB_ADDSTRING,0,(LPARAM)accs[i]->tszAccountName);
+ SendDlgItemMessage(hwndDlg,IDC_PRIMARYSTATUS,CB_SETITEMDATA,item,(LPARAM)accs[i] );
+ if ( dbv.type == DBVT_ASCIIZ && !lstrcmpA( dbv.pszVal, accs[i]->szModuleName ))
+ SendDlgItemMessage(hwndDlg,IDC_PRIMARYSTATUS,CB_SETCURSEL,item,0);
+ }
+ }
+ if(-1==(int)SendDlgItemMessage(hwndDlg,IDC_PRIMARYSTATUS,CB_GETCURSEL,0,0))
+ SendDlgItemMessage(hwndDlg,IDC_PRIMARYSTATUS,CB_SETCURSEL,0,0);
+ SendDlgItemMessage(hwndDlg,IDC_BLINKSPIN,UDM_SETBUDDY,(WPARAM)GetDlgItem(hwndDlg,IDC_BLINKTIME),0); // set buddy
+ SendDlgItemMessage(hwndDlg,IDC_BLINKSPIN,UDM_SETRANGE,0,MAKELONG(0x3FFF,250));
+ SendDlgItemMessage(hwndDlg,IDC_BLINKSPIN,UDM_SETPOS,0,MAKELONG(DBGetContactSettingWord(NULL,"CList","IconFlashTime",550),0));
+ return TRUE;
+ case WM_COMMAND:
+ if(LOWORD(wParam)==IDC_AUTOHIDE) {
+ EnableWindow(GetDlgItem(hwndDlg,IDC_HIDETIME),IsDlgButtonChecked(hwndDlg,IDC_AUTOHIDE));
+ EnableWindow(GetDlgItem(hwndDlg,IDC_HIDETIMESPIN),IsDlgButtonChecked(hwndDlg,IDC_AUTOHIDE));
+ }
+ if(LOWORD(wParam)==IDC_DONTCYCLE || LOWORD(wParam)==IDC_CYCLE || LOWORD(wParam)==IDC_MULTITRAY) {
+ EnableWindow(GetDlgItem(hwndDlg,IDC_PRIMARYSTATUS),IsDlgButtonChecked(hwndDlg,IDC_DONTCYCLE));
+ EnableWindow(GetDlgItem(hwndDlg,IDC_CYCLETIME),IsDlgButtonChecked(hwndDlg,IDC_CYCLE));
+ EnableWindow(GetDlgItem(hwndDlg,IDC_CYCLETIMESPIN),IsDlgButtonChecked(hwndDlg,IDC_CYCLE));
+ EnableWindow(GetDlgItem(hwndDlg,IDC_ALWAYSMULTI),IsDlgButtonChecked(hwndDlg,IDC_MULTITRAY));
+ }
+ if((LOWORD(wParam)==IDC_HIDETIME || LOWORD(wParam)==IDC_CYCLETIME) && HIWORD(wParam)!=EN_CHANGE) break;
+ if(LOWORD(wParam)==IDC_PRIMARYSTATUS && HIWORD(wParam)!=CBN_SELCHANGE) break;
+ if((LOWORD(wParam)==IDC_HIDETIME || LOWORD(wParam)==IDC_CYCLETIME) && (HIWORD(wParam)!=EN_CHANGE || (HWND)lParam!=GetFocus())) return 0;
+ if (LOWORD(wParam)==IDC_BLINKTIME && HIWORD(wParam) != EN_CHANGE || (HWND)lParam != GetFocus()) return 0; // dont make apply enabled during buddy set crap
+ SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
+ break;
+ case WM_NOTIFY:
+ switch (((LPNMHDR)lParam)->idFrom) {
+ case 0:
+ switch (((LPNMHDR)lParam)->code)
+ {
+ case PSN_APPLY:
+ DBWriteContactSettingByte(NULL,"CList","HideOffline",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_HIDEOFFLINE));
+ { DWORD caps=CallService(MS_CLUI_GETCAPS,CLUICAPS_FLAGS1,0);
+ if(caps&CLUIF_HIDEEMPTYGROUPS) DBWriteContactSettingByte(NULL,"CList","HideEmptyGroups",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_HIDEEMPTYGROUPS));
+ if(caps&CLUIF_DISABLEGROUPS) DBWriteContactSettingByte(NULL,"CList","UseGroups",(BYTE)!IsDlgButtonChecked(hwndDlg,IDC_DISABLEGROUPS));
+ if(!(caps&CLUIF_HASONTOPOPTION)) {
+ DBWriteContactSettingByte(NULL,"CList","OnTop",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_ONTOP));
+ SetWindowPos(pcli->hwndContactList,IsDlgButtonChecked(hwndDlg,IDC_ONTOP)?HWND_TOPMOST:HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
+ }
+ if(!(caps&CLUIF_HASAUTOHIDEOPTION)) {
+ DBWriteContactSettingByte(NULL,"CList","AutoHide",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_AUTOHIDE));
+ DBWriteContactSettingWord(NULL,"CList","HideTime",(WORD)SendDlgItemMessage(hwndDlg,IDC_HIDETIMESPIN,UDM_GETPOS,0,0));
+ }
+ }
+ DBWriteContactSettingByte(NULL,"CList","SortByStatus",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_SORTBYSTATUS));
+ DBWriteContactSettingByte(NULL,"CList","SortByProto",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_SORTBYPROTO));
+ DBWriteContactSettingByte(NULL,"CList","NoOfflineBottom",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_NOOFFLINEMOVE));
+
+ DBWriteContactSettingByte(NULL,"CList","ConfirmDelete",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_CONFIRMDELETE));
+ DBWriteContactSettingByte(NULL,"CList","Tray1Click",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_ONECLK));
+ DBWriteContactSettingByte(NULL,"CList","AlwaysStatus",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_ALWAYSSTATUS));
+ DBWriteContactSettingByte(NULL,"CList","AlwaysMulti",(BYTE)!IsDlgButtonChecked(hwndDlg,IDC_ALWAYSMULTI));
+ DBWriteContactSettingByte(NULL,"CList","TrayIcon",(BYTE)(IsDlgButtonChecked(hwndDlg,IDC_DONTCYCLE)?SETTING_TRAYICON_SINGLE:(IsDlgButtonChecked(hwndDlg,IDC_CYCLE)?SETTING_TRAYICON_CYCLE:SETTING_TRAYICON_MULTI)));
+ DBWriteContactSettingWord(NULL,"CList","CycleTime",(WORD)SendDlgItemMessage(hwndDlg,IDC_CYCLETIMESPIN,UDM_GETPOS,0,0));
+ DBWriteContactSettingWord(NULL,"CList","IconFlashTime",(WORD)SendDlgItemMessage(hwndDlg,IDC_BLINKSPIN,UDM_GETPOS,0,0));
+ DBWriteContactSettingByte(NULL,"CList","DisableTrayFlash",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_DISABLEBLINK));
+ DBWriteContactSettingByte(NULL,"CList","NoIconBlink", (BYTE)IsDlgButtonChecked(hwndDlg,IDC_ICONBLINK));
+ {
+ int cursel = SendDlgItemMessage(hwndDlg,IDC_PRIMARYSTATUS,CB_GETCURSEL,0,0);
+ PROTOACCOUNT* pa = (PROTOACCOUNT*)SendDlgItemMessage(hwndDlg,IDC_PRIMARYSTATUS,CB_GETITEMDATA,cursel,0);
+ if ( pa == NULL )
+ DBDeleteContactSetting(NULL, "CList","PrimaryStatus");
+ else
+ DBWriteContactSettingString(NULL,"CList","PrimaryStatus", pa->szModuleName);
+ }
+ pcli->pfnTrayIconIconsChanged();
+ LoadContactTree(); /* this won't do job properly since it only really works when changes happen */
+ SendMessage(pcli->hwndContactTree,CLM_AUTOREBUILD,0,0); /* force reshuffle */
+ return TRUE;
+ }
+ break;
+ }
+ break;
+ }
+ return FALSE;
+}
diff --git a/plugins/Mwclist/clistsettings.c b/plugins/Mwclist/clistsettings.c
new file mode 100644
index 0000000000..01207fb503
--- /dev/null
+++ b/plugins/Mwclist/clistsettings.c
@@ -0,0 +1,377 @@
+/*
+
+Miranda IM: the free IM client for Microsoft* Windows*
+
+Copyright 2000-2003 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 "commonheaders.h"
+#include "m_clui.h"
+#include "m_clc.h"
+#include "clist.h"
+
+TCHAR *GetNameForContact(HANDLE hContact,int flag,boolean *isUnknown);
+char *GetProtoForContact(HANDLE hContact);
+int GetStatusForContact(HANDLE hContact,char *szProto);
+TCHAR *UnknownConctactTranslatedName;
+extern boolean OnModulesLoadedCalled;
+void InvalidateDisplayNameCacheEntryByPDNE(HANDLE hContact,pdisplayNameCacheEntry pdnce,int SettingType);
+
+static int handleCompare( displayNameCacheEntry* c1, displayNameCacheEntry* c2 )
+{
+ return (char*)c1->hContact - (char*)c2->hContact;
+}
+
+void InitDisplayNameCache(SortedList *list)
+{
+ int i, idx;
+ HANDLE hContact;
+
+ memset(list,0,sizeof(SortedList));
+ list->sortFunc=handleCompare;
+ list->increment=CallService(MS_DB_CONTACT_GETCOUNT,0,0)+1;
+
+ hContact=(HANDLE)CallService(MS_DB_CONTACT_FINDFIRST,0,0);
+ i=0;
+ while (hContact!=0)
+ {
+ displayNameCacheEntry *pdnce = mir_calloc(sizeof(displayNameCacheEntry));
+ pdnce->hContact = hContact;
+ InvalidateDisplayNameCacheEntryByPDNE(hContact,pdnce,0);
+ li.List_GetIndex(list,pdnce,&idx);
+ li.List_Insert(list,pdnce,idx);
+ hContact=(HANDLE)CallService(MS_DB_CONTACT_FINDNEXT,(WPARAM)hContact,0);
+ i++;
+} }
+
+void FreeDisplayNameCacheItem(ClcCacheEntryBase *_p)
+{
+ pdisplayNameCacheEntry p = (pdisplayNameCacheEntry)_p;
+ if ( p->name) { mir_free(p->name); p->name = NULL; }
+ #if defined( _UNICODE )
+ if ( p->szName) { mir_free(p->szName); p->szName = NULL; }
+ #endif
+ if ( p->szProto) { mir_free(p->szProto); p->szProto = NULL; }
+ if ( p->szGroup) { mir_free(p->szGroup); p->szGroup = NULL; }
+}
+
+void FreeDisplayNameCache(SortedList *list)
+{
+ int i;
+
+ for( i=0; i < list->realCount; i++) {
+ FreeDisplayNameCacheItem(list->items[i] );
+ mir_free(list->items[i]);
+ }
+
+ li.List_Destroy(list);
+}
+
+void CheckPDNCE(ClcCacheEntryBase *_pdnce)
+{
+ pdisplayNameCacheEntry pdnce = (pdisplayNameCacheEntry)_pdnce;
+ if (pdnce == NULL)
+ return;
+
+ if (pdnce->szProto == NULL && pdnce->protoNotExists == FALSE) {
+ pdnce->szProto=GetProtoForContact(pdnce->hContact);
+ if (pdnce->szProto == NULL)
+ pdnce->protoNotExists=FALSE;
+ else {
+ if (CallService(MS_PROTO_ISPROTOCOLLOADED,0,(LPARAM)pdnce->szProto) == 0)
+ pdnce->protoNotExists=TRUE;
+ else {
+ if ( pdnce->szProto && pdnce->name ) {
+ mir_free(pdnce->name);
+ pdnce->name=NULL;
+ } } } }
+
+ if (pdnce->name == NULL)
+ {
+ if (pdnce->protoNotExists)
+ pdnce->name = mir_tstrdup(TranslateT("_NoProtocol_"));
+ else {
+ if (OnModulesLoadedCalled)
+ pdnce->name=GetNameForContact(pdnce->hContact,0,&pdnce->isUnknown);
+ else
+ pdnce->name=GetNameForContact(pdnce->hContact,0,NULL);
+ }
+ }
+ else {
+ if (pdnce->isUnknown&&pdnce->szProto&&pdnce->protoNotExists == TRUE&&OnModulesLoadedCalled) {
+ pdnce->protoNotExists=FALSE;
+ mir_free(pdnce->name);
+ pdnce->name=GetNameForContact(pdnce->hContact,0,&pdnce->isUnknown);
+ } }
+
+ if (pdnce->status == 0)
+ pdnce->status = GetStatusForContact(pdnce->hContact,pdnce->szProto);
+
+ if (pdnce->szGroup == NULL)
+ {
+ DBVARIANT dbv;
+
+ if (!DBGetContactSettingTString(pdnce->hContact,"CList","Group",&dbv))
+ {
+ pdnce->szGroup = mir_tstrdup(dbv.ptszVal);
+ mir_free(dbv.pszVal);
+ }
+ else pdnce->szGroup = mir_tstrdup( _T(""));
+ }
+
+ if (pdnce->Hidden == -1)
+ pdnce->Hidden=DBGetContactSettingByte(pdnce->hContact,"CList","Hidden",0);
+
+ if (pdnce->noHiddenOffline == -1)
+ pdnce->noHiddenOffline=DBGetContactSettingByte(pdnce->hContact,"CList","noOffline",0);
+
+ if ( pdnce->IdleTS == -1 )
+ pdnce->IdleTS = DBGetContactSettingDword(pdnce->hContact,pdnce->szProto,"IdleTS",0);
+
+ if (pdnce->ApparentMode == -1)
+ pdnce->ApparentMode=DBGetContactSettingWord(pdnce->hContact,pdnce->szProto,"ApparentMode",0);
+
+ if (pdnce->NotOnList == -1)
+ pdnce->NotOnList=DBGetContactSettingByte(pdnce->hContact,"CList","NotOnList",0);
+
+ if (pdnce->IsExpanded == -1)
+ pdnce->IsExpanded=DBGetContactSettingByte(pdnce->hContact,"CList","Expanded",0);
+}
+
+void InvalidateDisplayNameCacheEntryByPDNE(HANDLE hContact,pdisplayNameCacheEntry pdnce,int SettingType)
+{
+ if ( hContact == NULL || pdnce == NULL )
+ return;
+
+ if ( SettingType == -1 || SettingType == DBVT_DELETED )
+ {
+ mir_free(pdnce->name);
+ pdnce->name=NULL;
+ mir_free(pdnce->szGroup);
+ pdnce->szGroup=NULL;
+
+ pdnce->Hidden=-1;
+ pdnce->protoNotExists=FALSE;
+ mir_free(pdnce->szProto);
+ pdnce->szProto=NULL;
+ pdnce->status=0;
+ pdnce->IdleTS=-1;
+ pdnce->ApparentMode=-1;
+ pdnce->NotOnList=-1;
+ pdnce->isUnknown=FALSE;
+ pdnce->noHiddenOffline=-1;
+ pdnce->IsExpanded=-1;
+ return;
+ }
+
+ if (SettingType >= DBVT_WCHAR)
+ {
+ mir_free(pdnce->name);
+ pdnce->name=NULL;
+ mir_free(pdnce->szGroup);
+ pdnce->szGroup=NULL;
+ mir_free(pdnce->szProto);
+ pdnce->szProto=NULL;
+ return;
+ }
+
+ // in other cases clear all binary cache
+ pdnce->Hidden=-1;
+ pdnce->protoNotExists=FALSE;
+ pdnce->status=0;
+ pdnce->IdleTS=-1;
+ pdnce->ApparentMode=-1;
+ pdnce->NotOnList=-1;
+ pdnce->isUnknown=FALSE;
+ pdnce->noHiddenOffline=-1;
+ pdnce->IsExpanded=-1;
+}
+
+char *GetContactCachedProtocol(HANDLE hContact)
+{
+ pdisplayNameCacheEntry cacheEntry = (pdisplayNameCacheEntry)pcli->pfnGetCacheEntry(hContact);
+ if (cacheEntry&&cacheEntry->szProto)
+ return cacheEntry->szProto;
+
+ return NULL;
+}
+
+char *GetProtoForContact(HANDLE hContact)
+{
+ DBVARIANT dbv;
+ DBCONTACTGETSETTING dbcgs;
+ char name[32];
+
+ dbv.type=DBVT_ASCIIZ;
+ dbv.pszVal=name;
+ dbv.cchVal=SIZEOF(name);
+ dbcgs.pValue=&dbv;
+ dbcgs.szModule="Protocol";
+ dbcgs.szSetting="p";
+ if(CallService(MS_DB_CONTACT_GETSETTINGSTATIC,(WPARAM)hContact,(LPARAM)&dbcgs)) return NULL;
+ return mir_strdup(dbcgs.pValue->pszVal);
+}
+
+int GetStatusForContact(HANDLE hContact,char *szProto)
+{
+ int status = ID_STATUS_OFFLINE;
+ if (szProto)
+ status = DBGetContactSettingWord((HANDLE)hContact,szProto,"Status",ID_STATUS_OFFLINE);
+
+ return (status);
+}
+
+TCHAR* GetNameForContact(HANDLE hContact,int flag,boolean *isUnknown)
+{
+ TCHAR* result = pcli->pfnGetContactDisplayName(hContact, flag | GCDNF_NOCACHE);
+
+ if (isUnknown) {
+ if (UnknownConctactTranslatedName == NULL)
+ UnknownConctactTranslatedName = TranslateT("(Unknown Contact)");
+
+ *isUnknown = lstrcmp(result ,UnknownConctactTranslatedName) == 0;
+ }
+
+ return result;
+}
+
+pdisplayNameCacheEntry GetContactFullCacheEntry(HANDLE hContact)
+{
+ pdisplayNameCacheEntry cacheEntry = (pdisplayNameCacheEntry)pcli->pfnGetCacheEntry(hContact);
+ if (cacheEntry!=NULL)
+ return(cacheEntry);
+
+ return (NULL);
+}
+
+int GetContactInfosForSort(HANDLE hContact,char **Proto,TCHAR **Name,int *Status)
+{
+ pdisplayNameCacheEntry cacheEntry = (pdisplayNameCacheEntry)pcli->pfnGetCacheEntry(hContact);
+ if (cacheEntry!=NULL)
+ {
+ if (Proto!=NULL) *Proto = cacheEntry->szProto;
+ if (Name!=NULL) *Name = cacheEntry->name;
+ if (Status!=NULL) *Status = cacheEntry->status;
+ }
+ return (0);
+}
+
+int GetContactCachedStatus(HANDLE hContact)
+{
+ pdisplayNameCacheEntry cacheEntry = (pdisplayNameCacheEntry)pcli->pfnGetCacheEntry(hContact);
+ if (cacheEntry&&cacheEntry->status!=0) return cacheEntry->status;
+ return (0);
+}
+
+int ContactSettingChanged(WPARAM wParam,LPARAM lParam)
+{
+ DBCONTACTWRITESETTING *cws = (DBCONTACTWRITESETTING*)lParam;
+ pdisplayNameCacheEntry pdnce;
+
+ // Early exit
+ if ((HANDLE)wParam == NULL)
+ return 0;
+
+ __try
+ {
+ pdnce = (pdisplayNameCacheEntry)pcli->pfnGetCacheEntry((HANDLE)wParam);
+ if (pdnce == NULL)
+ {
+ OutputDebugStringA("!!! Very bad pdnce not found.");
+ return 0;
+ }
+
+ if (pdnce&&(pdnce->protoNotExists == FALSE)&&pdnce->szProto)
+ {
+ if (!strcmp(cws->szModule,pdnce->szProto))
+ {
+ InvalidateDisplayNameCacheEntryByPDNE((HANDLE)wParam,pdnce,cws->value.type);
+
+ if (cws->value.type == DBVT_WORD&&!strcmp(cws->szSetting, "Status")) {
+ if (!(pdnce->Hidden == 1)) {
+
+ if(DBGetContactSettingByte((HANDLE)NULL,"CList","ShowStatusMsg",0)||DBGetContactSettingByte((HANDLE)wParam,"CList","StatusMsgAuto",0))
+ DBWriteContactSettingString((HANDLE)wParam, "CList", "StatusMsg", "");
+
+ if (DBGetContactSettingByte(NULL, "CList", "HideOffline", SETTING_HIDEOFFLINE_DEFAULT)) {
+ // User's state is changing, and we are hideOffline-ing
+
+ if (cws->value.wVal == ID_STATUS_OFFLINE) {
+ ChangeContactIcon((HANDLE)wParam, ExtIconFromStatusMode((HANDLE)wParam,cws->szModule, cws->value.wVal), 0); //by FYR
+ return 0;
+ }
+ ChangeContactIcon((HANDLE)wParam, ExtIconFromStatusMode((HANDLE)wParam,cws->szModule, cws->value.wVal), 0); //by FYR
+ }
+ else
+ {
+ ChangeContactIcon((HANDLE)wParam, ExtIconFromStatusMode((HANDLE)wParam,cws->szModule, cws->value.wVal), 0); //by FYR
+ }
+ }
+ }
+ else if (!strcmp(cws->szModule,"MetaContacts"))
+ {
+ PostMessage(pcli->hwndContactTree,CLM_AUTOREBUILD,0,0);
+ return 0;
+ }
+ else return 0;
+
+ SortContacts();
+ } }
+
+ if(!strcmp(cws->szModule,"CList")) {
+ /*
+ sprintf(buf,"CHANGE: module:CList setting:%s %s\r\n",cws->szSetting,cws->value.pszVal);
+ OutputDebugStringA(buf);
+ */
+
+ //name is null or (setting is myhandle)
+ if(pdnce->name == NULL||(!strcmp(cws->szSetting,"MyHandle")) )
+ InvalidateDisplayNameCacheEntryByPDNE((HANDLE)wParam,pdnce,cws->value.type);
+
+ if((!strcmp(cws->szSetting,"Group")) )
+ InvalidateDisplayNameCacheEntryByPDNE((HANDLE)wParam,pdnce,cws->value.type);
+
+ if(!strcmp(cws->szSetting,"Hidden")) {
+ InvalidateDisplayNameCacheEntryByPDNE((HANDLE)wParam,pdnce,cws->value.type);
+ if(cws->value.type == DBVT_DELETED || cws->value.bVal == 0) {
+ char *szProto=(char*)CallService(MS_PROTO_GETCONTACTBASEPROTO,wParam,0);
+ ChangeContactIcon((HANDLE)wParam,ExtIconFromStatusMode((HANDLE)wParam,szProto,szProto == NULL?ID_STATUS_OFFLINE:DBGetContactSettingWord((HANDLE)wParam,szProto,"Status",ID_STATUS_OFFLINE)),1); //by FYR
+ } }
+
+ if(!strcmp(cws->szSetting,"noOffline"))
+ InvalidateDisplayNameCacheEntryByPDNE((HANDLE)wParam,pdnce,cws->value.type);
+ }
+
+ if(!strcmp(cws->szModule,"Protocol")) {
+ if(!strcmp(cws->szSetting,"p")) {
+ char *szProto;
+
+ OutputDebugStringA("CHANGE: proto\r\n");
+ InvalidateDisplayNameCacheEntryByPDNE((HANDLE)wParam,pdnce,cws->value.type);
+ if(cws->value.type == DBVT_DELETED) szProto=NULL;
+ else szProto=cws->value.pszVal;
+ ChangeContactIcon((HANDLE)wParam,ExtIconFromStatusMode((HANDLE)wParam,szProto,szProto == NULL?ID_STATUS_OFFLINE:DBGetContactSettingWord((HANDLE)wParam,szProto,"Status",ID_STATUS_OFFLINE)),0); //by FYR
+ }
+ }
+ }
+ __except (exceptFunction(GetExceptionInformation()) )
+ {
+ }
+
+ return 0;
+}
diff --git a/plugins/Mwclist/clisttray.c b/plugins/Mwclist/clisttray.c
new file mode 100644
index 0000000000..0147aa4517
--- /dev/null
+++ b/plugins/Mwclist/clisttray.c
@@ -0,0 +1,305 @@
+/*
+
+Miranda IM: the free IM client for Microsoft* Windows*
+
+Copyright 2000-2003 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 "commonheaders.h"
+#include "m_clui.h"
+
+#define TIM_CALLBACK (WM_USER+1857)
+#define TIM_CREATE (WM_USER+1858)
+
+extern INT_PTR ( *saveTrayIconProcessMessage )(WPARAM wParam,LPARAM lParam);
+void DestroyTrayMenu(HMENU hMenu);
+
+INT_PTR TrayIconProcessMessage(WPARAM wParam,LPARAM lParam)
+{
+ MSG *msg=(MSG*)wParam;
+ switch(msg->message) {
+ case WM_DRAWITEM:
+ return CallService(MS_CLIST_MENUDRAWITEM,msg->wParam,msg->lParam);
+ break;
+ case WM_MEASUREITEM:
+ return CallService(MS_CLIST_MENUMEASUREITEM,msg->wParam,msg->lParam);
+ break;
+ case TIM_CALLBACK:
+ if (msg->lParam == WM_RBUTTONUP)
+ {
+ POINT pt;
+ HMENU hMenu=(HMENU)CallService(MS_CLIST_MENUBUILDTRAY,(WPARAM)0,(LPARAM)0);
+
+ SetForegroundWindow(msg->hwnd);
+ SetFocus(msg->hwnd);
+ GetCursorPos(&pt);
+ TrackPopupMenu(hMenu, TPM_TOPALIGN | TPM_LEFTALIGN, pt.x, pt.y, 0, msg->hwnd, NULL);
+ DestroyTrayMenu(hMenu);
+ }
+ else break;
+
+ *((LRESULT*)lParam)=0;
+ return TRUE;
+ }
+
+ return saveTrayIconProcessMessage( wParam, lParam );
+}
+
+//////////////////////////////TRAY MENU/////////////////////////
+HANDLE hTrayMenuObject;
+
+HANDLE hTrayMainMenuItemProxy;
+HANDLE hHideShowMainMenuItem;
+HANDLE hTrayStatusMenuItemProxy;
+HANDLE hPreBuildTrayMenuEvent;
+
+//traymenu exec param(ownerdata)
+typedef struct{
+char *szServiceName;
+INT_PTR Param1;
+}TrayMenuExecParam,*lpTrayMenuExecParam;
+
+/*
+wparam=handle to the menu item returned by MS_CLIST_ADDCONTACTMENUITEM
+return 0 on success.
+*/
+static INT_PTR RemoveTrayMenuItem(WPARAM wParam,LPARAM lParam)
+{
+ CallService(MO_REMOVEMENUITEM,wParam,0);
+ return 0;
+}
+
+static INT_PTR BuildTrayMenu(WPARAM wParam,LPARAM lParam)
+{
+ int tick;
+ HMENU hMenu;
+ ListParam param = { 0 };
+ param.MenuObjectHandle=hTrayMenuObject;
+
+ //hMenu=hMainMenu;
+ hMenu=CreatePopupMenu();
+ //hMenu=wParam;
+ tick=GetTickCount();
+
+ NotifyEventHooks(hPreBuildTrayMenuEvent,0,0);
+
+ CallService(MO_BUILDMENU,(WPARAM)hMenu,(LPARAM)&param);
+ //DrawMenuBar((HWND)CallService("CLUI/GetHwnd",0,0));
+ tick=GetTickCount()-tick;
+ return (INT_PTR)hMenu;
+}
+
+static INT_PTR AddTrayMenuItem(WPARAM wParam,LPARAM lParam)
+{
+ CLISTMENUITEM *mi=(CLISTMENUITEM*)lParam;
+ TMO_MenuItem tmi;
+ OptParam op;
+
+ if(mi->cbSize!=sizeof(CLISTMENUITEM)) return 0;
+
+ memset(&tmi,0,sizeof(tmi));
+ tmi.cbSize=sizeof(tmi);
+ tmi.flags=mi->flags;
+ tmi.hIcon=mi->hIcon;
+ tmi.hotKey=mi->hotKey;
+ tmi.pszName=mi->pszName;
+ tmi.position=mi->position;
+
+ //pszPopupName for new system mean root level
+ //pszPopupName for old system mean that exists popup
+ tmi.root=(HGENMENU)mi->pszPopupName;
+
+ tmi.ownerdata=NULL;
+
+ {
+ lpTrayMenuExecParam mmep;
+ mmep=(lpTrayMenuExecParam)mir_alloc(sizeof(TrayMenuExecParam));
+ if(mmep==NULL){return(0);}
+
+ //we need just one parametr.
+ mmep->szServiceName = mir_strdup(mi->pszService);
+ mmep->Param1 = mi->popupPosition;
+
+ tmi.ownerdata=mmep;
+ }
+ op.Handle=(HANDLE)CallService(MO_ADDNEWMENUITEM,(WPARAM)hTrayMenuObject,(LPARAM)&tmi);
+ op.Setting=OPT_MENUITEMSETUNIQNAME;
+ op.Value=(INT_PTR)mi->pszService;
+ CallService(MO_SETOPTIONSMENUITEM,(WPARAM)0,(LPARAM)&op);
+ return (INT_PTR)op.Handle;
+}
+
+INT_PTR TrayMenuCheckService(WPARAM wParam,LPARAM lParam)
+{
+ return(0);
+}
+
+INT_PTR TrayMenuonAddService(WPARAM wParam,LPARAM lParam)
+{
+ MENUITEMINFO *mii=(MENUITEMINFO* )wParam;
+ if (mii==NULL) return 0;
+
+ if (hHideShowMainMenuItem==(HANDLE)lParam)
+ {
+ mii->fMask|=MIIM_STATE;
+ mii->fState|=MFS_DEFAULT;
+
+ }
+ if (hTrayMainMenuItemProxy==(HANDLE)lParam)
+ {
+ mii->fMask|=MIIM_SUBMENU;
+ //mi.fType=MFT_STRING;
+ mii->hSubMenu=(HMENU)CallService(MS_CLIST_MENUGETMAIN,0,0);
+ }
+
+ if (hTrayStatusMenuItemProxy==(HANDLE)lParam)
+ {
+ mii->fMask|=MIIM_SUBMENU;
+ //mi.fType=MFT_STRING;
+ mii->hSubMenu=(HMENU)CallService(MS_CLIST_MENUGETSTATUS,0,0);
+ }
+
+ return(TRUE);
+}
+
+
+//called with:
+//wparam - ownerdata
+//lparam - lparam from winproc
+INT_PTR TrayMenuExecService(WPARAM wParam,LPARAM lParam) {
+ if (wParam!=0)
+ {
+ lpTrayMenuExecParam mmep=(lpTrayMenuExecParam)wParam;
+ if (!strcmp(mmep->szServiceName,"Help/AboutCommand"))
+ {
+ //bug in help.c,it used wparam as parent window handle without reason.
+ mmep->Param1=0;
+ }
+ CallService(mmep->szServiceName,mmep->Param1,lParam);
+ }
+ return(1);
+}
+
+INT_PTR FreeOwnerDataTrayMenu (WPARAM wParam,LPARAM lParam)
+{
+
+ lpTrayMenuExecParam mmep;
+ mmep=(lpTrayMenuExecParam)lParam;
+ if (mmep!=NULL){
+ FreeAndNil(&mmep->szServiceName);
+ FreeAndNil(&mmep);
+ }
+
+ return(0);
+}
+
+HANDLE hPreBuildTrayMenuEvent;
+
+void InitTrayMenus(void)
+{
+ TMenuParam tmp;
+ OptParam op;
+
+ //Tray menu
+ memset(&tmp,0,sizeof(tmp));
+ tmp.cbSize=sizeof(tmp);
+ tmp.CheckService=NULL;
+ tmp.ExecService="CLISTMENUSTRAY/ExecService";
+ tmp.name="Tray Menu";
+ hTrayMenuObject=(HANDLE)CallService(MO_CREATENEWMENUOBJECT,(WPARAM)0,(LPARAM)&tmp);
+
+ CreateServiceFunction("CLISTMENUSTRAY/ExecService",TrayMenuExecService);
+ CreateServiceFunction("CLISTMENUSTRAY/FreeOwnerDataTrayMenu",FreeOwnerDataTrayMenu);
+ CreateServiceFunction("CLISTMENUSTRAY/TrayMenuonAddService",TrayMenuonAddService);
+
+ CreateServiceFunction(MS_CLIST_ADDTRAYMENUITEM,AddTrayMenuItem);
+ CreateServiceFunction(MS_CLIST_REMOVETRAYMENUITEM,RemoveTrayMenuItem);
+ CreateServiceFunction(MS_CLIST_MENUBUILDTRAY,BuildTrayMenu);
+ hPreBuildTrayMenuEvent=CreateHookableEvent(ME_CLIST_PREBUILDTRAYMENU);
+
+ op.Handle=hTrayMenuObject;
+ op.Setting=OPT_USERDEFINEDITEMS;
+ op.Value=TRUE;
+ CallService(MO_SETOPTIONSMENUOBJECT,(WPARAM)0,(LPARAM)&op);
+
+ op.Handle=hTrayMenuObject;
+ op.Setting=OPT_MENUOBJECT_SET_FREE_SERVICE;
+ op.Value=(INT_PTR)"CLISTMENUSTRAY/FreeOwnerDataTrayMenu";
+ CallService(MO_SETOPTIONSMENUOBJECT,(WPARAM)0,(LPARAM)&op);
+
+ op.Handle=hTrayMenuObject;
+ op.Setting=OPT_MENUOBJECT_SET_ONADD_SERVICE;
+ op.Value=(INT_PTR)"CLISTMENUSTRAY/TrayMenuonAddService";
+ CallService(MO_SETOPTIONSMENUOBJECT,(WPARAM)0,(LPARAM)&op);
+
+ {
+ //add exit command to menu
+ CLISTMENUITEM mi;
+
+ memset(&mi,0,sizeof(mi));
+ mi.cbSize=sizeof(mi);
+ mi.position=900000;
+ mi.pszService="CloseAction";
+ mi.pszName=LPGEN("E&xit");
+ AddTrayMenuItem((WPARAM)0,(LPARAM)&mi);
+
+ memset(&mi,0,sizeof(mi));
+ mi.cbSize=sizeof(mi);
+ mi.position=100000;
+ mi.pszService=MS_CLIST_SHOWHIDE;
+ mi.pszName=LPGEN("&Hide/Show");
+ hHideShowMainMenuItem=(HANDLE)AddTrayMenuItem((WPARAM)0,(LPARAM)&mi);
+
+ memset(&mi,0,sizeof(mi));
+ mi.cbSize=sizeof(mi);
+ mi.position=200000;
+ mi.hIcon=LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_FINDUSER));
+ mi.pszService="FindAdd/FindAddCommand";
+ mi.pszName=LPGEN("&Find/Add Contacts...");
+ AddTrayMenuItem((WPARAM)0,(LPARAM)&mi);
+
+ memset(&mi,0,sizeof(mi));
+ mi.cbSize=sizeof(mi);
+ mi.position=300000;
+ mi.pszService="";
+ mi.pszName=LPGEN("&Main Menu");
+ hTrayMainMenuItemProxy=(HANDLE)AddTrayMenuItem((WPARAM)0,(LPARAM)&mi);
+
+ memset(&mi,0,sizeof(mi));
+ mi.cbSize=sizeof(mi);
+ mi.position=300100;
+ mi.pszService="";
+ mi.pszName=LPGEN("&Status");
+ hTrayStatusMenuItemProxy=(HANDLE)AddTrayMenuItem((WPARAM)0,(LPARAM)&mi);
+
+ memset(&mi,0,sizeof(mi));
+ mi.cbSize=sizeof(mi);
+ mi.position=400000;
+ mi.hIcon=LoadIcon(GetModuleHandle(NULL),MAKEINTRESOURCE(IDI_OPTIONS));
+ mi.pszService="Options/OptionsCommand";
+ mi.pszName=LPGEN("&Options...");
+ AddTrayMenuItem((WPARAM)0,(LPARAM)&mi);
+
+ memset(&mi,0,sizeof(mi));
+ mi.cbSize=sizeof(mi);
+ mi.position=500000;
+ mi.hIcon=LoadIcon(GetModuleHandle(NULL),MAKEINTRESOURCE(IDI_CLIENTMIRANDA));
+ mi.pszService="Help/AboutCommand";
+ mi.pszName=LPGEN("&About");
+ AddTrayMenuItem((WPARAM)0,(LPARAM)&mi);
+} }
diff --git a/plugins/Mwclist/clui.c b/plugins/Mwclist/clui.c
new file mode 100644
index 0000000000..fd2838cd08
--- /dev/null
+++ b/plugins/Mwclist/clui.c
@@ -0,0 +1,953 @@
+/*
+
+ Miranda IM: the free IM client for Microsoft* Windows*
+
+ Copyright 2000-2003 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 "commonheaders.h"
+
+#define TM_AUTOALPHA 1
+#define TM_STATUSBARUPDATE 200
+#define MENU_MIRANDAMENU 0xFFFF1234
+
+extern int DefaultImageListColorDepth;
+
+static HMODULE hUserDll;
+HMENU hMenuMain;
+static HANDLE hContactDraggingEvent,hContactDroppedEvent,hContactDragStopEvent;
+UINT hMsgGetProfile=0;
+
+extern boolean canloadstatusbar;
+boolean OnModulesLoadedCalled=FALSE;
+
+HANDLE hSettingChangedHook=0;
+
+static int transparentFocus=1;
+static byte oldhideoffline;
+static int lastreqh=0,requr=0,disableautoupd=1;
+HANDLE hFrameContactTree;
+BYTE showOpts;//for statusbar
+
+typedef struct{
+int IconsCount;
+int CycleStartTick;
+char *szProto;
+int n;
+int TimerCreated;
+} ProtoTicks,*pProtoTicks;
+
+ProtoTicks CycleStartTick[64];//max 64 protocols
+
+int CycleTimeInterval=2000;
+int CycleIconCount=8;
+int DefaultStep=100;
+
+BOOL (WINAPI *MySetLayeredWindowAttributes)(HWND,COLORREF,BYTE,DWORD);
+BOOL (WINAPI *MyAnimateWindow)(HWND hWnd,DWORD dwTime,DWORD dwFlags);
+
+int CluiOptInit(WPARAM wParam,LPARAM lParam);
+int SortList(WPARAM wParam,LPARAM lParam);
+int CluiProtocolStatusChanged(WPARAM wParam,LPARAM lParam);
+
+extern void SetAllExtraIcons(HWND hwndList,HANDLE hContact);
+extern void ReloadExtraIcons();
+extern void LoadExtraImageFunc();
+extern HWND CreateStatusBarhWnd(HWND parent);
+extern HANDLE CreateStatusBarFrame();
+extern int CLUIFramesUpdateFrame(WPARAM wParam,LPARAM lParam);
+extern int ExtraToColumnNum(int extra);
+extern int ColumnNumToExtra(int column);
+extern void DrawDataForStatusBar(LPDRAWITEMSTRUCT dis);
+extern void InitGroupMenus();
+extern int UseOwnerDrawStatusBar;
+extern HANDLE hExtraImageClick;
+
+HICON GetConnectingIconForProto(char *szProto,int b);
+HICON GetConnectingIconForProto_DLL(char *szProto,int b);
+
+void RegisterProtoIconsForAllProtoIconLib();
+
+#define M_CREATECLC (WM_USER+1)
+#define M_SETALLEXTRAICONS (WM_USER+2)
+
+static int CluiModulesLoaded(WPARAM wParam,LPARAM lParam)
+{
+ MENUITEMINFO mii;
+ ZeroMemory(&mii,sizeof(mii));
+ mii.cbSize=MENUITEMINFO_V4_SIZE;
+ mii.fMask=MIIM_SUBMENU;
+ mii.hSubMenu=(HMENU)CallService(MS_CLIST_MENUGETMAIN,0,0);
+ SetMenuItemInfo(hMenuMain,0,TRUE,&mii);
+ mii.hSubMenu=(HMENU)CallService(MS_CLIST_MENUGETSTATUS,0,0);
+ SetMenuItemInfo(hMenuMain,1,TRUE,&mii);
+
+ canloadstatusbar=TRUE;
+ SendMessage(pcli->hwndContactList,WM_SIZE,0,0);
+ CluiProtocolStatusChanged(0,0);
+ Sleep(0);
+ PostMessage(pcli->hwndContactList,M_CREATECLC,0,0);
+
+ OnModulesLoadedCalled=TRUE;
+ pcli->pfnInvalidateDisplayNameCacheEntry(INVALID_HANDLE_VALUE);
+ InitGroupMenus();
+ RegisterProtoIconsForAllProtoIconLib();
+ return 0;
+}
+
+pProtoTicks GetProtoTicksByProto(char * szProto)
+{
+ int i;
+
+ for (i=0;i<64;i++)
+ {
+ if (CycleStartTick[i].szProto==NULL) break;
+ if (strcmp(CycleStartTick[i].szProto,szProto)) continue;
+ return(&CycleStartTick[i]);
+ }
+ for (i=0;i<64;i++)
+ {
+ if (CycleStartTick[i].szProto==NULL)
+ {
+ CycleStartTick[i].szProto=mir_strdup(szProto);
+ CycleStartTick[i].CycleStartTick=0;
+ CycleStartTick[i].n=i;
+ return(&CycleStartTick[i]);
+ }
+ }
+ return (NULL);
+}
+
+int GetConnectingIconForProtoCount(char *szProto)
+{
+ char file[MAX_PATH],fileFull[MAX_PATH],szFullPath[MAX_PATH];
+ char szPath[MAX_PATH];
+ char *str;
+ int ret;
+
+ GetModuleFileNameA(GetModuleHandle(NULL), szPath, MAX_PATH);
+ str=strrchr(szPath,'\\');
+ if(str!=NULL) *str=0;
+ _snprintf(szFullPath, SIZEOF(szFullPath), "%s\\Icons\\proto_conn_%s.dll", szPath, szProto);
+
+ lstrcpynA(file,szFullPath,SIZEOF(file));
+ CallService(MS_UTILS_PATHTOABSOLUTE, (WPARAM)file, (LPARAM)fileFull);
+ ret=ExtractIconExA(fileFull,-1,NULL,NULL,1);
+ if (ret==0&&!strcmp(szProto,"ICQ")) ret=8;
+ return ret;
+}
+
+static HICON ExtractIconFromPath(const char *path)
+{
+ char *comma;
+ char file[MAX_PATH],fileFull[MAX_PATH];
+ int n;
+ HICON hIcon;
+ {
+// char buf[512];
+// sprintf(buf,"LoadIcon %s\r\n",path);
+// OutputDebugStringA(buf);
+ }
+ lstrcpynA(file,path,SIZEOF(file));
+ comma=strrchr(file,',');
+ if(comma==NULL) n=0;
+ else {n=atoi(comma+1); *comma=0;}
+ CallService(MS_UTILS_PATHTOABSOLUTE, (WPARAM)file, (LPARAM)fileFull);
+
+#ifdef _DEBUG
+ {
+// char buf[512];
+// sprintf(buf,"LoadIconFull %d %s\r\n",n,fileFull);
+// OutputDebugStringA(buf);
+ }
+#endif
+
+ hIcon=NULL;
+ ExtractIconExA(fileFull,n,NULL,&hIcon,1);
+ return hIcon;
+}
+
+HICON LoadIconFromExternalFile(char *filename,int i,boolean UseLibrary,boolean registerit,char *IconName,char *SectName,char *Description,int internalidx,HICON DefIcon)
+{
+ char szPath[MAX_PATH],szMyPath[MAX_PATH], szFullPath[MAX_PATH],*str;
+ HICON hIcon=NULL;
+ SKINICONDESC sid={0};
+
+ memset(szMyPath,0,SIZEOF(szMyPath));
+ memset(szFullPath,0,SIZEOF(szFullPath));
+
+ if (filename!=NULL)
+ {
+ GetModuleFileNameA(GetModuleHandle(NULL), szPath, MAX_PATH);
+ GetModuleFileNameA(g_hInst, szMyPath, MAX_PATH);
+ str=strrchr(szPath,'\\');
+ if(str!=NULL) *str=0;
+ _snprintf(szFullPath, SIZEOF(szFullPath), "%s\\Icons\\%s,%d", szPath, filename, i);
+ }
+
+ if (!UseLibrary||!ServiceExists(MS_SKIN2_ADDICON))
+ {
+ hIcon=ExtractIconFromPath(szFullPath);
+ if (hIcon) return hIcon;
+ }
+ else
+ {
+ if (registerit&&IconName!=NULL&&SectName!=NULL)
+ {
+ sid.cbSize = sizeof(sid);
+ sid.pszSection = SectName;
+ sid.pszName=IconName;
+ sid.pszDescription = Description;
+ if (strlen(szMyPath)!=0)
+ {
+ sid.pszDefaultFile=szMyPath;
+ }
+
+ sid.iDefaultIndex=internalidx;
+ sid.hDefaultIcon=DefIcon;
+
+ CallService(MS_SKIN2_ADDICON, 0, (LPARAM)&sid);
+ {
+ char buf[256];
+ sprintf(buf,"Registring Icon %s/%s hDefaultIcon: %p\r\n",SectName,IconName,DefIcon);
+ OutputDebugStringA(buf);
+ }
+ }
+ return ((HICON)CallService(MS_SKIN2_GETICON, 0, (LPARAM)IconName));
+ }
+
+ return (HICON)0;
+}
+
+void RegisterProtoIcons (char *protoname)
+{
+ if (ServiceExists(MS_SKIN2_GETICON)&&DBGetContactSettingByte(NULL,"CList","UseProtoIconFromIcoLib",1))
+ {
+ int i;
+ char buf[256];
+ char buf2[256];
+ for (i=0;i<8;i++)
+ {
+ sprintf(buf,"%s #%d",protoname,i);
+ sprintf(buf2,"Contact List/Connection Icons %s",protoname);
+
+ LoadIconFromExternalFile(NULL,i,TRUE,TRUE,buf,buf2,buf,0,GetConnectingIconForProto_DLL(protoname,i));
+ }
+ }
+}
+
+void RegisterProtoIconsForAllProtoIconLib()
+{
+ int protoCount,i;
+ PROTOACCOUNT **accs;
+
+ ProtoEnumAccounts( &protoCount, &accs );
+ for ( i=0; i < protoCount; i++ )
+ if ( IsAccountEnabled( accs[i] ) && CallProtoService( accs[i]->szModuleName, PS_GETCAPS, PFLAGNUM_2, 0 ))
+ RegisterProtoIcons( accs[i]->szModuleName );
+}
+
+HICON GetConnectingIconForProto_DLL(char *szProto,int b)
+{
+ char szFullPath[MAX_PATH];
+ HICON hIcon=NULL;
+
+ b=b-1;
+ _snprintf(szFullPath, SIZEOF(szFullPath), "proto_conn_%s.dll",szProto);
+ // hIcon=ExtractIconFromPath(szFullPath);
+ // if (hIcon) return hIcon;
+
+ hIcon=LoadIconFromExternalFile(szFullPath,b+1,FALSE,FALSE,NULL,NULL,NULL,0,0);
+ if (hIcon) return hIcon;
+
+#ifdef _DEBUG
+ {
+ char buf [256];
+ sprintf(buf,"IconNotFound %s %d\r\n",szProto,b);
+ // OutputDebugStringA(buf);
+ }
+#endif
+
+ if (!strcmp(szProto,"ICQ"))
+ {
+
+#ifdef _DEBUG
+ char buf [256];
+ sprintf(buf,"Icon %d %d\r\n",GetTickCount(),b);
+ //OutputDebugStringA(buf);
+#endif
+ return(LoadIconA(g_hInst,(LPCSTR)(IDI_ICQC1+b)));
+ }
+
+ return(hIcon);
+}
+
+HICON GetConnectingIconForProto(char *szProto,int b)
+{
+ if (ServiceExists(MS_SKIN2_GETICON)&&DBGetContactSettingByte(NULL,"CList","UseProtoIconFromIcoLib",1))
+ {
+ HICON hIcon=0;
+ char buf[256];
+ sprintf(buf,"%s #%d",szProto,b);
+
+ hIcon=LoadIconFromExternalFile(NULL,b,TRUE,FALSE,buf,"Contact List/Connection Icons",buf,0,NULL);
+ if (hIcon==NULL) return (GetConnectingIconForProto_DLL(szProto,b));
+ return (CopyIcon(hIcon));
+
+ }else
+ {
+ return(GetConnectingIconForProto_DLL(szProto,b));
+ }
+ return (NULL);
+}
+
+
+
+
+//wParam = szProto
+INT_PTR GetConnectingIconService(WPARAM wParam,LPARAM lParam)
+{
+ int b;
+ ProtoTicks *pt=NULL;
+ HICON hIcon=NULL;
+
+ char *szProto=(char *)wParam;
+ if (!szProto) return 0;
+
+ pt=GetProtoTicksByProto(szProto);
+
+ if (pt!=NULL) {
+ if (pt->CycleStartTick!=0&&pt->IconsCount!=0) {
+ b=((GetTickCount()-pt->CycleStartTick)/(DefaultStep))%pt->IconsCount;
+ hIcon=GetConnectingIconForProto(szProto,b);
+ }
+ }
+
+ return (INT_PTR)hIcon;
+}
+
+int CreateTimerForConnectingIcon(WPARAM wParam,LPARAM lParam)
+{
+ int status=(int)wParam;
+ char *szProto=(char *)lParam;
+ if (!szProto) return (0);
+ if (!status) return (0);
+
+ if ((DBGetContactSettingByte(NULL,"CLUI","UseConnectingIcon",1)==1)&&status>=ID_STATUS_CONNECTING&&status<=ID_STATUS_CONNECTING+MAX_CONNECT_RETRIES)
+ {
+ ProtoTicks *pt=NULL;
+ int cnt;
+
+ pt=GetProtoTicksByProto(szProto);
+ if (pt!=NULL)
+ {
+ if (pt->CycleStartTick==0)
+ {
+ // sprintf(buf,"SetTimer %d\r\n",pt->n);
+ // OutputDebugStringA(buf);
+
+ KillTimer(pcli->hwndContactList,TM_STATUSBARUPDATE+pt->n);
+ cnt=GetConnectingIconForProtoCount(szProto);
+ if (ServiceExists(MS_SKIN2_GETICON)&&DBGetContactSettingByte(NULL,"Clist","UseProtoIconFromIcoLib",1))
+ {
+ cnt=8;
+ }
+
+ if (cnt!=0)
+ {
+ DefaultStep=DBGetContactSettingWord(NULL,"CLUI","DefaultStepConnectingIcon",100);
+ pt->IconsCount=cnt;
+ SetTimer(pcli->hwndContactList,TM_STATUSBARUPDATE+pt->n,(int)(DefaultStep)/1,0);
+ pt->TimerCreated=1;
+ pt->CycleStartTick=GetTickCount();
+ }
+ }
+ }
+ }
+ return 0;
+}
+// Restore protocols to the last global status.
+// Used to reconnect on restore after standby.
+
+int OnSettingChanging(WPARAM wParam,LPARAM lParam)
+{
+ DBCONTACTWRITESETTING *dbcws=(DBCONTACTWRITESETTING *)lParam;
+ if (wParam==0)
+ {
+ if ((dbcws->value.type==DBVT_BYTE)&&!strcmp(dbcws->szModule,"CLUI"))
+ {
+ if (!strcmp(dbcws->szSetting,"SBarShow"))
+ {
+ showOpts=dbcws->value.bVal;
+ return(0);
+ }
+ }
+ }
+ else
+ {
+ if (dbcws==NULL){return(0);}
+
+ if (!ServiceExists("ExtraIcon/Register"))
+ {
+ if (dbcws->value.type==DBVT_ASCIIZ&&!strcmp(dbcws->szSetting,"e-mail"))
+ {
+ SetAllExtraIcons(pcli->hwndContactTree,(HANDLE)wParam);
+ return(0);
+ }
+ if (dbcws->value.type==DBVT_ASCIIZ&&!strcmp(dbcws->szSetting,"Cellular"))
+ {
+ SetAllExtraIcons(pcli->hwndContactTree,(HANDLE)wParam);
+ return(0);
+ }
+
+ if (dbcws->value.type==DBVT_ASCIIZ&&strstr(dbcws->szModule,"ICQ"))
+ {
+ if (!strcmp(dbcws->szSetting,(HANDLE)"MirVer"))
+ {
+ SetAllExtraIcons(pcli->hwndContactTree,(HANDLE)wParam);
+ return(0);
+ }
+
+ }
+
+ if (dbcws->value.type==DBVT_ASCIIZ&&!strcmp(dbcws->szModule,"UserInfo"))
+ {
+ if (!strcmp(dbcws->szSetting,(HANDLE)"MyPhone0"))
+ {
+ SetAllExtraIcons(pcli->hwndContactTree,(HANDLE)wParam);
+ return(0);
+ }
+ if (!strcmp(dbcws->szSetting,(HANDLE)"Mye-mail0"))
+ {
+ SetAllExtraIcons(pcli->hwndContactTree,(HANDLE)wParam);
+ return(0);
+ }
+ }
+ }
+ }
+ return(0);
+}
+
+HWND PreCreateCLC(HWND parent)
+{
+ pcli->hwndContactTree = CreateWindow(CLISTCONTROL_CLASS,_T(""),
+ WS_CHILD|WS_CLIPCHILDREN|CLS_CONTACTLIST
+ |(DBGetContactSettingByte(NULL,"CList","UseGroups",SETTING_USEGROUPS_DEFAULT)?CLS_USEGROUPS:0)
+ |CLS_HIDEOFFLINE
+ //|(DBGetContactSettingByte(NULL,"CList","HideOffline",SETTING_HIDEOFFLINE_DEFAULT)?CLS_HIDEOFFLINE:0)
+ |(DBGetContactSettingByte(NULL,"CList","HideEmptyGroups",SETTING_HIDEEMPTYGROUPS_DEFAULT)?CLS_HIDEEMPTYGROUPS:0)
+ |(DBGetContactSettingByte(NULL,"CList","ShowStatusMessages",1)?CLS_SHOWSTATUSMESSAGES:0)
+ |CLS_MULTICOLUMN
+ //|DBGetContactSettingByte(NULL,"CLUI","ExtraIconsAlignToLeft",1)?CLS_EX_MULTICOLUMNALIGNLEFT:0
+ ,0,0,0,0,parent,NULL,g_hInst,NULL);
+
+ return pcli->hwndContactTree;
+}
+
+int CreateCLC(HWND parent)
+{
+ Sleep(0);
+ {
+ // create contact list frame
+ CLISTFrame Frame;
+ memset(&Frame,0,sizeof(Frame));
+ Frame.cbSize=sizeof(CLISTFrame);
+ Frame.hWnd=pcli->hwndContactTree;
+ Frame.align=alClient;
+ Frame.hIcon=LoadSkinnedIcon(SKINICON_OTHER_MIRANDA);
+ //LoadIcon(hInst,MAKEINTRESOURCE(IDI_MIRANDA));
+ Frame.Flags=F_VISIBLE|F_SHOWTB|F_SHOWTBTIP|F_TCHAR;
+ Frame.tname=_T("My Contacts");
+ Frame.TBtname=TranslateT("My Contacts");
+ hFrameContactTree=(HWND)CallService(MS_CLIST_FRAMES_ADDFRAME,(WPARAM)&Frame,(LPARAM)0);
+ //free(Frame.name);
+ CallService(MS_CLIST_FRAMES_SETFRAMEOPTIONS,MAKEWPARAM(FO_TBTIPNAME,hFrameContactTree),(LPARAM)TranslateT("My Contacts"));
+ }
+
+ ReloadExtraIcons();
+ {
+ lastreqh=0;
+ {
+ CallService(MS_CLIST_SETHIDEOFFLINE,(WPARAM)oldhideoffline,0);
+ }
+
+ { int state=DBGetContactSettingByte(NULL,"CList","State",SETTING_STATE_NORMAL);
+ if(state==SETTING_STATE_NORMAL) ShowWindow(pcli->hwndContactList, SW_SHOW);
+ else if(state==SETTING_STATE_MINIMIZED) ShowWindow(pcli->hwndContactList, SW_SHOWMINIMIZED);
+ }
+
+ lastreqh=0;
+ disableautoupd=0;
+
+ }
+ hSettingChangedHook=HookEvent(ME_DB_CONTACT_SETTINGCHANGED,OnSettingChanging);
+ return(0);
+}
+
+int GetStatsuBarProtoRect(HWND hwnd,char *szProto,RECT *rc)
+{
+ int nParts,nPanel;
+ ProtocolData *PD;
+ int startoffset=DBGetContactSettingDword(NULL,"StatusBar","FirstIconOffset",0);
+
+ if (!UseOwnerDrawStatusBar) startoffset=0;
+
+ nParts=SendMessage(hwnd,SB_GETPARTS,0,0);
+ FillMemory(rc,sizeof(RECT),0);
+
+ for (nPanel=0;nPanel<nParts;nPanel++)
+ {
+ PD=(ProtocolData *)SendMessage(pcli->hwndStatus,SB_GETTEXT,(WPARAM)nPanel,(LPARAM)0);
+ if ( PD == NULL )
+ return(0);
+
+ if (!strcmp(szProto,PD->RealName))
+ {
+ SendMessage(hwnd,SB_GETRECT,(WPARAM)nPanel,(LPARAM)rc);
+ rc->left+=startoffset;
+ rc->right+=startoffset;
+ return(0);
+ }
+ }
+ return (0);
+}
+
+extern LRESULT ( CALLBACK *saveContactListWndProc )(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
+
+LRESULT CALLBACK ContactListWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ /*
+ This registers a window message with RegisterWindowMessage() and then waits for such a message,
+ if it gets it, it tries to open a file mapping object and then maps it to this process space,
+ it expects 256 bytes of data (incl. NULL) it will then write back the profile it is using the DB to fill in the answer.
+
+ The caller is expected to create this mapping object and tell us the ID we need to open ours.
+ */
+ if (msg==hMsgGetProfile && wParam != 0) { /* got IPC message */
+ HANDLE hMap;
+ char szName[MAX_PATH];
+ int rc=0;
+ _snprintf(szName,SIZEOF(szName),"Miranda::%u", wParam); // caller will tell us the ID of the map
+ hMap = OpenFileMappingA(FILE_MAP_ALL_ACCESS,FALSE,szName);
+ if (hMap != NULL) {
+ void *hView=NULL;
+ hView=MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, MAX_PATH);
+ if (hView) {
+ char szFilePath[MAX_PATH], szProfile[MAX_PATH];
+ CallService(MS_DB_GETPROFILEPATH,MAX_PATH,(LPARAM)&szFilePath);
+ CallService(MS_DB_GETPROFILENAME,MAX_PATH,(LPARAM)&szProfile);
+ _snprintf(hView,MAX_PATH,"%s\\%s",szFilePath,szProfile);
+ UnmapViewOfFile(hView);
+ rc=1;
+ }
+ CloseHandle(hMap);
+ }
+ return rc;
+ }
+
+ switch (msg) {
+ case WM_CREATE:
+ CallService(MS_LANGPACK_TRANSLATEMENU,(WPARAM)GetMenu(hwnd),0);
+ DrawMenuBar(hwnd);
+ showOpts=DBGetContactSettingByte(NULL,"CLUI","SBarShow",1);
+
+ //create the status wnd
+ //pcli->hwndStatus = CreateStatusWindow(WS_CHILD | (DBGetContactSettingByte(NULL,"CLUI","ShowSBar",1)?WS_VISIBLE:0), "", hwnd, 0);
+ CluiProtocolStatusChanged(0,0);
+
+ hMsgGetProfile = RegisterWindowMessageA( "Miranda::GetProfile" ); // don't localise
+
+ if ( DBGetContactSettingByte( NULL, "CList", "Transparent", 0 )) {
+ SetWindowLong(hwnd, GWL_EXSTYLE, GetWindowLong(hwnd, GWL_EXSTYLE) | WS_EX_LAYERED);
+ if ( MySetLayeredWindowAttributes )
+ MySetLayeredWindowAttributes(hwnd, RGB(0,0,0), (BYTE)DBGetContactSettingByte(NULL,"CList","Alpha",SETTING_ALPHA_DEFAULT), LWA_ALPHA);
+ }
+ transparentFocus=1;
+ return FALSE;
+
+ case M_SETALLEXTRAICONS:
+ return TRUE;
+
+ case M_CREATECLC:
+ CreateCLC(hwnd);
+ return TRUE;
+
+ case WM_SIZE:
+ {
+ RECT rc;
+ if ( wParam != SIZE_MINIMIZED ) {
+ if ( pcli->hwndContactList != NULL )
+ CLUIFramesOnClistResize((WPARAM)hwnd,(LPARAM)0);
+
+ GetWindowRect(hwnd, &rc);
+ if(!CallService(MS_CLIST_DOCKINGISDOCKED,0,0)) {
+ //if docked, dont remember pos (except for width)
+ DBWriteContactSettingDword(NULL,"CList","Height",(DWORD)(rc.bottom - rc.top));
+ DBWriteContactSettingDword(NULL,"CList","x",(DWORD)rc.left);
+ DBWriteContactSettingDword(NULL,"CList","y",(DWORD)rc.top);
+ }
+ DBWriteContactSettingDword(NULL,"CList","Width",(DWORD)(rc.right - rc.left));
+ }
+ if ( wParam == SIZE_MINIMIZED ) {
+ if ( DBGetContactSettingByte(NULL,"CList","Min2Tray",SETTING_MIN2TRAY_DEFAULT )) {
+ ShowWindow(hwnd, SW_HIDE);
+ DBWriteContactSettingByte(NULL,"CList","State",SETTING_STATE_HIDDEN);
+ }
+ else DBWriteContactSettingByte(NULL,"CList","State",SETTING_STATE_MINIMIZED);
+ }
+ return 0;
+ }
+
+ case WM_SETFOCUS:
+ {
+ boolean isfloating;
+ if ( hFrameContactTree ) {
+ isfloating = CallService(MS_CLIST_FRAMES_GETFRAMEOPTIONS,MAKEWPARAM(FO_FLOATING,hFrameContactTree),0);
+ if ( isfloating == FALSE)
+ SetFocus(pcli->hwndContactTree);
+ }
+ return 0;
+ }
+ case WM_TIMER:
+ if ((int)wParam>=TM_STATUSBARUPDATE&&(int)wParam<=TM_STATUSBARUPDATE+64) {
+ int status,i;
+
+ ProtoTicks *pt=NULL;
+ for (i=0;i<64;i++) {
+ pt=&CycleStartTick[i];
+ if (pt->szProto!=NULL&&pt->TimerCreated==1) {
+ status=CallProtoService(pt->szProto,PS_GETSTATUS,0,0);
+ if (!(status>=ID_STATUS_CONNECTING&&status<=ID_STATUS_CONNECTING+MAX_CONNECT_RETRIES))
+ {
+ pt->CycleStartTick=0;
+ KillTimer(hwnd,TM_STATUSBARUPDATE+pt->n);
+ pt->TimerCreated=0;
+ } } }
+
+ pt=&CycleStartTick[wParam-TM_STATUSBARUPDATE];
+ {
+ RECT rc;
+ GetStatsuBarProtoRect(pcli->hwndStatus,pt->szProto,&rc);
+ rc.right=rc.left+GetSystemMetrics(SM_CXSMICON)+1;
+ rc.top=0;
+
+ if(IsWindowVisible(pcli->hwndStatus)) InvalidateRect(pcli->hwndStatus,&rc,TRUE);
+ pcli->pfnTrayIconUpdateBase(pt->szProto);
+ }
+ //SendMessage(pcli->hwndStatus,WM_PAINT,0,0);
+ UpdateWindow(pcli->hwndStatus);
+ return TRUE;
+ }
+ break;
+
+ case WM_DRAWITEM:
+ {
+ LPDRAWITEMSTRUCT dis = (LPDRAWITEMSTRUCT)lParam;
+ if ( dis->hwndItem == pcli->hwndStatus ) {
+ DrawDataForStatusBar(dis);
+ return 0;
+ }
+ if ( dis->CtlType != ODT_MENU )
+ return 0;
+ break;
+ }
+ case WM_KEYDOWN:
+ CallService(MS_CLIST_MENUPROCESSHOTKEY,wParam,MPCF_MAINMENU|MPCF_CONTACTMENU);
+ if (wParam==VK_F5)
+ SendMessage(pcli->hwndContactTree,CLM_AUTOREBUILD,0,0);
+ return TRUE;
+
+ case WM_GETMINMAXINFO:
+ DefWindowProc(hwnd,msg,wParam,lParam);
+ ((LPMINMAXINFO)lParam)->ptMinTrackSize.x=18;
+ if (requr==0){((LPMINMAXINFO)lParam)->ptMinTrackSize.y=CLUIFramesGetMinHeight();}
+ return 0;
+
+ //MSG FROM CHILD CONTROL
+ case WM_NOTIFY:
+ if (((LPNMHDR)lParam)->hwndFrom == pcli->hwndContactTree) {
+ switch (((LPNMHDR)lParam)->code) {
+ case CLN_NEWCONTACT:
+ {
+ NMCLISTCONTROL *nm=(NMCLISTCONTROL *)lParam;
+ if (nm!=NULL) SetAllExtraIcons(pcli->hwndContactTree,nm->hItem );
+ return TRUE;
+ }
+ case CLN_LISTREBUILT:
+ SetAllExtraIcons(pcli->hwndContactTree,0);
+ return(FALSE);
+
+ case CLN_LISTSIZECHANGE:
+ {
+ NMCLISTCONTROL *nmc=(NMCLISTCONTROL*)lParam;
+ RECT rcWindow,rcTree,rcWorkArea;
+ int maxHeight,newHeight;
+ int winstyle;
+
+ if ( !disableautoupd && DBGetContactSettingByte( NULL, "CLUI", "AutoSize", 0 )) {
+ if ( !CallService(MS_CLIST_DOCKINGISDOCKED,0,0) && hFrameContactTree != 0 ) {
+ maxHeight=DBGetContactSettingByte(NULL,"CLUI","MaxSizeHeight",75);
+ GetWindowRect(hwnd,&rcWindow);
+ GetWindowRect(pcli->hwndContactTree,&rcTree);
+ winstyle=GetWindowLong(pcli->hwndContactTree,GWL_STYLE);
+
+ SystemParametersInfo(SPI_GETWORKAREA,0,&rcWorkArea,FALSE);
+ lastreqh=nmc->pt.y;
+ newHeight=max(nmc->pt.y,3)+1+((winstyle&WS_BORDER)?2:0)+(rcWindow.bottom-rcWindow.top)-(rcTree.bottom-rcTree.top);
+ if (newHeight != rcWindow.bottom - rcWindow.top ) {
+ if(newHeight>(rcWorkArea.bottom-rcWorkArea.top)*maxHeight/100)
+ newHeight=(rcWorkArea.bottom-rcWorkArea.top)*maxHeight/100;
+ if(DBGetContactSettingByte(NULL,"CLUI","AutoSizeUpward",0)) {
+ rcWindow.top=rcWindow.bottom-newHeight;
+ if(rcWindow.top<rcWorkArea.top) rcWindow.top=rcWorkArea.top;
+ }
+ else {
+ rcWindow.bottom=rcWindow.top+newHeight;
+ if(rcWindow.bottom>rcWorkArea.bottom) rcWindow.bottom=rcWorkArea.bottom;
+ }
+
+ if (requr == 0) {
+ requr=1;
+ SetWindowPos(hwnd,0,rcWindow.left,rcWindow.top,rcWindow.right-rcWindow.left,rcWindow.bottom-rcWindow.top,SWP_NOZORDER|SWP_NOACTIVATE);
+ GetWindowRect(hwnd,&rcWindow);
+ requr=0;
+ } } } }
+ return TRUE;
+ }
+ case NM_CLICK:
+ {
+ NMCLISTCONTROL *nm=(NMCLISTCONTROL*)lParam;
+ DWORD hitFlags;
+ HANDLE hItem = (HANDLE)SendMessage(pcli->hwndContactTree,CLM_HITTEST,(WPARAM)&hitFlags,MAKELPARAM(nm->pt.x,nm->pt.y));
+
+ if (hitFlags&CLCHT_ONITEMEXTRA) {
+ if (!IsHContactGroup(hItem)&&!IsHContactInfo(hItem))
+ {
+ int extra;
+ pdisplayNameCacheEntry pdnce;
+
+ pdnce = (pdisplayNameCacheEntry)pcli->pfnGetCacheEntry(nm->hItem);
+ if (pdnce==NULL) return 0;
+
+ extra = ColumnNumToExtra(nm->iColumn);
+ NotifyEventHooks(hExtraImageClick, (WPARAM)nm->hItem, extra);
+
+ if (!ServiceExists("ExtraIcon/Register"))
+ {
+ int v,e,w;
+ v=ExtraToColumnNum(EXTRA_ICON_PROTO);
+ e=ExtraToColumnNum(EXTRA_ICON_EMAIL);
+ w=ExtraToColumnNum(EXTRA_ICON_ADV1);
+
+ if(nm->iColumn==v)
+ CallService(MS_USERINFO_SHOWDIALOG,(WPARAM)nm->hItem,0);
+
+ if(nm->iColumn==e) {
+ //CallService(MS_USERINFO_SHOWDIALOG,(WPARAM)nm->hItem,0);
+ char *email,buf[4096];
+ email=DBGetStringA(nm->hItem,"UserInfo", "Mye-mail0");
+ if (email) {
+ sprintf(buf,"mailto:%s",email);
+ ShellExecuteA(hwnd,"open",buf,NULL,NULL,SW_SHOW);
+ }
+ }
+ if(nm->iColumn==w) {
+ char *homepage;
+ homepage=DBGetStringA(pdnce->hContact,pdnce->szProto, "Homepage");
+ if (homepage!=NULL)
+ ShellExecuteA(hwnd,"open",homepage,NULL,NULL,SW_SHOW);
+ } } } }
+
+ if(hItem) break;
+ if((hitFlags&(CLCHT_NOWHERE|CLCHT_INLEFTMARGIN|CLCHT_BELOWITEMS))==0) break;
+ if (DBGetContactSettingByte(NULL,"CLUI","ClientAreaDrag",SETTING_CLIENTDRAG_DEFAULT)) {
+ POINT pt;
+ pt=nm->pt;
+ ClientToScreen(pcli->hwndContactTree,&pt);
+ return SendMessage(hwnd, WM_SYSCOMMAND, SC_MOVE|HTCAPTION,MAKELPARAM(pt.x,pt.y));
+ }
+ return TRUE;
+ }
+ }
+ }
+ else if(((LPNMHDR)lParam)->hwndFrom==pcli->hwndStatus) {
+ if (((LPNMHDR)lParam)->code == NM_CLICK ) {
+ int nParts=0, nPanel=0;
+ NMMOUSE *nm=(NMMOUSE*)lParam;
+ HMENU hMenu;
+ RECT rc;
+ POINT pt;
+ int totcount;
+ ProtocolData *PD;
+ int menuid;
+ int startoffset=DBGetContactSettingDword(NULL,"StatusBar","FirstIconOffset",0);
+ int extraspace=DBGetContactSettingDword(NULL,"StatusBar","BkExtraSpace",0);
+ boolean UseOwnerDrawStatusBar=DBGetContactSettingByte(NULL,"CLUI","UseOwnerDrawStatusBar",0);
+
+ hMenu=(HMENU)CallService(MS_CLIST_MENUGETSTATUS,0,0);
+ nParts=SendMessage(pcli->hwndStatus,SB_GETPARTS,0,0);
+
+ if (nm->dwItemSpec==0xFFFFFFFE) {
+ nPanel=nParts-1;
+ SendMessage(pcli->hwndStatus,SB_GETRECT,nPanel,(LPARAM)&rc);
+ if (nm->pt.x < rc.left) return FALSE;
+ }
+ else {
+ if (!((startoffset)!=0&&UseOwnerDrawStatusBar))
+ {
+ nPanel=nm->dwItemSpec;
+ SendMessage(pcli->hwndStatus,SB_GETRECT,nPanel,(LPARAM)&rc);
+ }
+ else {
+ RECT clrc;
+ int sectwidth;
+
+ memset(&rc,0,sizeof(RECT));
+ GetClientRect(pcli->hwndStatus,&clrc);
+ clrc.right-=clrc.left;
+ clrc.right-=startoffset;
+ sectwidth=clrc.right/nParts;
+
+ for (nPanel=0;nPanel<nParts;nPanel++) {
+ PD=(ProtocolData *)SendMessage(pcli->hwndStatus,SB_GETTEXT,(WPARAM)nPanel,(LPARAM)0);
+ if(PD==NULL)
+ continue;
+
+ rc.top=0;
+ rc.bottom=clrc.bottom;
+ rc.left=nPanel*sectwidth+startoffset;
+ rc.right=rc.left+sectwidth-1;
+
+ if (PtInRect(&rc,nm->pt))
+ break;
+ } } }
+
+ totcount=DBGetContactSettingDword(0,"Protocols","ProtoCount",0);
+ PD=(ProtocolData *)SendMessage(pcli->hwndStatus,SB_GETTEXT,(WPARAM)nPanel,(LPARAM)0);
+ if(PD==NULL){return(0);}
+ menuid=nPanel;
+
+ if (menuid<0){break;}
+ hMenu=(HMENU)CallService(MS_CLIST_MENUGETSTATUS,0,0);
+ {
+ int i;
+ unsigned int cpnl = 0;
+ int mcnt = GetMenuItemCount(hMenu);
+ for (i=0; i<mcnt; ++i) {
+ HMENU hMenus = GetSubMenu(hMenu, i);
+ if (hMenus && cpnl++ == menuid) {
+ hMenu = hMenus;
+ break;
+ }
+ }
+ }
+ {
+ char buf[256];
+ sprintf(buf,"nPanel: %d, PD->protopos: %d,PD->RealName %s\r\n",nPanel,PD->protopos,PD->RealName);
+ OutputDebugStringA(buf);
+ }
+
+ if (hMenu != NULL) {
+ GetCursorPos(&pt);
+ TrackPopupMenu(hMenu,TPM_BOTTOMALIGN|TPM_LEFTALIGN,pt.x,pt.y,0,hwnd,NULL);
+ } }
+ return TRUE;
+ }
+ break;
+
+ case WM_DESTROY:
+ {
+ //saving state
+ int state = DBGetContactSettingByte(NULL,"CList","State",SETTING_STATE_NORMAL);
+
+ FreeProtocolData();
+ if ( hSettingChangedHook != 0 )
+ UnhookEvent(hSettingChangedHook);
+
+ if ( state == SETTING_STATE_NORMAL )
+ ShowWindow(hwnd,SW_HIDE);
+
+ CallService(MS_CLIST_FRAMES_REMOVEFRAME,(WPARAM)hFrameContactTree,(LPARAM)0);
+ DestroyWindow(pcli->hwndContactTree);
+ pcli->hwndContactList=NULL;
+
+ UnLoadCLUIFramesModule();
+ DBWriteContactSettingByte(NULL,"CList","State",(BYTE)state);
+ PostQuitMessage(0);
+ }
+ break;
+ }
+
+ return saveContactListWndProc( hwnd, msg, wParam, lParam );
+}
+
+int LoadCLUIModule(void)
+{
+ DBVARIANT dbv;
+ TCHAR titleText[256];
+ int laster;
+ canloadstatusbar=FALSE;
+ hFrameContactTree=0;
+
+ hUserDll = LoadLibraryA("user32.dll");
+ if (hUserDll) {
+ MySetLayeredWindowAttributes = (BOOL (WINAPI *)(HWND,COLORREF,BYTE,DWORD))GetProcAddress(hUserDll, "SetLayeredWindowAttributes");
+ MyAnimateWindow=(BOOL (WINAPI*)(HWND,DWORD,DWORD))GetProcAddress(hUserDll,"AnimateWindow");
+ }
+
+ HookEvent(ME_SYSTEM_MODULESLOADED,CluiModulesLoaded);
+ HookEvent(ME_OPT_INITIALISE,CluiOptInit);
+ hContactDraggingEvent=CreateHookableEvent(ME_CLUI_CONTACTDRAGGING);
+ hContactDroppedEvent=CreateHookableEvent(ME_CLUI_CONTACTDROPPED);
+ hContactDragStopEvent=CreateHookableEvent(ME_CLUI_CONTACTDRAGSTOP);
+
+ CreateServiceFunction("CLUI/GetConnectingIconForProtocol",GetConnectingIconService);
+
+ if(DBGetContactSettingTString(NULL,"CList","TitleText",&dbv))
+ lstrcpyn(titleText,_T(MIRANDANAME),SIZEOF(titleText));
+ else {
+ lstrcpyn(titleText,dbv.ptszVal,SIZEOF(titleText));
+ DBFreeVariant(&dbv);
+ }
+
+ oldhideoffline=DBGetContactSettingByte(NULL,"CList","HideOffline",SETTING_HIDEOFFLINE_DEFAULT);
+
+ laster=GetLastError();
+ PreCreateCLC(pcli->hwndContactList);
+
+ // create status bar frame
+ CreateStatusBarhWnd(pcli->hwndContactList);
+
+ { //int state=DBGetContactSettingByte(NULL,"CList","State",SETTING_STATE_NORMAL);
+ hMenuMain=GetMenu(pcli->hwndContactList);
+ if(!DBGetContactSettingByte(NULL,"CLUI","ShowMainMenu",SETTING_SHOWMAINMENU_DEFAULT)) SetMenu(pcli->hwndContactList,NULL);
+ SetWindowPos(pcli->hwndContactList, DBGetContactSettingByte(NULL,"CList","OnTop",SETTING_ONTOP_DEFAULT) ? HWND_TOPMOST : HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
+ }
+
+ lastreqh=0;
+ return 0;
+}
+
+void UnloadCLUIModule()
+{
+ int i;
+
+ for ( i=0; i < SIZEOF(CycleStartTick); i++ )
+ if ( CycleStartTick[i].szProto != NULL )
+ mir_free(CycleStartTick[i].szProto);
+} \ No newline at end of file
diff --git a/plugins/Mwclist/cluiopts.c b/plugins/Mwclist/cluiopts.c
new file mode 100644
index 0000000000..58c0063638
--- /dev/null
+++ b/plugins/Mwclist/cluiopts.c
@@ -0,0 +1,439 @@
+/*
+
+Miranda IM: the free IM client for Microsoft* Windows*
+
+Copyright 2000-2003 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 "commonheaders.h"
+
+extern HMENU hMenuMain;
+extern BOOL (WINAPI *MySetLayeredWindowAttributes)(HWND,COLORREF,BYTE,DWORD);
+static INT_PTR CALLBACK DlgProcCluiOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam);
+static INT_PTR CALLBACK DlgProcSBarOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam);
+extern HANDLE hFrameHelperStatusBar;
+extern void ReAssignExtraIcons();
+extern int CluiProtocolStatusChanged(WPARAM wParam,LPARAM lParam);
+extern int UseOwnerDrawStatusBar;
+extern int OnStatusBarBackgroundChange();
+
+static UINT expertOnlyControls[]={IDC_BRINGTOFRONT, IDC_AUTOSIZE,IDC_STATIC21,IDC_MAXSIZEHEIGHT,IDC_MAXSIZESPIN,IDC_STATIC22,IDC_AUTOSIZEUPWARD,IDC_SHOWMAINMENU,IDC_SHOWCAPTION,IDC_CLIENTDRAG};
+int CluiOptInit(WPARAM wParam,LPARAM lParam)
+{
+ OPTIONSDIALOGPAGE odp;
+
+ ZeroMemory(&odp,sizeof(odp));
+ odp.cbSize=sizeof(odp);
+ odp.position=0;
+ odp.hInstance=g_hInst;
+ odp.pszTemplate=MAKEINTRESOURCEA(IDD_OPT_CLUI);
+ odp.pszTitle=LPGEN("Window");
+ odp.pszGroup=LPGEN("Contact List");
+ odp.pfnDlgProc=DlgProcCluiOpts;
+ odp.flags=ODPF_BOLDGROUPS;
+ odp.nIDBottomSimpleControl=IDC_STWINDOWGROUP;
+ odp.expertOnlyControls=expertOnlyControls;
+ odp.nExpertOnlyControls=sizeof(expertOnlyControls)/sizeof(expertOnlyControls[0]);
+ CallService(MS_OPT_ADDPAGE,wParam,(LPARAM)&odp);
+ odp.pszTemplate=MAKEINTRESOURCEA(IDD_OPT_SBAR);
+ odp.pszTitle=LPGEN("Status Bar");
+ odp.pfnDlgProc=DlgProcSBarOpts;
+ odp.flags=ODPF_BOLDGROUPS|ODPF_EXPERTONLY;
+ odp.nIDBottomSimpleControl=0;
+ odp.nExpertOnlyControls=0;
+ odp.expertOnlyControls=NULL;
+ CallService(MS_OPT_ADDPAGE,wParam,(LPARAM)&odp);
+ return 0;
+}
+
+static INT_PTR CALLBACK DlgProcCluiOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ switch (msg)
+ {
+ case WM_INITDIALOG:
+ TranslateDialogDefault(hwndDlg);
+ CheckDlgButton(hwndDlg, IDC_BRINGTOFRONT, DBGetContactSettingByte(NULL,"CList","BringToFront",SETTING_BRINGTOFRONT_DEFAULT) ? BST_CHECKED : BST_UNCHECKED);
+ CheckDlgButton(hwndDlg, IDC_ONTOP, DBGetContactSettingByte(NULL,"CList","OnTop",SETTING_ONTOP_DEFAULT) ? BST_CHECKED : BST_UNCHECKED);
+ CheckDlgButton(hwndDlg, IDC_TOOLWND, DBGetContactSettingByte(NULL,"CList","ToolWindow",SETTING_TOOLWINDOW_DEFAULT) ? BST_CHECKED : BST_UNCHECKED);
+ CheckDlgButton(hwndDlg, IDC_MIN2TRAY, DBGetContactSettingByte(NULL,"CList","Min2Tray",SETTING_MIN2TRAY_DEFAULT) ? BST_CHECKED : BST_UNCHECKED);
+ if(IsDlgButtonChecked(hwndDlg,IDC_TOOLWND)) EnableWindow(GetDlgItem(hwndDlg,IDC_MIN2TRAY),FALSE);
+ CheckDlgButton(hwndDlg, IDC_SHOWCAPTION, DBGetContactSettingByte(NULL,"CLUI","ShowCaption",SETTING_SHOWCAPTION_DEFAULT) ? BST_CHECKED : BST_UNCHECKED);
+ CheckDlgButton(hwndDlg, IDC_SHOWMAINMENU, DBGetContactSettingByte(NULL,"CLUI","ShowMainMenu",SETTING_SHOWMAINMENU_DEFAULT) ? BST_CHECKED : BST_UNCHECKED);
+ CheckDlgButton(hwndDlg, IDC_CLIENTDRAG, DBGetContactSettingByte(NULL,"CLUI","ClientAreaDrag",SETTING_CLIENTDRAG_DEFAULT) ? BST_CHECKED : BST_UNCHECKED);
+ if(!IsDlgButtonChecked(hwndDlg,IDC_SHOWCAPTION)) {
+ EnableWindow(GetDlgItem(hwndDlg,IDC_MIN2TRAY),FALSE);
+ EnableWindow(GetDlgItem(hwndDlg,IDC_TOOLWND),FALSE);
+ EnableWindow(GetDlgItem(hwndDlg,IDC_TITLETEXT),FALSE);
+ }
+ CheckDlgButton(hwndDlg, IDC_FADEINOUT, DBGetContactSettingByte(NULL,"CLUI","FadeInOut",0) ? BST_CHECKED : BST_UNCHECKED);
+ CheckDlgButton(hwndDlg, IDC_AUTOSIZE, DBGetContactSettingByte(NULL,"CLUI","AutoSize",0) ? BST_CHECKED : BST_UNCHECKED);
+ CheckDlgButton(hwndDlg, IDC_DROPSHADOW, DBGetContactSettingByte(NULL,"CList","WindowShadow",0) ? BST_CHECKED : BST_UNCHECKED);
+ CheckDlgButton(hwndDlg, IDC_ONDESKTOP, DBGetContactSettingByte(NULL,"CList","OnDesktop", 0) ? BST_CHECKED : BST_UNCHECKED);
+ SendDlgItemMessage(hwndDlg,IDC_MAXSIZESPIN,UDM_SETRANGE,0,MAKELONG(100,0));
+ SendDlgItemMessage(hwndDlg,IDC_MAXSIZESPIN,UDM_SETPOS,0,DBGetContactSettingByte(NULL,"CLUI","MaxSizeHeight",75));
+ CheckDlgButton(hwndDlg, IDC_AUTOSIZEUPWARD, DBGetContactSettingByte(NULL,"CLUI","AutoSizeUpward",0) ? BST_CHECKED : BST_UNCHECKED);
+ CheckDlgButton(hwndDlg, IDC_AUTOHIDE, DBGetContactSettingByte(NULL,"CList","AutoHide",SETTING_AUTOHIDE_DEFAULT) ? BST_CHECKED : BST_UNCHECKED);
+ SendDlgItemMessage(hwndDlg,IDC_HIDETIMESPIN,UDM_SETRANGE,0,MAKELONG(900,1));
+ SendDlgItemMessage(hwndDlg,IDC_HIDETIMESPIN,UDM_SETPOS,0,MAKELONG(DBGetContactSettingWord(NULL,"CList","HideTime",SETTING_HIDETIME_DEFAULT),0));
+ EnableWindow(GetDlgItem(hwndDlg,IDC_HIDETIME),IsDlgButtonChecked(hwndDlg,IDC_AUTOHIDE));
+ EnableWindow(GetDlgItem(hwndDlg,IDC_HIDETIMESPIN),IsDlgButtonChecked(hwndDlg,IDC_AUTOHIDE));
+ EnableWindow(GetDlgItem(hwndDlg,IDC_STATIC01),IsDlgButtonChecked(hwndDlg,IDC_AUTOHIDE));
+ if(!IsDlgButtonChecked(hwndDlg,IDC_AUTOSIZE)) {
+ EnableWindow(GetDlgItem(hwndDlg,IDC_STATIC21),FALSE);
+ EnableWindow(GetDlgItem(hwndDlg,IDC_STATIC22),FALSE);
+ EnableWindow(GetDlgItem(hwndDlg,IDC_MAXSIZEHEIGHT),FALSE);
+ EnableWindow(GetDlgItem(hwndDlg,IDC_MAXSIZESPIN),FALSE);
+ EnableWindow(GetDlgItem(hwndDlg,IDC_AUTOSIZEUPWARD),FALSE);
+ }
+
+ { DBVARIANT dbv;
+ char *s;
+ char szUin[20];
+
+ if(DBGetContactSettingString(NULL,"CList","TitleText",&dbv)==0&&(dbv.pszVal))
+ {
+ s=mir_strdup(dbv.pszVal);
+ mir_free(dbv.pszVal);
+ }
+ else
+ {
+ s=mir_strdup(MIRANDANAME);
+ }
+
+ if(s)
+ {
+ SetDlgItemTextA(hwndDlg,IDC_TITLETEXT,s);
+ mir_free(s);
+ }
+
+ SendDlgItemMessage(hwndDlg,IDC_TITLETEXT,CB_ADDSTRING,0,(LPARAM)MIRANDANAME);
+ wsprintfA(szUin,"%u",DBGetContactSettingDword(NULL,"ICQ","UIN",0));
+ SendDlgItemMessage(hwndDlg,IDC_TITLETEXT,CB_ADDSTRING,0,(LPARAM)szUin);
+
+ if(!DBGetContactSettingString(NULL,"ICQ","Nick",&dbv)) {
+ SendDlgItemMessage(hwndDlg,IDC_TITLETEXT,CB_ADDSTRING,0,(LPARAM)dbv.pszVal);
+ mir_free(dbv.pszVal);
+ dbv.pszVal=NULL;
+ }
+ if(!DBGetContactSettingString(NULL,"ICQ","FirstName",&dbv)) {
+ SendDlgItemMessage(hwndDlg,IDC_TITLETEXT,CB_ADDSTRING,0,(LPARAM)dbv.pszVal);
+ mir_free(dbv.pszVal);
+ dbv.pszVal=NULL;
+ }
+ if(!DBGetContactSettingString(NULL,"ICQ","e-mail",&dbv)) {
+ SendDlgItemMessage(hwndDlg,IDC_TITLETEXT,CB_ADDSTRING,0,(LPARAM)dbv.pszVal);
+ mir_free(dbv.pszVal);
+ dbv.pszVal=NULL;
+ }
+ }
+ if(!IsWinVer2000Plus()) {
+ EnableWindow(GetDlgItem(hwndDlg,IDC_FADEINOUT),FALSE);
+ EnableWindow(GetDlgItem(hwndDlg,IDC_TRANSPARENT),FALSE);
+ EnableWindow(GetDlgItem(hwndDlg,IDC_DROPSHADOW),FALSE);
+ }
+ else CheckDlgButton(hwndDlg,IDC_TRANSPARENT,DBGetContactSettingByte(NULL,"CList","Transparent",SETTING_TRANSPARENT_DEFAULT)?BST_CHECKED:BST_UNCHECKED);
+ if(!IsDlgButtonChecked(hwndDlg,IDC_TRANSPARENT)) {
+ EnableWindow(GetDlgItem(hwndDlg,IDC_STATIC11),FALSE);
+ EnableWindow(GetDlgItem(hwndDlg,IDC_STATIC12),FALSE);
+ EnableWindow(GetDlgItem(hwndDlg,IDC_TRANSACTIVE),FALSE);
+ EnableWindow(GetDlgItem(hwndDlg,IDC_TRANSINACTIVE),FALSE);
+ EnableWindow(GetDlgItem(hwndDlg,IDC_ACTIVEPERC),FALSE);
+ EnableWindow(GetDlgItem(hwndDlg,IDC_INACTIVEPERC),FALSE);
+ }
+ SendDlgItemMessage(hwndDlg,IDC_TRANSACTIVE,TBM_SETRANGE,FALSE,MAKELONG(1,255));
+ SendDlgItemMessage(hwndDlg,IDC_TRANSINACTIVE,TBM_SETRANGE,FALSE,MAKELONG(1,255));
+ SendDlgItemMessage(hwndDlg,IDC_TRANSACTIVE,TBM_SETPOS,TRUE,DBGetContactSettingByte(NULL,"CList","Alpha",SETTING_ALPHA_DEFAULT));
+ SendDlgItemMessage(hwndDlg,IDC_TRANSINACTIVE,TBM_SETPOS,TRUE,DBGetContactSettingByte(NULL,"CList","AutoAlpha",SETTING_AUTOALPHA_DEFAULT));
+ SendMessage(hwndDlg,WM_HSCROLL,0x12345678,0);
+
+ // EXTRA Icons
+ if (ServiceExists("ExtraIcon/Register"))
+ {
+ ShowWindow(GetDlgItem(hwndDlg,IDC_EXTRA_FRAME), SW_HIDE);
+ ShowWindow(GetDlgItem(hwndDlg,IDC_EXTRA_PROTO), SW_HIDE);
+ ShowWindow(GetDlgItem(hwndDlg,IDC_EXTRA_WEB), SW_HIDE);
+ ShowWindow(GetDlgItem(hwndDlg,IDC_EXTRA_EMAIL), SW_HIDE);
+ ShowWindow(GetDlgItem(hwndDlg,IDC_EXTRA_CELLULAR), SW_HIDE);
+ ShowWindow(GetDlgItem(hwndDlg,IDC_EXTRA_ADV1), SW_HIDE);
+ ShowWindow(GetDlgItem(hwndDlg,IDC_EXTRA_ADV2), SW_HIDE);
+ }
+ else
+ {
+ CheckDlgButton(hwndDlg, IDC_EXTRA_PROTO, DBGetContactSettingByte(NULL,CLUIFrameModule,"EXTRA_ICON_PROTO",1) ? BST_CHECKED : BST_UNCHECKED);
+ CheckDlgButton(hwndDlg, IDC_EXTRA_WEB, DBGetContactSettingByte(NULL,CLUIFrameModule,"EXTRA_ICON_WEB",1) ? BST_CHECKED : BST_UNCHECKED);
+ CheckDlgButton(hwndDlg, IDC_EXTRA_EMAIL, DBGetContactSettingByte(NULL,CLUIFrameModule,"EXTRA_ICON_EMAIL",1) ? BST_CHECKED : BST_UNCHECKED);
+ CheckDlgButton(hwndDlg, IDC_EXTRA_CELLULAR, DBGetContactSettingByte(NULL,CLUIFrameModule,"EXTRA_ICON_SMS",1) ? BST_CHECKED : BST_UNCHECKED);
+ CheckDlgButton(hwndDlg, IDC_EXTRA_ADV1, DBGetContactSettingByte(NULL,CLUIFrameModule,"EXTRA_ICON_ADV1",1) ? BST_CHECKED : BST_UNCHECKED);
+ CheckDlgButton(hwndDlg, IDC_EXTRA_ADV2, DBGetContactSettingByte(NULL,CLUIFrameModule,"EXTRA_ICON_ADV2",1) ? BST_CHECKED : BST_UNCHECKED);
+ }
+
+ return TRUE;
+
+ case WM_COMMAND:
+ if(LOWORD(wParam)==IDC_AUTOHIDE) {
+ EnableWindow(GetDlgItem(hwndDlg,IDC_HIDETIME),IsDlgButtonChecked(hwndDlg,IDC_AUTOHIDE));
+ EnableWindow(GetDlgItem(hwndDlg,IDC_HIDETIMESPIN),IsDlgButtonChecked(hwndDlg,IDC_AUTOHIDE));
+ EnableWindow(GetDlgItem(hwndDlg,IDC_STATIC01),IsDlgButtonChecked(hwndDlg,IDC_AUTOHIDE));
+ }
+ else if(LOWORD(wParam)==IDC_TRANSPARENT) {
+ EnableWindow(GetDlgItem(hwndDlg,IDC_STATIC11),IsDlgButtonChecked(hwndDlg,IDC_TRANSPARENT));
+ EnableWindow(GetDlgItem(hwndDlg,IDC_STATIC12),IsDlgButtonChecked(hwndDlg,IDC_TRANSPARENT));
+ EnableWindow(GetDlgItem(hwndDlg,IDC_TRANSACTIVE),IsDlgButtonChecked(hwndDlg,IDC_TRANSPARENT));
+ EnableWindow(GetDlgItem(hwndDlg,IDC_TRANSINACTIVE),IsDlgButtonChecked(hwndDlg,IDC_TRANSPARENT));
+ EnableWindow(GetDlgItem(hwndDlg,IDC_ACTIVEPERC),IsDlgButtonChecked(hwndDlg,IDC_TRANSPARENT));
+ EnableWindow(GetDlgItem(hwndDlg,IDC_INACTIVEPERC),IsDlgButtonChecked(hwndDlg,IDC_TRANSPARENT));
+ }
+ else if(LOWORD(wParam)==IDC_AUTOSIZE) {
+ EnableWindow(GetDlgItem(hwndDlg,IDC_STATIC21),IsDlgButtonChecked(hwndDlg,IDC_AUTOSIZE));
+ EnableWindow(GetDlgItem(hwndDlg,IDC_STATIC22),IsDlgButtonChecked(hwndDlg,IDC_AUTOSIZE));
+ EnableWindow(GetDlgItem(hwndDlg,IDC_MAXSIZEHEIGHT),IsDlgButtonChecked(hwndDlg,IDC_AUTOSIZE));
+ EnableWindow(GetDlgItem(hwndDlg,IDC_MAXSIZESPIN),IsDlgButtonChecked(hwndDlg,IDC_AUTOSIZE));
+ EnableWindow(GetDlgItem(hwndDlg,IDC_AUTOSIZEUPWARD),IsDlgButtonChecked(hwndDlg,IDC_AUTOSIZE));
+ }
+ else if(LOWORD(wParam)==IDC_TOOLWND) {
+ EnableWindow(GetDlgItem(hwndDlg,IDC_MIN2TRAY),!IsDlgButtonChecked(hwndDlg,IDC_TOOLWND));
+ }
+ else if(LOWORD(wParam)==IDC_SHOWCAPTION) {
+ EnableWindow(GetDlgItem(hwndDlg,IDC_TOOLWND),IsDlgButtonChecked(hwndDlg,IDC_SHOWCAPTION));
+ EnableWindow(GetDlgItem(hwndDlg,IDC_MIN2TRAY),!IsDlgButtonChecked(hwndDlg,IDC_TOOLWND) && IsDlgButtonChecked(hwndDlg,IDC_SHOWCAPTION));
+ EnableWindow(GetDlgItem(hwndDlg,IDC_TITLETEXT),IsDlgButtonChecked(hwndDlg,IDC_SHOWCAPTION));
+ }
+
+ if ((LOWORD(wParam)==IDC_HIDETIME || LOWORD(wParam)==IDC_TITLETEXT || LOWORD(wParam)==IDC_MAXSIZEHEIGHT) &&
+ (HIWORD(wParam)!=EN_CHANGE || (HWND)lParam!=GetFocus()))
+ return 0;
+
+ // Enable apply button
+ SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
+ break;
+
+ case WM_HSCROLL:
+ { char str[10];
+ wsprintfA(str,"%d%%",100*SendDlgItemMessage(hwndDlg,IDC_TRANSINACTIVE,TBM_GETPOS,0,0)/255);
+ SetDlgItemTextA(hwndDlg,IDC_INACTIVEPERC,str);
+ wsprintfA(str,"%d%%",100*SendDlgItemMessage(hwndDlg,IDC_TRANSACTIVE,TBM_GETPOS,0,0)/255);
+ SetDlgItemTextA(hwndDlg,IDC_ACTIVEPERC,str);
+ }
+ if(wParam!=0x12345678) SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
+ break;
+ case WM_NOTIFY:
+ switch (((LPNMHDR)lParam)->code)
+ {
+ case PSN_APPLY:
+ DBWriteContactSettingByte(NULL,"CList","OnTop",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_ONTOP));
+ SetWindowPos(pcli->hwndContactList, IsDlgButtonChecked(hwndDlg,IDC_ONTOP)?HWND_TOPMOST:HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
+
+ DBWriteContactSettingByte(NULL,"CList","ToolWindow",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_TOOLWND));
+ DBWriteContactSettingByte(NULL,"CList","BringToFront",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_BRINGTOFRONT));
+ if(IsDlgButtonChecked(hwndDlg,IDC_TOOLWND)) {
+ // Window must be hidden to dynamically remove the taskbar button.
+ // See http://msdn.microsoft.com/library/en-us/shellcc/platform/shell/programmersguide/shell_int/shell_int_programming/taskbar.asp
+ WINDOWPLACEMENT p;
+ p.length = sizeof(p);
+ GetWindowPlacement(pcli->hwndContactList,&p);
+ ShowWindow(pcli->hwndContactList,SW_HIDE);
+ SetWindowLong(pcli->hwndContactList,GWL_EXSTYLE,GetWindowLong(pcli->hwndContactList,GWL_EXSTYLE)|WS_EX_TOOLWINDOW|WS_EX_WINDOWEDGE);
+ SetWindowPlacement(pcli->hwndContactList,&p);
+ }
+ else
+ SetWindowLong(pcli->hwndContactList,GWL_EXSTYLE,GetWindowLong(pcli->hwndContactList,GWL_EXSTYLE)&~WS_EX_TOOLWINDOW);
+
+ if (IsDlgButtonChecked(hwndDlg,IDC_ONDESKTOP)) {
+ HWND hProgMan=FindWindowA("Progman",NULL);
+ if (IsWindow(hProgMan)) SetParent(pcli->hwndContactList,hProgMan);
+ } else {
+ SetParent(pcli->hwndContactList,NULL);
+ }
+
+ DBWriteContactSettingByte(NULL,"CLUI","ShowCaption",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_SHOWCAPTION));
+ DBWriteContactSettingByte(NULL,"CLUI","ShowMainMenu",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_SHOWMAINMENU));
+ DBWriteContactSettingByte(NULL,"CLUI","ClientAreaDrag",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_CLIENTDRAG));
+
+ if(IsDlgButtonChecked(hwndDlg,IDC_SHOWCAPTION))
+ SetWindowLong(pcli->hwndContactList,GWL_STYLE,GetWindowLong(pcli->hwndContactList,GWL_STYLE)|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX);
+ else
+ SetWindowLong(pcli->hwndContactList,GWL_STYLE,GetWindowLong(pcli->hwndContactList,GWL_STYLE)&~(WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX));
+
+ if(!IsDlgButtonChecked(hwndDlg,IDC_SHOWMAINMENU)) SetMenu(pcli->hwndContactList,NULL);
+ else SetMenu(pcli->hwndContactList,hMenuMain);
+
+ SetWindowPos(pcli->hwndContactList,0,0,0,0,0,SWP_NOZORDER|SWP_NOMOVE|SWP_NOSIZE|SWP_FRAMECHANGED);
+ RedrawWindow(pcli->hwndContactList,NULL,NULL,RDW_FRAME|RDW_INVALIDATE);
+
+ DBWriteContactSettingByte(NULL,"CList","Min2Tray",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_MIN2TRAY));
+ if(IsIconic(pcli->hwndContactList) && !IsDlgButtonChecked(hwndDlg,IDC_TOOLWND))
+ ShowWindow(pcli->hwndContactList,IsDlgButtonChecked(hwndDlg,IDC_MIN2TRAY)?SW_HIDE:SW_SHOW);
+
+ { TCHAR title[256];
+ GetDlgItemText(hwndDlg,IDC_TITLETEXT,title,SIZEOF(title));
+ DBWriteContactSettingTString(NULL,"CList","TitleText",title);
+ SetWindowText(pcli->hwndContactList,title);
+ }
+ DBWriteContactSettingByte(NULL,"CLUI","FadeInOut",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_FADEINOUT));
+ DBWriteContactSettingByte(NULL,"CLUI","AutoSize",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_AUTOSIZE));
+ DBWriteContactSettingByte(NULL,"CLUI","MaxSizeHeight",(BYTE)GetDlgItemInt(hwndDlg,IDC_MAXSIZEHEIGHT,NULL,FALSE));
+ DBWriteContactSettingByte(NULL,"CLUI","AutoSizeUpward",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_AUTOSIZEUPWARD));
+ DBWriteContactSettingByte(NULL,"CList","AutoHide",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_AUTOHIDE));
+ DBWriteContactSettingWord(NULL,"CList","HideTime",(WORD)SendDlgItemMessage(hwndDlg,IDC_HIDETIMESPIN,UDM_GETPOS,0,0));
+
+ DBWriteContactSettingByte(NULL,"CList","Transparent",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_TRANSPARENT));
+ DBWriteContactSettingByte(NULL,"CList","Alpha",(BYTE)SendDlgItemMessage(hwndDlg,IDC_TRANSACTIVE,TBM_GETPOS,0,0));
+ DBWriteContactSettingByte(NULL,"CList","AutoAlpha",(BYTE)SendDlgItemMessage(hwndDlg,IDC_TRANSINACTIVE,TBM_GETPOS,0,0));
+ DBWriteContactSettingByte(NULL,"CList","WindowShadow",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_DROPSHADOW));
+ DBWriteContactSettingByte(NULL,"CList","OnDesktop",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_ONDESKTOP));
+ if(IsDlgButtonChecked(hwndDlg,IDC_TRANSPARENT)) {
+ SetWindowLong(pcli->hwndContactList, GWL_EXSTYLE, GetWindowLong(pcli->hwndContactList, GWL_EXSTYLE) | WS_EX_LAYERED);
+ if(MySetLayeredWindowAttributes) MySetLayeredWindowAttributes(pcli->hwndContactList, RGB(0,0,0), (BYTE)DBGetContactSettingByte(NULL,"CList","AutoAlpha",SETTING_AUTOALPHA_DEFAULT), LWA_ALPHA);
+ }
+ else {
+ SetWindowLong(pcli->hwndContactList, GWL_EXSTYLE, GetWindowLong(pcli->hwndContactList, GWL_EXSTYLE) & ~WS_EX_LAYERED);
+ }
+ SendMessage(pcli->hwndContactTree,WM_SIZE,0,0); //forces it to send a cln_listsizechanged
+
+ if (!ServiceExists("ExtraIcon/Register"))
+ {
+ DBWriteContactSettingByte(NULL,CLUIFrameModule,"EXTRA_ICON_PROTO",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_EXTRA_PROTO));
+ DBWriteContactSettingByte(NULL,CLUIFrameModule,"EXTRA_ICON_WEB",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_EXTRA_WEB));
+ DBWriteContactSettingByte(NULL,CLUIFrameModule,"EXTRA_ICON_EMAIL",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_EXTRA_EMAIL));
+ DBWriteContactSettingByte(NULL,CLUIFrameModule,"EXTRA_ICON_SMS",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_EXTRA_CELLULAR));
+ DBWriteContactSettingByte(NULL,CLUIFrameModule,"EXTRA_ICON_ADV1",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_EXTRA_ADV1));
+ DBWriteContactSettingByte(NULL,CLUIFrameModule,"EXTRA_ICON_ADV2",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_EXTRA_ADV2));
+ //SetAllExtraIcons()
+ ReAssignExtraIcons();
+ }
+
+ return TRUE;
+ }
+ break;
+ }
+ return FALSE;
+}
+
+static INT_PTR CALLBACK DlgProcSBarOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ switch (msg)
+ {
+ case WM_INITDIALOG:
+ TranslateDialogDefault(hwndDlg);
+ CheckDlgButton(hwndDlg, IDC_SHOWSBAR, DBGetContactSettingByte(NULL,"CLUI","ShowSBar",1) ? BST_CHECKED : BST_UNCHECKED);
+ CheckDlgButton(hwndDlg, IDC_USECONNECTINGICON, DBGetContactSettingByte(NULL,"CLUI","UseConnectingIcon",1) ? BST_CHECKED : BST_UNCHECKED);
+ { BYTE showOpts=DBGetContactSettingByte(NULL,"CLUI","SBarShow",1);
+ CheckDlgButton(hwndDlg, IDC_SHOWICON, showOpts&1 ? BST_CHECKED : BST_UNCHECKED);
+ CheckDlgButton(hwndDlg, IDC_SHOWPROTO, showOpts&2 ? BST_CHECKED : BST_UNCHECKED);
+ CheckDlgButton(hwndDlg, IDC_SHOWSTATUS, showOpts&4 ? BST_CHECKED : BST_UNCHECKED);
+ }
+ CheckDlgButton(hwndDlg, IDC_RIGHTSTATUS, DBGetContactSettingByte(NULL,"CLUI","SBarRightClk",0) ? BST_UNCHECKED : BST_CHECKED);
+ CheckDlgButton(hwndDlg, IDC_RIGHTMIRANDA, !IsDlgButtonChecked(hwndDlg,IDC_RIGHTSTATUS) ? BST_CHECKED : BST_UNCHECKED);
+ CheckDlgButton(hwndDlg, IDC_EQUALSECTIONS, DBGetContactSettingByte(NULL,"CLUI","EqualSections",0) ? BST_CHECKED : BST_UNCHECKED);
+ CheckDlgButton(hwndDlg, IDC_SBPANELBEVEL, DBGetContactSettingByte(NULL,"CLUI","SBarBevel",1) ? BST_CHECKED : BST_UNCHECKED);
+ CheckDlgButton(hwndDlg, IDC_SHOWSIZEGRIP, DBGetContactSettingByte(NULL,"CLUI","SBarUseSizeGrip",1) ? BST_CHECKED : BST_UNCHECKED);
+
+ CheckDlgButton(hwndDlg, IDC_USEOWNERDRAW, DBGetContactSettingByte(NULL,"CLUI","UseOwnerDrawStatusBar",1) ? BST_CHECKED : BST_UNCHECKED);
+
+ SendDlgItemMessage(hwndDlg,IDC_BKGCOLOUR,CPM_SETCOLOUR,0,DBGetContactSettingDword(NULL,"CLUI","SBarBKColor",CLR_DEFAULT));
+
+ if(!IsDlgButtonChecked(hwndDlg,IDC_SHOWSBAR)) {
+ EnableWindow(GetDlgItem(hwndDlg,IDC_SHOWICON),FALSE);
+ EnableWindow(GetDlgItem(hwndDlg,IDC_SHOWPROTO),FALSE);
+ EnableWindow(GetDlgItem(hwndDlg,IDC_SHOWSTATUS),FALSE);
+ EnableWindow(GetDlgItem(hwndDlg,IDC_RIGHTSTATUS),FALSE);
+ EnableWindow(GetDlgItem(hwndDlg,IDC_RIGHTMIRANDA),FALSE);
+ EnableWindow(GetDlgItem(hwndDlg,IDC_EQUALSECTIONS),FALSE);
+ EnableWindow(GetDlgItem(hwndDlg,IDC_SBPANELBEVEL),FALSE);
+ EnableWindow(GetDlgItem(hwndDlg,IDC_SHOWSIZEGRIP),FALSE);
+ EnableWindow(GetDlgItem(hwndDlg,IDC_USECONNECTINGICON),FALSE);
+ EnableWindow(GetDlgItem(hwndDlg,IDC_USEOWNERDRAW),FALSE);
+
+ }
+ return TRUE;
+ case WM_COMMAND:
+ if(LOWORD(wParam)==IDC_SHOWSBAR) {
+ EnableWindow(GetDlgItem(hwndDlg,IDC_SHOWICON),IsDlgButtonChecked(hwndDlg,IDC_SHOWSBAR));
+ EnableWindow(GetDlgItem(hwndDlg,IDC_SHOWPROTO),IsDlgButtonChecked(hwndDlg,IDC_SHOWSBAR));
+ EnableWindow(GetDlgItem(hwndDlg,IDC_SHOWSTATUS),IsDlgButtonChecked(hwndDlg,IDC_SHOWSBAR));
+ EnableWindow(GetDlgItem(hwndDlg,IDC_RIGHTSTATUS),IsDlgButtonChecked(hwndDlg,IDC_SHOWSBAR));
+ EnableWindow(GetDlgItem(hwndDlg,IDC_RIGHTMIRANDA),IsDlgButtonChecked(hwndDlg,IDC_SHOWSBAR));
+ EnableWindow(GetDlgItem(hwndDlg,IDC_EQUALSECTIONS),IsDlgButtonChecked(hwndDlg,IDC_SHOWSBAR));
+ EnableWindow(GetDlgItem(hwndDlg,IDC_SBPANELBEVEL),IsDlgButtonChecked(hwndDlg,IDC_SHOWSBAR));
+ EnableWindow(GetDlgItem(hwndDlg,IDC_SHOWSIZEGRIP),IsDlgButtonChecked(hwndDlg,IDC_SHOWSBAR));
+ EnableWindow(GetDlgItem(hwndDlg,IDC_USECONNECTINGICON),IsDlgButtonChecked(hwndDlg,IDC_SHOWSBAR));
+ EnableWindow(GetDlgItem(hwndDlg,IDC_USEOWNERDRAW),IsDlgButtonChecked(hwndDlg,IDC_SHOWSBAR));
+
+ }
+ if (LOWORD(wParam)==IDC_DEFBKCOLOR)
+ {
+ SendDlgItemMessage(hwndDlg,IDC_BKGCOLOUR,CPM_SETCOLOUR,0,CLR_DEFAULT);
+ SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
+ }
+
+ SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
+ break;
+ case WM_NOTIFY:
+ switch (((LPNMHDR)lParam)->code)
+ {
+ case PSN_APPLY:
+ {
+ int frameopt;
+
+ COLORREF col;
+ col=SendDlgItemMessage(hwndDlg,IDC_BKGCOLOUR,CPM_GETCOLOUR,0,0);
+ DBWriteContactSettingDword(NULL,"CLUI","SBarBKColor",col);
+
+
+
+ DBWriteContactSettingByte(NULL,"CLUI","ShowSBar",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_SHOWSBAR));
+ DBWriteContactSettingByte(NULL,"CLUI","SBarShow",(BYTE)((IsDlgButtonChecked(hwndDlg,IDC_SHOWICON)?1:0)|(IsDlgButtonChecked(hwndDlg,IDC_SHOWPROTO)?2:0)|(IsDlgButtonChecked(hwndDlg,IDC_SHOWSTATUS)?4:0)));
+ DBWriteContactSettingByte(NULL,"CLUI","SBarRightClk",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_RIGHTMIRANDA));
+ DBWriteContactSettingByte(NULL,"CLUI","EqualSections",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_EQUALSECTIONS));
+ DBWriteContactSettingByte(NULL,"CLUI","SBarBevel",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_SBPANELBEVEL));
+ DBWriteContactSettingByte(NULL,"CLUI","SBarUseSizeGrip",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_SHOWSIZEGRIP));
+
+ DBWriteContactSettingByte(NULL,"CLUI","UseConnectingIcon",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_USECONNECTINGICON));
+ DBWriteContactSettingByte(NULL,"CLUI","UseOwnerDrawStatusBar",(BYTE)IsDlgButtonChecked(hwndDlg,IDC_USEOWNERDRAW));
+ UseOwnerDrawStatusBar=DBGetContactSettingByte(NULL,"CLUI","UseOwnerDrawStatusBar",0);
+/*
+ if(IsDlgButtonChecked(hwndDlg,IDC_SHOWSBAR)) ShowWindow(pcli->hwndStatus,SW_SHOW);
+ else ShowWindow(pcli->hwndStatus,SW_HIDE);
+*/
+
+ frameopt=CallService(MS_CLIST_FRAMES_GETFRAMEOPTIONS,MAKEWPARAM(FO_FLAGS,hFrameHelperStatusBar),0);
+
+ frameopt=frameopt & (~F_VISIBLE);
+
+ if(IsDlgButtonChecked(hwndDlg,IDC_SHOWSBAR))
+ {
+ ShowWindow(pcli->hwndStatus,SW_SHOW);
+ frameopt|=F_VISIBLE;
+ }
+ else
+ {
+ ShowWindow(pcli->hwndStatus,SW_HIDE);
+ }
+ CallService(MS_CLIST_FRAMES_SETFRAMEOPTIONS,MAKEWPARAM(FO_FLAGS,hFrameHelperStatusBar),frameopt);
+
+ SendMessage(pcli->hwndContactList,WM_SIZE,0,0);
+
+ OnStatusBarBackgroundChange();
+ CluiProtocolStatusChanged(0,0);
+ return TRUE;
+ }
+ }
+ break;
+ }
+ return FALSE;
+}
diff --git a/plugins/Mwclist/cluiservices.c b/plugins/Mwclist/cluiservices.c
new file mode 100644
index 0000000000..7759ebd97f
--- /dev/null
+++ b/plugins/Mwclist/cluiservices.c
@@ -0,0 +1,180 @@
+/*
+
+Miranda IM: the free IM client for Microsoft* Windows*
+
+Copyright 2000-2003 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 "commonheaders.h"
+#include "m_clc.h"
+#include "m_clui.h"
+
+extern int CreateTimerForConnectingIcon(WPARAM,LPARAM);
+
+void FreeProtocolData( void )
+{
+ //free protocol data
+ int nPanel;
+ int nParts=SendMessage(pcli->hwndStatus,SB_GETPARTS,0,0);
+ for (nPanel=0;nPanel<nParts;nPanel++)
+ {
+ ProtocolData *PD;
+ PD=(ProtocolData *)SendMessage(pcli->hwndStatus,SB_GETTEXT,(WPARAM)nPanel,(LPARAM)0);
+ if (PD!=NULL&&!IsBadCodePtr((void *)PD))
+ {
+ SendMessage(pcli->hwndStatus,SB_SETTEXT,(WPARAM)nPanel|SBT_OWNERDRAW,(LPARAM)0);
+ if (PD->RealName) mir_free(PD->RealName);
+ if (PD) mir_free(PD);
+} } }
+
+void CluiProtocolStatusChanged( int parStatus, const char* szProto )
+{
+ int protoCount,i;
+ PROTOACCOUNT **accs;
+ int *partWidths,partCount;
+ int borders[3];
+ int flags;
+ int FirstIconOffset;
+
+ if ( pcli->hwndStatus == 0 )
+ return;
+
+ FirstIconOffset=DBGetContactSettingDword(NULL,"CLUI","FirstIconOffset",0);
+
+ ProtoEnumAccounts( &protoCount, &accs );
+ if ( protoCount == 0 )
+ return;
+
+ OutputDebugStringA("CluiProtocolStatusChanged");
+ OutputDebugStringA("\r\n");
+ FreeProtocolData();
+
+ SendMessage(pcli->hwndStatus,SB_GETBORDERS,0,(LPARAM)&borders);
+
+ SendMessage(pcli->hwndStatus,SB_SETBKCOLOR,0,DBGetContactSettingDword(0,"CLUI","SBarBKColor",CLR_DEFAULT));
+ partWidths = (int*)alloca((protoCount+1)*sizeof(int));
+ //partWidths[0]=FirstIconOffset;
+ if(DBGetContactSettingByte(NULL,"CLUI","UseOwnerDrawStatusBar",0)||DBGetContactSettingByte(NULL,"CLUI","EqualSections",1))
+ {
+ RECT rc;
+ int toshow, part;
+
+ SendMessage(pcli->hwndStatus,WM_SIZE,0,0);
+ GetClientRect(pcli->hwndStatus,&rc);
+ rc.right-=borders[0]*2;
+ toshow=0;
+ for (i=0;i<protoCount;i++)
+ {
+ if ( !pcli->pfnGetProtocolVisibility( accs[i]->szModuleName ))
+ continue;
+
+ toshow++;
+ }
+
+ if (toshow>0)
+ {
+ for (part=0,i=0;i<protoCount;i++)
+ {
+ if ( !pcli->pfnGetProtocolVisibility( accs[i]->szModuleName ))
+ continue;
+
+ partWidths[part]=((part+1)*(rc.right/toshow))-(borders[2]>>1);
+ //partWidths[part]=40*part+40;
+ part++;
+ }
+ //partCount=part;
+ }
+ partCount=toshow;
+
+ }
+ else {
+ HDC hdc;
+ SIZE textSize;
+ BYTE showOpts=DBGetContactSettingByte(NULL,"CLUI","SBarShow",5);
+ DWORD extraspace=DBGetContactSettingDword(NULL,"StatusBar","BkExtraSpace",0);
+ DWORD startoffset=DBGetContactSettingDword(NULL,"StatusBar","FirstIconOffset",0);
+ int x;
+
+ hdc=GetDC(pcli->hwndStatus);
+
+ for(partCount=0,i=0;i<protoCount;i++) //count down since built in ones tend to go at the end
+ {
+ int ind = pcli->pfnGetAccountIndexByPos(i);
+ if (ind < 0) continue;
+
+ if (!pcli->pfnGetProtocolVisibility(accs[ind]->szModuleName))
+ continue;
+
+ x=2;
+ if (showOpts&1) x+=GetSystemMetrics(SM_CXSMICON);
+ if (showOpts&2)
+ {
+ TCHAR szName[64];
+ mir_sntprintf(szName, SIZEOF(szName), _T("%s%s"), accs[ind]->tszAccountName, showOpts&4 ? _T(" ") : _T(""));
+ GetTextExtentPoint32(hdc, szName, (int)_tcslen(szName), &textSize);
+ x += textSize.cx;
+ }
+ if (showOpts&4)
+ {
+ int status = CallProtoService(accs[ind]->szModuleName, PS_GETSTATUS, 0, 0);
+ TCHAR *szStatus = pcli->pfnGetStatusModeDescription(status, 0);
+ if (!szStatus) szStatus = _T("");
+ GetTextExtentPoint32(hdc, szStatus, (int)_tcslen(szStatus), &textSize);
+ x += textSize.cx;
+ }
+ if (showOpts&6) x += 2;
+ partWidths[partCount]=(partCount?partWidths[partCount-1]:startoffset)+x+extraspace;
+ partCount++;
+ }
+ ReleaseDC(pcli->hwndStatus,hdc);
+ }
+ if(partCount==0) {
+ SendMessage(pcli->hwndStatus,SB_SIMPLE,TRUE,0);
+ return;
+ }
+ SendMessage(pcli->hwndStatus,SB_SIMPLE,FALSE,0);
+
+ partWidths[partCount-1]=-1;
+
+ SendMessage(pcli->hwndStatus,SB_SETMINHEIGHT,GetSystemMetrics(SM_CYSMICON)+2,0);
+ SendMessage(pcli->hwndStatus,SB_SETPARTS,partCount,(LPARAM)partWidths);
+
+ flags = SBT_OWNERDRAW;
+ if (!DBGetContactSettingByte(NULL, "CLUI", "SBarBevel", 1)) flags |= SBT_NOBORDERS;
+
+ for (partCount=0, i=0; i<protoCount; i++) //count down since built in ones tend to go at the end
+ {
+ ProtocolData *PD;
+
+ int ind = pcli->pfnGetAccountIndexByPos(i);
+ if (ind < 0) continue;
+
+ if (!pcli->pfnGetProtocolVisibility(accs[ind]->szModuleName))
+ continue;
+
+ PD = (ProtocolData*)mir_alloc(sizeof(ProtocolData));
+ PD->RealName = mir_strdup(accs[ind]->szModuleName);
+ PD->protopos = accs[ind]->iOrder;
+
+ SendMessage(pcli->hwndStatus, SB_SETTEXT, partCount++ | flags, (LPARAM)PD);
+ }
+
+ CreateTimerForConnectingIcon(parStatus, (LPARAM)szProto);
+ InvalidateRect(pcli->hwndStatus, NULL, FALSE);
+ return;
+}
diff --git a/plugins/Mwclist/commonheaders.c b/plugins/Mwclist/commonheaders.c
new file mode 100644
index 0000000000..98a5b66473
--- /dev/null
+++ b/plugins/Mwclist/commonheaders.c
@@ -0,0 +1,29 @@
+#include "commonheaders.h"
+
+#define SAFE_PTR(a) a?(IsBadReadPtr(a,1)?a=NULL:a):a
+
+int __cdecl MyStrCmp (const char *a, const char *b)
+{
+ SAFE_PTR(a);
+ SAFE_PTR(b);
+ if (!(a&&b)) return a!=b;
+ return (strcmp(a,b));
+}
+
+DWORD exceptFunction(LPEXCEPTION_POINTERS EP)
+{
+ //printf("1 "); // printed first
+ char buf[4096];
+
+
+ sprintf(buf,"\r\nExceptCode: %x\r\nExceptFlags: %x\r\nExceptAddress: %p\r\n",
+ EP->ExceptionRecord->ExceptionCode,
+ EP->ExceptionRecord->ExceptionFlags,
+ EP->ExceptionRecord->ExceptionAddress
+ );
+ OutputDebugStringA(buf);
+ MessageBoxA(0,buf,"clist_mw Exception",0);
+
+
+ return EXCEPTION_EXECUTE_HANDLER;
+}
diff --git a/plugins/Mwclist/commonheaders.h b/plugins/Mwclist/commonheaders.h
new file mode 100644
index 0000000000..0cf472a6b1
--- /dev/null
+++ b/plugins/Mwclist/commonheaders.h
@@ -0,0 +1,128 @@
+/*
+
+Miranda IM: the free IM client for Microsoft* Windows*
+
+Copyright 2000-2004 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 _COMMON_HEADERS_H_
+#define _COMMON_HEADERS_H_ 1
+
+#define MIRANDA_VER 0x0A00
+
+#define _WIN32_WINNT 0x0501
+#define _WIN32_IE 0x0501
+
+#include "m_stdhdr.h"
+
+#include <windows.h>
+#include <commctrl.h>
+#include <vssym32.h>
+#include <stdio.h>
+#include <time.h>
+#include <stddef.h>
+#include <process.h>
+#include <io.h>
+#include <string.h>
+#include <direct.h>
+#include "resource.h"
+#include <win2k.h>
+
+#include <newpluginapi.h>
+#include <m_system.h>
+#include <m_utils.h>
+#include <m_database.h>
+#include <m_langpack.h>
+#include <m_button.h>
+#include <m_options.h>
+#include <m_protosvc.h>
+#include <m_clc.h>
+#include <m_clist.h>
+#include <m_clistint.h>
+#include <m_skin.h>
+#include <m_contacts.h>
+#include <m_plugins.h>
+#include "m_genmenu.h"
+#include "m_clui.h"
+#include "m_mwclc.h"
+#include "clc.h"
+#include "clist.h"
+#include "m_icolib.h"
+#include <m_userinfo.h>
+#include "CLUIFrames/cluiframes.h"
+#include "m_cluiframes.h"
+#include "m_metacontacts.h"
+#include "BkgrCfg.h"
+#include <m_file.h>
+#include <m_addcontact.h>
+#include "m_fontservice.h"
+
+// shared vars
+extern HINSTANCE g_hInst;
+
+/* most free()'s are invalid when the code is executed from a dll, so this changes
+ all the bad free()'s to good ones, however it's still incorrect code. The reasons for not
+ changing them include:
+
+ * DBFreeVariant has a CallService() lookup
+ * free() is executed in some large loops to do with clist creation of group data
+ * easy search and replace
+
+*/
+
+extern struct LIST_INTERFACE li;
+
+#ifndef CS_DROPSHADOW
+#define CS_DROPSHADOW 0x00020000
+#endif
+
+extern BOOL __cdecl strstri(const char *a, const char *b);
+extern BOOL __cdecl boolstrcmpi(const char *a, const char *b);
+extern int __cdecl MyStrCmp (const char *a, const char *b);
+extern int __cdecl MyStrLen (const char *a);
+extern int __cdecl MyStrCmpi(const char *a, const char *b);
+extern int __cdecl MyStrCmpiT(const TCHAR *a, const TCHAR *b);
+
+extern DWORD exceptFunction(LPEXCEPTION_POINTERS EP);
+
+extern int ( *saveIconFromStatusMode )( const char *szProto,int nStatus, HANDLE hContact);
+
+//from bkg options
+
+// 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
+//
+#define MS_BACKGROUNDCONFIG_REGISTER "BkgrCfg/Register"
+
+//
+// Notification about changed background
+// wParam = ModuleName
+// lParam = 0
+#define ME_BACKGROUNDCONFIG_CHANGED "BkgrCfg/Changed"
+
+
+
+#define EXTRACOLUMNCOUNT 9
+
+
+#endif
diff --git a/plugins/Mwclist/contact.c b/plugins/Mwclist/contact.c
new file mode 100644
index 0000000000..6e602a6624
--- /dev/null
+++ b/plugins/Mwclist/contact.c
@@ -0,0 +1,197 @@
+/*
+
+Miranda IM: the free IM client for Microsoft* Windows*
+
+Copyright 2000-2003 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 "commonheaders.h"
+#include "m_clui.h"
+#include "clist.h"
+
+extern HANDLE hContactIconChangedEvent;
+extern int GetContactCachedStatus(HANDLE hContact);
+extern char *GetContactCachedProtocol(HANDLE hContact);
+
+int sortByStatus;
+static int sortByProto;
+static int sortNoOfflineBottom;
+struct {
+ int status,order;
+} statusModeOrder[]={
+ {ID_STATUS_OFFLINE,500},
+ {ID_STATUS_ONLINE,0},
+ {ID_STATUS_AWAY,200},
+ {ID_STATUS_DND,400},
+ {ID_STATUS_NA,450},
+ {ID_STATUS_OCCUPIED,100},
+ {ID_STATUS_FREECHAT,50},
+ {ID_STATUS_INVISIBLE,20},
+ {ID_STATUS_ONTHEPHONE,150},
+ {ID_STATUS_OUTTOLUNCH,425}};
+
+static int GetContactStatus(HANDLE hContact)
+{
+ /*
+
+ char *szProto;
+
+ szProto=(char*)CallService(MS_PROTO_GETCONTACTBASEPROTO,(WPARAM)hContact,0);
+ if(szProto==NULL) return ID_STATUS_OFFLINE;
+ return DBGetContactSettingWord(hContact,szProto,"Status",ID_STATUS_OFFLINE);
+ */
+ return (GetContactCachedStatus(hContact));
+}
+
+void ChangeContactIcon(HANDLE hContact,int iIcon,int add)
+{
+ //clui MS_CLUI_CONTACTADDED MS_CLUI_CONTACTSETICON this methods is null
+ //CallService(add?MS_CLUI_CONTACTADDED:MS_CLUI_CONTACTSETICON,(WPARAM)hContact,iIcon);
+ NotifyEventHooks(hContactIconChangedEvent,(WPARAM)hContact,iIcon);
+}
+
+static int GetStatusModeOrdering(int statusMode)
+{
+ int i;
+ for(i=0; i< SIZEOF(statusModeOrder); i++)
+ if(statusModeOrder[i].status==statusMode) return statusModeOrder[i].order;
+ return 1000;
+}
+
+void LoadContactTree(void)
+{
+ HANDLE hContact;
+ int i,hideOffline,status,tick;
+ pdisplayNameCacheEntry cacheEntry;
+
+
+
+ tick=GetTickCount();
+ CallService(MS_CLUI_LISTBEGINREBUILD,0,0);
+ for(i=1;;i++) {
+ if((char*)CallService(MS_CLIST_GROUPGETNAME2,i,(LPARAM)(int*)NULL)==NULL) break;
+ CallService(MS_CLUI_GROUPADDED,i,0);
+ }
+
+ hideOffline=DBGetContactSettingByte(NULL,"CList","HideOffline",SETTING_HIDEOFFLINE_DEFAULT);
+ hContact=(HANDLE)CallService(MS_DB_CONTACT_FINDFIRST,0,0);
+
+ while(hContact!=NULL) {
+ cacheEntry=GetContactFullCacheEntry(hContact);
+ if (cacheEntry==NULL)
+ {
+ MessageBoxA(0,"Fail To Get CacheEntry for hContact","!!!!!",0);
+ break;
+ }
+ status=cacheEntry->status;
+ if((!hideOffline || status!=ID_STATUS_OFFLINE) && !cacheEntry->Hidden)
+ ChangeContactIcon(hContact,ExtIconFromStatusMode(hContact,(char*)cacheEntry->szProto,status),1);
+ hContact=(HANDLE)CallService(MS_DB_CONTACT_FINDNEXT,(WPARAM)hContact,0);
+ }
+ sortByStatus=DBGetContactSettingByte(NULL,"CList","SortByStatus",SETTING_SORTBYSTATUS_DEFAULT);
+ sortByProto=DBGetContactSettingByte(NULL,"CList","SortByProto",SETTING_SORTBYPROTO_DEFAULT);
+ sortNoOfflineBottom=DBGetContactSettingByte(NULL,"CList","NoOfflineBottom",SETTING_NOOFFLINEBOTTOM_DEFAULT);
+
+ CallService(MS_CLUI_SORTLIST,0,0);
+ CallService(MS_CLUI_LISTENDREBUILD,0,0);
+
+ tick=GetTickCount()-tick;
+ {
+ char buf[255];
+ //sprintf(buf,"%s %s took %i ms",__FILE__,__LINE__,tick);
+ sprintf(buf,"LoadContactTree %d \r\n",tick);
+
+ OutputDebugStringA(buf);
+ }
+}
+
+#define SAFESTRING(a) a?a:""
+
+int CompareContacts( const struct ClcContact *contact1, const struct ClcContact *contact2 )
+{
+ HANDLE a = contact1->hContact, b = contact2->hContact;
+ TCHAR *namea,*nameb;
+ int statusa,statusb;
+ char *szProto1,*szProto2;
+ int rc;
+
+ GetContactInfosForSort(a,&szProto1,&namea,&statusa);
+ GetContactInfosForSort(b,&szProto2,&nameb,&statusb);
+
+ if (sortByProto) {
+
+ /* deal with statuses, online contacts have to go above offline */
+ if (sortNoOfflineBottom==0)
+ if((statusa==ID_STATUS_OFFLINE)!=(statusb==ID_STATUS_OFFLINE)) {
+ return 2*(statusa==ID_STATUS_OFFLINE)-1;
+ }
+ /* both are online, now check protocols */
+ rc=strcmp(SAFESTRING(szProto1),SAFESTRING(szProto2)); /* strcmp() doesn't like NULL so feed in "" as needed */
+ if (rc != 0 && (szProto1 != NULL && szProto2 != NULL)) return rc;
+ /* protocols are the same, order by display name */
+ }
+
+ if(sortByStatus) {
+ int ordera,orderb;
+ ordera=GetStatusModeOrdering(statusa);
+ orderb=GetStatusModeOrdering(statusb);
+ if(ordera!=orderb) return ordera-orderb;
+ }
+ else {
+ //one is offline: offline goes below online
+ if (sortNoOfflineBottom==0)
+ {
+ if((statusa==ID_STATUS_OFFLINE)!=(statusb==ID_STATUS_OFFLINE)) {
+ return 2*(statusa==ID_STATUS_OFFLINE)-1;
+ }
+ }
+ }
+
+ //otherwise just compare names
+ return _tcsicmp(namea,nameb);
+}
+
+#undef SAFESTRING
+
+static UINT_PTR resortTimerId=0;
+static VOID CALLBACK SortContactsTimer(HWND hwnd,UINT message,UINT_PTR idEvent,DWORD dwTime)
+{
+ KillTimer(NULL,resortTimerId);
+ resortTimerId=0;
+ CallService(MS_CLUI_SORTLIST,0,0);
+}
+
+void SortContacts(void)
+{
+ //avoid doing lots of resorts in quick succession
+ sortByStatus=DBGetContactSettingByte(NULL,"CList","SortByStatus",SETTING_SORTBYSTATUS_DEFAULT);
+ sortByProto=DBGetContactSettingByte(NULL,"CList","SortByProto",SETTING_SORTBYPROTO_DEFAULT);
+ if(resortTimerId) KillTimer(NULL,resortTimerId);
+ resortTimerId=SetTimer(NULL,0,50,SortContactsTimer);
+}
+
+INT_PTR ContactChangeGroup(WPARAM wParam,LPARAM lParam)
+{
+ CallService(MS_CLUI_CONTACTDELETED,wParam,0);
+ if((HANDLE)lParam==NULL)
+ DBDeleteContactSetting((HANDLE)wParam,"CList","Group");
+ else
+ DBWriteContactSettingString((HANDLE)wParam,"CList","Group",(char*)CallService(MS_CLIST_GROUPGETNAME2,lParam,(LPARAM)(int*)NULL));
+ CallService(MS_CLUI_CONTACTADDED,wParam,ExtIconFromStatusMode((HANDLE)wParam,(char*)CallService(MS_PROTO_GETCONTACTBASEPROTO,wParam,0),GetContactStatus((HANDLE)wParam)));
+ return 0;
+}
diff --git a/plugins/Mwclist/groupmenu.c b/plugins/Mwclist/groupmenu.c
new file mode 100644
index 0000000000..ae79c6ca60
--- /dev/null
+++ b/plugins/Mwclist/groupmenu.c
@@ -0,0 +1,751 @@
+/*
+
+Miranda IM: the free IM client for Microsoft* Windows*
+
+Copyright 2000-2003 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 "commonheaders.h"
+#include "m_clui.h"
+#include "clist.h"
+#include "clc.h"
+
+//////////////////////////////Group MENU/////////////////////////
+HANDLE hGroupMenuObject;
+
+HANDLE hGroupMainMenuItemProxy;
+HANDLE hHideShowMainMenuItem;
+HANDLE hGroupStatusMenuItemProxy;
+HANDLE hPreBuildGroupMenuEvent;
+
+HANDLE hHideOfflineUsersMenuItem;
+HANDLE hHideOfflineUsersOutHereMenuItem;
+HANDLE hHideEmptyGroupsMenuItem;
+HANDLE hDisableGroupsMenuItem;
+HANDLE hNewGroupMenuItem;
+HANDLE hNewSubGroupMenuItem;
+
+int NewGroupIconidx;
+
+extern HIMAGELIST hCListImages;
+extern HICON LoadIconFromExternalFile (char *filename,int i,boolean UseLibrary,boolean registerit,char *IconName,char *SectName,char *Description,int internalidx,HICON DefIcon);
+
+void InitSubGroupMenus(void);
+
+//Groupmenu exec param(ownerdata)
+typedef struct{
+char *szServiceName;
+int Param1,Param2;
+}GroupMenuExecParam,*lpGroupMenuExecParam;
+
+/*
+wparam=handle to the menu item returned by MS_CLIST_ADDCONTACTMENUITEM
+return 0 on success.
+*/
+static INT_PTR RemoveGroupMenuItem(WPARAM wParam,LPARAM lParam)
+{
+ CallService(MO_REMOVEMENUITEM,wParam,0);
+ return 0;
+}
+
+
+static INT_PTR BuildGroupMenu(WPARAM wParam,LPARAM lParam)
+{
+ int tick;
+ HMENU hMenu;
+ ListParam param = { 0 };
+ param.MenuObjectHandle=hGroupMenuObject;
+
+ //hMenu=hMainMenu;
+ hMenu=CreatePopupMenu();
+ //hMenu=wParam;
+ tick=GetTickCount();
+
+ NotifyEventHooks(hPreBuildGroupMenuEvent,0,0);
+
+ CallService(MO_BUILDMENU,(WPARAM)hMenu,(LPARAM)&param);
+ //DrawMenuBar((HWND)CallService("CLUI/GetHwnd",0,0));
+ tick=GetTickCount()-tick;
+ return (INT_PTR)hMenu;
+}
+
+static INT_PTR AddGroupMenuItem(WPARAM wParam,LPARAM lParam)
+{
+ CLISTMENUITEM *mi=(CLISTMENUITEM*)lParam;
+ lpGroupMenuParam gmp=(lpGroupMenuParam)wParam;
+ char buf[1024];
+
+ TMO_MenuItem tmi;
+ OptParam op;
+
+ if(mi->cbSize!=sizeof(CLISTMENUITEM)) return 0;
+
+ memset(&tmi,0,sizeof(tmi));
+ tmi.cbSize=sizeof(tmi);
+ tmi.flags=mi->flags;
+ tmi.hIcon=mi->hIcon;
+ tmi.hotKey=mi->hotKey;
+ tmi.pszName=mi->pszName;
+ tmi.position=mi->position;
+
+ //pszPopupName for new system mean root level
+ //pszPopupName for old system mean that exists popup
+ tmi.root = mi->hParentMenu;
+
+ tmi.ownerdata=NULL;
+
+ {
+ lpGroupMenuExecParam mmep;
+ mmep=(lpGroupMenuExecParam)mir_calloc(sizeof(GroupMenuExecParam));
+ if(mmep==NULL){return(0);}
+
+ //we need just one parametr.
+ mmep->szServiceName=mir_strdup(mi->pszService);
+ mmep->Param1=mi->popupPosition;
+ if (gmp!=NULL)
+ {
+ mmep->Param1=gmp->wParam;
+ mmep->Param2=gmp->lParam;
+
+ }
+
+
+ tmi.ownerdata=mmep;
+ }
+ op.Handle=(HANDLE)CallService(MO_ADDNEWMENUITEM,(WPARAM)hGroupMenuObject,(LPARAM)&tmi);
+ op.Setting=OPT_MENUITEMSETUNIQNAME;
+ sprintf(buf,"%s/%s",mi->pszService,mi->pszName);
+ op.Value=(INT_PTR)buf;
+ CallService(MO_SETOPTIONSMENUITEM,(WPARAM)0,(LPARAM)&op);
+ return (INT_PTR)op.Handle;
+
+// mainItemCount++;
+// return MENU_CUSTOMITEMMAIN|(mainMenuItem[mainItemCount-1].id);
+}
+
+INT_PTR GroupMenuCheckService(WPARAM wParam,LPARAM lParam) {
+//not used
+ return(0);
+}
+
+INT_PTR GroupMenuonAddService(WPARAM wParam,LPARAM lParam) {
+
+ MENUITEMINFO *mii=(MENUITEMINFO* )wParam;
+ if (mii==NULL) return 0;
+
+ if (hHideShowMainMenuItem==(HANDLE)lParam)
+ {
+ mii->fMask|=MIIM_STATE;
+ mii->fState|=MFS_DEFAULT;
+
+ }
+ if (hGroupMainMenuItemProxy==(HANDLE)lParam)
+ {
+ mii->fMask|=MIIM_SUBMENU;
+ //mi.fType=MFT_STRING;
+ mii->hSubMenu=(HMENU)CallService(MS_CLIST_MENUGETMAIN,0,0);
+ }
+
+ if (hGroupStatusMenuItemProxy==(HANDLE)lParam)
+ {
+ mii->fMask|=MIIM_SUBMENU;
+ //mi.fType=MFT_STRING;
+ mii->hSubMenu=(HMENU)CallService(MS_CLIST_MENUGETSTATUS,0,0);
+ }
+
+ return(TRUE);
+}
+
+
+//called with:
+//wparam - ownerdata
+//lparam - lparam from winproc
+INT_PTR GroupMenuExecService(WPARAM wParam,LPARAM lParam) {
+ if (wParam!=0)
+ {
+ lpGroupMenuExecParam mmep=(lpGroupMenuExecParam)wParam;
+ if (!strcmp(mmep->szServiceName,"Help/AboutCommand"))
+ {
+ //bug in help.c,it used wparam as parent window handle without reason.
+ mmep->Param1=0;
+ CallService(mmep->szServiceName,mmep->Param1,lParam);
+ }else
+ {
+ CallService(mmep->szServiceName,mmep->Param1,mmep->Param2);
+ }
+
+ }
+ return(1);
+}
+INT_PTR FreeOwnerDataGroupMenu (WPARAM wParam,LPARAM lParam)
+{
+
+ lpGroupMenuExecParam mmep;
+ mmep=(lpGroupMenuExecParam)lParam;
+ if (mmep!=NULL){
+ FreeAndNil(&mmep->szServiceName);
+ FreeAndNil(&mmep);
+ }
+
+return(0);
+}
+
+INT_PTR HideGroupsHelper(WPARAM wParam,LPARAM lParam)
+{
+ int newVal=!(GetWindowLong(pcli->hwndContactTree,GWL_STYLE)&CLS_HIDEEMPTYGROUPS);
+ DBWriteContactSettingByte(NULL,"CList","HideEmptyGroups",(BYTE)newVal);
+ SendMessage(pcli->hwndContactTree,CLM_SETHIDEEMPTYGROUPS,newVal,0);
+ return 0;
+}
+
+INT_PTR UseGroupsHelper(WPARAM wParam,LPARAM lParam)
+{
+ int newVal=!(GetWindowLong(pcli->hwndContactTree,GWL_STYLE)&CLS_USEGROUPS);
+ DBWriteContactSettingByte(NULL,"CList","UseGroups",(BYTE)newVal);
+ SendMessage(pcli->hwndContactTree,CLM_SETUSEGROUPS,newVal,0);
+ return 0;
+}
+
+INT_PTR HideOfflineRootHelper(WPARAM wParam,LPARAM lParam)
+{
+SendMessage(
+ pcli->hwndContactTree,
+ CLM_SETHIDEOFFLINEROOT,
+ !SendMessage(pcli->hwndContactTree,CLM_GETHIDEOFFLINEROOT,0,0),
+ 0);
+ return 0;
+}
+
+static int OnBuildGroupMenu(WPARAM wParam,LPARAM lParam)
+{
+ CLISTMENUITEM mi;
+
+
+ ZeroMemory(&mi,sizeof(mi));
+ mi.cbSize = sizeof(mi);
+ mi.flags = CMIM_FLAGS | (DBGetContactSettingByte(NULL,"CList","HideOffline",SETTING_HIDEOFFLINE_DEFAULT)?CMIF_CHECKED:0);
+ CallService(MS_CLIST_MODIFYMENUITEM, (WPARAM)hHideOfflineUsersMenuItem, (LPARAM)&mi);
+
+ ZeroMemory(&mi,sizeof(mi));
+ mi.cbSize = sizeof(mi);
+ mi.flags = CMIM_FLAGS | (SendMessage(pcli->hwndContactTree,CLM_GETHIDEOFFLINEROOT,0,0)?CMIF_CHECKED:0);
+ CallService(MS_CLIST_MODIFYMENUITEM, (WPARAM)hHideOfflineUsersOutHereMenuItem, (LPARAM)&mi);
+
+ ZeroMemory(&mi,sizeof(mi));
+ mi.cbSize = sizeof(mi);
+ mi.flags = CMIM_FLAGS | (GetWindowLong(pcli->hwndContactTree,GWL_STYLE)&CLS_HIDEEMPTYGROUPS?CMIF_CHECKED:0);
+ CallService(MS_CLIST_MODIFYMENUITEM, (WPARAM)hHideEmptyGroupsMenuItem, (LPARAM)&mi);
+
+ ZeroMemory(&mi,sizeof(mi));
+ mi.cbSize = sizeof(mi);
+ mi.flags = CMIM_FLAGS | (GetWindowLong(pcli->hwndContactTree,GWL_STYLE)&CLS_USEGROUPS?0:CMIF_CHECKED);
+ CallService(MS_CLIST_MODIFYMENUITEM, (WPARAM)hDisableGroupsMenuItem, (LPARAM)&mi);
+
+ return 0;
+}
+
+int static OnIconLibIconChanged(WPARAM wParam,LPARAM lParam)
+{
+ HICON hicon;
+ CLISTMENUITEM clmi={0};
+
+ hicon=LoadIconFromExternalFile("clisticons.dll",2,TRUE,FALSE,"NewGroup","Contact List","New Group",-IDI_NEWGROUP,0);
+ NewGroupIconidx=ImageList_ReplaceIcon(hCListImages,NewGroupIconidx,hicon);
+
+ clmi.cbSize=sizeof(clmi);
+ clmi.flags=CMIM_ICON;
+ clmi.hIcon=ImageList_GetIcon(hCListImages,NewGroupIconidx,0);
+ CallService(MS_CLIST_MODIFYMENUITEM,(WPARAM)hNewSubGroupMenuItem,(LPARAM)&clmi);
+ CallService(MS_CLIST_MODIFYMENUITEM,(WPARAM)hNewGroupMenuItem,(LPARAM)&clmi);
+ return 0;
+}
+
+void InitGroupMenus(void)
+{
+ TMenuParam tmp;
+ OptParam op;
+ HICON hicon;
+ hicon=LoadIconFromExternalFile("clisticons.dll",2,TRUE,TRUE,"NewGroup","Contact List","New Group",-IDI_NEWGROUP2,0);
+ NewGroupIconidx=ImageList_AddIcon(hCListImages,hicon );
+
+ CreateServiceFunction("CLISTMENUSGroup/ExecService",GroupMenuExecService);
+ CreateServiceFunction("CLISTMENUSGroup/FreeOwnerDataGroupMenu",FreeOwnerDataGroupMenu);
+ CreateServiceFunction("CLISTMENUSGroup/GroupMenuonAddService",GroupMenuonAddService);
+ CreateServiceFunction("CLISTMENUSGroup/HideGroupsHelper",HideGroupsHelper);
+ CreateServiceFunction("CLISTMENUSGroup/UseGroupsHelper",UseGroupsHelper);
+ CreateServiceFunction("CLISTMENUSGroup/HideOfflineRootHelper",HideOfflineRootHelper);
+
+ CreateServiceFunction(MS_CLIST_ADDGROUPMENUITEM,AddGroupMenuItem);
+ CreateServiceFunction(MS_CLIST_REMOVEGROUPMENUITEM,RemoveGroupMenuItem);
+ CreateServiceFunction(MS_CLIST_MENUBUILDGROUP,BuildGroupMenu);
+ hPreBuildGroupMenuEvent=CreateHookableEvent(ME_CLIST_PREBUILDGROUPMENU);
+ HookEvent(ME_CLIST_PREBUILDGROUPMENU,OnBuildGroupMenu);
+
+ InitSubGroupMenus();
+
+ //Group menu
+ memset(&tmp,0,sizeof(tmp));
+ tmp.cbSize=sizeof(tmp);
+ tmp.CheckService=NULL;
+ tmp.ExecService="CLISTMENUSGroup/ExecService";
+ tmp.name="Group Menu";
+ hGroupMenuObject=(HANDLE)CallService(MO_CREATENEWMENUOBJECT,(WPARAM)0,(LPARAM)&tmp);
+
+
+ op.Handle=hGroupMenuObject;
+ op.Setting=OPT_USERDEFINEDITEMS;
+ op.Value=TRUE;
+ CallService(MO_SETOPTIONSMENUOBJECT,(WPARAM)0,(LPARAM)&op);
+
+ op.Handle=hGroupMenuObject;
+ op.Setting=OPT_MENUOBJECT_SET_FREE_SERVICE;
+ op.Value=(INT_PTR)"CLISTMENUSGroup/FreeOwnerDataGroupMenu";
+ CallService(MO_SETOPTIONSMENUOBJECT,(WPARAM)0,(LPARAM)&op);
+
+ op.Handle=hGroupMenuObject;
+ op.Setting=OPT_MENUOBJECT_SET_ONADD_SERVICE;
+ op.Value=(INT_PTR)"CLISTMENUSGroup/GroupMenuonAddService";
+ CallService(MO_SETOPTIONSMENUOBJECT,(WPARAM)0,(LPARAM)&op);
+
+ {
+ //add exit command to menu
+ CLISTMENUITEM mi;
+ GroupMenuParam gmp;
+
+ memset(&mi,0,sizeof(mi));
+ mi.cbSize=sizeof(mi);
+ mi.position=1900000;
+ mi.pszService="CloseAction";
+ mi.pszName=LPGEN("E&xit");
+ AddGroupMenuItem((WPARAM)0,(LPARAM)&mi);
+
+ memset(&mi,0,sizeof(mi));
+ mi.cbSize=sizeof(mi);
+ mi.position=500;
+ mi.pszService=MS_CLIST_SHOWHIDE;
+ mi.pszName=LPGEN("&Hide/Show");
+ hHideShowMainMenuItem=(HANDLE)AddGroupMenuItem((WPARAM)0,(LPARAM)&mi);
+
+ memset(&mi,0,sizeof(mi));
+ mi.cbSize=sizeof(mi);
+ mi.position=200000;
+ mi.hIcon=LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_FINDUSER));
+ mi.pszService="FindAdd/FindAddCommand";
+ mi.pszName=LPGEN("&Find/Add Contacts...");
+ AddGroupMenuItem((WPARAM)0,(LPARAM)&mi);
+
+
+
+ memset(&mi,0,sizeof(mi));
+ mi.cbSize=sizeof(mi);
+ mi.position=300000;
+ mi.pszService="";
+ mi.pszName=LPGEN("&Main Menu");
+ hGroupMainMenuItemProxy=(HANDLE)AddGroupMenuItem((WPARAM)0,(LPARAM)&mi);
+
+ memset(&mi,0,sizeof(mi));
+ mi.cbSize=sizeof(mi);
+ mi.position=300100;
+ mi.pszService="";
+ mi.pszName=LPGEN("&Status");
+ hGroupStatusMenuItemProxy=(HANDLE)AddGroupMenuItem((WPARAM)0,(LPARAM)&mi);
+
+ memset(&mi,0,sizeof(mi));
+ mi.cbSize=sizeof(mi);
+ mi.position=400000;
+ mi.hIcon=LoadIcon(GetModuleHandle(NULL),MAKEINTRESOURCE(IDI_OPTIONS));
+ mi.pszService="Options/OptionsCommand";
+ mi.pszName=LPGEN("&Options...");
+
+ AddGroupMenuItem((WPARAM)0,(LPARAM)&mi);
+
+
+ memset(&mi,0,sizeof(mi));
+ mi.cbSize=sizeof(mi);
+ mi.position=500000;
+ mi.hIcon=LoadIcon(GetModuleHandle(NULL),MAKEINTRESOURCE(IDI_CLIENTMIRANDA));
+ mi.pszService="Help/AboutCommand";
+ mi.pszName=LPGEN("&About");
+
+ //AddGroupMenuItem((WPARAM)0,(LPARAM)&mi);
+
+ memset(&mi,0,sizeof(mi));
+ mi.cbSize=sizeof(mi);
+ mi.position=100000;
+ mi.hIcon=ImageList_GetIcon(hCListImages,NewGroupIconidx,0);
+ mi.pszService=MS_CLIST_GROUPCREATE;
+ mi.pszName=LPGEN("&New Group");
+ hNewGroupMenuItem=(HANDLE)AddGroupMenuItem((WPARAM)0,(LPARAM)&mi);
+
+ memset(&mi,0,sizeof(mi));
+ mi.cbSize=sizeof(mi);
+ mi.position=100001;
+ mi.hIcon=NULL;
+ mi.pszService=MS_CLIST_SETHIDEOFFLINE;
+ mi.pszName=LPGEN("&Hide Offline Users");
+ gmp.lParam=0;gmp.wParam=-1;
+ hHideOfflineUsersMenuItem=(HANDLE)AddGroupMenuItem((WPARAM)&gmp,(LPARAM)&mi);
+
+ memset(&mi,0,sizeof(mi));
+ mi.cbSize=sizeof(mi);
+ mi.position=100002;
+ mi.hIcon=NULL;
+ mi.pszService="CLISTMENUSGroup/HideOfflineRootHelper";
+ mi.pszName=LPGEN("Hide &Offline Users out here");
+ hHideOfflineUsersOutHereMenuItem=(HANDLE)AddGroupMenuItem((WPARAM)0,(LPARAM)&mi);
+
+
+ memset(&mi,0,sizeof(mi));
+ mi.cbSize=sizeof(mi);
+ mi.position=100003;
+ mi.hIcon=NULL;
+ mi.pszService="CLISTMENUSGroup/HideGroupsHelper";
+ mi.pszName=LPGEN("Hide &Empty Groups");
+ hHideEmptyGroupsMenuItem=(HANDLE)AddGroupMenuItem((WPARAM)0,(LPARAM)&mi);
+
+
+
+ memset(&mi,0,sizeof(mi));
+ mi.cbSize=sizeof(mi);
+ mi.position=100004;
+ mi.hIcon=NULL;
+ mi.pszService="CLISTMENUSGroup/UseGroupsHelper";
+ mi.pszName=LPGEN("Disable &Groups");
+ hDisableGroupsMenuItem=(HANDLE)AddGroupMenuItem((WPARAM)0,(LPARAM)&mi);
+
+
+ HookEvent(ME_SKIN2_ICONSCHANGED,OnIconLibIconChanged);
+
+ //MS_CLIST_GROUPCREATE
+
+ }
+}
+
+//////////////////////////////END Group MENU/////////////////////////
+
+
+
+
+//////////////////////////////SubGroup MENU/////////////////////////
+HANDLE hSubGroupMenuObject;
+
+HANDLE hSubGroupMainMenuItemProxy;
+HANDLE hHideShowMainMenuItem;
+HANDLE hSubGroupStatusMenuItemProxy;
+HANDLE hPreBuildSubGroupMenuEvent;
+HANDLE hHideOfflineUsersHereMenuItem;
+
+//SubGroupmenu exec param(ownerdata)
+typedef struct{
+char *szServiceName;
+int Param1,Param2;
+}SubGroupMenuExecParam,*lpSubGroupMenuExecParam;
+
+/*
+wparam=handle to the menu item returned by MS_CLIST_ADDCONTACTMENUITEM
+return 0 on success.
+*/
+static INT_PTR RemoveSubGroupMenuItem(WPARAM wParam,LPARAM lParam)
+{
+ CallService(MO_REMOVEMENUITEM,wParam,0);
+ return 0;
+}
+
+static int OnBuildSubGroupMenu(WPARAM wParam,LPARAM lParam)
+{
+ CLISTMENUITEM mi;
+ struct ClcGroup *group=(struct ClcGroup *)wParam;
+ if (wParam==0) return 0;
+
+
+ //contact->group
+
+
+
+ ZeroMemory(&mi,sizeof(mi));
+ mi.cbSize = sizeof(mi);
+ mi.flags = CMIM_FLAGS | (group->hideOffline?CMIF_CHECKED:0);
+ CallService(MS_CLIST_MODIFYMENUITEM, (WPARAM)hHideOfflineUsersHereMenuItem, (LPARAM)&mi);
+
+ return 0;
+}
+static INT_PTR BuildSubGroupMenu(WPARAM wParam,LPARAM lParam)
+{
+ int tick;
+ HMENU hMenu;
+ ListParam param = { 0 };
+ param.MenuObjectHandle=hSubGroupMenuObject;
+ param.wParam=wParam;
+
+ //hMenu=hMainMenu;
+ hMenu=CreatePopupMenu();
+ //hMenu=wParam;
+ tick=GetTickCount();
+
+ NotifyEventHooks(hPreBuildSubGroupMenuEvent,wParam,0);
+
+ CallService(MO_BUILDMENU,(WPARAM)hMenu,(LPARAM)&param);
+ //DrawMenuBar((HWND)CallService("CLUI/GetHwnd",0,0));
+ tick=GetTickCount()-tick;
+ return (INT_PTR)hMenu;
+}
+
+static INT_PTR AddSubGroupMenuItem(WPARAM wParam,LPARAM lParam)
+{
+ CLISTMENUITEM *mi=(CLISTMENUITEM*)lParam;
+ lpGroupMenuParam gmp=(lpGroupMenuParam)wParam;
+ char buf[1024];
+ TMO_MenuItem tmi;
+ OptParam op;
+
+ if(mi->cbSize!=sizeof(CLISTMENUITEM)) return 0;
+ memset(&tmi,0,sizeof(tmi));
+ tmi.cbSize=sizeof(tmi);
+ tmi.flags=mi->flags;
+ tmi.hIcon=mi->hIcon;
+ tmi.hotKey=mi->hotKey;
+ tmi.pszName=mi->pszName;
+ tmi.position=mi->position;
+
+ //pszPopupName for new system mean root level
+ //pszPopupName for old system mean that exists popup
+ tmi.root = mi->hParentMenu;
+
+ tmi.ownerdata=NULL;
+
+ { lpSubGroupMenuExecParam mmep = (lpSubGroupMenuExecParam)mir_calloc(sizeof(SubGroupMenuExecParam));
+ if ( mmep == NULL)
+ return 0;
+
+ //we need just one parametr.
+ mmep->szServiceName=mir_strdup(mi->pszService);
+ mmep->Param1=mi->popupPosition;
+ if ( gmp != NULL ) {
+ mmep->Param1 = gmp->wParam;
+ mmep->Param2 = gmp->lParam;
+ }
+
+ tmi.ownerdata=mmep;
+ }
+ op.Handle=(HANDLE)CallService(MO_ADDNEWMENUITEM,(WPARAM)hSubGroupMenuObject,(LPARAM)&tmi);
+ op.Setting=OPT_MENUITEMSETUNIQNAME;
+ sprintf(buf,"%s/%s",mi->pszService,mi->pszName);
+ op.Value=(INT_PTR)buf;
+ CallService(MO_SETOPTIONSMENUITEM,(WPARAM)0,(LPARAM)&op);
+ return (INT_PTR)op.Handle;
+
+// mainItemCount++;
+// return MENU_CUSTOMITEMMAIN|(mainMenuItem[mainItemCount-1].id);
+}
+
+INT_PTR SubGroupMenuCheckService(WPARAM wParam,LPARAM lParam) {
+//not used
+ return(0);
+}
+
+INT_PTR SubGroupMenuonAddService(WPARAM wParam,LPARAM lParam) {
+
+ MENUITEMINFO *mii=(MENUITEMINFO* )wParam;
+
+ if (mii==NULL) return 0;
+
+/*
+ if (hHideShowMainMenuItem==(HANDLE)lParam)
+ {
+ mii->fMask|=MIIM_STATE;
+ mii->fState|=MFS_DEFAULT;
+
+ }
+ if (hSubGroupMainMenuItemProxy==(HANDLE)lParam)
+ {
+ mii->fMask|=MIIM_SUBMENU;
+ //mi.fType=MFT_STRING;
+ mii->hSubMenu=(HMENU)CallService(MS_CLIST_MENUGETMAIN,0,0);
+ }
+
+ if (hSubGroupStatusMenuItemProxy==(HANDLE)lParam)
+ {
+ mii->fMask|=MIIM_SUBMENU;
+ //mi.fType=MFT_STRING;
+ mii->hSubMenu=(HMENU)CallService(MS_CLIST_MENUGETSTATUS,0,0);
+ }
+*/
+ return(TRUE);
+}
+
+
+//called with:
+//wparam - ownerdata
+//lparam - lparam from winproc
+INT_PTR SubGroupMenuExecService(WPARAM wParam,LPARAM lParam) {
+ if (wParam!=0)
+ {
+ lpSubGroupMenuExecParam mmep=(lpSubGroupMenuExecParam)wParam;
+ if (!strcmp(mmep->szServiceName,"Help/AboutCommand"))
+ {
+ //bug in help.c,it used wparam as parent window handle without reason.
+ mmep->Param1=0;
+ CallService(mmep->szServiceName,mmep->Param1,lParam);
+ }else
+ {
+ CallService(mmep->szServiceName,mmep->Param1,mmep->Param2);
+ }
+
+ }
+ return(1);
+}
+INT_PTR FreeOwnerDataSubGroupMenu (WPARAM wParam,LPARAM lParam)
+{
+
+ lpSubGroupMenuExecParam mmep;
+ mmep=(lpSubGroupMenuExecParam)lParam;
+ if (mmep!=NULL){
+ FreeAndNil(&mmep->szServiceName);
+ FreeAndNil(&mmep);
+ }
+
+return(0);
+}
+/*
+int HideSubGroupsHelper(WPARAM wParam,LPARAM lParam)
+{
+ int newVal=!(GetWindowLong(pcli->hwndContactTree,GWL_STYLE)&CLS_HIDEEMPTYSubGroupS);
+ DBWriteContactSettingByte(NULL,"CList","HideEmptySubGroups",(BYTE)newVal);
+ SendMessage(pcli->hwndContactTree,CLM_SETHIDEEMPTYSubGroupS,newVal,0);
+ return 0;
+}
+
+int UseSubGroupsHelper(WPARAM wParam,LPARAM lParam)
+{
+ int newVal=!(GetWindowLong(pcli->hwndContactTree,GWL_STYLE)&CLS_USESubGroupS);
+ DBWriteContactSettingByte(NULL,"CList","UseSubGroups",(BYTE)newVal);
+ SendMessage(pcli->hwndContactTree,CLM_SETUSESubGroupS,newVal,0);
+ return 0;
+}
+
+int HideOfflineRootHelper(WPARAM wParam,LPARAM lParam)
+{
+SendMessage(
+ pcli->hwndContactTree,
+ CLM_SETHIDEOFFLINEROOT,
+ !SendMessage(pcli->hwndContactTree,CLM_GETHIDEOFFLINEROOT,0,0),
+ 0);
+ return 0;
+}
+*/
+//wparam menu handle to pass to clc.c
+INT_PTR GroupMenuExecProxy(WPARAM wParam,LPARAM lParam)
+{
+ SendMessage(pcli->hwndContactTree,WM_COMMAND,wParam,0);
+ return 0;
+}
+
+void InitSubGroupMenus(void)
+{
+ TMenuParam tmp;
+ OptParam op;
+
+ CreateServiceFunction("CLISTMENUSSubGroup/ExecService",SubGroupMenuExecService);
+ CreateServiceFunction("CLISTMENUSSubGroup/FreeOwnerDataSubGroupMenu",FreeOwnerDataSubGroupMenu);
+ CreateServiceFunction("CLISTMENUSSubGroup/SubGroupMenuonAddService",SubGroupMenuonAddService);
+ CreateServiceFunction("CLISTMENUSSubGroup/GroupMenuExecProxy",GroupMenuExecProxy);
+
+ //CreateServiceFunction("CLISTMENUSSubGroup/HideSubGroupsHelper",HideSubGroupsHelper);
+ //CreateServiceFunction("CLISTMENUSSubGroup/UseSubGroupsHelper",UseSubGroupsHelper);
+ //CreateServiceFunction("CLISTMENUSSubGroup/HideOfflineRootHelper",HideOfflineRootHelper);
+
+ CreateServiceFunction(MS_CLIST_ADDSUBGROUPMENUITEM,AddSubGroupMenuItem);
+ CreateServiceFunction(MS_CLIST_REMOVESUBGROUPMENUITEM,RemoveSubGroupMenuItem);
+ CreateServiceFunction(MS_CLIST_MENUBUILDSUBGROUP,BuildSubGroupMenu);
+ hPreBuildSubGroupMenuEvent=CreateHookableEvent(ME_CLIST_PREBUILDSUBGROUPMENU);
+ HookEvent(ME_CLIST_PREBUILDSUBGROUPMENU,OnBuildSubGroupMenu);
+
+
+ //SubGroup menu
+ memset(&tmp,0,sizeof(tmp));
+ tmp.cbSize=sizeof(tmp);
+ tmp.CheckService=NULL;
+ tmp.ExecService="CLISTMENUSSubGroup/ExecService";
+ tmp.name="SubGroupMenu";
+ hSubGroupMenuObject=(HANDLE)CallService(MO_CREATENEWMENUOBJECT,(WPARAM)0,(LPARAM)&tmp);
+
+
+ op.Handle=hSubGroupMenuObject;
+ op.Setting=OPT_USERDEFINEDITEMS;
+ op.Value=TRUE;
+ CallService(MO_SETOPTIONSMENUOBJECT,(WPARAM)0,(LPARAM)&op);
+
+ op.Handle=hSubGroupMenuObject;
+ op.Setting=OPT_MENUOBJECT_SET_FREE_SERVICE;
+ op.Value=(INT_PTR)"CLISTMENUSSubGroup/FreeOwnerDataSubGroupMenu";
+ CallService(MO_SETOPTIONSMENUOBJECT,(WPARAM)0,(LPARAM)&op);
+
+ op.Handle=hSubGroupMenuObject;
+ op.Setting=OPT_MENUOBJECT_SET_ONADD_SERVICE;
+ op.Value=(INT_PTR)"CLISTMENUSSubGroup/SubGroupMenuonAddService";
+ CallService(MO_SETOPTIONSMENUOBJECT,(WPARAM)0,(LPARAM)&op);
+
+ {
+ //add exit command to menu
+ CLISTMENUITEM mi;
+ GroupMenuParam gmp;
+
+ memset(&mi,0,sizeof(mi));
+ mi.cbSize=sizeof(mi);
+ mi.position=1000;
+ mi.hIcon=ImageList_GetIcon(hCListImages,NewGroupIconidx,0);
+ mi.pszService="CLISTMENUSSubGroup/GroupMenuExecProxy";
+ mi.pszName=LPGEN("&New SubGroup");
+ gmp.lParam=0;gmp.wParam=POPUP_NEWSUBGROUP;
+ hNewSubGroupMenuItem=(HANDLE)AddSubGroupMenuItem((WPARAM)&gmp,(LPARAM)&mi);
+
+ memset(&mi,0,sizeof(mi));
+ mi.cbSize=sizeof(mi);
+ mi.position=1001;
+ mi.hIcon=NULL;
+ mi.pszService="CLISTMENUSSubGroup/GroupMenuExecProxy";
+ mi.pszName=LPGEN("&Hide Offline Users in here");
+ gmp.lParam=0;gmp.wParam=POPUP_GROUPHIDEOFFLINE;
+ hHideOfflineUsersHereMenuItem=(HANDLE)AddSubGroupMenuItem((WPARAM)&gmp,(LPARAM)&mi);
+
+ memset(&mi,0,sizeof(mi));
+ mi.cbSize=sizeof(mi);
+ mi.position=900001;
+ mi.flags = CMIF_ICONFROMICOLIB;
+ mi.icolibItem=LoadSkinnedIconHandle(SKINICON_OTHER_RENAME); //LoadIcon(GetModuleHandle(NULL),MAKEINTRESOURCE(IDI_RENAME));
+ mi.pszService="CLISTMENUSSubGroup/GroupMenuExecProxy";
+ mi.pszName=LPGEN("&Rename Group");
+ gmp.lParam=0;gmp.wParam=POPUP_RENAMEGROUP;
+ AddSubGroupMenuItem((WPARAM)&gmp,(LPARAM)&mi);
+
+ memset(&mi,0,sizeof(mi));
+ mi.cbSize=sizeof(mi);
+ mi.position=900002;
+ mi.flags = CMIF_ICONFROMICOLIB;
+ mi.icolibItem=LoadSkinnedIconHandle(SKINICON_OTHER_DELETE); //LoadIcon(GetModuleHandle(NULL),MAKEINTRESOURCE(IDI_DELETE));
+ mi.pszService="CLISTMENUSSubGroup/GroupMenuExecProxy";
+ mi.pszName=LPGEN("&Delete Group");
+ gmp.lParam=0;gmp.wParam=POPUP_DELETEGROUP;
+ AddSubGroupMenuItem((WPARAM)&gmp,(LPARAM)&mi);
+
+ //MS_CLIST_SubGroupCREATE
+
+ }
+}
+
+//////////////////////////////END SubGroup MENU/////////////////////////
diff --git a/plugins/Mwclist/init.c b/plugins/Mwclist/init.c
new file mode 100644
index 0000000000..6d5810c561
--- /dev/null
+++ b/plugins/Mwclist/init.c
@@ -0,0 +1,266 @@
+/*
+
+Miranda IM: the free IM client for Microsoft* Windows*
+
+Copyright 2000-2004 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 "commonheaders.h"
+
+HINSTANCE g_hInst = 0;
+PLUGINLINK * pluginLink;
+CLIST_INTERFACE* pcli = NULL;
+int hLangpack;
+
+struct LIST_INTERFACE li;
+struct MM_INTERFACE mmi;
+static HANDLE hCListShutdown = 0;
+
+HMENU BuildGroupPopupMenu( struct ClcGroup* group );
+
+void CalcEipPosition( struct ClcData *dat, struct ClcContact *contact, struct ClcGroup *group, POINT *result);
+void CheckPDNCE(ClcCacheEntryBase*);
+void CluiProtocolStatusChanged( int, const char* );
+int CompareContacts( const struct ClcContact *contact1, const struct ClcContact *contact2 );
+void FreeDisplayNameCacheItem(ClcCacheEntryBase*);
+void GetDefaultFontSetting(int i,LOGFONT *lf,COLORREF *colour);
+void RebuildEntireList(HWND hwnd,struct ClcData *dat);
+void RecalcScrollBar(HWND hwnd,struct ClcData *dat);
+
+struct ClcGroup* ( *saveAddGroup )(HWND hwnd,struct ClcData *dat,const TCHAR *szName,DWORD flags,int groupId,int calcTotalMembers);
+struct ClcGroup* ( *saveRemoveItemFromGroup )(HWND hwnd,struct ClcGroup *group,struct ClcContact *contact,int updateTotalCount);
+
+void (*saveFreeContact)(struct ClcContact *p);
+void (*saveFreeGroup)(struct ClcGroup *p);
+
+LRESULT ( CALLBACK *saveContactListControlWndProc )( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam );
+LRESULT CALLBACK ContactListControlWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
+
+LRESULT ( CALLBACK *saveContactListWndProc )(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
+LRESULT CALLBACK ContactListWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
+
+void ( *saveLoadClcOptions )(HWND hwnd,struct ClcData *dat);
+
+int ( *saveAddItemToGroup )( struct ClcGroup *group, int iAboveItem );
+int AddItemToGroup(struct ClcGroup *group, int iAboveItem);
+
+int ( *saveAddInfoItemToGroup)(struct ClcGroup *group,int flags,const TCHAR *pszText);
+int AddInfoItemToGroup(struct ClcGroup *group,int flags,const TCHAR *pszText);
+
+void ( *saveSortCLC )(HWND hwnd,struct ClcData *dat,int useInsertionSort);
+void SortCLC(HWND hwnd,struct ClcData *dat,int useInsertionSort);
+
+INT_PTR ( *saveTrayIconProcessMessage )(WPARAM wParam,LPARAM lParam);
+INT_PTR TrayIconProcessMessage(WPARAM wParam,LPARAM lParam);
+
+int (*saveIconFromStatusMode)(const char *szProto,int nStatus, HANDLE hContact);
+int cli_IconFromStatusMode(const char *szProto,int nStatus, HANDLE hContact);
+
+
+//from bgrcfg
+extern int BGModuleLoad();
+extern int BGModuleUnload();
+
+PLUGININFOEX pluginInfo = {
+ sizeof(PLUGININFOEX),
+ #if defined( _UNICODE )
+ "MultiWindow Contact List Unicode",
+ #else
+ "MultiWindow Contact List",
+ #endif
+ PLUGIN_MAKE_VERSION(0,9,0,0),
+ "Display contacts, event notifications, protocol status with MW modifications",
+ "",
+ "bethoven@mailgate.ru" ,
+ "Copyright 2000-2010 Miranda-IM project ["__DATE__" "__TIME__"]",
+ "http://www.miranda-im.org",
+ UNICODE_AWARE,
+ DEFMOD_CLISTALL,
+ #if defined( _UNICODE )
+ {0x2a417ab9, 0x16f2, 0x472d, { 0x9a, 0xe3, 0x41, 0x51, 0x3, 0xc7, 0x8a, 0x64 }} //{2A417AB9-16F2-472d-9AE3-415103C78A64}
+ #else
+ {0x7ab05d31, 0x9972, 0x4406, { 0x82, 0x3e, 0xe, 0xd7, 0x45, 0xef, 0x7c, 0x56 }} //{7AB05D31-9972-4406-823E-0ED745EF7C56}
+ #endif
+};
+
+BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD dwReason, LPVOID reserved)
+{
+ g_hInst = hInstDLL;
+ DisableThreadLibraryCalls(g_hInst);
+ return TRUE;
+}
+
+__declspec(dllexport) PLUGININFOEX* MirandaPluginInfoEx(DWORD mirandaVersion)
+{
+ if ( mirandaVersion < PLUGIN_MAKE_VERSION(0,8,0,9) )
+ return NULL;
+ return &pluginInfo;
+}
+
+static const MUUID interfaces[] = {MIID_CLIST, MIID_LAST};
+__declspec(dllexport) const MUUID * MirandaPluginInterfaces(void)
+{
+ return interfaces;
+}
+
+int LoadContactListModule(void);
+int LoadCLCModule(void);
+int LoadCLUIModule();
+int InitSkinHotKeys();
+
+static int systemModulesLoaded(WPARAM wParam, LPARAM lParam)
+{
+ __try {
+ int *disableDefaultModule = 0;
+ disableDefaultModule=(int*)CallService(MS_PLUGINS_GETDISABLEDEFAULTARRAY,0,0);
+ if(!disableDefaultModule[DEFMOD_UICLUI]) if( LoadCLUIModule()) return 1;
+ }
+ __except (exceptFunction(GetExceptionInformation()) )
+ {
+ return 0;
+ }
+
+ InitSkinHotKeys();
+
+ return 0;
+}
+
+INT_PTR SetDrawer(WPARAM wParam,LPARAM lParam)
+{
+ pDrawerServiceStruct DSS=(pDrawerServiceStruct)wParam;
+ if (DSS->cbSize!=sizeof(*DSS)) return -1;
+ if (DSS->PluginName==NULL) return -1;
+ if (DSS->PluginName==NULL) return -1;
+ if (!ServiceExists(DSS->GetDrawFuncsServiceName)) return -1;
+
+
+ SED.cbSize=sizeof(SED);
+ SED.PaintClc=(void (__cdecl *)(HWND,struct ClcData *,HDC,RECT *,int ,ClcProtoStatus *,HIMAGELIST))CallService(DSS->GetDrawFuncsServiceName,CLUI_EXT_FUNC_PAINTCLC,0);
+ if (!SED.PaintClc) return -1;
+ return 0;
+}
+
+static struct ClcContact* fnCreateClcContact( void )
+{
+ return (struct ClcContact*)mir_calloc( sizeof( struct ClcContact ));
+}
+
+static ClcCacheEntryBase* fnCreateCacheItem( HANDLE hContact )
+{
+ pdisplayNameCacheEntry p = (pdisplayNameCacheEntry)mir_calloc( sizeof( displayNameCacheEntry ));
+ if ( p )
+ p->hContact = hContact;
+ return (ClcCacheEntryBase*)p;
+}
+
+int __declspec(dllexport) CListInitialise(PLUGINLINK * link)
+{
+ int rc=0;
+ pluginLink=link;
+ #ifdef _DEBUG
+ _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
+ #endif
+
+ // get the internal malloc/free()
+ __try {
+
+ OutputDebugStringA("CListInitialise ClistMW\r\n");
+
+ mir_getMMI( &mmi );
+ mir_getLP( &pluginInfo );
+ mir_getLI( &li );
+
+ pcli = ( CLIST_INTERFACE* )CallService(MS_CLIST_RETRIEVE_INTERFACE, 0, (LPARAM)g_hInst);
+ if ( (INT_PTR)pcli == CALLSERVICE_NOTFOUND ) {
+LBL_Error:
+ MessageBoxA( NULL, "This version of plugin requires Miranda IM 0.8.0.9 or later", "Fatal error", MB_OK );
+ return 1;
+ }
+ if ( pcli->version < 6 )
+ goto LBL_Error;
+
+ pcli->pfnBuildGroupPopupMenu = BuildGroupPopupMenu;
+ pcli->pfnCalcEipPosition = CalcEipPosition;
+ pcli->pfnCheckCacheItem = CheckPDNCE;
+ pcli->pfnCluiProtocolStatusChanged = CluiProtocolStatusChanged;
+ pcli->pfnCompareContacts = CompareContacts;
+ pcli->pfnCreateClcContact = fnCreateClcContact;
+ pcli->pfnCreateCacheItem = fnCreateCacheItem;
+ pcli->pfnFindItem = FindItem;
+ pcli->pfnFreeCacheItem = FreeDisplayNameCacheItem;
+ pcli->pfnGetDefaultFontSetting = GetDefaultFontSetting;
+ pcli->pfnGetRowsPriorTo = GetRowsPriorTo;
+ pcli->pfnGetRowByIndex = GetRowByIndex;
+ pcli->pfnHitTest = HitTest;
+ pcli->pfnPaintClc = PaintClc;
+ pcli->pfnRebuildEntireList = RebuildEntireList;
+ pcli->pfnRecalcScrollBar = RecalcScrollBar;
+ pcli->pfnScrollTo = ScrollTo;
+
+ saveIconFromStatusMode = pcli->pfnIconFromStatusMode;
+ pcli->pfnIconFromStatusMode = cli_IconFromStatusMode;
+
+ saveAddGroup = pcli->pfnAddGroup; pcli->pfnAddGroup = AddGroup;
+ saveAddInfoItemToGroup = pcli->pfnAddInfoItemToGroup; pcli->pfnAddInfoItemToGroup = AddInfoItemToGroup;
+ saveAddItemToGroup = pcli->pfnAddItemToGroup; pcli->pfnAddItemToGroup = AddItemToGroup;
+ saveRemoveItemFromGroup = pcli->pfnRemoveItemFromGroup; pcli->pfnRemoveItemFromGroup = RemoveItemFromGroup;
+ saveFreeContact = pcli->pfnFreeContact; pcli->pfnFreeContact = FreeContact;
+ saveFreeGroup = pcli->pfnFreeGroup; pcli->pfnFreeGroup = FreeGroup;
+ saveContactListControlWndProc = pcli->pfnContactListControlWndProc; pcli->pfnContactListControlWndProc = ContactListControlWndProc;
+ saveTrayIconProcessMessage = pcli->pfnTrayIconProcessMessage; pcli->pfnTrayIconProcessMessage = TrayIconProcessMessage;
+ saveContactListWndProc = pcli->pfnContactListWndProc; pcli->pfnContactListWndProc = ContactListWndProc;
+ saveLoadClcOptions = pcli->pfnLoadClcOptions; pcli->pfnLoadClcOptions = LoadClcOptions;
+ saveSortCLC = pcli->pfnSortCLC; pcli->pfnSortCLC = SortCLC;
+
+ memset(&SED,0,sizeof(SED));
+ CreateServiceFunction(CLUI_SetDrawerService,SetDrawer);
+
+ rc=LoadContactListModule();
+ if (rc==0) rc=LoadCLCModule();
+
+ HookEvent(ME_SYSTEM_MODULESLOADED, systemModulesLoaded);
+ BGModuleLoad();
+
+ OutputDebugStringA("CListInitialise ClistMW...Done\r\n");
+ }
+ __except (exceptFunction(GetExceptionInformation()) )
+ {
+ return 0;
+ }
+
+ return rc;
+}
+
+// never called by a newer plugin loader.
+int __declspec(dllexport) Load(PLUGINLINK * link)
+{
+ OutputDebugStringA("Load ClistMW\r\n");
+ MessageBoxA(0,"You Running Old Miranda, use >30-10-2004 version!","MultiWindow Clist",0);
+ CListInitialise(link);
+ return 1;
+}
+
+int __declspec(dllexport) Unload(void)
+{
+ OutputDebugStringA("Unloading ClistMW\r\n");
+ if (IsWindow(pcli->hwndContactList)) DestroyWindow(pcli->hwndContactList);
+ BGModuleUnload();
+ pcli->hwndContactList=0;
+ return 0;
+}
diff --git a/plugins/Mwclist/keyboard.c b/plugins/Mwclist/keyboard.c
new file mode 100644
index 0000000000..11317e3e90
--- /dev/null
+++ b/plugins/Mwclist/keyboard.c
@@ -0,0 +1,68 @@
+/*
+
+Miranda IM: the free IM client for Microsoft* Windows*
+
+Copyright 2000-2003 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 "commonheaders.h"
+#include <m_hotkeys.h>
+
+INT_PTR hkCloseMiranda(WPARAM wParam,LPARAM lParam)
+{
+ CallService("CloseAction", 0, 0);
+ return 0;
+}
+
+INT_PTR hkRestoreStatus(WPARAM wParam,LPARAM lParam)
+{
+ int nStatus = DBGetContactSettingWord(NULL, "CList", "Status", ID_STATUS_OFFLINE);
+ CallService(MS_CLIST_SETSTATUSMODE, nStatus, 0);
+
+ return 0;
+}
+
+int InitSkinHotKeys(void)
+{
+ HOTKEYDESC shk={0};
+
+ CreateServiceFunction("CLIST/HK/CloseMiranda",hkCloseMiranda);
+ CreateServiceFunction("CLIST/HK/RestoreStatus",hkRestoreStatus);
+
+ shk.cbSize=sizeof(shk);
+
+ shk.pszDescription="Close Miranda";
+ shk.pszName="CloseMiranda";
+ shk.pszSection="Main";
+ shk.pszService="CLIST/HK/CloseMiranda";
+ shk.DefHotKey=0;
+ CallService(MS_HOTKEY_REGISTER,0,(LPARAM)&shk);
+
+ shk.pszDescription="Restore last status";
+ shk.pszName="RestoreLastStatus";
+ shk.pszSection="Status";
+ shk.pszService="CLIST/HK/RestoreStatus";
+ shk.DefHotKey=0;
+ CallService(MS_HOTKEY_REGISTER,0,(LPARAM)&shk);
+
+ return 0;
+}
+
+void UninitSkinHotKeys(void)
+{
+}
diff --git a/plugins/Mwclist/m_fontservice.h b/plugins/Mwclist/m_fontservice.h
new file mode 100644
index 0000000000..3723029ecb
--- /dev/null
+++ b/plugins/Mwclist/m_fontservice.h
@@ -0,0 +1,30 @@
+// Copyright Scott Ellis (mail@scottellis.com.au) 2005
+// This software is licenced under the GPL (General Public Licence)
+// available at http://www.gnu.org/copyleft/gpl.html
+
+#ifndef _FONT_SERVICE_API_INC
+#define _FONT_SERVICE_API_INC
+
+typedef struct FontID_tag {
+ int cbSize;
+ char group[64];
+ char name[64];
+ char dbSettingsGroup[32];
+ char prefix[32];
+ int order;
+} FontID;
+
+// register a font
+// wparam = (FontID *)&font_id
+// lparam = 0
+#define MS_FONT_REGISTER "Font/Register"
+
+// get a font
+// wparam = (FontID *)&font_id (only name and group matter)
+// lParam = (LOGFONT *)&logfont
+#define MS_FONT_GET "Font/Get"
+
+// fired when a user modifies font settings, so reget your fonts
+#define ME_FONT_RELOAD "Font/Reload"
+
+#endif \ No newline at end of file
diff --git a/plugins/Mwclist/m_mwclc.h b/plugins/Mwclist/m_mwclc.h
new file mode 100644
index 0000000000..b7b5102c32
--- /dev/null
+++ b/plugins/Mwclist/m_mwclc.h
@@ -0,0 +1,27 @@
+/*
+
+Miranda IM: the free IM client for Microsoft* Windows*
+
+Copyright 2000-2003 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_CLC_
+#define _M_CLC_
+
+
+#endif
diff --git a/plugins/Mwclist/res/1.ico b/plugins/Mwclist/res/1.ico
new file mode 100644
index 0000000000..76d708cc7d
--- /dev/null
+++ b/plugins/Mwclist/res/1.ico
Binary files differ
diff --git a/plugins/Mwclist/res/2.ico b/plugins/Mwclist/res/2.ico
new file mode 100644
index 0000000000..5b3f38fb88
--- /dev/null
+++ b/plugins/Mwclist/res/2.ico
Binary files differ
diff --git a/plugins/Mwclist/res/3.ico b/plugins/Mwclist/res/3.ico
new file mode 100644
index 0000000000..c79cb1fc50
--- /dev/null
+++ b/plugins/Mwclist/res/3.ico
Binary files differ
diff --git a/plugins/Mwclist/res/4.ico b/plugins/Mwclist/res/4.ico
new file mode 100644
index 0000000000..7a5f20c680
--- /dev/null
+++ b/plugins/Mwclist/res/4.ico
Binary files differ
diff --git a/plugins/Mwclist/res/5.ico b/plugins/Mwclist/res/5.ico
new file mode 100644
index 0000000000..4d40b3dfd9
--- /dev/null
+++ b/plugins/Mwclist/res/5.ico
Binary files differ
diff --git a/plugins/Mwclist/res/6.ico b/plugins/Mwclist/res/6.ico
new file mode 100644
index 0000000000..a2dda676b5
--- /dev/null
+++ b/plugins/Mwclist/res/6.ico
Binary files differ
diff --git a/plugins/Mwclist/res/7.ico b/plugins/Mwclist/res/7.ico
new file mode 100644
index 0000000000..a33a2dd60c
--- /dev/null
+++ b/plugins/Mwclist/res/7.ico
Binary files differ
diff --git a/plugins/Mwclist/res/8.ico b/plugins/Mwclist/res/8.ico
new file mode 100644
index 0000000000..15eec5f082
--- /dev/null
+++ b/plugins/Mwclist/res/8.ico
Binary files differ
diff --git a/plugins/Mwclist/res/Miranda.ico b/plugins/Mwclist/res/Miranda.ico
new file mode 100644
index 0000000000..aa99a2ee3b
--- /dev/null
+++ b/plugins/Mwclist/res/Miranda.ico
Binary files differ
diff --git a/plugins/Mwclist/res/addgoupp.ico b/plugins/Mwclist/res/addgoupp.ico
new file mode 100644
index 0000000000..6859bb2103
--- /dev/null
+++ b/plugins/Mwclist/res/addgoupp.ico
Binary files differ
diff --git a/plugins/Mwclist/res/blank.ico b/plugins/Mwclist/res/blank.ico
new file mode 100644
index 0000000000..7845f62fed
--- /dev/null
+++ b/plugins/Mwclist/res/blank.ico
Binary files differ
diff --git a/plugins/Mwclist/res/blank1.ico b/plugins/Mwclist/res/blank1.ico
new file mode 100644
index 0000000000..7845f62fed
--- /dev/null
+++ b/plugins/Mwclist/res/blank1.ico
Binary files differ
diff --git a/plugins/Mwclist/res/delete.ico b/plugins/Mwclist/res/delete.ico
new file mode 100644
index 0000000000..9108e38cfd
--- /dev/null
+++ b/plugins/Mwclist/res/delete.ico
Binary files differ
diff --git a/plugins/Mwclist/res/dragcopy.cur b/plugins/Mwclist/res/dragcopy.cur
new file mode 100644
index 0000000000..89c7c960d5
--- /dev/null
+++ b/plugins/Mwclist/res/dragcopy.cur
Binary files differ
diff --git a/plugins/Mwclist/res/dropuser.cur b/plugins/Mwclist/res/dropuser.cur
new file mode 100644
index 0000000000..a84b19e28b
--- /dev/null
+++ b/plugins/Mwclist/res/dropuser.cur
Binary files differ
diff --git a/plugins/Mwclist/res/globus.ico b/plugins/Mwclist/res/globus.ico
new file mode 100644
index 0000000000..6baf15c3c5
--- /dev/null
+++ b/plugins/Mwclist/res/globus.ico
Binary files differ
diff --git a/plugins/Mwclist/res/hyperlin.cur b/plugins/Mwclist/res/hyperlin.cur
new file mode 100644
index 0000000000..f0f548c828
--- /dev/null
+++ b/plugins/Mwclist/res/hyperlin.cur
Binary files differ
diff --git a/plugins/Mwclist/res/icon1.ico b/plugins/Mwclist/res/icon1.ico
new file mode 100644
index 0000000000..104bb7fd95
--- /dev/null
+++ b/plugins/Mwclist/res/icon1.ico
Binary files differ
diff --git a/plugins/Mwclist/res/icon2.ico b/plugins/Mwclist/res/icon2.ico
new file mode 100644
index 0000000000..3f19bd9d47
--- /dev/null
+++ b/plugins/Mwclist/res/icon2.ico
Binary files differ
diff --git a/plugins/Mwclist/res/mirandaclassic.ico b/plugins/Mwclist/res/mirandaclassic.ico
new file mode 100644
index 0000000000..423daa96e1
--- /dev/null
+++ b/plugins/Mwclist/res/mirandaclassic.ico
Binary files differ
diff --git a/plugins/Mwclist/res/notick.ico b/plugins/Mwclist/res/notick.ico
new file mode 100644
index 0000000000..7cb0afddd9
--- /dev/null
+++ b/plugins/Mwclist/res/notick.ico
Binary files differ
diff --git a/plugins/Mwclist/res/notick1.ico b/plugins/Mwclist/res/notick1.ico
new file mode 100644
index 0000000000..5a2b81aeed
--- /dev/null
+++ b/plugins/Mwclist/res/notick1.ico
Binary files differ
diff --git a/plugins/Mwclist/res/rename.ico b/plugins/Mwclist/res/rename.ico
new file mode 100644
index 0000000000..fa8abc8785
--- /dev/null
+++ b/plugins/Mwclist/res/rename.ico
Binary files differ
diff --git a/plugins/Mwclist/res/sendmail.ico b/plugins/Mwclist/res/sendmail.ico
new file mode 100644
index 0000000000..d76b6880f0
--- /dev/null
+++ b/plugins/Mwclist/res/sendmail.ico
Binary files differ
diff --git a/plugins/Mwclist/res/sms.ico b/plugins/Mwclist/res/sms.ico
new file mode 100644
index 0000000000..db3b59beab
--- /dev/null
+++ b/plugins/Mwclist/res/sms.ico
Binary files differ
diff --git a/plugins/Mwclist/resource.h b/plugins/Mwclist/resource.h
new file mode 100644
index 0000000000..ff11dc2f90
--- /dev/null
+++ b/plugins/Mwclist/resource.h
@@ -0,0 +1,655 @@
+//{{NO_DEPENDENCIES}}
+// Microsoft Visual C++ generated include file.
+// Used by resource.rc
+//
+#define IDC_AUTHICON 1
+#define IDC_NOTOALL 3
+#define IDC_APPLY 3
+#define MIM_V1 10
+#define IDI_GLOBUS 11
+#define MIM_V2 20
+#define MIM_V3 30
+#define MIM_V4 30
+#define IDD_ABOUT 103
+#define IDI_SMS 103
+#define IDI_ONLINE 104
+#define IDI_OFFLINE 105
+#define IDD_GNUPL 110
+#define IDD_ADDED 115
+#define IDD_URLSEND 119
+#define IDD_URLRECV 120
+#define IDD_AUTHREQ 121
+#define IDD_DETAILS 125
+#define IDD_OPT_CLIST 126
+#define IDD_HISTORY 127
+#define IDI_AWAY 128
+#define IDI_FREE4CHAT 129
+#define IDI_INVISIBLE 130
+#define IDI_NA 131
+#define IDD_OPT_SOUND 134
+#define IDD_OPT_HOTKEYS 134
+#define IDI_SENDURL 135
+#define IDI_RECVMSG 136
+#define IDI_SENDMSG 137
+#define IDI_URL 138
+#define IDI_DND 158
+#define IDI_OCCUPIED 159
+#define IDI_USERDETAILS 160
+#define IDI_FINDUSER 161
+#define IDI_HELP 162
+#define IDI_OPTIONS 163
+#define IDI_MIRANDAWEBSITE 172
+#define IDI_RENAME 173
+#define IDI_HISTORY 174
+#define IDI_DELETE 175
+#define IDR_CONTEXT 180
+#define IDC_DROP 183
+#define IDD_OPT_HOTKEY 184
+#define IDD_HISTORY_FIND 192
+#define IDI_SENDEMAIL 193
+#define IDD_FILERECV 194
+#define IDD_PROFILEMANAGER 197
+#define IDD_NEWPROFILE 198
+#define IDR_CLISTMENU 199
+#define IDI_BLANK 200
+#define IDD_FINDADD 201
+#define IDI_USERONLINE 201
+#define IDD_OPT_AUTOAWAY 202
+#define IDI_GROUPSHUT 202
+#define IDD_OPTIONS 203
+#define IDI_GROUPOPEN 203
+#define IDD_PLUGINCONFLICT 204
+#define IDD_FILESEND 205
+#define IDI_NOTICK 205
+#define IDD_OPT_PLUGINS 206
+#define IDI_TICK 206
+#define IDD_OPT_ICONS 207
+#define IDI_FILE 207
+#define IDI_TIMESTAMP 208
+#define IDI_CHANGEFONT 209
+#define IDI_ADDCONTACT 210
+#define IDI_SMALLDOT 211
+#define IDI_FILLEDBLOB 212
+#define IDD_READAWAYMSG 213
+#define IDI_EMPTYBLOB 213
+#define IDD_OPT_IGNORE 214
+#define IDC_HYPERLINKHAND 214
+#define IDD_OPT_VISIBILITY 215
+#define IDC_DROPUSER 215
+#define IDD_SETAWAYMSG 216
+#define IDI_DETAILSLOGO 216
+#define IDD_OPT_AWAYMSG 217
+#define IDD_OPT_CLUI 218
+#define IDD_INFO_SUMMARY 220
+#define IDD_INFO_CONTACT 221
+#define IDD_INFO_BACKGROUND 222
+#define IDD_INFO_NOTES 223
+#define IDD_ADDEMAIL 226
+#define IDD_ICONINDEX 227
+#define IDD_OPT_CLC 228
+#define IDD_OPT_CLCTEXT 229
+#define IDD_OPT_CLCBKG 230
+#define IDD_INFO_LOCATION 231
+#define IDD_INFO_WORK 232
+#define IDD_ADDPHONE 233
+#define IDD_OPT_SBAR 234
+#define IDD_INSTALLINI 235
+#define IDD_WARNINICHANGE 236
+#define IDD_INIIMPORTDONE 237
+#define IDD_OPT_CLCTEXTSIMPLE 239
+#define IDB_SORTCOLUP 239
+#define IDB_SORTCOLDOWN 240
+#define IDD_OPT_NETLIB 246
+#define IDD_NETLIBLOGOPTS 247
+#define IDD_FILETRANSFERINFO 249
+#define IDD_OPT_FILETRANSFER 250
+#define IDD_FILEEXISTS 251
+#define IDD_DELETECONTACT 254
+#define IDD_DENYREASON 256
+#define IDD_ADDCONTACT 257
+#define IDD_OPT_CONTACT 261
+#define IDD_OPT_PROTOCOLORDER 262
+#define IDI_MULTISEND 263
+#define IDI_DOWNARROW 264
+#define IDD_CREDITS 265
+#define IDD_OPT_IDLE 268
+#define IDI_ICQC1 269
+#define IDI_ICQC2 270
+#define IDI_ICQC3 271
+#define IDI_ICQC4 272
+#define IDI_ICQC5 273
+#define IDI_ICQC6 274
+#define IDI_ICQC7 275
+#define IDI_ICQC8 276
+#define IDI_EMAIL 277
+#define IDD_OPT_META_CLC 279
+#define IDI_NEWGROUP 282
+#define IDI_NEWGROUP2 282
+#define IDI_CLIENTTRILLIAN 298
+#define IDI_CLIENTMIRANDA 299
+#define IDI_CLIENTRQ 300
+#define IDI_CLIENTGAIM 301
+#define IDI_CLIENTIM2 302
+#define IDI_CLIENTKOPETE 303
+#define IDI_CLIENTLICQ 304
+#define IDI_CLIENTQIP 305
+#define IDI_CLIENTSIM 306
+#define IDI_MIRANDA2 307
+#define IDD_OPT_CLCBKG2 308
+#define IDI_CLIENTICQL5 315
+#define IDI_CLIENTAGILE 318
+#define IDI_CLIENTGNOMEICU 319
+#define IDI_ICON1 320
+#define IDI_CLIENTMOBICQ 320
+#define IDI_CLIENTSPAMBOT 321
+#define IDI_CLIENTICQMAC 322
+#define IDI_CLIENTIMPLUS 323
+#define IDI_CLIENTYSM 324
+#define IDI_CLIENTYAMIGO 325
+#define IDI_CLIENTWEBICQ 326
+#define IDI_CLIENTVICQ 327
+#define IDI_CLIENTSTRICQ 328
+#define IDI_CLIENTSTICQ 329
+#define IDI_CLIENTNICQ2 330
+#define IDI_CLIENTPSI 331
+#define IDI_CLIENTMOB2ICQ 333
+#define IDI_CLIENTMICQ 334
+#define IDI_CLIENTLIBICQ2000 335
+#define IDI_CLIENTCENTERICQ 336
+#define IDI_CLIENTALICQ 337
+#define IDI_CLIENTICQ2000 339
+#define IDI_CLIENTICQ2001 340
+#define IDI_CLIENTICQ2003 341
+#define IDI_CLIENTICQLITE 342
+#define IDI_CLIENTICQLITE4 343
+#define IDI_CLIENTICQLITE5 344
+#define IDI_CLIENTICQGOF 345
+#define IDI_CLIENTICQGOJ 346
+#define IDC_RESETPROTOCOLDATA 1000
+#define IDC_SAVE 1001
+#define IDC_DEFBKCOLOR 1001
+#define IDI_ONTHEPHONE 1002
+#define IDC_MESSAGE 1002
+#define IDI_OUTTOLUNCH 1003
+#define IDC_AUTOCLOSE 1004
+#define IDC_FROM 1005
+#define IDC_AUTOMIN 1005
+#define IDC_DATE 1006
+#define IDC_DUMPRECV 1006
+#define IDC_MSG 1008
+#define IDC_PROXYDNS 1008
+#define IDC_NAME 1009
+#define IDC_PROXYTYPE 1009
+#define IDC_STATIC23 1010
+#define IDC_NAMEVAL 1010
+#define IDC_SPECIFYPORTS 1013
+#define IDC_ST_ENTERMSG 1013
+#define IDC_ST_ENTERURL 1014
+#define IDC_SPECIFYPORTSO 1014
+#define IDC_TEXT 1019
+#define IDC_SHOWNAMES 1024
+#define IDC_ABOUT 1032
+#define IDC_MYNOTES 1033
+#define IDC_URLS 1037
+#define IDC_REPLY 1039
+#define IDC_URL 1041
+#define IDC_REASON 1046
+#define IDC_EMAIL 1048
+#define IDC_NAMENICK 1049
+#define IDC_NAMEFIRST 1050
+#define IDC_NAMELAST 1051
+#define IDC_NICK 1053
+#define IDC_GENDER 1060
+#define IDC_CITY 1061
+#define IDC_STATE 1062
+#define IDC_COUNTRY 1063
+#define IDC_AGE 1064
+#define IDC_ZIP 1064
+#define IDC_PHONE 1065
+#define IDC_STREET 1065
+#define IDC_COMPANY 1066
+#define IDC_LANGUAGE1 1066
+#define IDC_TIMEZONE 1067
+#define IDC_DEPARTMENT 1067
+#define IDC_LOCALTIME 1068
+#define IDC_DETAILS 1069
+#define IDC_POSITION 1069
+#define IDC_LANGUAGE2 1069
+#define IDC_ADD 1070
+#define IDC_LANGUAGE3 1070
+#define IDC_MOREOPTIONS 1071
+#define IDC_USERMENU 1071
+#define IDC_MIN2TRAY 1073
+#define IDC_ONTOP 1074
+#define IDC_SHOWMAINMENU 1075
+#define IDC_CLIENTDRAG 1076
+#define IDC_EDIT 1078
+#define IDC_LIST 1079
+#define IDC_HISTORY 1080
+#define IDC_USESOUND 1085
+#define IDC_TOOLWND 1097
+#define IDC_ONECLK 1098
+#define IDC_SHOWCAPTION 1098
+#define IDC_HIDEOFFLINE 1099
+#define IDC_SHOWHIDE 1100
+#define IDC_HIDEEMPTYGROUPS 1100
+#define IDC_SORTBYSTATUS 1101
+#define IDC_FADEINOUT 1101
+#define IDC_READMSG 1102
+#define IDC_AUTOSIZE 1102
+#define IDC_DISABLEGROUPS 1102
+#define IDC_AUTOSIZEUPWARD 1103
+#define IDC_ALWAYSSTATUS 1103
+#define IDC_NETSEARCH 1104
+#define IDC_CONFIRMDELETE 1104
+#define IDC_EXTRA_PROTO 1104
+#define IDC_SORTBYPROTO 1105
+#define IDC_SHOWOPTIONS 1105
+#define IDC_EXTRA_EMAIL 1105
+#define IDC_SEARCHURL 1106
+#define IDC_EXTRA_CELLULAR 1106
+#define IDC_EXTRA_ADV2 1107
+#define IDC_BUILDTIME 1108
+#define IDC_EXTRA_ADV1 1108
+#define IDC_EXTRA_WEB 1109
+#define IDC_NUMBER 1113
+#define IDC_UIN 1123
+#define IDC_TRANSPARENT 1124
+#define IDC_TRANSINACTIVE 1126
+#define IDC_TRANSACTIVE 1128
+#define IDC_FINDWHAT 1131
+#define IDC_FIND 1132
+#define IDC_FILE 1133
+#define IDC_PROFILELIST 1134
+#define IDC_NEWPROFILE 1135
+#define IDC_NEWPROFILENAME 1136
+#define IDC_TABS 1141
+#define IDC_RESULTS 1142
+#define IDC_STATUS 1144
+#define IDC_SCREENSAVE 1145
+#define IDC_TIMED 1146
+#define IDC_AWAYTIME 1147
+#define IDC_USEPROXY 1148
+#define IDC_SETNA 1148
+#define IDC_PROXYAUTH 1149
+#define IDC_NATIME 1149
+#define IDC_PROXYHOST 1150
+#define IDC_PROXYPORT 1151
+#define IDC_PROXYUSER 1152
+#define IDC_PROXYPASS 1153
+#define IDC_STATIC11 1154
+#define IDC_STATIC12 1155
+#define IDC_STATIC21 1156
+#define IDC_STATIC22 1157
+#define IDC_STATIC31 1158
+#define IDC_STATIC32 1159
+#define IDC_PROXYAUTHNTLM 1160
+#define IDC_HKSHOWHIDE 1162
+#define IDC_HKREADMSG 1163
+#define IDC_SOUNDLIST 1163
+#define IDC_HKSEARCH 1164
+#define IDC_CHANGE 1164
+#define IDC_PREVIEW 1165
+#define IDC_HKSHOWOPTIONS 1165
+#define IDC_PLUGINLIST 1167
+#define IDC_FEATURENAME 1168
+#define IDC_CHOOSE 1169
+#define IDC_TO 1170
+#define IDC_ABOUTGROUP 1175
+#define IDC_DESCRIPTION 1176
+#define IDC_AUTHOR 1177
+#define IDC_COPYRIGHT 1178
+#define IDC_VERSION 1179
+#define IDC_HOMEPAGE 1181
+#define IDC_RESTARTREQD 1182
+#define IDC_ICONSET 1183
+#define IDC_BROWSE 1184
+#define IDC_RUNATSTARTBROWSE 1185
+#define IDC_PAGETREE 1186
+#define IDC_RUNNOW 1186
+#define IDC_INACTIVEPERC 1187
+#define IDC_ACTIVEPERC 1188
+#define IDC_SEARCHNEWWND 1188
+#define IDC_RETRIEVING 1193
+#define IDC_TITLETEXT 1196
+#define IDC_GETMORE 1200
+#define IDC_VISIBLEICON 1204
+#define IDC_INVISIBLEICON 1205
+#define IDC_FILEICON 1206
+#define IDC_ONLINEICON 1207
+#define IDC_FILENAMES 1208
+#define IDC_ALLICON 1208
+#define IDC_DONTREPLY 1209
+#define IDC_NONEICON 1209
+#define IDC_USEPREVIOUS 1210
+#define IDC_NODIALOG 1211
+#define IDC_USESPECIFIC 1212
+#define IDC_FILEDIR 1213
+#define IDC_ALLFILESPROGRESS 1217
+#define IDC_CURRENTSPEED 1219
+#define IDC_STAWAYTYPE 1220
+#define IDC_WHITERECT 1221
+#define IDC_ALLSPEED 1221
+#define IDC_CURRENTFILEPROGRESS 1222
+#define IDC_CURRENTFILEGROUP 1223
+#define IDC_FIRSTNAME 1224
+#define IDC_LASTNAME 1225
+#define IDC_CURRENTTRANSFERRED 1225
+#define IDC_DOBDAY 1226
+#define IDC_DOBMONTH 1227
+#define IDC_WEBPAGE 1228
+#define IDC_DOBYEAR 1228
+#define IDC_UPDATING 1231
+#define IDC_NAMEORDER 1234
+#define IDC_AUTOHIDE 1235
+#define IDC_HIDETIME 1236
+#define IDC_RECONNECTREQD 1239
+#define IDC_IMPORT 1241
+#define IDC_TOMAIN 1243
+#define IDC_TOPROTO 1244
+#define IDC_PROTOLIST 1245
+#define IDC_TODEFICON 1246
+#define IDC_IMPORTMULTI 1247
+#define IDC_MAXSIZEHEIGHT 1254
+#define IDC_MAXSIZESPIN 1255
+#define IDC_FONTID 1256
+#define IDC_SAMETYPE 1257
+#define IDC_SAMESTYLE 1258
+#define IDC_SAMECOLOUR 1259
+#define IDC_SAMEAS 1260
+#define IDC_TYPEFACE 1261
+#define IDC_BOLD 1262
+#define IDC_ITALIC 1263
+#define IDC_COLOUR 1264
+#define IDC_UNDERLINE 1265
+#define IDC_HOTCOLOUR 1267
+#define IDC_SAMESIZE 1268
+#define IDC_BKGCOLOUR 1269
+#define IDC_FILENAME 1271
+#define IDC_SCROLL 1277
+#define IDC_PROPORTIONAL 1278
+#define IDC_SELCOLOUR 1281
+#define IDC_QUICKCOLOUR 1282
+#define IDC_SMOOTHTIME 1283
+#define IDC_SMOOTHTIMESPIN 1284
+#define IDC_GREYOUT 1285
+#define IDC_ROWHEIGHT 1285
+#define IDC_ROWHEIGHTSPIN 1286
+#define IDC_GREYOUTOPTS 1288
+#define IDC_GROUPINDENT 1289
+#define IDC_GROUPINDENTSPIN 1290
+#define IDC_LEFTMARGIN 1291
+#define IDC_SAMPLE 1292
+#define IDC_LEFTMARGINSPIN 1292
+#define IDC_FONTSIZE 1293
+#define IDC_STRETCHH 1298
+#define IDC_STRETCHV 1299
+#define IDC_TILEH 1300
+#define IDC_SCRIPT 1300
+#define IDC_TILEV 1301
+#define IDC_GAMMACORRECT 1302
+#define IDC_TILEVROWH 1302
+#define IDC_INTERESTS 1305
+#define IDC_EMAILS 1306
+#define IDC_PAST 1307
+#define IDC_HIDEOFFLINEOPTS 1308
+#define IDC_PHONES 1308
+#define IDC_SMS 1310
+#define IDC_AREA 1312
+#define IDC_UPDATE 1313
+#define IDC_DONTCYCLE 1315
+#define IDC_PRIMARYSTATUS 1316
+#define IDC_CYCLE 1317
+#define IDC_CYCLETIME 1318
+#define IDC_CYCLETIMESPIN 1319
+#define IDC_HIDETIMESPIN 1320
+#define IDC_MULTITRAY 1321
+#define IDC_ALWAYSMULTI 1322
+#define IDC_SHOWICON 1323
+#define IDC_SHOWPROTO 1324
+#define IDC_SHOWSTATUS 1325
+#define IDC_EQUALSECTIONS 1326
+#define IDC_SHOWSIZEGRIP 1327
+#define IDC_USEOWNERDRAW 1328
+#define IDC_SHOWSBAR 1329
+#define IDC_RIGHTMIRANDA 1330
+#define IDC_RIGHTSTATUS 1331
+#define IDC_ININAME 1333
+#define IDC_VIEWINI 1334
+#define IDC_SECURITYINFO 1335
+#define IDC_SETTINGNAME 1336
+#define IDC_NEWVALUE 1337
+#define IDC_WARNNOMORE 1338
+#define IDC_DELETE 1339
+#define IDC_RECYCLE 1340
+#define IDC_NEWNAME 1341
+#define IDC_MOVE 1342
+#define IDC_LEAVE 1343
+#define IDC_EXPERT 1346
+#define IDC_SORTBYNAME 1347
+#define IDC_STAUTOHIDESECS 1349
+#define IDC_STCLISTGROUP 1350
+#define IDC_DISABLEDRAGDROP 1351
+#define IDC_NOTEDITLABELS 1352
+#define IDC_SHOWSELALWAYS 1353
+#define IDC_TRACKSELECT 1354
+#define IDC_SHOWGROUPCOUNTS 1355
+#define IDC_HIDECOUNTSWHENEMPTY 1356
+#define IDC_DIVIDERONOFF 1357
+#define IDC_NOTNOTRANSLUCENTSEL 1358
+#define IDC_LINEWITHGROUPS 1359
+#define IDC_QUICKSEARCHVISONLY 1360
+#define IDC_SORTGROUPSALPHA 1361
+#define IDC_NOTNOSMOOTHSCROLLING 1362
+#define IDC_BITMAP 1363
+#define IDC_STWINDOWGROUP 1364
+#define IDC_STATIC01 1365
+#define IDC_CATEGORYLIST 1366
+#define IDC_LOADICONS 1369
+#define IDC_STICONSGROUP 1371
+#define IDC_MSGICON 1375
+#define IDC_URLICON 1376
+#define IDC_STNOPAGE 1377
+#define IDC_STCHECKMARKS 1380
+#define IDC_STSAMETEXT 1382
+#define IDC_STASTEXT 1383
+#define IDC_STSIZETEXT 1384
+#define IDC_STCOLOURTEXT 1385
+#define IDC_STHORZBAR 1386
+#define IDC_MIRANDA 1388
+#define IDC_STATUSBAR 1389
+#define IDC_PROTOIDGROUP 1392
+#define IDC_BYPROTOID 1393
+#define IDC_PROTOID 1394
+#define IDC_EMAILGROUP 1395
+#define IDC_BYEMAIL 1396
+#define IDC_STNAMENICK 1397
+#define IDC_NAMEGROUP 1398
+#define IDC_BYNAME 1399
+#define IDC_STNAMEFIRST 1400
+#define IDC_STNAMELAST 1401
+#define IDC_ADVANCEDGROUP 1402
+#define IDC_BYADVANCED 1403
+#define IDC_ADVANCED 1404
+#define IDC_STSIMPLERIGHT 1440
+#define IDC_NETLIBUSERS 1443
+#define IDC_STOFTENPORT 1445
+#define IDC_STATIC51 1446
+#define IDC_STATIC52 1447
+#define IDC_STATIC43 1448
+#define IDC_LOGOPTIONS 1449
+#define IDC_PORTSRANGE 1450
+#define IDC_TOCONSOLE 1451
+#define IDC_STATIC53 1451
+#define IDC_SHOWCONSOLEATSTART 1452
+#define IDC_PORTSRANGEO 1452
+#define IDC_STATIC54 1453
+#define IDC_SHOWCONSOLE 1454
+#define IDC_TOOUTPUTDEBUGSTRING 1455
+#define IDC_TOFILE 1456
+#define IDC_CLEARCONSOLE 1457
+#define IDC_RUNATSTART 1458
+#define IDC_DUMPSENT 1464
+#define IDC_DUMPPROXY 1466
+#define IDC_TEXTDUMPS 1467
+#define IDC_AUTODETECTTEXT 1468
+#define IDC_TIMEFORMAT 1469
+#define IDC_FILENAMEBROWSE 1470
+#define IDC_SHOWTHISDLGATSTART 1471
+#define IDC_FILEDIRBROWSE 1475
+#define IDC_ALLFILESGROUP 1476
+#define IDC_SCANCMDLINEBROWSE 1476
+#define IDC_ALLTRANSFERRED 1477
+#define IDC_OPENFOLDER 1478
+#define IDC_OPENFILE 1479
+#define IDC_TOTALSIZE 1480
+#define IDC_APPENDNICKTODIR 1483
+#define IDC_AUTOACCEPT 1484
+#define IDC_SCANCMDLINE 1485
+#define IDC_WARNBEFOREOPENING 1488
+#define IDC_SCANDURINGDL 1489
+#define IDC_SCANAFTERDL 1490
+#define IDC_NOSCANNER 1491
+#define IDC_ST_CMDLINE 1492
+#define IDC_ST_CMDLINEHELP 1493
+#define IDC_PROPERTIES 1496
+#define IDC_RESUME 1497
+#define IDC_EXISTINGICON 1499
+#define IDC_RESUMEALL 1500
+#define IDC_OVERWRITE 1501
+#define IDC_OVERWRITEALL 1502
+#define IDC_SKIP 1503
+#define IDC_EXISTINGSIZE 1506
+#define IDC_EXISTINGDATE 1507
+#define IDC_EXISTINGTYPE 1508
+#define IDC_NEWICON 1509
+#define IDC_NEWSIZE 1510
+#define IDC_NEWDATE 1511
+#define IDC_NEWTYPE 1512
+#define IDC_SAVEAS 1513
+#define IDC_ASK 1516
+#define IDC_RENAME 1519
+#define IDC_VIRUSSCANNERGROUP 1520
+#define IDC_HIDE 1534
+#define IDC_TOPLINE 1535
+#define IDC_GPLBTN 1536
+#define IDC_MAIL 1536
+#define IDC_MYHANDLE 1540
+#define IDC_GROUP 1541
+#define IDC_ADDED 1542
+#define IDC_AUTH 1543
+#define IDC_PLUGINSTATIC1 1559
+#define IDC_DELETEHISTORY 1560
+#define IDC_HOTKEYURLSTR 1567
+#define IDC_SETNASTR 1568
+#define IDC_AAUTHOR 1569
+#define IDC_AHOMEPAGE 1570
+#define IDC_AVERSION 1571
+#define IDC_ACOPYRIGHT 1572
+#define IDC_ADESCRIPTION 1573
+#define IDC_PLUGINENABLE 1574
+#define IDC_AUTHREQ 1577
+#define IDC_AUTHGB 1578
+#define IDC_BRINGTOFRONT 1579
+#define IDC_PROTOCOL 1580
+#define IDC_CONTRIBLINK 1586
+#define IDC_HOMELINK 1587
+#define IDC_SUPPORTLINK 1588
+#define IDC_DEVS 1589
+#define IDC_GPL 1590
+#define IDC_LOGO 1591
+#define IDC_PROTOCOLORDER 1591
+#define IDC_PROTOCOLORDERWARNING 1592
+#define IDC_CREDITSTEXT 1595
+#define IDC_WSLOCK 1599
+#define IDC_BLINKTIME 1607
+#define IDC_BLINKSPIN 1608
+#define IDC_DISABLEBLINK 1609
+#define IDC_IDLE 1610
+#define IDC_SBPANELBEVEL 1611
+#define IDC_META 1611
+#define IDC_DROPSHADOW 1612
+#define IDC_METADBLCLK 1612
+#define IDC_NOSCROLLBAR 1613
+#define IDC_METASUBEXTRA 1614
+#define IDC_METASUBEXTRA_IGN 1615
+#define IDC_METASUB_HIDEOFFLINE 1616
+#define IDC_BUTTON1 1633
+#define IDC_IDLECHECK 1636
+#define IDC_IDLEONWINDOWS 1637
+#define IDC_IDLEONMIRANDA 1638
+#define IDC_IDLEUSEGLI 1639
+#define IDC_SCREENSAVER 1642
+#define IDC_LOCKED 1643
+#define IDC_IDLESHORT 1644
+#define IDC_IDLELONG 1645
+#define IDC_IDLE1STTIME 1646
+#define IDC_IDLE2NDTIME 1647
+#define IDC_IDLEPRIVATE 1649
+#define IDC_AASTATUS 1650
+#define IDC_AASHORTIDLE 1651
+#define IDC_AALONGSTATUS 1652
+#define IDC_AALONGIDLE 1656
+#define IDC_NOOFFLINEMOVE 1657
+#define IDC_HOTKEYTREE 1657
+#define IDC_HILIGHTMODE 1658
+#define IDC_HILIGHTMODE2 1659
+#define IDC_LOCATION 1659
+#define IDC_HILIGHTMODE1 1660
+#define IDC_SGROUP 1660
+#define IDC_HILIGHTMODE3 1661
+#define IDC_SLOC 1661
+#define IDC_ONDESKTOP 1662
+#define IDC_SETHOTKEY 1759
+#define IDC_HKTITLE 1760
+#define IDC_CHECK1 1761
+#define IDC_USECONNECTINGICON 1761
+#define IDC_BKGRLIST 1762
+#define IDC_EXTRA_FRAME 1762
+#define IDC_BC_STATIC 1763
+#define IDC_SC_STATIC 1764
+#define IDD_OPT_GENMENU 11267
+#define IDC_MENUITEMS 11710
+#define IDC_MENUOBJECTS 11711
+#define IDC_NOTSUPPORTWARNING 11712
+#define IDC_INSERTSEPARATOR 11715
+#define IDC_GENMENU_SERVICE 11716
+#define IDC_GENMENU_CUSTOMNAME 11717
+#define IDC_GENMENU_SET 11718
+#define IDC_GENMENU_SET2 11719
+#define IDC_GENMENU_DEFAULT 11719
+#define IDC_ICONBLINK 11720
+#define IDI_SEARCHALL 32548
+#define ID_ICQ_EXIT 40001
+#define IDM_COPY 40001
+#define ID_RESET 40002
+#define POPUP_HIDEEMPTYGROUPS 40003
+#define POPUP_NEWSUBGROUP 40004
+#define POPUP_HIDEOFFLINE 40005
+#define POPUP_GROUPHIDEOFFLINE 40006
+#define POPUP_HIDEOFFLINEROOT 40007
+#define POPUP_DISABLEGROUPS 40008
+#define IDC_SENDMESSAGE 40009
+#define IDM_COPYALL 40011
+#define IDM_SELECTALL 40012
+#define IDM_CLEAR 40013
+#define IDM_OPENNEW 40014
+#define IDM_OPENEXISTING 40015
+#define IDM_COPYLINK 40016
+#define POPUP_HIDEMIRANDA 40017
+#define ID_TRAY_HIDE 40038
+#define ID_TRAY_EXIT 40040
+#define POPUP_NEWGROUP 40050
+#define POPUP_RENAMEGROUP 40052
+#define POPUP_DELETEGROUP 40053
+
+// Next default values for new objects
+//
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NEXT_RESOURCE_VALUE 347
+#define _APS_NEXT_COMMAND_VALUE 40018
+#define _APS_NEXT_CONTROL_VALUE 1763
+#define _APS_NEXT_SYMED_VALUE 101
+#endif
+#endif
diff --git a/plugins/Mwclist/resource.rc b/plugins/Mwclist/resource.rc
new file mode 100644
index 0000000000..8e7cf8a215
--- /dev/null
+++ b/plugins/Mwclist/resource.rc
@@ -0,0 +1,926 @@
+// Microsoft Visual C++ generated resource script.
+//
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include <winres.h>
+#include "statusmodes.h"
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// Russian resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_RUS)
+#ifdef _WIN32
+LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT
+#pragma code_page(1251)
+#endif //_WIN32
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Icon
+//
+
+// Icon with lowest ID value placed first to ensure application icon
+// remains consistent on all systems.
+IDI_SMS ICON "res/sms.ico"
+IDI_ICQC1 ICON "res/1.ico"
+IDI_ICQC2 ICON "res/2.ico"
+IDI_ICQC3 ICON "res/3.ico"
+IDI_ICQC4 ICON "res/4.ico"
+IDI_ICQC5 ICON "res/5.ico"
+IDI_ICQC6 ICON "res/6.ico"
+IDI_ICQC7 ICON "res/7.ico"
+IDI_ICQC8 ICON "res/8.ico"
+IDI_EMAIL ICON "res/sendmail.ico"
+IDI_NEWGROUP2 ICON "res/addgoupp.ico"
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Dialog
+//
+
+IDD_OPT_CLCBKG2 DIALOGEX 0, 0, 234, 164
+STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_VISIBLE
+EXSTYLE WS_EX_CONTROLPARENT
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ GROUPBOX "Settings",IDC_STATIC,4,19,226,141
+ LTEXT "Background colour:",IDC_BC_STATIC,12,35,72,8,NOT
+ WS_GROUP
+ CONTROL "",IDC_BKGCOLOUR,"ColourPicker",WS_TABSTOP,84,34,32,10
+ LTEXT "Selection colour:",IDC_SC_STATIC,12,51,72,8
+ CONTROL "",IDC_SELCOLOUR,"ColourPicker",WS_TABSTOP,84,50,32,10
+ CONTROL "Use background bitmap",IDC_BITMAP,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,12,68,161,10
+ EDITTEXT IDC_FILENAME,22,82,184,12,ES_AUTOHSCROLL
+ PUSHBUTTON "...",IDC_BROWSE,208,82,15,11
+ CONTROL "Stretch to width",IDC_STRETCHH,"Button",BS_AUTOCHECKBOX |
+ WS_TABSTOP,22,99,98,10
+ CONTROL "Stretch to height",IDC_STRETCHV,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,121,99,101,10
+ CONTROL "Tile horizontally",IDC_TILEH,"Button",BS_AUTOCHECKBOX |
+ WS_TABSTOP,22,112,98,10
+ CONTROL "Tile vertically",IDC_TILEV,"Button",BS_AUTOCHECKBOX |
+ WS_TABSTOP,22,125,98,10
+ CONTROL "Scroll with text",IDC_SCROLL,"Button",BS_AUTOCHECKBOX |
+ WS_TABSTOP,121,125,100,10
+ CONTROL "Stretch proportionally",IDC_PROPORTIONAL,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,121,112,101,10
+ CONTROL "Tile vertically according to Row Height",IDC_TILEVROWH,
+ "Button",BS_AUTOCHECKBOX | WS_TABSTOP,22,140,205,10
+ COMBOBOX IDC_BKGRLIST,4,5,226,155,CBS_DROPDOWNLIST | CBS_SORT |
+ WS_VSCROLL | WS_TABSTOP
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// DESIGNINFO
+//
+
+#ifdef APSTUDIO_INVOKED
+GUIDELINES DESIGNINFO
+BEGIN
+ IDD_OPT_CLCBKG2, DIALOG
+ BEGIN
+ BOTTOMMARGIN, 149
+ END
+END
+#endif // APSTUDIO_INVOKED
+
+#endif // Russian resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+/////////////////////////////////////////////////////////////////////////////
+// English (U.S.) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
+#ifdef _WIN32
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
+#pragma code_page(1252)
+#endif //_WIN32
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Icon
+//
+
+// Icon with lowest ID value placed first to ensure application icon
+// remains consistent on all systems.
+IDI_GLOBUS ICON "res/globus.ico"
+IDI_RENAME ICON "res/rename.ico"
+IDI_DELETE ICON "res/delete.ico"
+IDI_NOTICK ICON "res/notick.ico"
+IDI_TICK ICON "res/notick1.ico"
+IDI_BLANK ICON "res/blank.ico"
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Dialog
+//
+
+IDD_OPT_GENMENU DIALOGEX 0, 0, 306, 241
+STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ CONTROL "Tree1",IDC_MENUITEMS,"SysTreeView32",TVS_SHOWSELALWAYS |
+ WS_DISABLED | WS_BORDER | WS_TABSTOP,155,15,134,200
+ CONTROL "Tree2",IDC_MENUOBJECTS,"SysTreeView32",
+ TVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,10,15,119,80
+ LTEXT "Warning!\r\nThis MenuObject not support user defined options.",
+ IDC_NOTSUPPORTWARNING,10,110,130,31,NOT WS_VISIBLE
+ GROUPBOX "MenuObjects",IDC_STATIC,5,5,133,95
+ GROUPBOX "MenuItems",IDC_STATIC,148,5,147,215
+ PUSHBUTTON "InsertSeparator",IDC_INSERTSEPARATOR,90,146,54,14,
+ WS_DISABLED
+ LTEXT "Service:",IDC_STATIC,0,166,27,8
+ EDITTEXT IDC_GENMENU_SERVICE,29,164,115,14,ES_AUTOHSCROLL |
+ WS_DISABLED
+ LTEXT "Name:",IDC_STATIC,0,183,28,8
+ EDITTEXT IDC_GENMENU_CUSTOMNAME,29,180,116,14,ES_AUTOHSCROLL |
+ WS_DISABLED
+ PUSHBUTTON "Set",IDC_GENMENU_SET,128,196,17,14,WS_DISABLED
+ PUSHBUTTON "Default",IDC_GENMENU_DEFAULT,77,196,43,14,WS_DISABLED
+END
+
+IDD_DELETECONTACT DIALOGEX 0, 0, 284, 90
+STYLE DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_FIXEDSYS |
+ DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+EXSTYLE WS_EX_CONTROLPARENT
+CAPTION "Delete Contact"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ DEFPUSHBUTTON "No",IDNO,162,38,65,14
+ PUSHBUTTON "Yes",IDYES,54,38,65,14
+ CONTROL "Hide from list only, in order to keep their history and ignore/visibility settings",
+ IDC_HIDE,"Button",BS_AUTOCHECKBOX | BS_MULTILINE |
+ WS_TABSTOP,7,65,270,9
+ LTEXT "Use Options->Ignore (expert mode) to unhide contacts.",
+ IDC_STATIC,20,78,257,8
+ CONTROL "Are you sure you want to delete %s?",IDC_TOPLINE,"Static",
+ SS_SIMPLE | SS_NOPREFIX | WS_GROUP,7,7,270,8
+ LTEXT "This will erase all history and settings for this contact!",
+ IDC_STATIC,7,18,239,14
+END
+
+IDD_OPT_CLIST DIALOGEX 0, 0, 314, 206
+STYLE DS_SETFONT | DS_FIXEDSYS | DS_CENTER | WS_CHILD
+EXSTYLE WS_EX_CONTROLPARENT
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ CONTROL "Hide offline users",IDC_HIDEOFFLINE,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,10,17,124,10
+ CONTROL "Hide empty groups",IDC_HIDEEMPTYGROUPS,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,10,33,124,10
+ CONTROL "Disable groups",IDC_DISABLEGROUPS,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,10,50,124,10
+ CONTROL "Ask before deleting contacts",IDC_CONFIRMDELETE,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,10,67,124,10
+ CONTROL "Always on top",IDC_ONTOP,"Button",BS_AUTOCHECKBOX |
+ WS_TABSTOP,10,84,124,10
+ CONTROL "Hide contact list after it has been idle for",
+ IDC_AUTOHIDE,"Button",BS_AUTOCHECKBOX | BS_TOP |
+ BS_MULTILINE | WS_TABSTOP,10,100,124,22
+ EDITTEXT IDC_HIDETIME,54,109,30,12,ES_RIGHT | ES_NUMBER
+ CONTROL "Spin1",IDC_HIDETIMESPIN,"msctls_updown32",
+ UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY |
+ UDS_ARROWKEYS | UDS_NOTHOUSANDS | UDS_HOTTRACK,75,108,10,
+ 14
+ LTEXT "seconds",IDC_STAUTOHIDESECS,87,111,47,8
+ CONTROL "Sort contacts by name",IDC_SORTBYNAME,"Button",
+ BS_AUTORADIOBUTTON | WS_GROUP,153,14,87,10
+ CONTROL "Sort contacts by status",IDC_SORTBYSTATUS,"Button",
+ BS_AUTORADIOBUTTON,153,38,89,10
+ CONTROL "Sort contacts by protocol",IDC_SORTBYPROTO,"Button",
+ BS_AUTORADIOBUTTON,153,51,151,10
+ CONTROL "Single click interface",IDC_ONECLK,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,151,82,150,10
+ CONTROL "Always show status in tooltip",IDC_ALWAYSSTATUS,"Button",
+ BS_AUTOCHECKBOX | BS_TOP | BS_MULTILINE | WS_TABSTOP,151,
+ 95,151,11
+ CONTROL "Disable icon blinking",IDC_DISABLEBLINK,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,151,108,86,9
+ EDITTEXT IDC_BLINKTIME,153,122,35,12,ES_NUMBER
+ LTEXT "ms, delay between icon blinking",IDC_STATIC,203,124,102,
+ 8
+ CONTROL "Show",IDC_DONTCYCLE,"Button",BS_AUTORADIOBUTTON |
+ WS_GROUP,10,155,97,10
+ COMBOBOX IDC_PRIMARYSTATUS,107,153,78,70,CBS_DROPDOWNLIST |
+ WS_VSCROLL | WS_TABSTOP
+ LTEXT "icon when statuses differ",IDC_STATIC,189,155,116,8,NOT
+ WS_GROUP
+ CONTROL "Cycle icons every",IDC_CYCLE,"Button",
+ BS_AUTORADIOBUTTON,10,170,97,10
+ EDITTEXT IDC_CYCLETIME,107,170,30,12,ES_RIGHT | ES_NUMBER
+ CONTROL "Spin1",IDC_CYCLETIMESPIN,"msctls_updown32",
+ UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY |
+ UDS_ARROWKEYS | UDS_NOTHOUSANDS | UDS_HOTTRACK,137,168,
+ 11,14
+ LTEXT "seconds, when statuses differ",IDC_STATIC,154,172,151,8,
+ NOT WS_GROUP
+ CONTROL "Show multiple icons",IDC_MULTITRAY,"Button",
+ BS_AUTORADIOBUTTON,9,184,98,10
+ CONTROL "Only when statuses differ",IDC_ALWAYSMULTI,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,107,184,198,10
+ GROUPBOX "Contact List",IDC_STCLISTGROUP,2,2,135,139
+ GROUPBOX "System tray icon",IDC_STATIC,143,71,169,70
+ GROUPBOX "System tray icon when using multiple protocols",
+ IDC_STATIC,2,142,310,57
+ GROUPBOX "Contact List Sorting",IDC_STATIC,143,2,169,69,WS_GROUP
+ CONTROL "Spin5",IDC_BLINKSPIN,"msctls_updown32",UDS_SETBUDDYINT |
+ UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_NOTHOUSANDS |
+ UDS_HOTTRACK,177,109,11,12
+ CONTROL "Dont move offline user to bottom",IDC_NOOFFLINEMOVE,
+ "Button",BS_AUTOCHECKBOX | WS_TABSTOP,168,26,131,10
+ CONTROL "Pin to desktop",IDC_ONDESKTOP,"Button",BS_AUTOCHECKBOX |
+ WS_TABSTOP,10,120,125,15
+ CONTROL "Disable icon blinking",IDC_ICONBLINK,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,10,84,97,10
+END
+
+IDD_OPT_CLUI DIALOGEX 0, 0, 313, 232
+STYLE DS_SETFONT | DS_FIXEDSYS | DS_CENTER | WS_CHILD
+EXSTYLE WS_EX_CONTROLPARENT
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ GROUPBOX "Window",IDC_STWINDOWGROUP,4,4,305,121
+ CONTROL "Always on top",IDC_ONTOP,"Button",BS_AUTOCHECKBOX |
+ WS_TABSTOP,13,18,128,10
+ CONTROL "Tool style main window",IDC_TOOLWND,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,13,32,128,10
+ CONTROL "Minimize to tray",IDC_MIN2TRAY,"Button",BS_AUTOCHECKBOX |
+ WS_TABSTOP,13,46,128,10
+ CONTROL "Hide contact list after it has been idle for",
+ IDC_AUTOHIDE,"Button",BS_AUTOCHECKBOX | BS_TOP |
+ BS_MULTILINE | WS_TABSTOP,141,18,162,10
+ EDITTEXT IDC_HIDETIME,151,33,30,12,ES_RIGHT | ES_NUMBER
+ CONTROL "Spin1",IDC_HIDETIMESPIN,"msctls_updown32",
+ UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY |
+ UDS_ARROWKEYS | UDS_NOTHOUSANDS | UDS_HOTTRACK,172,32,10,
+ 14
+ LTEXT "seconds",IDC_STATIC01,186,35,56,8
+ CONTROL "Automatically resize window to height of list",
+ IDC_AUTOSIZE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,141,
+ 55,162,10
+ LTEXT "maximum",IDC_STATIC21,151,71,45,8
+ EDITTEXT IDC_MAXSIZEHEIGHT,197,69,31,12,ES_RIGHT | ES_AUTOHSCROLL |
+ ES_NUMBER
+ CONTROL "Spin1",IDC_MAXSIZESPIN,"msctls_updown32",
+ UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY |
+ UDS_ARROWKEYS | UDS_HOTTRACK,218,68,10,14
+ LTEXT "% of screen",IDC_STATIC22,230,71,69,8
+ CONTROL "Size upwards",IDC_AUTOSIZEUPWARD,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,151,86,147,10
+ LTEXT "Title bar text:",IDC_STATIC,12,106,51,8
+ GROUPBOX "Translucency options (Windows 2000/XP only)",IDC_STATIC,
+ 4,130,191,80
+ CONTROL "Fade contact list in/out",IDC_FADEINOUT,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,13,140,163,10
+ CONTROL "Transparent contact list",IDC_TRANSPARENT,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,13,152,151,9
+ LTEXT "Inactive opacity:",IDC_STATIC11,23,165,67,8
+ CONTROL "Slider2",IDC_TRANSINACTIVE,"msctls_trackbar32",TBS_TOP |
+ TBS_NOTICKS | WS_TABSTOP,95,164,70,11
+ LTEXT "Active opacity:",IDC_STATIC12,23,181,67,8
+ CONTROL "Slider2",IDC_TRANSACTIVE,"msctls_trackbar32",TBS_TOP |
+ TBS_NOTICKS | WS_TABSTOP,95,179,70,11
+ LTEXT "000%",IDC_INACTIVEPERC,165,164,25,8,SS_NOPREFIX
+ LTEXT "000%",IDC_ACTIVEPERC,165,184,25,8,SS_NOPREFIX
+ CONTROL "Show menu bar",IDC_SHOWMAINMENU,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,13,60,128,10
+ CONTROL "Easy move",IDC_CLIENTDRAG,"Button",BS_AUTOCHECKBOX |
+ WS_TABSTOP,13,74,128,10
+ CONTROL "Show title bar",IDC_SHOWCAPTION,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,13,88,128,10
+ CONTROL "If window is partially covered, bring to front instead of hiding",
+ IDC_BRINGTOFRONT,"Button",BS_AUTOCHECKBOX | BS_MULTILINE |
+ WS_TABSTOP,141,102,162,16
+ EDITTEXT IDC_TITLETEXT,63,104,72,12,ES_AUTOHSCROLL
+ CONTROL "Enable drop shadow (restart required)",IDC_DROPSHADOW,
+ "Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,194,138,10
+ GROUPBOX "Contact List Extra Icons",IDC_EXTRA_FRAME,200,130,110,
+ 91
+ CONTROL "Protocol Type",IDC_EXTRA_PROTO,"Button",BS_AUTOCHECKBOX |
+ WS_TABSTOP,210,143,70,10
+ CONTROL "E-mail",IDC_EXTRA_EMAIL,"Button",BS_AUTOCHECKBOX |
+ WS_TABSTOP,210,166,75,10
+ CONTROL "Cellular",IDC_EXTRA_CELLULAR,"Button",BS_AUTOCHECKBOX |
+ WS_TABSTOP,210,178,92,10
+ CONTROL "Advanced #2",IDC_EXTRA_ADV2,"Button",BS_AUTOCHECKBOX |
+ WS_TABSTOP,210,191,92,10
+ CONTROL "Advanced #1",IDC_EXTRA_ADV1,"Button",BS_AUTOCHECKBOX |
+ WS_TABSTOP,210,204,92,10
+ LTEXT "!!! Note: all client icons are made by Angeli-ka, and I have her permission to use them in clist_mw plugin.",
+ IDC_STATIC,5,210,190,20
+ CONTROL "Homepage",IDC_EXTRA_WEB,"Button",BS_AUTOCHECKBOX |
+ WS_TABSTOP,210,154,75,10
+END
+
+IDD_OPT_CLC DIALOGEX 0, 0, 314, 251
+STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_VISIBLE
+EXSTYLE WS_EX_CONTROLPARENT
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ GROUPBOX "Items",IDC_STATIC,2,2,310,114
+ CONTROL "Show divider between online and offline contacts",
+ IDC_DIVIDERONOFF,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,
+ 11,13,179,10
+ CONTROL "Hot track items as mouse passes over",IDC_TRACKSELECT,
+ "Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,28,179,10
+ CONTROL "Disable drag and drop of items",IDC_DISABLEDRAGDROP,
+ "Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,43,179,10
+ CONTROL "Disable rename of items by clicking twice",
+ IDC_NOTEDITLABELS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,
+ 11,58,179,10
+ CONTROL "Show selection even when list is not focused",
+ IDC_SHOWSELALWAYS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,
+ 11,73,179,10
+ CONTROL "Make selection highlight translucent",
+ IDC_NOTNOTRANSLUCENTSEL,"Button",BS_AUTOCHECKBOX |
+ WS_TABSTOP,11,88,179,10
+ LTEXT "'Hide Offline' means to hide:",IDC_STATIC,191,10,112,8
+ CONTROL "Tree1",IDC_HIDEOFFLINEOPTS,"SysTreeView32",
+ TVS_DISABLEDRAGDROP | TVS_NOTOOLTIPS | WS_BORDER |
+ WS_TABSTOP | 0x4000,191,20,112,80
+ GROUPBOX "Groups",IDC_STATIC,2,120,148,121
+ CONTROL "Draw a line alongside group names",IDC_LINEWITHGROUPS,
+ "Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,11,
+ 129,131,16
+ CONTROL "Show counts of number of contacts in a group",
+ IDC_SHOWGROUPCOUNTS,"Button",BS_AUTOCHECKBOX |
+ BS_MULTILINE | WS_TABSTOP,11,147,131,16
+ CONTROL "Hide group counts when there are none online",
+ IDC_HIDECOUNTSWHENEMPTY,"Button",BS_AUTOCHECKBOX |
+ BS_MULTILINE | WS_TABSTOP,11,165,131,16
+ CONTROL "Sort groups alphabetically",IDC_SORTGROUPSALPHA,"Button",
+ BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,11,183,131,
+ 16
+ CONTROL "Quicksearch in open groups only",IDC_QUICKSEARCHVISONLY,
+ "Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,11,
+ 201,131,16
+ LTEXT "Indent groups by:",IDC_STATIC,11,221,67,8
+ EDITTEXT IDC_GROUPINDENT,78,219,31,12,ES_RIGHT | ES_NUMBER
+ CONTROL "Spin1",IDC_GROUPINDENTSPIN,"msctls_updown32",
+ UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY |
+ UDS_ARROWKEYS | UDS_NOTHOUSANDS | UDS_HOTTRACK,95,215,10,
+ 14
+ LTEXT "pixels",IDC_STATIC,112,221,36,8
+ GROUPBOX "Visual",IDC_STATIC,156,120,156,121
+ CONTROL "Scroll list smoothly",IDC_NOTNOSMOOTHSCROLLING,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,164,130,139,10
+ LTEXT "Time:",IDC_STATIC11,174,144,42,8
+ EDITTEXT IDC_SMOOTHTIME,216,142,31,12,ES_RIGHT | ES_NUMBER
+ CONTROL "Spin1",IDC_SMOOTHTIMESPIN,"msctls_updown32",
+ UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY |
+ UDS_ARROWKEYS | UDS_NOTHOUSANDS | UDS_HOTTRACK,237,137,
+ 10,14
+ LTEXT "milliseconds",IDC_STATIC12,250,140,56,8,SS_CENTERIMAGE
+ LTEXT "Left margin:",IDC_STATIC,165,180,52,8
+ EDITTEXT IDC_LEFTMARGIN,215,180,31,12,ES_RIGHT | ES_NUMBER
+ CONTROL "Spin1",IDC_LEFTMARGINSPIN,"msctls_updown32",
+ UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY |
+ UDS_ARROWKEYS | UDS_NOTHOUSANDS | UDS_HOTTRACK,240,180,
+ 10,14
+ LTEXT "pixels",IDC_STATIC,250,180,54,8
+ CONTROL "Grey out entire list when:",IDC_GREYOUT,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,165,195,139,10
+ CONTROL "Tree1",IDC_GREYOUTOPTS,"SysTreeView32",
+ TVS_DISABLEDRAGDROP | TVS_NOTOOLTIPS | WS_BORDER |
+ WS_TABSTOP | 0x4000,165,205,139,30
+ CONTROL "Dim idle contacts",IDC_IDLE,"Button",BS_AUTOCHECKBOX |
+ WS_TABSTOP,11,102,153,10
+ CONTROL "Hide vertical scrollbar",IDC_NOSCROLLBAR,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,165,160,140,10
+END
+
+IDD_OPT_CLCTEXT DIALOGEX 0, 0, 277, 256
+STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_VISIBLE
+EXSTYLE WS_EX_CONTROLPARENT
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ GROUPBOX "Fonts",IDC_STATIC,5,5,269,125
+ COMBOBOX IDC_FONTID,12,17,253,87,CBS_DROPDOWNLIST | WS_VSCROLL |
+ WS_TABSTOP
+ LTEXT "same",IDC_STSAMETEXT,19,32,45,10,SS_CENTERIMAGE
+ CONTROL "Typeface",IDC_SAMETYPE,"Button",BS_AUTOCHECKBOX |
+ WS_TABSTOP,64,32,52,10
+ CONTROL "Size",IDC_SAMESIZE,"Button",BS_AUTOCHECKBOX |
+ WS_TABSTOP,117,32,45,10
+ CONTROL "Style",IDC_SAMESTYLE,"Button",BS_AUTOCHECKBOX |
+ WS_TABSTOP,163,32,48,10
+ CONTROL "Colour",IDC_SAMECOLOUR,"Button",BS_AUTOCHECKBOX |
+ WS_TABSTOP,212,32,53,10
+ LTEXT "as:",IDC_STASTEXT,19,46,45,10,SS_CENTERIMAGE
+ COMBOBOX IDC_SAMEAS,64,45,196,88,CBS_DROPDOWNLIST | WS_VSCROLL |
+ WS_TABSTOP
+ CONTROL "",IDC_STHORZBAR,"Static",SS_ETCHEDFRAME,9,60,259,5
+ COMBOBOX IDC_TYPEFACE,12,72,136,182,CBS_DROPDOWN | CBS_SORT |
+ WS_VSCROLL | WS_TABSTOP
+ COMBOBOX IDC_SCRIPT,156,72,60,68,CBS_DROPDOWNLIST | WS_VSCROLL |
+ WS_TABSTOP
+ COMBOBOX IDC_FONTSIZE,225,72,40,69,CBS_DROPDOWN | WS_VSCROLL |
+ WS_TABSTOP
+ CONTROL "Bold",IDC_BOLD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,
+ 88,45,10
+ CONTROL "Italic",IDC_ITALIC,"Button",BS_AUTOCHECKBOX |
+ WS_TABSTOP,65,88,52,10
+ CONTROL "Underline",IDC_UNDERLINE,"Button",BS_AUTOCHECKBOX |
+ WS_TABSTOP,117,88,66,10
+ CONTROL "",IDC_COLOUR,"ColourPicker",WS_TABSTOP,206,87,59,12
+ EDITTEXT IDC_SAMPLE,63,104,151,16,ES_CENTER | ES_READONLY | NOT
+ WS_TABSTOP
+ GROUPBOX "Rows",IDC_STATIC,4,134,269,31
+ LTEXT "Row height:",IDC_STATIC,12,148,65,8
+ EDITTEXT IDC_ROWHEIGHT,77,146,31,12,ES_RIGHT | ES_NUMBER
+ CONTROL "Spin1",IDC_ROWHEIGHTSPIN,"msctls_updown32",
+ UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY |
+ UDS_ARROWKEYS | UDS_NOTHOUSANDS | UDS_HOTTRACK,97,145,10,
+ 14
+ LTEXT "pixels",IDC_STATIC,112,148,62,8
+ GROUPBOX "Additional Colours",IDC_STATIC,4,171,121,79
+ LTEXT "Selected text:",IDC_STATIC,12,186,65,8
+ CONTROL "",IDC_SELCOLOUR,"ColourPicker",WS_TABSTOP,77,184,29,12
+ LTEXT "Hottrack text:",IDC_STATIC,12,201,65,8
+ CONTROL "",IDC_HOTCOLOUR,"ColourPicker",WS_TABSTOP,77,199,29,12
+ CONTROL "Gamma correction",IDC_GAMMACORRECT,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,12,235,95,10
+ LTEXT "Quicksearch text:",IDC_STATIC,12,218,65,8
+ CONTROL "",IDC_QUICKCOLOUR,"ColourPicker",WS_TABSTOP,77,216,29,
+ 12
+ LTEXT "Size:",IDC_STSIZETEXT,231,114,34,8,NOT WS_VISIBLE
+ LTEXT "Colour:",IDC_STCOLOURTEXT,228,102,37,8,NOT WS_VISIBLE
+ GROUPBOX "Selection Mode",IDC_STATIC,130,171,144,79
+ CONTROL "Default",IDC_HILIGHTMODE,"Button",BS_AUTORADIOBUTTON,
+ 145,185,120,10
+ CONTROL "Less selection",IDC_HILIGHTMODE2,"Button",
+ BS_AUTORADIOBUTTON,145,215,120,10
+ CONTROL "Full selection",IDC_HILIGHTMODE1,"Button",
+ BS_AUTORADIOBUTTON,145,200,120,10
+ CONTROL "No selection",IDC_HILIGHTMODE3,"Button",
+ BS_AUTORADIOBUTTON,145,230,120,10
+END
+
+IDD_OPT_CLCBKG DIALOGEX 0, 0, 235, 151
+STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_VISIBLE
+EXSTYLE WS_EX_CONTROLPARENT
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ GROUPBOX "Contact List Background",IDC_STATIC,4,4,227,141
+ LTEXT "Background colour:",IDC_STATIC,12,20,72,8,NOT WS_GROUP
+ CONTROL "",IDC_BKGCOLOUR,"ColourPicker",WS_TABSTOP,84,19,32,10
+ LTEXT "Selection colour:",IDC_STATIC,12,36,72,8
+ CONTROL "",IDC_SELCOLOUR,"ColourPicker",WS_TABSTOP,84,35,32,10
+ CONTROL "Use background bitmap",IDC_BITMAP,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,12,53,161,10
+ EDITTEXT IDC_FILENAME,22,67,184,12,ES_AUTOHSCROLL
+ PUSHBUTTON "...",IDC_BROWSE,208,67,15,11
+ CONTROL "Stretch to width",IDC_STRETCHH,"Button",BS_AUTOCHECKBOX |
+ WS_TABSTOP,22,84,100,10
+ CONTROL "Stretch to height",IDC_STRETCHV,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,121,84,101,10
+ CONTROL "Tile horizontally",IDC_TILEH,"Button",BS_AUTOCHECKBOX |
+ WS_TABSTOP,22,97,93,10
+ CONTROL "Tile vertically",IDC_TILEV,"Button",BS_AUTOCHECKBOX |
+ WS_TABSTOP,22,110,85,10
+ CONTROL "Scroll with text",IDC_SCROLL,"Button",BS_AUTOCHECKBOX |
+ WS_TABSTOP,121,110,100,10
+ CONTROL "Stretch proportionally",IDC_PROPORTIONAL,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,121,97,101,10
+ CONTROL "Tile vertically according to Row Height",IDC_TILEVROWH,
+ "Button",BS_AUTOCHECKBOX | WS_TABSTOP,22,125,205,10
+END
+
+IDD_OPT_CLCTEXTSIMPLE DIALOGEX 0, 0, 277, 240
+STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_VISIBLE
+EXSTYLE WS_EX_CONTROLPARENT
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ GROUPBOX "Fonts",IDC_STATIC,4,4,269,125
+ COMBOBOX IDC_FONTID,12,17,253,87,CBS_DROPDOWNLIST | WS_VSCROLL |
+ WS_TABSTOP
+ LTEXT "as:",IDC_STASTEXT,25,34,52,10,SS_CENTERIMAGE
+ COMBOBOX IDC_SAMEAS,77,33,163,88,CBS_DROPDOWNLIST | WS_VSCROLL |
+ WS_TABSTOP
+ CONTROL "",IDC_STHORZBAR,"Static",SS_ETCHEDHORZ,9,51,259,1
+ COMBOBOX IDC_TYPEFACE,12,58,172,182,CBS_DROPDOWN | CBS_SORT |
+ WS_VSCROLL | WS_TABSTOP
+ COMBOBOX IDC_SCRIPT,192,58,73,68,CBS_DROPDOWNLIST | WS_VSCROLL |
+ WS_TABSTOP
+ LTEXT "Size:",IDC_STSIZETEXT,33,76,34,8
+ COMBOBOX IDC_FONTSIZE,67,74,54,69,CBS_DROPDOWN | WS_VSCROLL |
+ WS_TABSTOP
+ LTEXT "Colour:",IDC_STCOLOURTEXT,147,76,37,8
+ CONTROL "",IDC_COLOUR,"ColourPicker",WS_TABSTOP,184,74,59,12
+ CONTROL "Bold",IDC_BOLD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,58,
+ 90,45,10
+ CONTROL "Italic",IDC_ITALIC,"Button",BS_AUTOCHECKBOX |
+ WS_TABSTOP,117,90,52,10
+ CONTROL "Underline",IDC_UNDERLINE,"Button",BS_AUTOCHECKBOX |
+ WS_TABSTOP,179,90,66,10
+ EDITTEXT IDC_SAMPLE,63,104,151,16,ES_CENTER | ES_READONLY | NOT
+ WS_TABSTOP
+ GROUPBOX "Rows",IDC_STATIC,4,134,269,31
+ LTEXT "Row height:",IDC_STATIC,12,148,65,8
+ EDITTEXT IDC_ROWHEIGHT,77,146,31,12,ES_RIGHT | ES_NUMBER
+ CONTROL "Spin1",IDC_ROWHEIGHTSPIN,"msctls_updown32",
+ UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY |
+ UDS_ARROWKEYS | UDS_NOTHOUSANDS | UDS_HOTTRACK,97,145,10,
+ 14
+ LTEXT "pixels",IDC_STATIC,112,148,62,8
+ GROUPBOX "Additional Colours",IDC_STATIC,4,171,269,65
+ LTEXT "Selected text:",IDC_STATIC,12,186,65,8
+ CONTROL "",IDC_SELCOLOUR,"ColourPicker",WS_TABSTOP,77,184,29,12
+ LTEXT "Hottrack text:",IDC_STATIC,12,202,65,8
+ CONTROL "",IDC_HOTCOLOUR,"ColourPicker",WS_TABSTOP,77,200,29,12
+ LTEXT "Quicksearch text:",IDC_STATIC,12,218,65,8
+ CONTROL "",IDC_QUICKCOLOUR,"ColourPicker",WS_TABSTOP,77,216,29,
+ 12
+END
+
+IDD_OPT_META_CLC DIALOGEX 0, 0, 259, 97
+STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_VISIBLE
+EXSTYLE WS_EX_CONTROLPARENT
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ CONTROL "Use 'Meta' protocol icons for Metacontacts",IDC_META,
+ "Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,13,233,10
+ CONTROL "Avoid doubleclick expand",IDC_METADBLCLK,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,11,29,233,10
+ CONTROL "Hide all 'Extra icons' for subcontacts",
+ IDC_METASUBEXTRA,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,
+ 11,45,233,10
+ GROUPBOX "MetaContacts supporting",-1,2,2,252,90
+ CONTROL "Ignore Empty Extra icons places (arrange to right).",
+ IDC_METASUBEXTRA_IGN,"Button",BS_AUTOCHECKBOX |
+ WS_TABSTOP,11,75,233,10
+ CONTROL "Hide offline subcontacts.",IDC_METASUB_HIDEOFFLINE,
+ "Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,60,233,10
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// DESIGNINFO
+//
+
+#ifdef APSTUDIO_INVOKED
+GUIDELINES DESIGNINFO
+BEGIN
+ IDD_DELETECONTACT, DIALOG
+ BEGIN
+ LEFTMARGIN, 7
+ RIGHTMARGIN, 277
+ TOPMARGIN, 7
+ BOTTOMMARGIN, 85
+ END
+
+ IDD_OPT_CLIST, DIALOG
+ BEGIN
+ LEFTMARGIN, 2
+ RIGHTMARGIN, 312
+ VERTGUIDE, 10
+ VERTGUIDE, 107
+ TOPMARGIN, 2
+ BOTTOMMARGIN, 204
+ HORZGUIDE, 182
+ HORZGUIDE, 196
+ END
+
+ IDD_OPT_CLUI, DIALOG
+ BEGIN
+ LEFTMARGIN, 4
+ RIGHTMARGIN, 309
+ VERTGUIDE, 13
+ VERTGUIDE, 23
+ VERTGUIDE, 112
+ VERTGUIDE, 141
+ VERTGUIDE, 151
+ VERTGUIDE, 175
+ VERTGUIDE, 242
+ VERTGUIDE, 246
+ TOPMARGIN, 4
+ BOTTOMMARGIN, 228
+ HORZGUIDE, 18
+ HORZGUIDE, 39
+ HORZGUIDE, 75
+ HORZGUIDE, 180
+ HORZGUIDE, 196
+ END
+
+ IDD_OPT_CLC, DIALOG
+ BEGIN
+ LEFTMARGIN, 2
+ RIGHTMARGIN, 312
+ VERTGUIDE, 11
+ VERTGUIDE, 164
+ VERTGUIDE, 216
+ TOPMARGIN, 2
+ BOTTOMMARGIN, 249
+ HORZGUIDE, 145
+ HORZGUIDE, 163
+ HORZGUIDE, 222
+ END
+
+ IDD_OPT_CLCTEXT, DIALOG
+ BEGIN
+ LEFTMARGIN, 4
+ RIGHTMARGIN, 273
+ VERTGUIDE, 12
+ VERTGUIDE, 19
+ VERTGUIDE, 77
+ VERTGUIDE, 258
+ VERTGUIDE, 265
+ TOPMARGIN, 4
+ BOTTOMMARGIN, 252
+ HORZGUIDE, 37
+ HORZGUIDE, 51
+ HORZGUIDE, 79
+ HORZGUIDE, 94
+ HORZGUIDE, 152
+ HORZGUIDE, 190
+ HORZGUIDE, 205
+ HORZGUIDE, 222
+ END
+
+ IDD_OPT_CLCBKG, DIALOG
+ BEGIN
+ LEFTMARGIN, 4
+ RIGHTMARGIN, 231
+ VERTGUIDE, 12
+ VERTGUIDE, 22
+ VERTGUIDE, 122
+ TOPMARGIN, 4
+ BOTTOMMARGIN, 147
+ HORZGUIDE, 24
+ HORZGUIDE, 40
+ HORZGUIDE, 73
+ HORZGUIDE, 89
+ HORZGUIDE, 102
+ HORZGUIDE, 115
+ END
+
+ IDD_OPT_CLCTEXTSIMPLE, DIALOG
+ BEGIN
+ LEFTMARGIN, 4
+ RIGHTMARGIN, 273
+ VERTGUIDE, 12
+ VERTGUIDE, 19
+ VERTGUIDE, 77
+ VERTGUIDE, 258
+ VERTGUIDE, 265
+ TOPMARGIN, 4
+ BOTTOMMARGIN, 236
+ HORZGUIDE, 37
+ HORZGUIDE, 64
+ HORZGUIDE, 80
+ HORZGUIDE, 95
+ HORZGUIDE, 152
+ HORZGUIDE, 190
+ HORZGUIDE, 206
+ HORZGUIDE, 222
+ END
+
+ IDD_OPT_META_CLC, DIALOG
+ BEGIN
+ LEFTMARGIN, 2
+ RIGHTMARGIN, 257
+ VERTGUIDE, 11
+ VERTGUIDE, 244
+ TOPMARGIN, 2
+ BOTTOMMARGIN, 92
+ END
+END
+#endif // APSTUDIO_INVOKED
+
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE
+BEGIN
+ "resource.h\0"
+END
+
+2 TEXTINCLUDE
+BEGIN
+ "#include <windows.h>\r\n"
+ "#include <winres.h>\r\n"
+ "#include ""statusmodes.h""\r\n"
+ "\0"
+END
+
+3 TEXTINCLUDE
+BEGIN
+ "\r\n"
+ "\0"
+END
+
+#endif // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Cursor
+//
+
+IDC_HYPERLINKHAND CURSOR "res/hyperlin.cur"
+IDC_DROP CURSOR "res/dragcopy.cur"
+IDC_DROPUSER CURSOR "res/dropuser.cur"
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Menu
+//
+
+IDR_CLISTMENU MENU
+BEGIN
+ POPUP "&¤"
+ BEGIN
+ MENUITEM SEPARATOR
+ MENUITEM "E&xit", ID_ICQ_EXIT
+ END
+ POPUP "&Status"
+ BEGIN
+ MENUITEM "&Offline\tCtrl+0", ID_STATUS_OFFLINE, CHECKED
+ MENUITEM "On&line\tCtrl+1", ID_STATUS_ONLINE
+ MENUITEM "&Away\tCtrl+2", ID_STATUS_AWAY
+ MENUITEM "&NA\tCtrl+3", ID_STATUS_NA
+ MENUITEM "Occ&upied\tCtrl+4", ID_STATUS_OCCUPIED
+ MENUITEM "&DND\tCtrl+5", ID_STATUS_DND
+ MENUITEM "&Free for chat\tCtrl+6", ID_STATUS_FREECHAT
+ MENUITEM "&Invisible\tCtrl+7", ID_STATUS_INVISIBLE
+ MENUITEM "On the &Phone\tCtrl+8", ID_STATUS_ONTHEPHONE
+ MENUITEM "Out to &Lunch\tCtrl+9", ID_STATUS_OUTTOLUNCH
+ END
+END
+
+IDR_CONTEXT MENU
+BEGIN
+ POPUP "Tray"
+ BEGIN
+ MENUITEM "&Hide/Show", ID_TRAY_HIDE
+ MENUITEM SEPARATOR
+ MENUITEM "E&xit", ID_TRAY_EXIT
+ END
+ POPUP "Nowhere"
+ BEGIN
+ MENUITEM "&New Group", POPUP_NEWGROUP
+ MENUITEM SEPARATOR
+ MENUITEM "&Hide Offline Users", POPUP_HIDEOFFLINE
+ MENUITEM "Hide &Offline Users out here", POPUP_HIDEOFFLINEROOT
+ MENUITEM "Hide &Empty Groups", POPUP_HIDEEMPTYGROUPS
+ MENUITEM "Disable &Groups", POPUP_DISABLEGROUPS
+ MENUITEM SEPARATOR
+ MENUITEM "Hide Miranda", POPUP_HIDEMIRANDA
+ END
+ POPUP "Group"
+ BEGIN
+ MENUITEM "&New Subgroup", POPUP_NEWSUBGROUP
+ MENUITEM "&Hide Offline Users in here", POPUP_GROUPHIDEOFFLINE
+ MENUITEM SEPARATOR
+ MENUITEM "&Rename Group", POPUP_RENAMEGROUP
+ MENUITEM "&Delete Group", POPUP_DELETEGROUP
+ END
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Version
+//
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION 0,3,4,0
+ PRODUCTVERSION 0,3,4,0
+ FILEFLAGSMASK 0x3fL
+#ifdef _DEBUG
+ FILEFLAGS 0x1L
+#else
+ FILEFLAGS 0x0L
+#endif
+ FILEOS 0x40004L
+ FILETYPE 0x1L
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "000004b0"
+ BEGIN
+ VALUE "Comments", "Licensed under the terms of the GNU General Public License"
+ VALUE "CompanyName", " "
+ VALUE "FileDescription", "Miranda IM Contact List"
+ VALUE "FileVersion", "0.3.4 alpha"
+ VALUE "InternalName", "mwclist"
+ VALUE "LegalCopyright", "Copyright © 2000-2006 Richard Hughes, Roland Rabien, Tristan Van de Vreede, Martin Oberg, Robert Rainwater, Sam Kothari and Lyon Lim"
+ VALUE "OriginalFilename", "mwclist.dll"
+ VALUE "ProductName", "Miranda IM Contact List"
+ VALUE "ProductVersion", "0.3.4 alpha"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x0, 1200
+ END
+END
+
+#endif // English (U.S.) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+/////////////////////////////////////////////////////////////////////////////
+// English (Canada) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENC)
+#ifdef _WIN32
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_CAN
+#pragma code_page(1252)
+#endif //_WIN32
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Dialog
+//
+
+IDD_OPT_SBAR DIALOGEX 0, 0, 178, 211
+STYLE DS_SETFONT | DS_FIXEDSYS | DS_CENTER | WS_CHILD
+EXSTYLE WS_EX_CONTROLPARENT
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ GROUPBOX "Status Bar",IDC_STATIC,4,4,170,201
+ CONTROL "Show status bar",IDC_SHOWSBAR,"Button",BS_AUTOCHECKBOX |
+ WS_TABSTOP,12,17,152,10
+ CONTROL "Show icons",IDC_SHOWICON,"Button",BS_AUTOCHECKBOX |
+ WS_TABSTOP,20,35,142,10
+ CONTROL "Show protocol names",IDC_SHOWPROTO,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,20,47,142,10
+ CONTROL "Show status text",IDC_SHOWSTATUS,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,20,59,142,10
+ CONTROL "Right click opens status menu",IDC_RIGHTSTATUS,"Button",
+ BS_AUTORADIOBUTTON,20,111,142,10
+ CONTROL "Right click opens Miranda menu",IDC_RIGHTMIRANDA,"Button",
+ BS_AUTORADIOBUTTON,20,122,142,10
+ CONTROL "Make sections equal width",IDC_EQUALSECTIONS,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,20,141,142,10
+ CONTROL "",IDC_BKGCOLOUR,"ColourPicker",WS_TABSTOP,100,175,32,10
+ LTEXT "Background colour:",IDC_STATIC,20,175,72,8,NOT WS_GROUP
+ PUSHBUTTON "-",IDC_DEFBKCOLOR,135,175,6,10
+ CONTROL "Show size grip",IDC_SHOWSIZEGRIP,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,20,72,142,10
+ CONTROL "Show bevel effect on panels",IDC_SBPANELBEVEL,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,20,86,107,10
+ CONTROL "Use connecting Icon",IDC_USECONNECTINGICON,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,20,97,82,10
+ CONTROL "Use New Drawer for StatusBar",IDC_USEOWNERDRAW,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,20,160,142,10
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// DESIGNINFO
+//
+
+#ifdef APSTUDIO_INVOKED
+GUIDELINES DESIGNINFO
+BEGIN
+ IDD_OPT_SBAR, DIALOG
+ BEGIN
+ LEFTMARGIN, 4
+ RIGHTMARGIN, 174
+ VERTGUIDE, 12
+ VERTGUIDE, 22
+ VERTGUIDE, 164
+ TOPMARGIN, 4
+ BOTTOMMARGIN, 207
+ HORZGUIDE, 33
+ HORZGUIDE, 73
+ END
+END
+#endif // APSTUDIO_INVOKED
+
+#endif // English (Canada) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+
+/////////////////////////////////////////////////////////////////////////////
+#endif // not APSTUDIO_INVOKED
+
diff --git a/plugins/Mwclist/statusmodes.h b/plugins/Mwclist/statusmodes.h
new file mode 100644
index 0000000000..72c8175e37
--- /dev/null
+++ b/plugins/Mwclist/statusmodes.h
@@ -0,0 +1,40 @@
+/*
+
+Miranda IM: the free IM client for Microsoft* Windows*
+
+Copyright 2000-2003 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.
+*/
+//add 1 to ID_STATUS_CONNECTING to mark retries (v0.1.0.1+)
+//eg ID_STATUS_CONNECTING+2 is the third connection attempt, or the second retry
+#define ID_STATUS_CONNECTING 1
+//max retries is just a marker so that the clist knows what numbers represent
+//retries. It does not set any kind of limit on the number of retries you can
+//and/or should do.
+#define MAX_CONNECT_RETRIES 10000
+#define ID_STATUS_OFFLINE 40071
+#define ID_STATUS_ONLINE 40072
+#define ID_STATUS_AWAY 40073
+#define ID_STATUS_DND 40074
+#define ID_STATUS_NA 40075
+#define ID_STATUS_OCCUPIED 40076
+#define ID_STATUS_FREECHAT 40077
+#define ID_STATUS_INVISIBLE 40078
+#define ID_STATUS_ONTHEPHONE 40079
+#define ID_STATUS_OUTTOLUNCH 40080
+#define ID_STATUS_IDLE 40081 /* do not use as a status */