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_statusbar.cpp | 1152 ++++++++++++++++++++++++++++++++++ 1 file changed, 1152 insertions(+) create mode 100644 plugins/modernb/modern_statusbar.cpp (limited to 'plugins/modernb/modern_statusbar.cpp') diff --git a/plugins/modernb/modern_statusbar.cpp b/plugins/modernb/modern_statusbar.cpp new file mode 100644 index 0000000000..b3af74e802 --- /dev/null +++ b/plugins/modernb/modern_statusbar.cpp @@ -0,0 +1,1152 @@ +#include "hdr/modern_commonheaders.h" +#include "hdr/modern_statusbar.h" +#include "./m_api/m_skin_eng.h" +#include "hdr/modern_commonprototypes.h" +#include "hdr/modern_clcpaint.h" +#include "hdr/modern_sync.h" + +BOOL tooltipshoing; +POINT lastpnt; + +#define TM_STATUSBAR 23435234 +#define TM_STATUSBARHIDE 23435235 + +HWND hModernStatusBar=NULL; +HANDLE hFramehModernStatusBar=NULL; +extern void ApplyViewMode(const char *Name, bool onlySelector = false ); +extern void SaveViewMode(const char *name, const TCHAR *szGroupFilter, const char *szProtoFilter, DWORD statusMask, DWORD stickyStatusMask, unsigned int options, unsigned int stickies, unsigned int operators, unsigned int lmdat); + +//int FindFrameID(HWND FrameHwnd); +COLORREF sttGetColor(char * module, char * color, COLORREF defColor); + +#define DBFONTF_BOLD 1 +#define DBFONTF_ITALIC 2 +#define DBFONTF_UNDERLINE 4 + +typedef struct _ProtoItemData +{ + HICON icon; + HICON extraIcon; + int iconIndex; + char * ProtoName; + char * AccountName; + int ProtoStatus; + TCHAR *ProtoHumanName; + char *ProtoEMailCount; + char * ProtoStatusText; + TCHAR * ProtoXStatus; + int ProtoPos; + int fullWidth; + RECT protoRect; + BOOL DoubleIcons; + + BYTE showProtoIcon; + BYTE showProtoName; + BYTE showStatusName; + BYTE xStatusMode; // 0-only main, 1-xStatus, 2-main as overlay + BYTE connectingIcon; + BYTE showProtoEmails; + BYTE SBarRightClk; + int PaddingLeft; + int PaddingRight; + + bool isDimmed; + +} ProtoItemData; + +ProtoItemData *ProtosData=NULL; +int allocedItemData=0; +STATUSBARDATA g_StatusBarData={0}; + + +char * ApendSubSetting(char * buf, int size, char *first, char *second) +{ + _snprintf(buf,size,"%sFont%s",first,second); + return buf; +} + +int LoadStatusBarData() +{ + g_StatusBarData.perProtoConfig=ModernGetSettingByte(NULL,"CLUI","SBarPerProto",SETTING_SBARPERPROTO_DEFAULT); + g_StatusBarData.showProtoIcon=ModernGetSettingByte(NULL,"CLUI","SBarShow",SETTING_SBARSHOW_DEFAULT)&1; + g_StatusBarData.showProtoName=ModernGetSettingByte(NULL,"CLUI","SBarShow",SETTING_SBARSHOW_DEFAULT)&2; + g_StatusBarData.showStatusName=ModernGetSettingByte(NULL,"CLUI","SBarShow",SETTING_SBARSHOW_DEFAULT)&4; + g_StatusBarData.xStatusMode=(BYTE)(ModernGetSettingByte(NULL,"CLUI","ShowXStatus",SETTING_SHOWXSTATUS_DEFAULT)); + g_StatusBarData.connectingIcon=ModernGetSettingByte(NULL,"CLUI","UseConnectingIcon",SETTING_USECONNECTINGICON_DEFAULT); + g_StatusBarData.showProtoEmails=ModernGetSettingByte(NULL,"CLUI","ShowUnreadEmails",SETTING_SHOWUNREADEMAILS_DEFAULT); + g_StatusBarData.SBarRightClk=ModernGetSettingByte(NULL,"CLUI","SBarRightClk",SETTING_SBARRIGHTCLK_DEFAULT); + + g_StatusBarData.nProtosPerLine=ModernGetSettingByte(NULL,"CLUI","StatusBarProtosPerLine",SETTING_PROTOSPERLINE_DEFAULT); + g_StatusBarData.Align=ModernGetSettingByte(NULL,"CLUI","Align",SETTING_ALIGN_DEFAULT); + g_StatusBarData.VAlign=ModernGetSettingByte(NULL,"CLUI","VAlign",SETTING_VALIGN_DEFAULT); + g_StatusBarData.sameWidth=ModernGetSettingByte(NULL,"CLUI","EqualSections",SETTING_EQUALSECTIONS_DEFAULT); + g_StatusBarData.rectBorders.left=ModernGetSettingDword(NULL,"CLUI","LeftOffset",SETTING_LEFTOFFSET_DEFAULT); + g_StatusBarData.rectBorders.right=ModernGetSettingDword(NULL,"CLUI","RightOffset",SETTING_RIGHTOFFSET_DEFAULT); + g_StatusBarData.rectBorders.top=ModernGetSettingDword(NULL,"CLUI","TopOffset",SETTING_TOPOFFSET_DEFAULT); + g_StatusBarData.rectBorders.bottom=ModernGetSettingDword(NULL,"CLUI","BottomOffset",SETTING_BOTTOMOFFSET_DEFAULT); + g_StatusBarData.extraspace=(BYTE)ModernGetSettingDword(NULL,"CLUI","SpaceBetween",SETTING_SPACEBETWEEN_DEFAULT); + + if (g_StatusBarData.BarFont) DeleteObject(g_StatusBarData.BarFont); + g_StatusBarData.BarFont=NULL;//LoadFontFromDB("ModernData","StatusBar",&g_StatusBarData.fontColor); + { + int vis=ModernGetSettingByte(NULL,"CLUI","ShowSBar",SETTING_SHOWSBAR_DEFAULT); + int frameopt; + int frameID=Sync( FindFrameID, hModernStatusBar ); + frameopt=CallService(MS_CLIST_FRAMES_GETFRAMEOPTIONS,MAKEWPARAM(FO_FLAGS,frameID),0); + frameopt=frameopt & (~F_VISIBLE); + if(vis) + { + ShowWindow(hModernStatusBar,SW_SHOW); + frameopt|=F_VISIBLE; + } + else + { + ShowWindow(hModernStatusBar,SW_HIDE); + }; + CallService(MS_CLIST_FRAMES_SETFRAMEOPTIONS,MAKEWPARAM(FO_FLAGS,frameID),frameopt); + } + g_StatusBarData.TextEffectID=ModernGetSettingByte(NULL,"StatusBar","TextEffectID",SETTING_TEXTEFFECTID_DEFAULT); + g_StatusBarData.TextEffectColor1=ModernGetSettingDword(NULL,"StatusBar","TextEffectColor1",SETTING_TEXTEFFECTCOLOR1_DEFAULT); + g_StatusBarData.TextEffectColor2=ModernGetSettingDword(NULL,"StatusBar","TextEffectColor2",SETTING_TEXTEFFECTCOLOR2_DEFAULT); + + if(g_StatusBarData.hBmpBackground) {DeleteObject(g_StatusBarData.hBmpBackground); g_StatusBarData.hBmpBackground=NULL;} + + if (g_CluiData.fDisableSkinEngine) + { + DBVARIANT dbv; + g_StatusBarData.bkColour=sttGetColor("StatusBar","BkColour",CLCDEFAULT_BKCOLOUR); + if(ModernGetSettingByte(NULL,"StatusBar","UseBitmap",CLCDEFAULT_USEBITMAP)) { + if(!ModernGetSettingString(NULL,"StatusBar","BkBitmap",&dbv)) { + g_StatusBarData.hBmpBackground=(HBITMAP)CallService(MS_UTILS_LOADBITMAP,0,(LPARAM)dbv.pszVal); + ModernDBFreeVariant(&dbv); + } + } + g_StatusBarData.bkUseWinColors=ModernGetSettingByte(NULL,"StatusBar", "UseWinColours", CLCDEFAULT_USEWINDOWSCOLOURS); + g_StatusBarData.backgroundBmpUse=ModernGetSettingWord(NULL,"StatusBar","BkBmpUse",CLCDEFAULT_BKBMPUSE); + } + SendMessage(pcli->hwndContactList,WM_SIZE,0,0); + + return 1; +} + +int BgStatusBarChange(WPARAM wParam,LPARAM lParam) +{ + if (MirandaExiting()) return 0; + LoadStatusBarData(); + return 0; +} + +//ProtocolData; +int NewStatusPaintCallbackProc(HWND hWnd, HDC hDC, RECT * rcPaint, HRGN rgn, DWORD dFlags, void * CallBackData) +{ + return ModernDrawStatusBar(hWnd,hDC); +} + +int ModernDrawStatusBar(HWND hwnd, HDC hDC) +{ + if (hwnd==(HWND)-1) return 0; + if (GetParent(hwnd)==pcli->hwndContactList) + return ModernDrawStatusBarWorker(hwnd,hDC); + else + CLUI__cliInvalidateRect(hwnd,NULL,FALSE); + return 0; +} + +int ModernDrawStatusBarWorker(HWND hWnd, HDC hDC) +{ + int line; + int iconHeight=GetSystemMetrics(SM_CYSMICON)+2; + int protosperline=0; + int visProtoCount=0; + int protoCount; + int SumWidth=0; + int rectwidth=0; + int aligndx=0; + int * ProtoWidth=NULL; + int i,j,po=0; + + char servName[40]; + char protoNameExt[40]; + // Count visible protos + PROTOACCOUNT **accs; + RECT rc; + HFONT hOldFont; + int iconY, textY; + int spaceWidth; + int maxwidth=0; + int xstatus=0; + SIZE textSize={0}; + GetClientRect(hWnd,&rc); + if (g_CluiData.fDisableSkinEngine) + { + if (g_StatusBarData.bkUseWinColors && xpt_IsThemed(g_StatusBarData.hTheme)) + { + xpt_DrawTheme(g_StatusBarData.hTheme, hWnd, hDC, 0, 0, &rc, &rc); + } + else + DrawBackGround(hWnd, hDC, g_StatusBarData.hBmpBackground, g_StatusBarData.bkColour, g_StatusBarData.backgroundBmpUse ); + } + else + { + SkinDrawGlyph(hDC,&rc,&rc,"Main,ID=StatusBar"); //TBD + } + g_StatusBarData.nProtosPerLine=ModernGetSettingByte(NULL,"CLUI","StatusBarProtosPerLine",SETTING_PROTOSPERLINE_DEFAULT); + hOldFont=g_clcPainter.ChangeToFont(hDC,NULL,FONTID_STATUSBAR_PROTONAME,NULL); + + // hOldFont=SelectObject(hDC,g_StatusBarData.BarFont); + // SetTextColor(hDC,g_StatusBarData.fontColor); + { + + GetTextExtentPoint32A(hDC," ",1,&textSize); + spaceWidth=textSize.cx; + textY=rc.top+((rc.bottom-rc.top-textSize.cy)>>1); + } + iconY=rc.top+((rc.bottom-rc.top-GetSystemMetrics(SM_CXSMICON))>>1); + + { + ProtoEnumAccounts( &protoCount, &accs ); + if (allocedItemData && ProtosData) + { + int k; + + for (k=0; kpfnGetAccountIndexByPos(j); + if (i==-1) + vis=FALSE; + else + vis=pcli->pfnGetProtocolVisibility(accs[i]->szModuleName); + if (!vis) continue; + + mir_snprintf(buf, SIZEOF(buf), "SBarAccountIsCustom_%s", accs[i]->szModuleName); + + if (g_StatusBarData.perProtoConfig && ModernGetSettingByte(NULL, "CLUI", buf, SETTING_SBARACCOUNTISCUSTOM_DEFAULT)) + { + mir_snprintf(buf, SIZEOF(buf), "HideAccount_%s", accs[i]->szModuleName); + if (ModernGetSettingByte(NULL, "CLUI", buf, SETTING_SBARHIDEACCOUNT_DEFAULT)) + continue; + + mir_snprintf(buf, SIZEOF(buf), "SBarShow_%s", accs[i]->szModuleName); + { + BYTE showOps = ModernGetSettingByte(NULL,"CLUI", buf, SETTING_SBARSHOW_DEFAULT); + ProtosData[visProtoCount].showProtoIcon = showOps&1; + ProtosData[visProtoCount].showProtoName = showOps&2; + ProtosData[visProtoCount].showStatusName = showOps&4; + } + + mir_snprintf(buf, SIZEOF(buf), "ShowXStatus_%s", accs[i]->szModuleName); + ProtosData[visProtoCount].xStatusMode = ModernGetSettingByte(NULL,"CLUI", buf, SETTING_SBARSHOW_DEFAULT); + + mir_snprintf(buf, SIZEOF(buf), "UseConnectingIcon_%s", accs[i]->szModuleName); + ProtosData[visProtoCount].connectingIcon = ModernGetSettingByte(NULL,"CLUI", buf, SETTING_USECONNECTINGICON_DEFAULT); + + mir_snprintf(buf, SIZEOF(buf), "ShowUnreadEmails_%s", accs[i]->szModuleName); + ProtosData[visProtoCount].showProtoEmails = ModernGetSettingByte(NULL,"CLUI", buf, SETTING_SHOWUNREADEMAILS_DEFAULT); + + mir_snprintf(buf, SIZEOF(buf), "SBarRightClk_%s", accs[i]->szModuleName); + ProtosData[visProtoCount].SBarRightClk = ModernGetSettingByte(NULL,"CLUI", buf, SETTING_SBARRIGHTCLK_DEFAULT); + + mir_snprintf(buf, SIZEOF(buf), "PaddingLeft_%s", accs[i]->szModuleName); + ProtosData[visProtoCount].PaddingLeft = ModernGetSettingDword(NULL,"CLUI", buf, SETTING_PADDINGLEFT_DEFAULT); + + mir_snprintf(buf, SIZEOF(buf), "PaddingRight_%s", accs[i]->szModuleName); + ProtosData[visProtoCount].PaddingRight = ModernGetSettingDword(NULL,"CLUI", buf, SETTING_PADDINGRIGHT_DEFAULT); + } + else + { + ProtosData[visProtoCount].showProtoIcon = g_StatusBarData.showProtoIcon; + ProtosData[visProtoCount].showProtoName = g_StatusBarData.showProtoName; + ProtosData[visProtoCount].showStatusName = g_StatusBarData.showStatusName; + ProtosData[visProtoCount].xStatusMode = g_StatusBarData.xStatusMode; + ProtosData[visProtoCount].connectingIcon = g_StatusBarData.connectingIcon; + ProtosData[visProtoCount].showProtoEmails = g_StatusBarData.showProtoEmails; + ProtosData[visProtoCount].SBarRightClk = 0; + ProtosData[visProtoCount].PaddingLeft = 0; + ProtosData[visProtoCount].PaddingRight = 0; + } + + ProtosData[visProtoCount].ProtoStatus = CallProtoService(accs[i]->szModuleName,PS_GETSTATUS,0,0); + + ProtosData[visProtoCount].ProtoEMailCount = NULL; + if (ProtosData[visProtoCount].ProtoStatus > ID_STATUS_OFFLINE) + { + // create service name + mir_snprintf(servName, SIZEOF(servName), "%s/GetUnreadEmailCount", accs[i]->szModuleName); + if (ProtosData[visProtoCount].showProtoEmails == 1 && ServiceExists(servName)) + { + mir_snprintf(protoNameExt, SIZEOF(protoNameExt),"[%d]", (int) CallService(servName, 0, 0)); + ProtosData[visProtoCount].ProtoEMailCount = mir_strdup(protoNameExt); + } + } + + ProtosData[visProtoCount].ProtoHumanName = mir_tstrdup(accs[i]->tszAccountName); + ProtosData[visProtoCount].AccountName = mir_strdup(accs[i]->szModuleName); + ProtosData[visProtoCount].ProtoName = mir_strdup(accs[i]->szProtoName); + ProtosData[visProtoCount].ProtoStatusText = mir_strdup((char*)CallService(MS_CLIST_GETSTATUSMODEDESCRIPTION,(WPARAM)ProtosData[visProtoCount].ProtoStatus,0)); + ProtosData[visProtoCount].ProtoPos = visProtoCount; + + ProtosData[visProtoCount].isDimmed = 0; + if(g_CluiData.bFilterEffective & CLVM_FILTER_PROTOS) + { + char szTemp[2048]; + mir_snprintf(szTemp, SIZEOF(szTemp), "%s|", ProtosData[visProtoCount].AccountName ); + ProtosData[visProtoCount].isDimmed = strstr(g_CluiData.protoFilter, szTemp) ? 0 : 1; + } + + visProtoCount++; + allocedItemData++; + } + + // Calculate rects + + //START MULTILINE HERE + { + int orig_protoCount=protoCount; + int orig_visProtoCount=visProtoCount; + ProtoItemData * orig_ProtosData=ProtosData; + int linecount; + if (g_StatusBarData.nProtosPerLine) + protosperline=g_StatusBarData.nProtosPerLine; + else if (orig_visProtoCount) + protosperline=orig_visProtoCount; + else if (protoCount) + { + protosperline=protoCount; + orig_visProtoCount=protoCount; + } + else + { + protosperline=1; + orig_visProtoCount=1; + } + protosperline=min(protosperline,orig_visProtoCount); + linecount=protosperline ? (orig_visProtoCount+(protosperline-1))/protosperline : 1; //divide with rounding to up + for (line=0; line (rc.bottom - rc.top)) + { + rowheight = (rc.bottom - rc.top) / linecount; + height=(rowheight*linecount); + } + + rowsdy=((rc.bottom-rc.top)-height)/2; + if (rowheight*(line)+rowsdyrc.bottom+rowheight) + { + ProtosData=orig_ProtosData; + break; + } + if (g_StatusBarData.VAlign == 0) //top + { + rc.bottom=rc.top+rowheight*(line+1); + rc.top=rc.top+rowheight*line+1; + } + else if (g_StatusBarData.VAlign == 1) //center + { + rc.bottom=rc.top+rowsdy+rowheight*(line+1); + rc.top=rc.top+rowsdy+rowheight*line+1; + } + else if (g_StatusBarData.VAlign == 2) //bottom + { + rc.top=rc.bottom - (rowheight*(linecount - line)); + rc.bottom=rc.bottom - (rowheight*(linecount - line - 1)+1); + } + + textY=rc.top+(((rc.bottom-rc.top)-textSize.cy)/2); + iconY=rc.top+(((rc.bottom-rc.top)-iconHeight)/2); + + { //Code for each line + { + DWORD sw; + rectwidth=rc.right-rc.left-g_StatusBarData.rectBorders.left-g_StatusBarData.rectBorders.right; + if (visProtoCount>1) sw=(rectwidth-(g_StatusBarData.extraspace*(visProtoCount-1)))/visProtoCount; + else sw=rectwidth; + if (ProtoWidth) mir_free_and_nill(ProtoWidth); + ProtoWidth=(int*)mir_alloc(sizeof(int)*visProtoCount); + for (i=0; iID_STATUS_OFFLINE) + { + char str[MAXMODULELABELLENGTH]; + mir_snprintf(str, SIZEOF(str), "%s/GetXStatus", ProtosData[i].AccountName); + if (ServiceExists(str)) + { + char * dbTitle="XStatusName"; + char * dbTitle2=NULL; + xstatus=CallProtoService(ProtosData[i].AccountName,"/GetXStatus",(WPARAM)&dbTitle,(LPARAM)&dbTitle2); + if (dbTitle && xstatus) + { + DBVARIANT dbv={0}; + if (!ModernGetSettingTString(NULL,ProtosData[i].AccountName,dbTitle,&dbv)) + { + ProtosData[i].ProtoXStatus=mir_tstrdup(dbv.ptszVal); + //mir_free_and_nill(dbv.ptszVal); + ModernDBFreeVariant(&dbv); + } + } + } + } + if ((ProtosData[i].xStatusMode&3)) + { + if (ProtosData[i].ProtoStatus>ID_STATUS_OFFLINE) + { + char str[MAXMODULELABELLENGTH]; + mir_snprintf(str, SIZEOF(str), "%s/GetXStatusIcon", ProtosData[i].AccountName); + if (ServiceExists(str)) + ProtosData[i].extraIcon=(HICON)CallService(str,0,0); + if (ProtosData[i].extraIcon && (ProtosData[i].xStatusMode&3)==3) + w+=GetSystemMetrics(SM_CXSMICON)+1; + + } + } + } + + if (ProtosData[i].showProtoName) + { + GetTextExtentPoint32(hDC,ProtosData[i].ProtoHumanName,lstrlen(ProtosData[i].ProtoHumanName),&textSize); + w += textSize.cx + 3 + spaceWidth; + } + + if (ProtosData[i].showProtoEmails && ProtosData[i].ProtoEMailCount ) + { + GetTextExtentPoint32A(hDC,ProtosData[i].ProtoEMailCount,lstrlenA(ProtosData[i].ProtoEMailCount),&textSize); + w+=textSize.cx+3+spaceWidth; + } + + if (ProtosData[i].showStatusName) + { + GetTextExtentPoint32A(hDC,ProtosData[i].ProtoStatusText,lstrlenA(ProtosData[i].ProtoStatusText),&textSize); + w += textSize.cx + 3 + spaceWidth; + } + + if ((ProtosData[i].xStatusMode&8) && ProtosData[i].ProtoXStatus) + { + GetTextExtentPoint32(hDC,ProtosData[i].ProtoXStatus,lstrlen(ProtosData[i].ProtoXStatus),&textSize); + w += textSize.cx + 3 + spaceWidth; + } + + if ( ( ProtosData[i].showProtoName) || + (ProtosData[i].showProtoEmails && ProtosData[i].ProtoEMailCount ) || + (ProtosData[i].showStatusName) || + ((ProtosData[i].xStatusMode&8) && ProtosData[i].ProtoXStatus) ) + w -= spaceWidth; + + ProtosData[i].fullWidth=w; + if (g_StatusBarData.sameWidth) + { + ProtoWidth[i]=sw; + SumWidth+=w; + } + else + { + ProtoWidth[i]=w; + SumWidth+=w; + } + } + + // Reposition rects + for(i=0; imaxwidth) maxwidth=ProtoWidth[i]; + + if (g_StatusBarData.sameWidth) + { + for (i=0; irectwidth) + { + float f=(float)rectwidth/SumWidth; + //dx=(int)(0.5+(float)dx/visProtoCount); + //SumWidth-=dx*visProtoCount; + SumWidth=0; + for (i=0; i>1; + else if (g_StatusBarData.Align==2) //right + aligndx=(rectwidth-SumWidth); + // Draw in rects + //ske_SelectTextEffect(hDC,g_StatusBarData.TextEffectID,g_StatusBarData.TextEffectColor1,g_StatusBarData.TextEffectColor2); + { + RECT r=rc; +// r.top+=g_StatusBarData.rectBorders.top; +// r.bottom-=g_StatusBarData.rectBorders.bottom; + r.left+=g_StatusBarData.rectBorders.left+aligndx; + for (i=0; i< visProtoCount; i++) + { + HRGN rgn; + int x = r.left; + HICON hIcon=NULL; + HICON hxIcon=NULL; + BOOL NeedDestroy=FALSE; + x = r.left; + x += ProtosData[i].PaddingLeft; + r.right=r.left+ProtoWidth[i]; + + if ( ProtosData[i].showProtoIcon ) + { + if (ProtosData[i].ProtoStatus>ID_STATUS_OFFLINE && ((ProtosData[i].xStatusMode)&3)>0) + { + char str[MAXMODULELABELLENGTH]; + mir_snprintf(str, SIZEOF(str), "%s/GetXStatusIcon", ProtosData[i].AccountName); + if (ServiceExists(str)) + { + hxIcon=ProtosData[i].extraIcon; + if (hxIcon) + { + if (((ProtosData[i].xStatusMode)&3)==2) + { + hIcon=GetMainStatusOverlay(ProtosData[i].ProtoStatus); + NeedDestroy=TRUE; + } + else if (((ProtosData[i].xStatusMode)&3)==1) + { + hIcon=hxIcon; + NeedDestroy=TRUE; + hxIcon=NULL; + } + + } + } + } + if (hIcon==NULL && (hxIcon==NULL || (((ProtosData[i].xStatusMode)&3)==3))) + { + if (hIcon==NULL && (ProtosData[i].connectingIcon==1) && ProtosData[i].ProtoStatus>=ID_STATUS_CONNECTING&&ProtosData[i].ProtoStatus<=ID_STATUS_CONNECTING+MAX_CONNECT_RETRIES) + { + hIcon=(HICON)CLUI_GetConnectingIconService((WPARAM)ProtosData[i].AccountName,0); + if (hIcon) NeedDestroy=TRUE; + else hIcon=LoadSkinnedProtoIcon(ProtosData[i].AccountName,ProtosData[i].ProtoStatus); + } + else hIcon=LoadSkinnedProtoIcon(ProtosData[i].AccountName,ProtosData[i].ProtoStatus); + } + + + rgn=CreateRectRgn(r.left,r.top,r.right,r.bottom); + // + { + if (g_StatusBarData.sameWidth) + { + int fw=ProtosData[i].fullWidth; + int rw=r.right-r.left; + if (g_StatusBarData.Align==1) + { + x=r.left+((rw-fw)/2); + } + else if (g_StatusBarData.Align==2) + { + x=r.left+((rw-fw)); + } + else x=r.left; + } + } + + + SelectClipRgn(hDC,rgn); + ProtosData[i].DoubleIcons=FALSE; + + DWORD dim = ProtosData[i].isDimmed ? ( ( 64<<24 ) | 0x80 ) : 0; + + if ((ProtosData[i].xStatusMode&3)==3) + { + if (hIcon) mod_DrawIconEx_helper(hDC,x,iconY,hIcon,GetSystemMetrics(SM_CXSMICON),GetSystemMetrics(SM_CYSMICON),0,NULL, DI_NORMAL|dim ); + if (hxIcon) + { + mod_DrawIconEx_helper(hDC,x+GetSystemMetrics(SM_CXSMICON)+1,iconY,hxIcon,GetSystemMetrics(SM_CXSMICON),GetSystemMetrics(SM_CYSMICON),0,NULL,DI_NORMAL|dim); + x+=GetSystemMetrics(SM_CXSMICON)+1; + } + ProtosData[i].DoubleIcons=hIcon&&hxIcon; + } + else + { + if (hxIcon) mod_DrawIconEx_helper(hDC,x,iconY,hxIcon,GetSystemMetrics(SM_CXSMICON),GetSystemMetrics(SM_CYSMICON),0,NULL,DI_NORMAL|dim); + if (hIcon) mod_DrawIconEx_helper(hDC,x,iconY,hIcon,GetSystemMetrics(SM_CXSMICON),GetSystemMetrics(SM_CYSMICON),0,NULL,DI_NORMAL| ((hxIcon&&(ProtosData[i].xStatusMode&4))?(192<<24):0 ) | dim ); + } + + if ( ( hxIcon || hIcon) && TRUE /* TODO g_StatusBarData.bDrawLockOverlay options to draw locked proto*/ ) + { + if ( ModernGetSettingByte( NULL,ProtosData[i].AccountName,"LockMainStatus",0 ) ) + { + HICON hLockOverlay = LoadSkinnedIcon(SKINICON_OTHER_STATUS_LOCKED); + if (hLockOverlay != NULL) + { + mod_DrawIconEx_helper(hDC, x, iconY, hLockOverlay, GetSystemMetrics(SM_CXSMICON),GetSystemMetrics(SM_CYSMICON),0,NULL,DI_NORMAL | dim); + CallService(MS_SKIN2_RELEASEICON, (WPARAM)hLockOverlay, 0); } + } + } + if (hxIcon) DestroyIcon_protect(hxIcon); + if (NeedDestroy) DestroyIcon_protect(hIcon); + else CallService(MS_SKIN2_RELEASEICON, (WPARAM)hIcon, 0); + x+=GetSystemMetrics(SM_CXSMICON)+1; + } + if (ProtosData[i].showProtoName) + { + SIZE textSize; + RECT rt=r; + rt.left=x+(spaceWidth>>1); + rt.top=textY; + ske_DrawText(hDC,ProtosData[i].ProtoHumanName,lstrlen(ProtosData[i].ProtoHumanName),&rt,0); + + if ((ProtosData[i].showProtoEmails && ProtosData[i].ProtoEMailCount!=NULL) || ProtosData[i].showStatusName || ((ProtosData[i].xStatusMode&8) && ProtosData[i].ProtoXStatus)) + { + GetTextExtentPoint32(hDC, ProtosData[i].ProtoHumanName, lstrlen(ProtosData[i].ProtoHumanName), &textSize); + x += textSize.cx + 3; + } + } + + if (ProtosData[i].showProtoEmails && ProtosData[i].ProtoEMailCount!=NULL) + { + SIZE textSize; + RECT rt=r; + rt.left=x+(spaceWidth>>1); + rt.top=textY; + ske_DrawTextA(hDC,ProtosData[i].ProtoEMailCount,lstrlenA(ProtosData[i].ProtoEMailCount),&rt,0); + //TextOutS(hDC,x,textY,ProtosData[i].ProtoName,lstrlenA(ProtosData[i].ProtoName)); + if (ProtosData[i].showStatusName || ((ProtosData[i].xStatusMode&8) && ProtosData[i].ProtoXStatus)) + { + GetTextExtentPoint32A(hDC,ProtosData[i].ProtoEMailCount,lstrlenA(ProtosData[i].ProtoEMailCount),&textSize); + x+=textSize.cx+3; + } + } + + if (ProtosData[i].showStatusName) + { + SIZE textSize; + RECT rt=r; + rt.left=x+(spaceWidth>>1); + rt.top=textY; + ske_DrawTextA(hDC, ProtosData[i].ProtoStatusText, lstrlenA(ProtosData[i].ProtoStatusText),&rt,0); + if (((ProtosData[i].xStatusMode&8) && ProtosData[i].ProtoXStatus)) + { + GetTextExtentPoint32A(hDC,ProtosData[i].ProtoStatusText,lstrlenA(ProtosData[i].ProtoStatusText),&textSize); + x+=textSize.cx+3; + } + //TextOutS(hDC,x,textY,ProtosData[i].ProtoStatusText,lstrlenA(ProtosData[i].ProtoStatusText)); + } + + if ((ProtosData[i].xStatusMode&8) && ProtosData[i].ProtoXStatus) + { + RECT rt=r; + rt.left=x+(spaceWidth>>1); + rt.top=textY; + ske_DrawText(hDC,ProtosData[i].ProtoXStatus,lstrlen(ProtosData[i].ProtoXStatus),&rt,0); + //TextOutS(hDC,x,textY,ProtosData[i].ProtoStatusText,lstrlenA(ProtosData[i].ProtoStatusText)); + } + + ProtosData[i].protoRect=r; + + r.left=r.right+g_StatusBarData.extraspace; + //SelectClipRgn(hDC,NULL); + DeleteObject(rgn); + + } + } + + if (ProtoWidth) mir_free_and_nill(ProtoWidth); + } //code for each line + ProtosData=orig_ProtosData; + } + } + } + + SelectObject(hDC,hOldFont); + ske_ResetTextEffect(hDC); + return 0; +} + +static BOOL _ModernStatus_OnExtraIconClick( int protoIndex ) +{ + /** FIXME + Create Protocol services and + move This portion of code to related Protocols + */ + + if ( !mir_strcmpi( ProtosData[protoIndex].ProtoName, "ICQ" ) ) + { + if ( ProtosData[protoIndex].ProtoStatus < ID_STATUS_ONLINE ) return FALSE; + + HMENU hMainStatusMenu = (HMENU)CallService(MS_CLIST_MENUGETSTATUS,0,0); + if ( !hMainStatusMenu ) return FALSE; + + HMENU hProtoStatusMenu = GetSubMenu( hMainStatusMenu, protoIndex ); + if ( !hProtoStatusMenu ) return FALSE; + + int extraStatusMenuIndex = 1; + HMENU hExtraStatusMenu = GetSubMenu( hProtoStatusMenu, extraStatusMenuIndex ); + if ( !hExtraStatusMenu ) return FALSE; + + POINT pt; GetCursorPos( &pt ); + { + HWND hWnd = (HWND) CallService( MS_CLUI_GETHWND, 0 ,0 ); + TrackPopupMenu( hExtraStatusMenu, TPM_TOPALIGN|TPM_LEFTALIGN|TPM_LEFTBUTTON, pt.x, pt.y, 0, hWnd, NULL ); + } + return TRUE; + } + else if ( !mir_strcmpi( ProtosData[protoIndex].ProtoName, "JABBER" ) ) + { + if ( ProtosData[protoIndex].ProtoStatus < ID_STATUS_ONLINE ) return FALSE; + // Show Moods + char szService[128]; + mir_snprintf(szService, SIZEOF(szService), "%s/AdvStatusSet/Mood", ProtosData[protoIndex].AccountName ); + if ( ServiceExists( szService ) ) + { + CallService( szService, 0 ,0 ); + return TRUE; + } + } + return FALSE; +} + +#define TOOLTIP_TOLERANCE 5 +LRESULT CALLBACK ModernStatusProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam) +{ + static POINT ptToolTipShow={0}; + switch (msg) + { + case WM_CREATE: + g_StatusBarData.hTheme=xpt_AddThemeHandle(hwnd,L"STATUS"); + break; + case WM_DESTROY: + xpt_FreeThemeForWindow(hwnd); + if (allocedItemData && ProtosData) + { + int k; + + for (k=0; khwndContactList) + InvalidateRect(hwnd,NULL,FALSE); + return DefWindowProc(hwnd, msg, wParam, lParam); + case WM_ERASEBKGND: + return 1; + case WM_PAINT: + if (GetParent(hwnd)==pcli->hwndContactList && g_CluiData.fLayered) + CallService(MS_SKINENG_INVALIDATEFRAMEIMAGE,(WPARAM)hwnd,0); + else if (GetParent(hwnd)==pcli->hwndContactList && !g_CluiData.fLayered) + { + HDC hdc, hdc2; + HBITMAP hbmp,hbmpo; + RECT rc={0}; + GetClientRect(hwnd,&rc); + rc.right++; + rc.bottom++; + hdc = GetDC(hwnd); + hdc2=CreateCompatibleDC(hdc); + hbmp=ske_CreateDIB32(rc.right,rc.bottom); + hbmpo=(HBITMAP)SelectObject(hdc2,hbmp); + SetBkMode(hdc2,TRANSPARENT); + ske_BltBackImage(hwnd,hdc2,&rc); + ModernDrawStatusBarWorker(hwnd,hdc2); + BitBlt(hdc,rc.left,rc.top,rc.right-rc.left,rc.bottom-rc.top, + hdc2,rc.left,rc.top,SRCCOPY); + SelectObject(hdc2,hbmpo); + DeleteObject(hbmp); + mod_DeleteDC(hdc2); + + SelectObject(hdc,GetStockObject(DEFAULT_GUI_FONT)); + ReleaseDC(hwnd,hdc); + ValidateRect(hwnd,NULL); + } + else + { + HDC hdc, hdc2; + HBITMAP hbmp, hbmpo; + RECT rc; + PAINTSTRUCT ps; + HBRUSH br=GetSysColorBrush(COLOR_3DFACE); + GetClientRect(hwnd,&rc); + hdc=BeginPaint(hwnd,&ps); + hdc2=CreateCompatibleDC(hdc); + hbmp=ske_CreateDIB32(rc.right,rc.bottom); + hbmpo=(HBITMAP) SelectObject(hdc2,hbmp); + FillRect(hdc2,&ps.rcPaint,br); + ModernDrawStatusBarWorker(hwnd,hdc2); + //BitBlt(hdc,ps.rcPaint.left,ps.rcPaint.top,ps.rcPaint.right-ps.rcPaint.left,ps.rcPaint.bottom-ps.rcPaint.top, + // hdc2,ps.rcPaint.left,ps.rcPaint.top,SRCCOPY); + BitBlt(hdc,ps.rcPaint.left,ps.rcPaint.top,ps.rcPaint.right-ps.rcPaint.left,ps.rcPaint.bottom-ps.rcPaint.top, + hdc2,ps.rcPaint.left,ps.rcPaint.top,SRCCOPY); + SelectObject(hdc2,hbmpo); + DeleteObject(hbmp); + mod_DeleteDC(hdc2); + ps.fErase=FALSE; + EndPaint(hwnd,&ps); + } + return DefWindowProc(hwnd, msg, wParam, lParam); + + case WM_GETMINMAXINFO:{ + RECT rct; + GetWindowRect(hwnd,&rct); + memset((LPMINMAXINFO)lParam,0,sizeof(MINMAXINFO)); + ((LPMINMAXINFO)lParam)->ptMinTrackSize.x=16; + ((LPMINMAXINFO)lParam)->ptMinTrackSize.y=16; + ((LPMINMAXINFO)lParam)->ptMaxTrackSize.x=1600; + ((LPMINMAXINFO)lParam)->ptMaxTrackSize.y=1600; + return(0); + } + + case WM_SHOWWINDOW: + { + int res; + int ID; + if (tooltipshoing){ + NotifyEventHooks(g_CluiData.hEventStatusBarHideToolTip,0,0); + tooltipshoing=FALSE; + }; + ID=Sync( FindFrameID, hwnd ); + if (ID) + { + res=CallService(MS_CLIST_FRAMES_GETFRAMEOPTIONS, MAKEWPARAM(FO_FLAGS,ID),0); + if (res>=0) ModernWriteSettingByte(0,"CLUI","ShowSBar",(BYTE)(wParam/*(res&F_VISIBLE)*/?1:0)); + } + } + break; + case WM_TIMER: + { + if (wParam==TM_STATUSBARHIDE) + { + KillTimer(hwnd,TM_STATUSBARHIDE); + if (tooltipshoing) + { + NotifyEventHooks(g_CluiData.hEventStatusBarHideToolTip,0,0); + tooltipshoing=FALSE; + ReleaseCapture(); + }; + } + else if (wParam==TM_STATUSBAR) + { + POINT pt; + KillTimer(hwnd,TM_STATUSBAR); + GetCursorPos(&pt); + if (pt.x==lastpnt.x&&pt.y==lastpnt.y) + { + int i; + RECT rc; + ScreenToClient(hwnd,&pt); + for (i=0; iTOOLTIP_TOLERANCE || abs(pt.y-ptToolTipShow.y)>TOOLTIP_TOLERANCE) + { + KillTimer(hwnd,TM_STATUSBARHIDE); + NotifyEventHooks(g_CluiData.hEventStatusBarHideToolTip,0,0); + tooltipshoing=FALSE; + ReleaseCapture(); + } + } + break; + case WM_SETCURSOR: + { + if (g_CluiData.bBehindEdgeSettings) CLUI_UpdateTimer(0); + { + POINT pt; + GetCursorPos(&pt); + SendMessage(GetParent(hwnd),msg,wParam,lParam); + if (pt.x==lastpnt.x&&pt.y==lastpnt.y) + { + return(CLUI_TestCursorOnBorders()); + }; + lastpnt=pt; + if (tooltipshoing) + if (abs(pt.x-ptToolTipShow.x)>TOOLTIP_TOLERANCE || abs(pt.y-ptToolTipShow.y)>TOOLTIP_TOLERANCE) + { + KillTimer(hwnd,TM_STATUSBARHIDE); + NotifyEventHooks(g_CluiData.hEventStatusBarHideToolTip,0,0); + tooltipshoing=FALSE; + ReleaseCapture(); + }; + KillTimer(hwnd,TM_STATUSBAR); + CLUI_SafeSetTimer(hwnd,TM_STATUSBAR,ModernGetSettingWord(NULL,"CLC","InfoTipHoverTime",CLCDEFAULT_INFOTIPTIME),0); + + return(CLUI_TestCursorOnBorders()); + } + } + case WM_LBUTTONDOWN: + case WM_MBUTTONDOWN: + case WM_RBUTTONDOWN: + { + RECT rc; + POINT pt; + int i; + pt.x=(short)LOWORD(lParam); + pt.y=(short)HIWORD(lParam); + KillTimer(hwnd,TM_STATUSBARHIDE); + KillTimer(hwnd,TM_STATUSBAR); + + if (tooltipshoing){ + NotifyEventHooks(g_CluiData.hEventStatusBarHideToolTip,0,0); + }; + tooltipshoing=FALSE; + for (i=0; ipfnGetAccountIndexByPos( pos ); + + if ( i < 0 && i >= protoCount ) + continue; + + char protoF[ sizeof(g_CluiData.protoFilter) ]; + mir_snprintf( protoF, SIZEOF(protoF), "%s|", accs[i]->szModuleName ); + if ( strstri( g_CluiData.protoFilter, protoF ) ) + { + char * temp = mir_utf8encodeT( accs[i]->tszAccountName ); + if ( !first ) + strncat( filterName, "; ", SIZEOF(filterName) - strlen(filterName) ); + strncat( filterName, temp, SIZEOF(filterName) - strlen(filterName) ); + first = false; + mir_free( temp ); + } + } + + SaveViewMode( filterName, _T(""), g_CluiData.protoFilter, 0, -1, 0, 0, 0, 0 ); + + ApplyViewMode( filterName ); + } + pcli->pfnClcBroadcast(CLM_AUTOREBUILD, 0, 0); + CLUI__cliInvalidateRect( hwnd, NULL, FALSE ); + SetCapture( NULL ); + return 0; + } + if (!hMenu) + { + if (msg==WM_RBUTTONDOWN) + { + BOOL a = ( (g_StatusBarData.perProtoConfig && ProtosData[i].SBarRightClk) || g_StatusBarData.SBarRightClk ); + if ( a ^ bShift ) + hMenu=(HMENU)CallService(MS_CLIST_MENUGETMAIN,0,0); + else + hMenu=(HMENU)CallService(MS_CLIST_MENUGETSTATUS,0,0); + } + else + { + hMenu=(HMENU)CallService(MS_CLIST_MENUGETSTATUS,0,0); + unsigned int cpnl = 0; + int mcnt = GetMenuItemCount(hMenu); + for (int j=0; jhwndContactList) parent=GetParent(parent); + TrackPopupMenu(hMenu,TPM_TOPALIGN|TPM_LEFTALIGN|TPM_LEFTBUTTON,pt.x,pt.y,0,parent,NULL); + } + return 0; + } + } + GetClientRect( hwnd, &rc ); + if ( PtInRect( &rc, pt ) && msg == WM_LBUTTONDOWN && g_CluiData.bFilterEffective == CLVM_FILTER_PROTOS ) + { + ApplyViewMode( "" ); + CLUI__cliInvalidateRect( hwnd, NULL, FALSE ); + SetCapture( NULL ); + return 0; + } + return SendMessage(GetParent(hwnd), msg, wParam, lParam ); + } + } + return DefWindowProc(hwnd, msg, wParam, lParam); +} + +HWND StatusBar_Create(HWND parent) +{ + WNDCLASS wndclass={0}; + TCHAR pluginname[]=TEXT("ModernStatusBar"); + int h=GetSystemMetrics(SM_CYSMICON)+2; + if (GetClassInfo(g_hInst,pluginname,&wndclass) ==0) + { + wndclass.style = 0; + wndclass.lpfnWndProc = ModernStatusProc; + wndclass.cbClsExtra = 0; + wndclass.cbWndExtra = 0; + wndclass.hInstance = g_hInst; + wndclass.hIcon = NULL; + wndclass.hCursor = LoadCursor (NULL, IDC_ARROW); + wndclass.hbrBackground = GetSysColorBrush(COLOR_3DFACE); + wndclass.lpszMenuName = NULL; + wndclass.lpszClassName = pluginname; + RegisterClass(&wndclass); + } + hModernStatusBar=CreateWindow(pluginname,pluginname,WS_CHILD|WS_VISIBLE|WS_CLIPCHILDREN, + 0,0,0,h,parent,NULL,g_hInst,NULL); + // register frame + { + CLISTFrame Frame; + memset(&Frame,0,sizeof(Frame)); + Frame.cbSize=sizeof(CLISTFrame); + Frame.hWnd=hModernStatusBar; + Frame.align=alBottom; + Frame.hIcon=LoadSkinnedIcon (SKINICON_OTHER_MIRANDA); + Frame.Flags=(ModernGetSettingByte(NULL,"CLUI","ShowSBar",SETTING_SHOWSBAR_DEFAULT)?F_VISIBLE:0)|F_LOCKED|F_NOBORDER|F_NO_SUBCONTAINER|F_TCHAR; + Frame.height=h; + Frame.tname=_T("Status Bar"); + Frame.TBtname=TranslateT("Status Bar"); + hFramehModernStatusBar=(HANDLE)CallService(MS_CLIST_FRAMES_ADDFRAME,(WPARAM)&Frame,(LPARAM)0); + CallService(MS_SKINENG_REGISTERPAINTSUB,(WPARAM)Frame.hWnd,(LPARAM)NewStatusPaintCallbackProc); //$$$$$ register sub for frame + } + + LoadStatusBarData(); + CLUIServices_ProtocolStatusChanged(0,0); + CallService(MS_CLIST_FRAMES_UPDATEFRAME,-1,0); + return hModernStatusBar; +} -- cgit v1.2.3