#include "common.h" #define OFFSET_PROTOPOS 200 #define OFFSET_VISIBLE 400 extern HINSTANCE hInst; struct OrderData { int dragging; HTREEITEM hDragItem; }; char *MyDbGetString(HANDLE hContact, const char *szModule, const char *szSetting) { char *str = NULL; DBVARIANT dbv; DBGetContactSetting(hContact, szModule, szSetting, &dbv); if (dbv.type == DBVT_ASCIIZ) str = strdup(dbv.pszVal); DBFreeVariant(&dbv); return str; } int CheckButtonOrder() { bool protochanged = FALSE; char buf[10]; char buf2[10]; int StoredButCount = DBGetContactSettingByte(0, TTB_OPTDIR, "ButCount", -1); if (StoredButCount == -1) protochanged = TRUE; if (protochanged) { //reseting all settings; PROTOCOLDESCRIPTOR **protos; int count; CallService(MS_PROTO_ENUMPROTOCOLS, (WPARAM)&count, (LPARAM)&protos); int v = 0; for (int i = 0;itype != PROTOTYPE_PROTOCOL || CallProtoService(protos[i]->szName, PS_GETCAPS, PFLAGNUM_2, 0) == 0) continue; itoa(v, buf, 10); DBWriteContactSettingString(0, "Protocols", buf, protos[i]->szName); itoa(OFFSET_VISIBLE+v, buf, 10);//save default visible status DBWriteContactSettingByte(0, "Protocols", buf, 1); v++; } DBWriteContactSettingByte(0, TTB_OPTDIR, "ButCount", v); return 1; } return 0; } static BOOL CALLBACK ProtocolOrderOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { ProtocolOrderData *dat = (ProtocolOrderData*)GetWindowLongPtr(GetDlgItem(hwndDlg, IDC_PROTOCOLORDER), GWL_USERDATA); switch (msg) { case WM_INITDIALOG: { PROTOCOLDESCRIPTOR **protos; TVINSERTSTRUCT tvis; ProtocolData *PD; char szName[64]; char *szSTName; char buf[10]; int i, count; dat = (struct ProtocolOrderData*)malloc(sizeof(struct ProtocolOrderData)); SetWindowLongPtr(GetDlgItem(hwndDlg, IDC_PROTOCOLORDER), GWL_USERDATA, (LONG)dat); dat->dragging = 0; SetWindowLongPtr(GetDlgItem(hwndDlg, IDC_PROTOCOLVISIBILITY), GWL_STYLE, GetWindowLongPtr(GetDlgItem(hwndDlg, IDC_PROTOCOLVISIBILITY), GWL_STYLE)|TVS_NOHSCROLL); SetWindowLongPtr(GetDlgItem(hwndDlg, IDC_PROTOCOLORDER), GWL_STYLE, GetWindowLongPtr(GetDlgItem(hwndDlg, IDC_PROTOCOLORDER), GWL_STYLE)|TVS_NOHSCROLL); { HIMAGELIST himlCheckBoxes; himlCheckBoxes = ImageList_Create(GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), ILC_COLOR4|ILC_MASK, 2, 2); ImageList_AddIcon(himlCheckBoxes, LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_NOTICK))); ImageList_AddIcon(himlCheckBoxes, LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_TICK))); TreeView_SetImageList(GetDlgItem(hwndDlg, IDC_PROTOCOLVISIBILITY), himlCheckBoxes, TVSIL_NORMAL); // TreeView_SetImageList(GetDlgItem(hwndDlg, IDC_PROTOCOLORDER), himlCheckBoxes, TVSIL_NORMAL); } tvis.hParent = NULL; tvis.hInsertAfter = TVI_LAST; tvis.item.mask = TVIF_PARAM|TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE; CheckProtocolOrder(); count = DBGetContactSettingByte(0, "Protocols", "ProtoCount", -1); if (count == -1){return(FALSE);} for (i = 0;itype != PROTOTYPE_PROTOCOL || CallProtoService(protos[i]->szName, PS_GETCAPS, PFLAGNUM_2, 0) == 0) continue; itoa(i, &buf, 10); szSTName = MyDbGetString(0, "Protocols", &buf); if (szSTName == NULL){continue;} CallProtoService(szSTName, PS_GETNAME, sizeof(szName), (LPARAM)szName); PD = (ProtocolData*)malloc(sizeof(ProtocolData)); PD->RealName = szSTName; itoa(OFFSET_VISIBLE+i, buf, 10); PD->show = DBGetContactSettingByte(0, "Protocols", buf, 1); itoa(OFFSET_PROTOPOS+i, buf, 10); PD->protopos = DBGetContactSettingByte(0, "Protocols", buf, -1); tvis.item.lParam = (LPARAM)PD; tvis.item.pszText = Translate(szName); tvis.item.iImage = tvis.item.iSelectedImage = PD->show; TreeView_InsertItem(GetDlgItem(hwndDlg, IDC_PROTOCOLORDER), &tvis); tvis.item.iImage = tvis.item.iSelectedImage = PD->show; TreeView_InsertItem(GetDlgItem(hwndDlg, IDC_PROTOCOLVISIBILITY), &tvis); //free(szSTName); } return TRUE; } case WM_NOTIFY: switch(((LPNMHDR)lParam)->idFrom) { case 0: switch (((LPNMHDR)lParam)->code) { case PSN_APPLY: { TVITEM tvi; PROTOCOLDESCRIPTOR **protos; int count; char idstr[33]; char buf[10]; /* tvi.hItem = TreeView_GetRoot(GetDlgItem(hwndDlg, IDC_PROTOCOLVISIBILITY)); tvi.cchTextMax = 32; tvi.mask = TVIF_TEXT|TVIF_IMAGE|TVIF_PARAM|TVIF_HANDLE; tvi.pszText = &idstr; //count = 0; while(tvi.hItem != NULL) { itoa(OFFSET_VISIBLE+count, &buf, 10); TreeView_GetItem(GetDlgItem(hwndDlg, IDC_PROTOCOLVISIBILITY), &tvi); DBWriteContactSettingByte(NULL, "Protocols", &buf, (byte)tvi.iImage); tvi.hItem = TreeView_GetNextSibling(GetDlgItem(hwndDlg, IDC_PROTOCOLVISIBILITY), tvi.hItem); //count++; } */ tvi.hItem = TreeView_GetRoot(GetDlgItem(hwndDlg, IDC_PROTOCOLORDER)); tvi.cchTextMax = 32; tvi.mask = TVIF_TEXT|TVIF_PARAM|TVIF_HANDLE; tvi.pszText = &idstr; //CallService(MS_PROTO_ENUMPROTOCOLS, (WPARAM)&count, (LPARAM)&protos); //count--; count = 0; while(tvi.hItem != NULL) { itoa(count, buf, 10); TreeView_GetItem(GetDlgItem(hwndDlg, IDC_PROTOCOLORDER), &tvi); DBWriteContactSettingString(NULL, "Protocols", &buf, ((ProtocolData *)tvi.lParam)->RealName); itoa(OFFSET_PROTOPOS+count, &buf, 10);//save pos in protos DBWriteContactSettingByte(0, "Protocols", &buf, ((ProtocolData *)tvi.lParam)->protopos); itoa(OFFSET_VISIBLE+count, &buf, 10);//save pos in protos DBWriteContactSettingByte(0, "Protocols", &buf, ((ProtocolData *)tvi.lParam)->show); tvi.hItem = TreeView_GetNextSibling(GetDlgItem(hwndDlg, IDC_PROTOCOLORDER), tvi.hItem); count++; } CluiProtocolStatusChanged(0, 0); } } break; /* case IDC_PROTOCOLORDER: //IDC_PROTOCOLVISIBILITY: 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_ONITEMICON) { 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; ((ProtocolData *)tvi.lParam)->show = tvi.iImage; TreeView_SetItem(((LPNMHDR)lParam)->hwndFrom, &tvi); SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); ShowWindow(GetDlgItem(hwndDlg, IDC_PROTOCOLORDERWARNING), SW_SHOW); } } break; */ case IDC_PROTOCOLORDER: switch (((LPNMHDR)lParam)->code) { case TVN_BEGINDRAG: SetCapture(hwndDlg); dat->dragging = 1; dat->hDragItem = ((LPNMTREEVIEW)lParam)->itemNew.hItem; TreeView_SelectItem(GetDlgItem(hwndDlg, IDC_PROTOCOLORDER), dat->hDragItem); //ShowWindow(GetDlgItem(hwndDlg, IDC_PROTOCOLORDERWARNING), SW_SHOW); break; case 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_ONITEMICON) { 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; ((ProtocolData *)tvi.lParam)->show = tvi.iImage; TreeView_SetItem(((LPNMHDR)lParam)->hwndFrom, &tvi); SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); //all changes take effect in runtime //ShowWindow(GetDlgItem(hwndDlg, IDC_PROTOCOLORDERWARNING), SW_SHOW); } } } break; } break; case WM_MOUSEMOVE: if (!dat->dragging) break; { TVHITTESTINFO hti; hti.pt.x = (short)LOWORD(lParam); hti.pt.y = (short)HIWORD(lParam); ClientToScreen(hwndDlg, &hti.pt); ScreenToClient(GetDlgItem(hwndDlg, IDC_PROTOCOLORDER), &hti.pt); TreeView_HitTest(GetDlgItem(hwndDlg, IDC_PROTOCOLORDER), &hti); if (hti.flags&(TVHT_ONITEM|TVHT_ONITEMRIGHT)) { hti.pt.y -= TreeView_GetItemHeight(GetDlgItem(hwndDlg, IDC_PROTOCOLORDER))/2; TreeView_HitTest(GetDlgItem(hwndDlg, IDC_PROTOCOLORDER), &hti); TreeView_SetInsertMark(GetDlgItem(hwndDlg, IDC_PROTOCOLORDER), hti.hItem, 1); } else { if (hti.flags&TVHT_ABOVE) SendDlgItemMessage(hwndDlg, IDC_PROTOCOLORDER, WM_VSCROLL, MAKEWPARAM(SB_LINEUP, 0), 0); if (hti.flags&TVHT_BELOW) SendDlgItemMessage(hwndDlg, IDC_PROTOCOLORDER, WM_VSCROLL, MAKEWPARAM(SB_LINEDOWN, 0), 0); TreeView_SetInsertMark(GetDlgItem(hwndDlg, IDC_PROTOCOLORDER), NULL, 0); } } break; case WM_LBUTTONUP: if (!dat->dragging) break; TreeView_SetInsertMark(GetDlgItem(hwndDlg, IDC_PROTOCOLORDER), NULL, 0); dat->dragging = 0; ReleaseCapture(); { TVHITTESTINFO hti; TVITEM tvi; hti.pt.x = (short)LOWORD(lParam); hti.pt.y = (short)HIWORD(lParam); ClientToScreen(hwndDlg, &hti.pt); ScreenToClient(GetDlgItem(hwndDlg, IDC_PROTOCOLORDER), &hti.pt); hti.pt.y -= TreeView_GetItemHeight(GetDlgItem(hwndDlg, IDC_PROTOCOLORDER))/2; TreeView_HitTest(GetDlgItem(hwndDlg, IDC_PROTOCOLORDER), &hti); if (dat->hDragItem == hti.hItem) break; tvi.mask = TVIF_HANDLE|TVIF_PARAM; tvi.hItem = hti.hItem; TreeView_GetItem(GetDlgItem(hwndDlg, IDC_PROTOCOLORDER), &tvi); if (hti.flags&(TVHT_ONITEM|TVHT_ONITEMRIGHT)) { TVINSERTSTRUCT tvis; char name[128]; tvis.item.mask = TVIF_HANDLE|TVIF_PARAM|TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE; tvis.item.stateMask = 0xFFFFFFFF; tvis.item.pszText = name; tvis.item.cchTextMax = sizeof(name); tvis.item.hItem = dat->hDragItem; // tvis.item.iImage = tvis.item.iSelectedImage = ((ProtocolData *)tvi.lParam)->show; TreeView_GetItem(GetDlgItem(hwndDlg, IDC_PROTOCOLORDER), &tvis.item); TreeView_DeleteItem(GetDlgItem(hwndDlg, IDC_PROTOCOLORDER), dat->hDragItem); tvis.hParent = NULL; tvis.hInsertAfter = hti.hItem; TreeView_SelectItem(GetDlgItem(hwndDlg, IDC_PROTOCOLORDER), TreeView_InsertItem(GetDlgItem(hwndDlg, IDC_PROTOCOLORDER), &tvis)); SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); } } break; } return FALSE; } static int ProtocolOrderInit(WPARAM wParam, LPARAM lParam) { OPTIONSDIALOGPAGE odp; ZeroMemory(&odp, sizeof(odp)); odp.cbSize = sizeof(odp); odp.position = -1000000000; odp.hInstance = hInst;//GetModuleHandle(NULL); odp.pszTemplate = MAKEINTRESOURCE(IDD_OPT_PROTOCOLORDER); odp.pszGroup = Translate("Contact List"); odp.pszTitle = Translate("Protocols"); odp.pfnDlgProc = ProtocolOrderOpts; odp.flags = ODPF_BOLDGROUPS|ODPF_EXPERTONLY; CallService(MS_OPT_ADDPAGE, wParam, (LPARAM)&odp); return 0; } int LoadProtocolOrderModule(void) { HookEvent(ME_OPT_INITIALISE, ProtocolOrderInit); return 0; }