sfviewp.h
Upload User: xhy777
Upload Date: 2007-02-14
Package Size: 24088k
Code Size: 49k
Category:

Windows Kernel

Development Platform:

Visual C++

  1. #define DV_ISANYICONMODE(fvm) ((fvm) == FVM_ICON || (fvm) == FVM_SMALLICON)
  2. #ifndef _SFVIEWP_H_
  3. #define _SFVIEWP_H_
  4. #include "defview.h"
  5. #include <mshtmhst.h>   // move it to priv.h eventually
  6. #include "urlmon.h"
  7. #include "dvtasks.h"
  8. #include <perhist.h>
  9. #include "cowsite.h"
  10. #include "inetsmgr.h"
  11. class CGenList
  12. {
  13. public:
  14.     CGenList(UINT cbItem) : m_hList(NULL), m_cbItem(cbItem) {}
  15.     ~CGenList() {Empty();}
  16.     LPVOID GetPtr(UINT i)
  17.         {return(i<GetItemCount() ? DSA_GetItemPtr(m_hList, i) : NULL);}
  18.     UINT GetItemCount() {return(m_hList ? DSA_GetItemCount(m_hList) : 0);}
  19.     int Add(LPVOID pv, int nInsert);
  20.     void Empty() {if (m_hList) DSA_Destroy(m_hList); m_hList=NULL;}
  21. protected:
  22.     void Steal(CGenList* pList)
  23.     {
  24.         Empty();
  25.         m_cbItem = pList->m_cbItem;
  26.         m_hList = pList->m_hList;
  27.         pList->m_hList = NULL;
  28.     }
  29. private:
  30.     UINT m_cbItem;
  31.     HDSA m_hList;
  32. } ;
  33. class CViewsList : public CGenList
  34. {
  35. public:
  36.     CViewsList() : CGenList(SIZEOF(SFVVIEWSDATA*)), m_bGotDef(FALSE) {}
  37.     ~CViewsList() {Empty();}
  38.     SFVVIEWSDATA* GetPtr(UINT i)
  39.     {
  40.         SFVVIEWSDATA** ppViewsData = (SFVVIEWSDATA**)CGenList::GetPtr(i);
  41.         return(ppViewsData ? *ppViewsData : NULL);
  42.     }
  43.     int Add(const SFVVIEWSDATA*pView, int nInsert, BOOL bCopy);
  44.     int Add(const SFVVIEWSDATA*pView, BOOL bCopy=TRUE) {return Add(pView, DA_LAST, bCopy);}
  45.     int Prepend(const SFVVIEWSDATA*pView, BOOL bCopy=TRUE) {return Add(pView, 0, bCopy);}
  46.     void AddReg(HKEY hkParent, LPCTSTR pszSubKey);
  47.     void AddCLSID(CLSID const* pclsid);
  48.     void AddIni(LPCTSTR szIniFile, LPCTSTR szPath);
  49.     void SetDef(SHELLVIEWID const *pvid) { m_bGotDef=TRUE; m_vidDef=*pvid; }
  50.     BOOL GetDef(SHELLVIEWID *pvid) { if (m_bGotDef) *pvid=m_vidDef; return(m_bGotDef); }
  51.     void Empty();
  52.     static SFVVIEWSDATA* CopyData(const SFVVIEWSDATA* pData);
  53.     int NextUnique(int nLast);
  54.     int NthUnique(int nUnique);
  55. private:
  56.     BOOL m_bGotDef;
  57.     SHELLVIEWID m_vidDef;
  58. } ;
  59. typedef struct
  60. {
  61.     LPARAM  lParamSort;
  62.     int iDirection;
  63.     int iLastColumnClick;
  64. } DVSAVESTATE, *PDVSAVESTATE;
  65. class DVSAVEHEADER
  66. {
  67. public:
  68.     WORD          cbSize;
  69.     WORD          wUnused; // junk on stack at this location has been saved in the registry since Win95... bummer
  70.     DWORD         ViewMode;
  71.     POINTS        ptScroll;
  72.     WORD          cbColOffset;
  73.     WORD          cbPosOffset;
  74.     DVSAVESTATE   dvState;
  75.     UINT GetColumnsInfo(LPBYTE* ppColInfo)
  76.     {
  77.         if (cbColOffset >= SIZEOF(DVSAVEHEADER))
  78.         {
  79.             *ppColInfo = ((LPBYTE)this) + cbColOffset;
  80.             return cbPosOffset - cbColOffset;
  81.         }
  82.         else
  83.         {
  84.             *ppColInfo = NULL;
  85.             return 0;
  86.         }
  87.     }
  88. } ;
  89. typedef DVSAVEHEADER* PDVSAVEHEADER;
  90. // Even though we don't currently store anything we care
  91. // about in this structure relating to the view state,
  92. // the cbStreamSize value fixes a bug in Win95 where we
  93. // read to the end of the stream instead of just reading
  94. // in the same number of bytes we wrote out.
  95. //
  96. typedef struct
  97. {
  98.     DWORD       dwSignature;    // DVSAVEHEADEREX_SIGNATURE
  99.     WORD        cbSize;         // size of this structure, in bytes
  100.     WORD        wVersion;       // DVSAVEHEADEREX_VERSION
  101.     DWORD       cbStreamSize;   // size of all info saved, in bytes
  102.     DWORD       dwUnused;       // used to be SIZE szExtended (ie4 beta1)
  103.     WORD        cbColOffset;    // overrides DVSAVEHEADER.cbColOffset
  104.     WORD        wAlign;
  105. } DVSAVEHEADEREX, *PDVSAVEHEADEREX;
  106. #define DVSAVEHEADEREX_SIGNATURE 0xf0f0f0f0 // don't conflict with CCOLSHEADER_SIGNATURE
  107. #define DVSAVEHEADEREX_VERSION 3 // for easy versioning
  108. //=============================================================================
  109. // CDVDropTarget : class definition
  110. //=============================================================================
  111. class CDVDropTarget // dvdt
  112. {        
  113. public:
  114.     HRESULT DragEnter(IDataObject *pdtobj, DWORD grfKeyState, POINTL ptl, DWORD *pdwEffect);
  115.     HRESULT DragOver(DWORD grfKeyState, POINTL ptl, DWORD *pdwEffect);
  116.     HRESULT DragLeave();
  117.     HRESULT Drop(IDataObject *pdtobj, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect);
  118.     void LeaveAndReleaseData(class CDefView *that);
  119.     void ReleaseDataObject();
  120.     void ReleaseCurrentDropTarget();
  121.     IDataObject *       pdtobj;         // from DragEnter()/Drop()
  122.     RECT                rcLockWindow;   // WindowRect of hwnd for DAD_ENTER
  123.     int                 itemOver;       // item we are visually dragging over
  124.     IDropTarget *       pdtgtCur;       // current drop target, derived from hit testing
  125.     DWORD               dwEffectOut;    // last *pdwEffect out
  126.     DWORD               grfKeyState;    // cached key state
  127.     POINT               ptLast;         // last dragged position
  128.     AUTO_SCROLL_DATA    asd;            // for auto scrolling
  129.     DWORD               dwLastTime;     // for auto-opening folders
  130. } ;
  131. //
  132. //  This is a proxy IDropTarget object, which wraps Trident's droptarget.
  133. //
  134. class CHostDropTarget : public IDropTarget
  135. {
  136. public:
  137.     // *** IUnknown methods ***
  138.     virtual STDMETHODIMP QueryInterface(REFIID riid, void ** ppvObj);
  139.     virtual STDMETHODIMP_(ULONG) AddRef(void) ;
  140.     virtual STDMETHODIMP_(ULONG) Release(void);
  141.     // *** IDropTarget ***
  142.     virtual STDMETHODIMP DragEnter(IDataObject *pdtobj, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect);
  143.     virtual STDMETHODIMP DragOver(DWORD grfKeyState, POINTL pt, DWORD *pdwEffect);
  144.     virtual STDMETHODIMP DragLeave(void);
  145.     virtual STDMETHODIMP Drop(IDataObject *pdtobj, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect);
  146.     IDropTarget* _pdtDoc;   // Drop target of the trident
  147.     IDropTarget* _pdtFrame; // Drop target of the frame
  148. };
  149. class CSFVSite : public IOleInPlaceSite,
  150.                  public IOleClientSite,
  151.                  public IOleDocumentSite,
  152.                  public IServiceProvider,
  153.                  public IOleCommandTarget,
  154.                  public IDocHostUIHandler,
  155.                  public IOleControlSite,
  156.                  public IInternetSecurityManager,
  157.                  public IDispatch       //For ambient properties.
  158. {
  159.     friend CHostDropTarget;
  160. public:
  161.     CSFVSite()  { ASSERT(m_peds == NULL); }
  162.     ~CSFVSite() {
  163.                     if (m_peds) {
  164.                         m_peds->Release();
  165.                         m_peds = NULL;
  166.                     }
  167.                 }
  168.     // *** IUnknown methods ***
  169.     STDMETHOD(QueryInterface)(REFIID riid, void **ppv);
  170.     STDMETHOD_(ULONG,AddRef)(THIS);
  171.     STDMETHOD_(ULONG,Release)(THIS);
  172.     // IOleWindow
  173.     virtual STDMETHODIMP GetWindow(
  174.         /* [out] */ HWND *phwnd);
  175.     virtual STDMETHODIMP ContextSensitiveHelp(
  176.         /* [in] */ BOOL fEnterMode);
  177.     // IOleInPlaceSite
  178.     virtual STDMETHODIMP CanInPlaceActivate( void);
  179.     virtual STDMETHODIMP OnInPlaceActivate( void);
  180.     virtual STDMETHODIMP OnUIActivate( void);
  181.     virtual STDMETHODIMP GetWindowContext(
  182.         /* [out] */ IOleInPlaceFrame **ppFrame,
  183.         /* [out] */ IOleInPlaceUIWindow **ppDoc,
  184.         /* [out] */ LPRECT lprcPosRect,
  185.         /* [out] */ LPRECT lprcClipRect,
  186.         /* [out][in] */ LPOLEINPLACEFRAMEINFO lpFrameInfo);
  187.     virtual STDMETHODIMP Scroll(
  188.         /* [in] */ SIZE scrollExtant);
  189.     virtual STDMETHODIMP OnUIDeactivate(
  190.         /* [in] */ BOOL fUndoable);
  191.     virtual STDMETHODIMP OnInPlaceDeactivate( void);
  192.     virtual STDMETHODIMP DiscardUndoState( void);
  193.     virtual STDMETHODIMP DeactivateAndUndo( void);
  194.     virtual STDMETHODIMP OnPosRectChange(
  195.         /* [in] */ LPCRECT lprcPosRect);
  196.     // IOleClientSite
  197.     virtual STDMETHODIMP SaveObject( void);
  198.     virtual STDMETHODIMP GetMoniker(
  199.         /* [in] */ DWORD dwAssign,
  200.         /* [in] */ DWORD dwWhichMoniker,
  201.         /* [out] */ IMoniker **ppmk);
  202.     virtual STDMETHODIMP GetContainer(
  203.         /* [out] */ IOleContainer **ppContainer);
  204.     virtual STDMETHODIMP ShowObject( void);
  205.     virtual STDMETHODIMP OnShowWindow(
  206.         /* [in] */ BOOL fShow);
  207.     virtual STDMETHODIMP RequestNewObjectLayout( void);
  208.     // IOleDocumentSite
  209.     virtual STDMETHODIMP ActivateMe(
  210.         /* [in] */ IOleDocumentView *pviewToActivate);
  211.     // IServiceProvider
  212.     virtual STDMETHODIMP QueryService(REFGUID guidService, REFIID riid, LPVOID* ppvObj);
  213.     // IOleCommandTarget
  214.     virtual STDMETHODIMP QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD rgCmds[], OLECMDTEXT *pcmdtext);
  215.     virtual STDMETHODIMP Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANTARG *pvarargIn, VARIANTARG *pvarargOut);
  216.     // IOleControlSite
  217.     virtual HRESULT STDMETHODCALLTYPE OnControlInfoChanged()
  218.         { return E_NOTIMPL; };
  219.     virtual HRESULT STDMETHODCALLTYPE LockInPlaceActive(BOOL fLock)
  220.         { return E_NOTIMPL; };
  221.     virtual HRESULT STDMETHODCALLTYPE GetExtendedControl(IDispatch __RPC_FAR *__RPC_FAR *ppDisp)
  222.         { *ppDisp = NULL; return E_NOTIMPL; };
  223.     virtual HRESULT STDMETHODCALLTYPE TransformCoords(POINTL __RPC_FAR *pPtlHimetric, POINTF __RPC_FAR *pPtfContainer,DWORD dwFlags)
  224.         { return E_NOTIMPL; };
  225.     virtual HRESULT STDMETHODCALLTYPE TranslateAccelerator(MSG __RPC_FAR *pMsg,DWORD grfModifiers);
  226.     virtual HRESULT STDMETHODCALLTYPE OnFocus(BOOL fGotFocus)
  227.         { return E_NOTIMPL; };
  228.     virtual HRESULT STDMETHODCALLTYPE ShowPropertyFrame(void)
  229.         { return E_NOTIMPL; };
  230.     // IDocHostUIHandler
  231.     virtual HRESULT STDMETHODCALLTYPE ShowContextMenu( 
  232.         DWORD dwID, POINT *ppt, IUnknown *pcmdtReserved, IDispatch *pdispReserved);
  233.     virtual HRESULT STDMETHODCALLTYPE GetHostInfo(DOCHOSTUIINFO *pInfo);
  234.     virtual HRESULT STDMETHODCALLTYPE ShowUI( 
  235.         DWORD dwID, IOleInPlaceActiveObject *pActiveObject,
  236.         IOleCommandTarget *pCommandTarget, IOleInPlaceFrame *pFrame,
  237.         IOleInPlaceUIWindow *pDoc);
  238.     virtual HRESULT STDMETHODCALLTYPE HideUI(void);
  239.     virtual HRESULT STDMETHODCALLTYPE UpdateUI(void);
  240.     virtual HRESULT STDMETHODCALLTYPE EnableModeless(BOOL fEnable);
  241.     virtual HRESULT STDMETHODCALLTYPE OnDocWindowActivate(BOOL fActivate);
  242.     virtual HRESULT STDMETHODCALLTYPE OnFrameWindowActivate(BOOL fActivate);
  243.     virtual HRESULT STDMETHODCALLTYPE ResizeBorder( 
  244.         LPCRECT prcBorder, IOleInPlaceUIWindow *pUIWindow, BOOL fRameWindow);
  245.     virtual HRESULT STDMETHODCALLTYPE TranslateAccelerator( 
  246.         LPMSG lpMsg, const GUID *pguidCmdGroup, DWORD nCmdID);
  247.     virtual HRESULT STDMETHODCALLTYPE GetOptionKeyPath(BSTR *pbstrKey, DWORD dw);
  248.     virtual HRESULT STDMETHODCALLTYPE GetDropTarget( 
  249.         IDropTarget *pDropTarget, IDropTarget **ppDropTarget);
  250.     virtual HRESULT STDMETHODCALLTYPE GetExternal(IDispatch **ppDisp);
  251.     virtual HRESULT STDMETHODCALLTYPE TranslateUrl(DWORD dwTranslate, OLECHAR *pchURLIn, OLECHAR **ppchURLOut);
  252.     virtual HRESULT STDMETHODCALLTYPE FilterDataObject(IDataObject *pDO, IDataObject **ppDORet);
  253.     // IInternetSecurityManager
  254.     virtual STDMETHODIMP SetSecuritySite(IInternetSecurityMgrSite *pSite) { return INET_E_DEFAULT_ACTION; };
  255.     virtual STDMETHODIMP GetSecuritySite(IInternetSecurityMgrSite **ppSite) { return INET_E_DEFAULT_ACTION; };
  256.     virtual STDMETHODIMP MapUrlToZone(LPCWSTR pwszUrl, DWORD * pdwZone, DWORD dwFlags) { return INET_E_DEFAULT_ACTION; };
  257.     virtual STDMETHODIMP GetSecurityId(LPCWSTR pwszUrl, BYTE * pbSecurityId, DWORD * pcbSecurityId, DWORD_PTR dwReserved) { return INET_E_DEFAULT_ACTION; };
  258.     virtual STDMETHODIMP ProcessUrlAction(LPCWSTR pwszUrl, DWORD dwAction, BYTE * pPolicy, DWORD cbPolicy, BYTE * pContext, DWORD cbContext, DWORD dwFlags, DWORD dwReserved);
  259.     virtual STDMETHODIMP QueryCustomPolicy(LPCWSTR pwszUrl, REFGUID guidKey, BYTE ** ppPolicy, DWORD * pcbPolicy, BYTE * pContext, DWORD cbContext, DWORD dwReserved) { return INET_E_DEFAULT_ACTION; };
  260.     virtual STDMETHODIMP SetZoneMapping(DWORD dwZone, LPCWSTR lpszPattern, DWORD dwFlags) { return INET_E_DEFAULT_ACTION; };
  261.     virtual STDMETHODIMP GetZoneMappings(DWORD dwZone, IEnumString ** ppenumString, DWORD dwFlags) { return INET_E_DEFAULT_ACTION; };
  262.     // *** IDispatch methods ***
  263.     STDMETHOD(GetTypeInfoCount) (unsigned int *pctinfo)
  264.         { return E_NOTIMPL; };
  265.     STDMETHOD(GetTypeInfo) (unsigned int itinfo, LCID lcid, ITypeInfo **pptinfo)
  266.         { return E_NOTIMPL; };
  267.     STDMETHODIMP GetIDsOfNames(REFIID riid, OLECHAR FAR* FAR* rgszNames, unsigned int cNames, LCID lcid, DISPID FAR* rgdispid)
  268.         { return E_NOTIMPL; };
  269.     STDMETHODIMP Invoke(DISPID dispidMember, REFIID iid, LCID lcid, WORD wFlags, DISPPARAMS FAR* pdispparams,
  270.                         VARIANT FAR* pvarResult,EXCEPINFO FAR* pexcepinfo,UINT FAR* puArgErr);
  271.     CHostDropTarget _dt;
  272.     IExpDispSupport * m_peds;
  273. } ;
  274. class CSFVFrame : public IOleInPlaceFrame
  275.                 , public IAdviseSink
  276.                 , public IPropertyNotifySink  //for READYSTATE
  277. {
  278. public:
  279.     enum
  280.     {
  281.         UNDEFINEDVIEW = -3,
  282.         NOEXTVIEW = -2,
  283.         HIDEEXTVIEW = -1,
  284.     } ;
  285.     CSFVFrame() : m_uView(NOEXTVIEW), m_bEnableStandardViews(TRUE),
  286.         m_pOleObj(NULL), m_pActiveSVExt(NULL), m_pActiveSFV(NULL), m_pDefViewExtInit2(NULL),
  287.         m_bgColor(CLR_INVALID), m_uActiveExtendedView(UNDEFINEDVIEW), m_uViewNew(NOEXTVIEW)
  288.     {
  289.     }
  290.     ~CSFVFrame();
  291.     // *** IUnknown methods ***
  292.     STDMETHOD(QueryInterface)(REFIID riid, void **ppv);
  293.     STDMETHOD_(ULONG,AddRef)(THIS);
  294.     STDMETHOD_(ULONG,Release)(THIS);
  295.     // IOleWindow
  296.     STDMETHODIMP GetWindow(HWND *phwnd);
  297.     STDMETHODIMP ContextSensitiveHelp(BOOL fEnterMode);
  298.     // IOleInPlaceUIWindow
  299.     STDMETHODIMP GetBorder(LPRECT lprectBorder);
  300.     STDMETHODIMP RequestBorderSpace(LPCBORDERWIDTHS pborderwidths);
  301.     STDMETHODIMP SetBorderSpace(LPCBORDERWIDTHS pborderwidths);
  302.     STDMETHODIMP SetActiveObject(IOleInPlaceActiveObject *pActiveObject, LPCOLESTR pszObjName);
  303.     // IOleInPlaceFrame
  304.     STDMETHODIMP InsertMenus(HMENU hmenuShared, LPOLEMENUGROUPWIDTHS lpMenuWidths);
  305.     STDMETHODIMP SetMenu(HMENU hmenuShared, HOLEMENU holemenu, HWND hwndActiveObject);
  306.     STDMETHODIMP RemoveMenus(HMENU hmenuShared);
  307.     STDMETHODIMP SetStatusText(LPCOLESTR pszStatusText);
  308.     STDMETHODIMP EnableModeless(BOOL fEnable);
  309.     STDMETHODIMP TranslateAccelerator(LPMSG lpmsg, WORD wID);
  310.     // IAdviseSink
  311.     STDMETHODIMP_(void) OnDataChange(FORMATETC *, STGMEDIUM *);
  312.     STDMETHODIMP_(void) OnViewChange(DWORD dwAspect, LONG lindex);
  313.     STDMETHODIMP_(void) OnRename(IMoniker *);
  314.     STDMETHODIMP_(void) OnSave();
  315.     STDMETHODIMP_(void) OnClose();
  316.     // *** IPropertyNotifySink methods ***
  317.     virtual STDMETHODIMP OnChanged(DISPID dispid);
  318.     virtual STDMETHODIMP OnRequestEdit(DISPID dispid);
  319.     COLORREF   m_bgColor;  //Icon text background color for active desktop
  320. private:
  321.     friend class CSFVSite;
  322.     CSFVSite m_cSite;
  323.     friend class CDefView;
  324.     class CBindStatusCallback : public IBindStatusCallback
  325.                               , public IServiceProvider
  326.     {
  327.         friend CSFVFrame;
  328.     protected:
  329.         // *** IUnknown methods ***
  330.         virtual STDMETHODIMP QueryInterface(REFIID riid, void ** ppvObj);
  331.         virtual STDMETHODIMP_(ULONG) AddRef(void) ;
  332.         virtual STDMETHODIMP_(ULONG) Release(void);
  333.     
  334.         // *** IServiceProvider ***
  335.         virtual STDMETHODIMP QueryService(REFGUID guidService, REFIID riid, void **ppvObj);
  336.     
  337.         // *** IBindStatusCallback ***
  338.         virtual STDMETHODIMP OnStartBinding(
  339.             /* [in] */ DWORD grfBSCOption,
  340.             /* [in] */ IBinding *pib);
  341.         virtual STDMETHODIMP GetPriority(
  342.             /* [out] */ LONG *pnPriority);
  343.         virtual STDMETHODIMP OnLowResource(
  344.             /* [in] */ DWORD reserved);
  345.         virtual STDMETHODIMP OnProgress(
  346.             /* [in] */ ULONG ulProgress,
  347.             /* [in] */ ULONG ulProgressMax,
  348.             /* [in] */ ULONG ulStatusCode,
  349.             /* [in] */ LPCWSTR szStatusText);
  350.         virtual STDMETHODIMP OnStopBinding(
  351.             /* [in] */ HRESULT hresult,
  352.             /* [in] */ LPCWSTR szError);
  353.         virtual STDMETHODIMP GetBindInfo(
  354.             /* [out] */ DWORD *grfBINDINFOF,
  355.             /* [unique][out][in] */ BINDINFO *pbindinfo);
  356.         virtual STDMETHODIMP OnDataAvailable(
  357.             /* [in] */ DWORD grfBSCF,
  358.             /* [in] */ DWORD dwSize,
  359.             /* [in] */ FORMATETC *pformatetc,
  360.             /* [in] */ STGMEDIUM *pstgmed);
  361.         virtual STDMETHODIMP OnObjectAvailable(
  362.             /* [in] */ REFIID riid,
  363.             /* [iid_is][in] */ IUnknown *punk);
  364.     };
  365.     
  366.     friend class CBindStatusCallback;
  367.     CBindStatusCallback _bsc;
  368. //
  369. // External views stuff
  370. //
  371. // We have DocObject extensions and IShellView extensions
  372. // A (DocObject) extension can
  373. public:
  374.     HRESULT InitObj(IUnknown* pObj, LPCITEMIDLIST pidlHere, int iView);
  375.     HRESULT _DefaultGetExtViews(SHELLVIEWID * pvid, IEnumSFVViews ** ppev);
  376.     void GetExtViews(BOOL bForce=FALSE);
  377.     void MergeExtViewsMenu(HMENU hmenuView, CDefView * pdsv);
  378.     BOOL _StringFromView(int uView, LPTSTR pszString, UINT cb, UINT idString);
  379.     BOOL _StringFromViewID(SHELLVIEWID const *pvid, LPTSTR pszString, UINT cb, UINT idString);
  380.     BOOL _ColorFromView(int uView, COLORREF * pcr, int crid);
  381.     BOOL _ColorFromViewID(SHELLVIEWID const *pvid, COLORREF * pcr, int crid);
  382.     HRESULT ShowExtView(int uView, BOOL bForce);
  383.     HRESULT ShowExtView(SHELLVIEWID const *pvid, BOOL bForce);
  384.     int CmdIdFromUid(int uid);
  385.     int CurExtViewId()   // only works for docobj extended views.
  386.     {
  387.         if(m_uActiveExtendedView >= 0)
  388.             return CmdIdFromUid(m_uActiveExtendedView);
  389.         else
  390.         {
  391.             if(m_pOleObjNew)
  392.             return CmdIdFromUid(m_uViewNew);
  393.             else
  394.                 return(-1);
  395.         }
  396.     }
  397.     UINT UidFromCmdId(UINT cmdid) 
  398.     { 
  399.         ASSERT((cmdid >= SFVIDM_VIEW_EXTFIRST) &&
  400.                ((cmdid - SFVIDM_VIEW_EXTFIRST) < (UINT) ARRAYSIZE(m_mpCmdIdToUid)));
  401.         ASSERT(m_mpCmdIdToUid[cmdid - SFVIDM_VIEW_EXTFIRST] != -1)
  402.         return (m_mpCmdIdToUid[cmdid - SFVIDM_VIEW_EXTFIRST]);
  403.     };
  404.     // IsWebView - if the current view is undefined, then we've never
  405.     // switched into an extended view (ie, the window was just created), so
  406.     // check the pending view.  (If the default is non web view, then there's no
  407.     // pending view (it will be NOEXTVIEW) so we correctly return FALSE in that case.)
  408.     //
  409.     // NOTE: this used to be IsExtendedView, since we generically support all doc-object
  410.     // type extended views, but this is only used for Web View, and in NT5 we specifically
  411.     // limited the doc-object support to VID_WebView, so I renamed this for clarity...
  412.     //
  413.     BOOL IsWebView(void) { return (UNDEFINEDVIEW == m_uActiveExtendedView ? m_uViewNew != NOEXTVIEW : m_uActiveExtendedView != NOEXTVIEW); }
  414.     BOOL IsSFVExtension(void) { return (NULL != m_pActiveSVExt); }
  415.     HRESULT _HasFocusIO();
  416.     HRESULT _UIActivateIO(BOOL fActivate, MSG *pMsg);
  417.     int  GetViewIdFromGUID(SHELLVIEWID const *pvid, SFVVIEWSDATA** ppItem = NULL);
  418.     HWND GetExtendedViewWindow();
  419.     // query if the view requires delegation
  420.     IShellFolderView * GetExtendedISFV( void ) { return m_pActiveSFV; }
  421.     IShellView2 * GetExtendedISV( void ) { return m_pActiveSVExt; }
  422.     BOOL IsExtendedSFVModal();
  423.     HRESULT SFVAutoAutoArrange( DWORD dwReserved);
  424.     void KillActiveSFV(void);
  425.     BOOL _IsHoster(int uView);
  426.     HRESULT SetViewWindowStyle(DWORD dwBits, DWORD dwVal);
  427.     HRESULT SetRect(LPRECT prc);
  428.     HRESULT GetView(SHELLVIEWID* pvid, ULONG uView);
  429.     HRESULT GetCurrentExtView(SHELLVIEWID* pvid);
  430.     HRESULT GetCommandTarget(IOleCommandTarget** ppct);
  431.     // allow the frame to handle the choice on delegation on translate accelerator...
  432.     HRESULT OnTranslateAccelerator(LPMSG pmsg, BOOL* pbTabOffLastTridentStop);
  433.     HRESULT _SetDesktopListViewIconTextColors(BOOL fNotify);    // used in defview.cpp
  434. private:
  435.     CViewsList m_lViews;
  436.     BOOL m_bGotViews;
  437.     BOOL m_bEnableStandardViews;
  438.     TCHAR m_szWebViewKeyName[MAX_PATH];
  439.     int m_uView;                      // these are the sfvextension views.
  440.     int m_uActiveExtendedView;       // toggleable view on???
  441.     UINT m_cSFVExt;
  442.     UINT m_uState:2;                // SVUIA_* for m_pOleObj (extended view)
  443.     IOleObject* m_pOleObj;
  444.     IOleDocumentView* m_pDocView;
  445.     IOleInPlaceActiveObject* m_pActive;
  446.     IViewObject *m_pvoActive;
  447.     // for now, assume only one view-ext, later on, need to keep alive them all...
  448.     IShellView2 * m_pActiveSVExt;
  449.     // the IShellfolderView that must be delegated to....
  450.     IShellFolderView * m_pActiveSFV;
  451.     // Implemented by thumbnail
  452.     IDefViewExtInit2* m_pDefViewExtInit2;
  453.     HWND m_hActiveSVExtHwnd;
  454.     friend LRESULT CALLBACK DefView_WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam);
  455.     friend void DefView_SetFocus(CDefView * pdsv);
  456.     void _CleanUpOleObj(IOleObject* pOleObj);
  457.     void _CleanUpOleObjAndDt(IOleObject* pOleObj);
  458.     void _CleanupNewOleObj();
  459.     void _CleanupOldDocObject( void );
  460.     HRESULT _ShowExtView_Helper(IOleObject* pOleObj, int uView);
  461.     HRESULT _CreateNewOleObj(IOleObject **ppOleObj, int uView);
  462.     HRESULT _SwitchToNewOleObj();
  463.     HRESULT _UpdateZonesStatusPane(IOleObject *pOleObj);
  464.     //Fields that store details about the new OLE object while we wait for
  465.     //it to reach a READYSTATE_INTERACTIVE.
  466.     IOleObject* m_pOleObjNew;
  467.     int      m_uViewNew;
  468.     BOOL m_fSwitchedToNewOleObj:1;
  469.     int m_mpCmdIdToUid[MAX_EXT_VIEWS];    // map command id's to view list id's
  470.     BOOL _SetupReadyStateNotifyCapability();
  471.     BOOL _RemoveReadyStateNotifyCapability();
  472.     DWORD    m_dwConnectionCookie;
  473.     BOOL     m_fReadyStateInteractiveProcessed;
  474.     BOOL     m_fReadyStateComplete;
  475.     IOleObject* m_pOleObjReadyState;
  476. } ;
  477. class CCallback
  478. {
  479. public:
  480.     CCallback(IShellFolderViewCB* psfvcb) : m_psfvcb(psfvcb)
  481.     {
  482.         if (m_psfvcb)
  483.             m_psfvcb->AddRef();
  484.     }
  485.     ~CCallback()
  486.     {
  487.         if (m_psfvcb)
  488.             m_psfvcb->Release();
  489.     }
  490.     IShellFolderViewCB *GetSFVCB() { return m_psfvcb; }
  491.     HRESULT SetCallback(IShellFolderViewCB* pNewCB, IShellFolderViewCB** ppOldCB)
  492.     {
  493.         // We Release the callback for us, and then AddRef it for the caller who now
  494.         // owns the object, which does nothing
  495.         *ppOldCB = m_psfvcb;
  496.         m_psfvcb = pNewCB;
  497.         if (pNewCB)
  498.             pNewCB->AddRef();
  499.         return NOERROR;
  500.     }
  501.     HRESULT CallCB(UINT uMsg, WPARAM wParam, LPARAM lParam)
  502.     {
  503.         return m_psfvcb ? m_psfvcb->MessageSFVCB(uMsg, wParam, lParam) : E_NOTIMPL;
  504.     }
  505.     BOOL HasCB() { return m_psfvcb != NULL; }
  506. private:
  507.     IShellFolderViewCB* m_psfvcb;
  508. } ;
  509. // class used to provide the background context menu in defview extensions
  510. HRESULT CBackgrndMenu_CreateInstance( CDefView * pDefView, REFIID riid, void ** ppvObj );
  511. class CBackgrndMenu : public IContextMenu3,
  512.                       public IObjectWithSite
  513. {
  514.     public:
  515.         friend HRESULT CBackgrndMenu_CreateInstance( CDefView * pDefView, REFIID riid, void ** ppvObj );
  516.         STDMETHOD ( QueryInterface ) ( REFIID riid, void ** ppvObj );
  517.         STDMETHOD_( ULONG, AddRef ) ( void );
  518.         STDMETHOD_( ULONG, Release ) ( void );
  519.         STDMETHOD(QueryContextMenu)( HMENU hmenu, UINT indexMenu,
  520.                                      UINT idCmdFirst, UINT idCmdLast,
  521.                                      UINT uFlags);
  522.         STDMETHOD(InvokeCommand)( LPCMINVOKECOMMANDINFO lpici );
  523.         STDMETHOD(GetCommandString)( UINT_PTR idCmd, UINT uType,
  524.                                      UINT * pwReserved, LPSTR pszName,
  525.                                      UINT cchMax);
  526.         STDMETHOD(HandleMenuMsg)( UINT uMsg,
  527.                                   WPARAM wParam,
  528.                                   LPARAM lParam);
  529.         STDMETHOD(HandleMenuMsg2)( UINT uMsg,
  530.                                   WPARAM wParam,
  531.                                   LPARAM lParam,
  532.                                   LRESULT* plResult);
  533.         STDMETHOD(SetSite)(IUnknown*);
  534.         STDMETHOD(GetSite)(REFIID,void**);
  535.     protected:
  536.         CBackgrndMenu( CDefView * pDefView, HRESULT * pHr );
  537.         ~CBackgrndMenu();
  538.         CDefView * m_pDefView;
  539.         LONG m_cRef;
  540.         IContextMenu * m_pFolderMenu;
  541.         IContextMenu * m_pcmSel;
  542.         IUnknown* m_powsSite;
  543.         BOOL m_fFlush : 1;
  544.         BOOL m_fpcmSelAlreadyThere : 1;
  545. };
  546. // Variable Column stuff
  547. typedef struct
  548. {
  549.     TCHAR szName[MAX_COLUMN_NAME_LEN];
  550.     DWORD cChars;   // number of characters wide for default
  551.     DWORD fmt;
  552.     DWORD csFlags;  // SHCOLSTATE flags
  553. } COL_INFO;
  554. //Possible values for m_iCustomizable
  555. #define YES_CUSTOMIZABLE                1
  556. #define DONTKNOW_IF_CUSTOMIZABLE        0
  557. #define MAYBE_CUSTOMIZABLE             -1 //It is a filesystem folder
  558. #define NOT_CUSTOMIZABLE               -2
  559. // For communicating with the background property extractor
  560. class CBackgroundColInfo
  561. {
  562.     private:
  563.         CBackgroundColInfo (void);
  564.     public:
  565.         CBackgroundColInfo (LPCITEMIDLIST pidl, UINT uiCol, STRRET& strRet);
  566.         ~CBackgroundColInfo (void);
  567.         LPCITEMIDLIST   GetPIDL (void)      const   {   return(_pidl);          }
  568.         UINT            GetColumn (void)    const   {   return(_uiCol);         }
  569.         LPCTSTR         GetText (void)      const   {   return(&_szText[0]);    }
  570.     private:
  571.         const LPCITEMIDLIST     _pidl;
  572.         const UINT              _uiCol;
  573.               TCHAR             _szText[MAX_COLUMN_NAME_LEN];
  574. };
  575. #define CGID_DefViewFrame2   IID_IDefViewFrame2
  576. //
  577. // Class definition of CDefView
  578. //
  579. class CDefView : // dsv
  580.     public IShellView2,
  581.     public IShellFolderView,
  582.     public IOleCommandTarget, // so psb can talk to extended views
  583.     public IDropTarget,
  584.     public IViewObject,
  585.     public IDefViewFrame2,
  586.     public IServiceProvider,
  587.     public IDocViewSite,
  588.     public IInternetSecurityMgrSite
  589.     {
  590. public:
  591.     CDefView(LPSHELLFOLDER pshf, IShellFolderViewCB* psfvcb, IShellView* psvOuter);
  592.     // *** IUnknown methods ***
  593.     STDMETHOD(QueryInterface)(REFIID riid, void **ppv);
  594.     STDMETHOD_(ULONG,AddRef)(THIS);
  595.     STDMETHOD_(ULONG,Release)(THIS);
  596.     // IShellView
  597.     STDMETHODIMP GetWindow(HWND *phwnd);
  598.     STDMETHODIMP ContextSensitiveHelp(BOOL fEnterMode);
  599.     STDMETHODIMP EnableModeless(BOOL fEnable);
  600.     STDMETHODIMP Refresh();
  601.     STDMETHODIMP CreateViewWindow(IShellView *lpPrevView,
  602.         LPCFOLDERSETTINGS lpfs, IShellBrowser *psb, RECT *prc, HWND *phWnd);
  603.     STDMETHODIMP DestroyViewWindow();
  604.     STDMETHODIMP UIActivate(UINT uState);
  605.     STDMETHODIMP GetCurrentInfo(LPFOLDERSETTINGS lpfs);
  606.     STDMETHODIMP TranslateAccelerator(LPMSG pmsg);
  607.     STDMETHODIMP AddPropertySheetPages(DWORD dwReserved, LPFNADDPROPSHEETPAGE lpfn, LPARAM lparam);
  608.     STDMETHODIMP SaveViewState();
  609.     STDMETHODIMP SelectItem(LPCITEMIDLIST pidlItem, UINT uFlags);
  610.     STDMETHODIMP GetItemObject(UINT uItem, REFIID riid, void **ppv);
  611.     // IShellView2
  612.     STDMETHOD(GetView)(SHELLVIEWID* pvid, ULONG uView);
  613.     STDMETHOD(CreateViewWindow2)(LPSV2CVW2_PARAMS pParams);
  614.     STDMETHOD(HandleRename)(LPCITEMIDLIST pidl);
  615.     STDMETHOD(SelectAndPositionItem)(LPCITEMIDLIST pidlItem, UINT uFlags, POINT *ppt);
  616.     // *** IShellFolderView methods ***
  617.     STDMETHOD(Rearrange) (LPARAM lParamSort);
  618.     STDMETHOD(GetArrangeParam) (LPARAM *plParamSort);
  619.     STDMETHOD(ArrangeGrid) (THIS);
  620.     STDMETHOD(AutoArrange) (THIS);
  621.     STDMETHOD(GetAutoArrange) (THIS);
  622.     STDMETHOD(AddObject) (LPITEMIDLIST pidl, UINT *puItem);
  623.     STDMETHOD(GetObject) (LPITEMIDLIST *ppidl, UINT uItem);
  624.     STDMETHOD(RemoveObject) (LPITEMIDLIST pidl, UINT *puItem);
  625.     STDMETHOD(GetObjectCount) (UINT *puCount);
  626.     STDMETHOD(SetObjectCount) (UINT uCount, UINT dwFlags);
  627.     STDMETHOD(UpdateObject) (LPITEMIDLIST pidlOld, LPITEMIDLIST pidlNew,
  628.         UINT *puItem);
  629.     STDMETHOD(RefreshObject) (LPITEMIDLIST pidl, UINT *puItem);
  630.     STDMETHOD(SetRedraw) (BOOL bRedraw);
  631.     STDMETHOD(GetSelectedCount) (UINT *puSelected);
  632.     STDMETHOD(GetSelectedObjects) (LPCITEMIDLIST **pppidl, UINT *puItems);
  633.     STDMETHOD(IsDropOnSource) (IDropTarget *pDropTarget);
  634.     STDMETHOD(GetDragPoint) (POINT *ppt);
  635.     STDMETHOD(GetDropPoint) (POINT *ppt);
  636.     STDMETHOD(MoveIcons) (IDataObject *pDataObject);
  637.     STDMETHOD(SetItemPos) (LPCITEMIDLIST pidl, POINT *ppt);
  638.     STDMETHOD(IsBkDropTarget) (IDropTarget *pDropTarget);
  639.     STDMETHOD(SetClipboard) (BOOL bMove);
  640.     STDMETHOD(SetPoints) (IDataObject *pDataObject);
  641.     STDMETHOD(GetItemSpacing) (ITEMSPACING *pSpacing);
  642.     STDMETHOD(SetCallback) (IShellFolderViewCB* pNewCB,
  643.         IShellFolderViewCB** ppOldCB);
  644.     STDMETHOD(Select) (UINT dwFlags );
  645.     STDMETHOD(QuerySupport) (UINT * pdwSupport );
  646.     STDMETHOD(SetAutomationObject) (IDispatch *pdisp);
  647.     // IOleCommandTarget
  648.     STDMETHODIMP QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD rgCmds[], OLECMDTEXT *pcmdtext);
  649.     STDMETHODIMP Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANTARG *pvarargIn, VARIANTARG *pvarargOut);
  650.     // IDropTarget
  651.     STDMETHODIMP DragEnter(IDataObject *pdtobj, DWORD grfKeyState, POINTL ptl, DWORD *pdwEffect)
  652.         { return _dvdt.DragEnter(pdtobj, grfKeyState, ptl, pdwEffect); }
  653.     STDMETHODIMP DragOver(DWORD grfKeyState, POINTL ptl, DWORD *pdwEffect)
  654.         { return _dvdt.DragOver(grfKeyState, ptl, pdwEffect); }
  655.     STDMETHODIMP DragLeave()
  656.         { return _dvdt.DragLeave(); }
  657.     STDMETHODIMP Drop(IDataObject *pdtobj,
  658.                     DWORD grfKeyState, POINTL pt, DWORD *pdwEffect)
  659.         { return _dvdt.Drop(pdtobj, grfKeyState, pt, pdwEffect); }
  660.     // IViewObject
  661.     STDMETHODIMP Draw(DWORD, LONG, void *, DVTARGETDEVICE *, HDC, HDC,
  662.         const RECTL *, const RECTL *, int (*)(ULONG_PTR), ULONG_PTR);
  663.     STDMETHODIMP GetColorSet(DWORD, LONG, void *, DVTARGETDEVICE *, HDC,
  664.         LOGPALETTE **);
  665.     STDMETHODIMP Freeze(DWORD, LONG, void *, DWORD *);
  666.     STDMETHODIMP Unfreeze(DWORD);
  667.     STDMETHODIMP SetAdvise(DWORD, DWORD, IAdviseSink *);
  668.     STDMETHODIMP GetAdvise(DWORD *, DWORD *, IAdviseSink **);
  669.     // IDefViewFrame
  670.     STDMETHODIMP GetWindowLV(HWND * phwnd);
  671.     STDMETHODIMP ReleaseWindowLV(void);
  672.     STDMETHODIMP GetShellFolder(IShellFolder **ppsf);
  673.     // IDefViewFrame2
  674.     STDMETHODIMP GetWindowLV2(HWND * phwnd, IUnknown * punk);
  675.     STDMETHODIMP AutoAutoArrange(DWORD dwReserved);
  676.     // IServiceProvider
  677.     STDMETHODIMP  QueryService(REFGUID guidService, REFIID riid, void **ppvObject);
  678.     // *** IDocViewSite methods ***
  679.     STDMETHOD(OnSetTitle) (VARIANTARG *pvTitle);
  680.     HRESULT InitializeVariableColumns(DWORD *pdwColList);
  681.     BOOL IsColumnHidden(UINT uCol);
  682.     BOOL IsColumnOn(UINT uCol);
  683.     HRESULT AddColumnsToMenu(HMENU hm, DWORD dwBase);
  684.     HRESULT SetColumnState(UINT uCol, DWORD dwMask, DWORD dwState);
  685.     HRESULT MapRealToVisibleColumn(UINT uRealCol, UINT *puVisCol);
  686.     HRESULT MapVisibleToRealColumn(UINT uVisCol, UINT *puReal);
  687.     UINT GetMaxColumns();
  688.     // handle messages
  689.     LRESULT _OnCreate(HWND hWnd);
  690.     LRESULT _OnNotify(NMHDR *pnm);
  691.     LRESULT _TBNotify(NMHDR *pnm);
  692.     LRESULT _OnLVNotify(NM_LISTVIEW *plvn);
  693.     LRESULT _OnBeginDrag(NM_LISTVIEW * lpnm);
  694.     int _FindItem(LPCITEMIDLIST pidl, LPITEMIDLIST *ppidlFound, BOOL fSamePtr);
  695.     int _UpdateObject(LPITEMIDLIST *ppidl, BOOL bCopy = FALSE);
  696.     void _FilterDPAs(HDPA hdpa, HDPA hdpaOld);
  697.     int _RefreshObject(LPITEMIDLIST *ppidl);
  698.     int _RemoveObject(LPCITEMIDLIST pidl, BOOL fSamePtr);
  699.     BOOL _GetItemPosition(LPCITEMIDLIST pidl, POINT *ppt);
  700.     void _OnGetInfoTip(NMLVGETINFOTIP *plvn);
  701.     void _OnRename(LPCITEMIDLIST* ppidl);
  702.     LPITEMIDLIST _ObjectExists(LPCITEMIDLIST pidl);
  703.     UINT _GetExplorerFlag();
  704.     // private stuff
  705.     void PropagateOnViewChange(DWORD dwAspect, LONG lindex);
  706.     void PropagateOnClose();
  707.     BOOL OnActivate(UINT uState);
  708.     BOOL OnDeactivate();
  709.     void SwapWindow(void);
  710.     BOOL HasCurrentViewWindowFocus();
  711.     HWND ViewWindowSetFocus();
  712.     BOOL _IsReportView();
  713.     
  714.     inline BOOL _IsOwnerData() { return _fs.fFlags & FWF_OWNERDATA; }
  715.     inline BOOL _IsDesktop()   { return _fs.fFlags & FWF_DESKTOP; }
  716.     int CheckCurrentViewMenuItem(HMENU hmenu);
  717.     void InitViewMenu(HMENU hmInit);
  718.     void CheckToolbar();
  719.     void OnListViewDelete(int iItem, LPITEMIDLIST pidl);
  720.     void HandleKeyDown(LV_KEYDOWN *lpnmhdr);
  721.     BOOL SaveCols(LPSTREAM pstm);
  722.     HRESULT SavePos(LPSTREAM pstm);
  723.     void AddColumns();
  724.     void _ShowControl(UINT uControl, int idCmd);
  725.     LRESULT OnInitMenuPopup(HMENU hmInit, int nIndex, BOOL fSystemMenu);
  726.     void _SetUpMenus(UINT uState);
  727.     void SelectSelectedItems();
  728.     inline BOOL _fDeferSelect() {return 
  729.         (this->_hwndStatic || !_HasNormalView() || (_uState == SVUIA_DEACTIVATE) || 
  730.                 (m_cFrame.m_dwConnectionCookie /*&& !m_cFrame.m_fReadyStateInteractiveProcessed*/ ));}
  731.     inline BOOL _fItemsDeferred() { return _hdsaSelect != NULL; }
  732.     void _ClearSelectList();
  733.     void DropFiles(HDROP hdrop);
  734.     LRESULT OldDragMsgs(UINT uMsg, WPARAM wParam, const DROPSTRUCT * lpds);
  735.     void AddCopyHook();
  736.     int FindCopyHook(BOOL fRemoveInvalid);
  737.     void RemoveCopyHook();
  738.     void ContextMenu(DWORD dwPos);
  739.     LPITEMIDLIST _GetViewPidl(); // return copy of pidl of folder we're viewing
  740.     BOOL _IsViewDesktop();
  741.     BOOL _GetPath(LPTSTR pszPath);
  742.     HRESULT _GetNameAndFlags(UINT gdnFlags, LPTSTR psz, UINT cch, DWORD *pdwFlags);
  743.     int _CheckIfCustomizable();
  744.     LRESULT SwitchToHyperText(UINT uID, BOOL fForce);
  745.     LRESULT Command(IContextMenu *pcmSel, WPARAM wParam, LPARAM lParam);
  746.     LRESULT WndSize(HWND hWnd);
  747.     BOOL EnumerationTimeout(BOOL bRefresh);
  748.     void _ShowListviewIcons();
  749.     void _OnMenuTermination();
  750.     void FillDone(HDPA hdpaNew,
  751.         PDVSAVEHEADER pSaveHeader, UINT uLen, BOOL bRefresh, BOOL fInteractive);
  752.     void OnLVSelectionChange(NM_LISTVIEW *plvn);
  753.     void RegisterSFVEvents(IUnknown * pTarget, BOOL fConnect);
  754.     HRESULT FillObjects(BOOL bRefresh,
  755.         PDVSAVEHEADER pSaveHeader, UINT uLen, BOOL fInteractive);
  756.     HRESULT FillObjectsShowHide(BOOL bRefresh,
  757.         PDVSAVEHEADER pSaveHeader, UINT uLen, BOOL fInteractive);
  758.     HRESULT _GetDetailsHelper(int i, DETAILSINFO *pdi);
  759.     HRESULT CallCB(UINT uMsg, WPARAM wParam, LPARAM lParam);
  760.     BOOL HasCB() {return(m_cCallback.HasCB());}
  761.     HRESULT NotifyAutomation(DISPID dispid);
  762.     void CheckIfSelectedAndNotifyAutomation(LPCITEMIDLIST pidl, int iItem);
  763.     HRESULT _ReloadListviewContent();
  764.     HRESULT ReloadContent(BOOL fForce = FALSE);
  765.     BOOL _HasNormalView()
  766.         { return(!m_cFrame.IsWebView() || _fGetWindowLV || _fCombinedView); }
  767.     HRESULT _SwitchToViewIDPVID(UINT uID, SHELLVIEWID const *pvid, BOOL bForce);
  768.     HRESULT _SwitchToViewID(UINT uID, BOOL bForce)
  769.         { return(_SwitchToViewIDPVID(uID, NULL, bForce)); }
  770.     HRESULT _SwitchToViewPVID(SHELLVIEWID const *pvid, BOOL bForce)
  771.         { return(_SwitchToViewIDPVID(0, pvid, bForce)); }
  772.     HRESULT _SwitchToViewFVM(UINT fvmNew, DWORD dwStyle, BOOL fForce);
  773.     void _UpdateListviewColors(BOOL fClassic);
  774.     LRESULT _SwitchDesktopHTML(BOOL fOn, BOOL fForce);
  775.     void InitSelectionMode();
  776.     void UpdateSelectionMode();
  777.     void _OnMoveWindowToTop(HWND hwnd);
  778.     HWND GetChildViewWindow();
  779.     BOOL _InvokeCustomWizard();
  780.     HRESULT _OnViewWindowActive();
  781.     void _UpdateRegFlags();
  782.     BOOL _CheckSingleClickDialog(void);
  783.     void _DoColumnsMenu(int x, int y);
  784.     BOOL _HandleColumnToggle(UINT uCol, BOOL bRefresh);
  785.     void _SameViewMoveIcons();
  786.     void _PostSelChangedMessage();
  787.     HRESULT _GetIPersistHistoryObject(IPersistHistory **ppph);
  788.     BOOL _ShouldEnableButton(UINT uiCmd, DWORD dwAttr, int iIndex);
  789.     void _EnableDisableTBButtons();
  790.     HRESULT _SaveViewState(IStream *pstm);
  791.     HRESULT _GetStorageStream(DWORD grfMode, IStream* *ppIStream);
  792.     HRESULT _SaveGlobalViewState(void);
  793.     HRESULT _LoadGlobalViewState(IStream* *ppIStream);
  794.     HRESULT _ResetGlobalViewState(void);
  795.     LPITEMIDLIST _GetPIDL(int i);
  796.     BOOL _IsGhosted(LPCITEMIDLIST pidl);
  797.     void _RestoreAllGhostedFileView();
  798.     BOOL _CanShowWebView();
  799.     LONG                    _cRef;
  800.     SHELLVIEWID const       *_pvidPending;
  801.     CDVDropTarget           _dvdt;
  802.     IShellView *            _psvOuter;       // May be NULL
  803.     IShellFolder            *_pshf;
  804.     IShellFolder2           *_pshf2;
  805.     IShellBrowser           *_psb;
  806.     ICommDlgBrowser         *_pcdb;          // extended ICommDlgBrowser
  807.     FOLDERSETTINGS          _fs;
  808.     IContextMenu            *_pcmSel;       // pcm for selected objects.
  809.     IContextMenu            *_pcmBackground;
  810.     DWORD                   _dwAttrSel;      // dwAttrs for selected objects
  811.     IShellIcon *            _psi;            // for getting icon fast
  812.     IShellIconOverlay *     _psio;           // For getting iconOverlay fast
  813.     CLSID                   _clsid;         // the clsid of this pshf;
  814.     
  815.     HWND                    _hwndMain;
  816.     HWND                    _hwndView;
  817.     HWND                    _hwndListview;
  818.     HWND                    _hwndStatic;
  819.     HACCEL                  _hAccel;
  820.     int                     _fmt;
  821. #ifdef DEBUG
  822.     HRESULT                 _hres;           // Enum result, used for tracemsgs
  823. #endif
  824.     UINT                    _uState;         // SVUIA_*
  825.     HMENU                   _hmenuCur;
  826.     ULONG                   _uRegister;
  827.     POINT                   _ptDrop;
  828.     POINT                   _ptDragAnchor;   // start of the drag
  829.     int                     _itemCur;        // The current item in the drop target
  830.     IDataObject             *_pdtobjHdrop;   // for 3.1 HDROP drag/drop
  831.     IDropTarget             *_pdtgtBack;     // of the background (shell folder)
  832.     IShellDetails          *_psd;
  833.     // Officially, _pdr should be an IDelayedRelease interface, but it
  834.     // only has IUnknown member functions, so why bother?
  835.     IUnknown                *_pdr;
  836.     UINT                    _cxChar;
  837.     LPCITEMIDLIST           _pidlMonitor;
  838.     LONG                    _lFSEvents;
  839.     DVSAVESTATE             _dvState;
  840.     PDVSAVEHEADER           _pSaveHeader;
  841.     UINT                    _uSaveHeaderLen;
  842.     TBBUTTON*               _pbtn;
  843.     int                     _cButtons;          // count of buttons that are showing by default
  844.     int                     _cTotalButtons;     // count of buttons including those hidden by default
  845.     IShellTaskScheduler   * _pScheduler;
  846.     LONG                    _cRefForIdle;    // did idle thread forget
  847.                                             // to release this
  848.     BITBOOL     _bDragSource:1;
  849.     BITBOOL     _bDropAnchor:1;
  850.     BITBOOL     _bItemsMoved:1;
  851.     BITBOOL     _bClearItemPos:1;
  852.     BITBOOL     _bHaveCutStuff:1;
  853.     BITBOOL     _bClipViewer:1;
  854.     BITBOOL     _fShowAllObjects:1;
  855.     BITBOOL     _fInLabelEdit:1;
  856.     BITBOOL     _fDisabled:1;
  857.     BITBOOL     _bUpdatePending:1;
  858.     BITBOOL     _bUpdatePendingPending:1;
  859.     BITBOOL     _bBkFilling:1;
  860.     BITBOOL     _bContextMenuMode:1;
  861.     BITBOOL     _bMouseMenu:1;
  862.     BITBOOL     _fHasDeskWallPaper:1;
  863.     BITBOOL     _fShowCompColor:1;
  864.     BITBOOL     _bRegisteredDragDrop:1;
  865.     BITBOOL     _fEnumFailed:1;    // TRUE if enum failed.
  866.     BITBOOL     _fGetWindowLV:1;
  867.     BITBOOL     _fClassic:1; // SSF_WIN95CLASSIC setting/restriction
  868.     BITBOOL     _fCombinedView:1;   // Implies a regional listview layered on top of an extended view
  869.     BITBOOL     _fCycleFocus:1;     // 1=got callback to do CycleFocus
  870.     BITBOOL     _fSelectionChangePending:1;
  871.     BITBOOL     _fCanActivateNow:1; // FALSE from creation until we can be activated, TRUE implies we can SHDVID_CANACTIVATENOW
  872.     BITBOOL     _fShowListviewIconsOnActivate:1; // TRUE iff a _ShowListviewIcons() came in while 'invisible'
  873.     BITBOOL     _fWin95ViewState:1;    // TRUE iff Advanced option set to Win95 behavior
  874.     BITBOOL     _fDesktopModal:1;      // TRUE iff desktop is in modal state.
  875.     BITBOOL     _fDesktopRefreshPending:1; // TRUE iff a refresh of desktop was prevented because of modal state.
  876.     BITBOOL     _fRefreshBuffered:1;   // TRUE iff a buffered refresh is pending!
  877.     BITBOOL     _fHasListViewFocus:1;
  878.     BITBOOL     _bExtHasFocus:1;    //TRUE if SFV extension's state is SVUIA_ACTIVATE_FOCUS
  879.     BITBOOL     _fIsXV:1;           // extended shell view (thumbview) hosted in OC
  880.     BITBOOL     _bInSortCallBack:1;     // TRUE if defview should not start background task to get extended col data
  881.     BITBOOL     _bLoadedColumns:1;     // TRUE after we've loaded cols from the savestream. (after we're switched to details)
  882.     // Combined view colors that can be specified via registry or desktop.ini
  883.     BITBOOL     _fIsAsyncDefView:1; //TRUE if Defview is Asynchronous
  884.     BITBOOL     _bEmptyingScheduler : 1;  // used to stop re-entracny in the task scheduler..
  885.     BITBOOL     _bAutoSelChangeTimerSet:1;  // indicates if the timer to send the sel change notification to the automation obj is set
  886.     
  887.     COLORREF                _crCustomColors[CRID_COLORCOUNT];
  888.     // for single click activation
  889.     DWORD                   _dwSelectionMode;
  890.     HWND                    _hwndNextViewer;
  891.     LRESULT                 _iStdBMOffset;
  892.     LRESULT                 _iViewBMOffset;
  893.     CCallback               m_cCallback;    // Optional client callback
  894.     HDSA                    _hdsaSelect;    // List of items that are selected.
  895.     int                     _iLastFind;
  896.     HANDLE                  _AsyncIconEvent;
  897.     long                    _AsyncIconCount;
  898.     ULONG                   _AsyncIconTime;
  899.     UINT                    _uDefToolbar;
  900.     CSFVFrame               m_cFrame;
  901.     ULONG                   _uCachedSelAttrs;
  902.     UINT                    _uCachedSelCount;
  903.     
  904.     class CColumnPointer *_pcp;
  905.     COL_INFO    *m_pColItems;
  906.     UINT        m_cColItems;
  907.     DWORD       m_dwConnectionCookie;
  908.     DWORD       _LastSortColType;   // used in sorting extended columns
  909. #ifdef DEBUG
  910.     TIMEVAR(_Update);
  911.     TIMEVAR(_Fill);
  912.     TIMEVAR(_GetIcon);
  913.     TIMEVAR(_GetName);
  914.     TIMEVAR(_FSNotify);
  915.     TIMEVAR(_AddObject);
  916.     TIMEVAR(_EnumNext);
  917.     TIMEVAR(_RestoreState);
  918.     TIMEVAR(_WMNotify);
  919.     TIMEVAR(_LVChanging);
  920.     TIMEVAR(_LVChanged);
  921.     TIMEVAR(_LVDelete);
  922.     TIMEVAR(_LVGetDispInfo);
  923. #endif
  924. public:     // TODO: Make this protected after we have finished converting the entire file.
  925.     BOOL IsSafeToDefaultVerb(void);
  926.     void _ProcessDblClick(LPNMITEMACTIVATE pnmia);
  927.     HRESULT _InvokeCommand(IContextMenu *pcm, CMINVOKECOMMANDINFOEX *pici);
  928.     void _FocusOnSomething(void);
  929.     void _UpdateIcon(CDVGetIconTask *paid);
  930.     void _UpdateColData(CBackgroundColInfo *pbgci);
  931.     void _UpdateOverlay(int iList, int iOverlay);
  932.     HRESULT _GetIconAsync(LPCITEMIDLIST pidl, int *piIcon, BOOL fCanWait);
  933.     HRESULT _GetOverlayIndexAsync(LPCITEMIDLIST pidl, int iList);
  934.     HRESULT EmptyBkgrndThread( BOOL fTerminate );
  935.     IContextMenu *_GetContextMenuFromSelection();
  936.     DWORD _GetNeededSecurityAction(void);
  937.     HRESULT _ZoneCheck(DWORD dwFlags, DWORD dwAllowAction);
  938.     void _ShowAndActivate();
  939. private:
  940.     ~CDefView();
  941.     void MergeViewMenu(HMENU hmenu, HMENU hmenuMerge);
  942.     void MergeToolBar(BOOL bCanRestore);
  943.     BOOL _MergeIExplorerToolbar(UINT cExtButtons);
  944.     void _CopyDefViewButton(PTBBUTTON ptbbDest, PTBBUTTON ptbbSrc);
  945.     int _GetButtons(PTBBUTTON* ppbtn, LPINT pcButtons, LPINT pcTotalButtons);
  946.     void _PostEnumDoneMessage();
  947.     void _SetCachedToolbarSelectionAttrs(ULONG dwAttrs);
  948.     BOOL _GetCachedToolbarSelectionAttrs(ULONG *pdwAttr);
  949.     LRESULT _OnFSNotify(LONG lNotification, LPCITEMIDLIST* ppidl);
  950.     BOOL _InternalRearrange(void);
  951.     BOOL _IsExtendedColumn(INT_PTR iReal, DWORD *pdwState);
  952.     void _RestoreState(PDVSAVEHEADER pInSaveHeader, UINT uLen);
  953.     BOOL _RestorePos(PDVSAVEHEADER pSaveHeader, UINT uLen);
  954.     UINT _GetBackgroundTaskCount(REFTASKOWNERID rtid);
  955.     void _SetSortArrows(void);
  956.     UINT _GetSaveHeader(PDVSAVEHEADER *ppSaveHeader);
  957.     PFNDPACOMPARE _GetCompareFunction(void);
  958.     void _GetSortDefaults(DVSAVESTATE *pSaveState);
  959.     static  int CALLBACK _CompareExact(void *p1, void *p2, LPARAM lParam);
  960.     static  int CALLBACK _Compare(void *p1, void *p2, LPARAM lParam);
  961.     static  int CALLBACK _CompareExtended(LPARAM dw1, LPARAM dw2, LPARAM lParam);
  962.     static  int CALLBACK _DVITEM_Compare(void *p1, void *p2, LPARAM lParam);
  963.     friend class CBackgrndMenu;
  964.     friend class CSFVSite;
  965.     friend class CSFVFrame;
  966.     friend class CDVBkgrndEnumTask;
  967.     
  968.     IWebViewOCWinMan    *_pocWinMan;
  969.     UINT                m_uCols;
  970.     IDispatch           *m_pauto;      // pointer to idispatch
  971.     BOOL     _fFileListEnumDone : 1;  // wait until the automation object is loaded, to notify it of DISPID_FILELISTENUMDONE
  972.     BOOL     _fEnumDoneNotified : 1;  // make sure that we don't notify DISPID_FILELISTENUMDONE more than once
  973.     // advisory connection
  974.     IAdviseSink *_padvise;
  975.     DWORD _advise_aspect;
  976.     DWORD _advise_advf;
  977.     // Is this folder customizable using a desktop.ini?
  978.     // In other words, is this folder in a write-able media AND either it 
  979.     // not have a desktop.ini OR if it is there, it is writeable!
  980.     int   m_iCustomizable;
  981.     friend LRESULT CALLBACK DefView_WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam);
  982.     friend DWORD DefView_GetAttributesFromSelection(CDefView * pdsv, DWORD dwAttrMask);
  983.     friend void ViewWindow_BestFit(CDefView * pdsv, BOOL bTimeout);
  984.     friend void DefView_InitSelectionMode(CDefView * pdsv);
  985.     friend void DefView_SetViewMode(CDefView * pdsv, UINT fvmNew, DWORD dwStyle);
  986.     friend void DefView_SetFocus(CDefView * pdsv);
  987.     friend void DV_GetMenuHelpText(CDefView * pdsv, UINT_PTR id, LPTSTR pszText, UINT cchText);
  988.     friend void DV_GetToolTipText(CDefView * pdsv, UINT_PTR id, LPTSTR pszText, UINT cchText);
  989.     friend void SetDefaultViewSettings(CDefView * pdsv);
  990.     friend void DV_PaintErrMsg(HWND hWnd, CDefView * pdsv);
  991.     friend void DV_PaintCombinedView(HWND hWnd, CDefView * pdsv);
  992. } ;
  993. void DV_UpdateStatusBar(CDefView *pdsv, BOOL fInitialize);
  994. typedef struct {
  995.     LPITEMIDLIST    pidl;
  996.     UINT            uFlagsSelect;
  997. } DVDelaySelItem;
  998. HRESULT CreateEnumCViewList(CViewsList *pViews, IEnumSFVViews **ppObj);
  999. // Compatibility with SFV_Message
  1000. class CBaseShellFolderViewCB : public IShellFolderViewCB, public CObjectWithSite
  1001. {
  1002. public:
  1003.     CBaseShellFolderViewCB(IUnknown *punkFolder, LPCITEMIDLIST pidl, LONG lEvents);
  1004.     STDMETHOD(RealMessage)(UINT uMsg, WPARAM wParam, LPARAM lParam) PURE;
  1005.     // IUnknown
  1006.     STDMETHOD(QueryInterface)(REFIID riid, void **ppv);
  1007.     STDMETHOD_(ULONG,AddRef)();
  1008.     STDMETHOD_(ULONG,Release)();
  1009.     // IShellFolderViewCB
  1010.     STDMETHODIMP MessageSFVCB(UINT uMsg, WPARAM wParam, LPARAM lParam);
  1011. protected:
  1012.     virtual ~CBaseShellFolderViewCB();
  1013.     HWND m_hwndMain;
  1014.     IShellFolder* m_pshf;
  1015. protected:
  1016.     LONG m_cRef;
  1017.     LPCITEMIDLIST m_pidl;
  1018.     LONG m_lEvents;
  1019. } ;
  1020. // Called CSHRegKey because ATL already has a class called CRegKey.
  1021. class CSHRegKey
  1022. {
  1023. public:
  1024.     CSHRegKey(HKEY hkParent, LPCTSTR pszSubKey, BOOL bCreate=FALSE)
  1025.     {
  1026.         DebugMsg(TF_LIFE, TEXT("ctor CSHRegKey(%s) %x"), pszSubKey, this);
  1027.         if ((bCreate ? RegCreateKey(hkParent, pszSubKey, &m_hk)
  1028.             : RegOpenKeyEx(hkParent, pszSubKey, 0, KEY_READ, &m_hk))!=ERROR_SUCCESS)
  1029.         {
  1030.             m_hk = NULL;
  1031.         }
  1032.     }
  1033.     CSHRegKey(HKEY hk) { DebugMsg(TF_LIFE, TEXT("ctor CSHRegKey %x"), this); m_hk=hk; }
  1034.     ~CSHRegKey()
  1035.     {
  1036.         DebugMsg(TF_LIFE, TEXT("dtor CSHRegKey %x"), this);
  1037.         if (m_hk) RegCloseKey(m_hk);
  1038.     }
  1039.     operator HKEY() const { return(m_hk); }
  1040.     operator !() const { return(m_hk==NULL); }
  1041.     HRESULT QueryValue(LPCTSTR szSub, LPTSTR pszVal, LONG cb)
  1042.         { return(SHRegQueryValue(m_hk, szSub, pszVal, &cb)); }
  1043.     HRESULT QueryValueEx(LPCTSTR szSub, LPBYTE pszVal, LONG cb)
  1044.         { return(SHQueryValueEx(m_hk, szSub, 0, NULL, pszVal, (LPDWORD)&cb)); }
  1045. private:
  1046.     HKEY m_hk;
  1047. };
  1048. #define HANDLE_SFVM_SUPPORTSIDENTITY(pv, wp, lP, fn) 
  1049.         ((fn)(pv))    /* Only 1 parameter */
  1050. // status bar helpers
  1051. STDAPI_(void) ResizeStatus(IUnknown *psite, UINT cx);
  1052. STDAPI_(void) InitializeStatus(IUnknown *psite);
  1053. STDAPI_(void) SetStatusText(IUnknown *psite, LPCTSTR *ppszText, int iStart, int iEnd);
  1054. #endif // _SFVIEWP_H_