void fnDeleteItemFromTree(HWND hwnd, MCONTACT hItem) { ClcContact *contact; ClcGroup *group; struct ClcData *dat = (struct ClcData *) GetWindowLongPtr(hwnd, 0); dat->needsResort = 1; if (!cli.pfnFindItem(hwnd, dat, hItem, &contact, &group, NULL)) { DBVARIANT dbv; int i, nameOffset; if (!IsHContactContact(hItem)) return; if (db_get_ts(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) { size_t len = mir_tstrlen(group->cl.items[i]->szText); if (!_tcsncmp(group->cl.items[i]->szText, dbv.ptszVal + nameOffset, len) && (dbv.ptszVal[nameOffset + len] == '\\' || dbv.ptszVal[nameOffset + len] == '\0')) { group->totalMembers--; if (dbv.ptszVal[nameOffset + len] == '\0') break; } } } mir_free(dbv.ptszVal); } else cli.pfnRemoveItemFromGroup(hwnd, group, contact, 1); }
void DeleteItemFromTree(HWND hwnd,HANDLE hItem) { struct ClcContact *contact; struct ClcGroup *group; struct ClcData *dat=(struct ClcData*)GetWindowLong(hwnd,0); ClearRowByIndexCache(); if(!FindItem(hwnd,dat,hItem,&contact,&group,NULL,TRUE)) { DBVARIANT dbv; int i,nameOffset; if(!IsHContactContact(hItem)) return; ClearClcContactCache(dat,hItem); if(DBGetContactSettingTString(hItem,"CList","Group",&dbv)) {DBFreeVariant(&dbv); return;} //decrease member counts of all parent groups too group=&dat->list; nameOffset=0; for(i=0;;i++) { if(group->scanIndex==group->contactCount) break; if(group->contact[i].type==CLCIT_GROUP) { int len=lstrlen(group->contact[i].szText); //TODO unicode to dbv.pszVal if(!_tcsncmp(group->contact[i].szText,(TCHAR*)dbv.pszVal+nameOffset,len) && ((TCHAR)dbv.pszVal[nameOffset+len]==TEXT('\\') || (TCHAR)dbv.pszVal[nameOffset+len]==TEXT('\0'))) { group->totalMembers--; if((TCHAR)dbv.pszVal[nameOffset+len]==TEXT('\0')) break; } } } mir_free(dbv.pszVal); DBFreeVariant(&dbv); } else RemoveItemFromGroup(hwnd,group,contact,1); dat->NeedResort=1; ClearRowByIndexCache(); }
static void SaveSettings(HANDLE hItem, HWND hwndList, CMsnProto* proto) { if (hItem == NULL) hItem = (HANDLE)SendMessage(hwndList, CLM_GETNEXTITEM, CLGN_ROOT, 0); while (hItem) { if (IsHContactGroup(hItem)) { HANDLE hItemT = (HANDLE)SendMessage(hwndList, CLM_GETNEXTITEM, CLGN_CHILD, (LPARAM)hItem); if (hItemT) SaveSettings(hItemT, hwndList, proto); } else { char szEmail[MSN_MAX_EMAIL_LEN]; if (IsHContactContact(hItem)) { if (proto->getStaticString(hItem, "e-mail", szEmail, sizeof(szEmail))) continue; } else if (IsHContactInfo(hItem)) { TCHAR buf[MSN_MAX_EMAIL_LEN]; SendMessage(hwndList, CLM_GETITEMTEXT, (WPARAM)hItem, (LPARAM)buf); WideCharToMultiByte(CP_ACP, 0, buf, -1, szEmail, sizeof(szEmail), 0, 0); } int dwMask = proto->Lists_GetMask(szEmail); SaveListItem(hItem, szEmail, LIST_LL, (dwMask & LIST_LL)?1:0, SendMessage(hwndList, CLM_GETEXTRAIMAGE, (WPARAM)hItem, MAKELPARAM(0,0)), proto); SaveListItem(hItem, szEmail, LIST_FL, (dwMask & LIST_FL)?2:0, SendMessage(hwndList, CLM_GETEXTRAIMAGE, (WPARAM)hItem, MAKELPARAM(1,0)), proto); SaveListItem(hItem, szEmail, LIST_AL, (dwMask & LIST_AL)?3:0, SendMessage(hwndList, CLM_GETEXTRAIMAGE, (WPARAM)hItem, MAKELPARAM(2,0)), proto); SaveListItem(hItem, szEmail, LIST_BL, (dwMask & LIST_BL)?4:0, SendMessage(hwndList, CLM_GETEXTRAIMAGE, (WPARAM)hItem, MAKELPARAM(3,0)), proto); int newMask = proto->Lists_GetMask(szEmail); int xorMask = newMask ^ dwMask; if (xorMask && newMask & (LIST_FL | LIST_LL)) { HANDLE hContact = IsHContactInfo(hItem) ? proto->MSN_HContactFromEmail(szEmail, szEmail, true, false) : hItem; proto->MSN_SetContactDb(hContact, szEmail); } if (xorMask & (LIST_FL | LIST_LL) && !(newMask & (LIST_FL | LIST_LL))) { if (!IsHContactInfo(hItem)) { CallService(MS_DB_CONTACT_DELETE, (WPARAM)hItem, 0); MsnContact* msc = proto->Lists_Get(szEmail); if (msc) msc->hContact = NULL; } } } hItem = (HANDLE)SendMessage(hwndList, CLM_GETNEXTITEM, CLGN_NEXT, (LPARAM)hItem); } }
MCONTACT CCList::GethContact(HTREEITEM hItem) // returns hContact, hGroup or hInfo { MCONTACT hContact = GetItemData(hItem).hContact; if (IsHContactContact(hContact)) return hContact; if (IsHContactGroup(hContact)) return hContact & ~HCONTACT_ISGROUP; return hContact & ~HCONTACT_ISINFO; }
// adds a new contact if it doesn't exist yet; returns its hItem HTREEITEM CCList::AddContact(MCONTACT hContact) { _ASSERT(IsHContactContact(hContact)); HTREEITEM hContactItem = FindContact(hContact); if (hContactItem) return hContactItem; TVINSERTSTRUCT tvIns; memset(&tvIns, 0, sizeof(tvIns)); tvIns.hParent = AddGroup(db_get_s(hContact, "CList", "Group", L"")); tvIns.item.pszText = Clist_GetContactDisplayName(hContact); tvIns.hInsertAfter = TVI_ROOT; tvIns.item.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM; tvIns.item.iImage = tvIns.item.iSelectedImage = Clist_GetContactIcon(hContact); tvIns.item.lParam = Items.AddElem(CCLItemData(hContact)); return TreeView_InsertItem(hTreeView, &tvIns); }
static void SetAllContactIcons(MCONTACT hItem, HWND hwndList, CMsnProto* proto) { if (hItem == NULL) hItem = (MCONTACT)SendMessage(hwndList, CLM_GETNEXTITEM, CLGN_ROOT, 0); while (hItem) { MCONTACT hItemN = (MCONTACT)SendMessage(hwndList, CLM_GETNEXTITEM, CLGN_NEXT, (LPARAM)hItem); if (IsHContactGroup(hItem)) { MCONTACT hItemT = (MCONTACT)SendMessage(hwndList, CLM_GETNEXTITEM, CLGN_CHILD, (LPARAM)hItem); if (hItemT) SetAllContactIcons(hItemT, hwndList, proto); } else if (IsHContactContact(hItem)) SetContactIcons(hItem, hwndList, proto); hItem = hItemN; } }
static void ChatPrepare(MCONTACT hItem, HWND hwndList, CMsnProto* ppro) { if (hItem == NULL) hItem = (MCONTACT)SendMessage(hwndList, CLM_GETNEXTITEM, CLGN_ROOT, 0); while (hItem) { MCONTACT hItemN = (MCONTACT)SendMessage(hwndList, CLM_GETNEXTITEM, CLGN_NEXT, (LPARAM)hItem); if (IsHContactGroup(hItem)) { MCONTACT hItemT = (MCONTACT)SendMessage(hwndList, CLM_GETNEXTITEM, CLGN_CHILD, (LPARAM)hItem); if (hItemT) ChatPrepare(hItemT, hwndList, ppro); } else if (IsHContactContact(hItem)) ChatValidateContact(hItem, hwndList, ppro); hItem = hItemN; } }
void ClistPrepare(FacebookProto *proto, MCONTACT hItem, HWND hwndList) { if (hItem == NULL) hItem = (MCONTACT)::SendMessage(hwndList, CLM_GETNEXTITEM, CLGN_ROOT, 0); while (hItem) { MCONTACT hItemN = (MCONTACT)::SendMessage(hwndList, CLM_GETNEXTITEM, CLGN_NEXT, (LPARAM)hItem); if (IsHContactGroup(hItem)) { MCONTACT hItemT = (MCONTACT)::SendMessage(hwndList, CLM_GETNEXTITEM, CLGN_CHILD, (LPARAM)hItem); if (hItemT) ClistPrepare(proto, hItemT, hwndList); } else if (IsHContactContact(hItem)) { if (!proto->IsMyContact(hItem) || ptrA(proto->getStringA(hItem, FACEBOOK_KEY_ID)) == NULL) SendMessage(hwndList, CLM_DELETEITEM, (WPARAM)hItem, 0); } hItem = hItemN; } }
void CToxProto::ChatPrepare(HWND hwndList, const std::vector<MCONTACT> &contacts, MCONTACT hContact) { if (hContact == NULL) { hContact = (MCONTACT)SendMessage(hwndList, CLM_GETNEXTITEM, CLGN_ROOT, 0); } while (hContact) { if (IsHContactGroup(hContact)) { MCONTACT hSubContact = (MCONTACT)SendMessage(hwndList, CLM_GETNEXTITEM, CLGN_CHILD, (LPARAM)hContact); if (hSubContact) { ChatPrepare(hwndList, contacts, hSubContact); } } else if (IsHContactContact(hContact)) { ChatValidateContact(hwndList, contacts, hContact); } hContact = (MCONTACT)SendMessage(hwndList, CLM_GETNEXTITEM, CLGN_NEXT, (LPARAM)hContact); } }
INT_PTR CALLBACK DlgProcMsnServLists(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { case WM_INITDIALOG: TranslateDialogDefault(hwndDlg); { SetWindowLongPtr(hwndDlg, GWLP_USERDATA, lParam); HIMAGELIST hIml = ImageList_Create(GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), ILC_MASK | ILC_COLOR32, 5, 5); HICON hIcon = LoadSkinnedIcon(SKINICON_OTHER_SMALLDOT); ImageList_AddIcon(hIml, hIcon); Skin_ReleaseIcon(hIcon); hIcon = LoadIconEx("list_lc"); ImageList_AddIcon(hIml, hIcon); SendDlgItemMessage(hwndDlg, IDC_ICON_LC, STM_SETICON, (WPARAM)hIcon, 0); hIcon = LoadIconEx("list_fl"); ImageList_AddIcon(hIml, hIcon); SendDlgItemMessage(hwndDlg, IDC_ICON_FL, STM_SETICON, (WPARAM)hIcon, 0); hIcon = LoadIconEx("list_al"); ImageList_AddIcon(hIml, hIcon); SendDlgItemMessage(hwndDlg, IDC_ICON_AL, STM_SETICON, (WPARAM)hIcon, 0); hIcon = LoadIconEx("list_bl"); ImageList_AddIcon(hIml, hIcon); SendDlgItemMessage(hwndDlg, IDC_ICON_BL, STM_SETICON, (WPARAM)hIcon, 0); hIcon = LoadIconEx("list_rl"); ImageList_AddIcon(hIml, hIcon); SendDlgItemMessage(hwndDlg, IDC_ICON_RL, STM_SETICON, (WPARAM)hIcon, 0); HWND hwndList = GetDlgItem(hwndDlg, IDC_LIST); SendMessage(hwndList, CLM_SETEXTRAIMAGELIST, 0, (LPARAM)hIml); SendMessage(hwndList, CLM_SETEXTRACOLUMNS, 5, 0); ResetListOptions(hwndList); EnableWindow(hwndList, ((CMsnProto*)lParam)->msnLoggedIn); } return TRUE; // case WM_SETFOCUS: // SetFocus(GetDlgItem(hwndDlg ,IDC_LIST)); // break; case WM_COMMAND: if (LOWORD(wParam) == IDC_LISTREFRESH) { HWND hwndList = GetDlgItem(hwndDlg, IDC_LIST); SendMessage(hwndList, CLM_AUTOREBUILD, 0, 0); CMsnProto* proto = (CMsnProto*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); EnableWindow(hwndList, proto->msnLoggedIn); } break; case WM_NOTIFY: { CMsnProto* proto = (CMsnProto*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); NMCLISTCONTROL* nmc = (NMCLISTCONTROL*)lParam; if (nmc->hdr.idFrom == 0 && nmc->hdr.code == (unsigned)PSN_APPLY) { HWND hwndList = GetDlgItem(hwndDlg, IDC_LIST); SaveSettings(NULL, hwndList, proto); SendMessage(hwndList, CLM_AUTOREBUILD, 0, 0); EnableWindow(hwndList, proto->msnLoggedIn); } else if (nmc->hdr.idFrom == IDC_LIST) { switch (nmc->hdr.code) { case CLN_NEWCONTACT: if ((nmc->flags & (CLNF_ISGROUP | CLNF_ISINFO)) == 0) SetContactIcons(nmc->hItem, nmc->hdr.hwndFrom, proto); break; case CLN_LISTREBUILT: AddPrivacyListEntries(nmc->hdr.hwndFrom, proto); SetAllContactIcons(NULL, nmc->hdr.hwndFrom, proto); break; case CLN_OPTIONSCHANGED: ResetListOptions(nmc->hdr.hwndFrom); break; case NM_CLICK: HANDLE hItem; DWORD hitFlags; int iImage; // Make sure we have an extra column, also we can't change RL list if (nmc->iColumn == -1 || nmc->iColumn == 4) break; // Find clicked item hItem = (HANDLE)SendMessage(nmc->hdr.hwndFrom, CLM_HITTEST, (WPARAM)&hitFlags, MAKELPARAM(nmc->pt.x,nmc->pt.y)); // Nothing was clicked if (hItem == NULL || !(IsHContactContact(hItem) || IsHContactInfo(hItem))) break; // It was not our extended icon if (!(hitFlags & CLCHT_ONITEMEXTRA)) break; // Get image in clicked column (0=none, 1=LL, 2=FL, 3=AL, 4=BL, 5=RL) iImage = SendMessage(nmc->hdr.hwndFrom, CLM_GETEXTRAIMAGE, (WPARAM)hItem, MAKELPARAM(nmc->iColumn, 0)); iImage = iImage ? 0 : nmc->iColumn + 1; SendMessage(nmc->hdr.hwndFrom, CLM_SETEXTRAIMAGE, (WPARAM)hItem, MAKELPARAM(nmc->iColumn, iImage)); if (iImage && SendMessage(nmc->hdr.hwndFrom, CLM_GETEXTRAIMAGE, (WPARAM)hItem, MAKELPARAM(nmc->iColumn ^ 1, 0)) != EMPTY_EXTRA_ICON) if (nmc->iColumn == 2 || nmc->iColumn == 3) SendMessage(nmc->hdr.hwndFrom, CLM_SETEXTRAIMAGE, (WPARAM)hItem, MAKELPARAM(nmc->iColumn ^ 1, 0)); // Activate Apply button SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); break; } } } break; case WM_DESTROY: HIMAGELIST hIml=(HIMAGELIST)SendDlgItemMessage(hwndDlg,IDC_LIST,CLM_GETEXTRAIMAGELIST,0,0); ImageList_Destroy(hIml); ReleaseIconEx("list_fl"); ReleaseIconEx("list_al"); ReleaseIconEx("list_bl"); ReleaseIconEx("list_rl"); break; } return FALSE; }
LRESULT CALLBACK ContactListSubclassProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { TVITEM tvi; CCList *dat = CWndUserData(GetParent(hWnd)).GetCList(); switch (Msg) { case INTM_CONTACTDELETED: // wParam = (HANDLE)hContact { HTREEITEM hItem = dat->FindContact(wParam); if (hItem) TreeView_DeleteItem(hWnd, hItem); } break; case INTM_ICONCHANGED: // wParam = (HANDLE)hContact, lParam = IconID tvi.hItem = dat->FindContact(wParam); if (tvi.hItem) { tvi.mask = TVIF_HANDLE | TVIF_IMAGE | TVIF_SELECTEDIMAGE; tvi.iImage = tvi.iSelectedImage = lParam; TreeView_SetItem(hWnd, &tvi); dat->SortContacts(); InvalidateRect(hWnd, nullptr, false); } break; case INTM_INVALIDATE: InvalidateRect(hWnd, nullptr, true); break; case WM_RBUTTONDOWN: SetFocus(hWnd); { TVHITTESTINFO hitTest; hitTest.pt.x = (short)LOWORD(lParam); hitTest.pt.y = (short)HIWORD(lParam); TreeView_HitTest(hWnd, &hitTest); if (hitTest.hItem && hitTest.flags & TVHT_ONITEM) TreeView_SelectItem(hWnd, hitTest.hItem); } return DefWindowProc(hWnd, Msg, wParam, lParam); case WM_LBUTTONDOWN: { POINT pt = { (short)LOWORD(lParam), (short)HIWORD(lParam) }; DWORD hitFlags; HTREEITEM hItem = dat->HitTest(&pt, &hitFlags); if (!hItem) break; if (hitFlags & MCLCHT_ONITEMICON) { if (TreeView_GetChild(hWnd, hItem)) { // if it's a group, then toggle its state NMTREEVIEW nmtv; nmtv.hdr.hwndFrom = hWnd; nmtv.hdr.idFrom = GetDlgCtrlID(hWnd); nmtv.hdr.code = TVN_ITEMEXPANDING; nmtv.action = TVE_TOGGLE; nmtv.itemNew.hItem = hItem; nmtv.itemNew.mask = TVIF_HANDLE | TVIF_STATE | TVIF_PARAM; TreeView_GetItem(hWnd, &nmtv.itemNew); nmtv.ptDrag = pt; if (SendMessage(GetParent(hWnd), WM_NOTIFY, 0, (LPARAM)&nmtv)) return 0; HTREEITEM hOldSelItem = TreeView_GetSelection(hWnd); TreeView_Expand(hWnd, hItem, TVE_TOGGLE); HTREEITEM hNewSelItem = TreeView_GetSelection(hWnd); if (hNewSelItem != hOldSelItem) { TreeView_SetItemState(hWnd, hOldSelItem, (dat->SelectedItems.Find(hOldSelItem) == -1) ? 0 : TVIS_SELECTED, TVIS_SELECTED); TreeView_SetItemState(hWnd, hNewSelItem, (dat->SelectedItems.Find(hNewSelItem) == -1) ? 0 : TVIS_SELECTED, TVIS_SELECTED); } nmtv.hdr.code = TVN_ITEMEXPANDED; TreeView_GetItem(hWnd, &nmtv.itemNew); SendMessage(GetParent(hWnd), WM_NOTIFY, 0, (LPARAM)&nmtv); return 0; } } if (hitFlags & MCLCHT_ONITEM) { if (wParam & MK_CONTROL) { SetFocus(hWnd); TREEITEMARRAY OldSelection = dat->SelectedItems; int nIndex = dat->SelectedItems.Find(hItem); if (nIndex == -1) { TreeView_SetItemState(hWnd, hItem, TVIS_SELECTED, TVIS_SELECTED); dat->SelectedItems.AddElem(hItem); } else { TreeView_SetItemState(hWnd, hItem, 0, TVIS_SELECTED); dat->SelectedItems.RemoveElem(nIndex); } dat->SelectGroups(hItem, nIndex == -1); NMCLIST nm; nm.hdr.code = MCLN_SELCHANGED; nm.hdr.hwndFrom = hWnd; nm.hdr.idFrom = GetDlgCtrlID(hWnd); nm.OldSelection = &OldSelection; nm.NewSelection = &dat->SelectedItems; SendMessage(GetParent(hWnd), WM_NOTIFY, 0, (LPARAM)&nm); return 0; } // if it was a click on the selected item and there's need to do something in this case, then send SELCHANGED notification by ourselves, as the tree control doesn't do anything if (hItem == TreeView_GetSelection(hWnd) && (dat->SelectedItems.GetSize() != 1 || (dat->SelectedItems.GetSize() == 1 && dat->SelectedItems[0] != hItem))) { TreeView_SetItemState(hWnd, hItem, TVIS_SELECTED, TVIS_SELECTED); NMTREEVIEW nm = {}; nm.hdr.code = TVN_SELCHANGED; nm.hdr.hwndFrom = hWnd; nm.hdr.idFrom = GetDlgCtrlID(hWnd); nm.itemOld.hItem = TreeView_GetSelection(hWnd); nm.itemOld.mask = TVIF_HANDLE | TVIF_STATE | TVIF_PARAM; TreeView_GetItem(hWnd, &nm.itemOld); nm.itemNew = nm.itemOld; SendMessage(GetParent(hWnd), WM_NOTIFY, 0, (LPARAM)&nm); } } } break; case WM_SETFOCUS: case WM_KILLFOCUS: for (int i = 0; i < dat->SelectedItems.GetSize(); i++) { RECT rc; if (TreeView_GetItemRect(hWnd, dat->SelectedItems[i], &rc, false)) InvalidateRect(hWnd, &rc, false); } break; case WM_SIZE: case WM_HSCROLL: InvalidateRect(hWnd, nullptr, false); break; case WM_MEASUREITEM: if (!wParam) // if the message was sent by a menu return Menu_MeasureItem(lParam); break; case WM_DRAWITEM: if (!wParam) // if the message was sent by a menu return Menu_DrawItem(lParam); break; case WM_CONTEXTMENU: { POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) }; HTREEITEM hItem = nullptr; if (pt.x == -1 && pt.y == -1) { if (dat->SelectedItems.GetSize() == 1) { hItem = dat->SelectedItems[0]; TreeView_EnsureVisible(hWnd, hItem); RECT rc; TreeView_GetItemRect(hWnd, hItem, &rc, true); pt.x = rc.left; pt.y = rc.bottom; } } else { DWORD hitFlags; ScreenToClient(hWnd, &pt); hItem = dat->HitTest(&pt, &hitFlags); if (!(hitFlags & MCLCHT_ONITEM)) hItem = nullptr; } if (hItem) { MCONTACT hContact = dat->GetItemData(hItem).hContact; if (IsHContactContact(hContact)) { HMENU hMenu = Menu_BuildContactMenu(hContact); if (hMenu) { ClientToScreen(hWnd, &pt); Clist_MenuProcessCommand(TrackPopupMenu(hMenu, TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD, pt.x, pt.y, 0, hWnd, nullptr), MPCF_CONTACTMENU, hContact); DestroyMenu(hMenu); return 0; } } } } break; case WM_DESTROY: if (dat->ExtraImageList) ImageList_Destroy(dat->ExtraImageList); dat->SelectedItems.RemoveAll(); dat->Items.RemoveAll(); break; } return CallWindowProc(dat->OrigTreeViewProc, hWnd, Msg, wParam, lParam); }
int FindItem(HWND hwnd, struct ClcData *dat, HANDLE hItem, ClcContact **contact, ClcGroup **subgroup, int *isVisible) { int index = 0; int nowVisible = 1; ClcGroup *group = &dat->list; group->scanIndex = 0; for (;;) { if (group->scanIndex == group->cl.count) { 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 == (UINT_PTR)hItem) || (IsHContactInfo(hItem) && group->cl.items[group->scanIndex]->type == CLCIT_INFO && group->cl.items[group->scanIndex]->hContact == ((UINT_PTR)hItem & ~HCONTACT_ISINFO))) { if (isVisible) { if (!nowVisible) *isVisible = 0; else { int posy = RowHeight::getItemTopY(dat, index + 1); if (posy < dat->yScroll) *isVisible = 0; else { RECT clRect; GetClientRect(hwnd, &clRect); if (posy >= 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_GROUP) { group = group->cl.items[group->scanIndex]->group; group->scanIndex = 0; nowVisible &= (group->expanded); continue; } group->scanIndex++; } if (isVisible) *isVisible = FALSE; if (contact) *contact = NULL; if (subgroup) *subgroup = NULL; return 0; }
int FindItem(HWND hwnd, ClcData *dat, DWORD dwItem, ClcContact **contact, ClcGroup **subgroup, int *isVisible, BOOL isIgnoreSubcontacts) { int index = 0, i; int nowVisible = 1; ClcGroup *group = &dat->list; group->scanIndex = 0; group = &dat->list; for (;;) { if (group->scanIndex == group->cl.count) { ClcGroup *tgroup; group = group->parent; if (group == NULL) break; nowVisible = 1; for (tgroup = group; tgroup; tgroup = tgroup->parent) { if (!tgroup->expanded) { nowVisible = 0; break; } } group->scanIndex++; continue; } if (nowVisible) index++; if ((IsHContactGroup(dwItem) && group->cl.items[group->scanIndex]->type == CLCIT_GROUP && (dwItem & ~HCONTACT_ISGROUP) == group->cl.items[group->scanIndex]->groupId) || (IsHContactContact(dwItem) && group->cl.items[group->scanIndex]->type == CLCIT_CONTACT && group->cl.items[group->scanIndex]->hContact == dwItem) || (IsHContactInfo(dwItem) && group->cl.items[group->scanIndex]->type == CLCIT_INFO && group->cl.items[group->scanIndex]->hContact == (dwItem & ~HCONTACT_ISINFO))) { if (isVisible) { if (!nowVisible) *isVisible = 0; else { int posy = cliGetRowTopY(dat,index+1); if (posy < dat->yScroll) *isVisible = 0; else { RECT clRect; GetClientRect(hwnd,&clRect); if (posy >= dat->yScroll+clRect.bottom) *isVisible = 0; else *isVisible = 1; } } } if (contact) *contact = group->cl.items[group->scanIndex]; if (subgroup) *subgroup = group; return 1; } if (!isIgnoreSubcontacts && IsHContactContact(dwItem) && group->cl.items[group->scanIndex]->type == CLCIT_CONTACT && group->cl.items[group->scanIndex]->SubAllocated > 0) { for (i = 0; i < group->cl.items[group->scanIndex]->SubAllocated; i++) { if (group->cl.items[group->scanIndex]->subcontacts[i].hContact == dwItem) { if (contact) *contact = &group->cl.items[group->scanIndex]->subcontacts[i]; if (subgroup) *subgroup = group; return 1; } } } if (group->cl.items[group->scanIndex]->type == CLCIT_GROUP) { group = group->cl.items[group->scanIndex]->group; group->scanIndex = 0; nowVisible &= group->expanded; continue; } group->scanIndex++; } if (isVisible) *isVisible = FALSE; if (contact) *contact = NULL; if (subgroup) *subgroup = NULL; return 0; }
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; }
int FindItem(HWND hwnd, struct ClcData *dat, DWORD dwItem, struct ClcContact **contact, ClcGroup **subgroup, int *isVisible) { int index = 0, i; int nowVisible = 1; ClcGroup *group = &dat->list; group->scanIndex = 0; if (isVisible == NULL && dwItem != NULL && subgroup == NULL && !IsHContactGroup(dwItem) && !IsHContactInfo(dwItem)) { //try use cache ClcCacheEntry *cacheEntry = GetCLCFullCacheEntry(dat, dwItem); if (cacheEntry != NULL) { if (cacheEntry->ClcContact == NULL) { int *isv = {0}; void *z = {0}; int ret; ret = FindItem(hwnd,dat,dwItem,(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; return 1; } } } group = &dat->list; for (;;) { if (group->scanIndex == group->cl.count) { 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(dwItem) && group->cl.items[group->scanIndex]->type == CLCIT_GROUP && (dwItem & ~HCONTACT_ISGROUP) == group->cl.items[group->scanIndex]->groupId) || (IsHContactContact(dwItem) && group->cl.items[group->scanIndex]->type == CLCIT_CONTACT && group->cl.items[group->scanIndex]->hContact == dwItem) || (IsHContactInfo(dwItem) && group->cl.items[group->scanIndex]->type == CLCIT_INFO && group->cl.items[group->scanIndex]->hContact == (dwItem & ~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(dwItem) && group->cl.items[group->scanIndex]->subcontacts[i-1].hContact == dwItem) { 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) { ClcGroup* save = group; group = group->cl.items[group->scanIndex]->group; group->scanIndex = 0; nowVisible &= group->expanded; continue; } group->scanIndex++; } if (isVisible) *isVisible = FALSE; if (contact) *contact = NULL; if (subgroup) *subgroup = NULL; return 0; }