From 48540940b6c28bb4378abfeb500ec45a625b37b6 Mon Sep 17 00:00:00 2001 From: Vadim Dashevskiy Date: Tue, 15 May 2012 10:38:20 +0000 Subject: initial commit git-svn-id: http://svn.miranda-ng.org/main/trunk@2 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- src/modules/userinfo/contactinfo.cpp | 515 ++++++++++++++++++++++++++++ src/modules/userinfo/stdinfo.cpp | 613 +++++++++++++++++++++++++++++++++ src/modules/userinfo/userinfo.cpp | 636 +++++++++++++++++++++++++++++++++++ 3 files changed, 1764 insertions(+) create mode 100644 src/modules/userinfo/contactinfo.cpp create mode 100644 src/modules/userinfo/stdinfo.cpp create mode 100644 src/modules/userinfo/userinfo.cpp (limited to 'src/modules/userinfo') diff --git a/src/modules/userinfo/contactinfo.cpp b/src/modules/userinfo/contactinfo.cpp new file mode 100644 index 0000000000..dc66067bbf --- /dev/null +++ b/src/modules/userinfo/contactinfo.cpp @@ -0,0 +1,515 @@ +/* + +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: + 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: + 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); + IconLib_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]; + int i; + DBVARIANT dbv; + if(IDOK!=DialogBoxParam(hMirandaInst,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++) { + 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(hMirandaInst,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); + 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; +} diff --git a/src/modules/userinfo/stdinfo.cpp b/src/modules/userinfo/stdinfo.cpp new file mode 100644 index 0000000000..89f6ab0f45 --- /dev/null +++ b/src/modules/userinfo/stdinfo.cpp @@ -0,0 +1,613 @@ +/* + +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" + +INT_PTR CALLBACK ContactDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam); + +#define SVS_NORMAL 0 +#define SVS_GENDER 1 +#define SVS_ZEROISUNSPEC 2 +#define SVS_IP 3 +#define SVS_COUNTRY 4 +#define SVS_MONTH 5 +#define SVS_SIGNED 6 +#define SVS_TIMEZONE 7 + +static int Proto_GetContactInfoSetting(HANDLE hContact,const char *szProto,const char *szModule,const char *szSetting,DBVARIANT *dbv, const int nType) +{ + DBCONTACTGETSETTING cgs={szModule,szSetting,dbv}; + dbv->type=(BYTE)nType; + + return CallProtoService(szProto,PS_GETINFOSETTING,(WPARAM)hContact,(LPARAM)&cgs); +} + +static void Proto_FreeInfoVariant(DBVARIANT *dbv) +{ + switch ( dbv->type ) { + case DBVT_ASCIIZ: + case DBVT_UTF8: + case DBVT_WCHAR: + { + mir_free(dbv->pszVal); + dbv->pszVal=0; + break; + } + case DBVT_BLOB: + { + mir_free(dbv->pbVal); + dbv->pbVal=0; + break; + } + } + dbv->type=0; +} + +static void SetValue(HWND hwndDlg,int idCtrl,HANDLE hContact,char *szModule,char *szSetting,int special) +{ + DBVARIANT dbv = { 0 }; + char str[80],*pstr = NULL; + TCHAR* ptstr = NULL; + int unspecified=0; + char* szProto = (char *) CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0); + bool proto_service = szProto && (CallProtoService(szProto, PS_GETCAPS, PFLAGNUM_4, 0) & PF4_INFOSETTINGSVC); + + dbv.type=DBVT_DELETED; + if(szModule==NULL) unspecified=1; + else if (proto_service) unspecified=Proto_GetContactInfoSetting(hContact,szProto,szModule,szSetting,&dbv,0); + else unspecified=DBGetContactSettingW(hContact,szModule,szSetting,&dbv); + if(!unspecified) { + switch(dbv.type) { + case DBVT_BYTE: + if(special==SVS_GENDER) { + if(dbv.cVal=='M') ptstr=TranslateT("Male"); + else if(dbv.cVal=='F') ptstr=TranslateT("Female"); + else unspecified=1; + } + else if(special==SVS_MONTH) { + if(dbv.bVal>0 && dbv.bVal<=12) { + pstr=str; + GetLocaleInfoA(LOCALE_USER_DEFAULT,LOCALE_SABBREVMONTHNAME1-1+dbv.bVal,str,SIZEOF(str)); + } + else unspecified=1; + } + else if(special==SVS_TIMEZONE) { + if(dbv.cVal==-100) unspecified=1; + else { + pstr=str; + mir_snprintf(str, SIZEOF(str), dbv.cVal?"UTC%+d:%02d":"UTC",-dbv.cVal/2,(dbv.cVal&1)*30); + } + } + else { + unspecified=(special==SVS_ZEROISUNSPEC && dbv.bVal==0); + pstr=_itoa(special==SVS_SIGNED?dbv.cVal:dbv.bVal,str,10); + } + break; + case DBVT_WORD: + if(special==SVS_COUNTRY) { + WORD wSave = dbv.wVal; + if (wSave == ( WORD )-1) { + char szSettingName[100]; + mir_snprintf( szSettingName, SIZEOF(szSettingName), "%sName", szSetting ); + if ( !DBGetContactSettingTString(hContact,szModule,szSettingName,&dbv)) { + ptstr = dbv.ptszVal; + unspecified = false; + break; + } + } + + pstr = Translate((char*)CallService(MS_UTILS_GETCOUNTRYBYNUMBER,wSave,0)); + unspecified=pstr==NULL; + } + else { + unspecified=(special==SVS_ZEROISUNSPEC && dbv.wVal==0); + pstr=_itoa(special==SVS_SIGNED?dbv.sVal:dbv.wVal,str,10); + } + break; + case DBVT_DWORD: + unspecified=(special==SVS_ZEROISUNSPEC && dbv.dVal==0); + if(special==SVS_IP) { + struct in_addr ia; + ia.S_un.S_addr=htonl(dbv.dVal); + pstr=inet_ntoa(ia); + if(dbv.dVal==0) unspecified=1; + } + else pstr=_itoa(special==SVS_SIGNED?dbv.lVal:dbv.dVal,str,10); + break; + case DBVT_ASCIIZ: + unspecified=(special==SVS_ZEROISUNSPEC && dbv.pszVal[0]=='\0'); + pstr=dbv.pszVal; + break; + case DBVT_UTF8: + unspecified=(special==SVS_ZEROISUNSPEC && dbv.pszVal[0]=='\0'); + #if defined( _UNICODE ) + if ( !unspecified ) + { WCHAR* wszStr; + Utf8Decode( dbv.pszVal, &wszStr ); + SetDlgItemTextW( hwndDlg, idCtrl, TranslateTS(wszStr)); + mir_free( wszStr ); + goto LBL_Exit; + } + #endif + pstr=dbv.pszVal; + Utf8Decode( dbv.pszVal, NULL ); + break; + default: pstr=str; lstrcpyA(str,"???"); break; + } } + + if (unspecified) + SetDlgItemText(hwndDlg, idCtrl, TranslateT("")); + else if ( ptstr != NULL ) + SetDlgItemText(hwndDlg, idCtrl, ptstr); + else + SetDlgItemTextA(hwndDlg, idCtrl, pstr); + +#if defined( _UNICODE ) +LBL_Exit: +#endif + EnableWindow(GetDlgItem(hwndDlg, idCtrl), !unspecified); + if (proto_service) + Proto_FreeInfoVariant(&dbv); + else + DBFreeVariant(&dbv); +} + +static INT_PTR CALLBACK SummaryDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch(msg) { + case WM_INITDIALOG: + TranslateDialogDefault(hwndDlg); + break; + + case WM_NOTIFY: + switch (((LPNMHDR)lParam)->idFrom) { + case 0: + if (((LPNMHDR)lParam)->code == PSN_INFOCHANGED ) + { char *szProto; + HANDLE hContact=(HANDLE)((LPPSHNOTIFY)lParam)->lParam; + if (hContact != NULL) { + szProto=(char*)CallService(MS_PROTO_GETCONTACTBASEPROTO,(WPARAM)hContact,0); + if (szProto==NULL) break; + SetValue(hwndDlg,IDC_NICK,hContact,szProto,"Nick",0); + SetValue(hwndDlg,IDC_FIRSTNAME,hContact,szProto,"FirstName",0); + SetValue(hwndDlg,IDC_LASTNAME,hContact,szProto,"LastName",0); + SetValue(hwndDlg,IDC_EMAIL,hContact,szProto,"e-mail",0); + SetValue(hwndDlg,IDC_AGE,hContact,szProto,"Age",SVS_ZEROISUNSPEC); + SetValue(hwndDlg,IDC_GENDER,hContact,szProto,"Gender",SVS_GENDER); + SetValue(hwndDlg,IDC_DOBDAY,hContact,szProto,"BirthDay",0); + SetValue(hwndDlg,IDC_DOBMONTH,hContact,szProto,"BirthMonth",SVS_MONTH); + SetValue(hwndDlg,IDC_DOBYEAR,hContact,szProto,"BirthYear",0); + SetValue(hwndDlg,IDC_MARITAL,hContact,szProto,"MaritalStatus",0); + } } + break; + } + break; + case WM_COMMAND: + switch(LOWORD(wParam)) { + case IDCANCEL: + SendMessage(GetParent(hwndDlg),msg,wParam,lParam); + break; + case IDC_EMAIL: + if(IsWindowEnabled(GetDlgItem(hwndDlg,IDC_EMAIL))) { + TCHAR szExec[264], szEmail[256]; + GetDlgItemText(hwndDlg, IDC_EMAIL, szEmail, SIZEOF(szEmail)); + mir_sntprintf(szExec, SIZEOF(szExec), _T("mailto:%s"), szEmail); + ShellExecute(hwndDlg, _T("open"), szExec, NULL, NULL, SW_SHOW); + } + break; + } + break; + } + return FALSE; +} + +static INT_PTR CALLBACK LocationDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch(msg) { + case WM_INITDIALOG: + + SetWindowLongPtr(hwndDlg,GWLP_USERDATA,lParam); + TranslateDialogDefault(hwndDlg); + SetTimer(hwndDlg,1,1000,NULL); + + tmi.prepareList((HANDLE)lParam, GetDlgItem(hwndDlg, IDC_TIMEZONESELECT), TZF_PLF_CB); + SendMessage(hwndDlg,WM_TIMER,0,0); + break; + + case WM_TIMER: + { + HANDLE hContact = (HANDLE)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); + + if (hContact != NULL) + { + TCHAR szTime[80]; + + if (tmi.printDateTimeByContact(hContact, _T("s"), szTime, SIZEOF(szTime), TZF_KNOWNONLY)) + { + EnableWindow(GetDlgItem(hwndDlg,IDC_LOCALTIME),FALSE); + SetDlgItemText(hwndDlg, IDC_LOCALTIME, TranslateT("")); + } + else + { + EnableWindow(GetDlgItem(hwndDlg,IDC_LOCALTIME), TRUE); + SetDlgItemText(hwndDlg, IDC_LOCALTIME, szTime); + } + } + break; + } + case WM_NOTIFY: + switch (((LPNMHDR)lParam)->idFrom) { + case 0: + if (((LPNMHDR)lParam)->code == PSN_INFOCHANGED ) + { char *szProto; + HANDLE hContact=(HANDLE)((LPPSHNOTIFY)lParam)->lParam; + if (hContact != NULL) { + szProto=(char*)CallService(MS_PROTO_GETCONTACTBASEPROTO,(WPARAM)hContact,0); + if (szProto==NULL) break; + SetValue(hwndDlg,IDC_STREET,hContact,szProto,"Street",SVS_ZEROISUNSPEC); + SetValue(hwndDlg,IDC_CITY,hContact,szProto,"City",SVS_ZEROISUNSPEC); + SetValue(hwndDlg,IDC_STATE,hContact,szProto,"State",SVS_ZEROISUNSPEC); + SetValue(hwndDlg,IDC_ZIP,hContact,szProto,"ZIP",SVS_ZEROISUNSPEC); + SetValue(hwndDlg,IDC_COUNTRY,hContact,szProto,"Country",SVS_COUNTRY); + SetValue(hwndDlg,IDC_LANGUAGE1,hContact,szProto,"Language1",SVS_ZEROISUNSPEC); + SetValue(hwndDlg,IDC_LANGUAGE2,hContact,szProto,"Language2",SVS_ZEROISUNSPEC); + SetValue(hwndDlg,IDC_LANGUAGE3,hContact,szProto,"Language3",SVS_ZEROISUNSPEC); + SetValue(hwndDlg,IDC_TIMEZONE,hContact,szProto,"Timezone",SVS_TIMEZONE); + } + } + break; + } + break; + case WM_COMMAND: + switch(LOWORD(wParam)) { + case IDCANCEL: + SendMessage(GetParent(hwndDlg),msg,wParam,lParam); + break; + case IDC_TIMEZONESELECT: + if(HIWORD(wParam) == CBN_SELCHANGE) { + HANDLE hContact = (HANDLE)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); + + SendMessage(GetParent(hwndDlg),PSM_CHANGED, 0,0); + tmi.storeListResults(hContact, GetDlgItem(hwndDlg, IDC_TIMEZONESELECT), TZF_PLF_CB); + } + break; + } + break; + } + return FALSE; +} + +static INT_PTR CALLBACK WorkDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch(msg) { + case WM_INITDIALOG: + TranslateDialogDefault(hwndDlg); + break; + case WM_NOTIFY: + switch (((LPNMHDR)lParam)->idFrom) { + case 0: + if (((LPNMHDR)lParam)->code == PSN_INFOCHANGED) + { char *szProto; + HANDLE hContact=(HANDLE)((LPPSHNOTIFY)lParam)->lParam; + if (hContact != NULL) { + szProto=(char*)CallService(MS_PROTO_GETCONTACTBASEPROTO,(WPARAM)hContact,0); + if (szProto==NULL) break; + SetValue(hwndDlg,IDC_COMPANY,hContact,szProto,"Company",SVS_ZEROISUNSPEC); + SetValue(hwndDlg,IDC_DEPARTMENT,hContact,szProto,"CompanyDepartment",SVS_ZEROISUNSPEC); + SetValue(hwndDlg,IDC_POSITION,hContact,szProto,"CompanyPosition",SVS_ZEROISUNSPEC); + SetValue(hwndDlg,IDC_STREET,hContact,szProto,"CompanyStreet",SVS_ZEROISUNSPEC); + SetValue(hwndDlg,IDC_CITY,hContact,szProto,"CompanyCity",SVS_ZEROISUNSPEC); + SetValue(hwndDlg,IDC_STATE,hContact,szProto,"CompanyState",SVS_ZEROISUNSPEC); + SetValue(hwndDlg,IDC_ZIP,hContact,szProto,"CompanyZIP",SVS_ZEROISUNSPEC); + SetValue(hwndDlg,IDC_COUNTRY,hContact,szProto,"CompanyCountry",SVS_COUNTRY); + SetValue(hwndDlg,IDC_WEBPAGE,hContact,szProto,"CompanyHomepage",SVS_ZEROISUNSPEC); + } } + break; + } + break; + case WM_COMMAND: + switch(LOWORD(wParam)) { + case IDCANCEL: + SendMessage(GetParent(hwndDlg),msg,wParam,lParam); + break; + case IDC_WEBPAGE: + if(IsWindowEnabled(GetDlgItem(hwndDlg,IDC_WEBPAGE))) { + char szPage[256]; + GetDlgItemTextA(hwndDlg,IDC_WEBPAGE,szPage,SIZEOF(szPage)); + CallService(MS_UTILS_OPENURL,1,(LPARAM)szPage); + } + break; + } + break; + } + return FALSE; +} + +// Resizes all columns in a listview (report style) +// to make all text visible +void ResizeColumns(HWND hwndLV) +{ + int nCol = 0; LVCOLUMN lvCol; + lvCol.mask = LVCF_WIDTH; + while(ListView_GetColumn(hwndLV, nCol++, &lvCol)) + ListView_SetColumnWidth(hwndLV, nCol-1, LVSCW_AUTOSIZE); +} + +static INT_PTR CALLBACK BackgroundDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch(msg) { + case WM_INITDIALOG: + TranslateDialogDefault(hwndDlg); + { LVCOLUMN lvc; + RECT rc; + GetClientRect(GetDlgItem(hwndDlg,IDC_PAST),&rc); + rc.right-=GetSystemMetrics(SM_CXVSCROLL); + lvc.mask=LVCF_WIDTH; + lvc.cx=rc.right/3; + ListView_InsertColumn(GetDlgItem(hwndDlg,IDC_PAST),0,&lvc); + ListView_InsertColumn(GetDlgItem(hwndDlg,IDC_INTERESTS),0,&lvc); + lvc.cx=rc.right-rc.right/3; + ListView_InsertColumn(GetDlgItem(hwndDlg,IDC_PAST),1,&lvc); + ListView_InsertColumn(GetDlgItem(hwndDlg,IDC_INTERESTS),1,&lvc); + } + ListView_SetExtendedListViewStyleEx(GetDlgItem(hwndDlg,IDC_PAST),LVS_EX_LABELTIP,LVS_EX_LABELTIP); + ListView_SetExtendedListViewStyleEx(GetDlgItem(hwndDlg,IDC_INTERESTS),LVS_EX_LABELTIP,LVS_EX_LABELTIP); + break; + + case WM_NOTIFY: + switch (((LPNMHDR)lParam)->idFrom) { + case 0: + if (((LPNMHDR)lParam)->code == PSN_INFOCHANGED) + { LVITEM lvi; + int i; + char idstr[33]; + DBVARIANT dbv,dbvText; + HANDLE hContact=(HANDLE)((LPPSHNOTIFY)lParam)->lParam; + + if (hContact != NULL) { + char *szProto=(char*)CallService(MS_PROTO_GETCONTACTBASEPROTO,(WPARAM)hContact,0); + if (szProto==NULL) break; + bool proto_service = (CallProtoService(szProto, PS_GETCAPS, PFLAGNUM_4, 0) & PF4_INFOSETTINGSVC) == PF4_INFOSETTINGSVC; + SetValue(hwndDlg,IDC_WEBPAGE,hContact,szProto,"Homepage",SVS_ZEROISUNSPEC); + + //past + ListView_DeleteAllItems(GetDlgItem(hwndDlg,IDC_PAST)); + lvi.mask=LVIF_TEXT; + lvi.iSubItem=0; + lvi.iItem=0; + for(i=0;;i++) { + mir_snprintf(idstr, SIZEOF(idstr), "Past%d",i); + if((proto_service && Proto_GetContactInfoSetting(hContact,szProto,szProto,idstr,&dbv,DBVT_TCHAR)) || + (!proto_service && DBGetContactSettingTString(hContact,szProto,idstr,&dbv))) + break; + mir_snprintf(idstr, SIZEOF(idstr), "Past%dText",i); + if(DBGetContactSettingTString(hContact,szProto,idstr,&dbvText)) + {if(proto_service) Proto_FreeInfoVariant(&dbv); else DBFreeVariant(&dbv); break;} + lvi.pszText=dbv.ptszVal; + ListView_InsertItem(GetDlgItem(hwndDlg,IDC_PAST),&lvi); + ListView_SetItemText(GetDlgItem(hwndDlg,IDC_PAST),lvi.iItem,1,dbvText.ptszVal); + DBFreeVariant(&dbvText); + if(proto_service) + Proto_FreeInfoVariant(&dbv); + else + DBFreeVariant(&dbv); + lvi.iItem++; + } + + for(i=0;;i++) { + mir_snprintf(idstr, SIZEOF(idstr), "Affiliation%d", i); + if((proto_service && Proto_GetContactInfoSetting(hContact,szProto,szProto,idstr,&dbv,DBVT_TCHAR)) || + (!proto_service && DBGetContactSettingTString(hContact,szProto,idstr,&dbv))) + break; + mir_snprintf(idstr, SIZEOF(idstr), "Affiliation%dText",i); + if(DBGetContactSettingTString(hContact,szProto,idstr,&dbvText)) + {if(proto_service) Proto_FreeInfoVariant(&dbv); else DBFreeVariant(&dbv); break;} + lvi.pszText=dbv.ptszVal; + ListView_InsertItem(GetDlgItem(hwndDlg,IDC_PAST),&lvi); + ListView_SetItemText(GetDlgItem(hwndDlg,IDC_PAST),lvi.iItem,1,dbvText.ptszVal); + DBFreeVariant(&dbvText); + if(proto_service) + Proto_FreeInfoVariant(&dbv); + else + DBFreeVariant(&dbv); + lvi.iItem++; + } + + ResizeColumns(GetDlgItem(hwndDlg,IDC_PAST)); + + //interests + ListView_DeleteAllItems(GetDlgItem(hwndDlg,IDC_INTERESTS)); + lvi.mask=LVIF_TEXT; + lvi.iSubItem=0; + lvi.iItem=0; + for(i=0;;i++) { + mir_snprintf(idstr, SIZEOF(idstr), "Interest%dCat", i); + if((proto_service && Proto_GetContactInfoSetting(hContact,szProto,szProto,idstr,&dbv,DBVT_TCHAR)) || + (!proto_service && DBGetContactSettingTString(hContact,szProto,idstr,&dbv))) + break; + mir_snprintf(idstr, SIZEOF(idstr), "Interest%dText", i); + if(DBGetContactSettingTString(hContact,szProto,idstr,&dbvText)) + {if(proto_service) Proto_FreeInfoVariant(&dbv); else DBFreeVariant(&dbv); break;} + lvi.pszText=dbv.ptszVal; + ListView_InsertItem(GetDlgItem(hwndDlg,IDC_INTERESTS),&lvi); + ListView_SetItemText(GetDlgItem(hwndDlg,IDC_INTERESTS),lvi.iItem,1,dbvText.ptszVal); + DBFreeVariant(&dbvText); + if(proto_service) + Proto_FreeInfoVariant(&dbv); + else + DBFreeVariant(&dbv); + lvi.iItem++; + } + ResizeColumns(GetDlgItem(hwndDlg,IDC_INTERESTS)); + } } + break; + } + break; + case WM_COMMAND: + switch(LOWORD(wParam)) { + case IDCANCEL: + SendMessage(GetParent(hwndDlg),msg,wParam,lParam); + break; + case IDC_WEBPAGE: + if(IsWindowEnabled(GetDlgItem(hwndDlg,IDC_WEBPAGE))) { + char szPage[256]; + GetDlgItemTextA(hwndDlg,IDC_WEBPAGE,szPage,SIZEOF(szPage)); + CallService(MS_UTILS_OPENURL,1,(LPARAM)szPage); + } + break; + } + break; + } + return FALSE; +} + +static INT_PTR CALLBACK NotesDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch(msg) { + case WM_INITDIALOG: + TranslateDialogDefault(hwndDlg); + { DBVARIANT dbv; + HFONT hFont; + LOGFONT lf; + HDC hDC = GetDC(hwndDlg); + lf.lfHeight = -MulDiv(10, GetDeviceCaps(hDC, LOGPIXELSY), 72); + ReleaseDC(hwndDlg, hDC); + lf.lfWidth = 0; + lf.lfEscapement = 0; + lf.lfOrientation = 0; + lf.lfWeight = FW_NORMAL; + lf.lfItalic = 0; + lf.lfUnderline = 0; + lf.lfStrikeOut = 0; + lf.lfOutPrecision = OUT_DEFAULT_PRECIS; + lf.lfClipPrecision = CLIP_DEFAULT_PRECIS; + lf.lfQuality = DEFAULT_QUALITY; + lf.lfPitchAndFamily = DEFAULT_PITCH | FF_DONTCARE; + lstrcpy(lf.lfFaceName, _T("Courier New")); + lf.lfCharSet = DEFAULT_CHARSET; +// hFont = (HFONT) GetStockObject(ANSI_FIXED_FONT); + hFont = CreateFontIndirect(&lf); + SendDlgItemMessage(hwndDlg, IDC_ABOUT, WM_SETFONT, (WPARAM) hFont, MAKELPARAM(TRUE, 0)); + + if(!DBGetContactSettingString((HANDLE)lParam,"UserInfo","MyNotes",&dbv)) { + SetDlgItemTextA(hwndDlg,IDC_MYNOTES,dbv.pszVal); + DBFreeVariant(&dbv); + } + } + SendDlgItemMessage(hwndDlg,IDC_MYNOTES,EM_LIMITTEXT,2048,0); + break; + case WM_NOTIFY: + switch (((LPNMHDR)lParam)->idFrom) { + case 0: + switch (((LPNMHDR)lParam)->code) { + case PSN_INFOCHANGED: + { char *szProto; + HANDLE hContact=(HANDLE)((LPPSHNOTIFY)lParam)->lParam; + if (hContact != NULL) { + szProto=(char*)CallService(MS_PROTO_GETCONTACTBASEPROTO,(WPARAM)hContact,0); + if (szProto==NULL) break; + SetValue(hwndDlg,IDC_ABOUT,hContact,szProto,"About",0); + } + break; + } + case PSN_APPLY: + { HANDLE hContact=(HANDLE)((LPPSHNOTIFY)lParam)->lParam; + if(GetWindowTextLength(GetDlgItem(hwndDlg,IDC_MYNOTES))) { + char text[2048]; + GetDlgItemTextA(hwndDlg,IDC_MYNOTES,text,SIZEOF(text)); + DBWriteContactSettingString(hContact,"UserInfo","MyNotes",text); + } + else DBDeleteContactSetting(hContact,"UserInfo","MyNotes"); + break; + } + } + break; + } + break; + case WM_COMMAND: + if(wParam==MAKEWPARAM(IDC_MYNOTES,EN_CHANGE)) + SendMessage(GetParent(hwndDlg),PSM_CHANGED,0,0); + else if(LOWORD(wParam)==IDCANCEL) + SendMessage(GetParent(hwndDlg),msg,wParam,lParam); + break; + case WM_DESTROY: + { + HFONT hFont = (HFONT)SendDlgItemMessage(hwndDlg, IDC_ABOUT, WM_GETFONT, 0, 0); + DeleteObject(hFont); + } + break; + } + return FALSE; +} + +int DetailsInit(WPARAM wParam,LPARAM lParam) +{ + OPTIONSDIALOGPAGE odp; + + if ((HANDLE)lParam == NULL) + return 0; + + if ( CallService(MS_PROTO_GETCONTACTBASEPROTO, lParam, 0) == 0 ) + return 0; + + odp.cbSize = sizeof(odp); + odp.hIcon = NULL; + odp.hInstance = hMirandaInst; + odp.flags = 0; + + odp.pfnDlgProc = SummaryDlgProc; + odp.position = -2100000000; + odp.pszTemplate = MAKEINTRESOURCEA(IDD_INFO_SUMMARY); + odp.pszTitle = LPGEN("Summary"); + CallService(MS_USERINFO_ADDPAGE, wParam, ( LPARAM )&odp); + + odp.pfnDlgProc = ContactDlgProc; + odp.position = -1800000000; + odp.pszTemplate = MAKEINTRESOURCEA(IDD_INFO_CONTACT); + odp.pszTitle = LPGEN("Contact"); + CallService(MS_USERINFO_ADDPAGE, wParam, ( LPARAM )&odp ); + + odp.pfnDlgProc = LocationDlgProc; + odp.position = -1500000000; + odp.pszTemplate = MAKEINTRESOURCEA(IDD_INFO_LOCATION); + odp.pszTitle = LPGEN("Location"); + CallService(MS_USERINFO_ADDPAGE, wParam, ( LPARAM )&odp); + + odp.pfnDlgProc = WorkDlgProc; + odp.position = -1200000000; + odp.pszTemplate = MAKEINTRESOURCEA(IDD_INFO_WORK); + odp.pszTitle = LPGEN("Work"); + CallService(MS_USERINFO_ADDPAGE, wParam, ( LPARAM )&odp); + + odp.pfnDlgProc = BackgroundDlgProc; + odp.position = -900000000; + odp.pszTemplate = MAKEINTRESOURCEA(IDD_INFO_BACKGROUND); + odp.pszTitle = LPGEN("Background info"); + CallService(MS_USERINFO_ADDPAGE, wParam, ( LPARAM )&odp ); + + odp.pfnDlgProc = NotesDlgProc; + odp.position = 0; + odp.pszTemplate = MAKEINTRESOURCEA(IDD_INFO_NOTES); + odp.pszTitle = LPGEN("Notes"); + CallService(MS_USERINFO_ADDPAGE, wParam, ( LPARAM )&odp); + return 0; +} diff --git a/src/modules/userinfo/userinfo.cpp b/src/modules/userinfo/userinfo.cpp new file mode 100644 index 0000000000..a17b2d4c71 --- /dev/null +++ b/src/modules/userinfo/userinfo.cpp @@ -0,0 +1,636 @@ +/* + +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" +#define UPDATEANIMFRAMES 20 + +int DetailsInit(WPARAM wParam,LPARAM lParam); +static INT_PTR CALLBACK DlgProcDetails(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam); +static HANDLE hWindowList=NULL; +static HANDLE hDetailsInitEvent; + +struct DetailsPageInit { + int pageCount; + OPTIONSDIALOGPAGE *odp; +}; + +struct DetailsPageData { + DLGTEMPLATE *pTemplate; + HINSTANCE hInst; + DLGPROC dlgProc; + LPARAM dlgParam; + HWND hwnd; + HTREEITEM hItem; + int changed; + TCHAR *ptszTitle, *ptszTab; +}; + +struct DetailsData { + HANDLE hContact; + HANDLE hProtoAckEvent; + HINSTANCE hInstIcmp; + HFONT hBoldFont; + int pageCount; + int currentPage; + struct DetailsPageData *opd; + RECT rcDisplay, rcDisplayTab; + int updateAnimFrame; + TCHAR szUpdating[64]; + int *infosUpdated; +}; + +static int PageSortProc(OPTIONSDIALOGPAGE *item1,OPTIONSDIALOGPAGE *item2) +{ + int res; + if (!lstrcmp(item1->ptszTitle, TranslateT("Summary"))) return -1; + if (!lstrcmp(item2->ptszTitle, TranslateT("Summary"))) return 1; + if (res = lstrcmp(item1->ptszTitle, item2->ptszTitle)) return res; + if (item1->ptszTab && !item2->ptszTab) return -1; + if (!item1->ptszTab && item2->ptszTab) return 1; + if (!item1->ptszTab && !item2->ptszTab) return 0; + if (item1->ptszTab && !lstrcmp(item1->ptszTab, TranslateT("General"))) return -1; + if (item2->ptszTab && !lstrcmp(item2->ptszTab, TranslateT("General"))) return 1; + return lstrcmp(item1->ptszTab, item2->ptszTab); +} + +static INT_PTR ShowDetailsDialogCommand(WPARAM wParam,LPARAM) +{ + HWND hwnd; + PROPSHEETHEADER psh; + struct DetailsPageInit opi; + int i; + + if(hwnd=WindowList_Find(hWindowList,(HANDLE)wParam)) { + SetForegroundWindow(hwnd); + SetFocus(hwnd); + return 0; + } + + opi.pageCount=0; + opi.odp=NULL; + NotifyEventHooks(hDetailsInitEvent,(WPARAM)&opi,wParam); + if(opi.pageCount==0) return 0; + qsort(opi.odp,opi.pageCount,sizeof(OPTIONSDIALOGPAGE),(int (*)(const void*,const void*))PageSortProc); + + ZeroMemory(&psh,sizeof(psh)); + psh.dwSize = sizeof(psh); + psh.dwFlags = PSH_PROPSHEETPAGE|PSH_NOAPPLYNOW; + psh.hwndParent = NULL; + psh.nPages = opi.pageCount; + psh.pStartPage = 0; + psh.pszCaption = (TCHAR*)wParam; //more abuses of structure: this is hContact + psh.ppsp = (PROPSHEETPAGE*)opi.odp; //blatent misuse of the structure, but what the hell + + CreateDialogParam(hMirandaInst,MAKEINTRESOURCE(IDD_DETAILS), NULL, DlgProcDetails, (LPARAM)&psh); + for(i=0;icbSize!=sizeof(OPTIONSDIALOGPAGE) + && odp->cbSize != OPTIONPAGE_OLD_SIZE2 + && odp->cbSize != OPTIONPAGE_OLD_SIZE3) + return 1; + + opi->odp=(OPTIONSDIALOGPAGE*)mir_realloc(opi->odp,sizeof(OPTIONSDIALOGPAGE)*(opi->pageCount+1)); + dst = opi->odp + opi->pageCount; + dst->cbSize = sizeof(OPTIONSDIALOGPAGE); + dst->hInstance = odp->hInstance; + dst->pfnDlgProc = odp->pfnDlgProc; + dst->position = odp->position; + if((DWORD_PTR)odp->pszTemplate&0xFFFF0000) dst->pszTemplate = mir_strdup(odp->pszTemplate); + else dst->pszTemplate = odp->pszTemplate; + + #if defined(_UNICODE) + if ( odp->flags & ODPF_UNICODE ) + { + dst->ptszTitle = (odp->ptszTitle==0) ? NULL : mir_wstrdup(odp->ptszTitle); + dst->ptszTab = (!(odp->flags & ODPF_USERINFOTAB) || !odp->ptszTab) ? NULL : mir_wstrdup(odp->ptszTab); + } + else + #endif + { + if ( odp->flags & ODPF_DONTTRANSLATE ) + dst->ptszTitle = (odp->pszTitle==0) ? NULL : mir_a2t(odp->pszTitle); + else + dst->ptszTitle = (odp->pszTitle==0) ? NULL : LangPackPcharToTchar(odp->pszTitle); + dst->ptszTab = (!(odp->flags & ODPF_USERINFOTAB) || !odp->pszTab) ? NULL : LangPackPcharToTchar(odp->pszTab); + } + + dst->pszGroup = NULL; + dst->groupPosition = odp->groupPosition; + dst->hGroupIcon = odp->hGroupIcon; + dst->hIcon = odp->hIcon; + if ( odp->cbSize == sizeof(OPTIONSDIALOGPAGE)) + dst->dwInitParam = odp->dwInitParam; + opi->pageCount++; + return 0; +} + +static void ThemeDialogBackground(HWND hwnd) +{ + if (enableThemeDialogTexture) + enableThemeDialogTexture(hwnd, ETDT_ENABLETAB); +} + +static void CreateDetailsTabs( HWND hwndDlg, struct DetailsData* dat, struct DetailsPageData* ppg ) +{ + HWND hwndTab = GetDlgItem(hwndDlg, IDC_TABS); + int i, sel=0, pages=0; + TCITEM tie; + tie.mask = TCIF_TEXT | TCIF_IMAGE | TCIF_PARAM; + tie.iImage = -1; + TabCtrl_DeleteAllItems(hwndTab); + for ( i=0; i < dat->pageCount; i++ ) { + if (!dat->opd[i].ptszTab || lstrcmp(dat->opd[i].ptszTitle, ppg->ptszTitle)) continue; + + tie.pszText = TranslateTS(dat->opd[i].ptszTab); + tie.lParam = i; + TabCtrl_InsertItem(hwndTab, pages, &tie); + if (!lstrcmp(dat->opd[i].ptszTab,ppg->ptszTab)) + sel = pages; + pages++; + } + TabCtrl_SetCurSel(hwndTab,sel); + + LONG style = GetWindowLong(hwndTab, GWL_STYLE); + SetWindowLong(hwndTab, GWL_STYLE, pages > 1 ? style | WS_TABSTOP : style & ~WS_TABSTOP); +} + +static void CreateDetailsPageWindow( HWND hwndDlg, struct DetailsData* dat, struct DetailsPageData* ppg ) +{ + RECT *rc = ppg->ptszTab ? &dat->rcDisplayTab : &dat->rcDisplay; + ppg->hwnd=CreateDialogIndirectParam(ppg->hInst,ppg->pTemplate,hwndDlg,ppg->dlgProc,(LPARAM)dat->hContact); + ThemeDialogBackground(ppg->hwnd); + SetWindowPos(ppg->hwnd, HWND_TOP, rc->left, rc->top, rc->right - rc->left, rc->bottom - rc->top, 0); + SetWindowPos(ppg->hwnd, HWND_TOP, rc->left, rc->top, rc->right - rc->left, rc->bottom - rc->top, 0); + { + PSHNOTIFY pshn; + pshn.hdr.code = PSN_PARAMCHANGED; + pshn.hdr.hwndFrom = ppg->hwnd; + pshn.hdr.idFrom = 0; + pshn.lParam = (LPARAM)ppg->dlgParam; + SendMessage(ppg->hwnd,WM_NOTIFY,0,(LPARAM)&pshn); + + pshn.hdr.code=PSN_INFOCHANGED; + pshn.hdr.hwndFrom=ppg->hwnd; + pshn.hdr.idFrom=0; + pshn.lParam=(LPARAM)dat->hContact; + SendMessage(ppg->hwnd,WM_NOTIFY,0,(LPARAM)&pshn); + } +} + +static int UserInfoContactDelete(WPARAM wParam,LPARAM) +{ + HWND hwnd; + hwnd=WindowList_Find(hWindowList,(HANDLE)wParam); + if(hwnd!=NULL) DestroyWindow(hwnd); + return 0; +} + +#define HM_PROTOACK (WM_USER+10) +#define M_CHECKONLINE (WM_USER+11) +static INT_PTR CALLBACK DlgProcDetails(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) +{ + struct DetailsData *dat =(struct DetailsData*)GetWindowLongPtr(hwndDlg,GWLP_USERDATA); + + switch (msg) { + case WM_INITDIALOG: + TranslateDialogDefault(hwndDlg); + Window_SetIcon_IcoLib(hwndDlg, SKINICON_OTHER_USERDETAILS); + { + PROPSHEETHEADER *psh = (PROPSHEETHEADER*)lParam; + dat = (DetailsData*)mir_calloc(sizeof(DetailsData)); + SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)dat); + dat->hContact = (HANDLE)psh->pszCaption; + dat->hProtoAckEvent = HookEventMessage(ME_PROTO_ACK,hwndDlg,HM_PROTOACK); + WindowList_Add(hWindowList,hwndDlg,dat->hContact); + { + TCHAR *name, oldTitle[256], newTitle[256]; + if (dat->hContact == NULL) + name = TranslateT("Owner"); + else + name = cli.pfnGetContactDisplayName( dat->hContact, 0 ); + + GetWindowText( hwndDlg, oldTitle, SIZEOF( oldTitle )); + mir_sntprintf( newTitle, SIZEOF(newTitle), oldTitle, name ); + SetWindowText( hwndDlg, newTitle ); + + GetDlgItemText( hwndDlg, IDC_HEADERBAR, oldTitle, SIZEOF( oldTitle )); + mir_sntprintf( newTitle, SIZEOF(newTitle), oldTitle, name ); + SetDlgItemText( hwndDlg, IDC_HEADERBAR, newTitle ); + } + { LOGFONT lf; + HFONT hNormalFont=(HFONT)SendDlgItemMessage(hwndDlg,IDC_NAME,WM_GETFONT,0,0); + GetObject(hNormalFont,sizeof(lf),&lf); + lf.lfWeight=FW_BOLD; + dat->hBoldFont=CreateFontIndirect(&lf); + SendDlgItemMessage(hwndDlg,IDC_NAME,WM_SETFONT,(WPARAM)dat->hBoldFont,0); + } + { OPTIONSDIALOGPAGE *odp; + int i; + TVINSERTSTRUCT tvis; + DBVARIANT dbv; + + HWND hwndTree = GetDlgItem(hwndDlg, IDC_PAGETREE); + + dat->currentPage = 0; + if ( DBGetContactSettingTString( NULL, "UserInfo", "LastTab", &dbv )) + dbv.type = DBVT_DELETED; + dat->pageCount = psh->nPages; + dat->opd = (DetailsPageData*)mir_calloc(sizeof(DetailsPageData) * dat->pageCount); + odp = (OPTIONSDIALOGPAGE*)psh->ppsp; + + for ( i=0; i < dat->pageCount; i++ ) { + dat->opd[i].pTemplate = (LPDLGTEMPLATE)LockResource(LoadResource(odp[i].hInstance, + FindResourceA(odp[i].hInstance, odp[i].pszTemplate, MAKEINTRESOURCEA(5)))); + dat->opd[i].dlgProc = odp[i].pfnDlgProc; + dat->opd[i].dlgParam = odp[i].dwInitParam; + dat->opd[i].hInst = odp[i].hInstance; + + dat->opd[i].ptszTitle = odp[i].ptszTitle; + dat->opd[i].ptszTab = odp[i].ptszTab; + + if (i && dat->opd[i].ptszTab && !lstrcmp(dat->opd[i-1].ptszTitle, dat->opd[i].ptszTitle)) { + dat->opd[i].hItem = dat->opd[i-1].hItem; + continue; + } + + tvis.hParent = NULL; + tvis.hInsertAfter = TVI_LAST; + tvis.item.mask = TVIF_TEXT | TVIF_PARAM; + tvis.item.lParam = (LPARAM) i; + if (odp[i].flags & ODPF_DONTTRANSLATE) + tvis.item.pszText = mir_tstrdup(odp[i].ptszTitle); + else + tvis.item.pszText = TranslateTS(odp[i].ptszTitle); + if ( dbv.type != DBVT_DELETED && !lstrcmp( tvis.item.pszText, dbv.ptszVal )) + dat->currentPage = i; + dat->opd[i].hItem = TreeView_InsertItem(hwndTree, &tvis); + } + DBFreeVariant(&dbv); + } + + { + HWND hwndTab = GetDlgItem(hwndDlg, IDC_TABS); + + TCITEM tci; + tci.mask = TCIF_TEXT | TCIF_IMAGE; + tci.iImage = -1; + tci.pszText = _T("X"); + TabCtrl_InsertItem(hwndTab,0,&tci); + + GetWindowRect(hwndTab, &dat->rcDisplayTab); + TabCtrl_AdjustRect(hwndTab, FALSE, &dat->rcDisplayTab); + { POINT pt={0,0}; + ClientToScreen(hwndDlg, &pt); + OffsetRect(&dat->rcDisplayTab, -pt.x, -pt.y); + } + + TabCtrl_DeleteAllItems(hwndTab); + + GetWindowRect(hwndTab, &dat->rcDisplay); + TabCtrl_AdjustRect(hwndTab, FALSE, &dat->rcDisplay); + { POINT pt={0,0}; + ClientToScreen(hwndDlg, &pt); + OffsetRect(&dat->rcDisplay, -pt.x, -pt.y); + } } + + TreeView_SelectItem(GetDlgItem(hwndDlg, IDC_PAGETREE), dat->opd[dat->currentPage].hItem); + + dat->updateAnimFrame = 0; + GetDlgItemText(hwndDlg,IDC_UPDATING,dat->szUpdating,SIZEOF(dat->szUpdating)); + SendMessage(hwndDlg,M_CHECKONLINE,0,0); + if (!CallContactService(dat->hContact,PSS_GETINFO,SGIF_ONOPEN,0)) { + EnableWindow(GetDlgItem(hwndDlg,IDC_UPDATE),FALSE); + SetTimer(hwndDlg,1,100,NULL); + } else + ShowWindow(GetDlgItem(hwndDlg,IDC_UPDATING),SW_HIDE); + + SetFocus(GetDlgItem(hwndDlg, IDC_PAGETREE)); + + return TRUE; + } + case WM_TIMER: + { + TCHAR str[128]; + mir_sntprintf(str,SIZEOF(str), _T("%.*s%s%.*s"),dat->updateAnimFrame%10,_T("........."),dat->szUpdating,dat->updateAnimFrame%10,_T(".........")); + SetDlgItemText(hwndDlg,IDC_UPDATING,str); + if(++dat->updateAnimFrame==UPDATEANIMFRAMES) dat->updateAnimFrame=0; + break; + } + case WM_CTLCOLORSTATIC: + switch (GetDlgCtrlID((HWND)lParam)) { + case IDC_WHITERECT: + SetBkColor((HDC)wParam, GetSysColor(COLOR_WINDOW)); + return (INT_PTR)GetSysColorBrush(COLOR_WINDOW); + case IDC_UPDATING: + { + COLORREF textCol,bgCol,newCol; + int ratio; + textCol=GetSysColor(COLOR_BTNTEXT); + bgCol=GetSysColor(COLOR_3DFACE); + ratio=abs(UPDATEANIMFRAMES/2-dat->updateAnimFrame)*510/UPDATEANIMFRAMES; + newCol=RGB(GetRValue(bgCol)+(GetRValue(textCol)-GetRValue(bgCol))*ratio/256, + GetGValue(bgCol)+(GetGValue(textCol)-GetGValue(bgCol))*ratio/256, + GetBValue(bgCol)+(GetBValue(textCol)-GetBValue(bgCol))*ratio/256); + SetTextColor((HDC)wParam,newCol); + SetBkColor((HDC)wParam,GetSysColor(COLOR_3DFACE)); + return (INT_PTR)GetSysColorBrush(COLOR_3DFACE); + } + default: + SetBkMode((HDC)wParam,TRANSPARENT); + return (INT_PTR)GetStockObject(NULL_BRUSH); + } + break; + + case PSM_CHANGED: + dat->opd[dat->currentPage].changed=1; + return TRUE; + + case PSM_FORCECHANGED: + { + int i; + PSHNOTIFY pshn; + pshn.hdr.code=PSN_INFOCHANGED; + pshn.hdr.idFrom=0; + pshn.lParam=(LPARAM)dat->hContact; + for(i=0;ipageCount;i++) { + pshn.hdr.hwndFrom=dat->opd[i].hwnd; + if(dat->opd[i].hwnd!=NULL) + SendMessage(dat->opd[i].hwnd,WM_NOTIFY,0,(LPARAM)&pshn); + } + break; + } + case M_CHECKONLINE: + { + char *szProto; + if (dat->hContact != NULL) { + szProto=(char*)CallService(MS_PROTO_GETCONTACTBASEPROTO,(WPARAM)dat->hContact,0); + if(szProto==NULL) {EnableWindow(GetDlgItem(hwndDlg,IDC_UPDATE),FALSE); break;} + if(CallProtoService(szProto,PS_GETSTATUS,0,0)hContact==NULL && ack->type==ACKTYPE_STATUS) { + SendMessage(hwndDlg,M_CHECKONLINE,0,0); + break; + } + if(ack->hContact!=dat->hContact) break; + if(ack->type!=ACKTYPE_GETINFO) break; + SendMessage(hwndDlg,PSM_FORCECHANGED,0,0); + /* if they're not gonna send any more ACK's don't let that mean we should crash */ + if (!ack->hProcess && !ack->lParam) { + ShowWindow(GetDlgItem(hwndDlg,IDC_UPDATING),SW_HIDE); + KillTimer(hwndDlg,1); + SendMessage(hwndDlg,M_CHECKONLINE,0,0); + break; + } //if + if(dat->infosUpdated==NULL) dat->infosUpdated=(int*)mir_calloc(sizeof(int)*(INT_PTR)ack->hProcess); + if(ack->result==ACKRESULT_SUCCESS || ack->result==ACKRESULT_FAILED) dat->infosUpdated[ack->lParam]=1; + for(i=0;i<(int)ack->hProcess;i++) + if(dat->infosUpdated[i]==0) break; + if(i==(int)ack->hProcess) { + ShowWindow(GetDlgItem(hwndDlg,IDC_UPDATING),SW_HIDE); + KillTimer(hwndDlg,1); + SendMessage(hwndDlg,M_CHECKONLINE,0,0); + } } + break; + + case WM_NOTIFY: + switch(wParam) { + case IDC_TABS: + case IDC_PAGETREE: + switch(((LPNMHDR)lParam)->code) + { + case TCN_SELCHANGING: + case TVN_SELCHANGING: + if (dat->currentPage != -1 && dat->opd[dat->currentPage].hwnd != NULL) + { + PSHNOTIFY pshn; + pshn.hdr.code = PSN_KILLACTIVE; + pshn.hdr.hwndFrom = dat->opd[dat->currentPage].hwnd; + pshn.hdr.idFrom = 0; + pshn.lParam = (LPARAM)dat->hContact; + if (SendMessage(dat->opd[dat->currentPage].hwnd, WM_NOTIFY, 0, (LPARAM)&pshn)) + { + SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, TRUE); + return TRUE; + } + } + break; + + case TCN_SELCHANGE: + if (dat->currentPage != -1 && dat->opd[dat->currentPage].hwnd != NULL) + { + HWND hwndTab = GetDlgItem(hwndDlg, IDC_TABS); + ShowWindow(dat->opd[dat->currentPage].hwnd, SW_HIDE); + + TCITEM tie; + TVITEM tvi; + + tie.mask = TCIF_PARAM; + TabCtrl_GetItem(hwndTab, TabCtrl_GetCurSel(hwndTab), &tie); + dat->currentPage = tie.lParam; + + tvi.hItem = TreeView_GetNextItem(GetDlgItem(hwndDlg,IDC_PAGETREE), NULL, TVGN_CARET); + tvi.mask = TVIF_PARAM; + tvi.lParam = dat->currentPage; + TreeView_SetItem(GetDlgItem(hwndDlg,IDC_PAGETREE), &tvi); + + if (dat->currentPage != -1) + { + if (dat->opd[dat->currentPage].hwnd == NULL) + CreateDetailsPageWindow(hwndDlg, dat, &dat->opd[dat->currentPage]); + ShowWindow(dat->opd[dat->currentPage].hwnd, SW_SHOWNA); + } + } + break; + + case TVN_SELCHANGED: + if (dat->currentPage != -1 && dat->opd[dat->currentPage].hwnd != NULL) + ShowWindow(dat->opd[dat->currentPage].hwnd, SW_HIDE); + + { + LPNMTREEVIEW pnmtv = (LPNMTREEVIEW) lParam; + TVITEM tvi = pnmtv->itemNew; + dat->currentPage = tvi.lParam; + + if(dat->currentPage != -1) + { + CreateDetailsTabs(hwndDlg, dat, &dat->opd[dat->currentPage]); + if (dat->opd[dat->currentPage].hwnd == NULL) + CreateDetailsPageWindow(hwndDlg, dat, &dat->opd[dat->currentPage]); + ShowWindow(dat->opd[dat->currentPage].hwnd, SW_SHOWNA); + + } + } + break; + } + break; + } + break; + + case WM_COMMAND: + switch(LOWORD(wParam)) { + case IDCANCEL: + { + int i; + PSHNOTIFY pshn; + pshn.hdr.idFrom=0; + pshn.lParam=(LPARAM)dat->hContact; + pshn.hdr.code=PSN_RESET; + for(i=0;ipageCount;i++) { + if(dat->opd[i].hwnd==NULL || !dat->opd[i].changed) continue; + pshn.hdr.hwndFrom=dat->opd[i].hwnd; + SendMessage(dat->opd[i].hwnd,WM_NOTIFY,0,(LPARAM)&pshn); + } + DestroyWindow(hwndDlg); + break; + } + case IDOK: + { + int i; + PSHNOTIFY pshn; + pshn.hdr.idFrom=0; + pshn.lParam=(LPARAM)dat->hContact; + if(dat->currentPage!=-1) { + pshn.hdr.code=PSN_KILLACTIVE; + pshn.hdr.hwndFrom=dat->opd[dat->currentPage].hwnd; + if(SendMessage(dat->opd[dat->currentPage].hwnd,WM_NOTIFY,0,(LPARAM)&pshn)) + break; + } + + pshn.hdr.code=PSN_APPLY; + for(i=0;ipageCount;i++) { + if(dat->opd[i].hwnd==NULL || !dat->opd[i].changed) continue; + pshn.hdr.hwndFrom=dat->opd[i].hwnd; + if(SendMessage(dat->opd[i].hwnd,WM_NOTIFY,0,(LPARAM)&pshn)==PSNRET_INVALID_NOCHANGEPAGE) { + TreeView_Select(GetDlgItem(hwndDlg,IDC_PAGETREE), dat->opd[i].hItem, TVGN_CARET); + if(dat->currentPage!=-1) ShowWindow(dat->opd[dat->currentPage].hwnd,SW_HIDE); + dat->currentPage=i; + ShowWindow(dat->opd[dat->currentPage].hwnd,SW_SHOW); + return 0; + } + } + DestroyWindow(hwndDlg); + break; + } + case IDC_UPDATE: + if(dat->infosUpdated!=NULL) {mir_free(dat->infosUpdated); dat->infosUpdated=NULL;} + if(dat->hContact != NULL) { + if (!CallContactService(dat->hContact,PSS_GETINFO,0,0)) { + EnableWindow(GetDlgItem(hwndDlg,IDC_UPDATE),FALSE); + ShowWindow(GetDlgItem(hwndDlg,IDC_UPDATING),SW_SHOW); + SetTimer(hwndDlg,1,100,NULL); + } + } + break; + } + break; + + case WM_CLOSE: + SendMessage(hwndDlg,WM_COMMAND,MAKEWPARAM(IDOK,BN_CLICKED),(LPARAM)GetDlgItem(hwndDlg,IDOK)); + break; + + case WM_DESTROY: + { + TCHAR name[128]; + TVITEM tvi; + tvi.mask = TVIF_TEXT; + tvi.hItem = dat->opd[dat->currentPage].hItem; + tvi.pszText=name; + tvi.cchTextMax=SIZEOF(name); + TreeView_GetItem(GetDlgItem(hwndDlg, IDC_PAGETREE), &tvi); + DBWriteContactSettingTString(NULL,"UserInfo","LastTab", name); + } + Window_FreeIcon_IcoLib(hwndDlg); + SendDlgItemMessage(hwndDlg,IDC_NAME,WM_SETFONT,SendDlgItemMessage(hwndDlg,IDC_WHITERECT,WM_GETFONT,0,0),0); + DeleteObject(dat->hBoldFont); + WindowList_Remove(hWindowList,hwndDlg); + UnhookEvent(dat->hProtoAckEvent); + { int i; + for(i=0;ipageCount;i++) + { + if(dat->opd[i].hwnd!=NULL) DestroyWindow(dat->opd[i].hwnd); + mir_free(dat->opd[i].ptszTitle); + mir_free(dat->opd[i].ptszTab); + } + } + mir_free(dat->infosUpdated); + mir_free(dat->opd); + mir_free(dat); + break; + } + return FALSE; +} + +int ShutdownUserInfo(WPARAM, LPARAM) +{ + WindowList_BroadcastAsync(hWindowList,WM_DESTROY,0,0); + return 0; +} + +int LoadUserInfoModule(void) +{ + CLISTMENUITEM mi = { 0 }; + + CreateServiceFunction(MS_USERINFO_SHOWDIALOG,ShowDetailsDialogCommand); + hDetailsInitEvent=CreateHookableEvent(ME_USERINFO_INITIALISE); + HookEvent(ME_USERINFO_INITIALISE,DetailsInit); + HookEvent(ME_DB_CONTACT_DELETED,UserInfoContactDelete); + HookEvent(ME_SYSTEM_PRESHUTDOWN,ShutdownUserInfo); + CreateServiceFunction(MS_USERINFO_ADDPAGE,AddDetailsPage); + + mi.cbSize = sizeof(mi); + mi.flags = CMIF_ICONFROMICOLIB; + mi.position = 1000050000; + mi.icolibItem = GetSkinIconHandle( SKINICON_OTHER_USERDETAILS ); + mi.pszName = LPGEN("User &Details"); + mi.pszService = MS_USERINFO_SHOWDIALOG; + CallService(MS_CLIST_ADDCONTACTMENUITEM,0,(LPARAM)&mi); + + mi.position = 500050000; + mi.pszName = LPGEN("View/Change My &Details..."); + CallService(MS_CLIST_ADDMAINMENUITEM,0,(LPARAM)&mi); + + hWindowList = (HANDLE)CallService(MS_UTILS_ALLOCWINDOWLIST,0,0); + return 0; +} -- cgit v1.2.3