[RSHELL]
[reactos.git] / base / shell / rshell / CMenuToolbars.h
index 9f73a76..0a33ec7 100644 (file)
 class CMenuBand;
 class CMenuFocusManager;
 
+#define WM_USER_ISTRACKEDITEM (WM_USER+41)
+#define WM_USER_CHANGETRACKEDITEM (WM_USER+42)
+
+
 class CMenuToolbarBase
 {
 private:
     HWND  m_hwnd;        // May be the pager
     HFONT m_marlett;
     BOOL  m_useFlatMenus;
+    WNDPROC m_SubclassOld;
+    BOOL m_disableMouseTrack;
 
 protected:
     CMenuBand * m_menuBand;
     HWND        m_hwndToolbar;
     DWORD       m_dwMenuFlags;
-    INT         m_hotItem;
-    INT         m_popupItem;
-    WNDPROC     m_SubclassOld;
     BOOL        m_hasIdealSize;
     SIZE        m_idealSize;
     BOOL        m_usePager;
+    CMenuToolbarBase * m_hotBar;
+    INT                m_hotItem;
+    CMenuToolbarBase * m_popupBar;
+    INT                m_popupItem;
+
+    DWORD m_toolbarFlags;
+    BOOL m_isTracking;
 
 private:
     static LRESULT CALLBACK s_SubclassProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
@@ -55,29 +65,50 @@ public:
 
     HRESULT OnWinEvent(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *theResult);
 
-    virtual HRESULT FillToolbar() = 0;
-    virtual HRESULT PopupItem(UINT uItem) = 0;
-    virtual HRESULT HasSubMenu(UINT uItem) = 0;
-    virtual HRESULT OnContextMenu(NMMOUSE * rclick) = 0;
+    HRESULT OnHotItemChanged(CMenuToolbarBase * toolbar, INT item);
+    HRESULT OnPopupItemChanged(CMenuToolbarBase * toolbar, INT item);
 
     HRESULT PopupSubMenu(UINT itemId, UINT index, IShellMenu* childShellMenu);
-    HRESULT PopupSubMenu(UINT index, HMENU menu);
+    HRESULT PopupSubMenu(UINT itemId, UINT index, HMENU menu);
     HRESULT DoContextMenu(IContextMenu* contextMenu);
 
     HRESULT ChangeHotItem(DWORD changeType);
-    HRESULT OnHotItemChange(const NMTBHOTITEM * hot);
+    HRESULT OnHotItemChange(const NMTBHOTITEM * hot, LRESULT * theResult);
+
+    HRESULT IsTrackedItem(INT index);
+    HRESULT ChangeTrackedItem(INT index);
 
     HRESULT GetIdealSize(SIZE& size);
     HRESULT SetPosSize(int x, int y, int cx, int cy);
 
     void InvalidateDraw();
 
+    HRESULT DisableMouseTrack(BOOL bDisable);
+
+    virtual HRESULT FillToolbar(BOOL clearFirst=FALSE) = 0;
+    virtual HRESULT OnContextMenu(NMMOUSE * rclick) = 0;
+
+    HRESULT PopupItem(INT uItem);
+    HRESULT HasSubMenu(INT uItem);
+    HRESULT GetDataFromId(INT uItem, INT* pIndex, DWORD_PTR* pData);
+
 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);
 
+    HRESULT AddButton(DWORD commandId, LPCWSTR caption, BOOL hasSubMenu, INT iconId, DWORD_PTR buttonData, BOOL last);
+    HRESULT AddSeparator(BOOL last);
+    HRESULT AddPlaceholder();
+
     HRESULT UpdateImageLists();
+
+private:
+    HRESULT OnCustomDraw(LPNMTBCUSTOMDRAW cdraw, LRESULT * theResult);
 };
 
 class CMenuStaticToolbar :
@@ -93,19 +124,22 @@ public:
     HRESULT SetMenu(HMENU hmenu, HWND hwnd, DWORD dwFlags);
     HRESULT GetMenu(HMENU *phmenu, HWND *phwnd, DWORD *pdwFlags);
 
-    virtual HRESULT FillToolbar();
-    virtual HRESULT PopupItem(UINT uItem);
-    virtual HRESULT HasSubMenu(UINT uItem);
+    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);
 };
 
 class CMenuSFToolbar :
     public CMenuToolbarBase
 {
 private:
-    IShellFolder * m_shellFolder;
+    CComPtr<IShellFolder> m_shellFolder;
     LPCITEMIDLIST  m_idList;
     HKEY           m_hKey;
 
@@ -116,12 +150,13 @@ public:
     HRESULT SetShellFolder(IShellFolder *psf, LPCITEMIDLIST pidlFolder, HKEY hKey, DWORD dwFlags);
     HRESULT GetShellFolder(DWORD *pdwFlags, LPITEMIDLIST *ppidl, REFIID riid, void **ppv);
 
-    virtual HRESULT FillToolbar();
-    virtual HRESULT PopupItem(UINT uItem);
-    virtual HRESULT HasSubMenu(UINT uItem);
+    virtual HRESULT FillToolbar(BOOL clearFirst=FALSE);
     virtual HRESULT OnCommand(WPARAM wParam, LPARAM lParam, LRESULT *theResult);
     virtual HRESULT OnContextMenu(NMMOUSE * rclick);
 
-private:
-    LPITEMIDLIST GetPidlFromId(UINT uItem, INT* pIndex = NULL);
+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);
 };