#ifndef _BROWSEXT_H #define _BROWSEXT_H #include "tbext.h" #define FCIDM_TOOLS_EXT_PLACEHOLDER 0x9000 #define FCIDM_TOOLS_EXT_MOD_MARKER 0x9001 #define FCIDM_HELP_EXT_PLACEHOLDER 0x9002 #define FCIDM_HELP_EXT_MOD_MARKER 0x9003 // // This class is used to store/retrieve images by name (guid) from shared image lists // class CImageList { public: CImageList(HIMAGELIST himl = NULL); ~CImageList(); CImageList& operator=(HIMAGELIST himl); operator HIMAGELIST() { return _himl; } int GetImageIndex(REFGUID rguid); int AddIcon(HICON hicon, REFGUID rguid); BOOL HasImages() { return (_himl != NULL); } void FreeImages(); protected: static int _DPADestroyCallback(LPVOID p, LPVOID d); // Associate guids with indices into the image list struct ImageAssoc { GUID guid; int iImage; }; HIMAGELIST _himl; HDPA _hdpa; // Array of ImageAssoc }; // // Internal interface fo managing buttons added to the internet toolbar and menu items added to the // tools menu. This interface will likely go away afer IE5B2 when we move this functionality to // a browser helper object. // EXTERN_C const IID IID_IToolbarExt; DECLARE_INTERFACE_(IToolbarExt, IUnknown) { // *** IUnknown methods *** virtual STDMETHODIMP QueryInterface(REFIID riid, LPVOID * ppvObj) PURE; virtual STDMETHODIMP_(ULONG) AddRef(void) PURE; virtual STDMETHODIMP_(ULONG) Release(void) PURE; // *** IToolbarExt methods *** virtual STDMETHODIMP GetButtons(TBBUTTON* ptbArr, int nNumButtons, BOOL fInit) PURE; virtual STDMETHODIMP GetNumButtons(UINT* pButtons) PURE; virtual STDMETHODIMP InitButtons(IExplorerToolbar* pxtb, UINT* puStringIndex, const GUID* pguidCommandGroup) PURE; virtual STDMETHODIMP OnCustomizableMenuPopup(HMENU hMenuParent, HMENU hMenu) PURE; virtual STDMETHODIMP OnMenuSelect(UINT nCmdID) PURE; }; class CBrowserExtension : public IToolbarExt , public IObjectWithSite , public IOleCommandTarget { public: // *** IUnknown methods *** virtual STDMETHODIMP QueryInterface(REFIID riid, LPVOID * ppvObj); virtual STDMETHODIMP_(ULONG) AddRef(void); virtual STDMETHODIMP_(ULONG) Release(void); // *** IObjectWithSite methods *** virtual STDMETHODIMP SetSite(IUnknown* pUnkSite); virtual STDMETHODIMP GetSite(REFIID riid, void ** ppvSite); // *** IToolbarExt methods *** virtual STDMETHODIMP GetButtons(TBBUTTON* ptbArr, int nNumButtons, BOOL fInit); virtual STDMETHODIMP GetNumButtons(UINT* pButtons); virtual STDMETHODIMP InitButtons(IExplorerToolbar* pxtb, UINT* puStringIndex, const GUID* pguidCommandGroup); virtual STDMETHODIMP OnCustomizableMenuPopup(HMENU hMenuParent, HMENU hMenu); virtual STDMETHODIMP OnMenuSelect(UINT nCmdID); // *** IOleCommandTarget methods *** virtual STDMETHODIMP Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANTARG *pvarargIn, VARIANTARG *pvarargOut); virtual STDMETHODIMP QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD rgCmds[], OLECMDTEXT *pcmdtext); protected: // Instance creator friend HRESULT CBrowserExtension_CreateInstance(IUnknown* pUnkOuter, IUnknown** ppunk, LPCOBJECTINFO poi); CBrowserExtension(); ~CBrowserExtension(); HRESULT Update(); struct ExtensionItem { CLSID guid; // id of the extension IBrowserExtension* pIBE; BITBOOL fButton:1; // if has a button BITBOOL fVisible:1; // if defaults to visible on the toolbar int iStringID; // Keeps track of the location in the string resource for the button int iImageID; // The ID of the icon in the image lists int idCmd; // toolbar CmdId UINT idmMenu; // idm of the menu this extension belongs to }; void _AddItem(HKEY hkeyExtensions, LPCWSTR pszButtonGuid, REFGUID rguid); ExtensionItem* _FindItem(REFGUID rguid); void _FreeItems(); HRESULT _Exec(int nItem, int nCmdID); UINT _GetImageLists(CImageList** ppimlDef, CImageList** ppimlHot, BOOL fSmall); void _ReleaseImageLists(UINT uiIndex); HRESULT _AddCustomImagesToImageList(CImageList& rimlNormal, CImageList& rimlHot, BOOL fSmallIcons); HRESULT _AddCustomStringsToBuffer(IExplorerToolbar * pxtb, const GUID* pguidCommandGroup); int _GetCmdIdFromClsid(LPCWSTR pszGuid); int _GetIdpaFromCmdId(int nCmdId); typedef struct tagBROWSEXT_MENU_INFO { UINT idmMenu; // idm for this menu UINT idmPlaceholder; UINT idmModMarker; // separator with this idm is present if customizations have been made int iInsert; // insertion point for custom items } BROWSEXT_MENU_INFO; HRESULT _GetCustomMenuInfo(HMENU hMenuParent, HMENU hMenu, BROWSEXT_MENU_INFO * pMI); LONG _cRef; // reference count HDPA _hdpa; // array of ExtensionItem* int _nExtButtons; // Number of Buttons int _nExtToolsMenuItems; // Number of Tools Menu Items IShellBrowser* _pISB; // Passed into the IObjectWithSite::GetSite UINT _uStringIndex; // index of first string added to toolbar // Used for CUT/COPY/PASTE imagelist struct CImageCache { UINT uiResDef; // resource id for grey-scale bitmap UINT uiResHot; // resource id for color bitmap CImageList imlDef; // grey scale imagelist CImageList imlHot; // color imagelist int cUsage; // number of instances using this item BOOL bShell32; // resource stored in shell32 }; static CImageCache _rgImages[3]; // cached image lists: // 16 color 16x16 // 16 color 20x20 // 256 color 20x20 UINT _uiImageIndex; // Currently used index into _rgImages (-1 is none) #ifdef DEBUG BOOL _fStringInit; // These are used to insure that AddExtButtonsTBArray is only called after BOOL _fImageInit; // AddCustomImag... and AddCustomStrin... have been called. #endif }; EXTERN_C const CLSID CLSID_PrivBrowsExtCommands; typedef enum { PBEC_GETSTRINGINDEX = 1, } PBEC_COMMANDS; #endif // _BROWSEXT_H