[BROWSEUI] CBandSite: Implement SetBandSiteInfo and GetBandSiteInfo

Only BSIS_LOCKED, BSIS_NOGRIPPER, BSIS_ALWAYSGRIPPER and BSIS_NOCAPTION supported so far.
This commit is contained in:
Giannis Adamopoulos 2018-02-28 17:16:46 +02:00
parent 6785192fe6
commit 6d4a091b4a
2 changed files with 108 additions and 89 deletions

View file

@ -40,7 +40,9 @@ CBandSiteBase::CBandSiteBase():
m_cBands(0), m_cBands(0),
m_cBandsAllocated(0), m_cBandsAllocated(0),
m_bands(NULL), m_bands(NULL),
m_hwndRebar(NULL) m_hwndRebar(NULL),
m_dwState(0),
m_dwStyle(0)
{ {
} }
@ -146,13 +148,13 @@ VOID CBandSiteBase::_BuildBandInfo(struct BandObject *Band, REBARBANDINFOW *prbi
prbi->fStyle |= RBBS_BREAK; prbi->fStyle |= RBBS_BREAK;
if (Band->dbi.dwModeFlags & DBIMF_TOPALIGN) if (Band->dbi.dwModeFlags & DBIMF_TOPALIGN)
prbi->fStyle |= RBBS_TOPALIGN; prbi->fStyle |= RBBS_TOPALIGN;
if (Band->dbi.dwModeFlags & DBIMF_NOGRIPPER) if ((Band->dbi.dwModeFlags & DBIMF_NOGRIPPER) || (m_dwStyle & BSIS_NOGRIPPER))
prbi->fStyle |= RBBS_NOGRIPPER; prbi->fStyle |= RBBS_NOGRIPPER;
if (Band->dbi.dwModeFlags & DBIMF_ALWAYSGRIPPER) if ((Band->dbi.dwModeFlags & DBIMF_ALWAYSGRIPPER) || (m_dwStyle & BSIS_ALWAYSGRIPPER))
prbi->fStyle |= RBBS_GRIPPERALWAYS; prbi->fStyle |= RBBS_GRIPPERALWAYS;
} }
if (Band->bHiddenTitle) if (Band->bHiddenTitle || (m_dwStyle & BSIS_NOCAPTION))
{ {
prbi->fMask |= RBBIM_STYLE; prbi->fMask |= RBBIM_STYLE;
prbi->fStyle |= RBBS_HIDETITLE; prbi->fStyle |= RBBS_HIDETITLE;
@ -295,27 +297,30 @@ HRESULT CBandSiteBase::_OnContextMenu(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
} }
} }
/* Load the static part of the menu */ if (!(m_dwStyle & BSIS_LOCKED))
HMENU hMenuStatic = LoadMenuW(GetModuleHandleW(L"browseui.dll"), MAKEINTRESOURCEW(IDM_BAND_MENU));
if (hMenuStatic)
{ {
Shell_MergeMenus(hMenu, hMenuStatic, UINT_MAX, 0, UINT_MAX, MM_DONTREMOVESEPS | MM_SUBMENUSHAVEIDS); /* Load the static part of the menu */
HMENU hMenuStatic = LoadMenuW(GetModuleHandleW(L"browseui.dll"), MAKEINTRESOURCEW(IDM_BAND_MENU));
::DestroyMenu(hMenuStatic); if (hMenuStatic)
{
Shell_MergeMenus(hMenu, hMenuStatic, UINT_MAX, 0, UINT_MAX, MM_DONTREMOVESEPS | MM_SUBMENUSHAVEIDS);
hr = _IsBandDeletable(dwBandID); ::DestroyMenu(hMenuStatic);
if (FAILED_UNEXPECTEDLY(hr))
return hr;
/* Remove the close item if it is not deletable */ hr = _IsBandDeletable(dwBandID);
if (hr == S_FALSE || (Band->dbi.dwModeFlags & DBIMF_UNDELETEABLE) != 0) if (FAILED_UNEXPECTEDLY(hr))
DeleteMenu(hMenu, IDM_BAND_CLOSE, MF_BYCOMMAND); return hr;
if ((Band->dbi.dwMask & DBIM_TITLE) == 0) /* Remove the close item if it is not deletable */
DeleteMenu(hMenu, IDM_BAND_TITLE, MF_BYCOMMAND); if (hr == S_FALSE || (Band->dbi.dwModeFlags & DBIMF_UNDELETEABLE) != 0)
else DeleteMenu(hMenu, IDM_BAND_CLOSE, MF_BYCOMMAND);
CheckMenuItem(hMenu, IDM_BAND_TITLE, Band->bHiddenTitle ? MF_UNCHECKED : MF_CHECKED);
if ((Band->dbi.dwMask & DBIM_TITLE) == 0)
DeleteMenu(hMenu, IDM_BAND_TITLE, MF_BYCOMMAND);
else
CheckMenuItem(hMenu, IDM_BAND_TITLE, Band->bHiddenTitle ? MF_UNCHECKED : MF_CHECKED);
}
} }
/* TODO: Query the menu of our site */ /* TODO: Query the menu of our site */
@ -412,19 +417,21 @@ HRESULT STDMETHODCALLTYPE CBandSiteBase::AddBand(IUnknown *punk)
return E_FAIL; return E_FAIL;
hRet = punk->QueryInterface(IID_PPV_ARG(IDeskBand, &DeskBand)); hRet = punk->QueryInterface(IID_PPV_ARG(IDeskBand, &DeskBand));
if (!SUCCEEDED(hRet) || DeskBand == NULL) if (FAILED_UNEXPECTEDLY(hRet))
goto Cleanup; return hRet;
hRet = punk->QueryInterface(IID_PPV_ARG(IObjectWithSite, &ObjWithSite));
if (!SUCCEEDED(hRet) || ObjWithSite == NULL) hRet = punk->QueryInterface(IID_PPV_ARG(IObjectWithSite, &ObjWithSite));
goto Cleanup; if (FAILED_UNEXPECTEDLY(hRet))
hRet = punk->QueryInterface(IID_PPV_ARG(IOleWindow, &OleWindow)); return hRet;
if (!SUCCEEDED(hRet) || OleWindow == NULL)
goto Cleanup; hRet = punk->QueryInterface(IID_PPV_ARG(IOleWindow, &OleWindow));
hRet = punk->QueryInterface(IID_PPV_ARG(IWinEventHandler, &WndEvtHandler)); if (FAILED_UNEXPECTEDLY(hRet))
if (!SUCCEEDED(hRet) || WndEvtHandler == NULL) return hRet;
goto Cleanup;
hRet = punk->QueryInterface(IID_PPV_ARG(IWinEventHandler, &WndEvtHandler));
if (FAILED_UNEXPECTEDLY(hRet))
return hRet;
hRet = S_OK;
if (m_cBandsAllocated > m_cBands) if (m_cBandsAllocated > m_cBands)
{ {
/* Search for a free band object */ /* Search for a free band object */
@ -447,16 +454,14 @@ HRESULT STDMETHODCALLTYPE CBandSiteBase::AddBand(IUnknown *punk)
NewAllocated = 0xFFFF; NewAllocated = 0xFFFF;
if (NewAllocated == m_cBandsAllocated) if (NewAllocated == m_cBandsAllocated)
{ {
hRet = E_OUTOFMEMORY; return E_OUTOFMEMORY;
goto Cleanup;
} }
NewBand = static_cast<struct BandObject *>(CoTaskMemAlloc(NewAllocated * sizeof(struct BandObject))); NewBand = static_cast<struct BandObject *>(CoTaskMemAlloc(NewAllocated * sizeof(struct BandObject)));
if (NewBand == NULL) if (NewBand == NULL)
{ {
hRet = E_OUTOFMEMORY; return E_OUTOFMEMORY;
goto Cleanup;
} }
/* Copy the old array */ /* Copy the old array */
@ -479,8 +484,7 @@ HRESULT STDMETHODCALLTYPE CBandSiteBase::AddBand(IUnknown *punk)
m_bands = static_cast<struct BandObject *>(CoTaskMemAlloc(8 * sizeof(struct BandObject))); m_bands = static_cast<struct BandObject *>(CoTaskMemAlloc(8 * sizeof(struct BandObject)));
if (m_bands == NULL) if (m_bands == NULL)
{ {
hRet = E_OUTOFMEMORY; return E_OUTOFMEMORY;
goto Cleanup;
} }
/* Initialize the added bands */ /* Initialize the added bands */
@ -490,67 +494,65 @@ HRESULT STDMETHODCALLTYPE CBandSiteBase::AddBand(IUnknown *punk)
NewBand = &m_bands[0]; NewBand = &m_bands[0];
} }
ASSERT(NewBand != NULL);
m_cBands++;
NewBand->DeskBand = DeskBand.Detach();
NewBand->OleWindow = OleWindow.Detach();
NewBand->WndEvtHandler = WndEvtHandler.Detach();
/* Create the ReBar band */
hRet = ObjWithSite->SetSite(static_cast<IOleWindow *>(this));
if (SUCCEEDED(hRet)) if (SUCCEEDED(hRet))
{ {
ASSERT(NewBand != NULL); uBand = 0xffffffff;
if (SUCCEEDED(_UpdateBand(NewBand)))
m_cBands++;
NewBand->DeskBand = DeskBand.Detach();
NewBand->OleWindow = OleWindow.Detach();
NewBand->WndEvtHandler = WndEvtHandler.Detach();
/* Create the ReBar band */
hRet = ObjWithSite->SetSite(static_cast<IOleWindow *>(this));
if (SUCCEEDED(hRet))
{ {
uBand = 0xffffffff; if (NewBand->dbi.dwMask & DBIM_MODEFLAGS)
if (SUCCEEDED(_UpdateBand(NewBand)))
{ {
if (NewBand->dbi.dwMask & DBIM_MODEFLAGS) if (NewBand->dbi.dwModeFlags & DBIMF_ADDTOFRONT)
{ uBand = 0;
if (NewBand->dbi.dwModeFlags & DBIMF_ADDTOFRONT)
uBand = 0;
}
} }
}
_BuildBandInfo(NewBand, &rbi); _BuildBandInfo(NewBand, &rbi);
if (SUCCEEDED(NewBand->OleWindow->GetWindow(&rbi.hwndChild)) && if (SUCCEEDED(NewBand->OleWindow->GetWindow(&rbi.hwndChild)) &&
rbi.hwndChild != NULL) rbi.hwndChild != NULL)
{
rbi.fMask |= RBBIM_CHILD;
WARN ("ReBar band uses child window 0x%p\n", rbi.hwndChild);
}
if (!SendMessageW(m_hwndRebar, RB_INSERTBANDW, (WPARAM)uBand, reinterpret_cast<LPARAM>(&rbi)))
return E_FAIL;
hRet = (HRESULT)((USHORT)_GetBandID(NewBand));
_UpdateAllBands();
}
else
{
WARN("IBandSite::AddBand(): Call to IDeskBand::SetSite() failed: %x\n", hRet);
/* Remove the band from the ReBar control */
_BuildBandInfo(NewBand, &rbi);
uBand = (UINT)SendMessageW(m_hwndRebar, RB_IDTOINDEX, (WPARAM)rbi.wID, 0);
if (uBand != (UINT)-1)
{
if (!SendMessageW(m_hwndRebar, RB_DELETEBAND, (WPARAM)uBand, 0))
{ {
rbi.fMask |= RBBIM_CHILD; ERR("Failed to delete band!\n");
WARN ("ReBar band uses child window 0x%p\n", rbi.hwndChild);
} }
if (!SendMessageW(m_hwndRebar, RB_INSERTBANDW, (WPARAM)uBand, reinterpret_cast<LPARAM>(&rbi)))
return E_FAIL;
hRet = (HRESULT)((USHORT)_GetBandID(NewBand));
} }
else else
{ ERR("Failed to map band id to index!\n");
WARN("IBandSite::AddBand(): Call to IDeskBand::SetSite() failed: %x\n", hRet);
/* Remove the band from the ReBar control */ _FreeBand(NewBand);
_BuildBandInfo(NewBand, &rbi);
uBand = (UINT)SendMessageW(m_hwndRebar, RB_IDTOINDEX, (WPARAM)rbi.wID, 0);
if (uBand != (UINT)-1)
{
if (!SendMessageW(m_hwndRebar, RB_DELETEBAND, (WPARAM)uBand, 0))
{
ERR("Failed to delete band!\n");
}
}
else
ERR("Failed to map band id to index!\n");
_FreeBand(NewBand); hRet = E_FAIL;
hRet = E_FAIL;
/* goto Cleanup; */
}
} }
Cleanup:
return hRet; return hRet;
} }
@ -675,14 +677,29 @@ HRESULT STDMETHODCALLTYPE CBandSiteBase::GetBandObject(DWORD dwBandID, REFIID ri
HRESULT STDMETHODCALLTYPE CBandSiteBase::SetBandSiteInfo(const BANDSITEINFO *pbsinfo) HRESULT STDMETHODCALLTYPE CBandSiteBase::SetBandSiteInfo(const BANDSITEINFO *pbsinfo)
{ {
FIXME("(%p, %p)\n", this, pbsinfo); if (!pbsinfo)
return E_NOTIMPL; return E_INVALIDARG;
if ((pbsinfo->dwMask & BSIM_STATE))
m_dwState = pbsinfo->dwState;
if ((pbsinfo->dwMask & BSIM_STYLE))
m_dwStyle = pbsinfo->dwStyle;
_UpdateAllBands();
return S_OK;
} }
HRESULT STDMETHODCALLTYPE CBandSiteBase::GetBandSiteInfo(BANDSITEINFO *pbsinfo) HRESULT STDMETHODCALLTYPE CBandSiteBase::GetBandSiteInfo(BANDSITEINFO *pbsinfo)
{ {
FIXME("(%p, %p)\n", this, pbsinfo); if (!pbsinfo)
return E_NOTIMPL; return E_INVALIDARG;
if ((pbsinfo->dwMask & BSIM_STATE))
pbsinfo->dwState = m_dwState;
if ((pbsinfo->dwMask & BSIM_STYLE))
pbsinfo->dwStyle = m_dwStyle;
return S_OK;
} }
HRESULT STDMETHODCALLTYPE CBandSiteBase::OnWinEvent(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *plrResult) HRESULT STDMETHODCALLTYPE CBandSiteBase::OnWinEvent(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *plrResult)

View file

@ -54,6 +54,8 @@ private:
struct BandObject *m_bands; struct BandObject *m_bands;
HWND m_hwndRebar; HWND m_hwndRebar;
CComPtr<IOleWindow> m_site; CComPtr<IOleWindow> m_site;
DWORD m_dwState; /* BSSF_ flags */
DWORD m_dwStyle; /* BSIS_ flags */
public: public:
CBandSiteBase(); CBandSiteBase();
~CBandSiteBase(); ~CBandSiteBase();