[BROWSEUI]
[reactos.git] / base / shell / rshell / CMenuToolbars.h
index 0a33ec7..a44bb12 100644 (file)
 class CMenuBand;
 class CMenuFocusManager;
 
-#define WM_USER_ISTRACKEDITEM (WM_USER+41)
-#define WM_USER_CHANGETRACKEDITEM (WM_USER+42)
-
+#define WM_USER_ISTRACKEDITEM (WM_APP+41)
+#define WM_USER_CHANGETRACKEDITEM (WM_APP+42)
 
 class CMenuToolbarBase
 {
 private:
-    HWND  m_hwnd;        // May be the pager
-    HFONT m_marlett;
-    BOOL  m_useFlatMenus;
+    HWND    m_hwnd;        // May be the pager
+    HWND    m_hwndToolbar;
+    HFONT   m_marlett;
+    BOOL    m_useFlatMenus;
     WNDPROC m_SubclassOld;
-    BOOL m_disableMouseTrack;
+    BOOL    m_disableMouseTrack;
+    BOOL    m_timerEnabled;
 
 protected:
     CMenuBand * m_menuBand;
-    HWND        m_hwndToolbar;
     DWORD       m_dwMenuFlags;
-    BOOL        m_hasIdealSize;
+    BOOL        m_hasSizes;
     SIZE        m_idealSize;
+    SIZE        m_itemSize;
     BOOL        m_usePager;
     CMenuToolbarBase * m_hotBar;
     INT                m_hotItem;
     CMenuToolbarBase * m_popupBar;
     INT                m_popupItem;
 
-    DWORD m_toolbarFlags;
-    BOOL m_isTracking;
+    DWORD m_initFlags;
+    BOOL m_isTrackingPopup;
 
 private:
     static LRESULT CALLBACK s_SubclassProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
 
+    LRESULT SubclassProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
+
 public:
     CMenuToolbarBase(CMenuBand *menuBand, BOOL usePager);
     virtual ~CMenuToolbarBase();
@@ -65,20 +68,21 @@ public:
 
     HRESULT OnWinEvent(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *theResult);
 
-    HRESULT OnHotItemChanged(CMenuToolbarBase * toolbar, INT item);
-    HRESULT OnPopupItemChanged(CMenuToolbarBase * toolbar, INT item);
+    HRESULT ChangeHotItem(CMenuToolbarBase * toolbar, INT item, DWORD dwFlags);
+    HRESULT ChangePopupItem(CMenuToolbarBase * toolbar, INT item);
 
-    HRESULT PopupSubMenu(UINT itemId, UINT index, IShellMenu* childShellMenu);
+    HRESULT PopupSubMenu(UINT itemId, UINT index, IShellMenu* childShellMenu, BOOL keyInitiated);
     HRESULT PopupSubMenu(UINT itemId, UINT index, HMENU menu);
-    HRESULT DoContextMenu(IContextMenu* contextMenu);
+    HRESULT TrackContextMenu(IContextMenu* contextMenu, POINT pt);
 
-    HRESULT ChangeHotItem(DWORD changeType);
-    HRESULT OnHotItemChange(const NMTBHOTITEM * hot, LRESULT * theResult);
+    HRESULT KeyboardItemChange(DWORD changeType);
+
+    HRESULT ExecuteItem(INT iItem);
 
     HRESULT IsTrackedItem(INT index);
-    HRESULT ChangeTrackedItem(INT index);
+    HRESULT ChangeTrackedItem(INT index, BOOL wasTracking, BOOL mouse);
 
-    HRESULT GetIdealSize(SIZE& size);
+    HRESULT GetSizes(SIZE* pMinSize, SIZE* pMaxSize, SIZE* pIntegralSize);
     HRESULT SetPosSize(int x, int y, int cx, int cy);
 
     void InvalidateDraw();
@@ -86,29 +90,38 @@ public:
     HRESULT DisableMouseTrack(BOOL bDisable);
 
     virtual HRESULT FillToolbar(BOOL clearFirst=FALSE) = 0;
-    virtual HRESULT OnContextMenu(NMMOUSE * rclick) = 0;
+    
+    HRESULT CancelCurrentPopup();
+    HRESULT PopupItem(INT iItem, BOOL keyInitiated);
+    HRESULT GetDataFromId(INT iItem, INT* pIndex, DWORD_PTR* pData);
 
-    HRESULT PopupItem(INT uItem);
-    HRESULT HasSubMenu(INT uItem);
-    HRESULT GetDataFromId(INT uItem, INT* pIndex, DWORD_PTR* pData);
+    HRESULT KillPopupTimer();
 
 protected:
-    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 InternalHasSubMenu(INT uItem, INT index, DWORD_PTR dwData) = 0;
 
-    LRESULT CALLBACK SubclassProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
+    virtual HRESULT InternalGetTooltip(INT iItem, INT index, DWORD_PTR dwData, LPWSTR pszText, INT cchTextMax) = 0;
+    virtual HRESULT InternalExecuteItem(INT iItem, INT index, DWORD_PTR dwData) = 0;
+    virtual HRESULT InternalPopupItem(INT iItem, INT index, DWORD_PTR dwData, BOOL keyInitiated) = 0;
+    virtual HRESULT InternalHasSubMenu(INT iItem, INT index, DWORD_PTR dwData) = 0;
+    virtual HRESULT InternalContextMenu(INT iItem, INT index, DWORD_PTR dwData, POINT pt) = 0;
 
     HRESULT AddButton(DWORD commandId, LPCWSTR caption, BOOL hasSubMenu, INT iconId, DWORD_PTR buttonData, BOOL last);
     HRESULT AddSeparator(BOOL last);
     HRESULT AddPlaceholder();
+    HRESULT ClearToolbar();
 
-    HRESULT UpdateImageLists();
+    HWND GetToolbar() { return m_hwndToolbar; }
 
 private:
+    HRESULT UpdateImageLists();
+
+    HRESULT OnCommand(WPARAM wParam, LPARAM lParam, LRESULT *theResult);
+    HRESULT OnPagerCalcSize(LPNMPGCALCSIZE csize);
+    HRESULT OnPopupTimer(DWORD timerId);
+    HRESULT OnContextMenu(NMMOUSE * rclick);
     HRESULT OnCustomDraw(LPNMTBCUSTOMDRAW cdraw, LRESULT * theResult);
+    HRESULT OnGetInfoTip(NMTBGETINFOTIP * tip);
 };
 
 class CMenuStaticToolbar :
