[BROWSEUI] CISFBand: Misc fixes

- Slightly improve the implementation of IShellFolderBand
- Show both folders and files in the toolbar
- Use the name of the folder shown as the name of the band
This commit is contained in:
Giannis Adamopoulos 2017-10-20 16:21:13 +03:00 committed by Giannis Adamopoulos
parent 37e6151b40
commit ee3b732043
2 changed files with 63 additions and 9 deletions

View file

@ -37,7 +37,8 @@ CISFBand::CISFBand() :
m_BandID(0), m_BandID(0),
m_pidl(NULL), m_pidl(NULL),
m_textFlag(true), m_textFlag(true),
m_iconFlag(true) m_iconFlag(true),
m_QLaunch(false)
{ {
} }
@ -84,7 +85,7 @@ HRESULT CISFBand::CreateSimpleToolbar(HWND hWndParent)
CComPtr<IEnumIDList> pEndl; CComPtr<IEnumIDList> pEndl;
LPITEMIDLIST pidl; LPITEMIDLIST pidl;
STRRET stret; STRRET stret;
hr = m_pISF->EnumObjects(0, SHCONTF_FOLDERS, &pEndl); hr = m_pISF->EnumObjects(0, SHCONTF_FOLDERS|SHCONTF_NONFOLDERS, &pEndl);
if (FAILED_UNEXPECTEDLY(hr)) if (FAILED_UNEXPECTEDLY(hr))
{ {
DestroyWindow(); DestroyWindow();
@ -258,7 +259,12 @@ HRESULT CISFBand::CreateSimpleToolbar(HWND hWndParent)
pdbi->ptActual = actualSize; pdbi->ptActual = actualSize;
} }
if (pdbi->dwMask & DBIM_TITLE) if (pdbi->dwMask & DBIM_TITLE)
wcscpy(pdbi->wszTitle, L"Quick Launch"); {
if (!ILGetDisplayNameEx(NULL, m_pidl, pdbi->wszTitle, ILGDN_INFOLDER))
{
pdbi->dwMask &= ~DBIM_TITLE;
}
}
if (pdbi->dwMask & DBIM_MODEFLAGS) if (pdbi->dwMask & DBIM_MODEFLAGS)
{ {
pdbi->dwModeFlags = DBIMF_NORMAL | DBIMF_VARIABLEHEIGHT | DBIMF_USECHEVRON | DBIMF_NOMARGINS | DBIMF_BKCOLOR | DBIMF_ADDTOFRONT; pdbi->dwModeFlags = DBIMF_NORMAL | DBIMF_VARIABLEHEIGHT | DBIMF_USECHEVRON | DBIMF_NOMARGINS | DBIMF_BKCOLOR | DBIMF_ADDTOFRONT;
@ -437,20 +443,60 @@ HRESULT CISFBand::CreateSimpleToolbar(HWND hWndParent)
// *** IShellFolderBand *** // *** IShellFolderBand ***
STDMETHODIMP CISFBand::GetBandInfoSFB(PBANDINFOSFB pbi) STDMETHODIMP CISFBand::GetBandInfoSFB(PBANDINFOSFB pbi)
{ {
if (pbi->dwMask == ISFB_MASK_IDLIST)
{
pbi->pidl = ILClone(m_pidl);
if (!pbi->pidl)
return E_OUTOFMEMORY;
return S_OK;
}
return E_NOTIMPL; return E_NOTIMPL;
} }
STDMETHODIMP CISFBand::InitializeSFB(IShellFolder *psf, PCIDLIST_ABSOLUTE pidl) STDMETHODIMP CISFBand::InitializeSFB(IShellFolder *psf, PCIDLIST_ABSOLUTE pidl)
{ {
if (_ILIsDesktop(pidl)) HRESULT hr;
if (!psf && !pidl)
return E_INVALIDARG;
if (psf && pidl)
return E_INVALIDARG;
if (pidl != NULL)
{ {
m_pISF = psf; CComPtr<IShellFolder> psfDesktop;
hr = SHGetDesktopFolder(&psfDesktop);
if (FAILED_UNEXPECTEDLY(hr))
return hr;
if (_ILIsDesktop(pidl))
{
m_pISF = psfDesktop;
}
else
{
hr = psfDesktop->BindToObject(pidl, NULL, IID_PPV_ARG(IShellFolder, &m_pISF));
if (FAILED_UNEXPECTEDLY(hr))
return hr;
}
m_pidl = ILClone(pidl); m_pidl = ILClone(pidl);
} }
else
if (psf != NULL)
{ {
psf->BindToObject(pidl, 0, IID_PPV_ARG(IShellFolder, &m_pISF)); CComPtr<IPersistFolder2> ppf2;
m_pidl = ILClone(pidl); hr = psf->QueryInterface(IID_PPV_ARG(IPersistFolder2, &ppf2));
if (FAILED_UNEXPECTEDLY(hr))
return hr;
hr = ppf2->GetCurFolder(&m_pidl);
if (FAILED_UNEXPECTEDLY(hr))
return hr;
m_pISF = psf;
} }
return S_OK; return S_OK;
@ -458,6 +504,13 @@ HRESULT CISFBand::CreateSimpleToolbar(HWND hWndParent)
STDMETHODIMP CISFBand::SetBandInfoSFB( PBANDINFOSFB pbi) STDMETHODIMP CISFBand::SetBandInfoSFB( PBANDINFOSFB pbi)
{ {
if ((pbi->dwMask & ISFB_MASK_STATE) &&
(pbi->dwState & ISFB_STATE_QLINKSMODE) &&
(pbi->dwStateMask & ISFB_STATE_QLINKSMODE))
{
m_QLaunch = true;
}
return E_NOTIMPL; return E_NOTIMPL;
} }

View file

@ -25,11 +25,12 @@ class CISFBand :
// Toolbar // Toolbar
CComPtr<IShellFolder> m_pISF; CComPtr<IShellFolder> m_pISF;
PCIDLIST_ABSOLUTE m_pidl; PIDLIST_ABSOLUTE m_pidl;
// Menu // Menu
BOOL m_textFlag; BOOL m_textFlag;
BOOL m_iconFlag; BOOL m_iconFlag;
BOOL m_QLaunch;
public: public: