FileInfoListView::~FileInfoListView() { if (m_smallImageList != 0) { ImageList_Destroy(m_smallImageList); } }
static BOOL CALLBACK sSplitKeyDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { PSPLITKEYSTRUCT psks; CHAR sz[8]; NMHDR* pnmh; UINT u; switch (uMsg) { case WM_INITDIALOG : { CHAR szTitle[kPGPMaxUserIDSize + 32]; // save address of struct SetWindowLong (hDlg, GWL_USERDATA, lParam); psks = (PSPLITKEYSTRUCT)lParam; psks->hwndDlg = hDlg; // if we have a function to call to add hwnd to list, then call it if (psks->pKM->lpfnHwndListFunc) (psks->pKM->lpfnHwndListFunc)(hDlg, TRUE, NULL, NULL); // initialize shareholder list psks->hwndList = GetDlgItem (hDlg, IDC_SHAREHOLDERS); sInitKeyList (psks); // initialize name of key to split SetDlgItemText (hDlg, IDC_KEYTOSPLIT, psks->szUserIDToSplit); LoadString (g_hInst, IDS_SPLITKEYTITLE, szTitle, sizeof(szTitle)); lstrcat (szTitle, psks->szUserIDToSplit); SetWindowText (hDlg, szTitle); // limit number of shares SendDlgItemMessage (hDlg, IDC_SHARES, EM_SETLIMITTEXT, (WPARAM)MAX_SHARES_LEN, 0); SendDlgItemMessage (hDlg, IDC_THRESHOLD, EM_SETLIMITTEXT, (WPARAM)MAX_SHARES_LEN, 0); // initialize spin controls SendDlgItemMessage (hDlg, IDC_SHARESSPIN, UDM_SETRANGE, 0, (LPARAM)MAKELONG (MAX_SHARES, 1)); SetDlgItemText (hDlg, IDC_SHARES, ""); EnableWindow (GetDlgItem (hDlg, IDC_SHARES), FALSE); SendDlgItemMessage (hDlg, IDC_THRESHOLDSPIN, UDM_SETRANGE, 0, (LPARAM)MAKELONG (MAX_SHARES, 1)); SendDlgItemMessage (hDlg, IDC_THRESHOLDSPIN, UDM_SETPOS, 0, (LPARAM)MAKELONG (psks->uThreshold, 0)); // initialize total number of shares SetDlgItemInt (hDlg, IDC_TOTALSHARES, psks->uTotalShares, FALSE); // "split key" and "remove" buttons initially disabled EnableWindow (GetDlgItem (hDlg, IDC_REMOVESHAREHOLDER), FALSE); EnableWindow (GetDlgItem (hDlg, IDOK), FALSE); // initialize drag/drop psks->pDropTarget = KMCreateDropTarget (psks->hwndList, NULL, psks); CoLockObjectExternal ((IUnknown*)psks->pDropTarget, TRUE, TRUE); RegisterDragDrop (psks->hwndList, psks->pDropTarget); KMEnableDropTarget (psks->pDropTarget, TRUE); return TRUE; } case WM_HELP: { WinHelp (((LPHELPINFO) lParam)->hItemHandle, g_szHelpFile, HELP_WM_HELP, (DWORD) (LPSTR) aSplitIds); break; } case WM_CONTEXTMENU: { WinHelp ((HWND) wParam, g_szHelpFile, HELP_CONTEXTMENU, (DWORD) (LPVOID) aSplitIds); break; } case WM_NOTIFY : pnmh = (NMHDR*)lParam; switch (pnmh->code) { case NM_CLICK : case LVN_KEYDOWN : if (pnmh->idFrom == IDC_SHAREHOLDERS) { INT iIndex; psks = (PSPLITKEYSTRUCT)GetWindowLong (hDlg, GWL_USERDATA); iIndex = ListView_GetNextItem (psks->hwndList, -1, LVNI_SELECTED); if (iIndex > -1) { LV_ITEM lvI; PSHAREHOLDERSTRUCT pshs; lvI.mask = LVIF_PARAM; lvI.iItem = iIndex; lvI.iSubItem = 0; ListView_GetItem(psks->hwndList, &lvI); pshs = (PSHAREHOLDERSTRUCT)lvI.lParam; psks->pshsCurrent = pshs; psks->iIndexCurrent = iIndex; SetDlgItemText (hDlg, IDC_CURRENTSHAREHOLDER, pshs->szUserID); SendDlgItemMessage (hDlg, IDC_SHARESSPIN, UDM_SETPOS, 0, (LPARAM)MAKELONG (pshs->uShares, 0)); EnableWindow (GetDlgItem (hDlg, IDC_SHARES), TRUE); EnableWindow (GetDlgItem (hDlg, IDC_SHARESSPIN), TRUE); EnableWindow ( GetDlgItem (hDlg, IDC_REMOVESHAREHOLDER), TRUE); } else { psks->iIndexCurrent = -1; psks->pshsCurrent = NULL; SetDlgItemText (hDlg, IDC_SHARES, ""); SetDlgItemText (hDlg, IDC_CURRENTSHAREHOLDER, ""); EnableWindow (GetDlgItem (hDlg, IDC_SHARES), FALSE); EnableWindow ( GetDlgItem (hDlg, IDC_REMOVESHAREHOLDER), FALSE); } } break; } break; case WM_DESTROY : psks = (PSPLITKEYSTRUCT)GetWindowLong (hDlg, GWL_USERDATA); // terminate drag/drop RevokeDragDrop (psks->hwndList); KMReleaseDropTarget (psks->pDropTarget); CoLockObjectExternal ((IUnknown*)psks->pDropTarget, FALSE, TRUE); // call function to remove hwnd from list if (psks->pKM->lpfnHwndListFunc) (psks->pKM->lpfnHwndListFunc)(hDlg, FALSE, NULL, NULL); // destroy data objects ImageList_Destroy (psks->hIml); sDestroyShareHolders (psks); sDestroySplitKeyStruct (psks); break; case WM_COMMAND: switch (LOWORD(wParam)) { case IDCANCEL : DestroyWindow (hDlg); break; case IDOK : psks = (PSPLITKEYSTRUCT)GetWindowLong (hDlg, GWL_USERDATA); EnableWindow (psks->pKM->hWndParent, FALSE); if (sSplitKey (psks)) { EnableWindow (psks->pKM->hWndParent, TRUE); DestroyWindow (hDlg); } else EnableWindow (psks->pKM->hWndParent, TRUE); break; case IDHELP : psks = (PSPLITKEYSTRUCT)GetWindowLong (hDlg, GWL_USERDATA); WinHelp (hDlg, psks->pKM->szHelpFile, HELP_CONTEXT, IDH_PGPCLSPLIT_SPLITDIALOG); break; case IDC_ADDSHAREHOLDER : psks = (PSPLITKEYSTRUCT)GetWindowLong (hDlg, GWL_USERDATA); EnableWindow (psks->pKM->hWndParent, FALSE); sAddShareHolderToList (hDlg, psks); EnableWindow (psks->pKM->hWndParent, TRUE); SetFocus (GetDlgItem (hDlg, IDC_ADDSHAREHOLDER)); break; case IDC_REMOVESHAREHOLDER : psks = (PSPLITKEYSTRUCT)GetWindowLong (hDlg, GWL_USERDATA); sRemoveShareHolderFromList (hDlg, psks); psks->iIndexCurrent = -1; psks->pshsCurrent = NULL; SetDlgItemText (hDlg, IDC_SHARES, ""); SetDlgItemText (hDlg, IDC_CURRENTSHAREHOLDER, ""); EnableWindow (GetDlgItem (hDlg, IDC_SHARES), FALSE); EnableWindow (GetDlgItem (hDlg, IDC_REMOVESHAREHOLDER), FALSE); break; case IDC_THRESHOLD : switch (HIWORD(wParam)) { case EN_CHANGE : psks = (PSPLITKEYSTRUCT)GetWindowLong (hDlg, GWL_USERDATA); if (psks) { GetDlgItemText (hDlg, IDC_THRESHOLD, sz, sizeof(sz)); if (lstrcmp (sz, "0")) { UINT u = GetDlgItemInt (hDlg, IDC_THRESHOLD, NULL, FALSE); if (u != 0) { psks->uThreshold = u; if (psks->uTotalShares >= psks->uThreshold) EnableWindow (GetDlgItem (hDlg, IDOK), TRUE); else EnableWindow (GetDlgItem (hDlg, IDOK), FALSE); } } } break; case EN_KILLFOCUS : u = GetDlgItemInt (hDlg, IDC_THRESHOLD, NULL, FALSE); if (u == 0) u = 1; SetDlgItemInt (hDlg, IDC_THRESHOLD, u, FALSE); break; } break; case IDC_SHARES : psks = (PSPLITKEYSTRUCT)GetWindowLong (hDlg, GWL_USERDATA); switch (HIWORD(wParam)) { case EN_CHANGE : if (psks) { PSHAREHOLDERSTRUCT pshs; GetDlgItemText (hDlg, IDC_SHARES, sz, sizeof(sz)); pshs = psks->pshsCurrent; if (pshs && (lstrcmp (sz, "0"))) { UINT u = GetDlgItemInt (hDlg, IDC_SHARES, NULL, FALSE); if (u != 0) { psks->uTotalShares -= pshs->uShares; pshs->uShares = u; psks->uTotalShares += pshs->uShares; SetDlgItemInt (hDlg, IDC_TOTALSHARES, psks->uTotalShares, FALSE); wsprintf (sz, "%i", pshs->uShares); ListView_SetItemText (psks->hwndList, psks->iIndexCurrent, 1, sz); if ((psks->uTotalShares >= psks->uThreshold) && (psks->uTotalShares <= MAX_TOTAL_SHARES)) EnableWindow (GetDlgItem (hDlg, IDOK), TRUE); else EnableWindow (GetDlgItem (hDlg, IDOK), FALSE); } } } break; case EN_KILLFOCUS : u = GetDlgItemInt (hDlg, IDC_SHARES, NULL, FALSE); if (u == 0) { u = 1; MessageBeep (MB_ICONASTERISK); } else if (psks->uTotalShares-psks->pshsCurrent->uShares+u > MAX_TOTAL_SHARES) { u = MAX_TOTAL_SHARES - (psks->uTotalShares - psks->pshsCurrent->uShares); MessageBeep (MB_ICONASTERISK); } SetDlgItemInt (hDlg, IDC_SHARES, u, FALSE); break; } break; } return TRUE; } return FALSE; }
bool AddContactDlgAccounts(HWND hdlg, AddDialogParam *acs) { PROTOACCOUNT** pAccounts; int iRealAccCount, iAccCount = 0; ProtoEnumAccounts(&iRealAccCount, &pAccounts); for (int i = 0; i < iRealAccCount; i++) { if (!IsAccountEnabled(pAccounts[i])) continue; DWORD dwCaps = (DWORD)CallProtoService(pAccounts[i]->szModuleName, PS_GETCAPS, PFLAGNUM_1, 0); if (dwCaps & PF1_BASICSEARCH || dwCaps & PF1_EXTSEARCH || dwCaps & PF1_SEARCHBYEMAIL || dwCaps & PF1_SEARCHBYNAME) iAccCount++; } if (iAccCount == 0) { if (GetParent(hdlg) == NULL) DestroyWindow(hdlg); else EndDialog(hdlg, 0); return false; } SIZE textSize; RECT rc; int iIndex = 0, cbWidth = 0; HIMAGELIST hIml = ImageList_Create(GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), ILC_COLOR32 | ILC_MASK, iAccCount, 0); ImageList_Destroy((HIMAGELIST)SendDlgItemMessage(hdlg, IDC_PROTO, CBEM_SETIMAGELIST, 0, (LPARAM)hIml)); SendDlgItemMessage(hdlg, IDC_PROTO, CB_RESETCONTENT, 0, 0); COMBOBOXEXITEM cbei = { 0 }; cbei.mask = CBEIF_IMAGE | CBEIF_SELECTEDIMAGE | CBEIF_TEXT | CBEIF_LPARAM; HDC hdc = GetDC(hdlg); SelectObject(hdc, (HFONT)SendDlgItemMessage(hdlg, IDC_PROTO, WM_GETFONT, 0, 0)); for (int i = 0; i < iRealAccCount; i++) { if (!IsAccountEnabled(pAccounts[i])) continue; DWORD dwCaps = (DWORD)CallProtoService(pAccounts[i]->szModuleName, PS_GETCAPS, PFLAGNUM_1, 0); if (!(dwCaps & PF1_BASICSEARCH) && !(dwCaps & PF1_EXTSEARCH) && !(dwCaps & PF1_SEARCHBYEMAIL) && !(dwCaps & PF1_SEARCHBYNAME)) continue; cbei.pszText = pAccounts[i]->tszAccountName; GetTextExtentPoint32(hdc, cbei.pszText, lstrlen(cbei.pszText), &textSize); if (textSize.cx > cbWidth) cbWidth = textSize.cx; HICON hIcon = (HICON)CallProtoService(pAccounts[i]->szModuleName, PS_LOADICON, PLI_PROTOCOL | PLIF_SMALL, 0); cbei.iImage = cbei.iSelectedImage = ImageList_AddIcon(hIml, hIcon); DestroyIcon(hIcon); cbei.lParam = (LPARAM)pAccounts[i]->szModuleName; SendDlgItemMessage(hdlg, IDC_PROTO, CBEM_INSERTITEM, 0, (LPARAM)&cbei); if (cbei.lParam && !strcmp(acs->proto, pAccounts[i]->szModuleName)) iIndex = cbei.iItem; cbei.iItem++; } cbWidth += 32; SendDlgItemMessage(hdlg, IDC_PROTO, CB_GETDROPPEDCONTROLRECT, 0, (LPARAM)&rc); if ((rc.right - rc.left) < cbWidth) SendDlgItemMessage(hdlg, IDC_PROTO, CB_SETDROPPEDWIDTH, cbWidth, 0); SendDlgItemMessage(hdlg, IDC_PROTO, CB_SETCURSEL, iIndex, 0); SendMessage(hdlg, WM_COMMAND, MAKEWPARAM(IDC_PROTO, CBN_SELCHANGE), (LPARAM)GetDlgItem(hdlg, IDC_PROTO)); if (iAccCount == 1) SetFocus(GetDlgItem(hdlg, IDC_USERID)); return true; }
INT_PTR CALLBACK RecvDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { TRecvContactsData* wndData = (TRecvContactsData*)GetWindowLong(hwndDlg, DWLP_USER); switch (msg) { case WM_INITDIALOG: { CLISTEVENT* pcle = (CLISTEVENT*)lParam; /// got it TranslateDialogDefault(hwndDlg); WindowList_Add(ghRecvWindowList, hwndDlg, pcle->hContact); SendMessageT(hwndDlg, WM_SETICON, ICON_SMALL, (LPARAM)LoadIcon(hInst, MAKEINTRESOURCE(IDI_CONTACTS))); EnableDlgItem(hwndDlg, IDOK, FALSE); EnableDlgItem(hwndDlg, IDDETAILS, FALSE); wndData = new TRecvContactsData(pcle->hContact); SetWindowLong(hwndDlg, DWLP_USER, (LONG)wndData); wndData->mhDbEvent = pcle->hDbEvent; /// initialized, pcle not needed anymore wndData->mhListIcon = ImageList_Create(GetSystemMetrics(SM_CXSMICON),GetSystemMetrics(SM_CYSMICON),ILC_COLORDDB|ILC_MASK, 0, 1); wndData->mhPopup = LoadMenu(hInst, MAKEINTRESOURCE(IDR_CONTACTMENU)); CallService(MS_LANGPACK_TRANSLATEMENU, (WPARAM)wndData->mhPopup, 0); wndData->hHook = HookEventMessage(ME_PROTO_ACK, hwndDlg, HM_EVENTSENT); char *szProto = GetContactProto(wndData->mhContact); HWND hLV = GetDlgItem(hwndDlg, IDC_CONTACTS); ListView_SetExtendedListViewStyle(hLV, LVS_EX_CHECKBOXES|LVS_EX_FULLROWSELECT); // add columns RecvListView_AddColumn(hLV, 120, (char*)SRCCallProtoService(szProto, PS_GETCAPS, PFLAG_UNIQUEIDTEXT, 0), FALSE, 0); RecvListView_AddColumn(hLV, 100, "Nick", TRUE, 1); RecvListView_AddColumn(hLV, 100, "First Name", TRUE, 2); RecvListView_AddColumn(hLV, 100, "Last Name", TRUE, 3); // fill in groups SendMessageT(GetDlgItem(hwndDlg, IDC_ENABLEGROUPS), BM_SETCHECK, (WPARAM)BST_UNCHECKED, 0); RebuildGroupCombo(hwndDlg); { // fill listview with received contacts DBEVENTINFO dbe = {0}; dbe.cbSize = sizeof(DBEVENTINFO); dbe.cbBlob = CallService(MS_DB_EVENT_GETBLOBSIZE, (WPARAM)wndData->mhDbEvent, 0); if (dbe.cbBlob != -1) // this marks an invalid hDbEvent - all smashed anyway... dbe.pBlob = (PBYTE)_malloca(dbe.cbBlob); CallService(MS_DB_EVENT_GET, (WPARAM)wndData->mhDbEvent, (LPARAM)&dbe); char* pcBlob = (char*)dbe.pBlob; char* pcEnd = (char*)dbe.pBlob + dbe.cbBlob; HICON hiProto = LoadContactProtoIcon(wndData->mhContact); ImageList_AddIcon(wndData->mhListIcon, hiProto); DestroyIcon(hiProto); // imagelist copied the resource ListView_SetImageList(hLV, wndData->mhListIcon, LVSIL_SMALL); LVITEM lvi = {0}; lvi.iImage = 0; lvi.mask = LVIF_TEXT | LVIF_IMAGE; for (int nItem = 0; ; nItem++) { // Nick int strsize = (int)strlennull(pcBlob); TReceivedItem* pItem = wndData->AddReceivedItem(); if (dbe.flags & DBEF_UTF) pItem->mcaNick = utf8_to_tchar((unsigned char*)pcBlob); else pItem->mcaNick = ansi_to_tchar(pcBlob); pcBlob += strsize + 1; // UIN strsize = (int)strlennull(pcBlob); pItem->mcaUIN = null_strdup(pcBlob); pcBlob += strsize + 1; // add to listview lvi.iItem = nItem; lvi.pszText = pItem->mcaUIN; ListView_InsertItem(hLV, &lvi); // with image ListView_SetItemTextT(hLV, nItem, 1, pItem->mcaNick); // check for end of contacts if (pcBlob >= pcEnd) break; } } // new dlg init wndData->hIcons[0] = InitMButton(hwndDlg, IDC_ADD, MAKEINTRESOURCEA(IDI_ADDCONTACT), "Add Contact Permanently to List"); wndData->hIcons[1] = InitMButton(hwndDlg, IDC_DETAILS, MAKEINTRESOURCEA(IDI_USERDETAILS), "View User's Details"); wndData->hIcons[2] = InitMButton(hwndDlg, IDC_HISTORY, MAKEINTRESOURCEA(IDI_HISTORY), "View User's History"); wndData->hIcons[3] = InitMButton(hwndDlg, IDC_USERMENU, MAKEINTRESOURCEA(IDI_DOWNARROW), "User Menu"); SendMessageT(hwndDlg,DM_UPDATETITLE,0,0); // new dialog init done Utils_RestoreWindowPosition(hwndDlg, NULL, MODULENAME, ""); return TRUE; } case WM_NOTIFY: if (((LPNMHDR)lParam)->idFrom == IDC_CONTACTS) { switch (((LPNMHDR)lParam)->code) { case NM_DBLCLK: { HWND hLV = GetDlgItem(hwndDlg, IDC_CONTACTS); if (ListView_GetSelectedCount(hLV) != 1) break; // if not clicking on item, bye wndData->iPopupItem = ListView_GetNextItem(hLV, -1, LVNI_ALL|LVNI_SELECTED); if (wndData->iPopupItem == -1) break; // if no item selected no user details available return SendMessageT(hwndDlg, WM_COMMAND, ID_POPUP_USERDETAILS, 0); // show user details } case LVN_ITEMCHANGED: { LPNMLISTVIEW pNMLV = (LPNMLISTVIEW)lParam; HWND hLV = GetDlgItem(hwndDlg, IDC_CONTACTS); // optimisation, for FOR-Cycle bool bExistsCheckedItem = false; // there must be no checked items to disable "Add" button if (ListView_GetCheckState(hLV, pNMLV->iItem)) { // the user has checked this item bExistsCheckedItem = true; // enable "Add" button } else { // loop thru items and check if at least one is checked for (int i = 0; i < ListView_GetItemCount(hLV); i++) if (ListView_GetCheckState(hLV, i)) { // we found checked item, enable add, exit loop bExistsCheckedItem = true; break; } } EnableDlgItem(hwndDlg, IDOK, bExistsCheckedItem); EnableDlgItem(hwndDlg, IDDETAILS, ListView_GetSelectedCount(hLV) > 0); break; } } } break; case WM_COMMAND: { if (!lParam && CallService(MS_CLIST_MENUPROCESSCOMMAND, MAKEWPARAM(LOWORD(wParam), MPCF_CONTACTMENU), (LPARAM)wndData->mhContact)) break; switch(LOWORD(wParam)) { case IDOK: // "Add Selected" button click { // for each selected item, find its index in the hDbEvent // and after that add this item to the DB permanently char* caUIN; HWND hLV = GetDlgItem(hwndDlg, IDC_CONTACTS); HWND hGroupsCombo = GetDlgItem(hwndDlg, IDC_GROUPS); HWND hGroupsCheck = GetDlgItem(hwndDlg, IDC_ENABLEGROUPS); int curs = SendMessageT(hGroupsCombo, CB_GETCURSEL, 0, 0); TCHAR* caGroup = NULL; int nGroupId = -1; if (curs != CB_ERR && IsWindowEnabled(hGroupsCheck) && SendMessageT(hGroupsCheck, BM_GETCHECK, 0, 0)) { //got groups, get the one selected in combo TCHAR* caGroup = (TCHAR*)_malloca((SendMessageT(hGroupsCombo, CB_GETLBTEXTLEN, curs, 0) + 1) * sizeof(WCHAR)); SendMessageT(hGroupsCombo, CB_GETLBTEXT, curs, (LPARAM)caGroup); nGroupId = SendMessageT(hGroupsCombo, CB_GETITEMDATA, curs, 0); } for (int i = 0; i < ListView_GetItemCount(hLV); i++) if (ListView_GetCheckState(hLV, i)) { // found checked contact item, add it caUIN = ListView_GetItemTextEx(hLV, i, 0); for (int j = 0; j < wndData->cbReceived; j++) // determine item index in packet if (!strcmpnull(wndData->maReceived[j]->mcaUIN, caUIN)) { char* szProto = GetContactProto(wndData->mhContact); HANDLE hContact = (HANDLE)SRCCallProtoService(szProto, PS_ADDTOLISTBYEVENT, MAKEWPARAM(0, j), (LPARAM)wndData->mhDbEvent); if (hContact && caGroup) { // use newest group API if available if (ServiceExists(MS_CLIST_CONTACTCHANGEGROUP)) CallService(MS_CLIST_CONTACTCHANGEGROUP, (WPARAM)hContact, (LPARAM)nGroupId); else DBWriteContactSettingStringT(hContact, "CList", "Group", caGroup); } break; } SAFE_FREE((void**)&caUIN); } // move to next item break; } case IDDETAILS: { // for each selected item, find its index in the hDbEvent // and after that add this item to the DB // finally, request Details window for this hContact HWND hLV = GetDlgItem(hwndDlg, IDC_CONTACTS); for (int i = 0; i < ListView_GetItemCount(hLV); i++) if (ListView_GetItemState(hLV, i, LVIS_SELECTED)) { HANDLE hContact = CreateTemporaryContactForItem(hwndDlg, wndData, i); if (hContact) CallService(MS_USERINFO_SHOWDIALOG, (WPARAM)hContact, 0); } break; } case IDCANCEL: { SendMessageT(hwndDlg, WM_CLOSE, 0, 0); break; } case IDC_ENABLEGROUPS: { EnableGroupCombo(hwndDlg); break; } case IDC_GROUPS: { // rebuild group list on popup if (HIWORD(wParam) == CBN_DROPDOWN) RebuildGroupCombo(hwndDlg); break; } case ID_POPUP_ADDUSER: { HANDLE hContact = CreateTemporaryContactForItem(hwndDlg, wndData, wndData->iPopupItem); if (hContact) DialogAddContactExecute(hwndDlg, hContact); break; } case ID_POPUP_USERDETAILS: { HANDLE hContact = CreateTemporaryContactForItem(hwndDlg, wndData, wndData->iPopupItem); if (hContact) CallService(MS_USERINFO_SHOWDIALOG, (WPARAM)hContact, 0 ); break; } case ID_POPUP_SENDMESSAGE: { HANDLE hContact = CreateTemporaryContactForItem(hwndDlg, wndData, wndData->iPopupItem); if (hContact) CallService(MS_MSG_SENDMESSAGE, (WPARAM)hContact, 0); break; } case IDC_USERMENU: { RECT rc; HMENU hMenu = (HMENU)CallService(MS_CLIST_MENUBUILDCONTACT, (WPARAM)wndData->mhContact, 0); GetWindowRect(GetDlgItem(hwndDlg,IDC_USERMENU), &rc); TrackPopupMenu(hMenu, 0, rc.left, rc.bottom, 0, hwndDlg, NULL); DestroyMenu(hMenu); break; } case IDC_HISTORY: CallService(MS_HISTORY_SHOWCONTACTHISTORY,(WPARAM)wndData->mhContact,0); break; case IDC_DETAILS: CallService(MS_USERINFO_SHOWDIALOG,(WPARAM)wndData->mhContact,0); break; case IDC_ADD: DialogAddContactExecute(hwndDlg, wndData->mhContact); break; } break; } case WM_CONTEXTMENU: { HWND hLV = GetDlgItem(hwndDlg, IDC_CONTACTS); LVHITTESTINFO lvh; RECT rt; wndData->iPopupItem = -1; if ((HWND)wParam != hLV) break; // if not our ListView go away lvh.pt.x = LOWORD(lParam); lvh.pt.y = HIWORD(lParam); if (GetWindowRect(hLV, &rt)==0) return FALSE; // ?? why this, some check ?? ScreenToClient(hLV, &lvh.pt); // convert to ListView local coordinates int ci = ListView_HitTest(hLV, &lvh); if (ci==-1) break; // mouse is not over any item wndData->iPopupItem = ci; TrackPopupMenu(GetSubMenu(wndData->mhPopup, 0), TPM_LEFTALIGN|TPM_TOPALIGN, LOWORD(lParam), HIWORD(lParam), 0, hwndDlg, NULL); break; } case HM_EVENTSENT: { ACKDATA *ack=(ACKDATA*)lParam; if (ack->type!=ACKTYPE_SEARCH) break; // not search ack, go away if (ack->hProcess!=wndData->rhSearch) break; //not our search, go away if (ack->result==ACKRESULT_DATA) { HWND hLV = GetDlgItem(hwndDlg, IDC_CONTACTS); PROTOSEARCHRESULT* psr = (PROTOSEARCHRESULT*)ack->lParam; LVFINDINFO fi; fi.flags = LVFI_STRING; fi.psz = wndData->haUin; int iLPos = ListView_FindItem(hLV, -1, &fi); if (iLPos==-1) iLPos=0; // ListView_SetItemText(hLV, iLPos, 0, psr->email); // not sent by ICQ, and currently unsupported either if (strcmpnull(psr->nick, "") && psr->nick) ListView_SetItemText(hLV, iLPos, 1, psr->nick); ListView_SetItemText(hLV, iLPos, 2, psr->firstName); ListView_SetItemText(hLV, iLPos, 3, psr->lastName); break; } SAFE_FREE((void**)&wndData->haUin); break; } case WM_CLOSE: // user closed window, so destroy it { WindowList_Remove(ghRecvWindowList, hwndDlg); DestroyWindow(hwndDlg); break; } case WM_DESTROY: // last message received by this dialog, cleanup { CallService(MS_DB_EVENT_MARKREAD, (WPARAM)wndData->mhContact, (LPARAM)wndData->mhDbEvent); Utils_SaveWindowPosition(hwndDlg, NULL, MODULENAME, ""); ImageList_Destroy(wndData->mhListIcon); UnhookEvent(wndData->hHook); DestroyMenu(wndData->mhPopup); for (int i=0; i < SIZEOF(wndData->hIcons); i++) DestroyIcon(wndData->hIcons[i]); delete wndData; // automatically calls destructor break; } case WM_MEASUREITEM: return CallService(MS_CLIST_MENUMEASUREITEM, wParam, lParam); case WM_DRAWITEM: { DrawProtocolIcon(hwndDlg, lParam, wndData->mhContact); return CallService(MS_CLIST_MENUDRAWITEM, wParam, lParam); } case WM_SIZE: { // make the dlg resizeable UTILRESIZEDIALOG urd = {0}; if (IsIconic(hwndDlg)) break; urd.cbSize = sizeof(urd); urd.hInstance = hInst; urd.hwndDlg = hwndDlg; urd.lParam = 0; // user-defined urd.lpTemplate = MAKEINTRESOURCEA(IDD_RECEIVE); urd.pfnResizer = RecvDlg_Resize; CallService(MS_UTILS_RESIZEDIALOG, 0, (LPARAM) & urd); break; } case WM_GETMINMAXINFO: { MINMAXINFO* mmi=(MINMAXINFO*)lParam; mmi->ptMinTrackSize.x = 480+2*GetSystemMetrics(SM_CXSIZEFRAME); mmi->ptMinTrackSize.y = 130+2*GetSystemMetrics(SM_CYSIZEFRAME); break; } case DM_UPDATETITLE: { UpdateDialogTitle(hwndDlg, wndData?wndData->mhContact:NULL, "Contacts from"); if (wndData) UpdateDialogAddButton(hwndDlg, wndData->mhContact); break; } } return FALSE; }
HIMAGELIST HIDPI_ImageList_LoadImage( HINSTANCE hinst, LPCTSTR lpbmp, int cx, int cGrow, COLORREF crMask, UINT uType, UINT uFlags ) { HBITMAP hbmImage = NULL; HIMAGELIST piml = NULL; BITMAP bm; int cImages, cxImage, cy; int BmpLogPixelsX, BmpLogPixelsY; UINT flags; if ((uType != IMAGE_BITMAP) || // Image type is not IMAGE_BITMAP (cx == 0)) // Caller doesn't care about the dimensions of the image - assumes the ones in the file { piml = ImageList_LoadImage(hinst, lpbmp, cx, cGrow, crMask, uType, uFlags); goto cleanup; } if (!HIDPI_GetBitmapLogPixels(hinst, lpbmp, &BmpLogPixelsX, &BmpLogPixelsY)) { goto cleanup; } hbmImage = (HBITMAP)LoadImage(hinst, lpbmp, uType, 0, 0, uFlags); if (!hbmImage || (sizeof(bm) != GetObject(hbmImage, sizeof(bm), &bm))) { goto cleanup; } // do we need to scale this image? if (BmpLogPixelsX == g_HIDPI_LogPixelsX) { piml = ImageList_LoadImage(hinst, lpbmp, cx, cGrow, crMask, uType, uFlags); goto cleanup; } cxImage = HIDPIMulDiv(cx, BmpLogPixelsX, g_HIDPI_LogPixelsX); // Bitmap width should be multiple integral of image width. // If not, that means either your bitmap is wrong or passed in cx is wrong. // ASSERT((bm.bmWidth % cxImage) == 0); cImages = bm.bmWidth / cxImage; cy = HIDPIMulDiv(bm.bmHeight, g_HIDPI_LogPixelsY, BmpLogPixelsY); if ((g_HIDPI_LogPixelsX % BmpLogPixelsX) == 0) { HIDPI_StretchBitmap(&hbmImage, cx * cImages, cy, 1, 1); } else { // Here means the DPI is not integral multiple of standard DPI (96DPI). // So if we stretch entire bitmap together, we are not sure each indivisual // image will be stretch to right place. It is controled by StretchBlt(). // (for example, a 16 pixel icon, the first one might be stretch to 22 pixels // and next one might be stretched to 20 pixels) // What we have to do here is stretching indivisual image separately to make sure // every one is stretched properly. HIDPI_StretchBitmap(&hbmImage, cx, cy, cImages, 1); } flags = 0; // ILC_MASK is important for supporting CLR_DEFAULT if (crMask != CLR_NONE) { flags |= ILC_MASK; } // ILC_COLORMASK bits are important if we ever want to Merge ImageLists if (bm.bmBits) { flags |= (bm.bmBitsPixel & ILC_COLORMASK); } // bitmap MUST be de-selected from the DC // create the image list of the size asked for. piml = ImageList_Create(cx, cy, flags, cImages, cGrow); if (piml) { int added; if (crMask == CLR_NONE) { added = ImageList_Add(piml, hbmImage, NULL); } else { added = ImageList_AddMasked(piml, hbmImage, crMask); } if (added < 0) { ImageList_Destroy(piml); piml = NULL; } } cleanup: DeleteObject(hbmImage); return piml; }
LRESULT CVideoMarkup::OnButtonUp( UINT, WPARAM, LPARAM lParam, BOOL&) { POINT p; p.x = LOWORD(lParam); p.y = HIWORD(lParam); if (draggingIcon) { // we just completed an icon drag // End the drag-and-drop process draggingIcon = FALSE; ImageList_DragLeave(m_sampleListView); ImageList_EndDrag(); ImageList_Destroy(hDragImageList); SetCursor(LoadCursor(NULL, IDC_ARROW)); ReleaseCapture(); // Determine the position of the drop point LVHITTESTINFO lvhti; lvhti.pt = p; ClientToScreen(&lvhti.pt); ::ScreenToClient(m_sampleListView, &lvhti.pt); ListView_HitTestEx(m_sampleListView, &lvhti); CRect posRect, negRect, motionRect, rangeRect; ListView_GetGroupRect(m_sampleListView, GROUPID_POSSAMPLES, LVGGR_GROUP, &posRect); ListView_GetGroupRect(m_sampleListView, GROUPID_NEGSAMPLES, LVGGR_GROUP, &negRect); ListView_GetGroupRect(m_sampleListView, GROUPID_MOTIONSAMPLES, LVGGR_GROUP, &motionRect); ListView_GetGroupRect(m_sampleListView, GROUPID_RANGESAMPLES, LVGGR_GROUP, &rangeRect); int newGroupId; if (posRect.PtInRect(lvhti.pt)) newGroupId = GROUPID_POSSAMPLES; else if (negRect.PtInRect(lvhti.pt)) newGroupId = GROUPID_NEGSAMPLES; else if (motionRect.PtInRect(lvhti.pt)) newGroupId = GROUPID_MOTIONSAMPLES; else if (rangeRect.PtInRect(lvhti.pt)) newGroupId = GROUPID_RANGESAMPLES; else newGroupId = GROUPID_TRASH; // update group membership of selected items based on drop location int numSelected = ListView_GetSelectedCount(m_sampleListView); int iSelection = -1; for (int iIndex=0; iIndex<numSelected; iIndex++) { // retrieve the selected item LVITEM lvi; iSelection = ListView_GetNextItem(m_sampleListView, iSelection, LVNI_SELECTED); lvi.mask = LVIF_IMAGE | LVIF_STATE | LVIF_GROUPID; lvi.state = 0; lvi.stateMask = 0; lvi.iItem = iSelection; lvi.iSubItem = 0; ListView_GetItem(m_sampleListView, &lvi); // Get the ID of this selected item UINT sampleId = ListView_MapIndexToID(m_sampleListView, iSelection); // test if this is an allowable group membership change int origGroupId = sampleSet.GetOriginalSampleGroup(sampleId); if (!GroupTransitionIsAllowed(origGroupId, newGroupId)) { // this is not a valid change so we'll move to the next item continue; } // update sample group in training set sampleSet.SetSampleGroup(sampleId, newGroupId); // Update item in list view with new group id lvi.iGroupId = newGroupId; ListView_SetItem(m_sampleListView, &lvi); } m_sampleListView.Invalidate(FALSE); } else if (m_videoLoader.videoLoaded && selectingRegion) { // we just finished drawing a selection ClipCursor(NULL); // restore full cursor movement if (!m_videoRect.PtInRect(p)) { InvalidateRect(&m_videoRect,FALSE); return 0; } selectingRegion = false; Rect selectRect; selectRect.X = (INT) min(selectStart.X, selectCurrent.X); selectRect.Y = (INT) min(selectStart.Y, selectCurrent.Y); selectRect.Width = (INT) abs(selectStart.X - selectCurrent.X); selectRect.Height = (INT) abs(selectStart.Y - selectCurrent.Y); Rect drawBounds(0,0,VIDEO_X,VIDEO_Y); selectRect.Intersect(drawBounds); double scaleX = ((double)m_videoLoader.videoX) / ((double)VIDEO_X); double scaleY = ((double)m_videoLoader.videoY) / ((double)VIDEO_Y); selectRect.X = (INT) (scaleX * selectRect.X); selectRect.Y = (INT) (scaleY * selectRect.Y); selectRect.Width = (INT) (scaleX * selectRect.Width); selectRect.Height = (INT) (scaleY * selectRect.Height); // discard tiny samples since they won't help if ((selectRect.Width > 10) && (selectRect.Height > 10)) { TrainingSample *sample; // if we're in motion mode, the behavior is a little special if (recognizerMode == MOTION_FILTER) { sample = new TrainingSample(m_videoLoader.copyFrame, m_videoLoader.GetMotionHistory(), m_sampleListView, m_hImageList, selectRect, GROUPID_MOTIONSAMPLES); } else { sample = new TrainingSample(m_videoLoader.copyFrame, m_sampleListView, m_hImageList, selectRect, currentGroupId); } sampleSet.AddSample(sample); } InvalidateRect(&m_videoRect, FALSE); } return 0; }
static void test_layout(void) { HWND hRebar; REBARBANDINFOA rbi; HIMAGELIST himl; REBARINFO ri; rbsize_results_init(); hRebar = create_rebar_control(); check_sizes(); rbi.cbSize = REBARBANDINFOA_V6_SIZE; rbi.fMask = RBBIM_SIZE | RBBIM_CHILDSIZE | RBBIM_CHILD; rbi.cx = 200; rbi.cxMinChild = 100; rbi.cyMinChild = 30; rbi.hwndChild = NULL; SendMessageA(hRebar, RB_INSERTBANDA, -1, (LPARAM)&rbi); check_sizes(); rbi.fMask |= RBBIM_STYLE; rbi.fStyle = RBBS_CHILDEDGE; SendMessageA(hRebar, RB_INSERTBANDA, -1, (LPARAM)&rbi); check_sizes(); rbi.fStyle = 0; rbi.cx = 200; rbi.cxMinChild = 30; rbi.cyMinChild = 30; rbi.hwndChild = build_toolbar(0, hRebar); SendMessageA(hRebar, RB_INSERTBANDA, -1, (LPARAM)&rbi); check_sizes(); rbi.fStyle = RBBS_CHILDEDGE; rbi.cx = 68; rbi.hwndChild = build_toolbar(0, hRebar); SendMessageA(hRebar, RB_INSERTBANDA, -1, (LPARAM)&rbi); check_sizes(); SetWindowLongA(hRebar, GWL_STYLE, GetWindowLongA(hRebar, GWL_STYLE) | RBS_BANDBORDERS); check_sizes(); /* a style change won't start a relayout */ rbi.fMask = RBBIM_SIZE; rbi.cx = 66; SendMessageA(hRebar, RB_SETBANDINFOA, 3, (LPARAM)&rbi); check_sizes(); /* here it will be relayouted */ /* this will force a new row */ rbi.fMask = RBBIM_SIZE | RBBIM_CHILDSIZE | RBBIM_CHILD; rbi.cx = 200; rbi.cxMinChild = 400; rbi.cyMinChild = 30; rbi.hwndChild = build_toolbar(0, hRebar); SendMessageA(hRebar, RB_INSERTBANDA, 1, (LPARAM)&rbi); check_sizes(); rbi.fMask = RBBIM_STYLE; rbi.fStyle = RBBS_HIDDEN; SendMessageA(hRebar, RB_SETBANDINFOA, 2, (LPARAM)&rbi); check_sizes(); SendMessageA(hRebar, RB_DELETEBAND, 2, 0); check_sizes(); SendMessageA(hRebar, RB_DELETEBAND, 0, 0); check_sizes(); SendMessageA(hRebar, RB_DELETEBAND, 1, 0); check_sizes(); DestroyWindow(hRebar); hRebar = create_rebar_control(); add_band_w(hRebar, "ABC", 70, 40, 100); add_band_w(hRebar, NULL, 40, 70, 100); add_band_w(hRebar, NULL, 170, 240, 100); add_band_w(hRebar, "MMMMMMM", 60, 60, 100); add_band_w(hRebar, NULL, 200, 200, 100); check_sizes(); SendMessageA(hRebar, RB_MAXIMIZEBAND, 1, TRUE); check_sizes(); SendMessageA(hRebar, RB_MAXIMIZEBAND, 1, TRUE); check_sizes(); SendMessageA(hRebar, RB_MAXIMIZEBAND, 2, FALSE); check_sizes(); SendMessageA(hRebar, RB_MINIMIZEBAND, 2, 0); check_sizes(); SendMessageA(hRebar, RB_MINIMIZEBAND, 0, 0); check_sizes(); /* an image will increase the band height */ himl = ImageList_LoadImageA(GetModuleHandleA("comctl32"), MAKEINTRESOURCEA(121), 24, 2, CLR_NONE, IMAGE_BITMAP, LR_DEFAULTCOLOR); ri.cbSize = sizeof(ri); ri.fMask = RBIM_IMAGELIST; ri.himl = himl; ok(SendMessageA(hRebar, RB_SETBARINFO, 0, (LPARAM)&ri), "RB_SETBARINFO failed\n"); rbi.fMask = RBBIM_IMAGE; rbi.iImage = 1; SendMessageA(hRebar, RB_SETBANDINFOA, 1, (LPARAM)&rbi); check_sizes(); /* after removing it everything is back to normal*/ rbi.iImage = -1; SendMessageA(hRebar, RB_SETBANDINFOA, 1, (LPARAM)&rbi); check_sizes(); /* Only -1 means that the image is not present. Other invalid values increase the height */ rbi.iImage = -2; SendMessageA(hRebar, RB_SETBANDINFOA, 1, (LPARAM)&rbi); check_sizes(); DestroyWindow(hRebar); /* VARHEIGHT resizing test on a horizontal rebar */ hRebar = create_rebar_control(); SetWindowLongA(hRebar, GWL_STYLE, GetWindowLongA(hRebar, GWL_STYLE) | RBS_AUTOSIZE); check_sizes(); rbi.fMask = RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_SIZE | RBBIM_STYLE; rbi.fStyle = RBBS_VARIABLEHEIGHT; rbi.cxMinChild = 50; rbi.cyMinChild = 10; rbi.cyIntegral = 11; rbi.cyChild = 70; rbi.cyMaxChild = 200; rbi.cx = 90; rbi.hwndChild = build_toolbar(0, hRebar); SendMessageA(hRebar, RB_INSERTBANDA, -1, (LPARAM)&rbi); rbi.cyChild = 50; rbi.hwndChild = build_toolbar(0, hRebar); SendMessageA(hRebar, RB_INSERTBANDA, -1, (LPARAM)&rbi); rbi.cyMinChild = 40; rbi.cyChild = 50; rbi.cyIntegral = 5; rbi.hwndChild = build_toolbar(0, hRebar); SendMessageA(hRebar, RB_INSERTBANDA, -1, (LPARAM)&rbi); check_sizes(); DestroyWindow(hRebar); /* VARHEIGHT resizing on a vertical rebar */ hRebar = create_rebar_control(); SetWindowLongA(hRebar, GWL_STYLE, GetWindowLongA(hRebar, GWL_STYLE) | CCS_VERT | RBS_AUTOSIZE); check_sizes(); rbi.fMask = RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_SIZE | RBBIM_STYLE; rbi.fStyle = RBBS_VARIABLEHEIGHT; rbi.cxMinChild = 50; rbi.cyMinChild = 10; rbi.cyIntegral = 11; rbi.cyChild = 70; rbi.cyMaxChild = 90; rbi.cx = 90; rbi.hwndChild = build_toolbar(0, hRebar); SendMessageA(hRebar, RB_INSERTBANDA, -1, (LPARAM)&rbi); check_sizes(); rbi.cyChild = 50; rbi.hwndChild = build_toolbar(0, hRebar); SendMessageA(hRebar, RB_INSERTBANDA, -1, (LPARAM)&rbi); check_sizes(); rbi.cyMinChild = 40; rbi.cyChild = 50; rbi.cyIntegral = 5; rbi.hwndChild = build_toolbar(0, hRebar); SendMessageA(hRebar, RB_INSERTBANDA, -1, (LPARAM)&rbi); check_sizes(); rbsize_results_free(); DestroyWindow(hRebar); ImageList_Destroy(himl); }
bool SmileyPackType::LoadSmileyFileXEP(CMString& tbuf, bool onlyInfo, CMString&) { _TMatcher *m0, *m1, *m2; _TPattern *dbname_re = _TPattern::compile(_T("<DataBaseName>\\s*\"(.*?)\"\\s*</DataBaseName>"), _TPattern::MULTILINE_MATCHING); _TPattern *author_re = _TPattern::compile(_T("<PackageAuthor>\\s*\"(.*?)\"\\s*</PackageAuthor>"), _TPattern::MULTILINE_MATCHING); _TPattern *settings_re = _TPattern::compile(_T("<settings>(.*?)</settings>"), _TPattern::MULTILINE_MATCHING | _TPattern::DOT_MATCHES_ALL); m0 = settings_re->createTMatcher(tbuf); if (m0->findFirstMatch()) { CMString settings = m0->getGroup(1); m1 = author_re->createTMatcher(settings); if (m1->findFirstMatch()) { m_Author = m1->getGroup(1); DecodeHTML(m_Author); } delete m1; m1 = dbname_re->createTMatcher(settings); if (m1->findFirstMatch()) { m_Name = m1->getGroup(1); DecodeHTML(m_Name); } delete m1; } delete m0; delete dbname_re; delete author_re; delete settings_re; if (!onlyInfo) { _TPattern *record_re = _TPattern::compile(_T("<record.*?ImageIndex=\"(.*?)\".*?>(?:\\s*\"(.*?)\")?(.*?)</record>"), _TPattern::MULTILINE_MATCHING | _TPattern::DOT_MATCHES_ALL); _TPattern *expression_re = _TPattern::compile(_T("<Expression>\\s*\"(.*?)\"\\s*</Expression>"), _TPattern::MULTILINE_MATCHING); _TPattern *pastetext_re = _TPattern::compile(_T("<PasteText>\\s*\"(.*?)\"\\s*</PasteText>"), _TPattern::MULTILINE_MATCHING); _TPattern *images_re = _TPattern::compile(_T("<images>(.*?)</images>"), _TPattern::MULTILINE_MATCHING | _TPattern::DOT_MATCHES_ALL); _TPattern *image_re = _TPattern::compile(_T("<Image>(.*?)</Image>"), _TPattern::MULTILINE_MATCHING | _TPattern::DOT_MATCHES_ALL); _TPattern *imagedt_re = _TPattern::compile(_T("<!\\[CDATA\\[(.*?)\\]\\]>"), _TPattern::MULTILINE_MATCHING); m0 = images_re->createTMatcher(tbuf); if (m0->findFirstMatch()) { CMString images = m0->getGroup(1); m1 = imagedt_re->createTMatcher(images); if (m1->findFirstMatch()) { IStream* pStream = DecodeBase64Data(T2A_SM(m1->getGroup(1).c_str())); if (pStream != NULL) { if (m_hSmList != NULL) ImageList_Destroy(m_hSmList); m_hSmList = ImageList_Read(pStream); pStream->Release(); } } delete m1; } delete m0; m0 = record_re->createTMatcher(tbuf); while (m0->findNextMatch()) { SmileyType *dat = new SmileyType; dat->SetRegEx(true); dat->SetImList(m_hSmList, _ttol(m0->getGroup(1).c_str())); dat->m_ToolText = m0->getGroup(2); DecodeHTML(dat->m_ToolText); CMString rec = m0->getGroup(3); m1 = expression_re->createTMatcher(rec); if (m1->findFirstMatch()) { dat->m_TriggerText = m1->getGroup(1); DecodeHTML(dat->m_TriggerText); } delete m1; m1 = pastetext_re->createTMatcher(rec); if (m1->findFirstMatch()) { dat->m_InsertText = m1->getGroup(1); DecodeHTML(dat->m_InsertText); } delete m1; dat->SetHidden(dat->m_InsertText.IsEmpty()); m1 = image_re->createTMatcher(rec); if (m1->findFirstMatch()) { CMString images = m1->getGroup(1); m2 = imagedt_re->createTMatcher(images); if (m2->findFirstMatch()) { IStream* pStream = DecodeBase64Data(T2A_SM(m2->getGroup(1).c_str())); if (pStream != NULL) { dat->LoadFromImage(pStream); pStream->Release(); } } delete m2; } delete m1; m_SmileyList.insert(dat); } delete m0; delete record_re; delete expression_re; delete pastetext_re; delete images_re; delete image_re; delete imagedt_re; } m_VisibleCount = m_SmileyList.getCount(); AddTriggersToSmileyLookup(); selec.x = 0; selec.y = 0; win.x = 0; win.y = 0; return true; }
BOOL OptTree_ProcessMessage(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam, BOOL *result, int idcTree, OPTTREE_OPTION *options, int optionCount) { enum { IMG_GROUP, IMG_CHECK, IMG_NOCHECK, IMG_RCHECK, IMG_NORCHECK, IMG_GRPOPEN, IMG_GRPCLOSED }; HWND hwndTree = GetDlgItem(hwnd, idcTree); switch (msg) { case WM_INITDIALOG: { int indx; TCHAR itemName[1024]; HIMAGELIST hImgLst; TreeView_SelectItem(hwndTree, NULL); TreeView_DeleteAllItems(hwndTree); hImgLst = ImageList_Create(GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), ILC_COLOR|ILC_COLOR32|ILC_MASK, 5, 1); ImageList_ReplaceIcon(hImgLst, -1, (HICON)LoadSkinnedIcon(SKINICON_OTHER_MIRANDA)); ImageList_ReplaceIcon(hImgLst, -1, (HICON)LoadSkinnedIcon(SKINICON_OTHER_TICK)); // check on ImageList_ReplaceIcon(hImgLst, -1, (HICON)LoadSkinnedIcon(SKINICON_OTHER_NOTICK)); // check off ImageList_ReplaceIcon(hImgLst, -1, (HICON)LoadSkinnedIcon(SKINICON_OTHER_TICK)); // radio on ImageList_ReplaceIcon(hImgLst, -1, (HICON)LoadSkinnedIcon(SKINICON_OTHER_NOTICK)); // radio on ImageList_ReplaceIcon(hImgLst, -1, (HICON)LoadSkinnedIcon(SKINICON_OTHER_GROUPOPEN)); ImageList_ReplaceIcon(hImgLst, -1, (HICON)LoadSkinnedIcon(SKINICON_OTHER_GROUPSHUT)); TreeView_SetImageList(hwndTree, hImgLst, TVSIL_NORMAL); /* build options tree. based on code from IcoLib */ for (indx = 0; indx < optionCount; indx++) { TCHAR* sectionName; int sectionLevel = 0; HTREEITEM hSection = NULL; if (options[indx].szOptionName) lstrcpy(itemName, options[indx].szOptionName); else itemName[0] = 0; sectionName = itemName; while (sectionName) { // allow multi-level tree TCHAR* pItemName = sectionName; HTREEITEM hItem; if (sectionName = _tcschr(sectionName, '/')) { // one level deeper *sectionName = 0; sectionName++; } hItem = OptTree_FindNamedTreeItemAt(hwndTree, hSection, pItemName); //if (!sectionName || !hItem) if ((!sectionName || !hItem) && !(options[indx].dwFlag & OPTTREE_INVISIBLE)) { if (!hItem) { TVINSERTSTRUCT tvis = {0}; tvis.hParent = hSection; tvis.hInsertAfter = TVI_LAST;//TVI_SORT; tvis.item.mask = TVIF_TEXT|TVIF_PARAM|TVIF_STATE|TVIF_IMAGE|TVIF_SELECTEDIMAGE; tvis.item.pszText = pItemName; tvis.item.state = tvis.item.stateMask = TVIS_EXPANDED; if (sectionName) { tvis.item.lParam = -1; tvis.item.state |= TVIS_BOLD; tvis.item.stateMask |= TVIS_BOLD; tvis.item.iImage = tvis.item.iSelectedImage = IMG_GRPOPEN; } else { tvis.item.lParam = indx; if (options[indx].groupId == OPTTREE_CHECK) { tvis.item.iImage = tvis.item.iSelectedImage = IMG_NOCHECK; } else { tvis.item.iImage = tvis.item.iSelectedImage = IMG_NORCHECK; } } hItem = TreeView_InsertItem(hwndTree, &tvis); if (!sectionName) options[indx].hItem = hItem; } } sectionLevel++; hSection = hItem; } } OptTree_Translate(hwndTree); ShowWindow(hwndTree, SW_SHOW); TreeView_SelectItem(hwndTree, OptTree_FindNamedTreeItemAt(hwndTree, 0, NULL)); break; } case WM_DESTROY: { ImageList_Destroy(TreeView_GetImageList(hwndTree, TVSIL_NORMAL)); break; } case WM_NOTIFY: { LPNMHDR lpnmhdr = (LPNMHDR)lparam; if (lpnmhdr->idFrom != idcTree) break; switch (lpnmhdr->code) { case NM_CLICK: { TVHITTESTINFO hti; hti.pt.x=(short)LOWORD(GetMessagePos()); hti.pt.y=(short)HIWORD(GetMessagePos()); ScreenToClient(lpnmhdr->hwndFrom,&hti.pt); if(TreeView_HitTest(lpnmhdr->hwndFrom,&hti)) { if(hti.flags&TVHT_ONITEMICON) { TVITEM tvi; tvi.mask=TVIF_HANDLE|TVIF_PARAM|TVIF_IMAGE|TVIF_SELECTEDIMAGE; tvi.hItem=hti.hItem; TreeView_GetItem(lpnmhdr->hwndFrom,&tvi); switch (tvi.iImage) { case IMG_GRPOPEN: tvi.iImage = tvi.iSelectedImage = IMG_GRPCLOSED; TreeView_Expand(lpnmhdr->hwndFrom, tvi.hItem, TVE_COLLAPSE); break; case IMG_GRPCLOSED: tvi.iImage = tvi.iSelectedImage = IMG_GRPOPEN; TreeView_Expand(lpnmhdr->hwndFrom, tvi.hItem, TVE_EXPAND); break; case IMG_CHECK: tvi.iImage = tvi.iSelectedImage = IMG_NOCHECK; SendMessage(GetParent(hwnd), PSM_CHANGED, 0, 0); break; case IMG_NOCHECK: tvi.iImage = tvi.iSelectedImage = IMG_CHECK; SendMessage(GetParent(hwnd), PSM_CHANGED, 0, 0); break; case IMG_NORCHECK: { int i; for (i = 0; i < optionCount; ++i) { if (options[i].groupId == options[tvi.lParam].groupId) { TVITEM tvi_tmp; tvi_tmp.mask = TVIF_HANDLE|TVIF_IMAGE|TVIF_SELECTEDIMAGE; tvi_tmp.hItem = options[i].hItem; tvi_tmp.iImage = tvi_tmp.iSelectedImage = IMG_NORCHECK; TreeView_SetItem(lpnmhdr->hwndFrom, &tvi_tmp); } } tvi.iImage = tvi.iSelectedImage = IMG_RCHECK; SendMessage(GetParent(hwnd), PSM_CHANGED, 0, 0); break; } } TreeView_SetItem(lpnmhdr->hwndFrom,&tvi); } } break; } case TVN_ITEMEXPANDEDW: { LPNMTREEVIEWW lpnmtv = (LPNMTREEVIEWW)lparam; TVITEM tvi; tvi.mask=TVIF_HANDLE|TVIF_IMAGE|TVIF_SELECTEDIMAGE; tvi.hItem = lpnmtv->itemNew.hItem; tvi.iImage = tvi.iSelectedImage = (lpnmtv->itemNew.state & TVIS_EXPANDED) ? IMG_GRPOPEN : IMG_GRPCLOSED; SendMessageW(lpnmhdr->hwndFrom, TVM_SETITEMW, 0, (LPARAM)&tvi); break; } case TVN_ITEMEXPANDEDA: { LPNMTREEVIEWA lpnmtv = (LPNMTREEVIEWA)lparam; TVITEM tvi; tvi.mask=TVIF_HANDLE|TVIF_IMAGE|TVIF_SELECTEDIMAGE; tvi.hItem = lpnmtv->itemNew.hItem; tvi.iImage = tvi.iSelectedImage = (lpnmtv->itemNew.state & TVIS_EXPANDED) ? IMG_GRPOPEN : IMG_GRPCLOSED; SendMessageA(lpnmhdr->hwndFrom, TVM_SETITEMA, 0, (LPARAM)&tvi); break; } } break; } } return FALSE; }
TreeView::ImageList::~ImageList() { if (handle) ImageList_Destroy( static_cast<HIMAGELIST>(handle) ); }
SmileyPackType::~SmileyPackType() { if (m_hSmList != NULL) ImageList_Destroy(m_hSmList); }
static INT_PTR CALLBACK GenMenuOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { struct OrderData *dat = (struct OrderData*)GetWindowLongPtr(GetDlgItem(hwndDlg,IDC_MENUITEMS),GWLP_USERDATA); LPNMHDR hdr; switch (msg) { case WM_INITDIALOG: TranslateDialogDefault(hwndDlg); dat=(struct OrderData*)mir_alloc(sizeof(struct OrderData)); SetWindowLongPtr(GetDlgItem(hwndDlg,IDC_MENUITEMS),GWLP_USERDATA,(LONG_PTR)dat); dat->dragging = 0; dat->iInitMenuValue = DBGetContactSettingByte( NULL, "CList", "MoveProtoMenus", FALSE ); MyOldWindowProc = (WNDPROC)GetWindowLongPtr(GetDlgItem(hwndDlg,IDC_MENUITEMS),GWLP_WNDPROC); SetWindowLongPtr(GetDlgItem(hwndDlg,IDC_MENUITEMS),GWLP_WNDPROC,(LONG_PTR)&LBTNDOWNProc); { HIMAGELIST himlCheckBoxes; himlCheckBoxes=ImageList_Create(GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), (IsWinVerXPPlus() ? ILC_COLOR32 : ILC_COLOR16) | ILC_MASK, 2, 2); ImageList_AddIcon_IconLibLoaded(himlCheckBoxes, SKINICON_OTHER_NOTICK); ImageList_AddIcon_IconLibLoaded(himlCheckBoxes, SKINICON_OTHER_TICK); TreeView_SetImageList(GetDlgItem(hwndDlg,IDC_MENUOBJECTS),himlCheckBoxes,TVSIL_NORMAL); TreeView_SetImageList(GetDlgItem(hwndDlg,IDC_MENUITEMS),himlCheckBoxes,TVSIL_NORMAL); } CheckDlgButton(hwndDlg, dat->iInitMenuValue ? IDC_RADIO2 : IDC_RADIO1, TRUE ); CheckDlgButton(hwndDlg, IDC_DISABLEMENUICONS, bIconsDisabled ); BuildMenuObjectsTree(hwndDlg); return TRUE; case WM_COMMAND: if ( HIWORD(wParam) == BN_CLICKED || HIWORD( wParam ) == BN_DBLCLK ) { switch ( LOWORD( wParam )) { case IDC_INSERTSEPARATOR: InsertSeparator(hwndDlg); SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); break; case IDC_RESETMENU: ResetMenuItems( hwndDlg ); SendMessage( GetParent( hwndDlg ), PSM_CHANGED, 0, 0 ); break; case IDC_DISABLEMENUICONS: case IDC_RADIO1: case IDC_RADIO2: SendMessage( GetParent( hwndDlg ), PSM_CHANGED, 0, 0 ); break; case IDC_GENMENU_DEFAULT: { TVITEM tvi; HTREEITEM hti; MenuItemOptData *iod; hti=TreeView_GetSelection(GetDlgItem(hwndDlg,IDC_MENUITEMS)); if (hti==NULL) break; tvi.mask=TVIF_HANDLE|TVIF_IMAGE|TVIF_SELECTEDIMAGE|TVIF_PARAM; tvi.hItem=hti; TreeView_GetItem(GetDlgItem(hwndDlg,IDC_MENUITEMS),&tvi); iod = ( MenuItemOptData * )tvi.lParam; if ( iod->name && _tcsstr( iod->name, STR_SEPARATOR )) break; if (iod->name) mir_free(iod->name); iod->name = mir_tstrdup( iod->defname ); SaveTree(hwndDlg); RebuildCurrent(hwndDlg); SendMessage( GetParent( hwndDlg ), PSM_CHANGED, 0, 0 ); } break; case IDC_GENMENU_SET: { TVITEM tvi; TCHAR buf[256]; MenuItemOptData *iod; HTREEITEM hti = TreeView_GetSelection( GetDlgItem( hwndDlg,IDC_MENUITEMS )); if ( hti == NULL ) break; tvi.mask = TVIF_HANDLE|TVIF_IMAGE|TVIF_SELECTEDIMAGE|TVIF_PARAM; tvi.hItem = hti; SendDlgItemMessage(hwndDlg, IDC_MENUITEMS, TVM_GETITEM, 0, (LPARAM)&tvi); iod = ( MenuItemOptData * )tvi.lParam; if ( iod->name && _tcsstr(iod->name, STR_SEPARATOR )) break; ZeroMemory(buf,sizeof( buf )); GetDlgItemText( hwndDlg, IDC_GENMENU_CUSTOMNAME, buf, SIZEOF( buf )); if (iod->name) mir_free(iod->name); iod->name = mir_tstrdup(buf); SaveTree(hwndDlg); RebuildCurrent(hwndDlg); SendMessage( GetParent( hwndDlg ), PSM_CHANGED, 0, 0 ); } break; } } break; case WM_NOTIFY: hdr = (LPNMHDR)lParam; switch( hdr->idFrom ) { case 0: if (hdr->code == PSN_APPLY ) { bIconsDisabled = IsDlgButtonChecked(hwndDlg, IDC_DISABLEMENUICONS) != 0; DBWriteContactSettingByte(NULL, "CList", "DisableMenuIcons", bIconsDisabled); SaveTree(hwndDlg); int iNewMenuValue = IsDlgButtonChecked(hwndDlg, IDC_RADIO1) ? 0 : 1; if ( iNewMenuValue != dat->iInitMenuValue ) { RebuildProtoMenus( iNewMenuValue ); dat->iInitMenuValue = iNewMenuValue; } RebuildCurrent(hwndDlg); } break; case IDC_MENUOBJECTS: if (hdr->code == TVN_SELCHANGEDA ) RebuildCurrent( hwndDlg ); break; case IDC_MENUITEMS: switch (hdr->code) { case NM_CUSTOMDRAW: { int i= handleCustomDraw(GetDlgItem(hwndDlg,IDC_MENUITEMS),(LPNMTVCUSTOMDRAW) lParam); SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, i); return TRUE; } case TVN_BEGINDRAGA: SetCapture(hwndDlg); dat->dragging=1; dat->hDragItem=((LPNMTREEVIEW)lParam)->itemNew.hItem; TreeView_SelectItem(GetDlgItem(hwndDlg,IDC_MENUITEMS),dat->hDragItem); break; case NM_CLICK: { TVHITTESTINFO hti; hti.pt.x=(short)LOWORD(GetMessagePos()); hti.pt.y=(short)HIWORD(GetMessagePos()); ScreenToClient(hdr->hwndFrom,&hti.pt); if (TreeView_HitTest(hdr->hwndFrom,&hti)) { if (hti.flags&TVHT_ONITEMICON) { TVITEM tvi; tvi.mask=TVIF_HANDLE|TVIF_IMAGE|TVIF_SELECTEDIMAGE|TVIF_PARAM; tvi.hItem=hti.hItem; TreeView_GetItem(hdr->hwndFrom,&tvi); tvi.iImage=tvi.iSelectedImage=!tvi.iImage; ((MenuItemOptData *)tvi.lParam)->show=tvi.iImage; TreeView_SetItem(hdr->hwndFrom,&tvi); SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); //all changes take effect in runtime //ShowWindow(GetDlgItem(hwndDlg,IDC_BUTTONORDERTREEWARNING),SW_SHOW); } /*--------MultiSelection----------*/ if (hti.flags&TVHT_ONITEMLABEL) { /// LabelClicked Set/unset selection TVITEM tvi; HWND tvw=hdr->hwndFrom; tvi.mask=TVIF_HANDLE|TVIF_PARAM; tvi.hItem=hti.hItem; TreeView_GetItem(tvw,&tvi); if (GetKeyState(VK_CONTROL)&0x8000) { if (((MenuItemOptData *)tvi.lParam)->isSelected) ((MenuItemOptData *)tvi.lParam)->isSelected=0; else ((MenuItemOptData *)tvi.lParam)->isSelected=1; //current selection order++. TreeView_SetItem(tvw,&tvi); } else if (GetKeyState(VK_SHIFT)&0x8000) { ; // shifted click } else { // reset all selection except current HTREEITEM hit; hit=TreeView_GetRoot(tvw); if (hit) do { TVITEM tvi={0}; tvi.mask=TVIF_HANDLE|TVIF_PARAM; tvi.hItem=hit; TreeView_GetItem(tvw,&tvi); if (hti.hItem!=hit) ((MenuItemOptData *)tvi.lParam)->isSelected=0; else ((MenuItemOptData *)tvi.lParam)->isSelected=1; TreeView_SetItem(tvw,&tvi); } while (hit=TreeView_GetNextSibling(tvw,hit)); } } } break; } case TVN_SELCHANGING: { LPNMTREEVIEW pn; pn = (LPNMTREEVIEW) lParam; //((MenuItemOptData *)(pn->itemNew.lParam))->isSelected=1; /*if (pn->action==NotKeyPressed) { remove all selection } */ } case TVN_SELCHANGEDA: { TVITEM tvi; HTREEITEM hti; MenuItemOptData *iod; SetDlgItemTextA(hwndDlg,IDC_GENMENU_CUSTOMNAME,""); SetDlgItemTextA(hwndDlg,IDC_GENMENU_SERVICE,""); EnableWindow(GetDlgItem(hwndDlg,IDC_GENMENU_CUSTOMNAME),FALSE); EnableWindow(GetDlgItem(hwndDlg,IDC_GENMENU_DEFAULT),FALSE); EnableWindow(GetDlgItem(hwndDlg,IDC_GENMENU_SET),FALSE); hti=TreeView_GetSelection(GetDlgItem(hwndDlg,IDC_MENUITEMS)); if (hti==NULL) break; tvi.mask=TVIF_HANDLE|TVIF_IMAGE|TVIF_SELECTEDIMAGE|TVIF_PARAM; tvi.hItem=hti; TreeView_GetItem(GetDlgItem(hwndDlg,IDC_MENUITEMS),&tvi); if ( tvi.lParam == 0 ) break; iod = ( MenuItemOptData * )tvi.lParam; if ( iod->name && _tcsstr(iod->name, STR_SEPARATOR)) break; SetDlgItemText(hwndDlg,IDC_GENMENU_CUSTOMNAME,iod->name); if (iod->pimi->submenu.first == NULL && iod->uniqname) SetDlgItemTextA(hwndDlg, IDC_GENMENU_SERVICE, iod->uniqname); EnableWindow(GetDlgItem(hwndDlg,IDC_GENMENU_DEFAULT), lstrcmp(iod->name, iod->defname) != 0); EnableWindow(GetDlgItem(hwndDlg,IDC_GENMENU_SET),TRUE); EnableWindow(GetDlgItem(hwndDlg,IDC_GENMENU_CUSTOMNAME),TRUE); break; } break; } } break; case WM_MOUSEMOVE: if (!dat||!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_MENUITEMS),&hti.pt); TreeView_HitTest(GetDlgItem(hwndDlg,IDC_MENUITEMS),&hti); if (hti.flags&(TVHT_ONITEM|TVHT_ONITEMRIGHT)) { HTREEITEM it = hti.hItem; hti.pt.y -= TreeView_GetItemHeight(GetDlgItem(hwndDlg,IDC_MENUITEMS))/2; TreeView_HitTest(GetDlgItem(hwndDlg,IDC_MENUITEMS),&hti); if (!(hti.flags&TVHT_ABOVE)) TreeView_SetInsertMark(GetDlgItem(hwndDlg,IDC_MENUITEMS),hti.hItem,1); else TreeView_SetInsertMark(GetDlgItem(hwndDlg,IDC_MENUITEMS),it,0); } else { if (hti.flags&TVHT_ABOVE) SendDlgItemMessage(hwndDlg,IDC_MENUITEMS,WM_VSCROLL,MAKEWPARAM(SB_LINEUP,0),0); if (hti.flags&TVHT_BELOW) SendDlgItemMessage(hwndDlg,IDC_MENUITEMS,WM_VSCROLL,MAKEWPARAM(SB_LINEDOWN,0),0); TreeView_SetInsertMark(GetDlgItem(hwndDlg,IDC_MENUITEMS),NULL,0); } } break; case WM_LBUTTONUP: if (!dat->dragging) break; TreeView_SetInsertMark(GetDlgItem(hwndDlg,IDC_MENUITEMS),NULL,0); dat->dragging=0; ReleaseCapture(); { TVHITTESTINFO hti; hti.pt.x=(short)LOWORD(lParam); hti.pt.y=(short)HIWORD(lParam); ClientToScreen(hwndDlg,&hti.pt); ScreenToClient(GetDlgItem(hwndDlg,IDC_MENUITEMS),&hti.pt); hti.pt.y-=TreeView_GetItemHeight(GetDlgItem(hwndDlg,IDC_MENUITEMS))/2; TreeView_HitTest(GetDlgItem(hwndDlg,IDC_MENUITEMS),&hti); if (hti.flags&TVHT_ABOVE) hti.hItem=TVI_FIRST; if (dat->hDragItem==hti.hItem) break; dat->hDragItem=NULL; if (hti.flags&(TVHT_ONITEM|TVHT_ONITEMRIGHT)||(hti.hItem==TVI_FIRST)) { HWND tvw; HTREEITEM * pSIT; HTREEITEM FirstItem=NULL; UINT uITCnt,uSic ; tvw=GetDlgItem(hwndDlg,IDC_MENUITEMS); uITCnt=TreeView_GetCount(tvw); uSic=0; if (uITCnt) { pSIT=(HTREEITEM *)mir_alloc(sizeof(HTREEITEM)*uITCnt); if (pSIT) { HTREEITEM hit; hit=TreeView_GetRoot(tvw); if (hit) do { TVITEM tvi={0}; tvi.mask=TVIF_HANDLE|TVIF_PARAM; tvi.hItem=hit; TreeView_GetItem(tvw,&tvi); if (((MenuItemOptData *)tvi.lParam)->isSelected) { pSIT[uSic]=tvi.hItem; uSic++; } }while (hit=TreeView_GetNextSibling(tvw,hit)); // Proceed moving { UINT i; HTREEITEM insertAfter; insertAfter=hti.hItem; for (i=0; i<uSic; i++) { if (insertAfter) insertAfter=MoveItemAbove(tvw,pSIT[i],insertAfter); else break; if (!i) FirstItem=insertAfter; } } // free pointers... mir_free(pSIT); } } if (FirstItem) TreeView_SelectItem(tvw,FirstItem); SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); SaveTree(hwndDlg); } } break; case WM_DESTROY: if ( dat ) mir_free( dat ); ImageList_Destroy(TreeView_SetImageList(GetDlgItem(hwndDlg,IDC_MENUOBJECTS),NULL,TVSIL_NORMAL)); FreeTreeData( hwndDlg ); break; } return FALSE; }
/* * funkcja callback obs³uguj¹ca stronê z opcjami tab 2 */ INT_PTR CALLBACK DlgProcOpts_Tab2(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { static HANDLE hItemAll; switch ( msg ) { case WM_INITDIALOG: { TranslateDialogDefault(hwndDlg); mirfoxMiranda.getMirfoxData().setTab2OptionsState(MFENUM_OPTIONS_INIT); //load icons HIMAGELIST hIml; int smCx = GetSystemMetrics(SM_CXSMICON); int smCy = GetSystemMetrics(SM_CYSMICON); hIml = ImageList_Create(smCx,smCy,((LOBYTE(LOWORD(GetVersion()))>=5 && LOWORD(GetVersion())!=5) ? ILC_COLOR32 : ILC_COLOR16) | ILC_MASK, 4, 4); //load icons (direct) icoHandle_ICON_OFF = LoadIcon(hInst, MAKEINTRESOURCE(IDI_ICON_OFF)); icoHandle_ICON_FF = LoadIcon(hInst, MAKEINTRESOURCE(IDI_ICON_FF)); //TODO load icons (icolib) - no need to use DestroyIcon //HICON icoHandle_ICON_OFF = (HICON)CallService(MS_SKIN2_GETICONBYHANDLE, 0, (LPARAM)mirfoxData.icoHandle_ICON_OFF); //HICON icoHandle_ICON_FF = (HICON)CallService(MS_SKIN2_GETICONBYHANDLE, 0, (LPARAM)mirfoxData.icoHandle_ICON_FF); //add icons to ImageList list ImageList_AddIcon(hIml, icoHandle_ICON_OFF); ImageList_AddIcon(hIml, icoHandle_ICON_FF); SendDlgItemMessage(hwndDlg, IDC2_CONTACTS_LIST, CLM_SETEXTRAIMAGELIST, 0, (LPARAM)hIml); //m_clc.h //list params init resetListOptions(GetDlgItem(hwndDlg, IDC2_CONTACTS_LIST)); SendDlgItemMessage(hwndDlg, IDC2_CONTACTS_LIST, CLM_SETEXTRACOLUMNS, 1, 0); //add 'All contacts' list record { CLCINFOITEM cii = {0}; cii.cbSize = sizeof(cii); cii.flags = CLCIIF_GROUPFONT; cii.pszText =TranslateT("** All contacts **"); hItemAll = (HANDLE)SendDlgItemMessage(hwndDlg, IDC2_CONTACTS_LIST, CLM_ADDINFOITEM, 0, (LPARAM)&cii); } //set contacts and groups icons setListContactIcons(GetDlgItem(hwndDlg, IDC2_CONTACTS_LIST)); setListGroupIcons(GetDlgItem(hwndDlg, IDC2_CONTACTS_LIST), (HANDLE)SendDlgItemMessage(hwndDlg, IDC2_CONTACTS_LIST, CLM_GETNEXTITEM, CLGN_ROOT, 0), hItemAll, NULL); mirfoxMiranda.getMirfoxData().setTab2OptionsState(MFENUM_OPTIONS_WORK); return FALSE; } case WM_SETFOCUS: SetFocus(GetDlgItem(hwndDlg, IDC2_CONTACTS_LIST)); break; case WM_NOTIFY: if (mirfoxMiranda.getMirfoxData().getTab2OptionsState() != MFENUM_OPTIONS_WORK){ break; //options not inited yet } switch(((LPNMHDR)lParam)->idFrom) { case IDC2_CONTACTS_LIST: switch (((LPNMHDR)lParam)->code){ case CLN_NEWCONTACT: case CLN_LISTREBUILT: setListContactIcons(GetDlgItem(hwndDlg, IDC2_CONTACTS_LIST)); //fall through case CLN_CONTACTMOVED: setListGroupIcons(GetDlgItem(hwndDlg, IDC2_CONTACTS_LIST), (HANDLE)SendDlgItemMessage(hwndDlg, IDC2_CONTACTS_LIST, CLM_GETNEXTITEM, CLGN_ROOT, 0), hItemAll, NULL); break; case CLN_OPTIONSCHANGED: resetListOptions(GetDlgItem(hwndDlg, IDC2_CONTACTS_LIST)); break; case NM_CLICK: { NMCLISTCONTROL *nm=(NMCLISTCONTROL*)lParam; // Make sure we have an extra column if (nm->iColumn == -1){ break; } // Find clicked item DWORD hitFlags; HANDLE hItem = (HANDLE)SendDlgItemMessage(hwndDlg, IDC2_CONTACTS_LIST, CLM_HITTEST, (WPARAM)&hitFlags, MAKELPARAM(nm->pt.x, nm->pt.y)); // Nothing was clicked if (hItem == NULL){ break; } // It was not a visbility icon if (!(hitFlags & CLCHT_ONITEMEXTRA)){ break; } // Get image in clicked column (0=off, 1=on) int iImage = SendDlgItemMessage(hwndDlg, IDC2_CONTACTS_LIST, CLM_GETEXTRAIMAGE, (WPARAM)hItem, MAKELPARAM(nm->iColumn, 0)); if (iImage == 0){ iImage=nm->iColumn + 1; } else { if (iImage == 1){ iImage = 0; } } // Get item type (contact, group, etc...) int itemType = SendDlgItemMessage(hwndDlg, IDC2_CONTACTS_LIST, CLM_GETITEMTYPE, (WPARAM)hItem, 0); // Update list if (itemType == CLCIT_CONTACT) { // A contact SendDlgItemMessage(hwndDlg, IDC2_CONTACTS_LIST, CLM_SETEXTRAIMAGE, (WPARAM)hItem, MAKELPARAM(nm->iColumn, iImage)); } else if (itemType == CLCIT_INFO) { // All Contacts setAllChildIcons(GetDlgItem(hwndDlg, IDC2_CONTACTS_LIST), hItem, nm->iColumn, iImage); } else if (itemType == CLCIT_GROUP) { // A group hItem = (HANDLE)SendDlgItemMessage(hwndDlg, IDC2_CONTACTS_LIST, CLM_GETNEXTITEM, CLGN_CHILD, (LPARAM)hItem); if (hItem) { setAllChildIcons(GetDlgItem(hwndDlg, IDC2_CONTACTS_LIST), hItem, nm->iColumn, iImage); } } // Update the all/none icons setListGroupIcons(GetDlgItem(hwndDlg, IDC2_CONTACTS_LIST), (HANDLE)SendDlgItemMessage(hwndDlg, IDC2_CONTACTS_LIST, CLM_GETNEXTITEM, CLGN_ROOT, 0), hItemAll, NULL); // Activate Apply button SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); break; }//end case NM_CLICK }//end switch break; case 0: switch (((LPNMHDR)lParam)->code) { case PSN_APPLY: { for (MCONTACT hContact = db_find_first(); hContact; hContact = db_find_next(hContact)){ HANDLE hItem = (HANDLE)SendDlgItemMessage(hwndDlg, IDC2_CONTACTS_LIST, CLM_FINDCONTACT, hContact, 0); if(hItem) { int iImage = SendDlgItemMessage(hwndDlg, IDC2_CONTACTS_LIST, CLM_GETEXTRAIMAGE, (WPARAM)hItem, MAKELPARAM(0,0)); MFENUM_MIRANDACONTACT_STATE contactState; if (iImage == 0xFF){ //TODO impossible?? } else { if (iImage == 1){ contactState = MFENUM_MIRANDACONTACT_STATE_ON; } else { contactState = MFENUM_MIRANDACONTACT_STATE_OFF; } } //save to mirfoxData int result = mirfoxMiranda.getMirfoxData().updateMirandaContactState(hContact, contactState); if (result != 0){ //todo errors handling } //save to db 1 - on, 2 - off if (contactState == MFENUM_MIRANDACONTACT_STATE_OFF){ db_set_b(hContact, PLUGIN_DB_ID, "state", 2); } else { db_set_b(hContact, PLUGIN_DB_ID, "state", 1); } }//TODO else { ... (and at others if(hItem)) //TODO contacts witch are not ay mirfoxData but on list //( check hash concat(all id) on mirfoxData and on list, if doesn't match - refresh mirfoxData //same for protocols //for now it schould be ok } //TODO contacts at MirfoxData but not on list now return TRUE; } } break; } break; case WM_DESTROY: { HIMAGELIST hIml=(HIMAGELIST)SendDlgItemMessage(hwndDlg, IDC2_CONTACTS_LIST, CLM_GETEXTRAIMAGELIST, 0, 0); //m_clc.h ImageList_Destroy(hIml); // use DestroyIcon only witchout icolib DestroyIcon(icoHandle_ICON_OFF); icoHandle_ICON_OFF = NULL; DestroyIcon(icoHandle_ICON_FF); icoHandle_ICON_FF = NULL; break; } }//end switch return 0; }
BOOL CFlashPlayerDlg::PreTranslateMessage(MSG* pMsg) { int const wmId = LOWORD(pMsg->wParam); if (pMsg->message == s_uTBBC) { if (!g_pTaskbarList) { HRESULT hr = CoCreateInstance(CLSID_TaskbarList, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&g_pTaskbarList)); if (SUCCEEDED(hr)) { hr = g_pTaskbarList->HrInit(); if (FAILED(hr)) { g_pTaskbarList->Release(); g_pTaskbarList = NULL; } if(g_pTaskbarList) { hImglist = ImageList_LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_BITMAP_96), 16, 0, RGB(255,0,255), IMAGE_BITMAP, LR_CREATEDIBSECTION); if (hImglist) { hr = g_pTaskbarList->ThumbBarSetImageList(this->m_hWnd, hImglist); if (SUCCEEDED(hr)) { THUMBBUTTON buttons[2] = {}; buttons[0].dwMask = THB_BITMAP | THB_FLAGS; buttons[0].dwFlags = THBF_ENABLED; buttons[0].iId = IDTB_PLAY_PAUSE; if(IsFlashPlaying()) buttons[0].iBitmap = 1; else buttons[0].iBitmap = 0; g_pTaskbarList->ThumbBarAddButtons(this->m_hWnd, 1, buttons); } g_pTaskbarList->SetProgressState(this->m_hWnd, TBPF_NORMAL); ImageList_Destroy(hImglist); } } } } } else if(pMsg->message == WM_COMMAND && (wmId == IDTB_PLAY_PAUSE)) { if(IsFlashPlaying()) pFlashPtr->Stop(); else pFlashPtr->Play(); UpdateThumbnailToolbar(m_hWnd); } else { switch(pMsg->message) { case WM_NCRBUTTONDOWN: { if(pMsg->wParam == HTMAXBUTTON || pMsg->wParam == HTMINBUTTON || pMsg->wParam == HTCLOSE) break; m_popmenu.GetSubMenu(0).TrackPopupMenu(TPM_LEFTALIGN, LOWORD(pMsg->lParam), HIWORD(pMsg->lParam), m_hWnd); return TRUE; } case WM_SYSCHAR: if (pMsg->wParam == 13) FullScreen(); break; case WM_KEYDOWN: SendMessage(CMD_KEYDOWN, CMD_KEY, pMsg->wParam ); if(pMsg->wParam == 13) return TRUE; break; case WM_LBUTTONDOWN: POINT point; GetCursorPos(&point); if(m_fs && m_showctrl) { if(point.y < m_scr_height - 16) break; if(point.x < 5 || point.x > m_scr_width - 5) break; m_changing = true; double pos = (double)(point.x - 5) / (double) (m_scr_width - 10); pFlashPtr->GotoFrame((long)(m_fnumber * pos)); pFlashPtr->Play(); m_changing = false; return TRUE; } break; case WM_RBUTTONDOWN: if(!m_rmenu) { SendMessage(CMD_KEYDOWN, CMD_KEY, WM_RBUTTONDOWN ); return TRUE; } break; case WM_MOUSEMOVE: { if(!m_fs) break; ShowCursor(TRUE); SetTimer(TIMER_HIDE_CURSOR, 2000, NULL); POINT point; GetCursorPos(&point); if(!m_showctrl && point.y >= m_scr_height - 20) { m_control.MoveWindow(0,m_scr_height - 16,m_scr_width,20); m_showctrl = true; } else if(m_showctrl && point.y < m_scr_height - 20) { m_control.MoveWindow(0,m_scr_height,m_scr_width,20); m_showctrl = false; } break; } } } return CWindow::IsDialogMessage(pMsg); }
HRESULT CALLBACK DlgProc_Browse (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) { BROWSEDIALOGPARAMS *pbdp; if (AfsAppLib_HandleHelp (IDD_APPLIB_BROWSE, hDlg, msg, wp, lp)) { return FALSE; } if (msg == WM_INITDIALOG) { SetWindowLongPtr (hDlg, DWLP_USER, lp); } if ((pbdp = (BROWSEDIALOGPARAMS *)GetWindowLongPtr (hDlg, DWLP_USER)) != NULL) { switch (msg) { case WM_INITDIALOG: DlgProc_Browse_OnInitDialog (hDlg, pbdp); break; case WM_NOTIFY: switch (((LPNMHDR)lp)->code) { case LVN_ITEMCHANGED: if ( ((LPNM_LISTVIEW)lp)->uNewState & LVIS_SELECTED ) { DlgProc_Browse_SelectedEntry (hDlg, pbdp); } break; case NM_DBLCLK: PostMessage (hDlg, WM_COMMAND, MAKELONG(IDC_BROWSE_SELECT,BN_CLICKED), (LPARAM)GetDlgItem(hDlg,IDC_BROWSE_SELECT)); break; } break; case WM_DESTROY: DlgProc_Browse_StopSearch (pbdp); if (pbdp->hImages != NULL) { ListView_SetImageList (GetDlgItem (hDlg, IDC_BROWSE_LIST), 0, 0); ImageList_Destroy (pbdp->hImages); } break; case WM_FOUNDNAME: { LPTSTR pszName = (LPTSTR)lp; if (pszName != NULL) { HWND hList = GetDlgItem (hDlg, IDC_BROWSE_LIST); LV_AddItem (hList, 1, INDEX_SORT, 0, 0, pszName); FreeString (pszName); } break; } case WM_THREADSTART: { TCHAR szText[ cchRESOURCE ]; GetString (szText, IDS_BROWSE_WAITING); SetDlgItemText (pbdp->hDlg, IDC_BROWSE_STATUS, szText); break; } case WM_THREADDONE: { SetDlgItemText (pbdp->hDlg, IDC_BROWSE_STATUS, TEXT("")); break; } case WM_COMMAND: switch (LOWORD(wp)) { case IDCANCEL: EndDialog (hDlg, LOWORD(wp)); break; case IDC_BROWSE_SELECT: if ( (GetDlgItem (pbdp->hDlg, IDC_BROWSE_NONE) != NULL) && (IsDlgButtonChecked (pbdp->hDlg, IDC_BROWSE_NONE)) ) { pbdp->szCell[0] = TEXT('\0'); pbdp->szNamed[0] = TEXT('\0'); } else { GetDlgItemText (hDlg, IDC_BROWSE_CELL, pbdp->szCell, cchNAME); GetDlgItemText (hDlg, IDC_BROWSE_NAMED, pbdp->szNamed, cchRESOURCE); } EndDialog (hDlg, IDOK); break; case IDC_BROWSE_CELL: if (HIWORD(wp) == CBN_SELCHANGE) { GetDlgItemText (hDlg, IDC_BROWSE_CELL, pbdp->szCell, cchNAME); DlgProc_Browse_StartSearch (pbdp, FALSE); } break; case IDC_BROWSE_RESTART: GetDlgItemText (hDlg, IDC_BROWSE_CELL, pbdp->szCell, cchNAME); DlgProc_Browse_StartSearch (pbdp, FALSE); PostMessage (hDlg, WM_NEXTDLGCTL, (WPARAM)GetDlgItem (hDlg, IDC_BROWSE_NAMED), (LPARAM)TRUE); break; case IDC_BROWSE_NAMED: if (HIWORD(wp) == EN_UPDATE) // has the user hit Enter here? { TCHAR szTest[ cchRESOURCE ]; GetDlgItemText (hDlg, IDC_BROWSE_NAMED, szTest, cchRESOURCE); if ( (lstrlen (szTest) > 0) && (szTest[ lstrlen(szTest)-1 ] == TEXT('\n')) ) { szTest[ lstrlen(szTest)-1 ] = TEXT('\0'); if ( (lstrlen (szTest) > 0) && (szTest[ lstrlen(szTest)-1 ] == TEXT('\r')) ) { szTest[ lstrlen(szTest)-1 ] = TEXT('\0'); } SetDlgItemText (hDlg, IDC_BROWSE_NAMED, szTest); PostMessage (hDlg, WM_COMMAND, MAKELONG(IDC_BROWSE_SELECT,BN_CLICKED), (LPARAM)GetDlgItem(hDlg,IDC_BROWSE_SELECT)); } } break; case IDC_BROWSE_NONE: DlgProc_Browse_OnNone (hDlg, pbdp); break; } break; } } return FALSE; }
INT_PTR CALLBACK PhpChooseProcessDlgProc( _In_ HWND hwndDlg, _In_ UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam ) { PCHOOSE_PROCESS_DIALOG_CONTEXT context = NULL; if (uMsg == WM_INITDIALOG) { context = (PCHOOSE_PROCESS_DIALOG_CONTEXT)lParam; SetProp(hwndDlg, PhMakeContextAtom(), (HANDLE)context); } else { context = (PCHOOSE_PROCESS_DIALOG_CONTEXT)GetProp(hwndDlg, PhMakeContextAtom()); if (uMsg == WM_DESTROY) { RemoveProp(hwndDlg, PhMakeContextAtom()); } } if (!context) return FALSE; switch (uMsg) { case WM_INITDIALOG: { HWND lvHandle; PhCenterWindow(hwndDlg, GetParent(hwndDlg)); SetDlgItemText(hwndDlg, IDC_MESSAGE, context->Message); PhInitializeLayoutManager(&context->LayoutManager, hwndDlg); PhAddLayoutItem(&context->LayoutManager, GetDlgItem(hwndDlg, IDC_MESSAGE), NULL, PH_ANCHOR_LEFT | PH_ANCHOR_TOP | PH_ANCHOR_RIGHT | PH_LAYOUT_FORCE_INVALIDATE); PhAddLayoutItem(&context->LayoutManager, GetDlgItem(hwndDlg, IDC_LIST), NULL, PH_ANCHOR_ALL); PhAddLayoutItem(&context->LayoutManager, GetDlgItem(hwndDlg, IDOK), NULL, PH_ANCHOR_RIGHT | PH_ANCHOR_BOTTOM); PhAddLayoutItem(&context->LayoutManager, GetDlgItem(hwndDlg, IDCANCEL), NULL, PH_ANCHOR_RIGHT | PH_ANCHOR_BOTTOM); PhAddLayoutItem(&context->LayoutManager, GetDlgItem(hwndDlg, IDC_REFRESH), NULL, PH_ANCHOR_BOTTOM | PH_ANCHOR_LEFT); PhLayoutManagerLayout(&context->LayoutManager); context->MinimumSize.left = 0; context->MinimumSize.top = 0; context->MinimumSize.right = 280; context->MinimumSize.bottom = 170; MapDialogRect(hwndDlg, &context->MinimumSize); context->ListViewHandle = lvHandle = GetDlgItem(hwndDlg, IDC_LIST); context->ImageList = ImageList_Create(PhSmallIconSize.X, PhSmallIconSize.Y, ILC_COLOR32 | ILC_MASK, 0, 40); PhSetListViewStyle(lvHandle, FALSE, TRUE); PhSetControlTheme(lvHandle, L"explorer"); PhAddListViewColumn(lvHandle, 0, 0, 0, LVCFMT_LEFT, 180, L"Name"); PhAddListViewColumn(lvHandle, 1, 1, 1, LVCFMT_LEFT, 60, L"PID"); PhAddListViewColumn(lvHandle, 2, 2, 2, LVCFMT_LEFT, 160, L"User Name"); PhSetExtendedListView(lvHandle); ListView_SetImageList(lvHandle, context->ImageList, LVSIL_SMALL); PhpRefreshProcessList(hwndDlg, context); EnableWindow(GetDlgItem(hwndDlg, IDOK), FALSE); } break; case WM_DESTROY: { ImageList_Destroy(context->ImageList); PhDeleteLayoutManager(&context->LayoutManager); } break; case WM_COMMAND: { switch (LOWORD(wParam)) { case IDCANCEL: { EndDialog(hwndDlg, IDCANCEL); } break; case IDOK: { if (ListView_GetSelectedCount(context->ListViewHandle) == 1) { context->ProcessId = (HANDLE)PhGetSelectedListViewItemParam(context->ListViewHandle); EndDialog(hwndDlg, IDOK); } } break; case IDC_REFRESH: { PhpRefreshProcessList(hwndDlg, context); } break; } } break; case WM_NOTIFY: { LPNMHDR header = (LPNMHDR)lParam; switch (header->code) { case LVN_ITEMCHANGED: { EnableWindow(GetDlgItem(hwndDlg, IDOK), ListView_GetSelectedCount(context->ListViewHandle) == 1); } break; case NM_DBLCLK: { SendMessage(hwndDlg, WM_COMMAND, IDOK, 0); } break; } } break; case WM_SIZE: { PhLayoutManagerLayout(&context->LayoutManager); } break; case WM_SIZING: { PhResizingMinimumSize((PRECT)lParam, wParam, context->MinimumSize.right, context->MinimumSize.bottom); } break; } return FALSE; }
/***************************************************************************** * SIC_Initialize [internal] */ BOOL SIC_Initialize(void) { HICON hSm = NULL, hLg = NULL; INT cx_small, cy_small; INT cx_large, cy_large; HDC hDC; INT bpp; DWORD ilMask; BOOL result = FALSE; TRACE("Entered SIC_Initialize\n"); if (sic_hdpa) { TRACE("Icon cache already initialized\n"); return TRUE; } sic_hdpa = DPA_Create(16); if (!sic_hdpa) { return FALSE; } hDC = CreateICW(L"DISPLAY", NULL, NULL, NULL); if (!hDC) { ERR("Failed to create information context (error %d)\n", GetLastError()); goto end; } bpp = GetDeviceCaps(hDC, BITSPIXEL); DeleteDC(hDC); if (bpp <= 4) ilMask = ILC_COLOR4; else if (bpp <= 8) ilMask = ILC_COLOR8; else if (bpp <= 16) ilMask = ILC_COLOR16; else if (bpp <= 24) ilMask = ILC_COLOR24; else if (bpp <= 32) ilMask = ILC_COLOR32; else ilMask = ILC_COLOR; ilMask |= ILC_MASK; cx_small = GetSystemMetrics(SM_CXSMICON); cy_small = GetSystemMetrics(SM_CYSMICON); cx_large = GetSystemMetrics(SM_CXICON); cy_large = GetSystemMetrics(SM_CYICON); ShellSmallIconList = ImageList_Create(cx_small, cy_small, ilMask, 100, 100); if (!ShellSmallIconList) { ERR("Failed to create the small icon list.\n"); goto end; } ShellBigIconList = ImageList_Create(cx_large, cy_large, ilMask, 100, 100); if (!ShellBigIconList) { ERR("Failed to create the big icon list.\n"); goto end; } /* Load the document icon, which is used as the default if an icon isn't found. */ hSm = (HICON)LoadImageW(shell32_hInstance, MAKEINTRESOURCEW(IDI_SHELL_DOCUMENT), IMAGE_ICON, cx_small, cy_small, LR_SHARED | LR_DEFAULTCOLOR); if (!hSm) { ERR("Failed to load small IDI_SHELL_DOCUMENT icon!\n"); goto end; } hLg = (HICON)LoadImageW(shell32_hInstance, MAKEINTRESOURCEW(IDI_SHELL_DOCUMENT), IMAGE_ICON, cx_large, cy_large, LR_SHARED | LR_DEFAULTCOLOR); if (!hLg) { ERR("Failed to load large IDI_SHELL_DOCUMENT icon!\n"); goto end; } if(SIC_IconAppend(swShell32Name, IDI_SHELL_DOCUMENT-1, hSm, hLg, 0) == INVALID_INDEX) { ERR("Failed to add IDI_SHELL_DOCUMENT icon to cache.\n"); goto end; } if(SIC_IconAppend(swShell32Name, -IDI_SHELL_DOCUMENT, hSm, hLg, 0) == INVALID_INDEX) { ERR("Failed to add IDI_SHELL_DOCUMENT icon to cache.\n"); goto end; } /* Everything went fine */ result = TRUE; end: /* The image list keeps a copy of the icons, we must destroy them */ if(hSm) DestroyIcon(hSm); if(hLg) DestroyIcon(hLg); /* Clean everything if something went wrong */ if(!result) { if(sic_hdpa) DPA_Destroy(sic_hdpa); if(ShellSmallIconList) ImageList_Destroy(ShellSmallIconList); if(ShellBigIconList) ImageList_Destroy(ShellSmallIconList); sic_hdpa = NULL; ShellSmallIconList = NULL; ShellBigIconList = NULL; } TRACE("hIconSmall=%p hIconBig=%p\n",ShellSmallIconList, ShellBigIconList); return result; }
CViewClasses::~CViewClasses() { if (IsWindow()) DeleteAllItems(); ImageList_Destroy(m_himlNormal); }
BOOL CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { static HINSTANCE hRichEditDLL = 0; if (!hRichEditDLL) hRichEditDLL= LoadLibrary("RichEd32.dll"); switch (msg) { case WM_INITDIALOG: { int argc; char **argv; int i, j; int argSpaceSize; bool chooseCompressor = false; g_sdata.hwnd=hwndDlg; HICON hIcon = LoadIcon(g_sdata.hInstance,MAKEINTRESOURCE(IDI_ICON)); SetClassLong(hwndDlg,GCL_HICON,(long)hIcon); // Altered by Darren Owen (DrO) on 29/9/2003 // Added in receiving of mouse and key events from the richedit control SendMessage(GetDlgItem(hwndDlg,IDC_LOGWIN),EM_SETEVENTMASK,NULL,ENM_SELCHANGE|ENM_MOUSEEVENTS|ENM_KEYEVENTS); DragAcceptFiles(g_sdata.hwnd,FALSE); g_sdata.menu = GetMenu(g_sdata.hwnd); g_sdata.fileSubmenu = GetSubMenu(g_sdata.menu, FILE_MENU_INDEX); g_sdata.editSubmenu = GetSubMenu(g_sdata.menu, EDIT_MENU_INDEX); g_sdata.toolsSubmenu = GetSubMenu(g_sdata.menu, TOOLS_MENU_INDEX); RestoreMRUList(); CreateToolBar(); InitTooltips(g_sdata.hwnd); SetBranding(g_sdata.hwnd); HFONT hFont = CreateFont(14,0,0,0,FW_NORMAL,0,0,0,DEFAULT_CHARSET,OUT_CHARACTER_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,FIXED_PITCH|FF_DONTCARE,"Courier New"); SendDlgItemMessage(hwndDlg,IDC_LOGWIN,WM_SETFONT,(WPARAM)hFont,0); RestoreWindowPos(g_sdata.hwnd); RestoreCompressor(); g_sdata.compressor = (NCOMPRESSOR)-1; argSpaceSize = SetArgv((char *)GetCommandLine(), &argc, &argv); if(argc > 1) { int n; g_sdata.script_alloced = true; g_sdata.script = (char *) GlobalAlloc(GPTR,argSpaceSize+2*(argc-1)*sizeof(char)+1); lstrcpy(g_sdata.script,""); for(i=1; i<argc; i++) { if(!lstrncmpi(argv[i],"/XSetCompressor ",lstrlen("/XSetCompressor "))) { char *p = argv[i]+lstrlen("/XSetCompressor "); if(!lstrncmpi(p,"/FINAL ",lstrlen("/FINAL "))) { p += lstrlen("/FINAL "); } while(*p == ' ') p++; if(p && lstrlen(p)) { for(j=(int)COMPRESSOR_SCRIPT+1; j < (int)COMPRESSOR_BEST; j++) { if(!lstrcmpi(p,compressor_names[j])) { SetCompressor((NCOMPRESSOR)j); } } } } else if(!lstrcmpi(argv[i],"/ChooseCompressor")) { chooseCompressor = true; } else { lstrcat(g_sdata.script,"\""); lstrcat(g_sdata.script,argv[i]); lstrcat(g_sdata.script,"\" "); } } n = lstrlen(g_sdata.script); if(n > 0) { g_sdata.script[n-1] = '\0'; } PushMRUFile(argv[argc-1]); } if (argSpaceSize) GlobalFree(argv); if(g_sdata.compressor == (NCOMPRESSOR)-1) { SetCompressor(g_sdata.default_compressor); } if(chooseCompressor) { if (DialogBox(g_sdata.hInstance,MAKEINTRESOURCE(DLG_COMPRESSOR),g_sdata.hwnd,(DLGPROC)CompressorProc)) { EnableItems(g_sdata.hwnd); return TRUE; } } CompileNSISScript(); return TRUE; } case WM_PAINT: { PAINTSTRUCT ps; GetClientRect(g_sdata.hwnd, &g_resize.griprect); HDC hdc = BeginPaint(g_sdata.hwnd, &ps); g_resize.griprect.left = g_resize.griprect.right - GetSystemMetrics(SM_CXVSCROLL); g_resize.griprect.top = g_resize.griprect.bottom - GetSystemMetrics(SM_CYVSCROLL); DrawFrameControl(hdc, &g_resize.griprect, DFC_SCROLL, DFCS_SCROLLSIZEGRIP); EndPaint(g_sdata.hwnd,&ps); return TRUE; } case WM_DESTROY: { SaveSymbols(); SaveCompressor(); SaveMRUList(); SaveWindowPos(g_sdata.hwnd); DestroyTooltips(); PostQuitMessage(0); return TRUE; } case WM_CLOSE: { if (!g_sdata.thread) { DragAcceptFiles(g_sdata.hwnd,FALSE); ImageList_Destroy(g_toolbar.imagelist); ImageList_Destroy(g_toolbar.imagelistd); ImageList_Destroy(g_toolbar.imagelisth); DestroyWindow(hwndDlg); FreeLibrary(hRichEditDLL); } return TRUE; } case WM_DROPFILES: { int num; char szTmp[MAX_PATH]; num = DragQueryFile((HDROP)wParam,-1,NULL,0); if (num==1) { DragQueryFile((HDROP)wParam,0,szTmp,MAX_PATH); if (lstrlen(szTmp)>0) { g_sdata.script_alloced = true; g_sdata.script = (char *)GlobalAlloc(GPTR,sizeof(szTmp)+7); wsprintf(g_sdata.script,"\"%s\"",szTmp); PushMRUFile(g_sdata.script); ResetObjects(); CompileNSISScript(); } } break; } case WM_GETMINMAXINFO: { ((MINMAXINFO*)lParam)->ptMinTrackSize.x=MINWIDTH; ((MINMAXINFO*)lParam)->ptMinTrackSize.y=MINHEIGHT; } case WM_ENTERSIZEMOVE: { GetClientRect(g_sdata.hwnd, &g_resize.resizeRect); return TRUE; } case WM_SIZE: { if ((wParam == SIZE_MAXHIDE)||(wParam == SIZE_MAXSHOW)) return TRUE; RECT rSize; if (hwndDlg == g_sdata.hwnd) { GetClientRect(g_sdata.hwnd, &rSize); if (((rSize.right==0)&&(rSize.bottom==0))||((g_resize.resizeRect.right==0)&&(g_resize.resizeRect.bottom==0))) return TRUE; g_resize.dx = rSize.right - g_resize.resizeRect.right; g_resize.dy = rSize.bottom - g_resize.resizeRect.bottom; EnumChildWindows(g_sdata.hwnd, DialogResize, (LPARAM)0); g_resize.resizeRect = rSize; } return TRUE; } case WM_SIZING: { InvalidateRect(g_sdata.hwnd,&g_resize.griprect,TRUE); GetClientRect(g_sdata.hwnd, &g_resize.griprect); g_resize.griprect.left = g_resize.griprect.right - GetSystemMetrics(SM_CXVSCROLL); g_resize.griprect.top = g_resize.griprect.bottom - GetSystemMetrics(SM_CYVSCROLL); return TRUE; } case WM_MAKENSIS_PROCESSCOMPLETE: { if (g_sdata.thread) { CloseHandle(g_sdata.thread); g_sdata.thread=0; } if(g_sdata.compressor == COMPRESSOR_BEST) { if (g_sdata.retcode==0 && FileExists(g_sdata.output_exe)) { char temp_file_name[1024]; wsprintf(temp_file_name,"%s_makensisw_temp",g_sdata.output_exe); if(!lstrcmpi(g_sdata.compressor_name,compressor_names[(int)COMPRESSOR_SCRIPT+1])) { SetCompressorStats(); CopyFile(g_sdata.output_exe,temp_file_name,false); g_sdata.best_compressor_name = g_sdata.compressor_name; g_sdata.compressor_name = compressor_names[(int)COMPRESSOR_SCRIPT+2]; ResetObjects(); ResetInputScript(); CompileNSISScript(); return TRUE; } else { int this_compressor; int last_compressor; int i; HANDLE hPrev, hThis; DWORD prevSize, thisSize; for(i=(int)COMPRESSOR_SCRIPT+2; i<(int)COMPRESSOR_BEST; i++) { if(!lstrcmpi(g_sdata.compressor_name,compressor_names[i])) { this_compressor = i; last_compressor = i-1; break; } } if(FileExists(temp_file_name)) { hPrev = CreateFile(temp_file_name,GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, NULL, NULL); if(hPrev != INVALID_HANDLE_VALUE) { prevSize = GetFileSize(hPrev, 0); CloseHandle(hPrev); if(prevSize != INVALID_FILE_SIZE) { hThis = CreateFile(g_sdata.output_exe,GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, NULL, NULL); if(hThis != INVALID_HANDLE_VALUE) { thisSize = GetFileSize(hThis, 0); CloseHandle(hThis); if(thisSize != INVALID_FILE_SIZE) { if(prevSize > thisSize) { CopyFile(g_sdata.output_exe,temp_file_name,false); SetCompressorStats(); g_sdata.best_compressor_name = g_sdata.compressor_name; } } } } } } if(this_compressor == ((int)COMPRESSOR_BEST - 1)) { char buf[1024]; g_sdata.compressor_name = compressor_names[(int)COMPRESSOR_SCRIPT+1]; g_sdata.appended = false; ResetInputScript(); if(!lstrcmpi(g_sdata.best_compressor_name,compressor_names[this_compressor])) { wsprintf(buf,COMPRESSOR_MESSAGE,g_sdata.best_compressor_name,thisSize); LogMessage(g_sdata.hwnd,buf); } else { CopyFile(temp_file_name,g_sdata.output_exe,false); wsprintf(buf,RESTORED_COMPRESSOR_MESSAGE,g_sdata.best_compressor_name,prevSize); LogMessage(g_sdata.hwnd,buf); LogMessage(g_sdata.hwnd, g_sdata.compressor_stats); } DeleteFile(temp_file_name); ResetInputScript(); lstrcpy(g_sdata.compressor_stats,""); } else { g_sdata.compressor_name = compressor_names[this_compressor+1]; ResetObjects(); ResetInputScript(); CompileNSISScript(); return TRUE; } } } } EnableItems(g_sdata.hwnd); if (!g_sdata.retcode) { MessageBeep(MB_ICONASTERISK); if (g_sdata.warnings) SetTitle(g_sdata.hwnd,"Finished with Warnings"); else SetTitle(g_sdata.hwnd,"Finished Sucessfully"); // Added by Darren Owen (DrO) on 1/10/2003 if(g_sdata.recompile_test) PostMessage(g_sdata.hwnd, WM_COMMAND, LOWORD(IDC_TEST), 0); } else { MessageBeep(MB_ICONEXCLAMATION); SetTitle(g_sdata.hwnd,"Compile Error: See Log for Details"); } // Added by Darren Owen (DrO) on 1/10/2003 // ensures the recompile and run state is reset after use g_sdata.recompile_test = 0; DragAcceptFiles(g_sdata.hwnd,TRUE); return TRUE; } case WM_NOTIFY: switch (((NMHDR*)lParam)->code ) { case EN_SELCHANGE: SendDlgItemMessage(hwndDlg,IDC_LOGWIN, EM_EXGETSEL, 0, (LPARAM) &g_sdata.textrange); { BOOL enabled = (g_sdata.textrange.cpMax-g_sdata.textrange.cpMin<=0?FALSE:TRUE); EnableMenuItem(g_sdata.menu,IDM_COPYSELECTED,(enabled?MF_ENABLED:MF_GRAYED)); EnableToolBarButton(IDM_COPY,enabled); } // Altered by Darren Owen (DrO) on 6/10/2003 // Allows the detection of the right-click menu when running on OSes below Windows 2000 // and will then simulate the effective WM_CONTEXTMENU message that would be received // note: removed the WM_CONTEXTMENU handling to prevent a duplicate menu appearing on // Windows 2000 and higher case EN_MSGFILTER: #define lpnmMsg ((MSGFILTER*)lParam) if(WM_RBUTTONUP == lpnmMsg->msg || WM_KEYUP == lpnmMsg->msg && lpnmMsg->wParam == VK_APPS){ POINT pt; HWND edit = GetDlgItem(g_sdata.hwnd,IDC_LOGWIN); RECT r; GetCursorPos(&pt); // Added and altered by Darren Owen (DrO) on 29/9/2003 // Will place the right-click menu in the top left corner of the window // if the application key is pressed and the mouse is not in the window // from here... ScreenToClient(edit, &pt); GetClientRect(edit, &r); if(!PtInRect(&r, pt)) pt.x = pt.y = 0; MapWindowPoints(edit, HWND_DESKTOP, &pt, 1); TrackPopupMenu(g_sdata.editSubmenu, TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_RIGHTBUTTON, pt.x, pt.y, 0, g_sdata.hwnd, 0); } case TBN_DROPDOWN: { LPNMTOOLBAR pToolBar = (LPNMTOOLBAR) lParam; if(pToolBar->hdr.hwndFrom == g_toolbar.hwnd && pToolBar->iItem == IDM_COMPRESSOR) { ShowToolbarDropdownMenu(); return TBDDRET_DEFAULT; } else { return TBDDRET_NODEFAULT; } } } return TRUE; case WM_COPYDATA: { PCOPYDATASTRUCT cds = PCOPYDATASTRUCT(lParam); switch (cds->dwData) { case MAKENSIS_NOTIFY_SCRIPT: if (g_sdata.input_script) GlobalFree(g_sdata.input_script); g_sdata.input_script = (char *)GlobalAlloc(GPTR, cds->cbData); lstrcpy(g_sdata.input_script, (char *)cds->lpData); break; case MAKENSIS_NOTIFY_WARNING: g_sdata.warnings++; break; case MAKENSIS_NOTIFY_ERROR: break; case MAKENSIS_NOTIFY_OUTPUT: if (g_sdata.output_exe) GlobalFree(g_sdata.output_exe); g_sdata.output_exe = (char *)GlobalAlloc(GPTR, cds->cbData); lstrcpy(g_sdata.output_exe, (char *)cds->lpData); break; } return TRUE; } case WM_COMMAND: { switch (LOWORD(wParam)) { case IDM_BROWSESCR: { if (g_sdata.input_script) { char str[MAX_PATH],*str2; lstrcpy(str,g_sdata.input_script); str2=my_strrchr(str,'\\'); if(str2!=NULL) *str2=0; ShellExecute(g_sdata.hwnd,"open",str,NULL,NULL,SW_SHOWNORMAL); } return TRUE; } case IDM_ABOUT: { DialogBox(g_sdata.hInstance,MAKEINTRESOURCE(DLG_ABOUT),g_sdata.hwnd,(DLGPROC)AboutProc); return TRUE; } case IDM_NSISHOME: { ShellExecute(g_sdata.hwnd,"open",NSIS_URL,NULL,NULL,SW_SHOWNORMAL); return TRUE; } case IDM_FORUM: { ShellExecute(g_sdata.hwnd,"open",NSIS_FOR,NULL,NULL,SW_SHOWNORMAL); return TRUE; } case IDM_NSISUPDATE: { int rv; rv = MessageBox(g_sdata.hwnd,NSISUPDATEPROMPT,"Question",MB_YESNO|MB_ICONQUESTION); if(rv == IDYES) { char pathf[MAX_PATH],*path; GetModuleFileName(NULL,pathf,sizeof(pathf)); path=my_strrchr(pathf,'\\'); if(path!=NULL) *path=0; lstrcat(pathf,NSIS_UPDATE); ShellExecute(g_sdata.hwnd,"open",pathf,NULL,NULL,SW_SHOWNORMAL); PostMessage(g_sdata.hwnd,WM_COMMAND, IDM_EXIT, 0); } return TRUE; } case IDM_SELECTALL: { SendDlgItemMessage(g_sdata.hwnd, IDC_LOGWIN, EM_SETSEL, 0, -1); return TRUE; } case IDM_DOCS: { ShowDocs(); return TRUE; } case IDM_LOADSCRIPT: { if (!g_sdata.thread) { OPENFILENAME l={sizeof(l),}; char buf[MAX_PATH]; l.hwndOwner = hwndDlg; l.lpstrFilter = "NSIS Script (*.nsi)\0*.nsi\0All Files (*.*)\0*.*\0"; l.lpstrFile = buf; l.nMaxFile = MAX_STRING-1; l.lpstrTitle = "Load Script"; l.lpstrDefExt = "log"; l.lpstrFileTitle = NULL; l.lpstrInitialDir = NULL; l.Flags = OFN_HIDEREADONLY|OFN_EXPLORER|OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST; lstrcpy(buf,""); if (GetOpenFileName(&l)) { g_sdata.script = (char *)GlobalAlloc(GPTR,lstrlen(buf)+3); wsprintf(g_sdata.script,"\"%s\"",buf); PushMRUFile(g_sdata.script); ResetObjects(); CompileNSISScript(); } } return TRUE; } case IDM_MRU_FILE: case IDM_MRU_FILE+1: case IDM_MRU_FILE+2: case IDM_MRU_FILE+3: case IDM_MRU_FILE+4: LoadMRUFile(LOWORD(wParam)-IDM_MRU_FILE); return TRUE; case IDM_CLEAR_MRU_LIST: ClearMRUList(); return TRUE; case IDM_COMPRESSOR: { SetCompressor((NCOMPRESSOR)(g_sdata.compressor+1)); return TRUE; } case IDM_CLEARLOG: { if (!g_sdata.thread) { ClearLog(g_sdata.hwnd); } return TRUE; } case IDM_RECOMPILE: { CompileNSISScript(); return TRUE; } // Added by Darren Owen (DrO) on 1/10/2003 case IDM_RECOMPILE_TEST: case IDC_RECOMPILE_TEST: { g_sdata.recompile_test = 1; CompileNSISScript(); return TRUE; } case IDM_SETTINGS: { DialogBox(g_sdata.hInstance,MAKEINTRESOURCE(DLG_SETTINGS),g_sdata.hwnd,(DLGPROC)SettingsProc); return TRUE; } case IDM_TEST: case IDC_TEST: { if (g_sdata.output_exe) { ShellExecute(g_sdata.hwnd,"open",g_sdata.output_exe,NULL,NULL,SW_SHOWNORMAL); } return TRUE; } case IDM_EDITSCRIPT: { if (g_sdata.input_script) { if ((int)ShellExecute(g_sdata.hwnd,"open",g_sdata.input_script,NULL,NULL,SW_SHOWNORMAL)<=32) { char path[MAX_PATH]; if (GetWindowsDirectory(path,sizeof(path))) { lstrcat(path,"\\notepad.exe"); ShellExecute(g_sdata.hwnd,"open",path,g_sdata.input_script,NULL,SW_SHOWNORMAL); } } } return TRUE; } case IDC_CLOSE: case IDM_EXIT: { if (!g_sdata.thread) { DestroyWindow(g_sdata.hwnd); } return TRUE; } case IDM_COPY: { CopyToClipboard(g_sdata.hwnd); return TRUE; } case IDM_COPYSELECTED: { SendDlgItemMessage(g_sdata.hwnd,IDC_LOGWIN, WM_COPY, 0, 0); return TRUE; } case IDM_SAVE: { OPENFILENAME l={sizeof(l),}; char buf[MAX_STRING]; l.hwndOwner = hwndDlg; l.lpstrFilter = "Log Files (*.log)\0*.log\0Text Files (*.txt)\0*.txt\0All Files (*.*)\0*.*\0"; l.lpstrFile = buf; l.nMaxFile = MAX_STRING-1; l.lpstrTitle = "Save Output"; l.lpstrDefExt = "log"; l.lpstrInitialDir = NULL; l.Flags = OFN_HIDEREADONLY|OFN_EXPLORER|OFN_PATHMUSTEXIST; lstrcpy(buf,"output"); if (GetSaveFileName(&l)) { HANDLE hFile = CreateFile(buf,GENERIC_WRITE,0,0,CREATE_ALWAYS,0,0); if (hFile) { int len=SendDlgItemMessage(g_sdata.hwnd,IDC_LOGWIN,WM_GETTEXTLENGTH,0,0); char *existing_text=(char*)GlobalAlloc(GPTR,len); existing_text[0]=0; GetDlgItemText(g_sdata.hwnd, IDC_LOGWIN, existing_text, len); DWORD dwWritten = 0; WriteFile(hFile,existing_text,len,&dwWritten,0); CloseHandle(hFile); GlobalFree(existing_text); } } return TRUE; } case IDM_FIND: { if (!g_find.uFindReplaceMsg) g_find.uFindReplaceMsg = RegisterWindowMessage(FINDMSGSTRING); my_memset(&g_find.fr, 0, sizeof(FINDREPLACE)); g_find.fr.lStructSize = sizeof(FINDREPLACE); g_find.fr.hwndOwner = hwndDlg; g_find.fr.Flags = FR_NOUPDOWN; g_find.fr.lpstrFindWhat = (char *)GlobalAlloc(GPTR, 128); if (!g_find.fr.lpstrFindWhat) return TRUE; g_find.fr.wFindWhatLen = 128; g_find.hwndFind = FindText(&g_find.fr); return TRUE; } default: { int i; DWORD command = LOWORD(wParam); for(i=(int)COMPRESSOR_SCRIPT; i<=(int)COMPRESSOR_BEST; i++) { if(command == compressor_commands[i]) { SetCompressor((NCOMPRESSOR)i); return TRUE; } } } } } } if (g_find.uFindReplaceMsg && msg == g_find.uFindReplaceMsg) { LPFINDREPLACE lpfr = (LPFINDREPLACE)lParam; if (lpfr->Flags & FR_FINDNEXT) { WPARAM flags = FR_DOWN; if (lpfr->Flags & FR_MATCHCASE) flags |= FR_MATCHCASE; if (lpfr->Flags & FR_WHOLEWORD) flags |= FR_WHOLEWORD; FINDTEXTEX ft; SendDlgItemMessage(hwndDlg, IDC_LOGWIN, EM_EXGETSEL, 0, (LPARAM)&ft.chrg); if (ft.chrg.cpMax == ft.chrg.cpMin) ft.chrg.cpMin = 0; else ft.chrg.cpMin = ft.chrg.cpMax; ft.chrg.cpMax = SendDlgItemMessage(hwndDlg, IDC_LOGWIN, WM_GETTEXTLENGTH, 0, 0); ft.lpstrText = lpfr->lpstrFindWhat; ft.chrg.cpMin = SendDlgItemMessage(hwndDlg, IDC_LOGWIN, EM_FINDTEXTEX, flags, (LPARAM)&ft); if (ft.chrg.cpMin != -1) SendDlgItemMessage(hwndDlg, IDC_LOGWIN, EM_SETSEL, ft.chrgText.cpMin, ft.chrgText.cpMax); else MessageBeep(MB_ICONASTERISK); } if (lpfr->Flags & FR_DIALOGTERM) g_find.hwndFind = 0; return TRUE; } return 0; }
ImageLibrary::~ImageLibrary() { DeleteDC(hImageDC); ImageList_Destroy(list); DeleteCriticalSection(&lock); }
void release_ilist(struct SwinImagelist* si){ if(si->himagelist) ImageList_Destroy(si->himagelist); free(si); }
CToolbar::~CToolbar() { if ( m_himl ) ImageList_Destroy( m_himl ); }
INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_INITDIALOG: { g_sdata.hwnd=hwndDlg; HICON hIcon = LoadIcon(g_sdata.hInstance,MAKEINTRESOURCE(IDI_ICON)); SetClassLongPtr(hwndDlg,GCLP_HICON,(LONG_PTR)hIcon); // Altered by Darren Owen (DrO) on 29/9/2003 // Added in receiving of mouse and key events from the richedit control SendMessage(GetDlgItem(hwndDlg,IDC_LOGWIN),EM_SETEVENTMASK,(WPARAM)NULL,ENM_SELCHANGE|ENM_MOUSEEVENTS|ENM_KEYEVENTS); DragAcceptFiles(g_sdata.hwnd,FALSE); g_sdata.menu = GetMenu(g_sdata.hwnd); g_sdata.fileSubmenu = FindSubMenu(g_sdata.menu, IDM_FILE); g_sdata.editSubmenu = FindSubMenu(g_sdata.menu, IDM_EDIT); g_sdata.toolsSubmenu = FindSubMenu(g_sdata.menu, IDM_TOOLS); RestoreMRUList(); CreateToolBar(); InitTooltips(g_sdata.hwnd); SetDlgItemText(g_sdata.hwnd,IDC_VERSION,g_sdata.branding); HFONT hFont = CreateFont(14,FW_NORMAL,FIXED_PITCH|FF_DONTCARE,_T("Courier New")); SendDlgItemMessage(hwndDlg,IDC_LOGWIN,WM_SETFONT,(WPARAM)hFont,0); RestoreWindowPos(g_sdata.hwnd); RestoreCompressor(); SetScript(_T("")); g_sdata.compressor = COMPRESSOR_NONE_SELECTED; g_sdata.userSelectCompressor = FALSE; ProcessCommandLine(); if(g_sdata.compressor == COMPRESSOR_NONE_SELECTED) { SetCompressor(g_sdata.default_compressor); } if(g_sdata.userSelectCompressor) { if (DialogBox(g_sdata.hInstance,MAKEINTRESOURCE(DLG_COMPRESSOR),g_sdata.hwnd,(DLGPROC)CompressorProc)) { EnableItems(g_sdata.hwnd); return TRUE; } } CompileNSISScript(); return TRUE; } case WM_PAINT: { PAINTSTRUCT ps; GetGripperPos(hwndDlg, g_resize.griprect); HDC hdc = BeginPaint(hwndDlg, &ps); DrawFrameControl(hdc, &g_resize.griprect, DFC_SCROLL, DFCS_SCROLLSIZEGRIP); EndPaint(hwndDlg, &ps); return TRUE; } case WM_DESTROY: { DragAcceptFiles(g_sdata.hwnd,FALSE); SaveSymbols(); SaveCompressor(); SaveMRUList(); SaveWindowPos(g_sdata.hwnd); ImageList_Destroy(g_toolbar.imagelist); ImageList_Destroy(g_toolbar.imagelistd); ImageList_Destroy(g_toolbar.imagelisth); DestroyTooltips(); PostQuitMessage(0); return TRUE; } case WM_CLOSE: { if (!g_sdata.thread) { DestroyWindow(hwndDlg); } return TRUE; } case WM_DROPFILES: { int num; TCHAR szTmp[MAX_PATH]; num = DragQueryFile((HDROP)wParam,(UINT)-1,NULL,0); if (num==1) { DragQueryFile((HDROP)wParam,0,szTmp,MAX_PATH); if (lstrlen(szTmp)>0) { SetScript(szTmp); PushMRUFile(g_sdata.script); ResetObjects(); CompileNSISScript(); } } else { MessageBox(hwndDlg,MULTIDROPERROR,ERRBOXTITLE,MB_OK|MB_ICONSTOP); } DragFinish((HDROP)wParam); break; } case WM_GETMINMAXINFO: { ((MINMAXINFO*)lParam)->ptMinTrackSize.x=MINWIDTH; ((MINMAXINFO*)lParam)->ptMinTrackSize.y=MINHEIGHT; } case WM_ENTERSIZEMOVE: { GetClientRect(g_sdata.hwnd, &g_resize.resizeRect); return TRUE; } case WM_SIZE: { if ((wParam == SIZE_MAXHIDE)||(wParam == SIZE_MAXSHOW)) return TRUE; RECT rSize; if (hwndDlg == g_sdata.hwnd) { GetClientRect(g_sdata.hwnd, &rSize); if (((rSize.right==0)&&(rSize.bottom==0))||((g_resize.resizeRect.right==0)&&(g_resize.resizeRect.bottom==0))) return TRUE; g_resize.dx = rSize.right - g_resize.resizeRect.right; g_resize.dy = rSize.bottom - g_resize.resizeRect.bottom; EnumChildWindows(g_sdata.hwnd, DialogResize, (LPARAM)0); g_resize.resizeRect = rSize; } return TRUE; } case WM_SIZING: { InvalidateRect(hwndDlg, &g_resize.griprect, TRUE); GetGripperPos(hwndDlg, g_resize.griprect); return TRUE; } case WM_NCHITTEST: { RECT r = g_resize.griprect; MapWindowPoints(hwndDlg, 0, (POINT*)&r, 2); POINT pt = {GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)}; if (PtInRect(&r, pt)) { SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, HTBOTTOMRIGHT); return TRUE; } return FALSE; } case WM_MAKENSIS_PROCESSCOMPLETE: { if (g_sdata.thread) { CloseHandle(g_sdata.thread); g_sdata.thread=0; } if(g_sdata.compressor == COMPRESSOR_BEST) { if (g_sdata.retcode==0 && FileExists(g_sdata.output_exe)) { TCHAR temp_file_name[1024]; // BUGBUG: Hardcoded buffer size wsprintf(temp_file_name,_T("%s_makensisw_temp"),g_sdata.output_exe); if(!lstrcmpi(g_sdata.compressor_name,compressor_names[(int)COMPRESSOR_SCRIPT+1])) { SetCompressorStats(); CopyFile(g_sdata.output_exe,temp_file_name,false); g_sdata.best_compressor_name = g_sdata.compressor_name; g_sdata.compressor_name = compressor_names[(int)COMPRESSOR_SCRIPT+2]; ResetObjects(); CompileNSISScript(); return TRUE; } else { int this_compressor=0; int i; HANDLE hPrev, hThis; DWORD prevSize=0, thisSize=0; for(i=(int)COMPRESSOR_SCRIPT+2; i<(int)COMPRESSOR_BEST; i++) { if(!lstrcmpi(g_sdata.compressor_name,compressor_names[i])) { this_compressor = i; break; } } if(FileExists(temp_file_name)) { hPrev = CreateFile(temp_file_name,GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, (DWORD)NULL, NULL); if(hPrev != INVALID_HANDLE_VALUE) { prevSize = GetFileSize(hPrev, 0); CloseHandle(hPrev); if(prevSize != INVALID_FILE_SIZE) { hThis = CreateFile(g_sdata.output_exe,GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, (DWORD)NULL, NULL); if(hThis != INVALID_HANDLE_VALUE) { thisSize = GetFileSize(hThis, 0); CloseHandle(hThis); if(thisSize != INVALID_FILE_SIZE) { if(prevSize > thisSize) { CopyFile(g_sdata.output_exe,temp_file_name,false); SetCompressorStats(); g_sdata.best_compressor_name = g_sdata.compressor_name; } } } } } } if(this_compressor == ((int)COMPRESSOR_BEST - 1)) { TCHAR buf[1024]; g_sdata.compressor_name = compressor_names[(int)COMPRESSOR_SCRIPT+1]; if(!lstrcmpi(g_sdata.best_compressor_name,compressor_names[this_compressor])) { wsprintf(buf,COMPRESSOR_MESSAGE,g_sdata.best_compressor_name,thisSize); LogMessage(g_sdata.hwnd,buf); } else { CopyFile(temp_file_name,g_sdata.output_exe,false); wsprintf(buf,RESTORED_COMPRESSOR_MESSAGE,g_sdata.best_compressor_name,prevSize); LogMessage(g_sdata.hwnd,buf); LogMessage(g_sdata.hwnd, g_sdata.compressor_stats); } DeleteFile(temp_file_name); lstrcpy(g_sdata.compressor_stats,_T("")); } else { g_sdata.compressor_name = compressor_names[this_compressor+1]; ResetObjects(); CompileNSISScript(); return TRUE; } } } } EnableItems(g_sdata.hwnd); if (!g_sdata.retcode) { MessageBeep(MB_ICONASTERISK); if (g_sdata.warnings) SetTitle(g_sdata.hwnd,_T("Finished with Warnings")); else SetTitle(g_sdata.hwnd,_T("Finished Sucessfully")); // Added by Darren Owen (DrO) on 1/10/2003 if(g_sdata.recompile_test) PostMessage(g_sdata.hwnd, WM_COMMAND, LOWORD(IDC_TEST), 0); } else { MessageBeep(MB_ICONEXCLAMATION); SetTitle(g_sdata.hwnd,_T("Compile Error: See Log for Details")); } // Added by Darren Owen (DrO) on 1/10/2003 // ensures the recompile and run state is reset after use g_sdata.recompile_test = 0; DragAcceptFiles(g_sdata.hwnd,TRUE); return TRUE; } case MakensisAPI::QUERYHOST: { if (MakensisAPI::QH_OUTPUTCHARSET) { const UINT reqcp = 1200; // We want UTF-16LE SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, (LONG_PTR)(1+reqcp)); return TRUE; } return FALSE; } case WM_NOTIFY: switch (((NMHDR*)lParam)->code ) { case EN_SELCHANGE: SendDlgItemMessage(hwndDlg,IDC_LOGWIN, EM_EXGETSEL, 0, (LPARAM) &g_sdata.textrange); { BOOL enabled = (g_sdata.textrange.cpMax-g_sdata.textrange.cpMin<=0?FALSE:TRUE); EnableMenuItem(g_sdata.menu,IDM_COPYSELECTED,(enabled?MF_ENABLED:MF_GRAYED)); EnableToolBarButton(IDM_COPY,enabled); } // Altered by Darren Owen (DrO) on 6/10/2003 // Allows the detection of the right-click menu when running on OSes below Windows 2000 // and will then simulate the effective WM_CONTEXTMENU message that would be received // note: removed the WM_CONTEXTMENU handling to prevent a duplicate menu appearing on // Windows 2000 and higher case EN_MSGFILTER: #define lpnmMsg ((MSGFILTER*)lParam) if(WM_RBUTTONUP == lpnmMsg->msg || (WM_KEYUP == lpnmMsg->msg && lpnmMsg->wParam == VK_APPS)){ POINT pt; HWND edit = GetDlgItem(g_sdata.hwnd,IDC_LOGWIN); RECT r; GetCursorPos(&pt); // Added and altered by Darren Owen (DrO) on 29/9/2003 // Will place the right-click menu in the top left corner of the window // if the application key is pressed and the mouse is not in the window // from here... ScreenToClient(edit, &pt); GetClientRect(edit, &r); if(!PtInRect(&r, pt)) pt.x = pt.y = 0; MapWindowPoints(edit, HWND_DESKTOP, &pt, 1); TrackPopupMenu(g_sdata.editSubmenu, TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_RIGHTBUTTON, pt.x, pt.y, 0, g_sdata.hwnd, 0); } case TBN_DROPDOWN: { LPNMTOOLBAR pToolBar = (LPNMTOOLBAR) lParam; if(pToolBar->hdr.hwndFrom == g_toolbar.hwnd && pToolBar->iItem == IDM_COMPRESSOR) { ShowToolbarDropdownMenu(); return TBDDRET_DEFAULT; } else { return TBDDRET_NODEFAULT; } } } return TRUE; case WM_COPYDATA: { PCOPYDATASTRUCT cds = PCOPYDATASTRUCT(lParam); switch (cds->dwData) { case MakensisAPI::NOTIFY_SCRIPT: MemSafeFree(g_sdata.input_script); g_sdata.input_script = (TCHAR*) MemAlloc(cds->cbData * sizeof(TCHAR)); lstrcpy(g_sdata.input_script, (TCHAR *)cds->lpData); break; case MakensisAPI::NOTIFY_WARNING: g_sdata.warnings++; break; case MakensisAPI::NOTIFY_ERROR: break; case MakensisAPI::NOTIFY_OUTPUT: MemSafeFree(g_sdata.output_exe); g_sdata.output_exe = (TCHAR*) MemAlloc(cds->cbData * sizeof(TCHAR)); lstrcpy(g_sdata.output_exe, (TCHAR *)cds->lpData); break; } return TRUE; } case WM_COMMAND: { switch (LOWORD(wParam)) { case IDM_BROWSESCR: { if (g_sdata.input_script) { TCHAR str[MAX_PATH],*str2; lstrcpy(str,g_sdata.input_script); str2=_tcsrchr(str,_T('\\')); if(str2!=NULL) *(str2+1)=0; ShellExecute(g_sdata.hwnd,_T("open"),str,NULL,NULL,SW_SHOWNORMAL); } return TRUE; } case IDM_ABOUT: { return DialogBox(g_sdata.hInstance,MAKEINTRESOURCE(DLG_ABOUT),hwndDlg,(DLGPROC)AboutProc); } case IDM_NSISHOME: { ShellExecuteA(g_sdata.hwnd,"open",NSIS_URL,NULL,NULL,SW_SHOWNORMAL); return TRUE; } case IDM_FORUM: { ShellExecuteA(g_sdata.hwnd,"open",NSIS_FOR,NULL,NULL,SW_SHOWNORMAL); return TRUE; } case IDM_NSISUPDATE: { Update(); return TRUE; } case IDM_SELECTALL: { SendDlgItemMessage(g_sdata.hwnd, IDC_LOGWIN, EM_SETSEL, 0, -1); return TRUE; } case IDM_DOCS: { ShowDocs(); return TRUE; } case IDM_LOADSCRIPT: { if (!g_sdata.thread) { OPENFILENAME l={sizeof(l),}; TCHAR buf[MAX_PATH]; l.hwndOwner = hwndDlg; l.lpstrFilter = _T("NSIS Script (*.nsi)\0*.nsi\0All Files (*.*)\0*.*\0"); l.lpstrFile = buf; l.nMaxFile = MAX_STRING-1; l.lpstrTitle = _T("Load Script"); l.lpstrDefExt = _T("log"); l.lpstrFileTitle = NULL; l.lpstrInitialDir = NULL; l.Flags = OFN_HIDEREADONLY|OFN_EXPLORER|OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST; lstrcpy(buf,_T("")); if (GetOpenFileName(&l)) { SetScript(buf); PushMRUFile(g_sdata.script); ResetObjects(); CompileNSISScript(); } } return TRUE; } case IDM_MRU_FILE: case IDM_MRU_FILE+1: case IDM_MRU_FILE+2: case IDM_MRU_FILE+3: case IDM_MRU_FILE+4: LoadMRUFile(LOWORD(wParam)-IDM_MRU_FILE); return TRUE; case IDM_CLEAR_MRU_LIST: ClearMRUList(); return TRUE; case IDM_COMPRESSOR: { SetCompressor((NCOMPRESSOR)(g_sdata.compressor+1)); return TRUE; } case IDM_CLEARLOG: { if (!g_sdata.thread) { ClearLog(g_sdata.hwnd); } return TRUE; } case IDM_RECOMPILE: { CompileNSISScript(); return TRUE; } // Added by Darren Owen (DrO) on 1/10/2003 case IDM_RECOMPILE_TEST: { g_sdata.recompile_test = 1; CompileNSISScript(); return TRUE; } case IDM_SETTINGS: { DialogBox(g_sdata.hInstance,MAKEINTRESOURCE(DLG_SETTINGS),g_sdata.hwnd,(DLGPROC)SettingsProc); return TRUE; } case IDM_TEST: case IDC_TEST: { if (g_sdata.output_exe) { ShellExecute(g_sdata.hwnd,_T("open"),g_sdata.output_exe,NULL,NULL,SW_SHOWNORMAL); } return TRUE; } case IDM_EDITSCRIPT: { if (g_sdata.input_script) { LPCTSTR verb = _T("open"); // BUGBUG: Should not force the open verb? HINSTANCE hi = ShellExecute(g_sdata.hwnd,verb,g_sdata.input_script,NULL,NULL,SW_SHOWNORMAL); if ((UINT_PTR)hi <= 32) { TCHAR path[MAX_PATH]; if (GetWindowsDirectory(path,sizeof(path))) { lstrcat(path,_T("\\notepad.exe")); ShellExecute(g_sdata.hwnd,verb,path,g_sdata.input_script,NULL,SW_SHOWNORMAL); } } } return TRUE; } case IDCANCEL: case IDM_EXIT: { if (!g_sdata.thread) { DestroyWindow(g_sdata.hwnd); } return TRUE; } case IDM_CANCEL: { SetEvent(g_sdata.sigint_event); SetEvent(g_sdata.sigint_event_legacy); return TRUE; } case IDM_COPY: { CopyToClipboard(g_sdata.hwnd); return TRUE; } case IDM_COPYSELECTED: { SendDlgItemMessage(g_sdata.hwnd,IDC_LOGWIN, WM_COPY, 0, 0); return TRUE; } case IDM_SAVE: { OPENFILENAME l={sizeof(l),}; TCHAR buf[MAX_STRING]; l.hwndOwner = hwndDlg; l.lpstrFilter = _T("Log Files (*.log)\0*.log\0Text Files (*.txt)\0*.txt\0All Files (*.*)\0*.*\0"); l.lpstrFile = buf; l.nMaxFile = MAX_STRING-1; l.lpstrTitle = _T("Save Output"); l.lpstrDefExt = _T("log"); l.lpstrInitialDir = NULL; l.Flags = OFN_HIDEREADONLY|OFN_EXPLORER|OFN_PATHMUSTEXIST; lstrcpy(buf,_T("output")); if (GetSaveFileName(&l)) { HANDLE hFile = CreateFile(buf,GENERIC_WRITE,0,0,CREATE_ALWAYS,0,0); if (INVALID_HANDLE_VALUE != hFile) { int len=SendDlgItemMessage(g_sdata.hwnd,IDC_LOGWIN,WM_GETTEXTLENGTH,0,0); TCHAR *existing_text=(TCHAR*) MemAlloc(len * sizeof(TCHAR)); if (existing_text) { // BUGBUG:TODO: Error message for bad hFile and existing_text? existing_text[0]=0; GetDlgItemText(g_sdata.hwnd, IDC_LOGWIN, existing_text, len); DWORD dwWritten = 0; WriteFile(hFile,existing_text,len,&dwWritten,0); MemFree(existing_text); } CloseHandle(hFile); } } return TRUE; } case IDM_FIND: { if (!g_find.uFindReplaceMsg) g_find.uFindReplaceMsg = RegisterWindowMessage(FINDMSGSTRING); memset(&g_find.fr, 0, sizeof(FINDREPLACE)); g_find.fr.lStructSize = sizeof(FINDREPLACE); g_find.fr.hwndOwner = hwndDlg; g_find.fr.Flags = FR_NOUPDOWN; g_find.fr.lpstrFindWhat = g_findbuf; g_find.fr.wFindWhatLen = COUNTOF(g_findbuf); g_find.hwndFind = FindText(&g_find.fr); return TRUE; } default: { int i; DWORD command = LOWORD(wParam); for(i=(int)COMPRESSOR_SCRIPT; i<=(int)COMPRESSOR_BEST; i++) { if(command == compressor_commands[i]) { SetCompressor((NCOMPRESSOR)i); return TRUE; } } } } } } if (g_find.uFindReplaceMsg && msg == g_find.uFindReplaceMsg) { LPFINDREPLACE lpfr = (LPFINDREPLACE)lParam; if (lpfr->Flags & FR_FINDNEXT) { WPARAM flags = FR_DOWN; if (lpfr->Flags & FR_MATCHCASE) flags |= FR_MATCHCASE; if (lpfr->Flags & FR_WHOLEWORD) flags |= FR_WHOLEWORD; FINDTEXTEX ft; SendDlgItemMessage(hwndDlg, IDC_LOGWIN, EM_EXGETSEL, 0, (LPARAM)&ft.chrg); if (ft.chrg.cpMax == ft.chrg.cpMin) ft.chrg.cpMin = 0; else ft.chrg.cpMin = ft.chrg.cpMax; ft.chrg.cpMax = SendDlgItemMessage(hwndDlg, IDC_LOGWIN, WM_GETTEXTLENGTH, 0, 0); ft.lpstrText = lpfr->lpstrFindWhat; ft.chrg.cpMin = SendDlgItemMessage(hwndDlg, IDC_LOGWIN, EM_FINDTEXTEX, flags, (LPARAM)&ft); if (ft.chrg.cpMin != -1) SendDlgItemMessage(hwndDlg, IDC_LOGWIN, EM_SETSEL, ft.chrgText.cpMin, ft.chrgText.cpMax); else MessageBeep(MB_ICONASTERISK); } if (lpfr->Flags & FR_DIALOGTERM) g_find.hwndFind = 0; return TRUE; } return 0; }
// Destructor. KeyboardPage::~KeyboardPage() { // Destroy image list. if ( m_hImages ) ImageList_Destroy( m_hImages ); if ( m_hDisImages ) ImageList_Destroy( m_hDisImages ); }
Globals::~Globals() { try { BOOL bResult; if (m_hHookAccelator) { bResult = UnhookWindowsHookEx(m_hHookAccelator); assert(bResult); } if (m_hBitmapExpandVert) { bResult = DeleteBitmap(m_hBitmapExpandVert); assert(bResult); } if (m_hBitmapExpandHorz) { bResult = DeleteBitmap(m_hBitmapExpandHorz); assert(bResult); } if (m_hBitmapMenuScroll) { bResult = DeleteBitmap(m_hBitmapMenuScroll); assert(bResult); } if (m_hBitmapEndMarker) { bResult = DeleteBitmap(m_hBitmapEndMarker); assert(bResult); } if (m_hBitmapSubMenu) { bResult = DeleteBitmap(m_hBitmapSubMenu); assert(bResult); } if (m_hBitmapSMCombo) { bResult = DeleteBitmap(m_hBitmapSMCombo); assert(bResult); } if (m_hBitmapMenuCheck) { bResult = DeleteBitmap(m_hBitmapMenuCheck); assert(bResult); } if (m_hBitmapMenuExpand) { bResult = DeleteBitmap(m_hBitmapMenuExpand); assert(bResult); } if (m_hBitmapMDIButtons) { bResult = DeleteBitmap(m_hBitmapMDIButtons); assert(bResult); } if (m_hHandCursor) { bResult = DestroyCursor(m_hHandCursor); assert(bResult); } if (m_hSmallCaption) { bResult = DeleteFont(m_hSmallCaption); assert(bResult); } if (m_ilSizer) { bResult = ImageList_Destroy(m_ilSizer); assert(bResult); } if (m_ilSlidingScrollImages) { bResult = ImageList_Destroy(m_ilSlidingScrollImages); assert(bResult); } for (int nIndex = 0; nIndex < GrabStyleCount; nIndex++) { if (m_hBrushGrab[nIndex]) { bResult = DeleteBrush(m_hBrushGrab[nIndex]); assert(bResult); } } if (m_hBrushDither) { bResult = DeleteBrush(m_hBrushDither); assert(bResult); } if (m_hBrushPattern) { bResult = DeleteBrush(m_hBrushPattern); assert(bResult); } if (m_pmapBar) { assert(0 == m_pmapBar->GetCount()); delete m_pmapBar; } if (m_pmapAccelator) { assert(0 == m_pmapAccelator->GetCount()); delete m_pmapAccelator; } if (m_hMMLibrary) FreeLibrary(m_hMMLibrary); if (m_hUser32Library) FreeLibrary(m_hUser32Library); delete m_pDragDropMgr; FDialog::CheckMap(); FDialog::CleanUp(); FWnd::CheckMap(); FWnd::CleanUp(); CDDPropertySheet::Cleanup(); delete m_pControls; delete m_pEventLog; _set_se_translator(m_seFunction); DeleteCriticalSection(&m_csGlobals); DeleteCriticalSection(&m_csPaintIcon); } CATCH { assert(FALSE); m_pEventLog = NULL; REPORTEXCEPTION(__FILE__, __LINE__) } }
LRESULT CALLBACK fnContactListControlWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { ClcGroup *group; ClcContact *contact; DWORD hitFlags; int hit; ClcData *dat = (struct ClcData *) GetWindowLongPtr(hwnd, 0); if (msg >= CLM_FIRST && msg < CLM_LAST) return cli.pfnProcessExternalMessages(hwnd, dat, msg, wParam, lParam); switch (msg) { case WM_CREATE: WindowList_Add(hClcWindowList, hwnd, NULL); cli.pfnRegisterFileDropping(hwnd); if (dat == NULL) { dat = (struct ClcData *) mir_calloc(sizeof(struct ClcData)); SetWindowLongPtr(hwnd, 0, (LONG_PTR)dat); } { for (int i = 0; i <= FONTID_MAX; i++) dat->fontInfo[i].changed = 1; } dat->selection = -1; dat->iconXSpace = 20; dat->checkboxSize = 13; dat->dragAutoScrollHeight = 30; dat->iDragItem = -1; dat->iInsertionMark = -1; dat->insertionMarkHitHeight = 5; dat->iHotTrack = -1; dat->infoTipTimeout = db_get_w(NULL, "CLC", "InfoTipHoverTime", 750); dat->extraColumnSpacing = 20; dat->list.cl.increment = 30; dat->needsResort = 1; cli.pfnLoadClcOptions(hwnd, dat, TRUE); if (!IsWindowVisible(hwnd)) SetTimer(hwnd, TIMERID_REBUILDAFTER, 10, NULL); else { cli.pfnRebuildEntireList(hwnd, dat); NMCLISTCONTROL nm; nm.hdr.code = CLN_LISTREBUILT; nm.hdr.hwndFrom = hwnd; nm.hdr.idFrom = GetDlgCtrlID(hwnd); SendMessage(GetParent(hwnd), WM_NOTIFY, 0, (LPARAM)& nm); } break; case INTM_SCROLLBARCHANGED: if (GetWindowLongPtr(hwnd, GWL_STYLE) & CLS_CONTACTLIST) { if (dat->noVScrollbar) ShowScrollBar(hwnd, SB_VERT, FALSE); else cli.pfnRecalcScrollBar(hwnd, dat); } break; case INTM_RELOADOPTIONS: cli.pfnLoadClcOptions(hwnd, dat, FALSE); cli.pfnSaveStateAndRebuildList(hwnd, dat); break; case WM_THEMECHANGED: cli.pfnInvalidateRect(hwnd, NULL, FALSE); break; case WM_SIZE: cli.pfnEndRename(hwnd, dat, 1); KillTimer(hwnd, TIMERID_INFOTIP); KillTimer(hwnd, TIMERID_RENAME); cli.pfnRecalcScrollBar(hwnd, dat); { // creating imagelist containing blue line for highlight RECT rc; GetClientRect(hwnd, &rc); if (rc.right == 0) break; rc.bottom = dat->rowHeight; HDC hdc = GetDC(hwnd); int depth = GetDeviceCaps(hdc, BITSPIXEL); if (depth < 16) depth = 16; HBITMAP hBmp = CreateBitmap(rc.right, rc.bottom, 1, depth, NULL); HBITMAP hBmpMask = CreateBitmap(rc.right, rc.bottom, 1, 1, NULL); HDC hdcMem = CreateCompatibleDC(hdc); HBITMAP hoBmp = (HBITMAP)SelectObject(hdcMem, hBmp); HBRUSH hBrush = CreateSolidBrush(dat->useWindowsColours ? GetSysColor(COLOR_HIGHLIGHT) : dat->selBkColour); FillRect(hdcMem, &rc, hBrush); DeleteObject(hBrush); HBITMAP hoMaskBmp = (HBITMAP)SelectObject(hdcMem, hBmpMask); FillRect(hdcMem, &rc, (HBRUSH)GetStockObject(BLACK_BRUSH)); SelectObject(hdcMem, hoMaskBmp); SelectObject(hdcMem, hoBmp); DeleteDC(hdcMem); ReleaseDC(hwnd, hdc); if (dat->himlHighlight) ImageList_Destroy(dat->himlHighlight); dat->himlHighlight = ImageList_Create(rc.right, rc.bottom, ILC_COLOR32 | ILC_MASK, 1, 1); ImageList_Add(dat->himlHighlight, hBmp, hBmpMask); DeleteObject(hBmpMask); DeleteObject(hBmp); } break; case WM_SYSCOLORCHANGE: SendMessage(hwnd, WM_SIZE, 0, 0); break; case WM_GETDLGCODE: if (lParam) { MSG *msg = (MSG *)lParam; if (msg->message == WM_KEYDOWN) { if (msg->wParam == VK_TAB) return 0; if (msg->wParam == VK_ESCAPE && dat->hwndRenameEdit == NULL && dat->szQuickSearch[0] == 0) return 0; } if (msg->message == WM_CHAR) { if (msg->wParam == '\t') return 0; if (msg->wParam == 27 && dat->hwndRenameEdit == NULL && dat->szQuickSearch[0] == 0) return 0; } } return DLGC_WANTMESSAGE; case WM_KILLFOCUS: KillTimer(hwnd, TIMERID_INFOTIP); KillTimer(hwnd, TIMERID_RENAME); case WM_SETFOCUS: case WM_ENABLE: cli.pfnInvalidateRect(hwnd, NULL, FALSE); break; case WM_GETFONT: return (LRESULT)dat->fontInfo[FONTID_CONTACTS].hFont; case INTM_GROUPSCHANGED: { DBCONTACTWRITESETTING *dbcws = (DBCONTACTWRITESETTING *)lParam; if (dbcws->value.type == DBVT_ASCIIZ || dbcws->value.type == DBVT_UTF8) { int groupId = atoi(dbcws->szSetting) + 1; TCHAR szFullName[512]; int i, eq; //check name of group and ignore message if just being expanded/collapsed if (cli.pfnFindItem(hwnd, dat, groupId | HCONTACT_ISGROUP, &contact, &group, NULL)) { mir_tstrcpy(szFullName, contact->szText); while (group->parent) { for (i = 0; i < group->parent->cl.count; i++) if (group->parent->cl.items[i]->group == group) break; if (i == group->parent->cl.count) { szFullName[0] = '\0'; break; } group = group->parent; size_t nameLen = mir_tstrlen(group->cl.items[i]->szText); if (mir_tstrlen(szFullName) + 1 + nameLen > _countof(szFullName)) { szFullName[0] = '\0'; break; } memmove(szFullName + 1 + nameLen, szFullName, sizeof(TCHAR)*(mir_tstrlen(szFullName) + 1)); memcpy(szFullName, group->cl.items[i]->szText, sizeof(TCHAR)*nameLen); szFullName[nameLen] = '\\'; } if (dbcws->value.type == DBVT_ASCIIZ) { WCHAR* wszGrpName = mir_a2u(dbcws->value.pszVal + 1); eq = !mir_tstrcmp(szFullName, wszGrpName); mir_free(wszGrpName); } else { char* szGrpName = NEWSTR_ALLOCA(dbcws->value.pszVal + 1); WCHAR* wszGrpName; Utf8Decode(szGrpName, &wszGrpName); eq = !mir_tstrcmp(szFullName, wszGrpName); mir_free(wszGrpName); } if (eq && (contact->group->hideOffline != 0) == ((dbcws->value.pszVal[0] & GROUPF_HIDEOFFLINE) != 0)) break; //only expanded has changed: no action reqd } } cli.pfnSaveStateAndRebuildList(hwnd, dat); } break; case INTM_NAMEORDERCHANGED: cli.pfnInitAutoRebuild(hwnd); break; case INTM_CONTACTADDED: cli.pfnAddContactToTree(hwnd, dat, wParam, 1, 1); cli.pfnNotifyNewContact(hwnd, wParam); SortClcByTimer(hwnd); break; case INTM_CONTACTDELETED: cli.pfnDeleteItemFromTree(hwnd, wParam); SortClcByTimer(hwnd); break; case INTM_HIDDENCHANGED: { DBCONTACTWRITESETTING *dbcws = (DBCONTACTWRITESETTING *)lParam; if (GetWindowLongPtr(hwnd, GWL_STYLE) & CLS_SHOWHIDDEN) break; if (dbcws->value.type == DBVT_DELETED || dbcws->value.bVal == 0) { if (cli.pfnFindItem(hwnd, dat, wParam, NULL, NULL, NULL)) break; cli.pfnAddContactToTree(hwnd, dat, wParam, 1, 1); cli.pfnNotifyNewContact(hwnd, wParam); } else cli.pfnDeleteItemFromTree(hwnd, wParam); dat->needsResort = 1; SortClcByTimer(hwnd); } break; case INTM_GROUPCHANGED: { WORD iExtraImage[EXTRA_ICON_COUNT]; BYTE flags = 0; if (!cli.pfnFindItem(hwnd, dat, wParam, &contact, NULL, NULL)) memset(iExtraImage, 0xFF, sizeof(iExtraImage)); else { memcpy(iExtraImage, contact->iExtraImage, sizeof(iExtraImage)); flags = contact->flags; } cli.pfnDeleteItemFromTree(hwnd, wParam); if (GetWindowLongPtr(hwnd, GWL_STYLE) & CLS_SHOWHIDDEN || !db_get_b(wParam, "CList", "Hidden", 0)) { NMCLISTCONTROL nm; cli.pfnAddContactToTree(hwnd, dat, wParam, 1, 1); if (cli.pfnFindItem(hwnd, dat, wParam, &contact, NULL, NULL)) { memcpy(contact->iExtraImage, iExtraImage, sizeof(iExtraImage)); if (flags & CONTACTF_CHECKED) contact->flags |= CONTACTF_CHECKED; } nm.hdr.code = CLN_CONTACTMOVED; nm.hdr.hwndFrom = hwnd; nm.hdr.idFrom = GetDlgCtrlID(hwnd); nm.flags = 0; nm.hItem = (HANDLE)wParam; SendMessage(GetParent(hwnd), WM_NOTIFY, 0, (LPARAM)& nm); dat->needsResort = 1; } } SetTimer(hwnd, TIMERID_REBUILDAFTER, 1, NULL); break; case INTM_ICONCHANGED: { int recalcScrollBar = 0, shouldShow; WORD status; MCONTACT hSelItem = NULL; ClcContact *selcontact = NULL; char *szProto = GetContactProto(wParam); if (szProto == NULL) status = ID_STATUS_OFFLINE; else status = db_get_w(wParam, szProto, "Status", ID_STATUS_OFFLINE); // this means an offline msg is flashing, so the contact should be shown DWORD style = GetWindowLongPtr(hwnd, GWL_STYLE); shouldShow = (style & CLS_SHOWHIDDEN || !db_get_b(wParam, "CList", "Hidden", 0)) && (!cli.pfnIsHiddenMode(dat, status) || CallService(MS_CLIST_GETCONTACTICON, wParam, 0) != lParam); contact = NULL; group = NULL; if (!cli.pfnFindItem(hwnd, dat, wParam, &contact, &group, NULL)) { if (shouldShow && CallService(MS_DB_CONTACT_IS, wParam, 0)) { if (dat->selection >= 0 && cli.pfnGetRowByIndex(dat, dat->selection, &selcontact, NULL) != -1) hSelItem = (MCONTACT)cli.pfnContactToHItem(selcontact); cli.pfnAddContactToTree(hwnd, dat, wParam, (style & CLS_CONTACTLIST) == 0, 0); recalcScrollBar = 1; cli.pfnFindItem(hwnd, dat, wParam, &contact, NULL, NULL); if (contact) { contact->iImage = (WORD)lParam; cli.pfnNotifyNewContact(hwnd, wParam); dat->needsResort = 1; } } } else { // item in list already if (contact->iImage == (WORD)lParam) break; if (!shouldShow && !(style & CLS_NOHIDEOFFLINE) && (style & CLS_HIDEOFFLINE || group->hideOffline)) { if (dat->selection >= 0 && cli.pfnGetRowByIndex(dat, dat->selection, &selcontact, NULL) != -1) hSelItem = (MCONTACT)cli.pfnContactToHItem(selcontact); cli.pfnRemoveItemFromGroup(hwnd, group, contact, (style & CLS_CONTACTLIST) == 0); recalcScrollBar = 1; } else { contact->iImage = (WORD)lParam; if (!cli.pfnIsHiddenMode(dat, status)) contact->flags |= CONTACTF_ONLINE; else contact->flags &= ~CONTACTF_ONLINE; } dat->needsResort = 1; } if (hSelItem) { ClcGroup *selgroup; if (cli.pfnFindItem(hwnd, dat, hSelItem, &selcontact, &selgroup, NULL)) dat->selection = cli.pfnGetRowsPriorTo(&dat->list, selgroup, List_IndexOf((SortedList*)&selgroup->cl, selcontact)); else dat->selection = -1; } SortClcByTimer(hwnd); } break; case INTM_NAMECHANGED: if (!cli.pfnFindItem(hwnd, dat, wParam, &contact, NULL, NULL)) break; mir_tstrncpy(contact->szText, cli.pfnGetContactDisplayName(wParam, 0), _countof(contact->szText)); dat->needsResort = 1; SortClcByTimer(hwnd); break; case INTM_PROTOCHANGED: if (!cli.pfnFindItem(hwnd, dat, wParam, &contact, NULL, NULL)) break; contact->proto = GetContactProto(wParam); cli.pfnInvalidateDisplayNameCacheEntry(wParam); mir_tstrncpy(contact->szText, cli.pfnGetContactDisplayName(wParam, 0), _countof(contact->szText)); SortClcByTimer(hwnd); break; case INTM_NOTONLISTCHANGED: if (!cli.pfnFindItem(hwnd, dat, wParam, &contact, NULL, NULL)) break; if (contact->type == CLCIT_CONTACT) { DBCONTACTWRITESETTING *dbcws = (DBCONTACTWRITESETTING *)lParam; if (dbcws->value.type == DBVT_DELETED || dbcws->value.bVal == 0) contact->flags &= ~CONTACTF_NOTONLIST; else contact->flags |= CONTACTF_NOTONLIST; cli.pfnInvalidateRect(hwnd, NULL, FALSE); } break; case INTM_INVALIDATE: cli.pfnInvalidateRect(hwnd, NULL, FALSE); break; case INTM_APPARENTMODECHANGED: if (cli.pfnFindItem(hwnd, dat, wParam, &contact, NULL, NULL)) { char *szProto = GetContactProto(wParam); if (szProto == NULL) break; WORD apparentMode = db_get_w(wParam, szProto, "ApparentMode", 0); contact->flags &= ~(CONTACTF_INVISTO | CONTACTF_VISTO); if (apparentMode == ID_STATUS_OFFLINE) contact->flags |= CONTACTF_INVISTO; else if (apparentMode == ID_STATUS_ONLINE) contact->flags |= CONTACTF_VISTO; else if (apparentMode) contact->flags |= CONTACTF_VISTO | CONTACTF_INVISTO; cli.pfnInvalidateRect(hwnd, NULL, FALSE); } break; case INTM_SETINFOTIPHOVERTIME: dat->infoTipTimeout = wParam; break; case INTM_IDLECHANGED: if (cli.pfnFindItem(hwnd, dat, wParam, &contact, NULL, NULL)) { char *szProto = GetContactProto(wParam); if (szProto == NULL) break; contact->flags &= ~CONTACTF_IDLE; if (db_get_dw(wParam, szProto, "IdleTS", 0)) contact->flags |= CONTACTF_IDLE; cli.pfnInvalidateRect(hwnd, NULL, FALSE); } break; case WM_PRINTCLIENT: cli.pfnPaintClc(hwnd, dat, (HDC)wParam, NULL); break; case WM_NCPAINT: if (wParam != 1) { 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); } break; case WM_PAINT: { PAINTSTRUCT ps; HDC hdc = BeginPaint(hwnd, &ps); /* we get so many cli.pfnInvalidateRect()'s that there is no point painting, Windows in theory shouldn't queue up WM_PAINTs in this case but it does so we'll just ignore them */ if (IsWindowVisible(hwnd)) cli.pfnPaintClc(hwnd, dat, hdc, &ps.rcPaint); EndPaint(hwnd, &ps); } break; case WM_VSCROLL: cli.pfnEndRename(hwnd, dat, 1); cli.pfnHideInfoTip(hwnd, dat); KillTimer(hwnd, TIMERID_INFOTIP); KillTimer(hwnd, TIMERID_RENAME); { int desty = dat->yScroll, noSmooth = 0; RECT clRect; GetClientRect(hwnd, &clRect); switch (LOWORD(wParam)) { case SB_LINEUP: desty -= dat->rowHeight; break; case SB_LINEDOWN: desty += dat->rowHeight; break; case SB_PAGEUP: desty -= clRect.bottom - dat->rowHeight; break; case SB_PAGEDOWN: desty += clRect.bottom - dat->rowHeight; break; case SB_BOTTOM: desty = 0x7FFFFFFF; break; case SB_TOP: desty = 0; break; case SB_THUMBTRACK: desty = HIWORD(wParam); noSmooth = 1; break; //noone has more than 4000 contacts, right? default: return 0; } cli.pfnScrollTo(hwnd, dat, desty, noSmooth); } break; case WM_MOUSEWHEEL: cli.pfnEndRename(hwnd, dat, 1); cli.pfnHideInfoTip(hwnd, dat); KillTimer(hwnd, TIMERID_INFOTIP); KillTimer(hwnd, TIMERID_RENAME); { UINT scrollLines; if (!SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, &scrollLines, FALSE)) scrollLines = 3; cli.pfnScrollTo(hwnd, dat, dat->yScroll - (short)HIWORD(wParam) * dat->rowHeight * (signed)scrollLines / WHEEL_DELTA, 0); } return 0; case WM_KEYDOWN: { int selMoved = 0; int changeGroupExpand = 0; int pageSize; cli.pfnHideInfoTip(hwnd, dat); KillTimer(hwnd, TIMERID_INFOTIP); KillTimer(hwnd, TIMERID_RENAME); if (CallService(MS_CLIST_MENUPROCESSHOTKEY, wParam, MPCF_CONTACTMENU)) break; { RECT clRect; GetClientRect(hwnd, &clRect); pageSize = clRect.bottom / dat->rowHeight; } switch (wParam) { case VK_DOWN: dat->selection++; selMoved = 1; break; case VK_UP: dat->selection--; selMoved = 1; break; case VK_PRIOR: dat->selection -= pageSize; selMoved = 1; break; case VK_NEXT: dat->selection += pageSize; selMoved = 1; break; case VK_HOME: dat->selection = 0; selMoved = 1; break; case VK_END: dat->selection = cli.pfnGetGroupContentsCount(&dat->list, 1) - 1; selMoved = 1; break; case VK_LEFT: changeGroupExpand = 1; break; case VK_RIGHT: changeGroupExpand = 2; break; case VK_RETURN: cli.pfnDoSelectionDefaultAction(hwnd, dat); dat->szQuickSearch[0] = 0; if (dat->filterSearch) cli.pfnSaveStateAndRebuildList(hwnd, dat); return 0; case VK_F2: cli.pfnBeginRenameSelection(hwnd, dat); return 0; case VK_DELETE: cli.pfnDeleteFromContactList(hwnd, dat); return 0; default: { NMKEY nmkey; nmkey.hdr.hwndFrom = hwnd; nmkey.hdr.idFrom = GetDlgCtrlID(hwnd); nmkey.hdr.code = NM_KEYDOWN; nmkey.nVKey = wParam; nmkey.uFlags = HIWORD(lParam); if (SendMessage(GetParent(hwnd), WM_NOTIFY, 0, (LPARAM)& nmkey)) return 0; } } if (changeGroupExpand) { if (!dat->filterSearch) dat->szQuickSearch[0] = 0; hit = cli.pfnGetRowByIndex(dat, dat->selection, &contact, &group); if (hit != -1) { if (changeGroupExpand == 1 && contact->type == CLCIT_CONTACT) { if (group == &dat->list) return 0; dat->selection = cli.pfnGetRowsPriorTo(&dat->list, group, -1); selMoved = 1; } else { if (contact->type == CLCIT_GROUP) cli.pfnSetGroupExpand(hwnd, dat, contact->group, changeGroupExpand == 2); return 0; } } else return 0; } if (selMoved) { if (!dat->filterSearch) dat->szQuickSearch[0] = 0; if (dat->selection >= cli.pfnGetGroupContentsCount(&dat->list, 1)) dat->selection = cli.pfnGetGroupContentsCount(&dat->list, 1) - 1; if (dat->selection < 0) dat->selection = 0; cli.pfnInvalidateRect(hwnd, NULL, FALSE); cli.pfnEnsureVisible(hwnd, dat, dat->selection, 0); UpdateWindow(hwnd); return 0; } } break; case WM_CHAR: cli.pfnHideInfoTip(hwnd, dat); KillTimer(hwnd, TIMERID_INFOTIP); KillTimer(hwnd, TIMERID_RENAME); if (wParam == 27) //escape dat->szQuickSearch[0] = 0; else if (wParam == '\b' && dat->szQuickSearch[0]) dat->szQuickSearch[mir_tstrlen(dat->szQuickSearch) - 1] = '\0'; else if (wParam < ' ') break; else if (wParam == ' ' && dat->szQuickSearch[0] == '\0' && GetWindowLongPtr(hwnd, GWL_STYLE) & CLS_CHECKBOXES) { NMCLISTCONTROL nm; if (cli.pfnGetRowByIndex(dat, dat->selection, &contact, NULL) == -1) break; if (contact->type != CLCIT_CONTACT) break; contact->flags ^= CONTACTF_CHECKED; if (contact->type == CLCIT_GROUP) cli.pfnSetGroupChildCheckboxes(contact->group, contact->flags & CONTACTF_CHECKED); cli.pfnRecalculateGroupCheckboxes(hwnd, dat); cli.pfnInvalidateRect(hwnd, NULL, FALSE); nm.hdr.code = CLN_CHECKCHANGED; nm.hdr.hwndFrom = hwnd; nm.hdr.idFrom = GetDlgCtrlID(hwnd); nm.flags = 0; nm.hItem = cli.pfnContactToItemHandle(contact, &nm.flags); SendMessage(GetParent(hwnd), WM_NOTIFY, 0, (LPARAM)& nm); } else { TCHAR szNew[2]; szNew[0] = (TCHAR)wParam; szNew[1] = '\0'; if (mir_tstrlen(dat->szQuickSearch) >= _countof(dat->szQuickSearch) - 1) { MessageBeep(MB_OK); break; } mir_tstrcat(dat->szQuickSearch, szNew); } if (dat->filterSearch) cli.pfnSaveStateAndRebuildList(hwnd, dat); if (dat->szQuickSearch[0]) { int index; index = cli.pfnFindRowByText(hwnd, dat, dat->szQuickSearch, 1); if (index != -1) dat->selection = index; else { MessageBeep(MB_OK); dat->szQuickSearch[mir_tstrlen(dat->szQuickSearch) - 1] = '\0'; cli.pfnSaveStateAndRebuildList(hwnd, dat); } cli.pfnInvalidateRect(hwnd, NULL, FALSE); cli.pfnEnsureVisible(hwnd, dat, dat->selection, 0); } else cli.pfnInvalidateRect(hwnd, NULL, FALSE); break; case WM_SYSKEYDOWN: cli.pfnEndRename(hwnd, dat, 1); cli.pfnHideInfoTip(hwnd, dat); KillTimer(hwnd, TIMERID_INFOTIP); KillTimer(hwnd, TIMERID_RENAME); dat->iHotTrack = -1; cli.pfnInvalidateRect(hwnd, NULL, FALSE); ReleaseCapture(); if (wParam == VK_F10 && GetKeyState(VK_SHIFT) & 0x8000) break; SendMessage(GetParent(hwnd), msg, wParam, lParam); return 0; case WM_TIMER: switch (wParam) { case TIMERID_RENAME: cli.pfnBeginRenameSelection(hwnd, dat); break; case TIMERID_DRAGAUTOSCROLL: cli.pfnScrollTo(hwnd, dat, dat->yScroll + dat->dragAutoScrolling * dat->rowHeight * 2, 0); break; case TIMERID_INFOTIP: { CLCINFOTIP it; RECT clRect; POINT ptClientOffset = { 0 }; KillTimer(hwnd, wParam); GetCursorPos(&it.ptCursor); ScreenToClient(hwnd, &it.ptCursor); if (it.ptCursor.x != dat->ptInfoTip.x || it.ptCursor.y != dat->ptInfoTip.y) break; GetClientRect(hwnd, &clRect); it.rcItem.left = 0; it.rcItem.right = clRect.right; hit = cli.pfnHitTest(hwnd, dat, it.ptCursor.x, it.ptCursor.y, &contact, NULL, NULL); if (hit == -1) break; if (contact->type != CLCIT_GROUP && contact->type != CLCIT_CONTACT) break; ClientToScreen(hwnd, &it.ptCursor); ClientToScreen(hwnd, &ptClientOffset); it.isTreeFocused = GetFocus() == hwnd; it.rcItem.top = cli.pfnGetRowTopY(dat, hit) - dat->yScroll; it.rcItem.bottom = it.rcItem.top + cli.pfnGetRowHeight(dat, hit); OffsetRect(&it.rcItem, ptClientOffset.x, ptClientOffset.y); it.isGroup = contact->type == CLCIT_GROUP; it.hItem = (contact->type == CLCIT_GROUP) ? (HANDLE)contact->groupId : (HANDLE)contact->hContact; it.cbSize = sizeof(it); dat->hInfoTipItem = cli.pfnContactToHItem(contact); NotifyEventHooks(hShowInfoTipEvent, 0, (LPARAM)& it); break; } case TIMERID_REBUILDAFTER: KillTimer(hwnd, TIMERID_REBUILDAFTER); cli.pfnInvalidateRect(hwnd, NULL, FALSE); cli.pfnSaveStateAndRebuildList(hwnd, dat); break; case TIMERID_DELAYEDRESORTCLC: KillTimer(hwnd, TIMERID_DELAYEDRESORTCLC); cli.pfnInvalidateRect(hwnd, NULL, FALSE); cli.pfnSortCLC(hwnd, dat, 1); cli.pfnRecalcScrollBar(hwnd, dat); break; } break; case WM_MBUTTONDOWN: case WM_LBUTTONDOWN: if (GetFocus() != hwnd) SetFocus(hwnd); cli.pfnHideInfoTip(hwnd, dat); KillTimer(hwnd, TIMERID_INFOTIP); KillTimer(hwnd, TIMERID_RENAME); cli.pfnEndRename(hwnd, dat, 1); dat->ptDragStart.x = (short)LOWORD(lParam); dat->ptDragStart.y = (short)HIWORD(lParam); if (!dat->filterSearch) dat->szQuickSearch[0] = 0; hit = cli.pfnHitTest(hwnd, dat, (short)LOWORD(lParam), (short)HIWORD(lParam), &contact, &group, &hitFlags); if (hit != -1) { if (hit == dat->selection && hitFlags & CLCHT_ONITEMLABEL && dat->exStyle & CLS_EX_EDITLABELS) { SetCapture(hwnd); dat->iDragItem = dat->selection; dat->dragStage = DRAGSTAGE_NOTMOVED | DRAGSTAGEF_MAYBERENAME; dat->dragAutoScrolling = 0; break; } } if (hit != -1 && contact->type == CLCIT_GROUP) { if (hitFlags & CLCHT_ONITEMICON) { ClcGroup *selgroup; ClcContact *selcontact; dat->selection = cli.pfnGetRowByIndex(dat, dat->selection, &selcontact, &selgroup); cli.pfnSetGroupExpand(hwnd, dat, contact->group, -1); if (dat->selection != -1) { dat->selection = cli.pfnGetRowsPriorTo(&dat->list, selgroup, List_IndexOf((SortedList*)&selgroup->cl, selcontact)); if (dat->selection == -1) dat->selection = cli.pfnGetRowsPriorTo(&dat->list, contact->group, -1); } cli.pfnInvalidateRect(hwnd, NULL, FALSE); UpdateWindow(hwnd); break; } } if (hit != -1 && hitFlags & CLCHT_ONITEMCHECK) { NMCLISTCONTROL nm; contact->flags ^= CONTACTF_CHECKED; if (contact->type == CLCIT_GROUP) cli.pfnSetGroupChildCheckboxes(contact->group, contact->flags & CONTACTF_CHECKED); cli.pfnRecalculateGroupCheckboxes(hwnd, dat); cli.pfnInvalidateRect(hwnd, NULL, FALSE); nm.hdr.code = CLN_CHECKCHANGED; nm.hdr.hwndFrom = hwnd; nm.hdr.idFrom = GetDlgCtrlID(hwnd); nm.flags = 0; nm.hItem = cli.pfnContactToItemHandle(contact, &nm.flags); SendMessage(GetParent(hwnd), WM_NOTIFY, 0, (LPARAM)&nm); } if (!(hitFlags & (CLCHT_ONITEMICON | CLCHT_ONITEMLABEL | CLCHT_ONITEMCHECK))) { NMCLISTCONTROL nm; nm.hdr.code = NM_CLICK; nm.hdr.hwndFrom = hwnd; nm.hdr.idFrom = GetDlgCtrlID(hwnd); nm.flags = 0; if (hit == -1) nm.hItem = NULL; else nm.hItem = cli.pfnContactToItemHandle(contact, &nm.flags); nm.iColumn = hitFlags & CLCHT_ONITEMEXTRA ? HIBYTE(HIWORD(hitFlags)) : -1; nm.pt = dat->ptDragStart; SendMessage(GetParent(hwnd), WM_NOTIFY, 0, (LPARAM)& nm); } if (hitFlags & (CLCHT_ONITEMCHECK | CLCHT_ONITEMEXTRA)) break; dat->selection = hit; cli.pfnInvalidateRect(hwnd, NULL, FALSE); if (dat->selection != -1) cli.pfnEnsureVisible(hwnd, dat, hit, 0); UpdateWindow(hwnd); if (dat->selection != -1 && (contact->type == CLCIT_CONTACT || contact->type == CLCIT_GROUP) && !(hitFlags & (CLCHT_ONITEMEXTRA | CLCHT_ONITEMCHECK))) { SetCapture(hwnd); dat->iDragItem = dat->selection; dat->dragStage = DRAGSTAGE_NOTMOVED; dat->dragAutoScrolling = 0; } break; case WM_MOUSEMOVE: if (dat->iDragItem == -1) { int iOldHotTrack = dat->iHotTrack; if (dat->hwndRenameEdit != NULL) break; if (GetKeyState(VK_MENU) & 0x8000 || GetKeyState(VK_F10) & 0x8000) break; dat->iHotTrack = cli.pfnHitTest(hwnd, dat, (short)LOWORD(lParam), (short)HIWORD(lParam), NULL, NULL, NULL); if (iOldHotTrack != dat->iHotTrack) { if (iOldHotTrack == -1) SetCapture(hwnd); else if (dat->iHotTrack == -1) ReleaseCapture(); if (dat->exStyle & CLS_EX_TRACKSELECT) { cli.pfnInvalidateItem(hwnd, dat, iOldHotTrack); cli.pfnInvalidateItem(hwnd, dat, dat->iHotTrack); } cli.pfnHideInfoTip(hwnd, dat); } KillTimer(hwnd, TIMERID_INFOTIP); if (wParam == 0 && dat->hInfoTipItem == NULL) { dat->ptInfoTip.x = (short)LOWORD(lParam); dat->ptInfoTip.y = (short)HIWORD(lParam); SetTimer(hwnd, TIMERID_INFOTIP, dat->infoTipTimeout, NULL); } break; } if ((dat->dragStage & DRAGSTAGEM_STAGE) == DRAGSTAGE_NOTMOVED && !(dat->exStyle & CLS_EX_DISABLEDRAGDROP)) { if (abs((short)LOWORD(lParam) - dat->ptDragStart.x) >= GetSystemMetrics(SM_CXDRAG) || abs((short)HIWORD(lParam) - dat->ptDragStart.y) >= GetSystemMetrics(SM_CYDRAG)) dat->dragStage = (dat->dragStage & ~DRAGSTAGEM_STAGE) | DRAGSTAGE_ACTIVE; } if ((dat->dragStage & DRAGSTAGEM_STAGE) == DRAGSTAGE_ACTIVE) { HCURSOR hNewCursor; RECT clRect; POINT pt; int target; GetClientRect(hwnd, &clRect); pt.x = (short)LOWORD(lParam); pt.y = (short)HIWORD(lParam); hNewCursor = LoadCursor(NULL, IDC_NO); cli.pfnInvalidateRect(hwnd, NULL, FALSE); if (dat->dragAutoScrolling) { KillTimer(hwnd, TIMERID_DRAGAUTOSCROLL); dat->dragAutoScrolling = 0; } target = cli.pfnGetDropTargetInformation(hwnd, dat, pt); if (dat->dragStage & DRAGSTAGEF_OUTSIDE && target != DROPTARGET_OUTSIDE) { cli.pfnGetRowByIndex(dat, dat->iDragItem, &contact, NULL); NMCLISTCONTROL nm; nm.hdr.code = CLN_DRAGSTOP; nm.hdr.hwndFrom = hwnd; nm.hdr.idFrom = GetDlgCtrlID(hwnd); nm.flags = 0; nm.hItem = cli.pfnContactToItemHandle(contact, &nm.flags); SendMessage(GetParent(hwnd), WM_NOTIFY, 0, (LPARAM)& nm); dat->dragStage &= ~DRAGSTAGEF_OUTSIDE; } switch (target) { case DROPTARGET_ONSELF: case DROPTARGET_ONCONTACT: break; case DROPTARGET_ONGROUP: hNewCursor = LoadCursor(cli.hInst, MAKEINTRESOURCE(IDC_DROPUSER)); break; case DROPTARGET_INSERTION: hNewCursor = LoadCursor(cli.hInst, MAKEINTRESOURCE(IDC_DROPUSER)); break; case DROPTARGET_OUTSIDE: { NMCLISTCONTROL nm; if (pt.x >= 0 && pt.x < clRect.right && ((pt.y < 0 && pt.y > -dat->dragAutoScrollHeight) || (pt.y >= clRect.bottom && pt.y < clRect.bottom + dat->dragAutoScrollHeight))) { if (!dat->dragAutoScrolling) { if (pt.y < 0) dat->dragAutoScrolling = -1; else dat->dragAutoScrolling = 1; SetTimer(hwnd, TIMERID_DRAGAUTOSCROLL, dat->scrollTime, NULL); } SendMessage(hwnd, WM_TIMER, TIMERID_DRAGAUTOSCROLL, 0); } dat->dragStage |= DRAGSTAGEF_OUTSIDE; cli.pfnGetRowByIndex(dat, dat->iDragItem, &contact, NULL); nm.hdr.code = CLN_DRAGGING; nm.hdr.hwndFrom = hwnd; nm.hdr.idFrom = GetDlgCtrlID(hwnd); nm.flags = 0; nm.hItem = cli.pfnContactToItemHandle(contact, &nm.flags); nm.pt = pt; if (SendMessage(GetParent(hwnd), WM_NOTIFY, 0, (LPARAM)& nm)) return 0; } break; default: cli.pfnGetRowByIndex(dat, dat->iDragItem, NULL, &group); if (group->parent) hNewCursor = LoadCursor(cli.hInst, MAKEINTRESOURCE(IDC_DROPUSER)); break; } SetCursor(hNewCursor); } break; case WM_LBUTTONUP: if (dat->iDragItem == -1) break; SetCursor((HCURSOR)GetClassLongPtr(hwnd, GCLP_HCURSOR)); if (dat->exStyle & CLS_EX_TRACKSELECT) { dat->iHotTrack = cli.pfnHitTest(hwnd, dat, (short)LOWORD(lParam), (short)HIWORD(lParam), NULL, NULL, NULL); if (dat->iHotTrack == -1) ReleaseCapture(); } else ReleaseCapture(); KillTimer(hwnd, TIMERID_DRAGAUTOSCROLL); if (dat->dragStage == (DRAGSTAGE_NOTMOVED | DRAGSTAGEF_MAYBERENAME)) SetTimer(hwnd, TIMERID_RENAME, GetDoubleClickTime(), NULL); else if ((dat->dragStage & DRAGSTAGEM_STAGE) == DRAGSTAGE_ACTIVE) { POINT pt = { LOWORD(lParam), HIWORD(lParam) }; int target = cli.pfnGetDropTargetInformation(hwnd, dat, pt); switch (target) { case DROPTARGET_ONSELF: case DROPTARGET_ONCONTACT: break; case DROPTARGET_ONGROUP: { ClcContact *contactn, *contacto; cli.pfnGetRowByIndex(dat, dat->selection, &contactn, NULL); cli.pfnGetRowByIndex(dat, dat->iDragItem, &contacto, NULL); if (contacto->type == CLCIT_CONTACT) //dropee is a contact CallService(MS_CLIST_CONTACTCHANGEGROUP, (WPARAM)contacto->hContact, contactn->groupId); else if (contacto->type == CLCIT_GROUP) { //dropee is a group TCHAR szNewName[120]; mir_sntprintf(szNewName, _countof(szNewName), _T("%s\\%s"), cli.pfnGetGroupName(contactn->groupId, NULL), contacto->szText); cli.pfnRenameGroup(contacto->groupId, szNewName); } } break; case DROPTARGET_INSERTION: cli.pfnGetRowByIndex(dat, dat->iDragItem, &contact, NULL); { ClcContact *destcontact; ClcGroup *destgroup; if (cli.pfnGetRowByIndex(dat, dat->iInsertionMark, &destcontact, &destgroup) == -1 || destgroup != contact->group->parent) CallService(MS_CLIST_GROUPMOVEBEFORE, contact->groupId, 0); else { if (destcontact->type == CLCIT_GROUP) destgroup = destcontact->group; CallService(MS_CLIST_GROUPMOVEBEFORE, contact->groupId, destgroup->groupId); } } break; case DROPTARGET_OUTSIDE: cli.pfnGetRowByIndex(dat, dat->iDragItem, &contact, NULL); { NMCLISTCONTROL nm; nm.hdr.code = CLN_DROPPED; nm.hdr.hwndFrom = hwnd; nm.hdr.idFrom = GetDlgCtrlID(hwnd); nm.flags = 0; nm.hItem = cli.pfnContactToItemHandle(contact, &nm.flags); nm.pt = pt; SendMessage(GetParent(hwnd), WM_NOTIFY, 0, (LPARAM)& nm); } break; default: cli.pfnGetRowByIndex(dat, dat->iDragItem, &contact, &group); if (!group->parent) break; if (contact->type == CLCIT_GROUP) { //dropee is a group TCHAR szNewName[120]; mir_tstrncpy(szNewName, contact->szText, _countof(szNewName)); cli.pfnRenameGroup(contact->groupId, szNewName); } else if (contact->type == CLCIT_CONTACT) //dropee is a contact CallService(MS_CLIST_CONTACTCHANGEGROUP, (WPARAM)contact->hContact, 0); } } cli.pfnInvalidateRect(hwnd, NULL, FALSE); dat->iDragItem = -1; dat->iInsertionMark = -1; break; case WM_LBUTTONDBLCLK: ReleaseCapture(); dat->iHotTrack = -1; cli.pfnHideInfoTip(hwnd, dat); KillTimer(hwnd, TIMERID_RENAME); KillTimer(hwnd, TIMERID_INFOTIP); dat->selection = cli.pfnHitTest(hwnd, dat, (short)LOWORD(lParam), (short)HIWORD(lParam), &contact, NULL, &hitFlags); cli.pfnInvalidateRect(hwnd, NULL, FALSE); if (dat->selection != -1) cli.pfnEnsureVisible(hwnd, dat, dat->selection, 0); if (!(hitFlags & (CLCHT_ONITEMICON | CLCHT_ONITEMLABEL))) break; UpdateWindow(hwnd); cli.pfnDoSelectionDefaultAction(hwnd, dat); dat->szQuickSearch[0] = 0; if (dat->filterSearch) cli.pfnSaveStateAndRebuildList(hwnd, dat); break; case WM_CONTEXTMENU: cli.pfnEndRename(hwnd, dat, 1); cli.pfnHideInfoTip(hwnd, dat); KillTimer(hwnd, TIMERID_RENAME); KillTimer(hwnd, TIMERID_INFOTIP); if (GetFocus() != hwnd) SetFocus(hwnd); dat->iHotTrack = -1; if (!dat->filterSearch) dat->szQuickSearch[0] = 0; { POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) }; if (pt.x == -1 && pt.y == -1) { dat->selection = cli.pfnGetRowByIndex(dat, dat->selection, &contact, NULL); if (dat->selection != -1) cli.pfnEnsureVisible(hwnd, dat, dat->selection, 0); pt.x = dat->iconXSpace + 15; pt.y = cli.pfnGetRowTopY(dat, dat->selection) - dat->yScroll + (int)(cli.pfnGetRowHeight(dat, dat->selection) * .7); hitFlags = (dat->selection == -1) ? CLCHT_NOWHERE : CLCHT_ONITEMLABEL; } else { ScreenToClient(hwnd, &pt); dat->selection = cli.pfnHitTest(hwnd, dat, pt.x, pt.y, &contact, NULL, &hitFlags); } cli.pfnInvalidateRect(hwnd, NULL, FALSE); if (dat->selection != -1) cli.pfnEnsureVisible(hwnd, dat, dat->selection, 0); UpdateWindow(hwnd); if (dat->selection != -1 && hitFlags & (CLCHT_ONITEMICON | CLCHT_ONITEMCHECK | CLCHT_ONITEMLABEL)) { HMENU hMenu; if (contact->type == CLCIT_GROUP) hMenu = cli.pfnBuildGroupPopupMenu(contact->group); else if (contact->type == CLCIT_CONTACT) hMenu = Menu_BuildContactMenu(contact->hContact); else return 0; ClientToScreen(hwnd, &pt); TrackPopupMenu(hMenu, TPM_TOPALIGN | TPM_LEFTALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, 0, hwnd, NULL); DestroyMenu(hMenu); } else //call parent for new group/hide offline menu SendMessage(GetParent(hwnd), WM_CONTEXTMENU, wParam, lParam); } return 0; case WM_MEASUREITEM: return Menu_MeasureItem((LPMEASUREITEMSTRUCT)lParam); case WM_DRAWITEM: return Menu_DrawItem((LPDRAWITEMSTRUCT)lParam); case WM_COMMAND: hit = cli.pfnGetRowByIndex(dat, dat->selection, &contact, NULL); if (hit == -1) break; if (contact->type == CLCIT_CONTACT) if (CallService(MS_CLIST_MENUPROCESSCOMMAND, MAKEWPARAM(LOWORD(wParam), MPCF_CONTACTMENU), (LPARAM)contact->hContact)) break; switch (LOWORD(wParam)) { case POPUP_NEWSUBGROUP: if (contact->type != CLCIT_GROUP) break; SetWindowLongPtr(hwnd, GWL_STYLE, GetWindowLongPtr(hwnd, GWL_STYLE) & ~CLS_HIDEEMPTYGROUPS); CallService(MS_CLIST_GROUPCREATE, contact->groupId, 0); break; case POPUP_RENAMEGROUP: cli.pfnBeginRenameSelection(hwnd, dat); break; case POPUP_DELETEGROUP: if (contact->type != CLCIT_GROUP) break; CallService(MS_CLIST_GROUPDELETE, contact->groupId, 0); break; case POPUP_GROUPHIDEOFFLINE: if (contact->type != CLCIT_GROUP) break; CallService(MS_CLIST_GROUPSETFLAGS, contact->groupId, MAKELPARAM(contact->group->hideOffline ? 0 : GROUPF_HIDEOFFLINE, GROUPF_HIDEOFFLINE)); break; } break; case WM_DESTROY: cli.pfnHideInfoTip(hwnd, dat); for (int i = 0; i <= FONTID_MAX; i++) if (!dat->fontInfo[i].changed) DeleteObject(dat->fontInfo[i].hFont); if (dat->himlHighlight) ImageList_Destroy(dat->himlHighlight); if (dat->hwndRenameEdit) DestroyWindow(dat->hwndRenameEdit); if (dat->hBmpBackground) DeleteObject(dat->hBmpBackground); cli.pfnFreeGroup(&dat->list); mir_free(dat); cli.pfnUnregisterFileDropping(hwnd); WindowList_Remove(hClcWindowList, hwnd); } return DefWindowProc(hwnd, msg, wParam, lParam); }
INT_PTR CALLBACK AddContactDlgProc(HWND hdlg, UINT msg, WPARAM wparam, LPARAM lparam) { AddDialogParam *acs = (AddDialogParam*)GetWindowLongPtr(hdlg, GWLP_USERDATA); switch (msg) { case WM_INITDIALOG: acs = new AddDialogParam(); acs->handleType = HANDLE_SEARCHRESULT; SetWindowLongPtr(hdlg, GWLP_USERDATA, (LONG_PTR)acs); Utils_RestoreWindowPositionNoSize(hdlg, NULL, "AddContact", ""); TranslateDialogDefault(hdlg); SendMessage(hdlg, WM_SETICON, ICON_BIG, (LPARAM)Skin_GetIcon(ICON_ADD,1)); SendMessage(hdlg, WM_SETICON, ICON_SMALL, (LPARAM)Skin_GetIcon(ICON_ADD)); HookEventMessage(ME_SKIN2_ICONSCHANGED, hdlg, DM_ADDCONTACT_CHANGEICONS); HookEventMessage(ME_PROTO_ACCLISTCHANGED, hdlg, DM_ADDCONTACT_CHANGEACCLIST); { TCHAR *szGroup; for (int i = 1; (szGroup = pcli->pfnGetGroupName(i, NULL)) != NULL; i++) { int id = SendDlgItemMessage(hdlg, IDC_GROUP, CB_ADDSTRING, 0, (LPARAM)szGroup); SendDlgItemMessage(hdlg, IDC_GROUP, CB_SETITEMDATA, (WPARAM)id, (LPARAM)i); } } SendDlgItemMessage(hdlg, IDC_GROUP, CB_INSERTSTRING, 0, (LPARAM)TranslateT("None")); SendDlgItemMessage(hdlg, IDC_GROUP, CB_SETCURSEL, 0, 0); { ptrA szProto(db_get_sa(NULL, "AddContact", "LastProto")); if (szProto) acs->proto = szProto; } if (AddContactDlgAccounts(hdlg, acs)) { // By default check these checkboxes CheckDlgButton(hdlg, IDC_ADDED, BST_CHECKED); CheckDlgButton(hdlg, IDC_AUTH, BST_CHECKED); AddContactDlgOpts(hdlg, acs->proto); EnableWindow(GetDlgItem(hdlg, IDOK), FALSE); } break; case WM_COMMAND: switch (LOWORD(wparam)) { case IDC_USERID: if (HIWORD(wparam) == EN_CHANGE) { TCHAR szUserId[256]; if (GetDlgItemText(hdlg, IDC_USERID, szUserId, SIZEOF(szUserId))) { if (!IsWindowEnabled(GetDlgItem(hdlg, IDOK))) EnableWindow(GetDlgItem(hdlg, IDOK), TRUE); } else if (IsWindowEnabled(GetDlgItem(hdlg, IDOK))) EnableWindow(GetDlgItem(hdlg, IDOK), FALSE); } break; case IDC_PROTO: if (HIWORD(wparam) == CBN_SELCHANGE || HIWORD(wparam) == CBN_SELENDOK) { acs->proto = (char*)SendDlgItemMessage(hdlg, IDC_PROTO, CB_GETITEMDATA, (WPARAM)SendDlgItemMessage(hdlg, IDC_PROTO, CB_GETCURSEL, 0, 0), 0); // TODO remember last setting for each proto? AddContactDlgOpts(hdlg, acs->proto); } break; case IDC_ADDTEMP: AddContactDlgOpts(hdlg, acs->proto, TRUE); break; case IDC_AUTH: { DWORD flags = CallProtoService(acs->proto, PS_GETCAPS, PFLAGNUM_4, 0); if (flags & PF4_NOCUSTOMAUTH) { EnableWindow(GetDlgItem(hdlg, IDC_AUTHREQ), FALSE); EnableWindow(GetDlgItem(hdlg, IDC_AUTHGB), FALSE); } else { EnableWindow(GetDlgItem(hdlg, IDC_AUTHREQ), IsDlgButtonChecked(hdlg, IDC_AUTH)); EnableWindow(GetDlgItem(hdlg, IDC_AUTHGB), IsDlgButtonChecked(hdlg, IDC_AUTH)); } } break; case IDOK: { TCHAR szUserId[256]; GetDlgItemText(hdlg, IDC_USERID, szUserId, SIZEOF(szUserId)); if (*rtrimt(szUserId) == 0 || (strstr(acs->proto, "GG") && _tcstoul(szUserId, NULL, 10) > INT_MAX) || // Gadu-Gadu protocol ((CallProtoService(acs->proto, PS_GETCAPS, PFLAGNUM_1, 0) & PF1_NUMERICUSERID) && !_tcstoul(szUserId, NULL, 10))) { MessageBox(NULL, TranslateT("The contact cannot be added to your contact list. Please make sure the contact ID is entered correctly."), TranslateT("Add contact"), MB_OK | MB_ICONWARNING | MB_SETFOREGROUND | MB_TOPMOST); break; } PROTOSEARCHRESULT *psr; if (strstr(acs->proto, "TLEN")) { // Tlen protocol if (_tcschr(szUserId, '@') == NULL) { MessageBox(NULL, TranslateT("The contact cannot be added to your contact list. Please make sure the contact ID is entered correctly."), TranslateT("Add contact"), MB_OK | MB_ICONWARNING | MB_SETFOREGROUND | MB_TOPMOST); break; } psr = (PROTOSEARCHRESULT*)mir_calloc(sizeof(TLEN_SEARCH_RESULT)); psr->cbSize = sizeof(TLEN_SEARCH_RESULT); mir_snprintf(((TLEN_SEARCH_RESULT*)psr)->jid, SIZEOF(((TLEN_SEARCH_RESULT*)psr)->jid), "%S", szUserId); } else { psr = (PROTOSEARCHRESULT*)mir_calloc(sizeof(PROTOSEARCHRESULT)); psr->cbSize = sizeof(PROTOSEARCHRESULT); } psr->flags = PSR_TCHAR; psr->id = mir_tstrdup(szUserId); acs->psr = psr; HANDLE hContact = (HANDLE)CallProtoService(acs->proto, PS_ADDTOLIST, IsDlgButtonChecked(hdlg, IDC_ADDTEMP) ? PALF_TEMPORARY : 0, (LPARAM)acs->psr); if (hContact == NULL) { MessageBox(NULL, TranslateT("The contact cannot be added to your contact list. If you are not logged into the selected account, please try to do so. Also, make sure the contact ID is entered correctly."), TranslateT("Add contact"), MB_OK | MB_ICONWARNING | MB_SETFOREGROUND | MB_TOPMOST); break; } TCHAR szHandle[256]; if (GetDlgItemText(hdlg, IDC_MYHANDLE, szHandle, SIZEOF(szHandle))) db_set_ts(hContact, "CList", "MyHandle", szHandle); int item = SendDlgItemMessage(hdlg, IDC_GROUP, CB_GETCURSEL, 0, 0); if (item > 0) { item = SendDlgItemMessage(hdlg, IDC_GROUP, CB_GETITEMDATA, item, 0); CallService(MS_CLIST_CONTACTCHANGEGROUP, (WPARAM)hContact, item); } if (!IsDlgButtonChecked(hdlg, IDC_ADDTEMP)) { db_unset(hContact, "CList", "NotOnList"); if (IsDlgButtonChecked(hdlg, IDC_ADDED)) CallContactService(hContact, PSS_ADDED, 0, 0); if (IsDlgButtonChecked(hdlg, IDC_AUTH)) { DWORD flags = CallProtoService(acs->proto, PS_GETCAPS, PFLAGNUM_4, 0); if (flags & PF4_NOCUSTOMAUTH) CallContactService(hContact, PSS_AUTHREQUESTT, 0, 0); else { TCHAR szReason[512]; GetDlgItemText(hdlg, IDC_AUTHREQ, szReason, SIZEOF(szReason)); CallContactService(hContact, PSS_AUTHREQUESTT, 0, (LPARAM)szReason); } } } if (GetAsyncKeyState(VK_CONTROL)) CallService(MS_MSG_SENDMESSAGE, (WPARAM)hContact, (LPARAM)(const char*)NULL); } // fall through case IDCANCEL: if (GetParent(hdlg) == NULL) DestroyWindow(hdlg); else EndDialog(hdlg, 0); } break; case WM_CLOSE: /* if there is no parent for the dialog, its a modeless dialog and can't be killed using EndDialog() */ if (GetParent(hdlg) == NULL) DestroyWindow(hdlg); else EndDialog(hdlg, 0); break; case DM_ADDCONTACT_CHANGEICONS: Skin_ReleaseIcon((HICON)SendMessage(hdlg, WM_SETICON, ICON_BIG, (LPARAM)Skin_GetIcon(ICON_ADD, 1))); Skin_ReleaseIcon((HICON)SendMessage(hdlg, WM_SETICON, ICON_SMALL, (LPARAM)Skin_GetIcon(ICON_ADD))); break; case DM_ADDCONTACT_CHANGEACCLIST: AddContactDlgAccounts(hdlg, acs); break; case WM_DESTROY: hAddDlg = NULL; Skin_ReleaseIcon((HICON)SendMessage(hdlg, WM_SETICON, ICON_BIG, 0)); Skin_ReleaseIcon((HICON)SendMessage(hdlg, WM_SETICON, ICON_SMALL, 0)); ImageList_Destroy((HIMAGELIST)SendDlgItemMessage(hdlg, IDC_PROTO, CBEM_GETIMAGELIST, 0, 0)); if (acs) { db_set_s(NULL, "AddContact", "LastProto", acs->proto); if (acs->psr) { mir_free(acs->psr->nick); mir_free(acs->psr->firstName); mir_free(acs->psr->lastName); mir_free(acs->psr->email); mir_free(acs->psr); } delete acs; } Utils_SaveWindowPosition(hdlg, NULL, "AddContact", ""); break; } return FALSE; }
int CIconList::CreateTabIconInt(LPCWSTR asIconDescr, bool bAdmin, LPCWSTR asWorkDir) { wchar_t* pszExpanded = ExpandEnvStr(asIconDescr); // Need to be created! int iIconIdx = -1; HICON hFileIcon = NULL; CEStr szLoadFile; LPCWSTR lpszExt = NULL; int nIndex = 0; bool bDirChanged = false; if (!szLoadFile.Set(pszExpanded ? pszExpanded : asIconDescr)) { goto wrap; } lpszExt = ParseIconFileIndex(szLoadFile, nIndex); if (asWorkDir && *asWorkDir) { // Executable (or icon) file may be not availbale by %PATH%, let "cd" to it... bDirChanged = gpConEmu->ChangeWorkDir(asWorkDir); } if (!lpszExt) { if (apiSearchPath(NULL, szLoadFile, L".exe", szLoadFile)) { lpszExt = PointToExt(szLoadFile); } if (!lpszExt) goto wrap; } if (lstrcmpi(lpszExt, L".ico") == 0) { hFileIcon = (HICON)LoadImage(0, szLoadFile, IMAGE_ICON, mn_CxIcon, mn_CyIcon, LR_DEFAULTCOLOR|LR_LOADFROMFILE); } else if ((lstrcmpi(lpszExt, L".exe") == 0) || (lstrcmpi(lpszExt, L".dll") == 0)) { HICON hIconLarge = NULL, hIconSmall = NULL; ExtractIconEx(szLoadFile, nIndex, &hIconLarge, &hIconSmall, 1); bool bUseLargeIcon = ((mn_CxIcon > 16) && (hIconLarge != NULL)) || (hIconSmall == NULL); HICON hDestroyIcon = bUseLargeIcon ? hIconSmall : hIconLarge; if (hDestroyIcon) DestroyIcon(hDestroyIcon); hFileIcon = bUseLargeIcon ? hIconLarge : hIconSmall; } else { //TODO: Shell icons for registered files (cmd, bat, sh, pl, py, ...) } if (hFileIcon) { wchar_t szIconInfo[80] = L"", szMergedInfo[80] = L""; GetIconInfoStr(hFileIcon, szIconInfo); if (gpSetCls->isAdvLogging) { CEStr lsLog(lstrmerge(L"Icon `", asIconDescr, L"` was loaded: ", szIconInfo)); gpConEmu->LogString(lsLog); } int iIconIdxAdm = -1; iIconIdx = ImageList_ReplaceIcon(mh_TabIcons, -1, hFileIcon); TabIconCache NewIcon = {lstrdup(asIconDescr), iIconIdx, false}; m_Icons.push_back(NewIcon); if (mn_AdminIcon >= 0) { HIMAGELIST hAdmList = ImageList_Merge(mh_TabIcons, iIconIdx, mh_TabIcons, mn_AdminIcon+2, 0,0); if (hAdmList) { HICON hNewIcon = ImageList_GetIcon(hAdmList, 0, ILD_TRANSPARENT); if (hNewIcon) { CEStr lsLog(lstrmerge(L"Admin icon `", asIconDescr, L"` was created: ", GetIconInfoStr(hNewIcon, szMergedInfo))); gpConEmu->LogString(lsLog); iIconIdxAdm = ImageList_ReplaceIcon(mh_TabIcons, -1, hNewIcon); DestroyIcon(hNewIcon); TabIconCache AdmIcon = {lstrdup(asIconDescr), iIconIdxAdm, true}; m_Icons.push_back(AdmIcon); if (bAdmin && (iIconIdxAdm > 0)) { iIconIdx = iIconIdxAdm; } } else { gpConEmu->LogString(L"GetIcon for admin icon was failed"); } ImageList_Destroy(hAdmList); } else { gpConEmu->LogString(L"Admin icon merging was failed"); } } DestroyIcon(hFileIcon); } wrap: if (bDirChanged) { gpConEmu->ChangeWorkDir(NULL); } SafeFree(pszExpanded); if (gpSetCls->isAdvLogging && (iIconIdx < 0)) { CEStr lsLog(lstrmerge(L"Icon `", asIconDescr, L"` loading was failed")); gpConEmu->LogString(lsLog); } return iIconIdx; }
static LRESULT CALLBACK tableWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { struct table *t; HDC dc; PAINTSTRUCT ps; NMHDR *nmhdr = (NMHDR *) lParam; NMHEADERW *nm = (NMHEADERW *) lParam; t = (struct table *) GetWindowLongPtrW(hwnd, GWLP_USERDATA); if (t == NULL) { // we have to do things this way because creating the header control will fail mysteriously if we create it first thing // (which is fine; we can get the parent hInstance this way too) if (uMsg == WM_NCCREATE) { CREATESTRUCTW *cs = (CREATESTRUCTW *) lParam; t = (struct table *) malloc(sizeof (struct table)); if (t == NULL) abort(); ZeroMemory(t, sizeof (struct table)); t->hwnd = hwnd; // TODO this should be a global t->defaultFont = (HFONT) GetStockObject(SYSTEM_FONT); if (t->defaultFont == NULL) abort(); t->font = t->defaultFont; t->selected = 5;t->count=100;//TODO t->header = CreateWindowExW(0, WC_HEADERW, L"", // TODO is HOTTRACK needed? WS_CHILD | HDS_FULLDRAG | HDS_HORZ | HDS_HOTTRACK, 0, 0, 0, 0, t->hwnd, (HMENU) 100, cs->hInstance, NULL); if (t->header == NULL) abort(); {t->imagelist = ImageList_Create(GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), ILC_COLOR32, 1, 1); if(t->imagelist==NULL)abort(); { HICON icon; int unused; icon = LoadIconW(NULL, IDI_ERROR); if(icon == NULL)abort(); if (ImageList_AddIcon(t->imagelist, icon) == -1)abort(); if (ImageList_GetIconSize(t->imagelist, &unused, &(t->imagelistHeight)) == 0)abort(); } } t->checkboxes = makeCheckboxImageList(t->hwnd, &(t->theme), &(t->checkboxWidth), &(t->checkboxHeight)); t->focusedColumn = -1; SetWindowLongPtrW(hwnd, GWLP_USERDATA, (LONG_PTR) t); } // even if we did the above, fall through return DefWindowProcW(hwnd, uMsg, wParam, lParam); } switch (uMsg) { case WM_PAINT: dc = BeginPaint(hwnd, &ps); if (dc == NULL) abort(); drawItems(t, dc, ps.rcPaint); EndPaint(hwnd, &ps); return 0; case WM_SETFONT: t->font = (HFONT) wParam; if (t->font == NULL) t->font = t->defaultFont; // also set the header font SendMessageW(t->header, WM_SETFONT, wParam, lParam); if (LOWORD(lParam) != FALSE) { // the scrollbar page size will change so redraw that too // also recalculate the header height // TODO do that when this is FALSE too somehow resize(t); redrawAll(t); } return 0; case WM_GETFONT: return (LRESULT) t->font; case WM_VSCROLL: vscroll(t, wParam); return 0; case WM_MOUSEWHEEL: wheelscroll(t, wParam); return 0; case WM_HSCROLL: hscroll(t, wParam); return 0; case WM_SIZE: resize(t); return 0; case WM_LBUTTONDOWN: selectItem(t, wParam, lParam); return 0; case WM_SETFOCUS: case WM_KILLFOCUS: // all we need to do here is redraw the highlight // TODO ensure giving focus works right redrawRow(t, t->selected); return 0; case WM_KEYDOWN: keySelect(t, wParam, lParam); return 0; // TODO header double-click case WM_NOTIFY: if (nmhdr->hwndFrom == t->header) switch (nmhdr->code) { // I could use HDN_TRACK but wine doesn't emit that case HDN_ITEMCHANGING: case HDN_ITEMCHANGED: // TODO needed? recomputeHScroll(t); redrawAll(t); return FALSE; } return DefWindowProcW(hwnd, uMsg, wParam, lParam); // TODO others? case WM_WININICHANGE: case WM_SYSCOLORCHANGE: case WM_THEMECHANGED: if (ImageList_Destroy(t->checkboxes) == 0) abort(); t->checkboxes = makeCheckboxImageList(t->hwnd, &(t->theme), &(t->checkboxWidth), &(t->checkboxHeight)); resize(t); // TODO needed? redrawAll(t); // now defer back to DefWindowProc() in case other things are needed // TODO needed? return DefWindowProcW(hwnd, uMsg, wParam, lParam); case tableAddColumn: addColumn(t, wParam, lParam); return 0; case WM_GETOBJECT: // accessibility /* if (((DWORD) lParam) == OBJID_CLIENT) { TODO *server; LRESULT lResult; // TODO create the server object lResult = LresultFromObject(IID_IAccessible, wParam, server); if (/* TODO failure *|/) abort(); // TODO release object return lResult; } */ return DefWindowProcW(hwnd, uMsg, wParam, lParam); default: return DefWindowProcW(hwnd, uMsg, wParam, lParam); } abort(); return 0; // unreached }
BOOL CALLBACK TabCtrlProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { struct TabCtrlData *dat; dat = (struct TabCtrlData *) GetWindowLong(hwnd, GWL_USERDATA); switch(msg) { case WM_MBUTTONDOWN: { TCITEM tci; int tabId; struct MessageWindowData *mwd; TCHITTESTINFO thinfo; thinfo.pt.x = (lParam<<16)>>16; thinfo.pt.y = lParam>>16; tabId = TabCtrl_HitTest(hwnd, &thinfo); if (tabId >= 0) { tci.mask = TCIF_PARAM; TabCtrl_GetItem(hwnd, tabId, &tci); mwd = (struct MessageWindowData *) tci.lParam; if (mwd != NULL) { SendMessage(mwd->hwnd, WM_CLOSE, 0, 0); } } return TRUE; } case WM_LBUTTONDBLCLK: { TCHITTESTINFO thinfo; int tabId; thinfo.pt.x = (lParam<<16)>>16; thinfo.pt.y = lParam>>16; tabId = TabCtrl_HitTest(hwnd, &thinfo); if (tabId >=0 ) { void * clickChild = GetChildFromTab(hwnd, tabId)->hwnd; if (clickChild == dat->lastClickChild) { SendMessage(clickChild, WM_CLOSE, 0, 0); } } dat->lastClickChild = NULL; } break; case WM_LBUTTONDOWN: { if (!dat->bDragging) { TCHITTESTINFO thinfo; thinfo.pt.x = (lParam<<16)>>16; thinfo.pt.y = lParam>>16; dat->srcTab = dat->destTab = TabCtrl_HitTest(hwnd, &thinfo); if (dat->srcTab >=0 ) { dat->lastClickChild = GetChildFromTab(hwnd, dat->srcTab)->hwnd; } else { dat->lastClickChild = NULL; } dat->bDragging = TRUE; dat->bDragged = FALSE; dat->mouseLBDownPos.x = thinfo.pt.x; dat->mouseLBDownPos.y = thinfo.pt.y; SetCapture(hwnd); return 0; } } break; case WM_CAPTURECHANGED: case WM_LBUTTONUP: if (dat->bDragging) { TCHITTESTINFO thinfo; thinfo.pt.x = (lParam<<16)>>16; thinfo.pt.y = lParam>>16; if (dat->bDragged) { ImageList_DragLeave(GetDesktopWindow()); ImageList_EndDrag(); ImageList_Destroy(dat->hDragImageList); SetCursor(LoadCursor(NULL, IDC_ARROW)); dat->destTab = TabCtrl_HitTest(hwnd, &thinfo); if (thinfo.flags != TCHT_NOWHERE && dat->destTab != dat->srcTab) { NMHDR nmh; TCHAR sBuffer[501]; TCITEM item; int curSel; curSel = TabCtrl_GetCurSel(hwnd); item.mask = TCIF_IMAGE | TCIF_PARAM | TCIF_TEXT; item.pszText = sBuffer; item.cchTextMax = sizeof(sBuffer)/sizeof(TCHAR); TabCtrl_GetItem(hwnd, dat->srcTab, &item); sBuffer[sizeof(sBuffer)/sizeof(TCHAR)-1] = '\0'; if (curSel == dat->srcTab) { curSel = dat->destTab; } else { if (curSel > dat->srcTab && curSel <= dat->destTab) { curSel--; } else if (curSel < dat->srcTab && curSel >= dat->destTab) { curSel++; } } TabCtrl_DeleteItem(hwnd, dat->srcTab); TabCtrl_InsertItem(hwnd, dat->destTab, &item ); TabCtrl_SetCurSel(hwnd, curSel); nmh.hwndFrom = hwnd; nmh.idFrom = GetDlgCtrlID(hwnd); nmh.code = TCN_SELCHANGE; SendMessage(GetParent(hwnd), WM_NOTIFY, nmh.idFrom, (LPARAM)&nmh); UpdateWindow(hwnd); } } else { SendMessage(hwnd, WM_LBUTTONDOWN, wParam, lParam); } dat->bDragged = FALSE; dat->bDragging = FALSE; ReleaseCapture(); }