From e3cefc7b6ca803e3f87dbadae54a110332778490 Mon Sep 17 00:00:00 2001 From: George Hazan Date: Thu, 5 Jul 2012 22:41:06 +0000 Subject: - first of the /Core standard plugins; - code cleaning git-svn-id: http://svn.miranda-ng.org/main/trunk@778 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- src/core/stduserinfo/contactinfo.cpp | 528 +++++++++++++++++++++++++++++++++++ 1 file changed, 528 insertions(+) create mode 100644 src/core/stduserinfo/contactinfo.cpp (limited to 'src/core/stduserinfo/contactinfo.cpp') diff --git a/src/core/stduserinfo/contactinfo.cpp b/src/core/stduserinfo/contactinfo.cpp new file mode 100644 index 0000000000..031a9e40ab --- /dev/null +++ b/src/core/stduserinfo/contactinfo.cpp @@ -0,0 +1,528 @@ +/* + +Miranda IM: the free IM client for Microsoft* Windows* + +Copyright 2000-2009 Miranda ICQ/IM project, +all portions of this codebase are copyrighted to the people +listed in contributors.txt. + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +#include "commonheaders.h" + +static HFONT hEmailFont = NULL; +static HCURSOR hHandCursor = NULL; + +static INT_PTR CALLBACK EditUserEmailDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch(msg) { + case WM_INITDIALOG: + SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)lParam); + if (*(char*)lParam) SetWindowText(hwndDlg, TranslateT("Edit E-Mail Address")); + TranslateDialogDefault(hwndDlg); + SetDlgItemTextA(hwndDlg, IDC_EMAIL, (char*)lParam); + EnableWindow(GetDlgItem(hwndDlg, IDOK), *(char*)lParam); + return TRUE; + + case WM_COMMAND: + switch(LOWORD(wParam)) { + case IDOK: + GetDlgItemTextA(hwndDlg, IDC_EMAIL, (char*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA), 256); + //fall through + case IDCANCEL: + EndDialog(hwndDlg, wParam); + case IDC_EMAIL: + if (HIWORD(wParam) == EN_CHANGE) + EnableWindow(GetDlgItem(hwndDlg, IDOK), GetWindowTextLength(GetDlgItem(hwndDlg, IDC_EMAIL))); + break; + } + break; + } + return FALSE; +} + +static INT_PTR CALLBACK EditUserPhoneDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) +{ + static int noRecursion = 0; + + switch(msg) { + case WM_INITDIALOG: + { + char *szText = (char*)lParam; + int i, item, countryCount; + struct CountryListEntry *countries; + SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)lParam); + if (szText[0]) SetWindowText(hwndDlg, TranslateT("Edit Phone Number")); + TranslateDialogDefault(hwndDlg); + if (lstrlenA(szText)>4 && !lstrcmpA(szText+lstrlenA(szText)-4, " SMS")) { + CheckDlgButton(hwndDlg, IDC_SMS, BST_CHECKED); + szText[lstrlenA(szText)-4] = '\0'; + } + EnableWindow(GetDlgItem(hwndDlg, IDOK), szText[0]); + SendDlgItemMessage(hwndDlg, IDC_AREA, EM_LIMITTEXT, 31, 0); + SendDlgItemMessage(hwndDlg, IDC_NUMBER, EM_LIMITTEXT, 63, 0); + CallService(MS_UTILS_GETCOUNTRYLIST, (WPARAM)&countryCount, (LPARAM)&countries); + for (i=0;i 4) + isValid = 0; + else { + for (i = SendDlgItemMessage(hwndDlg, IDC_COUNTRY, CB_GETCOUNT, 0, 0)-1; i >= 0; i--) + if (country == SendDlgItemMessage(hwndDlg, IDC_COUNTRY, CB_GETITEMDATA, i, 0)) { + SendDlgItemMessage(hwndDlg, IDC_COUNTRY, CB_SETCURSEL, i, 0); + break; + } + if (i < 0) + isValid = 0; + } + } + if (isValid) { + pArea = pText+strcspn(pText, "0123456789"); + pText = pArea+strspn(pArea, "0123456789"); + if (*pText) { + *pText = '\0'; + pNumber = pText+1+strcspn(pText+1, "0123456789"); + SetDlgItemTextA(hwndDlg, IDC_NUMBER, pNumber); + } + SetDlgItemTextA(hwndDlg, IDC_AREA, pArea); + } + if ( !isValid) { + SendDlgItemMessage(hwndDlg, IDC_COUNTRY, CB_SETCURSEL, -1, 0); + SetDlgItemTextA(hwndDlg, IDC_AREA, ""); + SetDlgItemTextA(hwndDlg, IDC_NUMBER, ""); + } + } + noRecursion = 0; + EnableWindow(GetDlgItem(hwndDlg, IDOK), GetWindowTextLength(GetDlgItem(hwndDlg, IDC_PHONE))); + break; + } + break; + } + return FALSE; +} + +static int IsOverEmail(HWND hwndDlg, TCHAR* szEmail, int cchEmail) +{ + RECT rc; + HWND hwndEmails; + TCHAR szText[256]; + HDC hdc; + SIZE textSize; + LVHITTESTINFO hti; + + hwndEmails = GetDlgItem(hwndDlg, IDC_EMAILS); + GetCursorPos(&hti.pt); + ScreenToClient(hwndEmails, &hti.pt); + GetClientRect(hwndEmails, &rc); + if ( !PtInRect(&rc, hti.pt)) return 0; + if (ListView_SubItemHitTest(hwndEmails, &hti) == -1) return 0; + if (hti.iSubItem != 1) return 0; + if ( !(hti.flags&LVHT_ONITEMLABEL)) return 0; + ListView_GetSubItemRect(hwndEmails, hti.iItem, 1, LVIR_LABEL, &rc); + szText[0] = 0; + ListView_GetItemText(hwndEmails, hti.iItem, 1, szText, SIZEOF(szText)); + hdc = GetDC(hwndEmails); + SelectObject(hdc, hEmailFont); + GetTextExtentPoint32(hdc, szText, lstrlen(szText), &textSize); + ReleaseDC(hwndEmails, hdc); + if (hti.pt.x4 && !lstrcmpA(dbv.pszVal+lstrlenA(dbv.pszVal)-4, " SMS")) { + ListView_SetItemText(GetDlgItem(hwndDlg, IDC_PHONES), lvi.iItem, 2, _T("y")); + dbv.ptszVal[lstrlen(dbv.ptszVal)-4] = '\0'; + } + ListView_SetItemText(GetDlgItem(hwndDlg, IDC_PHONES), lvi.iItem, 1, dbv.ptszVal); + DBFreeVariant(&dbv); + lvi.iItem++; + } + if ( !DBGetContactSettingTString(hContact, szProto, "CompanyPhone", &dbv)) { + lvi.pszText = TranslateT("Work Phone"); + ListView_InsertItem(GetDlgItem(hwndDlg, IDC_PHONES), &lvi); + ListView_SetItemText(GetDlgItem(hwndDlg, IDC_PHONES), lvi.iItem, 1, dbv.ptszVal); + DBFreeVariant(&dbv); + lvi.iItem++; + } + if ( !DBGetContactSettingTString(hContact, szProto, "CompanyFax", &dbv)) { + lvi.pszText = TranslateT("Work Fax"); + ListView_InsertItem(GetDlgItem(hwndDlg, IDC_PHONES), &lvi); + ListView_SetItemText(GetDlgItem(hwndDlg, IDC_PHONES), lvi.iItem, 1, dbv.ptszVal); + DBFreeVariant(&dbv); + lvi.iItem++; + } + lvi.iSubItem = 0; + for (i=0;; i++) { + lvi.lParam = i; + mir_snprintf(idstr, SIZEOF(idstr), "MyPhone%d", i); + if (DBGetContactSettingTString(hContact, "UserInfo", idstr, &dbv)) + break; + lvi.pszText = idstr2; + mir_sntprintf(idstr2, SIZEOF(idstr2), TranslateT("Custom %d"), i+1); + ListView_InsertItem(GetDlgItem(hwndDlg, IDC_PHONES), &lvi); + if (lstrlen(dbv.ptszVal)>4 && !lstrcmp(dbv.ptszVal+lstrlen(dbv.ptszVal)-4, _T(" SMS"))) { + ListView_SetItemText(GetDlgItem(hwndDlg, IDC_PHONES), lvi.iItem, 2, _T("y")); + dbv.ptszVal[lstrlen(dbv.ptszVal)-4] = '\0'; + } + ListView_SetItemText(GetDlgItem(hwndDlg, IDC_PHONES), lvi.iItem, 1, dbv.ptszVal); + DBFreeVariant(&dbv); + lvi.iItem++; + } + lvi.mask = LVIF_PARAM; + lvi.lParam = (LPARAM)(-2); + ListView_InsertItem(GetDlgItem(hwndDlg, IDC_PHONES), &lvi); + } + } + break; + + case WM_NOTIFY: + switch (((LPNMHDR)lParam)->idFrom) { + case 0: + if (((LPNMHDR)lParam)->code == PSN_INFOCHANGED) + SendMessage(hwndDlg, M_REMAKELISTS, 0, 0); + break; + + case IDC_EMAILS: + case IDC_PHONES: + switch (((LPNMHDR)lParam)->code) { + case NM_CUSTOMDRAW: + { + NMLVCUSTOMDRAW *nm = (NMLVCUSTOMDRAW*)lParam; + switch(nm->nmcd.dwDrawStage) { + case CDDS_PREPAINT: + case CDDS_ITEMPREPAINT: + SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, CDRF_NOTIFYSUBITEMDRAW); + return TRUE; + case CDDS_SUBITEM|CDDS_ITEMPREPAINT: + { + RECT rc; + ListView_GetSubItemRect(nm->nmcd.hdr.hwndFrom, nm->nmcd.dwItemSpec, nm->iSubItem, LVIR_LABEL, &rc); + if (nm->iSubItem == 1 && nm->nmcd.hdr.idFrom == IDC_EMAILS) { + HFONT hoFont; + TCHAR szText[256] = {0}; + ListView_GetItemText(nm->nmcd.hdr.hwndFrom, nm->nmcd.dwItemSpec, nm->iSubItem, szText, SIZEOF(szText)); + hoFont = (HFONT)SelectObject(nm->nmcd.hdc, hEmailFont); + SetTextColor(nm->nmcd.hdc, RGB(0, 0, 255)); + DrawText(nm->nmcd.hdc, szText, -1, &rc, DT_END_ELLIPSIS|DT_LEFT|DT_NOPREFIX|DT_SINGLELINE|DT_TOP); + SelectObject(nm->nmcd.hdc, hoFont); + SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, CDRF_SKIPDEFAULT); + return TRUE; + } + + HICON hIcon = NULL; + if (nm->nmcd.lItemlParam == (LPARAM)(-2) && nm->iSubItem-3 == (nm->nmcd.hdr.idFrom == IDC_PHONES)) + hIcon = LoadSkinIcon(SKINICON_OTHER_ADDCONTACT); + else if (nm->iSubItem>1 && nm->nmcd.lItemlParam != (LPARAM)(-1) && nm->nmcd.lItemlParam != (LPARAM)(-2)) { + static int iconResources[3] = {SKINICON_OTHER_RENAME, SKINICON_OTHER_DELETE}; + if (nm->iSubItem == 2 && nm->nmcd.hdr.idFrom == IDC_PHONES) { + TCHAR szText[2]; + ListView_GetItemText(nm->nmcd.hdr.hwndFrom, nm->nmcd.dwItemSpec, nm->iSubItem, szText, SIZEOF(szText)); + if (szText[0]) hIcon = LoadSkinIcon(SKINICON_OTHER_SMS); + } + else hIcon = LoadSkinIcon(iconResources[nm->iSubItem-3+(nm->nmcd.hdr.idFrom == IDC_EMAILS)]); + } + else break; + DrawIconEx(nm->nmcd.hdc, (rc.left+rc.right-GetSystemMetrics(SM_CXSMICON))/2, (rc.top+rc.bottom-GetSystemMetrics(SM_CYSMICON))/2, hIcon, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), 0, NULL, DI_NORMAL); + IcoLib_ReleaseIcon(hIcon, 0); + SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, CDRF_SKIPDEFAULT); + return TRUE; + } + } + } + break; + + case NM_CLICK: + { + NMLISTVIEW *nm = (NMLISTVIEW*)lParam; + LVITEM lvi; + TCHAR szEmail[256]; + HANDLE hContact = (HANDLE)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); + char *szIdTemplate = nm->hdr.idFrom == IDC_PHONES?"MyPhone%d":"Mye-mail%d"; + LVHITTESTINFO hti; + + if (IsOverEmail(hwndDlg, szEmail, SIZEOF(szEmail))) { + TCHAR szExec[264]; + mir_sntprintf(szExec, SIZEOF(szExec), _T("mailto:%s"), szEmail); + ShellExecute(hwndDlg, _T("open"), szExec, NULL, NULL, SW_SHOW); + break; + } + if (nm->iSubItem<2) break; + hti.pt.x = (short)LOWORD(GetMessagePos()); + hti.pt.y = (short)HIWORD(GetMessagePos()); + ScreenToClient(nm->hdr.hwndFrom, &hti.pt); + if (ListView_SubItemHitTest(nm->hdr.hwndFrom, &hti) == -1) break; + lvi.mask = LVIF_PARAM; + lvi.iItem = hti.iItem; + lvi.iSubItem = 0; + ListView_GetItem(nm->hdr.hwndFrom, &lvi); + if (lvi.lParam == (LPARAM)(-1)) break; + if (lvi.lParam == (LPARAM)(-2)) { + if (hti.iSubItem-3 == (nm->hdr.idFrom == IDC_PHONES)) { + //add + char szNewData[256] = "", idstr[33]; + DBVARIANT dbv; + if (IDOK != DialogBoxParam(hInst, MAKEINTRESOURCE(nm->hdr.idFrom == IDC_PHONES?IDD_ADDPHONE:IDD_ADDEMAIL), hwndDlg, nm->hdr.idFrom == IDC_PHONES?EditUserPhoneDlgProc:EditUserEmailDlgProc, (LPARAM)szNewData)) + break; + for (int i=0;; i++) { + mir_snprintf(idstr, SIZEOF(idstr), szIdTemplate, i); + if (DBGetContactSettingString(hContact, "UserInfo", idstr, &dbv)) break; + DBFreeVariant(&dbv); + } + DBWriteContactSettingString(hContact, "UserInfo", idstr, szNewData); + SendMessage(hwndDlg, M_REMAKELISTS, 0, 0); + } + } + else { + if (hti.iSubItem-3 == (nm->hdr.idFrom == IDC_PHONES)) { + //delete + int i; + char idstr[33]; + DBVARIANT dbv; + for (i = lvi.lParam;;i++) { + mir_snprintf(idstr, SIZEOF(idstr), szIdTemplate, i+1); + if (DBGetContactSettingString(hContact, "UserInfo", idstr, &dbv)) break; + mir_snprintf(idstr, SIZEOF(idstr), szIdTemplate, i); + DBWriteContactSettingString(hContact, "UserInfo", idstr, dbv.pszVal); + DBFreeVariant(&dbv); + } + mir_snprintf(idstr, SIZEOF(idstr), szIdTemplate, i); + DBDeleteContactSetting(hContact, "UserInfo", idstr); + SendMessage(hwndDlg, M_REMAKELISTS, 0, 0); + } + else if (hti.iSubItem-2 == (nm->hdr.idFrom == IDC_PHONES)) { + //edit + char szText[256], idstr[33]; + DBVARIANT dbv; + mir_snprintf(idstr, SIZEOF(idstr), szIdTemplate, lvi.lParam); + if (DBGetContactSettingString(hContact, "UserInfo", idstr, &dbv)) break; + lstrcpynA(szText, dbv.pszVal, SIZEOF(szText)); + DBFreeVariant(&dbv); + if (IDOK != DialogBoxParam(hInst, MAKEINTRESOURCE(nm->hdr.idFrom == IDC_PHONES?IDD_ADDPHONE:IDD_ADDEMAIL), hwndDlg, nm->hdr.idFrom == IDC_PHONES?EditUserPhoneDlgProc:EditUserEmailDlgProc, (LPARAM)szText)) + break; + DBWriteContactSettingString(hContact, "UserInfo", idstr, szText); + SendMessage(hwndDlg, M_REMAKELISTS, 0, 0); + } + } + break; + } + } + break; + } + break; + + case WM_SETCURSOR: + if (LOWORD(lParam) != HTCLIENT) break; + if (GetForegroundWindow() == GetParent(hwndDlg)) { + POINT pt; + GetCursorPos(&pt); + ScreenToClient(hwndDlg, &pt); + } + if (IsOverEmail(hwndDlg, NULL, 0)) { + SetCursor(hHandCursor); + SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, TRUE); + return TRUE; + } + break; + + case WM_COMMAND: + switch(LOWORD(wParam)) { + case IDCANCEL: + SendMessage(GetParent(hwndDlg), msg, wParam, lParam); + break; + } + break; + } + return FALSE; +} -- cgit v1.2.3