* Fix reusing the same toolbar when SetMenu is called multiple times.
* Avoid some null dereferences.

[BROWSEUI]
* Temporarily (?) disable the logo band.

The browser window's "coolbar" and menubar now display and work properly in both Windows and ReactOS.

CORE-7586

svn path=/branches/shell-experiments/; revision=62472
This commit is contained in:
David Quintana 2014-03-11 10:42:25 +00:00
parent 6f06c27374
commit 683375abdb
7 changed files with 187 additions and 132 deletions

View file

@ -28,6 +28,10 @@
WINE_DEFAULT_DEBUG_CHANNEL(CMenuBand); WINE_DEFAULT_DEBUG_CHANNEL(CMenuBand);
#undef UNIMPLEMENTED
#define UNIMPLEMENTED DbgPrint("%s is UNIMPLEMENTED!\n", __FUNCTION__)
extern "C" extern "C"
HRESULT WINAPI CMenuBand_Constructor(REFIID riid, LPVOID *ppv) HRESULT WINAPI CMenuBand_Constructor(REFIID riid, LPVOID *ppv)
{ {
@ -121,9 +125,14 @@ HRESULT STDMETHODCALLTYPE CMenuBand::SetMenu(
HWND hwnd, HWND hwnd,
DWORD dwFlags) DWORD dwFlags)
{ {
DbgPrint("CMenuBand::SetMenu called, hmenu=%p; hwnd=%p, flags=%x\n", hmenu, hwnd, dwFlags);
BOOL created = FALSE;
if (m_staticToolbar == NULL) if (m_staticToolbar == NULL)
{ {
m_staticToolbar = new CMenuStaticToolbar(this); m_staticToolbar = new CMenuStaticToolbar(this);
created = true;
} }
m_hmenu = hmenu; m_hmenu = hmenu;
m_menuOwner = hwnd; m_menuOwner = hwnd;
@ -140,11 +149,18 @@ HRESULT STDMETHODCALLTYPE CMenuBand::SetMenu(
if (FAILED_UNEXPECTEDLY(hr)) if (FAILED_UNEXPECTEDLY(hr))
return hr; return hr;
hr = m_staticToolbar->CreateToolbar(hwndParent, m_dwFlags); if (created)
if (FAILED_UNEXPECTEDLY(hr)) {
return hr; hr = m_staticToolbar->CreateToolbar(hwndParent, m_dwFlags);
if (FAILED_UNEXPECTEDLY(hr))
return hr;
hr = m_staticToolbar->FillToolbar(); hr = m_staticToolbar->FillToolbar();
}
else
{
hr = m_staticToolbar->FillToolbar(TRUE);
}
} }
return hr; return hr;
@ -206,7 +222,7 @@ HRESULT STDMETHODCALLTYPE CMenuBand::SetSite(IUnknown *pUnkSite)
} }
hr = IUnknown_QueryService(m_site, SID_SMenuPopup, IID_PPV_ARG(IMenuPopup, &m_subMenuParent)); hr = IUnknown_QueryService(m_site, SID_SMenuPopup, IID_PPV_ARG(IMenuPopup, &m_subMenuParent));
if (FAILED(hr) && hr != E_NOINTERFACE) if (hr != E_NOINTERFACE && FAILED_UNEXPECTEDLY(hr))
return hr; return hr;
CComPtr<IOleWindow> pTopLevelWindow; CComPtr<IOleWindow> pTopLevelWindow;
@ -303,6 +319,8 @@ HRESULT STDMETHODCALLTYPE CMenuBand::GetBandInfo(
if (m_staticToolbar == NULL && m_SFToolbar == NULL) if (m_staticToolbar == NULL && m_SFToolbar == NULL)
return E_FAIL; return E_FAIL;
pdbi->ptMinSize.x = max(sizeStatic.cx, sizeShlFld.cx) + 20;
pdbi->ptMinSize.y = sizeStatic.cy + sizeShlFld.cy;
pdbi->ptMaxSize.x = max(sizeStatic.cx, sizeShlFld.cx) + 20; pdbi->ptMaxSize.x = max(sizeStatic.cx, sizeShlFld.cx) + 20;
pdbi->ptMaxSize.y = sizeStatic.cy + sizeShlFld.cy; pdbi->ptMaxSize.y = sizeStatic.cy + sizeShlFld.cy;
@ -368,9 +386,12 @@ HRESULT STDMETHODCALLTYPE CMenuBand::UIActivateIO(BOOL fActivate, LPMSG lpMsg)
{ {
HRESULT hr; HRESULT hr;
hr = m_subMenuParent->SetSubMenu(this, fActivate); if (m_subMenuParent)
if (FAILED_UNEXPECTEDLY(hr)) {
return hr; hr = m_subMenuParent->SetSubMenu(this, fActivate);
if (FAILED_UNEXPECTEDLY(hr))
return hr;
}
if (fActivate) if (fActivate)
{ {
@ -436,18 +457,26 @@ HRESULT STDMETHODCALLTYPE CMenuBand::OnSelect(DWORD dwSelectType)
switch (dwSelectType) switch (dwSelectType)
{ {
case MPOS_CHILDTRACKING: case MPOS_CHILDTRACKING:
if (!m_subMenuParent)
break;
// TODO: Cancel timers? // TODO: Cancel timers?
return m_subMenuParent->OnSelect(dwSelectType); return m_subMenuParent->OnSelect(dwSelectType);
case MPOS_SELECTLEFT: case MPOS_SELECTLEFT:
if (m_subMenuChild) if (m_subMenuChild)
m_subMenuChild->OnSelect(MPOS_CANCELLEVEL); m_subMenuChild->OnSelect(MPOS_CANCELLEVEL);
if (!m_subMenuParent)
break;
return m_subMenuParent->OnSelect(dwSelectType); return m_subMenuParent->OnSelect(dwSelectType);
case MPOS_SELECTRIGHT: case MPOS_SELECTRIGHT:
if (!m_subMenuParent)
break;
return m_subMenuParent->OnSelect(dwSelectType); return m_subMenuParent->OnSelect(dwSelectType);
case MPOS_EXECUTE: case MPOS_EXECUTE:
case MPOS_FULLCANCEL: case MPOS_FULLCANCEL:
if (m_subMenuChild) if (m_subMenuChild)
m_subMenuChild->OnSelect(dwSelectType); m_subMenuChild->OnSelect(dwSelectType);
if (!m_subMenuParent)
break;
return m_subMenuParent->OnSelect(dwSelectType); return m_subMenuParent->OnSelect(dwSelectType);
case MPOS_CANCELLEVEL: case MPOS_CANCELLEVEL:
if (m_subMenuChild) if (m_subMenuChild)
@ -620,24 +649,17 @@ HRESULT CMenuBand::_CallCB(UINT uMsg, WPARAM wParam, LPARAM lParam, UINT id, LPI
HRESULT CMenuBand::_TrackSubMenuUsingTrackPopupMenu(HMENU popup, INT x, INT y, RECT& rcExclude) HRESULT CMenuBand::_TrackSubMenuUsingTrackPopupMenu(HMENU popup, INT x, INT y, RECT& rcExclude)
{ {
HWND sendTo = m_menuOwner;
TPMPARAMS params = { sizeof(TPMPARAMS), rcExclude }; TPMPARAMS params = { sizeof(TPMPARAMS), rcExclude };
UINT flags = TPM_VERPOSANIMATION | TPM_VERTICAL | TPM_LEFTALIGN; UINT flags = TPM_VERPOSANIMATION | TPM_VERTICAL | TPM_LEFTALIGN;
if (sendTo) if (m_menuOwner)
{ {
::TrackPopupMenuEx(popup, flags, x, y, sendTo, &params); ::TrackPopupMenuEx(popup, flags, x, y, m_menuOwner, &params);
} }
else else
{ {
// FIXME: Windows uses the top-level window when calling TrackPopupMenuEx, ::TrackPopupMenuEx(popup, flags, x, y, m_topLevelWindow, &params);
// but this is probably not the means by which it obtains that HWND.
// Meanwhile, this works.
GetWindow(&sendTo);
sendTo = GetAncestor(sendTo, GA_ROOT);
::TrackPopupMenuEx(popup, flags, x, y, sendTo, &params);
} }
return S_OK; return S_OK;
@ -720,6 +742,8 @@ HRESULT CMenuBand::_MenuItemHotTrack(DWORD changeType)
{ {
if (m_subMenuChild) if (m_subMenuChild)
m_subMenuChild->OnSelect(MPOS_CANCELLEVEL); m_subMenuChild->OnSelect(MPOS_CANCELLEVEL);
if (!m_subMenuParent)
return S_OK;
return m_subMenuParent->OnSelect(MPOS_CANCELLEVEL); return m_subMenuParent->OnSelect(MPOS_CANCELLEVEL);
} }
else if (changeType == MPOS_SELECTRIGHT) else if (changeType == MPOS_SELECTRIGHT)
@ -732,10 +756,14 @@ HRESULT CMenuBand::_MenuItemHotTrack(DWORD changeType)
return S_FALSE; return S_FALSE;
} }
} }
if (!m_subMenuParent)
return S_OK;
return m_subMenuParent->OnSelect(changeType); return m_subMenuParent->OnSelect(changeType);
} }
else else
{ {
if (!m_subMenuParent)
return S_OK;
return m_subMenuParent->OnSelect(changeType); return m_subMenuParent->OnSelect(changeType);
} }
return S_OK; return S_OK;
@ -754,7 +782,10 @@ HRESULT CMenuBand::_OnPopupSubMenu(IMenuPopup * popup, POINTL * pAt, RECTL * pEx
m_subMenuChild = popup; m_subMenuChild = popup;
if (popup) if (popup)
{ {
IUnknown_SetSite(popup, m_subMenuParent); if (m_subMenuParent)
IUnknown_SetSite(popup, m_subMenuParent);
else
IUnknown_SetSite(popup, m_site);
popup->Popup(pAt, pExclude, MPPF_RIGHT); popup->Popup(pAt, pExclude, MPPF_RIGHT);
} }

View file

@ -42,20 +42,9 @@ HRESULT WINAPI SHGetImageList(
HRESULT CMenuToolbarBase::OnWinEvent(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *theResult) HRESULT CMenuToolbarBase::OnWinEvent(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *theResult)
{ {
RECT rc;
HDC hdc;
HBRUSH bgBrush;
HBRUSH hotBrush;
NMHDR * hdr; NMHDR * hdr;
NMTBCUSTOMDRAW * cdraw;
NMTBHOTITEM * hot;
NMMOUSE * rclick;
NMPGCALCSIZE* csize; NMPGCALCSIZE* csize;
TBBUTTONINFO btni;
COLORREF clrText;
COLORREF clrTextHighlight;
SIZE tbs; SIZE tbs;
bool isHot, isPopup;
*theResult = 0; *theResult = 0;
switch (uMsg) switch (uMsg)
@ -71,6 +60,9 @@ HRESULT CMenuToolbarBase::OnWinEvent(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM
case TTN_GETDISPINFOW: case TTN_GETDISPINFOW:
return S_OK; return S_OK;
case TBN_DELETINGBUTTON:
return OnDeletingButton(reinterpret_cast<LPNMTOOLBAR>(hdr));
case PGN_CALCSIZE: case PGN_CALCSIZE:
csize = reinterpret_cast<LPNMPGCALCSIZE>(hdr); csize = reinterpret_cast<LPNMPGCALCSIZE>(hdr);
@ -90,83 +82,17 @@ HRESULT CMenuToolbarBase::OnWinEvent(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM
return OnCommand(wParam, 0, theResult); return OnCommand(wParam, 0, theResult);
case TBN_HOTITEMCHANGE: case TBN_HOTITEMCHANGE:
hot = reinterpret_cast<LPNMTBHOTITEM>(hdr); return OnHotItemChange(reinterpret_cast<LPNMTBHOTITEM>(hdr));
return OnHotItemChange(hot);
case NM_RCLICK: case NM_RCLICK:
rclick = reinterpret_cast<LPNMMOUSE>(hdr); return OnContextMenu(reinterpret_cast<LPNMMOUSE>(hdr));
return OnContextMenu(rclick);
case NM_CUSTOMDRAW: case NM_CUSTOMDRAW:
cdraw = reinterpret_cast<LPNMTBCUSTOMDRAW>(hdr); return OnCustomDraw(reinterpret_cast<LPNMTBCUSTOMDRAW>(hdr), theResult);
switch (cdraw->nmcd.dwDrawStage)
{
case CDDS_PREPAINT:
if (m_toolbarFlags & SMINIT_VERTICAL)
*theResult = CDRF_NOTIFYITEMDRAW;
return S_OK;
case CDDS_ITEMPREPAINT:
clrText = GetSysColor(COLOR_MENUTEXT);
clrTextHighlight = GetSysColor(COLOR_HIGHLIGHTTEXT);
bgBrush = GetSysColorBrush(COLOR_MENU);
hotBrush = GetSysColorBrush(m_useFlatMenus ? COLOR_MENUHILIGHT : COLOR_HIGHLIGHT);
rc = cdraw->nmcd.rc;
hdc = cdraw->nmcd.hdc;
isHot = m_hotBar == this && m_hotItem == static_cast<INT>(cdraw->nmcd.dwItemSpec);
isPopup = m_popupBar == this && m_popupItem == static_cast<INT>(cdraw->nmcd.dwItemSpec);
if (isHot || (m_hotItem < 0 && isPopup))
{
cdraw->nmcd.uItemState |= CDIS_HOT;
}
else
{
cdraw->nmcd.uItemState &= ~CDIS_HOT;
}
if (cdraw->nmcd.uItemState&CDIS_HOT)
{
FillRect(hdc, &rc, hotBrush);
SetTextColor(hdc, clrTextHighlight);
cdraw->clrText = clrTextHighlight;
}
else
{
FillRect(hdc, &rc, bgBrush);
SetTextColor(hdc, clrText);
cdraw->clrText = clrText;
}
cdraw->iListGap += 4;
*theResult = CDRF_NOTIFYPOSTPAINT | TBCDRF_NOBACKGROUND | TBCDRF_NOEDGES | TBCDRF_NOOFFSET | TBCDRF_NOMARK | 0x00800000; // FIXME: the last bit is Vista+, for debugging only
return S_OK;
case CDDS_ITEMPOSTPAINT:
btni.cbSize = sizeof(btni);
btni.dwMask = TBIF_STYLE;
SendMessage(hWnd, TB_GETBUTTONINFO, cdraw->nmcd.dwItemSpec, reinterpret_cast<LPARAM>(&btni));
if (btni.fsStyle & BTNS_DROPDOWN)
{
SelectObject(cdraw->nmcd.hdc, m_marlett);
WCHAR text[] = L"8";
SetBkMode(cdraw->nmcd.hdc, TRANSPARENT);
RECT rc = cdraw->nmcd.rc;
rc.right += 1;
DrawTextEx(cdraw->nmcd.hdc, text, 1, &rc, DT_NOCLIP | DT_VCENTER | DT_RIGHT | DT_SINGLELINE, NULL);
}
*theResult = TRUE;
return S_OK;
}
return S_OK;
case RBN_CHILDSIZE: case RBN_CHILDSIZE:
return S_OK; return S_OK;
default: default:
DbgPrint("WM_NOTIFY unknown code %d, %d\n", hdr->code, hdr->idFrom); DbgPrint("WM_NOTIFY unknown code %d, %d\n", hdr->code, hdr->idFrom);
} }
@ -176,6 +102,84 @@ HRESULT CMenuToolbarBase::OnWinEvent(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM
return S_FALSE; return S_FALSE;
} }
HRESULT CMenuToolbarBase::OnCustomDraw(LPNMTBCUSTOMDRAW cdraw, LRESULT * theResult)
{
RECT rc;
HDC hdc;
HBRUSH bgBrush;
HBRUSH hotBrush;
COLORREF clrText;
COLORREF clrTextHighlight;
bool isHot, isPopup;
TBBUTTONINFO btni;
switch (cdraw->nmcd.dwDrawStage)
{
case CDDS_PREPAINT:
if (m_toolbarFlags & SMINIT_VERTICAL)
*theResult = CDRF_NOTIFYITEMDRAW;
return S_OK;
case CDDS_ITEMPREPAINT:
clrText = GetSysColor(COLOR_MENUTEXT);
clrTextHighlight = GetSysColor(COLOR_HIGHLIGHTTEXT);
bgBrush = GetSysColorBrush(COLOR_MENU);
hotBrush = GetSysColorBrush(m_useFlatMenus ? COLOR_MENUHILIGHT : COLOR_HIGHLIGHT);
rc = cdraw->nmcd.rc;
hdc = cdraw->nmcd.hdc;
isHot = m_hotBar == this && m_hotItem == static_cast<INT>(cdraw->nmcd.dwItemSpec);
isPopup = m_popupBar == this && m_popupItem == static_cast<INT>(cdraw->nmcd.dwItemSpec);
if (isHot || (m_hotItem < 0 && isPopup))
{
cdraw->nmcd.uItemState |= CDIS_HOT;
}
else
{
cdraw->nmcd.uItemState &= ~CDIS_HOT;
}
if (cdraw->nmcd.uItemState&CDIS_HOT)
{
FillRect(hdc, &rc, hotBrush);
SetTextColor(hdc, clrTextHighlight);
cdraw->clrText = clrTextHighlight;
}
else
{
FillRect(hdc, &rc, bgBrush);
SetTextColor(hdc, clrText);
cdraw->clrText = clrText;
}
cdraw->iListGap += 4;
*theResult = CDRF_NOTIFYPOSTPAINT | TBCDRF_NOBACKGROUND | TBCDRF_NOEDGES | TBCDRF_NOOFFSET | TBCDRF_NOMARK | 0x00800000; // FIXME: the last bit is Vista+, for debugging only
return S_OK;
case CDDS_ITEMPOSTPAINT:
btni.cbSize = sizeof(btni);
btni.dwMask = TBIF_STYLE;
SendMessage(m_hwndToolbar, TB_GETBUTTONINFO, cdraw->nmcd.dwItemSpec, reinterpret_cast<LPARAM>(&btni));
if (btni.fsStyle & BTNS_DROPDOWN)
{
SelectObject(cdraw->nmcd.hdc, m_marlett);
WCHAR text[] = L"8";
SetBkMode(cdraw->nmcd.hdc, TRANSPARENT);
RECT rc = cdraw->nmcd.rc;
rc.right += 1;
DrawTextEx(cdraw->nmcd.hdc, text, 1, &rc, DT_NOCLIP | DT_VCENTER | DT_RIGHT | DT_SINGLELINE, NULL);
}
*theResult = TRUE;
return S_OK;
}
return S_OK;
}
CMenuToolbarBase::CMenuToolbarBase(CMenuBand *menuBand, BOOL usePager) : CMenuToolbarBase::CMenuToolbarBase(CMenuBand *menuBand, BOOL usePager) :
m_hwnd(NULL), m_hwnd(NULL),
m_useFlatMenus(FALSE), m_useFlatMenus(FALSE),
@ -845,11 +849,19 @@ HRESULT CMenuStaticToolbar::SetMenu(
return S_OK; return S_OK;
} }
HRESULT CMenuStaticToolbar::FillToolbar() HRESULT CMenuStaticToolbar::FillToolbar(BOOL clearFirst)
{ {
int i; int i;
int ic = GetMenuItemCount(m_hmenu); int ic = GetMenuItemCount(m_hmenu);
if (clearFirst)
{
while (SendMessage(m_hwndToolbar, TB_DELETEBUTTON, 0, 0))
{
// empty;
}
}
int count = 0; int count = 0;
for (i = 0; i < ic; i++) for (i = 0; i < ic; i++)
{ {
@ -896,6 +908,14 @@ HRESULT CMenuStaticToolbar::FillToolbar()
} }
} }
DbgPrint("Created toolbar with %d buttons.\n", count);
return S_OK;
}
HRESULT CMenuStaticToolbar::OnDeletingButton(const NMTOOLBAR * tb)
{
delete reinterpret_cast<SMINFO*>(tb->tbButton.dwData);
return S_OK; return S_OK;
} }
@ -959,7 +979,7 @@ CMenuSFToolbar::~CMenuSFToolbar()
{ {
} }
HRESULT CMenuSFToolbar::FillToolbar() HRESULT CMenuSFToolbar::FillToolbar(BOOL clearFirst)
{ {
HRESULT hr; HRESULT hr;
int i = 0; int i = 0;
@ -1009,9 +1029,17 @@ HRESULT CMenuSFToolbar::FillToolbar()
return AddPlaceholder(); return AddPlaceholder();
} }
DbgPrint("Created toolbar with %d buttons.\n", i);
return hr; return hr;
} }
HRESULT CMenuSFToolbar::OnDeletingButton(const NMTOOLBAR * tb)
{
ILFree(reinterpret_cast<LPITEMIDLIST>(tb->tbButton.dwData));
return S_OK;
}
HRESULT CMenuSFToolbar::SetShellFolder(IShellFolder *psf, LPCITEMIDLIST pidlFolder, HKEY hKey, DWORD dwFlags) HRESULT CMenuSFToolbar::SetShellFolder(IShellFolder *psf, LPCITEMIDLIST pidlFolder, HKEY hKey, DWORD dwFlags)
{ {
m_shellFolder = psf; m_shellFolder = psf;

View file

@ -74,7 +74,7 @@ public:
void InvalidateDraw(); void InvalidateDraw();
virtual HRESULT FillToolbar() = 0; virtual HRESULT FillToolbar(BOOL clearFirst=FALSE) = 0;
virtual HRESULT OnContextMenu(NMMOUSE * rclick) = 0; virtual HRESULT OnContextMenu(NMMOUSE * rclick) = 0;
HRESULT PopupItem(INT uItem); HRESULT PopupItem(INT uItem);
@ -84,6 +84,7 @@ public:
protected: protected:
virtual HRESULT OnCommand(WPARAM wParam, LPARAM lParam, LRESULT *theResult); virtual HRESULT OnCommand(WPARAM wParam, LPARAM lParam, LRESULT *theResult);
virtual HRESULT OnDeletingButton(const NMTOOLBAR * tb) = 0;
virtual HRESULT InternalPopupItem(INT uItem, INT index, DWORD_PTR dwData) = 0; virtual HRESULT InternalPopupItem(INT uItem, INT index, DWORD_PTR dwData) = 0;
virtual HRESULT InternalHasSubMenu(INT uItem, INT index, DWORD_PTR dwData) = 0; virtual HRESULT InternalHasSubMenu(INT uItem, INT index, DWORD_PTR dwData) = 0;
@ -94,6 +95,9 @@ protected:
HRESULT AddPlaceholder(); HRESULT AddPlaceholder();
HRESULT UpdateImageLists(); HRESULT UpdateImageLists();
private:
HRESULT OnCustomDraw(LPNMTBCUSTOMDRAW cdraw, LRESULT * theResult);
}; };
class CMenuStaticToolbar : class CMenuStaticToolbar :
@ -109,11 +113,13 @@ public:
HRESULT SetMenu(HMENU hmenu, HWND hwnd, DWORD dwFlags); HRESULT SetMenu(HMENU hmenu, HWND hwnd, DWORD dwFlags);
HRESULT GetMenu(HMENU *phmenu, HWND *phwnd, DWORD *pdwFlags); HRESULT GetMenu(HMENU *phmenu, HWND *phwnd, DWORD *pdwFlags);
virtual HRESULT FillToolbar(); virtual HRESULT FillToolbar(BOOL clearFirst=FALSE);
virtual HRESULT OnCommand(WPARAM wParam, LPARAM lParam, LRESULT *theResult); virtual HRESULT OnCommand(WPARAM wParam, LPARAM lParam, LRESULT *theResult);
virtual HRESULT OnContextMenu(NMMOUSE * rclick); virtual HRESULT OnContextMenu(NMMOUSE * rclick);
protected: protected:
virtual HRESULT OnDeletingButton(const NMTOOLBAR * tb);
virtual HRESULT InternalPopupItem(INT uItem, INT index, DWORD_PTR dwData); virtual HRESULT InternalPopupItem(INT uItem, INT index, DWORD_PTR dwData);
virtual HRESULT InternalHasSubMenu(INT uItem, INT index, DWORD_PTR dwData); virtual HRESULT InternalHasSubMenu(INT uItem, INT index, DWORD_PTR dwData);
}; };
@ -133,11 +139,13 @@ public:
HRESULT SetShellFolder(IShellFolder *psf, LPCITEMIDLIST pidlFolder, HKEY hKey, DWORD dwFlags); HRESULT SetShellFolder(IShellFolder *psf, LPCITEMIDLIST pidlFolder, HKEY hKey, DWORD dwFlags);
HRESULT GetShellFolder(DWORD *pdwFlags, LPITEMIDLIST *ppidl, REFIID riid, void **ppv); HRESULT GetShellFolder(DWORD *pdwFlags, LPITEMIDLIST *ppidl, REFIID riid, void **ppv);
virtual HRESULT FillToolbar(); virtual HRESULT FillToolbar(BOOL clearFirst=FALSE);
virtual HRESULT OnCommand(WPARAM wParam, LPARAM lParam, LRESULT *theResult); virtual HRESULT OnCommand(WPARAM wParam, LPARAM lParam, LRESULT *theResult);
virtual HRESULT OnContextMenu(NMMOUSE * rclick); virtual HRESULT OnContextMenu(NMMOUSE * rclick);
protected: protected:
virtual HRESULT OnDeletingButton(const NMTOOLBAR * tb);
virtual HRESULT InternalPopupItem(INT uItem, INT index, DWORD_PTR dwData); virtual HRESULT InternalPopupItem(INT uItem, INT index, DWORD_PTR dwData);
virtual HRESULT InternalHasSubMenu(INT uItem, INT index, DWORD_PTR dwData); virtual HRESULT InternalHasSubMenu(INT uItem, INT index, DWORD_PTR dwData);
}; };

