#ifndef __IEMYPICS_H_ #define __IEMYPICS_H_ // other constants: #define MP_BMP_CX 16 // bitmap size #define MP_BMP_CY 16 #define MP_NUM_TBBUTTONS 4 // number buttons #define MP_NUM_TBBITMAPS 4 #define MP_MIN_CX 114 // minimum x size of toolbar #define MP_MIN_CY 28 // minimum y size of toolbar #define MP_MIN_SIZE 200 // minimum square size in pixels for hoverbar to appear #define MP_HOVER_OFFSET 10 // offset +x +y from (x,y) of image's upper lefthand corner #define MP_TIMER 700 // time in milliseconds to delay on the mouseover/out events #define MP_SCROLLBAR_SIZE GetSystemMetrics(SM_CXVSCROLL) // size of the scrollbars in pixels // e-mail picture stuff called via ITridentService2 HRESULT DropOnMailRecipient(IDataObject *pdtobj, DWORD grfKeyState); HRESULT CreateShortcutSetSiteAndGetDataObjectIfPIDLIsNetUrl(LPCITEMIDLIST pidl, IUnknown *pUnkSite, IUniformResourceLocator **ppUrlOut, IDataObject **ppdtobj); HRESULT SendDocToMailRecipient(LPCITEMIDLIST pidl, UINT uiCodePage, DWORD grfKeyState, IUnknown *pUnkSite); // need this to get scroll event, it lives in iforms.cpp... void Win3FromDoc2(IHTMLDocument2 *pDoc2, IHTMLWindow3 **ppWin3); // well, yeah. BOOL MP_IsEnabledInRegistry(); BOOL MP_IsEnabledInIEAK(); DWORD MP_GetFilterInfoFromRegistry(); // EventSink Callback Class (glorified array)... class CMyPicsEventSinkCallback { public: typedef enum { EVENT_BOGUS = 100, EVENT_MOUSEOVER = 0, EVENT_MOUSEOUT, EVENT_SCROLL, EVENT_RESIZE } EVENTS; typedef struct { EVENTS Event; LPCWSTR pwszEventSubscribe; LPCWSTR pwszEventName; } EventSinkEntry; virtual HRESULT HandleEvent(IHTMLElement *pEle, EVENTS Event, IHTMLEventObj *pEventObj) = 0; static EventSinkEntry EventsToSink[]; }; class CMyPics : public CMyPicsEventSinkCallback { long m_cRef; public: class CEventSink; CMyPics(); ~CMyPics(); // IUnknown... virtual STDMETHODIMP QueryInterface(REFIID, void **); virtual ULONG __stdcall AddRef(); virtual ULONG __stdcall Release(); // CMyPicsEventSinkCallback... HRESULT HandleEvent(IHTMLElement *pEle, EVENTS Event, IHTMLEventObj *pEventObj); HRESULT Init(IHTMLDocument2 *pDoc2); HRESULT UnInit(); static HRESULT GetName(IHTMLInputTextElement *pTextEle, BSTR *pbstrName); static BOOL IsAdminRestricted(LPCTSTR pszRegVal); typedef HRESULT (*PFN_ENUM_CALLBACK)(IDispatch *pDispEle, DWORD_PTR dwCBData); BOOL IsOff(); static VOID CALLBACK s_TimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime); void IsGalleryMeta(BOOL bFlag); protected: // Methods for managing the Hover bar HRESULT CreateHover(); HRESULT DestroyHover(); HRESULT HideHover(); HRESULT ShowHover(); // Event handlers HRESULT HandleScroll(); HRESULT HandleMouseout(); HRESULT HandleMouseover(IHTMLElement *pEle); HRESULT HandleResize(); static LRESULT CALLBACK s_WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); LRESULT CALLBACK DisableWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); BOOL ShouldAppearOnThisElement(IHTMLElement *pEle); HRESULT GetRealCoords(IHTMLElement2 *pEle2, HWND hwnd, LONG *plLeft, LONG *plTop, LONG *plRight, LONG *plBottom); IHTMLElement *GetIMGFromArea(IHTMLElement *pEleIn, POINT ptEvent); private: // CMyPics member variables CEventSink *m_pSink; // Floating Toolbar stuff... HWND m_Hwnd, // Hwnd for the m_pdoc2 m_hWndHover, // Hover rebar thing m_hWndMyPicsToolBar; // Toolbar that lives in the hover thing UINT m_hoverState; // Current state of the HoverBar thing UINT_PTR m_uidTimer; // The Timer WNDPROC m_wndprocOld; // For stuff HIMAGELIST m_himlHover; // For the image list HIMAGELIST m_himlHoverHot; // for the hot images // Useful stuff for the attached document IHTMLDocument2 *m_pDoc2; IHTMLElement *m_pEleCurr; // current element we are hovering over IHTMLWindow3 *m_pWin3; // for unsinking scroll event EVENTS m_eventsCurr; // event currently being processed BOOL m_bIsOffForSession : 1; // have we disabled feature for this session? BOOL m_bGalleryMeta : 1; // TRUE if there was a META tag disabling image bar for this doc BOOL m_bGalleryImg : 1; // TRUE if the current element has a galleryimg value set to TRUE public: // Sinks regular Trident events. Calls back via CMyPicsEventSinkCallback... class CEventSink : public IDispatch { ULONG m_cRef; public: CEventSink(CMyPicsEventSinkCallback *pParent); ~CEventSink(); HRESULT SinkEvents(IHTMLElement2 *pEle2, int iNum, EVENTS *pEvents); HRESULT UnSinkEvents(IHTMLElement2 *pEle2, int iNum, EVENTS *pEvents); HRESULT SinkEvents(IHTMLWindow3 *pWin3, int iNum, EVENTS *pEvents); HRESULT UnSinkEvents(IHTMLWindow3 *pWin3, int iNum, EVENTS *pEvents); void SetParent(CMyPicsEventSinkCallback *pParent) { m_pParent = pParent; } STDMETHODIMP QueryInterface(REFIID, void **); STDMETHODIMP_(ULONG) AddRef(void); STDMETHODIMP_(ULONG) Release(void); // IDispatch STDMETHODIMP GetTypeInfoCount(UINT* pctinfo); STDMETHODIMP GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo** ppTInfo); STDMETHODIMP GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId); STDMETHODIMP Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr); private: CMyPicsEventSinkCallback *m_pParent; }; }; #endif //__IEMYPICS_H_