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 --- plugins/modernb/modern_extraimage.cpp | 520 ++++++++++++++++++++++++++++++++++ 1 file changed, 520 insertions(+) create mode 100644 plugins/modernb/modern_extraimage.cpp (limited to 'plugins/modernb/modern_extraimage.cpp') diff --git a/plugins/modernb/modern_extraimage.cpp b/plugins/modernb/modern_extraimage.cpp new file mode 100644 index 0000000000..e54abd2628 --- /dev/null +++ b/plugins/modernb/modern_extraimage.cpp @@ -0,0 +1,520 @@ +#include "hdr/modern_commonheaders.h" +#include "hdr/modern_commonprototypes.h" + + + +#define ExtraImageIconsIndexCount 6 + +boolean visar[EXTRACOLUMNCOUNT]; +int ExtraImageIconsIndex[ExtraImageIconsIndexCount]; +int EnabledColumnCount=0; +BOOL g_mutex_bSetAllExtraIconsCycle=0; + +static HIMAGELIST hExtraImageList=NULL; +static HIMAGELIST hWideExtraImageList=NULL; + +void ExtraImage_SetAllExtraIcons(HWND hwndList,HANDLE hContact); + +void ClearExtraIcons(); + +boolean ImageCreated=FALSE; +BYTE ExtraOrder[]= +{ + 1, // EXTRA_ICON_EMAIL + 2, // EXTRA_ICON_PROTO + 3, // EXTRA_ICON_SMS + 4, // EXTRA_ICON_ADV1 + 5, // EXTRA_ICON_ADV2 + 6, // EXTRA_ICON_WEB + 7, // EXTRA_ICON_CLIENT + 0, // EXTRA_ICON_VISMODE + 8, // EXTRA_ICON_ADV3 + 9, // EXTRA_ICON_ADV4 +}; + +BOOL HasExtraIconsService() +{ + return ServiceExists("ExtraIcon/Register"); +} + +boolean isColumnVisible(int extra) +{ + if (HasExtraIconsService()) + return true; + + int i=0; + for (i=0; i=EXTRACOLUMNCOUNT){return(-1);}; + if (to<0||to>=EXTRACOLUMNCOUNT){return(-1);}; + if (to EXTRACOLUMNCOUNT) + return -1; + else + return extra-1; + } + + int ord=ExtraOrder[extra-1]; + if (!visar[ord]) return -1; + return (colsum(0,ord)-1); +}; + +int ExtraImage_ColumnNumToExtraID(int column) +{ + if (HasExtraIconsService()) + return column+1; + + for (int i=0; ihwndContactTree==0){return(-1);}; + if (wParam==0||lParam==0){return(-1);}; + piec=(pIconExtraColumn)lParam; + + if (piec->cbSize!=sizeof(IconExtraColumn)){return(-1);}; + icol=ExtraImage_ExtraIDToColumnNum(piec->ColumnType); + if (icol==-1){return(-1);}; + hItem=(HANDLE)SendMessage(pcli->hwndContactTree,CLM_FINDCONTACT,(WPARAM)wParam,0); + if (hItem==0){return(-1);}; + + SendMessage(pcli->hwndContactTree,CLM_SETEXTRAIMAGE,(WPARAM)hItem,MAKELPARAM(icol,piec->hImage)); + return(0); +}; + +//wparam=hIcon +//return hImage on success,-1 on failure +INT_PTR AddIconToExtraImageList(WPARAM wParam,LPARAM lParam) +{ + int res=-1; + if (hExtraImageList==0||wParam==0){return(-1);}; + res=((int)ImageList_AddIcon(hExtraImageList,(HICON)wParam)); + if (res>254) return -1; + return res; +}; + + +void SetNewExtraColumnCount() +{ + int newcount; + LoadPositionsFromDB(ExtraOrder); + GetVisColumns(); + newcount=colsum(0,EXTRACOLUMNCOUNT-1); + ModernWriteSettingByte(NULL,CLUIFrameModule,"EnabledColumnCount",(BYTE)newcount); + EnabledColumnCount=newcount; + SendMessage(pcli->hwndContactTree,CLM_SETEXTRACOLUMNS,EnabledColumnCount,0); +}; + +void ExtraImage_ReloadExtraIcons() +{ + int count,i; + PROTOACCOUNT **accs; + HICON hicon; + BOOL needFree; + + SendMessage(pcli->hwndContactTree,CLM_SETEXTRACOLUMNSSPACE,ModernGetSettingByte(NULL,"CLUI","ExtraColumnSpace",18),0); + SendMessage(pcli->hwndContactTree,CLM_SETEXTRAIMAGELIST,0,(LPARAM)NULL); + if (hExtraImageList){ImageList_Destroy(hExtraImageList);}; + if (hWideExtraImageList){ImageList_Destroy(hWideExtraImageList);}; + + hExtraImageList=ImageList_Create(GetSystemMetrics(SM_CXSMICON),GetSystemMetrics(SM_CYSMICON),ILC_COLOR32|ILC_MASK,1,256); + hWideExtraImageList=ImageList_Create(GetSystemMetrics(SM_CXSMICON),GetSystemMetrics(SM_CYSMICON),ILC_COLOR32|ILC_MASK,1,256); + + if (!HasExtraIconsService()) + { + HICON hIcon; + + //loading icons + hIcon = LoadSkinnedIcon(SKINICON_OTHER_SENDEMAIL); + ExtraImageIconsIndex[0]=ImageList_AddIcon(hExtraImageList, hIcon); + CallService(MS_SKIN2_RELEASEICON, (WPARAM)hIcon, 0); + hIcon = LoadSkinnedIcon(SKINICON_OTHER_SMS); + ExtraImageIconsIndex[1]=ImageList_AddIcon(hExtraImageList, hIcon); + CallService(MS_SKIN2_RELEASEICON, (WPARAM)hIcon, 0); + hIcon = LoadSkinnedIcon(SKINICON_EVENT_URL); + ExtraImageIconsIndex[2]=ImageList_AddIcon(hExtraImageList, hIcon); + CallService(MS_SKIN2_RELEASEICON, (WPARAM)hIcon, 0); + + //calc only needed protocols + //adding protocol icons + ProtoEnumAccounts( &count, &accs ); + for(i=0;iszModuleName, PS_GETCAPS,PFLAGNUM_2, 0 )== 0) + continue; + + hIcon = LoadSkinnedProtoIcon(accs[i]->szModuleName,ID_STATUS_ONLINE); + ImageList_AddIcon(hExtraImageList, hIcon); + CallService(MS_SKIN2_RELEASEICON, (WPARAM)hIcon, 0); + } + + hicon=CLUI_LoadIconFromExternalFile("clisticons.dll",5,TRUE,TRUE,"AlwaysVis","Contact List",Translate("Always Visible"),-IDI_ALWAYSVIS,&needFree); + if (!hicon) {hicon=LoadSmallIcon(g_hInst, MAKEINTRESOURCE(IDI_ALWAYSVIS));needFree=TRUE;} + ExtraImageIconsIndex[3]=ImageList_AddIcon(hExtraImageList,hicon ); + if (needFree) DestroyIcon_protect(hicon); + + hicon=CLUI_LoadIconFromExternalFile("clisticons.dll",6,TRUE,TRUE,"NeverVis","Contact List",Translate("Never Visible"),-IDI_NEVERVIS,&needFree); + if (!hicon) {hicon=LoadSmallIcon(g_hInst, MAKEINTRESOURCE(IDI_NEVERVIS));needFree=TRUE;} + ExtraImageIconsIndex[4]=ImageList_AddIcon(hExtraImageList,hicon ); + if (needFree) DestroyIcon_protect(hicon); + + hicon=CLUI_LoadIconFromExternalFile("clisticons.dll",7,TRUE,TRUE,"ChatActivity","Contact List",Translate("Chat Activity"),-IDI_CHAT,&needFree); + if (!hicon) {hicon=LoadSmallIcon(g_hInst, MAKEINTRESOURCE(IDI_CHAT));needFree=TRUE;} + ExtraImageIconsIndex[5]=ImageList_AddIcon(hExtraImageList,hicon ); + if (needFree) DestroyIcon_protect(hicon); + } + + SendMessage(pcli->hwndContactTree,CLM_SETEXTRAIMAGELIST,(WPARAM)hWideExtraImageList,(LPARAM)hExtraImageList); + //ExtraImage_SetAllExtraIcons(hImgList); + SetNewExtraColumnCount(); + NotifyEventHooks(g_CluiData.hEventExtraImageListRebuilding,0,0); + ImageCreated=TRUE; +} + +void ReAssignExtraIcons() +{ + ClearExtraIcons(); + SetNewExtraColumnCount(); + ExtraImage_SetAllExtraIcons(pcli->hwndContactTree,0); + SendMessage(pcli->hwndContactTree,CLM_AUTOREBUILD,0,0); +} + +void ClearExtraIcons() +{ + int i; + HANDLE hContact,hItem; + + //EnabledColumnCount=DBGetContactSettingByte(NULL,CLUIFrameModule,"EnabledColumnCount",5); + //SendMessage(pcli->hwndContactTree,CLM_SETEXTRACOLUMNS,EnabledColumnCount,0); + SetNewExtraColumnCount(); + + hContact=(HANDLE)CallService(MS_DB_CONTACT_FINDFIRST,0,0); + do { + + hItem=(HANDLE)SendMessage(pcli->hwndContactTree,CLM_FINDCONTACT,(WPARAM)hContact,0); + if (hItem==0){continue;}; + for (i=0;ihwndContactTree,CLM_SETEXTRAIMAGE,(WPARAM)hItem,MAKELPARAM(i,0xFF)); + }; + + } while(hContact=(HANDLE)CallService(MS_DB_CONTACT_FINDNEXT,(WPARAM)hContact,0)); +}; + +void ExtraImage_SetAllExtraIcons(HWND hwndList,HANDLE hContact) +{ + HANDLE hItem; + int locApparentMode=0; + char * locApparentModeProto=NULL; + boolean hcontgiven=FALSE; + char *szProto; + char *(ImgIndex[64]); + int maxpr,count,i; + PROTOACCOUNT **accs; + pdisplayNameCacheEntry pdnce; + int em,pr,sms,a1,a2,w1,c1; + int tick=0; + g_mutex_bSetAllExtraIconsCycle=1; + hcontgiven=(hContact!=0); + + if (pcli->hwndContactTree==0){return;}; + tick=GetTickCount(); + if (ImageCreated==FALSE) ExtraImage_ReloadExtraIcons(); + + SetNewExtraColumnCount(); + + BOOL hasExtraIconsService = HasExtraIconsService(); + if (!hasExtraIconsService) + { + em=ExtraImage_ExtraIDToColumnNum(EXTRA_ICON_EMAIL); + pr=ExtraImage_ExtraIDToColumnNum(EXTRA_ICON_PROTO); + sms=ExtraImage_ExtraIDToColumnNum(EXTRA_ICON_SMS); + a1=ExtraImage_ExtraIDToColumnNum(EXTRA_ICON_ADV1); + a2=ExtraImage_ExtraIDToColumnNum(EXTRA_ICON_ADV2); + w1=ExtraImage_ExtraIDToColumnNum(EXTRA_ICON_WEB); + c1=ExtraImage_ExtraIDToColumnNum(EXTRA_ICON_CLIENT); + + memset( ImgIndex, 0, sizeof( ImgIndex ) ); + ProtoEnumAccounts( &count, &accs ); + maxpr=0; + //calc only needed protocols + for(i=0;iszModuleName,PS_GETCAPS,PFLAGNUM_2,0)==0) continue; + ImgIndex[maxpr]=accs[i]->szModuleName; + maxpr++; + } + } + + if (hContact==NULL) + { + hContact=(HANDLE)CallService(MS_DB_CONTACT_FINDFIRST,0,0); + } + + do { + + szProto=NULL; + hItem=hContact; + if (hItem==0){continue;}; + pdnce=(pdisplayNameCacheEntry)pcli->pfnGetCacheEntry(hItem); + if (pdnce==NULL) {continue;}; + + // szProto=(char*)CallService(MS_PROTO_GETCONTACTBASEPROTO,(WPARAM)hContact,0); + szProto=pdnce->m_cache_cszProto; + + if (!hasExtraIconsService) + { + { + boolean showweb; + showweb=FALSE; + if (ExtraImage_ExtraIDToColumnNum(EXTRA_ICON_WEB)!=-1) + { + + if (szProto != NULL) + { + char *homepage; + homepage= ModernGetStringA(pdnce->m_cache_hContact,"UserInfo", "Homepage"); + if (!homepage) + homepage= ModernGetStringA(pdnce->m_cache_hContact,pdnce->m_cache_cszProto, "Homepage"); + if (homepage!=NULL) + { + showweb=TRUE; + mir_free_and_nill(homepage); + } + } + SendMessage(hwndList,CLM_SETEXTRAIMAGE,(WPARAM)hItem,MAKELPARAM(ExtraImage_ExtraIDToColumnNum(EXTRA_ICON_WEB),(showweb)?2:0xFF)); + } + } + { + DBVARIANT dbv={0}; + boolean showemail; + showemail=TRUE; + if (ExtraImage_ExtraIDToColumnNum(EXTRA_ICON_EMAIL)!=-1) + { + + if (szProto == NULL || ModernGetSettingString(hContact, szProto, "e-mail",&dbv)) + { + ModernDBFreeVariant(&dbv); + if (ModernGetSettingString(hContact, "UserInfo", "Mye-mail0", &dbv)) + showemail=FALSE; + } + SendMessage(hwndList,CLM_SETEXTRAIMAGE,(WPARAM)hItem,MAKELPARAM(ExtraImage_ExtraIDToColumnNum(EXTRA_ICON_EMAIL),(showemail)?0:0xFF)); + ModernDBFreeVariant(&dbv); + } + } + + { + DBVARIANT dbv={0}; + boolean showsms; + showsms=TRUE; + if (ExtraImage_ExtraIDToColumnNum(EXTRA_ICON_SMS)!=-1) + { + if (szProto == NULL || ModernGetSettingString(hContact, szProto, "Cellular",&dbv)) + { + ModernDBFreeVariant(&dbv); + if (ModernGetSettingString(hContact, "UserInfo", "MyPhone0", &dbv)) + showsms=FALSE; + } + SendMessage(hwndList,CLM_SETEXTRAIMAGE,(WPARAM)hItem,MAKELPARAM(ExtraImage_ExtraIDToColumnNum(EXTRA_ICON_SMS),(showsms)?1:0xFF)); + ModernDBFreeVariant(&dbv); + } + } + + if(ExtraImage_ExtraIDToColumnNum(EXTRA_ICON_PROTO)!=-1) + { + for (i=0;iApparentMode==ID_STATUS_OFFLINE) + iconIndex=ExtraImageIconsIndex[4]; + else if (pdnce->ApparentMode==ID_STATUS_ONLINE) + { + if (szProto!=locApparentModeProto) + { + locApparentModeProto=szProto; + locApparentMode=CallProtoService(locApparentModeProto,PS_GETSTATUS,0,0); + } + if(locApparentMode == ID_STATUS_INVISIBLE || ModernGetSettingByte(NULL,"CList","AlwaysShowAlwaysVisIcon",SETTING_ALWAYSVISICON_DEFAULT) == 1) + iconIndex=ExtraImageIconsIndex[3]; } + } + else + { + if (pdnce->ApparentMode==ID_STATUS_OFFLINE) + iconIndex=ExtraImageIconsIndex[5]; + else iconIndex=255; + } + } + SendMessage(hwndList,CLM_SETEXTRAIMAGE,(WPARAM)hItem,MAKELPARAM(ExtraImage_ExtraIDToColumnNum(EXTRA_ICON_VISMODE),iconIndex)); + } + } + NotifyEventHooks(g_CluiData.hEventExtraImageApplying,(WPARAM)hContact,0); + if (hcontgiven) break; + Sleep(0); + } while(hContact=(HANDLE)CallService(MS_DB_CONTACT_FINDNEXT,(WPARAM)hContact,0)); + + tick=GetTickCount()-tick; + g_mutex_bSetAllExtraIconsCycle=0; + CLUI__cliInvalidateRect(hwndList,NULL,FALSE); + Sleep(0); +} + +HWND SetToolTip(HWND hwnd, TCHAR * tip); + +HWND tipHWND=NULL; + +static int ehhShowExtraInfoTip(WPARAM wParam, LPARAM lParam) +{ + CLCEXTRAINFOTIP * eit=(CLCEXTRAINFOTIP *)lParam; + //tipHWND=SetToolTip(eit->hwnd,_T("TEST")); + //SendMessage(tipHWND,TTM_ACTIVATE,1,0); + //SendMessage(tipHWND,TTM_POPUP,0,0); + return 1; + +} + +int ehhHideExtraInfoTip(WPARAM wParam, LPARAM lParam) +{ + + //SendMessage(tipHWND,TTM_ACTIVATE,0,0); + return 0; + +} + +INT_PTR WideSetIconForExtraColumn(WPARAM wParam,LPARAM lParam) +{ + pIconExtraColumn piec; + int icol; + HANDLE hItem; + + if (pcli->hwndContactTree==0){return(-1);}; + if (wParam==0||lParam==0){return(-1);}; + piec=(pIconExtraColumn)lParam; + + if (piec->cbSize!=sizeof(IconExtraColumn)){return(-1);}; + icol=ExtraImage_ExtraIDToColumnNum(piec->ColumnType); + if (icol==-1){return(-1);}; + + hItem=(HANDLE)SendMessage(pcli->hwndContactTree,CLM_FINDCONTACT,(WPARAM)wParam,0); + if (hItem==0){return(-1);}; + if (piec->hImage==(HANDLE)0xFF) piec->hImage=(HANDLE)0xFFFF; + + SendMessage(pcli->hwndContactTree,CLM_SETWIDEEXTRAIMAGE,(WPARAM)hItem,MAKELPARAM(icol,piec->hImage)); + return(0); +}; + +//wparam=hIcon +//return hImage on success,-1 on failure +INT_PTR WideAddIconToExtraImageList(WPARAM wParam,LPARAM lParam) +{ + int res=-1; + if (hWideExtraImageList==0||wParam==0){return(-1);}; + res=((int)ImageList_AddIcon(hWideExtraImageList,(HICON)wParam)); + if (res==0xFF) res=((int)ImageList_AddIcon(hWideExtraImageList,(HICON)wParam)); + if (res>0xFFFE) return -1; + return res; +}; +static int ehhExtraImage_UnloadModule(WPARAM wParam,LPARAM lParam) +{ + if (hExtraImageList) { ImageList_Destroy(hExtraImageList); }; + if (hWideExtraImageList) { ImageList_Destroy(hWideExtraImageList); }; + return 0; + +} +void ExtraImage_LoadModule() +{ + CreateServiceFunction(MS_CLIST_EXTRA_SET_ICON,WideSetIconForExtraColumn); + CreateServiceFunction(MS_CLIST_EXTRA_ADD_ICON,WideAddIconToExtraImageList); + + //CreateServiceFunction(MS_CLIST_EXTRA2_SET_ICON,WideSetIconForExtraColumn); + //CreateServiceFunction(MS_CLIST_EXTRA2_ADD_ICON,WideAddIconToExtraImageList); + + + + //HookEvent(ME_SKIN2_ICONSCHANGED,OnIconLibIconChanged); + + ModernHookEvent(ME_CLC_SHOWEXTRAINFOTIP, ehhShowExtraInfoTip ); + ModernHookEvent(ME_CLC_HIDEINFOTIP, ehhHideExtraInfoTip ); + ModernHookEvent(ME_SYSTEM_SHUTDOWN, ehhExtraImage_UnloadModule ); +}; + + + + + -- cgit v1.2.3