View file

@ -822,7 +822,7 @@ HRESULT STDMETHODCALLTYPE CInternetToolbar::GetSizeMax(ULARGE_INTEGER *pcbSize)
HRESULT STDMETHODCALLTYPE CInternetToolbar::InitNew() HRESULT STDMETHODCALLTYPE CInternetToolbar::InitNew()
{ {
CComPtr<IShellMenu> menuBar; CComPtr<IShellMenu> menuBar;
CComPtr<IUnknown> logoBar; //CComPtr<IUnknown> logoBar;
CComPtr<IUnknown> toolsBar; CComPtr<IUnknown> toolsBar;
CComPtr<IUnknown> navigationBar; CComPtr<IUnknown> navigationBar;
CComPtr<IOleWindow> menuOleWindow; CComPtr<IOleWindow> menuOleWindow;
@ -840,12 +840,14 @@ HRESULT STDMETHODCALLTYPE CInternetToolbar::InitNew()
hResult = menuOleWindow->GetWindow(&fMenuBandWindow); hResult = menuOleWindow->GetWindow(&fMenuBandWindow);
fMenuBar.Attach(menuBar.Detach()); // transfer the ref count fMenuBar.Attach(menuBar.Detach()); // transfer the ref count
/* FIXME
hResult = CreateBrandBand(&logoBar); hResult = CreateBrandBand(&logoBar);
if (FAILED(hResult)) if (FAILED(hResult))
return hResult; return hResult;
AddDockItem(logoBar, ITBBID_BRANDBAND, AddDockItem(logoBar, ITBBID_BRANDBAND,
CDockSite::ITF_NOGRIPPER | CDockSite::ITF_NOTITLE | CDockSite::ITF_FIXEDSIZE); CDockSite::ITF_NOGRIPPER | CDockSite::ITF_NOTITLE | CDockSite::ITF_FIXEDSIZE);
fLogoBar.Attach(logoBar.Detach()); // transfer the ref count fLogoBar.Attach(logoBar.Detach()); // transfer the ref count
*/
hResult = CreateToolsBar(&toolsBar); hResult = CreateToolsBar(&toolsBar);
if (FAILED(hResult)) if (FAILED(hResult))
@ -1217,8 +1219,8 @@ HRESULT STDMETHODCALLTYPE CInternetToolbar::QueryBand(DWORD dwBandID,
return E_POINTER; return E_POINTER;
if (dwBandID == ITBBID_MENUBAND && fMenuBar.p != NULL) if (dwBandID == ITBBID_MENUBAND && fMenuBar.p != NULL)
return fMenuBar->QueryInterface(IID_IDeskBand, reinterpret_cast<void **>(ppstb)); return fMenuBar->QueryInterface(IID_IDeskBand, reinterpret_cast<void **>(ppstb));
if (dwBandID == ITBBID_BRANDBAND && fLogoBar.p != NULL) //if (dwBandID == ITBBID_BRANDBAND && fLogoBar.p != NULL)
return fLogoBar->QueryInterface(IID_IDeskBand, reinterpret_cast<void **>(ppstb)); // return fLogoBar->QueryInterface(IID_IDeskBand, reinterpret_cast<void **>(ppstb));
*ppstb = NULL; *ppstb = NULL;
return E_FAIL; return E_FAIL;
} }

View file

@ -87,7 +87,7 @@ public:
CComPtr<IShellMenu> fMenuBar; // the menu rebar CComPtr<IShellMenu> fMenuBar; // the menu rebar
HWND fMenuBandWindow; HWND fMenuBandWindow;
HWND fNavigationWindow; HWND fNavigationWindow;
CComPtr<IUnknown> fLogoBar; // the reactos logo //CComPtr<IUnknown> fLogoBar; // the reactos logo
CComPtr<IUnknown> fControlsBar; // navigation controls CComPtr<IUnknown> fControlsBar; // navigation controls
CComPtr<IUnknown> fNavigationBar; // address bar CComPtr<IUnknown> fNavigationBar; // address bar
CComObject<CMenuCallback> fMenuCallback; CComObject<CMenuCallback> fMenuCallback;

View file

@ -76,6 +76,12 @@ Win32DbgPrint(const char *filename, int line, const char *lpFormat, ...)
#define DbgPrint(fmt, ...) \ #define DbgPrint(fmt, ...) \
Win32DbgPrint(__FILE__, __LINE__, fmt, ##__VA_ARGS__) Win32DbgPrint(__FILE__, __LINE__, fmt, ##__VA_ARGS__)
#if 1
#define FAILED_UNEXPECTEDLY(hr) (FAILED(hr) && (DbgPrint("Unexpected failure %08x.\n", hr), TRUE))
#else
#define FAILED_UNEXPECTEDLY(hr) FAILED(hr)
#endif
WINE_DEFAULT_DEBUG_CHANNEL(browseui); WINE_DEFAULT_DEBUG_CHANNEL(browseui);
#endif /* _BROWSEUI_PCH_ */ #endif /* _BROWSEUI_PCH_ */

View file

@ -814,29 +814,6 @@ HRESULT CShellBrowser::Initialize(LPITEMIDLIST pidl, long b, long c, long d)
ShowWindow(SW_SHOWNORMAL); ShowWindow(SW_SHOWNORMAL);
// test code to make brand band animate
{
CComPtr<IOleCommandTarget> oleCommandTarget;
CComPtr<IServiceProvider> serviceProvider;
CComPtr<IBandSite> bandSite;
CComPtr<IDeskBand> deskBand;
CComPtr<IWinEventHandler> winEventHandler;
HRESULT hResult;
if (fClientBars[BIInternetToolbar].clientBar.p == NULL)
return 0;
hResult = fClientBars[BIInternetToolbar].clientBar->
QueryInterface(IID_IServiceProvider, reinterpret_cast<void **>(&serviceProvider));
hResult = serviceProvider->QueryService(SID_IBandSite, IID_IBandSite, reinterpret_cast<void **>(&bandSite));
hResult = bandSite->QueryBand(5, &deskBand, NULL, NULL, 0);
deskBand->QueryInterface(IID_IWinEventHandler, reinterpret_cast<void **>(&winEventHandler));
winEventHandler->IsWindowOwner(NULL);
deskBand->QueryInterface(IID_IOleCommandTarget, reinterpret_cast<void **>(&oleCommandTarget));
oleCommandTarget->QueryStatus(&CGID_BrandCmdGroup, 0, NULL, NULL);
oleCommandTarget->Exec(&CGID_BrandCmdGroup, BBID_STARTANIMATION, 0, NULL, NULL);
}
return S_OK; return S_OK;
} }
@ -3256,6 +3233,9 @@ static void ExplorerMessageLoop()
TranslateMessage(&Msg); TranslateMessage(&Msg);
DispatchMessage(&Msg); DispatchMessage(&Msg);
if (Msg.message == WM_QUIT)
break;
} }
} }
} }