#include "commonheaders.h" typedef struct { HICON icon; SHORT mode; } ICON_CACHE; ICON_CACHE *ICONS_CACHE = NULL; int icons_cache = 0; // ����������� mode � HICON ������� �� ����� ��������� � ����� HICON mode2icon(int mode,int type) { int m=mode&0x0f,s=(mode&SECURED)>>4,i; // ��������� �� ����� - ����� � ��������� HICON icon; if ( icons_cache ) { for(i=0;i<icons_cache;i++) { if ( ICONS_CACHE[i].mode == ((type<<8) | mode)) { return ICONS_CACHE[i].icon; } } } i=s; switch(type) { case 1: i+=IEC_CL_DIS; break; case 2: i+=ICO_CM_DIS; break; case 3: i+=ICO_MW_DIS; break; } if ( type==1 ) { icon = BindOverlayIcon(g_hIEC[i],g_hICO[ICO_OV_NAT+m]); } else { icon = BindOverlayIcon(g_hICO[i],g_hICO[ICO_OV_NAT+m]); } ICONS_CACHE = (ICON_CACHE*) mir_realloc(ICONS_CACHE,sizeof(ICON_CACHE)*(icons_cache+1)); ICONS_CACHE[icons_cache].icon = icon; ICONS_CACHE[icons_cache].mode = (type<<8) | mode; icons_cache++; return icon; } // ����������� mode � HICON ������� ����� ��������� � ����� HICON mode2icon2(int mode,int type) { return CopyIcon(mode2icon(mode,type)); } // ����������� mode � IconExtraColumn ������� �� ����� ��������� � ����� IconExtraColumn mode2iec(int mode) { int m=mode&0x0f,s=(mode&SECURED)>>4; // ��������� �� ����� - ����� � ��������� if ( mode==-1 || (!s && !bASI && m!=MODE_PGP && m!=MODE_GPG)) { return g_IEC[0]; // ������ ������ ����� } int i=1+m*IEC_CNT+IEC_CL_DIS+s; if ( g_IEC[i].hImage==(HANDLE)-1 ) { /* g_hIEC[i] = mode2icon(mode,1); g_IEC[i].hImage = (HANDLE) CallService(MS_CLIST_EXTRA_ADD_ICON, (WPARAM)g_hIEC[i], (LPARAM)0);*/ HICON icon = mode2icon(mode,1); g_IEC[i].hImage = (HANDLE) CallService(MS_CLIST_EXTRA_ADD_ICON, (WPARAM)icon, (LPARAM)0); } return g_IEC[i]; } // ��������� ������ � clist � � messagew void ShowStatusIcon(HANDLE hContact,int mode) { HANDLE hMC = getMetaContact(hContact); if ( bADV || g_hCLIcon ) { // �������� ������ � clist if ( mode!= -1 ) { IconExtraColumn iec=mode2iec(mode); if ( g_hCLIcon ) { ExtraIcon_SetIcon(g_hCLIcon, hContact, iec.hImage); if ( hMC ) ExtraIcon_SetIcon(g_hCLIcon, hMC, iec.hImage); } else { CallService(MS_CLIST_EXTRA_SET_ICON, (WPARAM)hContact, (LPARAM)&iec); if ( hMC ) CallService(MS_CLIST_EXTRA_SET_ICON, (WPARAM)hMC, (LPARAM)&iec); } } } if ( ServiceExists(MS_MSG_MODIFYICON)) { // �������� ������ � srmm StatusIconData sid; memset(&sid,0,sizeof(sid)); sid.cbSize = sizeof(sid); sid.szModule = (char*)szModuleName; for(int i=MODE_NATIVE; i<MODE_CNT;i++) { sid.dwId = i; sid.flags = (mode&SECURED)?0:MBF_DISABLED; if ( mode==-1 || (mode&0x0f)!=i || isChatRoom(hContact)) sid.flags |= MBF_HIDDEN; // ��������� ��� �������� ������ CallService(MS_MSG_MODIFYICON, (WPARAM)hContact, (LPARAM)&sid); if ( hMC ) CallService(MS_MSG_MODIFYICON, (WPARAM)hMC, (LPARAM)&sid); } } } void ShowStatusIcon(HANDLE hContact) { ShowStatusIcon(hContact,isContactSecured(hContact)); } void ShowStatusIconNotify(HANDLE hContact) { int mode = isContactSecured(hContact); NotifyEventHooks(g_hEvent[(mode&SECURED)!=0], (WPARAM)hContact, 0); ShowStatusIcon(hContact,mode); } void RefreshContactListIcons(void) { HANDLE hContact; // CallService(MS_CLUI_LISTBEGINREBUILD,0,0); if ( !g_hCLIcon ) { hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDFIRST, 0, 0); while (hContact) { // ������� ��� ��������� ShowStatusIcon(hContact,-1); hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDNEXT, (WPARAM)hContact, 0); } // ����� �������������� ������ for(int i=0;i<1+MODE_CNT*IEC_CNT;i++) { g_IEC[i].ColumnType = bADV; } } hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDFIRST, 0, 0); while (hContact) { // � ����� �������� ������ if ( isSecureProtocol(hContact)) ShowStatusIcon(hContact); hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDNEXT, (WPARAM)hContact, 0); } // CallService(MS_CLUI_LISTENDREBUILD,0,0); } // EOF