mirror of
https://github.com/reactos/reactos.git
synced 2025-02-22 16:36:33 +00:00
[RSHELL]
* 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:
parent
6f06c27374
commit
683375abdb
7 changed files with 187 additions and 132 deletions
|
@ -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, ¶ms);
|
::TrackPopupMenuEx(popup, flags, x, y, m_menuOwner, ¶ms);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// FIXME: Windows uses the top-level window when calling TrackPopupMenuEx,
|
::TrackPopupMenuEx(popup, flags, x, y, m_topLevelWindow, ¶ms);
|
||||||
// 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, ¶ms);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
};
|
};
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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_ */
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue