|
|
#include "cabinet.h"
#include "trayitem.h"
#include "shellapi.h"
#include "strsafe.h"
//
// CTrayItem members...
//
DWORD CTrayItem::_GetStateFlag(ICONSTATEFLAG sf) { DWORD dwFlag = 0; switch (sf) { case TIF_HIDDEN: dwFlag = NIS_HIDDEN; break; case TIF_DEMOTED: dwFlag = NISP_DEMOTED; break; case TIF_STARTUPICON: dwFlag = NISP_STARTUPICON; break; case TIF_SHARED: dwFlag = NIS_SHAREDICON; break; case TIF_SHAREDICONSOURCE: dwFlag = NISP_SHAREDICONSOURCE; break;
case TIF_ONCEVISIBLE: dwFlag = NISP_ONCEVISIBLE; break;
case TIF_ITEMCLICKED: dwFlag = NISP_ITEMCLICKED; break;
case TIF_ITEMSAMEICONMODIFY: dwFlag = NISP_ITEMSAMEICONMODIFY; break; }
ASSERT(dwFlag); return dwFlag; }
void CTrayItem::_SetIconState(ICONSTATEFLAG sf, BOOL bSet) { DWORD dwFlag = _GetStateFlag(sf);
ASSERT(dwFlag); if (bSet) dwState |= (dwFlag & 0xFFFFFFFF); else dwState &= ~dwFlag; }
BOOL CTrayItem::_CheckIconState(ICONSTATEFLAG sf) { DWORD dwFlag = _GetStateFlag(sf);
ASSERT(dwFlag);
return ((dwState & dwFlag) != 0); }
//
// CTrayItemManager members
//
CTrayItem * CTrayItemManager::GetItemData(INT_PTR i, BOOL byIndex, HWND hwndToolbar) { TBBUTTONINFO tbbi; tbbi.cbSize = sizeof(tbbi); tbbi.lParam = 0; tbbi.dwMask = TBIF_LPARAM; if (byIndex) tbbi.dwMask |= TBIF_BYINDEX; SendMessage(hwndToolbar, TB_GETBUTTONINFO, i, (LPARAM)&tbbi); return (CTrayItem *)(void *)tbbi.lParam; }
INT_PTR CTrayItemManager::FindItemAssociatedWithGuid(GUID guidItemToCheck) { if (guidItemToCheck == GUID_NULL) return -1;
for (INT_PTR i = GetItemCount()-1; i >= 0; i--) { CTrayItem * pti = GetItemDataByIndex(i); if (pti && pti->IsGuidItemValid() && IsEqualGUID(pti->guidItem, guidItemToCheck)) return i; }
return -1; }
INT_PTR CTrayItemManager::FindItemAssociatedWithTimer(UINT_PTR uIconDemoteTimerID) { for (INT_PTR i = GetItemCount()-1; i >= 0; i--) { CTrayItem * pti = GetItemDataByIndex(i); if (pti && pti->uIconDemoteTimerID == uIconDemoteTimerID) return i; }
return -1; }
INT_PTR CTrayItemManager::FindItemAssociatedWithHwndUid(HWND hwnd, UINT uID) { for (INT_PTR i = GetItemCount() - 1; i >= 0; --i) { CTrayItem * pti = GetItemDataByIndex(i); if (pti && (pti->hWnd == hwnd) && (pti->uID == uID)) { return i; } }
return -1; }
// Decides if there are as many "TNUP_AUTOMATIC" demoted items in the tray, above the
// threshold that the user has specified...
// Returns TRUE if there is any TNUP_DEMOTED item in the list...
BOOL CTrayItemManager::DemotedItemsPresent(int nMinDemotedItemsThreshold) { ASSERT(nMinDemotedItemsThreshold >= 0);
INT_PTR cIcons = 0; INT_PTR nItems = SendMessage(m_hwndToolbar, TB_BUTTONCOUNT, 0, 0L);
for (INT_PTR i = 0; i < nItems; i++) { CTrayItem * pti = GetItemDataByIndex(i);
ASSERT(pti);
// If the item is set to ALWAYS HIDE, then it must be shown in demoted state...
if (pti->dwUserPref == TNUP_DEMOTED) { return TRUE; } // If the item is demoted, then only if there are enough demoted items must
// they all be shown in demoted state...
else if (pti->IsDemoted()) { cIcons++; if (cIcons >= nMinDemotedItemsThreshold) return TRUE; } }
return FALSE; }
// Works irrespective of whether AutoTray is enabled or not...
INT_PTR CTrayItemManager::_GetItemCountHelper(int nItemFlag, int nItemCountThreshold) { INT_PTR cIcons = 0;
INT_PTR nItems = SendMessage(m_hwndToolbar, TB_BUTTONCOUNT, 0, 0L); switch(nItemFlag) { case GIC_ALL: cIcons = nItems; break;
case GIC_PROMOTED: case GIC_DEMOTED: for (INT_PTR i = nItems-1; i>= 0; i--) { CTrayItem * pti = GetItemDataByIndex(i);
if (nItemFlag == GIC_PROMOTED) { if (pti && !pti->IsDemoted() && !pti->IsHidden()) cIcons ++; } else { if (pti && pti->IsDemoted()) cIcons++; }
if (nItemCountThreshold != -1 && cIcons >= nItemCountThreshold) break; } break; } return cIcons; }
void CTrayItemManager::SetTBBtnImage(INT_PTR iIndex, int iImage) { TBBUTTONINFO tbbi; tbbi.cbSize = sizeof(tbbi); tbbi.dwMask = TBIF_IMAGE | TBIF_BYINDEX; tbbi.iImage = iImage;
SendMessage(m_hwndToolbar, TB_SETBUTTONINFO, iIndex, (LPARAM)&tbbi); }
int CTrayItemManager::GetTBBtnImage(INT_PTR iIndex, BOOL fByIndex /* = TRUE */) { TBBUTTONINFO tbbi; tbbi.cbSize = sizeof(tbbi); tbbi.dwMask = TBIF_IMAGE;
if (fByIndex) tbbi.dwMask |= TBIF_BYINDEX;
SendMessage(m_hwndToolbar, TB_GETBUTTONINFO, iIndex, (LPARAM)&tbbi); return tbbi.iImage; }
BOOL CTrayItemManager::SetTBBtnStateHelper(INT_PTR iIndex, BYTE fsState, BOOL_PTR bSet) { TBBUTTONINFO tbbi; tbbi.cbSize = sizeof(tbbi); tbbi.dwMask = TBIF_STATE | TBIF_BYINDEX;
// Get the original state of the button
SendMessage(m_hwndToolbar, TB_GETBUTTONINFO, iIndex, (LPARAM)&tbbi);
// Or the new state to the original state
BYTE fsStateOld = tbbi.fsState; if (bSet) tbbi.fsState |= fsState; else tbbi.fsState &= ~fsState;
if (tbbi.fsState ^ fsStateOld) { SendMessage(m_hwndToolbar, TB_SETBUTTONINFO, iIndex, (LPARAM)&tbbi); return TRUE; }
return FALSE; }
void CTrayItemManager::SetTBBtnText(INT_PTR iIndex, LPTSTR pszText) { TBBUTTONINFO tbbi; tbbi.cbSize = sizeof(tbbi); tbbi.dwMask = TBIF_TEXT | TBIF_BYINDEX; tbbi.pszText = pszText; tbbi.cchText = -1; SendMessage(m_hwndToolbar, TB_SETBUTTONINFO, iIndex, (LPARAM)&tbbi); }
int CTrayItemManager::FindImageIndex(HICON hIcon, BOOL fSetAsSharedSource) { INT_PTR i; INT_PTR iCount = GetItemCount(); for (i = 0; i < iCount; i++) { CTrayItem * pti = GetItemDataByIndex(i); if (pti && pti->hIcon == hIcon) { // if we're supposed to mark this as a shared icon source and its not itself a shared icon
// target, mark it now. this is to allow us to recognize when the source icon changes and
// that we can know that we need to find other indicies and update them too.
if (fSetAsSharedSource && !pti->IsIconShared()) pti->SetSharedIconSource(TRUE); return GetTBBtnImage(i); } } return -1; }
// TO DO szText can be replaced by pti->szIconText
BOOL CTrayItemManager::GetTrayItem(INT_PTR nIndex, CNotificationItem * pni, BOOL * pbStat) { if (nIndex < 0 || nIndex >= GetItemCount()) { *pbStat = FALSE; return FALSE; }
ASSERT(pni->hIcon == NULL); // else we're going to leak it
TBBUTTONINFO tbbi; tbbi.cbSize = sizeof(tbbi); tbbi.dwMask = TBIF_BYINDEX | TBIF_IMAGE | TBIF_LPARAM | TBIF_TEXT;
TCHAR szText[80] = {0}; tbbi.pszText = szText; tbbi.cchText = ARRAYSIZE(szText);
if (SendMessage(m_hwndToolbar, TB_GETBUTTONINFO, nIndex, (LPARAM)&tbbi) != -1) { CTrayItem * pti = (CTrayItem *)tbbi.lParam;
// don't expose the NIS_HIDDEN icons
if (pti && !pti->IsHidden()) { pni->hWnd = pti->hWnd; pni->uID = pti->uID; pni->hIcon = ImageList_GetIcon(m_himlIcons, tbbi.iImage, ILD_NORMAL); pni->dwUserPref = pti->dwUserPref; pni->SetExeName(pti->szExeName); pni->SetIconText(szText); memcpy(&(pni->guidItem), &(pti->guidItem), sizeof(pti->guidItem));
*pbStat = TRUE; return TRUE; } }
*pbStat = FALSE; return TRUE; }
|