@@ -119,20 +132,21 @@ private:
 
 public:
     CMenuStaticToolbar(CMenuBand *menuBand);
-    virtual ~CMenuStaticToolbar() {}
+    virtual ~CMenuStaticToolbar();
 
     HRESULT SetMenu(HMENU hmenu, HWND hwnd, DWORD dwFlags);
     HRESULT GetMenu(HMENU *phmenu, HWND *phwnd, DWORD *pdwFlags);
 
     virtual HRESULT FillToolbar(BOOL clearFirst=FALSE);
-    virtual HRESULT OnCommand(WPARAM wParam, LPARAM lParam, LRESULT *theResult);
-    virtual HRESULT OnContextMenu(NMMOUSE * rclick);
 
 protected:
     virtual HRESULT OnDeletingButton(const NMTOOLBAR * tb);
 
-    virtual HRESULT InternalPopupItem(INT uItem, INT index, DWORD_PTR dwData);
-    virtual HRESULT InternalHasSubMenu(INT uItem, INT index, DWORD_PTR dwData);
+    virtual HRESULT InternalGetTooltip(INT iItem, INT index, DWORD_PTR dwData, LPWSTR pszText, INT cchTextMax);
+    virtual HRESULT InternalExecuteItem(INT iItem, INT index, DWORD_PTR dwData);
+    virtual HRESULT InternalPopupItem(INT iItem, INT index, DWORD_PTR dwData, BOOL keyInitiated);
+    virtual HRESULT InternalHasSubMenu(INT iItem, INT index, DWORD_PTR dwData);
+    virtual HRESULT InternalContextMenu(INT iItem, INT index, DWORD_PTR dwData, POINT pt);
 };
 
 class CMenuSFToolbar :
@@ -151,12 +165,13 @@ public:
     HRESULT GetShellFolder(DWORD *pdwFlags, LPITEMIDLIST *ppidl, REFIID riid, void **ppv);
 
     virtual HRESULT FillToolbar(BOOL clearFirst=FALSE);
-    virtual HRESULT OnCommand(WPARAM wParam, LPARAM lParam, LRESULT *theResult);
-    virtual HRESULT OnContextMenu(NMMOUSE * rclick);
 
 protected:
     virtual HRESULT OnDeletingButton(const NMTOOLBAR * tb);
 
-    virtual HRESULT InternalPopupItem(INT uItem, INT index, DWORD_PTR dwData);
-    virtual HRESULT InternalHasSubMenu(INT uItem, INT index, DWORD_PTR dwData);
+    virtual HRESULT InternalGetTooltip(INT iItem, INT index, DWORD_PTR dwData, LPWSTR pszText, INT cchTextMax);
+    virtual HRESULT InternalExecuteItem(INT iItem, INT index, DWORD_PTR dwData);
+    virtual HRESULT InternalPopupItem(INT iItem, INT index, DWORD_PTR dwData, BOOL keyInitiated);
+    virtual HRESULT InternalHasSubMenu(INT iItem, INT index, DWORD_PTR dwData);
+    virtual HRESULT InternalContextMenu(INT iItem, INT index, DWORD_PTR dwData, POINT pt);
 };