Author: dquintana
Date: Tue Nov 11 01:05:39 2014
New Revision: 65373
URL:
http://svn.reactos.org/svn/reactos?rev=65373&view=rev
Log:
[RSHELL]
* Make use of the CToolbar class here too.
* Fix the menubar logic for closing menus on a second click. Almost. There's some
glitch when clicking too fast, that I will fix later.
Modified:
branches/shell-experiments/base/shell/explorer-new/taskswnd.cpp
branches/shell-experiments/base/shell/rshell/CMenuBand.cpp
branches/shell-experiments/base/shell/rshell/CMenuBand.h
branches/shell-experiments/base/shell/rshell/CMenuFocusManager.cpp
branches/shell-experiments/base/shell/rshell/CMenuToolbars.cpp
branches/shell-experiments/base/shell/rshell/CMenuToolbars.h
branches/shell-experiments/base/shell/rshell/precomp.h
branches/shell-experiments/include/reactos/rosctrls.h
Modified: branches/shell-experiments/base/shell/explorer-new/taskswnd.cpp
URL:
http://svn.reactos.org/svn/reactos/branches/shell-experiments/base/shell/ex…
==============================================================================
--- branches/shell-experiments/base/shell/explorer-new/taskswnd.cpp [iso-8859-1]
(original)
+++ branches/shell-experiments/base/shell/explorer-new/taskswnd.cpp [iso-8859-1] Tue Nov
11 01:05:39 2014
@@ -27,10 +27,12 @@
/* Set DUMP_TASKS to 1 to enable a dump of the tasks and task groups every
5 seconds */
#define DUMP_TASKS 0
+#define DEBUG_SHELL_HOOK 0
const WCHAR szTaskSwitchWndClass [] = TEXT("MSTaskSwWClass");
const WCHAR szRunningApps [] = TEXT("Running Applications");
+#if DEBUG_SHELL_HOOK
const struct {
INT msg;
LPCWSTR msg_name;
@@ -51,6 +53,7 @@
{ HSHELL_WINDOWREPLACING, L"HSHELL_WINDOWREPLACING" },
{ HSHELL_RUDEAPPACTIVATED, L"HSHELL_RUDEAPPACTIVATED" },
};
+#endif
typedef struct _TASK_GROUP
{
@@ -1445,6 +1448,7 @@
case HSHELL_GETMINRECT:
default:
{
+#if DEBUG_SHELL_HOOK
int i, found;
for (i = 0, found = 0; i != sizeof(hshell_msg) / sizeof(hshell_msg[0]); i++)
{
@@ -1455,10 +1459,10 @@
break;
}
}
- if (!found)
- {
- TRACE("Shell message %d unhandled (lParam = 0x%p)!\n", (INT)
wParam, lParam);
- }
+ if (found)
+ break;
+#endif
+ TRACE("Shell message %d unhandled (lParam = 0x%p)!\n", (INT)
wParam, lParam);
break;
}
}
Modified: branches/shell-experiments/base/shell/rshell/CMenuBand.cpp
URL:
http://svn.reactos.org/svn/reactos/branches/shell-experiments/base/shell/rs…
==============================================================================
--- branches/shell-experiments/base/shell/rshell/CMenuBand.cpp [iso-8859-1] (original)
+++ branches/shell-experiments/base/shell/rshell/CMenuBand.cpp [iso-8859-1] Tue Nov 11
01:05:39 2014
@@ -389,14 +389,14 @@
if (m_staticToolbar != NULL)
{
- hr = m_staticToolbar->ShowWindow(fShow);
+ hr = m_staticToolbar->ShowDW(fShow);
if (FAILED_UNEXPECTEDLY(hr))
return hr;
}
if (m_SFToolbar != NULL)
{
- hr = m_SFToolbar->ShowWindow(fShow);
+ hr = m_SFToolbar->ShowDW(fShow);
if (FAILED_UNEXPECTEDLY(hr))
return hr;
}
@@ -1061,6 +1061,15 @@
return S_OK;
}
+HRESULT CMenuBand::_BeforeCancelPopup()
+{
+ if (m_staticToolbar)
+ m_staticToolbar->BeforeCancelPopup();
+ if (m_SFToolbar)
+ m_SFToolbar->BeforeCancelPopup();
+ return S_OK;
+}
+
HRESULT CMenuBand::_DisableMouseTrack(BOOL bDisable)
{
if (m_staticToolbar)
Modified: branches/shell-experiments/base/shell/rshell/CMenuBand.h
URL:
http://svn.reactos.org/svn/reactos/branches/shell-experiments/base/shell/rs…
==============================================================================
--- branches/shell-experiments/base/shell/rshell/CMenuBand.h [iso-8859-1] (original)
+++ branches/shell-experiments/base/shell/rshell/CMenuBand.h [iso-8859-1] Tue Nov 11
01:05:39 2014
@@ -189,6 +189,7 @@
HRESULT _MenuItemHotTrack(DWORD changeType);
HRESULT _CancelCurrentPopup();
HRESULT _OnPopupSubMenu(IShellMenu * childShellMenu, POINTL * pAt, RECTL * pExclude,
BOOL mouseInitiated);
+ HRESULT _BeforeCancelPopup();
HRESULT _DisableMouseTrack(BOOL bDisable);
HRESULT _SetChildBand(CMenuBand * child);
HRESULT _SetParentBand(CMenuBand * parent);
Modified: branches/shell-experiments/base/shell/rshell/CMenuFocusManager.cpp
URL:
http://svn.reactos.org/svn/reactos/branches/shell-experiments/base/shell/rs…
==============================================================================
--- branches/shell-experiments/base/shell/rshell/CMenuFocusManager.cpp [iso-8859-1]
(original)
+++ branches/shell-experiments/base/shell/rshell/CMenuFocusManager.cpp [iso-8859-1] Tue
Nov 11 01:05:39 2014
@@ -383,8 +383,10 @@
// Don't do anything if another window is capturing the mouse.
HWND cCapture = ::GetCapture();
if (cCapture && cCapture != m_captureHwnd && m_current->type !=
TrackedMenuEntry)
+ {
+ TRACE("Foreign capture active.\n");
return TRUE;
-
+ }
POINT pt = msg->pt;
@@ -392,9 +394,21 @@
StackEntry * entry = NULL;
if (IsTrackedWindow(child, &entry) != S_OK)
+ {
+ TRACE("Foreign window detected.\n");
return TRUE;
+ }
TRACE("MouseDown %d\n", m_isLButtonDown);
+
+ if (entry->type == MenuBarEntry)
+ {
+ if (entry != m_current)
+ {
+ TRACE("Menubar with popup active.\n");
+ return TRUE;
+ }
+ }
if (entry)
{
@@ -473,33 +487,17 @@
switch (msg->message)
{
- case WM_NCLBUTTONDOWN:
case WM_LBUTTONDOWN:
- case WM_NCRBUTTONDOWN:
case WM_RBUTTONDOWN:
- if (m_menuBar)
+ if (m_menuBar && m_current->type == TrackedMenuEntry)
{
POINT pt = msg->pt;
HWND child = WindowFromPoint(pt);
BOOL hoveringMenuBar = m_menuBar->mb->IsWindowOwner(child) ==
S_OK;
if (hoveringMenuBar)
{
- m_menuBar->mb->_DisableMouseTrack(TRUE);
- if (m_current->type == TrackedMenuEntry)
- {
- SendMessage(m_parent->hwnd, WM_CANCELMODE, 0, 0);
- msg->message = WM_NULL;
- }
+ m_menuBar->mb->_BeforeCancelPopup();
}
- }
- break;
- case WM_NCLBUTTONUP:
- case WM_LBUTTONUP:
- case WM_NCRBUTTONUP:
- case WM_RBUTTONUP:
- if (m_current && m_current->type != TrackedMenuEntry)
- {
- msg->message = WM_NULL;
}
break;
case WM_MOUSEMOVE:
@@ -564,6 +562,18 @@
// fallthrough;
case WM_NCRBUTTONDOWN:
case WM_RBUTTONDOWN:
+ if (m_menuBar && m_current->type == MenuPopupEntry)
+ {
+ POINT pt = msg->pt;
+ HWND child = WindowFromPoint(pt);
+ BOOL hoveringMenuBar = m_menuBar->mb->IsWindowOwner(child) ==
S_OK;
+ if (hoveringMenuBar)
+ {
+ m_current->mb->_MenuItemHotTrack(MPOS_FULLCANCEL);
+ break;
+ }
+ }
+
if (m_current->type == MenuPopupEntry)
{
HWND child = WindowFromPoint(pt);
Modified: branches/shell-experiments/base/shell/rshell/CMenuToolbars.cpp
URL:
http://svn.reactos.org/svn/reactos/branches/shell-experiments/base/shell/rs…
==============================================================================
--- branches/shell-experiments/base/shell/rshell/CMenuToolbars.cpp [iso-8859-1]
(original)
+++ branches/shell-experiments/base/shell/rshell/CMenuToolbars.cpp [iso-8859-1] Tue Nov 11
01:05:39 2014
@@ -18,13 +18,15 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include "precomp.h"
-#include <windowsx.h>
#include <commoncontrols.h>
#include <shlwapi_undoc.h>
#include <uxtheme.h>
#include "CMenuBand.h"
#include "CMenuToolbars.h"
+
+#define GET_X_LPARAM(lp) ((int)(short)LOWORD(lp))
+#define GET_Y_LPARAM(lp) ((int)(short)HIWORD(lp))
WINE_DEFAULT_DEBUG_CHANNEL(CMenuToolbars);
@@ -41,6 +43,13 @@
// User-defined timer ID used while hot-tracking around the menu
#define TIMERID_HOTTRACK 1
+LRESULT CMenuToolbarBase::OnWinEventWrap(UINT uMsg, WPARAM wParam, LPARAM lParam,
BOOL& bHandled)
+{
+ LRESULT lr;
+ bHandled = OnWinEvent(m_hWnd, uMsg, wParam, lParam, &lr) != S_FALSE;
+ return lr;
+}
+
HRESULT CMenuToolbarBase::OnWinEvent(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam,
LRESULT *theResult)
{
NMHDR * hdr;
@@ -116,38 +125,6 @@
return S_FALSE;
}
-LRESULT CALLBACK CMenuToolbarBase::s_SubclassProc(HWND hWnd, UINT uMsg, WPARAM wParam,
LPARAM lParam)
-{
- CMenuToolbarBase * pthis = reinterpret_cast<CMenuToolbarBase
*>(GetWindowLongPtr(hWnd, GWLP_USERDATA));
- return pthis->SubclassProc(hWnd, uMsg, wParam, lParam);
-}
-
-LRESULT CMenuToolbarBase::SubclassProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM
lParam)
-{
- LRESULT lr;
-
- switch (uMsg)
- {
- case WM_USER_ISTRACKEDITEM:
- m_SubclassOld(hWnd, uMsg, wParam, lParam);
- return IsTrackedItem(wParam);
- case WM_USER_CHANGETRACKEDITEM:
- m_SubclassOld(hWnd, uMsg, wParam, lParam);
- return ChangeTrackedItem(wParam, LOWORD(lParam), HIWORD(lParam));
-
- case WM_COMMAND:
- OnWinEvent(hWnd, uMsg, wParam, lParam, &lr);
- break;
- case WM_NOTIFY:
- OnWinEvent(hWnd, uMsg, wParam, lParam, &lr);
- break;
- case WM_TIMER:
- OnPopupTimer(wParam);
- }
-
- return m_SubclassOld(hWnd, uMsg, wParam, lParam);
-}
-
HRESULT CMenuToolbarBase::DisableMouseTrack(BOOL bDisable)
{
if (m_disableMouseTrack != bDisable)
@@ -175,10 +152,6 @@
HRESULT CMenuToolbarBase::OnCustomDraw(LPNMTBCUSTOMDRAW cdraw, LRESULT * theResult)
{
- RECT rc;
- HDC hdc;
- COLORREF clrText;
- HBRUSH bgBrush;
bool isHot, isPopup;
TBBUTTONINFO btni;
@@ -189,16 +162,18 @@
return S_OK;
case CDDS_ITEMPREPAINT:
-
- rc = cdraw->nmcd.rc;
- hdc = cdraw->nmcd.hdc;
-
+
// The item with an active submenu gets the CHECKED flag.
isHot = m_hotBar == this && (int) cdraw->nmcd.dwItemSpec ==
m_hotItem;
isPopup = m_popupBar == this && (int) cdraw->nmcd.dwItemSpec ==
m_popupItem;
if (m_initFlags & SMINIT_VERTICAL || IsAppThemed())
{
+ COLORREF clrText;
+ HBRUSH bgBrush;
+ RECT rc = cdraw->nmcd.rc;
+ HDC hdc = cdraw->nmcd.hdc;
+
// Remove HOT and CHECKED flags (will restore HOT if necessary)
cdraw->nmcd.uItemState &= ~(CDIS_HOT | CDIS_CHECKED);
@@ -250,7 +225,7 @@
// Fetch the button style
btni.cbSize = sizeof(btni);
btni.dwMask = TBIF_STYLE;
- SendMessage(m_hwndToolbar, TB_GETBUTTONINFO, cdraw->nmcd.dwItemSpec,
reinterpret_cast<LPARAM>(&btni));
+ GetButtonInfo(cdraw->nmcd.dwItemSpec, &btni);
// Check if we need to draw a submenu arrow
if (btni.fsStyle & BTNS_DROPDOWN)
@@ -278,8 +253,7 @@
}
CMenuToolbarBase::CMenuToolbarBase(CMenuBand *menuBand, BOOL usePager) :
- m_hwnd(NULL),
- m_hwndToolbar(NULL),
+ m_pager(this, 1),
m_useFlatMenus(FALSE),
m_SubclassOld(NULL),
m_disableMouseTrack(FALSE),
@@ -288,9 +262,12 @@
m_dwMenuFlags(0),
m_hasSizes(FALSE),
m_usePager(usePager),
+ m_hotBar(NULL),
m_hotItem(-1),
+ m_popupBar(NULL),
m_popupItem(-1),
- m_isTrackingPopup(FALSE)
+ m_isTrackingPopup(FALSE),
+ m_cancelingPopup(FALSE)
{
m_idealSize.cx = 0;
m_idealSize.cy = 0;
@@ -304,23 +281,23 @@
CMenuToolbarBase::~CMenuToolbarBase()
{
- if (m_hwndToolbar && m_hwndToolbar != m_hwnd)
- DestroyWindow(m_hwndToolbar);
-
- if (m_hwnd)
- DestroyWindow(m_hwnd);
+ if (m_hWnd)
+ DestroyWindow();
+
+ if (m_pager.m_hWnd)
+ m_pager.DestroyWindow();
DeleteObject(m_marlett);
}
void CMenuToolbarBase::InvalidateDraw()
{
- InvalidateRect(m_hwnd, NULL, FALSE);
-}
-
-HRESULT CMenuToolbarBase::ShowWindow(BOOL fShow)
-{
- ::ShowWindow(m_hwnd, fShow ? SW_SHOW : SW_HIDE);
+ InvalidateRect(NULL, FALSE);
+}
+
+HRESULT CMenuToolbarBase::ShowDW(BOOL fShow)
+{
+ ShowWindow(fShow ? SW_SHOW : SW_HIDE);
// Ensure that the right image list is assigned to the toolbar
UpdateImageLists();
@@ -336,7 +313,7 @@
if ((m_initFlags & (SMINIT_TOPLEVEL | SMINIT_VERTICAL)) == SMINIT_TOPLEVEL) //
not vertical.
{
// No image list, prevents the buttons from having a margin at the left side
- SendMessageW(m_hwnd, TB_SETIMAGELIST, 0, 0);
+ SetImageList(NULL);
return S_OK;
}
@@ -346,36 +323,34 @@
if (m_menuBand->UseBigIcons())
{
shiml = SHIL_LARGE;
- SendMessageW(m_hwndToolbar, TB_SETPADDING, 0, MAKELPARAM(4, 0));
+ SetPadding(4, 0);
}
else
{
shiml = SHIL_SMALL;
- SendMessageW(m_hwndToolbar, TB_SETPADDING, 0, MAKELPARAM(4, 4));
+ SetPadding(4, 4);
}
IImageList * piml;
HRESULT hr = SHGetImageList(shiml, IID_PPV_ARG(IImageList, &piml));
if (FAILED_UNEXPECTEDLY(hr))
{
- SendMessageW(m_hwndToolbar, TB_SETIMAGELIST, 0, 0);
+ SetImageList(NULL);
}
else
{
- SendMessageW(m_hwndToolbar, TB_SETIMAGELIST, 0,
reinterpret_cast<LPARAM>(piml));
+ SetImageList((HIMAGELIST)piml);
}
return S_OK;
}
HRESULT CMenuToolbarBase::Close()
{
- if (m_hwndToolbar != m_hwnd)
- DestroyWindow(m_hwndToolbar);
-
- DestroyWindow(m_hwnd);
-
- m_hwndToolbar = NULL;
- m_hwnd = NULL;
+ if (m_hWnd)
+ DestroyWindow();
+
+ if (m_pager.m_hWnd)
+ m_pager.DestroyWindow();
return S_OK;
}
@@ -412,13 +387,7 @@
rc.bottom = 1;
}
- HWND hwndToolbar = CreateWindowEx(
- tbExStyles, TOOLBARCLASSNAMEW, NULL,
- tbStyles, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top,
- hwndParent, NULL, _AtlBaseModule.GetModuleInstance(), 0);
-
- if (hwndToolbar == NULL)
- return E_FAIL;
+ SubclassWindow(Create(hwndParent, tbStyles, tbExStyles));
// If needed, create the pager.
if (m_usePager)
@@ -431,26 +400,12 @@
pgStyles, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top,
hwndParent, NULL, _AtlBaseModule.GetModuleInstance(), 0);
- ::SetParent(hwndToolbar, hwndPager);
- ::SetParent(hwndPager, hwndParent);
-
- SendMessage(hwndPager, PGM_SETCHILD, 0,
reinterpret_cast<LPARAM>(hwndToolbar));
- m_hwndToolbar = hwndToolbar;
- m_hwnd = hwndPager;
- }
- else
- {
- ::SetParent(hwndToolbar, hwndParent);
- m_hwndToolbar = hwndToolbar;
- m_hwnd = hwndToolbar;
- }
-
- // Identify the version of the used Common Controls DLL by sending the size of the
TBBUTTON structure.
- SendMessageW(hwndToolbar, TB_BUTTONSTRUCTSIZE, sizeof(TBBUTTON), 0);
-
- // Apply subclassing
- SetWindowLongPtr(hwndToolbar, GWLP_USERDATA,
reinterpret_cast<LONG_PTR>(this));
- m_SubclassOld = (WNDPROC) SetWindowLongPtr(hwndToolbar, GWLP_WNDPROC,
reinterpret_cast<LONG_PTR>(CMenuToolbarBase::s_SubclassProc));
+ m_pager.SubclassWindow(hwndPager);
+
+ ::SetParent(m_hWnd, hwndPager);
+
+ m_pager.SendMessageW(PGM_SETCHILD, 0, reinterpret_cast<LPARAM>(m_hWnd));
+ }
// Configure the image lists
UpdateImageLists();
@@ -470,16 +425,16 @@
if (m_hasSizes)
return S_OK;
- if (!m_hwndToolbar)
+ if (!m_hWnd)
return S_OK;
// Obtain the ideal size, to be used as min and max
- SendMessageW(m_hwndToolbar, TB_AUTOSIZE, 0, 0);
- SendMessageW(m_hwndToolbar, TB_GETMAXSIZE, 0,
reinterpret_cast<LPARAM>(&m_idealSize));
- SendMessageW(m_hwndToolbar, TB_GETIDEALSIZE, (m_initFlags & SMINIT_VERTICAL) !=
0, reinterpret_cast<LPARAM>(&m_idealSize));
+ AutoSize();
+ GetMaxSize(&m_idealSize);
+ GetIdealSize((m_initFlags & SMINIT_VERTICAL) != 0, &m_idealSize);
// Obtain the button size, to be used as the integral size
- DWORD size = SendMessageW(m_hwndToolbar, TB_GETBUTTONSIZE, 0, 0);
+ DWORD size = GetButtonSize();
m_itemSize.cx = GET_X_LPARAM(size);
m_itemSize.cy = GET_Y_LPARAM(size);
m_hasSizes = TRUE;
@@ -496,20 +451,23 @@
HRESULT CMenuToolbarBase::SetPosSize(int x, int y, int cx, int cy)
{
+ // Update the toolbar or pager to fit the requested rect
// If we have a pager, set the toolbar height to the ideal height of the toolbar
- if (m_hwnd != m_hwndToolbar)
- {
- SetWindowPos(m_hwndToolbar, NULL, x, y, cx, m_idealSize.cy, 0);
- }
-
- // Update the toolbar or pager to fit the requested rect
- SetWindowPos(m_hwnd, NULL, x, y, cx, cy, 0);
+ if (m_pager.m_hWnd)
+ {
+ SetWindowPos(NULL, x, y, cx, m_idealSize.cy, 0);
+ m_pager.SetWindowPos(NULL, x, y, cx, cy, 0);
+ }
+ else
+ {
+ SetWindowPos(NULL, x, y, cx, cy, 0);
+ }
// In a vertical menu, resize the buttons to fit the width
if (m_initFlags & SMINIT_VERTICAL)
{
- DWORD btnSize = SendMessage(m_hwndToolbar, TB_GETBUTTONSIZE, 0, 0);
- SendMessage(m_hwndToolbar, TB_SETBUTTONSIZE, 0, MAKELPARAM(cx,
HIWORD(btnSize)));
+ DWORD btnSize = GetButtonSize();
+ SetButtonSize(cx, GET_Y_LPARAM(btnSize));
}
return S_OK;
@@ -517,8 +475,8 @@
HRESULT CMenuToolbarBase::IsWindowOwner(HWND hwnd)
{
- if (m_hwnd && m_hwnd == hwnd) return S_OK;
- if (m_hwndToolbar && m_hwndToolbar == hwnd) return S_OK;
+ if (m_hWnd && m_hWnd == hwnd) return S_OK;
+ if (m_pager.m_hWnd && m_pager.m_hWnd == hwnd) return S_OK;
return S_FALSE;
}
@@ -527,7 +485,10 @@
if (!phwnd)
return E_FAIL;
- *phwnd = m_hwnd;
+ if (m_pager.m_hWnd)
+ *phwnd = m_pager.m_hWnd;
+ else
+ *phwnd = m_hWnd;
return S_OK;
}
@@ -544,35 +505,38 @@
return InternalGetTooltip(iItem, index, dwData, tip->pszText,
tip->cchTextMax);
}
-HRESULT CMenuToolbarBase::OnPopupTimer(DWORD timerId)
-{
- if (timerId != TIMERID_HOTTRACK)
- return S_FALSE;
-
- KillTimer(m_hwndToolbar, TIMERID_HOTTRACK);
+HRESULT CMenuToolbarBase::OnPopupTimer(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL&
bHandled)
+{
+ if (wParam != TIMERID_HOTTRACK)
+ {
+ bHandled = FALSE;
+ return 0;
+ }
+
+ KillTimer(TIMERID_HOTTRACK);
if (!m_timerEnabled)
- return S_FALSE;
+ return 0;
m_timerEnabled = FALSE;
if (m_hotItem < 0)
- return S_FALSE;
+ return 0;
// Returns S_FALSE if the current item did not show a submenu
HRESULT hr = PopupItem(m_hotItem, FALSE);
if (hr != S_FALSE)
- return hr;
+ return 0;
// If we didn't switch submenus, cancel the current popup regardless
if (m_popupBar)
{
HRESULT hr = CancelCurrentPopup();
if (FAILED_UNEXPECTEDLY(hr))
- return hr;
- }
-
- return S_OK;
+ return 0;
+ }
+
+ return 0;
}
HRESULT CMenuToolbarBase::KillPopupTimer()
@@ -580,7 +544,7 @@
if (m_timerEnabled)
{
m_timerEnabled = FALSE;
- KillTimer(m_hwndToolbar, TIMERID_HOTTRACK);
+ KillTimer(TIMERID_HOTTRACK);
return S_OK;
}
return S_FALSE;
@@ -603,7 +567,7 @@
// Notify the toolbar if the hot-tracking left this toolbar
if (m_hotBar == this && toolbar != this)
{
- SendMessage(m_hwndToolbar, TB_SETHOTITEM, (WPARAM) -1, 0);
+ SetHotItem(-1);
}
TRACE("Hot item changed from %p %p, to %p %p\n", m_hotBar, m_hotItem,
toolbar, item);
@@ -625,7 +589,7 @@
{
DWORD elapsed = 0;
SystemParametersInfo(SPI_GETMENUSHOWDELAY, 0, &elapsed, 0);
- SetTimer(m_hwndToolbar, TIMERID_HOTTRACK, elapsed, NULL);
+ SetTimer(TIMERID_HOTTRACK, elapsed);
m_timerEnabled = TRUE;
TRACE("SetTimer called with m_hotItem=%d\n", m_hotItem);
}
@@ -636,9 +600,9 @@
info.cbSize = sizeof(info);
info.dwMask = 0;
- int index = SendMessage(m_hwndToolbar, TB_GETBUTTONINFO, item,
reinterpret_cast<LPARAM>(&info));
-
- SendMessage(m_hwndToolbar, TB_SETHOTITEM, index, 0);
+ int index = GetButtonInfo(item, &info);
+
+ SetHotItem(index);
}
}
@@ -655,7 +619,7 @@
// Notify the toolbar if the popup-tracking this toolbar
if (m_popupBar == this && toolbar != this)
{
- SendMessage(m_hwndToolbar, TB_CHECKBUTTON, m_popupItem, FALSE);
+ CheckButton(m_popupItem, FALSE);
m_isTrackingPopup = FALSE;
}
@@ -664,24 +628,24 @@
if (m_popupBar == this)
{
- SendMessage(m_hwndToolbar, TB_CHECKBUTTON, m_popupItem, TRUE);
+ CheckButton(m_popupItem, TRUE);
}
InvalidateDraw();
return S_OK;
}
-HRESULT CMenuToolbarBase::IsTrackedItem(INT index)
+LRESULT CMenuToolbarBase::IsTrackedItem(UINT uMsg, WPARAM wParam, LPARAM lParam,
BOOL& bHandled)
{
TBBUTTON btn;
if (m_hotBar != this)
return S_FALSE;
- if (index < 0)
+ if (wParam < 0)
return S_FALSE;
- if (!SendMessage(m_hwndToolbar, TB_GETBUTTON, index,
reinterpret_cast<LPARAM>(&btn)))
+ if (!GetButton(wParam, &btn))
return E_FAIL;
if (m_hotItem == btn.idCommand)
@@ -693,20 +657,23 @@
return S_FALSE;
}
-HRESULT CMenuToolbarBase::ChangeTrackedItem(INT index, BOOL wasTracking, BOOL mouse)
-{
+LRESULT CMenuToolbarBase::ChangeTrackedItem(UINT uMsg, WPARAM wParam, LPARAM lParam,
BOOL& bHandled)
+{
+ BOOL wasTracking = LOWORD(lParam);
+ BOOL mouse = HIWORD(lParam);
+
TBBUTTON btn;
- if (index < 0)
+ if (wParam < 0)
{
m_isTrackingPopup = FALSE;
return m_menuBand->_ChangeHotItem(NULL, -1, HICF_MOUSE);
}
- if (!SendMessage(m_hwndToolbar, TB_GETBUTTON, index,
reinterpret_cast<LPARAM>(&btn)))
+ if (!GetButton(wParam, &btn))
return E_FAIL;
- TRACE("ChangeTrackedItem %d, %d\n", index, wasTracking);
+ TRACE("ChangeTrackedItem %d, %d\n", wParam, wasTracking);
m_isTrackingPopup = wasTracking;
return m_menuBand->_ChangeHotItem(this, btn.idCommand, mouse ? HICF_MOUSE : 0);
}
@@ -717,20 +684,22 @@
RECT rc = { 0 };
RECT rcx = { 0 };
- if (!SendMessage(m_hwndToolbar, TB_GETITEMRECT, index,
reinterpret_cast<LPARAM>(&rc)))
+ if (!GetItemRect(index, &rc))
return E_FAIL;
- GetWindowRect(m_hwnd, &rcx);
+ HWND topWnd;
+ GetWindow(&topWnd);
+ GetWindowRect(topWnd, &rcx);
POINT a = { rc.left, rc.top };
POINT b = { rc.right, rc.bottom };
POINT c = { rcx.left, rcx.top };
POINT d = { rcx.right, rcx.bottom };
- ClientToScreen(m_hwndToolbar, &a);
- ClientToScreen(m_hwndToolbar, &b);
- ClientToScreen(m_hwnd, &c);
- ClientToScreen(m_hwnd, &d);
+ ClientToScreen(m_hWnd, &a);
+ ClientToScreen(m_hWnd, &b);
+ ClientToScreen(topWnd, &c);
+ ClientToScreen(topWnd, &d);
POINTL pt = { a.x, b.y };
RECTL rcl = { c.x, c.y, d.x, d.y };
@@ -755,14 +724,14 @@
// Calculate the submenu position and exclude area
RECT rc = { 0 };
- if (!SendMessage(m_hwndToolbar, TB_GETITEMRECT, index,
reinterpret_cast<LPARAM>(&rc)))
+ if (!GetItemRect(index, &rc))
return E_FAIL;
POINT a = { rc.left, rc.top };
POINT b = { rc.right, rc.bottom };
- ClientToScreen(m_hwndToolbar, &a);
- ClientToScreen(m_hwndToolbar, &b);
+ ClientToScreen(m_hWnd, &a);
+ ClientToScreen(m_hWnd, &b);
POINT pt = { a.x, b.y };
RECT rcl = { a.x, a.y, b.x, b.y };
@@ -782,8 +751,6 @@
m_menuBand->_ChangePopupItem(NULL, -1);
m_isTrackingPopup = FALSE;
- m_menuBand->_ChangeHotItem(NULL, -1, 0);
-
return S_OK;
}
@@ -798,6 +765,13 @@
return m_menuBand->_TrackContextMenu(contextMenu, pt.x, pt.y);
}
+HRESULT CMenuToolbarBase::BeforeCancelPopup()
+{
+ m_cancelingPopup = TRUE;
+ DbgPrint("BeforeCancelPopup\n");
+ return S_OK;
+}
+
HRESULT CMenuToolbarBase::ProcessClick(INT iItem)
{
if (m_disableMouseTrack)
@@ -828,10 +802,15 @@
{
TBBUTTON btn;
- if (m_initFlags & SMINIT_VERTICAL)
- return S_OK;
-
- ::SendMessageW(m_hwndToolbar, TB_GETBUTTON, iIndex,
reinterpret_cast<LPARAM>(&btn));
+ if ((m_initFlags & SMINIT_VERTICAL)
+ || m_popupBar
+ || m_cancelingPopup)
+ {
+ m_cancelingPopup = FALSE;
+ return S_OK;
+ }
+
+ GetButton(iIndex, &btn);
return ProcessClick(btn.idCommand);
}
@@ -839,10 +818,12 @@
{
TBBUTTON btn;
+ m_cancelingPopup = FALSE;
+
if (!(m_initFlags & SMINIT_VERTICAL))
return S_OK;
- ::SendMessageW(m_hwndToolbar, TB_GETBUTTON, iIndex,
reinterpret_cast<LPARAM>(&btn));
+ GetButton(iIndex, &btn);
return ProcessClick(btn.idCommand);
}
@@ -877,7 +858,7 @@
if (dwSelectType != 0xFFFFFFFF)
{
- int count = SendMessage(m_hwndToolbar, TB_BUTTONCOUNT, 0, 0);
+ int count = GetButtonCount();
if (dwSelectType == VK_HOME)
{
@@ -896,7 +877,7 @@
TBBUTTONINFO info = { 0 };
info.cbSize = sizeof(TBBUTTONINFO);
info.dwMask = 0;
- index = SendMessage(m_hwndToolbar, TB_GETBUTTONINFO, m_hotItem,
reinterpret_cast<LPARAM>(&info));
+ index = GetButtonInfo(m_hotItem, &info);
}
if (index < 0)
@@ -926,7 +907,7 @@
TBBUTTON btn = { 0 };
while (index >= 0 && index < count)
{
- DWORD res = SendMessage(m_hwndToolbar, TB_GETBUTTON, index,
reinterpret_cast<LPARAM>(&btn));
+ DWORD res = GetButton(index, &btn);
if (!res)
return E_FAIL;
@@ -939,8 +920,8 @@
{
HWND tlw;
m_menuBand->_GetTopLevelWindow(&tlw);
- SendMessage(tlw, WM_CANCELMODE, 0, 0);
- PostMessage(m_hwndToolbar, WM_USER_CHANGETRACKEDITEM, index,
MAKELPARAM(m_isTrackingPopup, FALSE));
+ SendMessageW(tlw, WM_CANCELMODE, 0, 0);
+ PostMessageW(m_hWnd, WM_USER_CHANGETRACKEDITEM, index,
MAKELPARAM(m_isTrackingPopup, FALSE));
}
else
m_menuBand->_ChangeHotItem(this, btn.idCommand, 0);
@@ -993,9 +974,10 @@
tbb.iBitmap = iconId;
tbb.dwData = buttonData;
- if (!SendMessageW(m_hwndToolbar, TB_ADDBUTTONS, 1,
reinterpret_cast<LPARAM>(&tbb)))
+ m_hasSizes = FALSE;
+
+ if (!AddButtons(1, &tbb))
return HRESULT_FROM_WIN32(GetLastError());
-
return S_OK;
}
@@ -1011,7 +993,9 @@
tbb.fsStyle = BTNS_SEP;
tbb.iBitmap = 0;
- if (!SendMessageW(m_hwndToolbar, TB_ADDBUTTONS, 1,
reinterpret_cast<LPARAM>(&tbb)))
+ m_hasSizes = FALSE;
+
+ if (!AddButtons(1, &tbb))
return HRESULT_FROM_WIN32(GetLastError());
return S_OK;
@@ -1020,14 +1004,16 @@
HRESULT CMenuToolbarBase::AddPlaceholder()
{
TBBUTTON tbb = { 0 };
- PCWSTR MenuString = L"(Empty)";
+ PCWSTR MenuString = L"(Empty)"; // FIXME: Make localizable
tbb.fsState = 0;
tbb.fsStyle = 0;
tbb.iString = (INT_PTR) MenuString;
tbb.iBitmap = -1;
- if (!SendMessageW(m_hwndToolbar, TB_ADDBUTTONS, 1,
reinterpret_cast<LPARAM>(&tbb)))
+ m_hasSizes = FALSE;
+
+ if (!AddButtons(1, &tbb))
return HRESULT_FROM_WIN32(GetLastError());
return S_OK;
@@ -1035,10 +1021,11 @@
HRESULT CMenuToolbarBase::ClearToolbar()
{
- while (SendMessage(m_hwndToolbar, TB_DELETEBUTTON, 0, 0))
+ while (DeleteButton(0))
{
// empty;
}
+ m_hasSizes = FALSE;
return S_OK;
}
@@ -1058,7 +1045,7 @@
info.cbSize = sizeof(TBBUTTONINFO);
info.dwMask = TBIF_COMMAND | TBIF_LPARAM;
- int index = SendMessage(m_hwndToolbar, TB_GETBUTTONINFO, iItem,
reinterpret_cast<LPARAM>(&info));
+ int index = GetButtonInfo(iItem, &info);
if (index < 0)
return E_FAIL;
Modified: branches/shell-experiments/base/shell/rshell/CMenuToolbars.h
URL:
http://svn.reactos.org/svn/reactos/branches/shell-experiments/base/shell/rs…
==============================================================================
--- branches/shell-experiments/base/shell/rshell/CMenuToolbars.h [iso-8859-1] (original)
+++ branches/shell-experiments/base/shell/rshell/CMenuToolbars.h [iso-8859-1] Tue Nov 11
01:05:39 2014
@@ -25,11 +25,11 @@
#define WM_USER_ISTRACKEDITEM (WM_APP+41)
#define WM_USER_CHANGETRACKEDITEM (WM_APP+42)
-class CMenuToolbarBase
+class CMenuToolbarBase :
+ public CToolbar<DWORD_PTR>
{
+ CContainedWindow m_pager;
private:
- HWND m_hwnd; // May be the pager
- HWND m_hwndToolbar;
HFONT m_marlett;
BOOL m_useFlatMenus;
WNDPROC m_SubclassOld;
@@ -55,10 +55,7 @@
INT m_executeItem;
DWORD_PTR m_executeData;
-private:
- static LRESULT CALLBACK s_SubclassProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM
lParam);
-
- LRESULT SubclassProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
+ BOOL m_cancelingPopup;
public:
CMenuToolbarBase(CMenuBand *menuBand, BOOL usePager);
@@ -67,7 +64,7 @@
HRESULT IsWindowOwner(HWND hwnd);
HRESULT CreateToolbar(HWND hwndParent, DWORD dwFlags);
HRESULT GetWindow(HWND *phwnd);
- HRESULT ShowWindow(BOOL fShow);
+ HRESULT ShowDW(BOOL fShow);
HRESULT Close();
HRESULT OnWinEvent(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT
*theResult);
@@ -83,9 +80,6 @@
HRESULT PrepareExecuteItem(INT iItem);
HRESULT ExecuteItem();
-
- HRESULT IsTrackedItem(INT index);
- HRESULT ChangeTrackedItem(INT index, BOOL wasTracking, BOOL mouse);
HRESULT GetSizes(SIZE* pMinSize, SIZE* pMaxSize, SIZE* pIntegralSize);
HRESULT SetPosSize(int x, int y, int cx, int cy);
@@ -105,6 +99,7 @@
HRESULT MenuBarMouseDown(INT iIndex);
HRESULT MenuBarMouseUp(INT iIndex);
HRESULT ProcessClick(INT iItem);
+ HRESULT BeforeCancelPopup();
protected:
virtual HRESULT OnDeletingButton(const NMTOOLBAR * tb) = 0;
@@ -120,16 +115,28 @@
HRESULT AddPlaceholder();
HRESULT ClearToolbar();
- HWND GetToolbar() { return m_hwndToolbar; }
+ HWND GetToolbar() { return m_hWnd; }
private:
HRESULT UpdateImageLists();
HRESULT OnPagerCalcSize(LPNMPGCALCSIZE csize);
- HRESULT OnPopupTimer(DWORD timerId);
HRESULT OnContextMenu(NMMOUSE * rclick);
HRESULT OnCustomDraw(LPNMTBCUSTOMDRAW cdraw, LRESULT * theResult);
HRESULT OnGetInfoTip(NMTBGETINFOTIP * tip);
+
+ LRESULT IsTrackedItem(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
+ LRESULT ChangeTrackedItem(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL&
bHandled);
+ LRESULT OnWinEventWrap(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
+ HRESULT OnPopupTimer(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
+
+ BEGIN_MSG_MAP(CMenuToolbarBase)
+ MESSAGE_HANDLER(WM_USER_ISTRACKEDITEM, IsTrackedItem)
+ MESSAGE_HANDLER(WM_USER_CHANGETRACKEDITEM, ChangeTrackedItem)
+ MESSAGE_HANDLER(WM_COMMAND, OnWinEventWrap)
+ MESSAGE_HANDLER(WM_NOTIFY, OnWinEventWrap)
+ MESSAGE_HANDLER(WM_TIMER, OnPopupTimer)
+ END_MSG_MAP()
};
class CMenuStaticToolbar :
Modified: branches/shell-experiments/base/shell/rshell/precomp.h
URL:
http://svn.reactos.org/svn/reactos/branches/shell-experiments/base/shell/rs…
==============================================================================
--- branches/shell-experiments/base/shell/rshell/precomp.h [iso-8859-1] (original)
+++ branches/shell-experiments/base/shell/rshell/precomp.h [iso-8859-1] Tue Nov 11
01:05:39 2014
@@ -58,7 +58,10 @@
#include <atlbase.h>
#include <atlcom.h>
+#include <atlwin.h>
#include <undocshell.h>
+
+#include <rosctrls.h>
#include <wine/debug.h>
Modified: branches/shell-experiments/include/reactos/rosctrls.h
URL:
http://svn.reactos.org/svn/reactos/branches/shell-experiments/include/react…
==============================================================================
--- branches/shell-experiments/include/reactos/rosctrls.h [iso-8859-1] (original)
+++ branches/shell-experiments/include/reactos/rosctrls.h [iso-8859-1] Tue Nov 11 01:05:39
2014
@@ -253,6 +253,11 @@
return SendMessageW(TB_GETHOTITEM);
}
+ DWORD SetHotItem(INT item)
+ {
+ return SendMessageW(TB_SETHOTITEM, item);
+ }
+
public: // Button list management methods
int GetButtonCount()
{
@@ -261,22 +266,22 @@
DWORD GetButton(int index, TBBUTTON * btn)
{
- return SendMessageW(TB_GETBUTTON, index, (LPARAM) btn);
+ return SendMessageW(TB_GETBUTTON, index, reinterpret_cast<LPARAM>(btn));
}
DWORD AddButton(TBBUTTON * btn)
{
- return SendMessageW(TB_ADDBUTTONS, 1, (LPARAM) btn);
+ return SendMessageW(TB_ADDBUTTONS, 1, reinterpret_cast<LPARAM>(btn));
}
DWORD AddButtons(int count, TBBUTTON * buttons)
{
- return SendMessageW(TB_ADDBUTTONS, count, (LPARAM) buttons);
+ return SendMessageW(TB_ADDBUTTONS, count,
reinterpret_cast<LPARAM>(buttons));
}
DWORD InsertButton(int insertAt, TBBUTTON * btn)
{
- return SendMessageW(TB_INSERTBUTTON, insertAt, (LPARAM) btn);
+ return SendMessageW(TB_INSERTBUTTON, insertAt,
reinterpret_cast<LPARAM>(btn));
}
DWORD MoveButton(int oldIndex, int newIndex)
@@ -291,18 +296,28 @@
DWORD GetButtonInfo(int cmdId, TBBUTTONINFO * info)
{
- return SendMessageW(TB_GETBUTTONINFO, cmdId, (LPARAM) info);
+ return SendMessageW(TB_GETBUTTONINFO, cmdId,
reinterpret_cast<LPARAM>(info));
}
DWORD SetButtonInfo(int cmdId, TBBUTTONINFO * info)
{
- return SendMessageW(TB_SETBUTTONINFO, cmdId, (LPARAM) info);
+ return SendMessageW(TB_SETBUTTONINFO, cmdId,
reinterpret_cast<LPARAM>(info));
+ }
+
+ DWORD CheckButton(int cmdId, BOOL bCheck)
+ {
+ return SendMessageW(TB_CHECKBUTTON, cmdId, MAKELPARAM(bCheck, 0));
}
public: // Layout management methods
+ DWORD GetButtonSize()
+ {
+ return SendMessageW(TB_GETBUTTONSIZE);
+ }
+
DWORD SetButtonSize(int w, int h)
{
- return SendMessageW(TB_SETBUTTONSIZE, 0, MAKELONG(w, h));
+ return SendMessageW(TB_SETBUTTONSIZE, 0, MAKELPARAM(w, h));
}
DWORD AutoSize()
@@ -310,36 +325,56 @@
return SendMessageW(TB_AUTOSIZE);
}
+ DWORD GetMaxSize(LPSIZE size)
+ {
+ return SendMessageW(TB_GETMAXSIZE, 0, reinterpret_cast<LPARAM>(size));
+ }
+
+ DWORD GetIdealSize(BOOL useHeight, LPSIZE size)
+ {
+ return SendMessageW(TB_GETIDEALSIZE, useHeight,
reinterpret_cast<LPARAM>(size));
+ }
+
DWORD GetMetrics(TBMETRICS * tbm)
{
- return SendMessageW(TB_GETMETRICS, 0, (LPARAM) tbm);
+ return SendMessageW(TB_GETMETRICS, 0, reinterpret_cast<LPARAM>(tbm));
}
DWORD SetMetrics(TBMETRICS * tbm)
{
- return SendMessageW(TB_SETMETRICS, 0, (LPARAM) tbm);
+ return SendMessageW(TB_SETMETRICS, 0, reinterpret_cast<LPARAM>(tbm));
}
DWORD GetItemRect(int index, LPRECT prcItem)
{
- return SendMessageW(TB_GETITEMRECT, index, (LPARAM) prcItem);
+ return SendMessageW(TB_GETITEMRECT, index,
reinterpret_cast<LPARAM>(prcItem));
}
DWORD SetRedraw(BOOL bEnable)
{
return SendMessageW(WM_SETREDRAW, bEnable);
+ }
+
+ DWORD GetPadding()
+ {
+ return SendMessageW(TB_GETPADDING);
+ }
+
+ DWORD SetPadding(int x, int y)
+ {
+ return SendMessageW(TB_SETPADDING, 0, MAKELPARAM(x, y));
}
public: // Image list management methods
DWORD SetImageList(HIMAGELIST himl)
{
- return SendMessageW(TB_SETIMAGELIST, 0, (LPARAM) himl);
+ return SendMessageW(TB_SETIMAGELIST, 0, reinterpret_cast<LPARAM>(himl));
}
public: // Other methods
INT HitTest(PPOINT ppt)
{
- return (INT) SendMessageW(TB_HITTEST, 0, (LPARAM) ppt);
+ return (INT) SendMessageW(TB_HITTEST, 0, reinterpret_cast<LPARAM>(ppt));
}
public: // Utility methods