windows-nt/Source/XPSP1/NT/shell/browseui/mbutil.cpp

516 lines
14 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
#include "priv.h"
#include "mbutil.h"
#include "legacy.h"
#include "mediahlpr.h"
#include "mediautil.h"
#include "mediaband.h"
#include "resource.h"
#include <mluisupp.h>
#include "apithk.h"
CMediaMRU::CMediaMRU()
{
_hkey = NULL;
}
CMediaMRU::~CMediaMRU()
{
if (_hkey)
RegCloseKey(_hkey);
}
VOID CMediaMRU::Load(PTSTR pszKey)
{
HKEY hkey = NULL;
if (ERROR_SUCCESS==RegCreateKeyEx(HKEY_CURRENT_USER, pszKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS,
NULL, &hkey, NULL))
{
_hkey = hkey;
}
}
VOID CMediaMRU::Add(PTSTR pszData)
{
if (!_hkey)
return;
ASSERT((pszData && *pszData));
TCHAR szData[INTERNET_MAX_URL_LENGTH];
TCHAR szTemp[INTERNET_MAX_URL_LENGTH];
for (INT i = MEDIA_MRU_LIMIT-2; i>=0; i--)
{
if (!Get(i, szData))
{
continue;
}
TCHAR szValue[] = TEXT("0");
if (!PathUnExpandEnvStringsForUser(NULL, szData, szTemp, ARRAYSIZE(szTemp)))
{
StrCpyN(szTemp, szData, ARRAYSIZE(szTemp));
}
*szValue = TEXT('0')+(TCHAR)i+1;
SHSetValue(_hkey, NULL, szValue, REG_EXPAND_SZ, szTemp, (lstrlen(szTemp)+1)*sizeof(TCHAR));
}
if (!PathUnExpandEnvStringsForUser(NULL, pszData, szTemp, ARRAYSIZE(szTemp)))
{
StrCpyN(szTemp, pszData, ARRAYSIZE(szTemp));
}
SHSetValue(_hkey, NULL, TEXT("0"), REG_EXPAND_SZ, szTemp, (lstrlen(szTemp)+1)*sizeof(TCHAR));
}
VOID CMediaMRU::Delete(INT iWhich)
{
if (!_hkey)
return;
TCHAR szData[INTERNET_MAX_URL_LENGTH];
TCHAR szTemp[INTERNET_MAX_URL_LENGTH];
for (INT i = iWhich; i<MEDIA_MRU_LIMIT; i++)
{
if (!Get(i+1, szData))
{
continue;
}
TCHAR szValue[] = TEXT("0");
if (!PathUnExpandEnvStringsForUser(NULL, szData, szTemp, ARRAYSIZE(szTemp)))
{
StrCpyN(szTemp, szData, ARRAYSIZE(szTemp));
}
*szValue = TEXT('0')+(TCHAR)i;
SHSetValue(_hkey, NULL, szValue, REG_EXPAND_SZ, szTemp, (lstrlen(szTemp)+1)*sizeof(TCHAR));
}
}
BOOL CMediaMRU::Get(INT iWhich, PTSTR pszOut)
{
BOOL fRet = FALSE;
TCHAR szValue[] = TEXT("0");
DWORD dwType, cb = INTERNET_MAX_URL_LENGTH;
*szValue = TEXT('0')+(TCHAR)iWhich;
if (ERROR_SUCCESS==SHGetValue(_hkey, NULL, szValue, &dwType, pszOut, &cb))
{
fRet = TRUE;
}
return fRet;
}
CMediaWidget::CMediaWidget(HWND hwnd, int cx, int cy)
{
_hwnd = NULL;
_hwndParent = hwnd;
_cx = cx;
_cy = cy;
}
CMediaWidget::~CMediaWidget()
{
DESTROY_OBJ_WITH_HANDLE(_hwnd, DestroyWindow);
}
CMediaWidgetButton*
CMediaWidgetButton_CreateInstance(HWND hwnd, int cx, int cy, int idCommand, int idImageList, int idAlt, int idTooltip, int idTooltipAlt)
{
CMediaWidgetButton* pmwb = new CMediaWidgetButton(hwnd, cx, cy);
if (pmwb)
{
HRESULT hr = pmwb->Initialize(idCommand, idTooltip, idTooltipAlt);
if (SUCCEEDED(hr) && idImageList)
{
hr = pmwb->SetImageList(idImageList);
}
if (SUCCEEDED(hr) && idAlt)
{
hr = pmwb->SetAlternateImageList(idAlt);
}
if (FAILED(hr))
{
delete pmwb;
pmwb = NULL;
}
}
return pmwb;
}
CMediaWidgetButton::CMediaWidgetButton(HWND hwnd, int cx, int cy) : CMediaWidget(hwnd, cx, cy)
{
_himl = _himlAlt = NULL;
_dwMode = MWB_NORMAL;
_fImageSource = TRUE;
_iCommand = _iTooltip = _iTooltipAlt = 0;
}
CMediaWidgetButton::~CMediaWidgetButton()
{
DESTROY_OBJ_WITH_HANDLE(_himl, ImageList_Destroy);
DESTROY_OBJ_WITH_HANDLE(_himlAlt, ImageList_Destroy);
}
HRESULT CMediaWidgetButton::Initialize(int idCommand, int idTooltip, int idTooltipAlt)
{
HRESULT hr = E_FAIL;
_hwnd = CreateWindowEx(WS_EX_TOOLWINDOW, TOOLBARCLASSNAME, NULL,
WS_TABSTOP |WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS |
TBSTYLE_FLAT | TBSTYLE_TOOLTIPS | TBSTYLE_TRANSPARENT |
CCS_NODIVIDER | CCS_NOPARENTALIGN | CCS_NORESIZE,
0, 0, 0, 0, _hwndParent, NULL, HINST_THISDLL, NULL);
if (_hwnd)
{
_iCommand = idCommand;
TBBUTTON tb;
tb.iBitmap = 0;
tb.idCommand = idCommand;
tb.fsState = TBSTATE_ENABLED;
tb.fsStyle = BTNS_AUTOSIZE | BTNS_BUTTON;
tb.dwData = 0; //(DWORD_PTR)this;
tb.iString = 0;
SendMessage(_hwnd, TB_BUTTONSTRUCTSIZE, SIZEOF(TBBUTTON), 0);
SendMessage(_hwnd, TB_SETMAXTEXTROWS, 0, 0L);
if (idTooltip)
{
if (idTooltipAlt)
{
_iTooltip = idTooltip;
_iTooltipAlt = idTooltipAlt;
}
else
{
tb.iString = (int)SendMessage(_hwnd, TB_ADDSTRING, (WPARAM)MLGetHinst(), MAKELPARAM(idTooltip, 0));
}
}
SendMessage(_hwnd, TB_ADDBUTTONS, 1, (LPARAM)&tb);
SendMessage(_hwnd, TB_SETPADDING, 0, MAKELPARAM(0, 1));
ShowWindow(_hwnd, SW_SHOW);
Comctl32_SetDPIScale(_hwnd);
hr = S_OK;
}
return hr;
}
HRESULT CMediaWidgetButton::SetImageList(INT iResource)
{
HRESULT hr = E_FAIL;
ASSERT(_cx && _cy);
DESTROY_OBJ_WITH_HANDLE(_himl, ImageList_Destroy);
_himl = ImageList_LoadImage(HINST_THISDLL, MAKEINTRESOURCE(iResource), _cx, 0, crMask,
IMAGE_BITMAP, LR_CREATEDIBSECTION);
if (_himl && _hwnd)
{
SendMessage(_hwnd, TB_SETIMAGELIST, 0, (LPARAM)_himl);
SendMessage(_hwnd, TB_SETDISABLEDIMAGELIST, 0, (LPARAM)_himl);
SendMessage(_hwnd, TB_SETHOTIMAGELIST, 0, (LPARAM)_himl);
hr = S_OK;
}
return hr;
}
HRESULT CMediaWidgetButton::SetAlternateImageList(INT iResource)
{
HRESULT hr = E_FAIL;
ASSERT(_himl);
ASSERT(_cx && _cy);
DESTROY_OBJ_WITH_HANDLE(_himlAlt, ImageList_Destroy);
_himlAlt = ImageList_LoadImage(HINST_THISDLL, MAKEINTRESOURCE(iResource), _cx, 0, crMask,
IMAGE_BITMAP, LR_CREATEDIBSECTION);
if (_himlAlt)
{
hr = S_OK;
}
ASSERT(_iTooltipAlt);
SetImageSource(TRUE);
return hr;
}
HRESULT CMediaWidgetButton::SetImageSource(BOOL fImageSource)
{
ASSERT(_himlAlt);
if (_himlAlt)
{
_fImageSource = fImageSource;
if (_hwnd)
{
InvalidateRect(_hwnd, NULL, FALSE);
UpdateWindow(_hwnd);
INT i = fImageSource ? _iTooltip : _iTooltipAlt;
if (i)
{
// ISSUE Why are we doing this? Because on Win9x, the tooltips code isn't working
// no matter how hard I pound.
TCHAR szText[MAX_PATH];
if (MLLoadStringW(i, szText, ARRAYSIZE(szText)))
{
TBBUTTONINFO tb = {0};
tb.cbSize = sizeof(tb);
tb.dwMask = TBIF_TEXT;
tb.pszText = szText;
SendMessage(_hwnd, TB_SETBUTTONINFO, _iCommand, (LPARAM)&tb);
}
}
}
}
return S_OK;
}
HRESULT CMediaWidgetButton::SetMode(DWORD dwMode)
{
TBBUTTONINFO tbbi;
tbbi.cbSize = SIZEOF(tbbi);
tbbi.dwMask = TBIF_BYINDEX | TBIF_IMAGE;
SendMessage(_hwnd, TB_GETBUTTONINFO, (WPARAM)0, (LPARAM)&tbbi);
tbbi.iImage = (INT)dwMode;
SendMessage(_hwnd, TB_SETBUTTONINFO, (WPARAM)0, (LPARAM)&tbbi);
_dwMode = dwMode;
return S_OK;
}
LRESULT CMediaWidgetButton::Draw(LPNMTBCUSTOMDRAW pnm)
{
LPNMTBCUSTOMDRAW pnmc = (LPNMTBCUSTOMDRAW)pnm;
LRESULT lres;
switch (pnmc->nmcd.dwDrawStage)
{
case CDDS_PREPAINT:
lres = CDRF_NOTIFYITEMDRAW;
break;
case CDDS_PREERASE:
lres = CDRF_NOTIFYITEMDRAW;
break;
case CDDS_ITEMPREPAINT:
{
HIMAGELIST himl = _fImageSource ? _himl : _himlAlt;
INT index = MWB_NORMAL;
if (SendMessage(_hwnd, TB_GETSTATE, (WPARAM)pnmc->nmcd.dwItemSpec, 0) & TBSTATE_ENABLED)
{
index = (pnmc->nmcd.uItemState & CDIS_SELECTED)
? MWB_PRESSED
: (pnmc->nmcd.uItemState & CDIS_HOT) ? MWB_HOT : _dwMode;
}
else
{
index = MWB_DISABLED;
}
if (himl)
{
UINT uFlags = ILD_TRANSPARENT | (IsOS(OS_WHISTLERORGREATER) ? ILD_DPISCALE : 0);
INT x = pnmc->nmcd.rc.left;
if (g_bRunOnMemphis && IS_WINDOW_RTL_MIRRORED(_hwnd))
{
x++;
}
ImageList_Draw(himl, index, pnmc->nmcd.hdc, x, 1, uFlags);
lres = CDRF_SKIPDEFAULT;
break;
}
}
default:
lres = CDRF_DODEFAULT;
break;
}
return lres;
}
BOOL CMediaWidgetButton::IsEnabled()
{
return ((BOOL)SendMessage(_hwnd, TB_GETSTATE, _iCommand, 0) & TBSTATE_ENABLED);
}
HRESULT CMediaWidgetButton::TranslateAccelerator(LPMSG pMsg)
{
return (_hwnd && SendMessage(_hwnd, TB_TRANSLATEACCELERATOR, 0, (LPARAM)pMsg)) ? S_OK : S_FALSE;
}
CMediaWidgetToggle::CMediaWidgetToggle(HWND hwnd, int cx, int cy) : CMediaWidgetButton(hwnd, cx, cy)
{
_fState = FALSE;
}
LRESULT CMediaWidgetToggle::Draw(LPNMTBCUSTOMDRAW pnm)
{
LPNMTBCUSTOMDRAW pnmc = (LPNMTBCUSTOMDRAW)pnm;
LRESULT lres;
switch (pnmc->nmcd.dwDrawStage)
{
case CDDS_PREPAINT:
lres = CDRF_NOTIFYITEMDRAW;
break;
case CDDS_PREERASE:
lres = CDRF_NOTIFYITEMDRAW;
break;
case CDDS_ITEMPREPAINT:
{
INT index = MWB_NORMAL;
if (_fState)
{
index = MWB_PRESSED;
}
else if (pnmc->nmcd.uItemState & CDIS_HOT)
{
index = MWB_HOT;
}
if (_himl)
{
UINT uFlags = ILD_TRANSPARENT | (IsOS(OS_WHISTLERORGREATER) ? ILD_DPISCALE : 0);
INT x = pnmc->nmcd.rc.left;
if (g_bRunOnMemphis && IS_WINDOW_RTL_MIRRORED(_hwnd))
{
x++;
}
ImageList_Draw(_himl, index, pnmc->nmcd.hdc, x, 1, uFlags);
lres = CDRF_SKIPDEFAULT;
break;
}
}
default:
lres = CDRF_DODEFAULT;
break;
}
return lres;
}
VOID CMediaWidgetToggle::SetState(BOOL fState)
{
_fState = fState;
InvalidateRect(_hwnd, NULL, FALSE);
UpdateWindow(_hwnd);
INT i = fState ? _iTooltip : _iTooltipAlt;
if (i)
{
TCHAR szText[MAX_PATH];
if (MLLoadStringW(i, szText, ARRAYSIZE(szText)))
{
TBBUTTONINFO tb = {0};
tb.cbSize = sizeof(tb);
tb.dwMask = TBIF_TEXT;
tb.pszText = szText;
SendMessage(_hwnd, TB_SETBUTTONINFO, _iCommand, (LPARAM)&tb);
}
}
}
CMediaWidgetOptions::CMediaWidgetOptions(HWND hwnd, int cx, int cy) : CMediaWidgetButton(hwnd, cx, cy)
{
_fDepth = TRUE;
}
HRESULT CMediaWidgetOptions::Initialize(int idCommand, int idTooltip, int idTooltipAlt)
{
HRESULT hr = E_FAIL;
_hwnd = CreateWindowEx(WS_EX_TOOLWINDOW | TBSTYLE_EX_MIXEDBUTTONS | WS_EX_WINDOWEDGE, TOOLBARCLASSNAME, NULL,
WS_TABSTOP| WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS |
TBSTYLE_FLAT | TBSTYLE_TOOLTIPS | TBSTYLE_CUSTOMERASE | TBSTYLE_LIST | TBSTYLE_TRANSPARENT |
CCS_NODIVIDER | CCS_NOPARENTALIGN | CCS_NORESIZE,
0, 0, 0, 0, _hwndParent, NULL, HINST_THISDLL, NULL);
if (_hwnd)
{
static const TBBUTTON tbInfoBar[] =
{
{ I_IMAGECALLBACK, FCIDM_MEDIABAND_PLAYINFO, TBSTATE_ENABLED, BTNS_SHOWTEXT | BTNS_WHOLEDROPDOWN, {0,0}, 0, 0 },
};
// Init the toolbar control
SendMessage(_hwnd, TB_BUTTONSTRUCTSIZE, SIZEOF(TBBUTTON), 0);
SendMessage(_hwnd, TB_SETMAXTEXTROWS, 1, 0L);
RECT rcClient;
GetClientRect(_hwndParent, &rcClient);
SendMessage(_hwnd, TB_SETBUTTONWIDTH, 0, (LPARAM) MAKELONG(10,10));
SendMessage(_hwnd, TB_ADDBUTTONS, ARRAYSIZE(tbInfoBar), (LPARAM)tbInfoBar);
SendMessage(_hwnd, TB_SETBITMAPSIZE, 0, MAKELONG(0, 0));
// Need to disable theming on this item
SetWindowTheme(_hwnd, TEXT(""), TEXT(""));
ShowWindow(_hwnd, SW_SHOW);
hr = S_OK;
}
return hr;
}
LRESULT CMediaWidgetOptions::Draw(LPNMTBCUSTOMDRAW pnm)
{
LRESULT lres = CDRF_NOTIFYITEMDRAW;
switch (pnm->nmcd.dwDrawStage)
{
case CDDS_PREPAINT:
case CDDS_PREERASE:
break;
case CDDS_ITEMPREPAINT:
{
pnm->clrText = _fDepth ? RGB(255,255,255) : RGB(0,0,0);
if (_fDepth)
{
lres |= TBCDRF_HILITEHOTTRACK;
pnm->clrHighlightHotTrack = COLOR_BKGND2;
}
break;
}
default:
lres = CDRF_DODEFAULT;
break;
}
return lres;
}
HRESULT CMediaWidgetSeek::Initialize(HWND hwnd)
{
_hwnd = hwnd;
return S_OK;
}
HRESULT CMediaWidgetSeek::TranslateAccelerator(LPMSG pMsg)
{
return S_FALSE;
}
VOID CMediaWidgetSeek::SetState(BOOL fState)
{
_fState = fState;
InvalidateRect(_hwnd, NULL, FALSE);
UpdateWindow(_hwnd);
}
HRESULT CMediaWidgetVolume::Initialize(HWND hwnd)
{
_hwnd = hwnd;
return S_OK;
}
HRESULT CMediaWidgetVolume::TranslateAccelerator(LPMSG pMsg)
{
return S_FALSE;
}