#include "priv.h" #include "mbutil.h" #include "legacy.h" #include "mediahlpr.h" #include "mediautil.h" #include "mediaband.h" #include "resource.h" #include #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; iInitialize(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; }