/* Miranda IM: the free IM client for Microsoft* Windows* Copyright 2000-2006 Miranda ICQ/IM project, all portions of this codebase are copyrighted to the people listed in contributors.txt. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "commonheaders.h" static HFONT hEmailFont=NULL; static HCURSOR hHandCursor=NULL; static BOOL CALLBACK EditUserEmailDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { case WM_INITDIALOG: SetWindowLong(hwndDlg,GWL_USERDATA,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*)GetWindowLong(hwndDlg,GWL_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 BOOL CALLBACK EditUserPhoneDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { case WM_INITDIALOG: { char *szText=(char*)lParam; int i,item,countryCount; struct CountryListEntry *countries; SetWindowLong(hwndDlg,GWL_USERDATA,lParam); if(szText[0]) SetWindowTextA(hwndDlg,"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;i4) 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); 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; wsprintfA(idstr,"MyPhone%d",i); if(DBGetContactSettingTString(hContact,"UserInfo",idstr,&dbv)) break; lvi.pszText=idstr2; wsprintf(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: switch (((LPNMHDR)lParam)->code) { case PSN_INFOCHANGED: SendMessage(hwndDlg,M_REMAKELISTS,0,0); break; } 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: SetWindowLong(hwndDlg,DWL_MSGRESULT,CDRF_NOTIFYSUBITEMDRAW); return TRUE; case CDDS_SUBITEM|CDDS_ITEMPREPAINT: { RECT rc; HICON hIcon; 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]; 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); SetWindowLong(hwndDlg,DWL_MSGRESULT,CDRF_SKIPDEFAULT); return TRUE; } if(nm->nmcd.lItemlParam==(LPARAM)(-2) && nm->iSubItem-3==(nm->nmcd.hdr.idFrom==IDC_PHONES)) hIcon=LoadImage(GetModuleHandle(NULL),MAKEINTRESOURCE(IDI_ADDCONTACT),IMAGE_ICON,GetSystemMetrics(SM_CXSMICON),GetSystemMetrics(SM_CYSMICON),0); else if(nm->iSubItem>1 && nm->nmcd.lItemlParam!=(LPARAM)(-1) && nm->nmcd.lItemlParam!=(LPARAM)(-2)) { static int iconResources[3]={IDI_RENAME,IDI_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=LoadImage(GetModuleHandle(NULL),MAKEINTRESOURCE(IDI_SMS),IMAGE_ICON,GetSystemMetrics(SM_CXSMICON),GetSystemMetrics(SM_CYSMICON),0); } else hIcon=LoadImage(GetModuleHandle(NULL),MAKEINTRESOURCE(iconResources[nm->iSubItem-3+(nm->nmcd.hdr.idFrom==IDC_EMAILS)]),IMAGE_ICON,GetSystemMetrics(SM_CXSMICON),GetSystemMetrics(SM_CYSMICON),0); } 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); DestroyIcon(hIcon); SetWindowLong(hwndDlg,DWL_MSGRESULT,CDRF_SKIPDEFAULT); return TRUE; } } break; } case NM_CLICK: { NMLISTVIEW *nm=(NMLISTVIEW*)lParam; LVITEM lvi; TCHAR szEmail[256]; HANDLE hContact=(HANDLE)GetWindowLong(hwndDlg,GWL_USERDATA); char *szIdTemplate=nm->hdr.idFrom==IDC_PHONES?"MyPhone%d":"Mye-mail%d"; LVHITTESTINFO hti; if(IsOverEmail(hwndDlg,szEmail,SIZEOF(szEmail))) { TCHAR szExec[264]; lstrcpy(szExec, _T("mailto:")); lstrcat(szExec,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]; int i; DBVARIANT dbv; if(IDOK!=DialogBoxParam(GetModuleHandle(NULL),MAKEINTRESOURCE(nm->hdr.idFrom==IDC_PHONES?IDD_ADDPHONE:IDD_ADDEMAIL),hwndDlg,nm->hdr.idFrom==IDC_PHONES?EditUserPhoneDlgProc:EditUserEmailDlgProc,(LPARAM)szNewData)) break; for(i=0;;i++) { wsprintfA(idstr,szIdTemplate,i); if(DBGetContactSetting(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++) { wsprintfA(idstr,szIdTemplate,i+1); if(DBGetContactSetting(hContact,"UserInfo",idstr,&dbv)) break; wsprintfA(idstr,szIdTemplate,i); DBWriteContactSettingString(hContact,"UserInfo",idstr,dbv.pszVal); DBFreeVariant(&dbv); } wsprintfA(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; wsprintfA(idstr,szIdTemplate,lvi.lParam); if(DBGetContactSetting(hContact,"UserInfo",idstr,&dbv)) break; lstrcpynA(szText,dbv.pszVal,SIZEOF(szText)); DBFreeVariant(&dbv); if(IDOK!=DialogBoxParam(GetModuleHandle(NULL),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); SetFocus(ChildWindowFromPoint(hwndDlg,pt)); //ugly hack because listviews ignore their first click } if(IsOverEmail(hwndDlg,NULL,0)) { SetCursor(hHandCursor); SetWindowLong(hwndDlg,DWL_MSGRESULT,TRUE); return TRUE; } break; case WM_COMMAND: switch(LOWORD(wParam)) { case IDCANCEL: SendMessage(GetParent(hwndDlg),msg,wParam,lParam); break; } break; } return FALSE; }