#ifndef __FLDRICON_H_ #define __FLDRICON_H_ #include <evtsink.h> #include <shellp.h> #include <windef.h> #include <webvwid.h> #include <color.h> #include <cnctnpt.h> EXTERN_C const CLSID CLSID_WebViewFolderIconOld; // retired from service #define ID_FIRST 0 // Context Menu ID's #define ID_LAST 0x7fff #define MAX_SCALE_STR 10 #define MAX_VIEW_STR 50 #define LARGE_ICON_DEFAULT 32 #define THUMBVIEW_DEFAULT 120 #define PIEVIEW_DEFAULT THUMBVIEW_DEFAULT #define SLICE_NUM_GROW 2 #define SZ_LARGE_ICON L"Large Icon" #define SZ_SMALL_ICON L"Small Icon" #define SZ_SMALL_ICON_LABEL L"Small Icon with Label" #define SZ_LARGE_ICON_LABEL L"Large Icon with Label" #define SZ_THUMB_VIEW L"Thumbview" #define SZ_PIE_VIEW L"Pie Graph" struct PieSlice_S { ULONGLONG MemSize; COLORREF Color; }; ///////////////////////////////////////////////////////////////////////////// // CWebViewFolderIcon class ATL_NO_VTABLE CWebViewFolderIcon : public CComObjectRootEx<CComSingleThreadModel>, public CComCoClass<CWebViewFolderIcon, &CLSID_WebViewFolderIcon>, public CComControl<CWebViewFolderIcon>, public IDispatchImpl<IWebViewFolderIcon3, &IID_IWebViewFolderIcon3, &LIBID_WEBVWLib>, public IObjectSafetyImpl<CWebViewFolderIcon, INTERFACESAFE_FOR_UNTRUSTED_CALLER>, public IQuickActivateImpl<CWebViewFolderIcon>, public IOleControlImpl<CWebViewFolderIcon>, public IOleObjectImpl<CWebViewFolderIcon>, public IOleInPlaceActiveObjectImpl<CWebViewFolderIcon>, public IViewObjectExImpl<CWebViewFolderIcon>, public IOleInPlaceObjectWindowlessImpl<CWebViewFolderIcon>, public IPersistPropertyBagImpl<CWebViewFolderIcon>, public IPointerInactiveImpl<CWebViewFolderIcon>, public IConnectionPointImpl<CWebViewFolderIcon, &DIID_DWebViewFolderIconEvents>, public IConnectionPointContainerImpl<CWebViewFolderIcon>, public IProvideClassInfo2Impl<&CLSID_WebViewFolderIcon, &DIID_DWebViewFolderIconEvents, &LIBID_WEBVWLib> { public: // Drawing function HRESULT OnDraw(ATL_DRAWINFO& di); DECLARE_REGISTRY_RESOURCEID(IDR_WEBVIEWFOLDERICON) BEGIN_COM_MAP(CWebViewFolderIcon) COM_INTERFACE_ENTRY(IWebViewFolderIcon3) COM_INTERFACE_ENTRY_IID(IID_IWebViewFolderIcon, IWebViewFolderIcon3) COM_INTERFACE_ENTRY_IID(IID_IWebViewFolderIcon2, IWebViewFolderIcon3) COM_INTERFACE_ENTRY(IDispatch) COM_INTERFACE_ENTRY(IOleInPlaceObject) COM_INTERFACE_ENTRY(IViewObjectEx) COM_INTERFACE_ENTRY(IObjectSafety) COM_INTERFACE_ENTRY(IOleInPlaceObjectWindowless) COM_INTERFACE_ENTRY(IOleInPlaceActiveObject) COM_INTERFACE_ENTRY(IOleControl) COM_INTERFACE_ENTRY(IOleObject) COM_INTERFACE_ENTRY(IQuickActivate) COM_INTERFACE_ENTRY(IPersistPropertyBag) COM_INTERFACE_ENTRY(IPointerInactive) COM_INTERFACE_ENTRY(IConnectionPointContainer) COM_INTERFACE_ENTRY(IProvideClassInfo2) COM_INTERFACE_ENTRY_IID(IID_IViewObject, IViewObjectEx) COM_INTERFACE_ENTRY_IID(IID_IViewObject2, IViewObjectEx) COM_INTERFACE_ENTRY_IID(IID_IOleWindow, IOleInPlaceObjectWindowless) COM_INTERFACE_ENTRY_IID(IID_IOleInPlaceObject, IOleInPlaceObjectWindowless) END_COM_MAP() BEGIN_MSG_MAP(CWebViewFolderIcon) MESSAGE_HANDLER(WM_PAINT, OnPaint) MESSAGE_HANDLER(WM_RBUTTONDOWN, OnButtonDown) MESSAGE_HANDLER(WM_LBUTTONDOWN, OnButtonDown) MESSAGE_HANDLER(WM_RBUTTONUP, OnRButtonUp) MESSAGE_HANDLER(WM_LBUTTONDBLCLK, OnLButtonDoubleClick) MESSAGE_HANDLER(WM_CONTEXTMENU, OnContextMenu) MESSAGE_HANDLER(WM_KEYDOWN, OnKeyDown) MESSAGE_HANDLER(WM_INITMENUPOPUP, OnInitPopup) MESSAGE_HANDLER(WM_MOUSELEAVE, OnMouseLeave) MESSAGE_HANDLER(WM_MOUSEMOVE, OnMouseMove) END_MSG_MAP() BEGIN_PROPERTY_MAP(CWebViewFolderIcon) PROP_ENTRY("scale", DISPID_PROP_WVFOLDERICON_SCALE, CLSID_WebViewFolderIcon) PROP_ENTRY("path", DISPID_PROP_WVFOLDERICON_PATH, CLSID_WebViewFolderIcon) PROP_ENTRY("view", DISPID_PROP_WVFOLDERICON_VIEW, CLSID_WebViewFolderIcon) PROP_ENTRY("advproperty", DISPID_PROP_WVFOLDERICON_ADVPROPERTY, CLSID_WebViewFolderIcon) PROP_ENTRY("clickStyle", DISPID_PROP_WVFOLDERICON_CLICKSTYLE, CLSID_WebViewFolderIcon) PROP_ENTRY("labelGap", DISPID_PROP_WVFOLDERICON_LABELGAP, CLSID_WebViewFolderIcon) // WARNING! "item" must be last because it can fail (due to security) // and ATL stops loading once any property returns failure. PROP_ENTRY("item", DISPID_PROP_WVFOLDERICON_ITEM, CLSID_WebViewFolderIcon) END_PROPERTY_MAP() BEGIN_CONNECTION_POINT_MAP(CWebViewFolderIcon) CONNECTION_POINT_ENTRY(DIID_DWebViewFolderIconEvents) END_CONNECTION_POINT_MAP() // *** IOleWindow *** virtual STDMETHODIMP GetWindow(HWND * lphwnd) {return IOleInPlaceActiveObjectImpl<CWebViewFolderIcon>::GetWindow(lphwnd);}; virtual STDMETHODIMP ContextSensitiveHelp(BOOL fEnterMode) { return IOleInPlaceActiveObjectImpl<CWebViewFolderIcon>::ContextSensitiveHelp(fEnterMode); }; // *** IOleInPlaceObject *** virtual STDMETHODIMP InPlaceDeactivate(void) {return IOleInPlaceObject_InPlaceDeactivate();}; virtual STDMETHODIMP SetObjectRects(LPCRECT lprcPosRect, LPCRECT lprcClipRect) {return IOleInPlaceObject_SetObjectRects(lprcPosRect, lprcClipRect);}; virtual STDMETHODIMP ReactivateAndUndo(void) { return E_NOTIMPL; }; virtual STDMETHODIMP UIDeactivate(void); // *** IOleInPlaceActiveObject *** virtual STDMETHODIMP TranslateAccelerator(LPMSG pMsg); // IDispatch overrides STDMETHOD(Invoke)(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr); // IViewObjectEx overrides STDMETHOD(GetViewStatus)(DWORD* pdwStatus); // IObjectWithSite overrides STDMETHOD(SetClientSite)(IOleClientSite *pClientSite); // IObjectSafety overrides STDMETHOD(SetInterfaceSafetyOptions)(REFIID riid, DWORD dwOptionSetMask, DWORD dwEnabledOptions); // IOleInPlaceObjectWindowless Overrides STDMETHOD(GetDropTarget)(IDropTarget **ppDropTarget); // IPointerInactive Overrides STDMETHOD(GetActivationPolicy)(DWORD* pdwPolicy); STDMETHOD(OnInactiveSetCursor)(LPCRECT pRectBounds, long x, long y, DWORD dwMouseMsg, BOOL fSetAlways) {return S_FALSE;}; // Ask for default behavior. // IOleControl overrides STDMETHOD(OnAmbientPropertyChange)(DISPID dispid); // ATL overrides HRESULT DoVerbUIActivate(LPCRECT prcPosRect, HWND hwndParent); // Event Handlers STDMETHOD(OnWindowLoad)(VOID); STDMETHOD(OnWindowUnLoad)(VOID); STDMETHOD(OnImageChanged)(VOID); // Advanced Properties - Context Menu, Default Open, Drag and Drop LRESULT OnRButtonUp(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL & bHandled); LRESULT OnButtonDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL & bHandled); LRESULT OnLButtonDoubleClick(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL & bHandled); LRESULT OnContextMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL & bHandled); LRESULT OnKeyDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL & bHandled); LRESULT OnInitPopup(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL & bHandled); LRESULT OnMouseLeave(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL & bHandled); LRESULT OnMouseMove(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL & bHandled); // *** IWebViewFolder *** STDMETHOD(get_scale)(BSTR *pbstrScale); STDMETHOD(put_scale)(BSTR bstrScale); STDMETHOD(get_path)(BSTR *pbstrPath); STDMETHOD(put_path)(BSTR bstrPath); STDMETHOD(get_view)(BSTR *pView); STDMETHOD(put_view)(BSTR view); STDMETHOD(get_advproperty)(VARIANT_BOOL *pvarbAdvProp); STDMETHOD(put_advproperty)(VARIANT_BOOL varbAdvProp); // *** IWebViewFolderIcon2 *** STDMETHOD(setSlice)(INT index, VARIANT varHiBytes, VARIANT varLoBytes, VARIANT varColorref); // *** IWebViewFolderIcon3 *** STDMETHOD(get_item)(FolderItem ** ppFolderItem); STDMETHOD(put_item)(FolderItem * pFolderItem); STDMETHOD(get_clickStyle)(/* retval, out */ LONG *plClickStyle); STDMETHOD(put_clickStyle)(/* in */ LONG lClickStyle); STDMETHOD(get_labelGap)(/* retval, out */ LONG *plLabelGap); STDMETHOD(put_labelGap)(/* in */ LONG lLabelGap); public: CWebViewFolderIcon(void); ~CWebViewFolderIcon(void); private: // Private helpers HRESULT InitImage(void); HRESULT InitIcon(void); HRESULT InitThumbnail(void); HRESULT InitPieGraph(void); HRESULT SetupIThumbnail(void); HRESULT _InvokeOnThumbnailReady(); HRESULT UpdateSize(void); HRESULT ForceRedraw(void); HRESULT _GetFullPidl(LPITEMIDLIST *ppidl); HRESULT _GetPathW(LPWSTR psz); HRESULT _GetPidlAndShellFolder(LPITEMIDLIST *ppidlLast, IShellFolder** ppsfParent); HRESULT _GetHwnd(HWND* phwnd); HRESULT _GetCenterPoint(POINT *pt); HRESULT _GetChildUIObjectOf(REFIID riid, void ** ppvObj); BOOL _WebViewOpen(void); HRESULT _ZoneCheck(DWORD dwFlags); BOOL IsSafeToDefaultVerb(void); void _FlipFocusRect(BOOL RectState); ULONGLONG GetUllMemFromVars(VARIANT *pvarHi, VARIANT *pvarLo); int GetPercentFromStrW(LPCWSTR pwzPercent); HRESULT DragDrop(int iClickXPos, int iClickYPos); HRESULT _DisplayContextMenu(long nXCord, long nYCord); HRESULT _DoContextMenuCmd(BOOL bDefault, long nXCord, long nYCord); BOOL _IsHostWebView(void); BOOL _IsPubWizHosted(void); HRESULT _SetDragImage(int iClickXPos, int iClickYPos, IDataObject * pdtobj); // 3dPie functions HRESULT Draw3dPie(HDC hdc, LPRECT lprc, DWORD dwPercent1000, const COLORREF *lpColors); HRESULT ComputeFreeSpace(LPCWSTR pszFileName); void ScalePieRect(LONG ShadowScale, LONG AspectRatio, LPRECT lprc); void ComputeSlicePct(ULONGLONG ullMemSize, DWORD *pdwPercent1000); void CalcSlicePoint(int *x, int *y, int rx, int ry, int cx, int cy, int FirstQuadPercent1000, DWORD dwPercent1000); void SetUpPiePts(int *pcx, int *pcy, int *prx, int *pry, RECT rect); void DrawPieDepth(HDC hdc, RECT rect, int x, int y, int cy, DWORD dwPercent1000, LONG ShadowDepth); void DrawSlice(HDC hdc, RECT rect, DWORD dwPercent1000, int rx, int ry, int cx, int cy, /*int *px, int *py,*/ COLORREF Color); void DrawEllipse(HDC hdc, RECT rect, int x, int y, int cx, int cy, DWORD dwPercent1000, const COLORREF *lpColors); void DrawShadowRegions(HDC hdc, RECT rect, LPRECT lprc, int UsedArc_x, int center_y, LONG ShadowDepth, DWORD dwPercent1000, COLORREF const *lpColors); HRESULT _GetPieChartIntoBitmap(); HRESULT _SetupWindow(void); HRESULT _MakeRoomForLabel(); // Window Procedure for catching and storing bitmap static LRESULT CALLBACK WndProc(HWND, UINT uMsg, WPARAM, LPARAM); // Managing the bitmap/icon LONG _GetScaledImageWidth(void) { return (m_lImageWidth * m_percentScale)/100; } LONG _GetScaledImageHeight(void) { return (m_lImageHeight * m_percentScale)/100; } // Managing the label void _ClearLabel(void); void _GetLabel(IShellFolder *psf, LPCITEMIDLIST pidlItem); LONG _GetControlWidth(void) { return _GetScaledImageWidth() + (m_sizLabel.cx ? m_cxLabelGap + m_sizLabel.cx : 0); } LONG _GetControlHeight(void) { return max(_GetScaledImageHeight(), m_sizLabel.cy); } void _GetAmbientFont(void); void _ClearAmbientFont(void); private: // Private message handlers HWND m_msgHwnd; WNDCLASS m_msgWc; BOOL m_bRegWndClass; IContextMenu3 * m_pcm3; // For Context Menu events IDropTarget * m_pDropTargetCache; // Cache the IDropTarget because MSHTML should but doesn't. IDispatch * m_pdispWindow; // Cache the HTML window object that we receive events from // Image information HICON m_hIcon; INT m_iIconIndex; // Size information INT m_percentScale; // image scaling UINT m_lImageWidth; // unscaled size of bitmap/icon UINT m_lImageHeight; LONG m_cxLabelGap; SIZE m_sizLabel; // size of label IThumbnail2 *m_pthumb; HBITMAP m_hbm; BOOL m_fTabRecieved; BOOL m_fIsHostWebView; // Are we hosted in WebView? HDC m_hdc; // Saved for _SetDragImage() RECT m_rect; // Rectangle into which we draw BOOL m_fRectAdjusted; // Flag says if we need to modify // rect for drag image. BOOL m_fLoaded; HBITMAP m_hbmDrag; // Piechart enum { PIE_USEDCOLOR = 0, PIE_FREECOLOR, PIE_USEDSHADOW, PIE_FREESHADOW, PIE_NUM // keep track of number of PIE_ values }; enum { COLOR_UP = 0, COLOR_DN, COLOR_UPSHADOW, COLOR_DNSHADOW, COLOR_NUM // #of entries }; enum VIEWS { VIEW_SMALLICON = 0, VIEW_LARGEICON, VIEW_THUMBVIEW, VIEW_PIECHART, // Extra flags for views VIEW_WITHLABEL = 0x00010000, VIEW_SMALLICONLABEL = VIEW_SMALLICON | VIEW_WITHLABEL, VIEW_LARGEICONLABEL = VIEW_LARGEICON | VIEW_WITHLABEL, }; // Putzing with the view inline static UINT _ViewType(VIEWS vw) { return LOWORD(vw); } COLORREF m_ChartColors[PIE_NUM]; ULONGLONG m_ullFreeSpace; ULONGLONG m_ullUsedSpace; ULONGLONG m_ullTotalSpace; BOOL m_fUseSystemColors; HDSA m_hdsaSlices; // added slices to the Used area int m_highestIndexSlice; // Advise Cookie DWORD m_dwHtmlWindowAdviseCookie; DWORD m_dwCookieDV; CIE4ConnectionPoint *m_pccpDV; // path property LPITEMIDLIST m_pidl; // view property VIEWS m_ViewUser; // What user wants. VIEWS m_ViewCurrent; // What user gets. // clickStyle property LONG m_clickStyle; // 1 = oneclick, 2 = twoclick // Activation rectangle flag BOOL m_bHasRect; // Advanced properties setting // When it is turned off, Context Menu, Drag and Drop, fucus rectangle, and security checking support // (anything to do with mouse clicking or tabbing) is turned off. BOOL m_bAdvPropsOn; // Should we also show the display name of the target? LPTSTR m_pszDisplayName; // What font should we show the display name in? HFONT m_hfAmbient; IFont * m_pfont; // Who owns the font? // (if NULL, then we do) // Show hilite effects- underline text, dropshadow for icon etc.. BOOL m_bHilite; DWORD m_dwThumbnailID; // ID to identify which bitmap we received }; #endif //__WVFOLDER_H_