mirror of
https://github.com/reactos/reactos.git
synced 2025-04-20 04:20:46 +00:00
[BROWSEUI] CBandSite: Implement SetBandSiteInfo and GetBandSiteInfo
Only BSIS_LOCKED, BSIS_NOGRIPPER, BSIS_ALWAYSGRIPPER and BSIS_NOCAPTION supported so far.
This commit is contained in:
parent
6785192fe6
commit
6d4a091b4a
2 changed files with 108 additions and 89 deletions
|
@ -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)
|
||||||
|
|
|
@ -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();
|
||||||
|
|
Loading…
Reference in a new issue