SFVWND.H
//******************************************************************************************* 
// 
// Filename : SFVWnd.h 
// 
//Definitions of CListView, CSFViewDlg, CAccelerator, CSFView 
// 
// Copyright 1994 - 1998 Microsoft Corporation. All rights reserved 
// 
//******************************************************************************************* 
 
 
#ifndef _SFVWnd_H_ 
#define _SFVWnd_H_ 
 
#include "ThisDll.H" 
 
#include "SFView.H" 
 
#include "XIcon.H" 
#include "Dlg.H" 
#include "Unknown.H" 
 
#define IDC_ARRANGE_BY (FCIDM_SHVIEWFIRST + 0x100) 
#define MAX_COL 0x20 
 
#define SFV_CONTEXT_FIRST (FCIDM_SHVIEWFIRST + 0x1000) 
#define SFV_CONTEXT_LAST (FCIDM_SHVIEWFIRST + 0x2000) 
 
BOOL StrRetToStr(LPSTR szOut, UINT uszOut, LPSTRRET pStrRet, LPCITEMIDLIST pidl); 
 
class CListView 
{ 
public: 
CListView() {} 
~CListView() {} 
 
operator HWND() const {return(m_hwndList);} 
 
void Init(HWND hwndList, HWND hwndLB, UINT idiDef) 
{ 
m_hwndList = hwndList; 
 
m_cxi.Init(hwndLB, idiDef); 
 
ListView_SetImageList(hwndList, m_cxi.GetIML(TRUE), LVSIL_NORMAL); 
ListView_SetImageList(hwndList, m_cxi.GetIML(FALSE), LVSIL_SMALL); 
} 
 
int InsertItem(LV_ITEM *pItem) 
{ 
return(ListView_InsertItem(m_hwndList, pItem)); 
} 
 
void DeleteAllItems() {ListView_DeleteAllItems(m_hwndList);} 
 
enum 
{ 
AI_LARGE = CXIcon::AI_LARGE, 
AI_SMALL = CXIcon::AI_SMALL, 
} ; 
 
int GetIcon(IShellFolder *psf, LPCITEMIDLIST pidl) 
{ 
return(m_cxi.GetIcon(psf, pidl)); 
} 
 
private: 
HWND m_hwndList; 
CXIcon m_cxi; 
} ; 
 
 
class CSFViewDlg : public CDlg 
{ 
public: 
CSFViewDlg(class CSFView *psfv) : m_psfv(psfv), m_hrOLE(E_UNEXPECTED) 
{ 
m_hDlg = NULL; 
} 
~CSFViewDlg() {} 
 
operator HWND() const {return(m_hDlg);} 
 
int AddObject(LPCITEMIDLIST pidl); 
void DeleteAllItems() {m_cList.DeleteAllItems();} 
 
BOOL DestroyWindow() {BOOL bRet=::DestroyWindow(m_hDlg); m_hDlg = NULL; return(bRet);} 
 
void SetStyle(DWORD dwAdd, DWORD dwRemove) 
{ 
SetWindowLong(m_cList, GWL_STYLE, dwAdd | 
(GetWindowStyle(m_cList) & ~dwRemove)); 
} 
 
void SelAll() 
{ 
ListView_SetItemState(m_cList, -1, LVIS_SELECTED, LVIS_SELECTED); 
} 
 
void InvSel() 
{ 
int iItem = -1; 
while ((iItem=ListView_GetNextItem(m_cList, iItem, 0)) != -1) 
{ 
UINT flag; 
 
// flip the selection bit on each item 
flag = ListView_GetItemState(m_cList, iItem, LVIS_SELECTED); 
flag ^= LVNI_SELECTED; 
ListView_SetItemState(m_cList, iItem, flag, LVIS_SELECTED); 
} 
} 
 
UINT CharWidth(); 
 
BOOL GetColumn(int i, LV_COLUMN *pcol) {return(ListView_GetColumn(m_cList, i, pcol));} 
BOOL SetColumn(int i, LV_COLUMN *pcol) {return(ListView_SetColumn(m_cList, i, pcol));} 
UINT InsertColumn(int i, LV_COLUMN *pcol) {return(ListView_InsertColumn(m_cList, i, pcol));} 
 
void SortItems(PFNDPACOMPARE pfnCmp) {ListView_SortItems(m_cList, pfnCmp, m_psfv);} 
 
static BOOL IsMenuSeparator(HMENU hm, int i); 
 
HRESULT GetUIObjectFromItem(REFIID riid, LPVOID * ppv, UINT uItem); 
HRESULT GetAttributesFromItem(ULONG *pdwAttr, UINT uItem); 
 
BOOL OleInited() {return(SUCCEEDED(m_hrOLE));} 
 
private: 
virtual BOOL RealDlgProc(UINT uMsg, WPARAM wParam, LPARAM lParam); 
 
UINT GetItemPIDLS(LPCITEMIDLIST apidl[], UINT cItemMax, UINT uItem); 
HRESULT GetItemObjects(LPCITEMIDLIST **ppidl, UINT uItem); 
 
LPCITEMIDLIST GetPIDL(int iItem); 
 
void InitDialog(); 
LRESULT BeginDrag(); 
BOOL Notify(LPNMHDR pNotify); 
    void ContextMenu(DWORD dwPos, BOOL bDoDefault=FALSE); 
 
 
CListView m_cList; 
HRESULT m_hrOLE; 
 
class CSFView *m_psfv; 
} ; 
 
 
struct SFSTATE 
{ 
LPARAM lParamSort; 
} ; 
 
 
class CAccelerator 
{ 
public: 
CAccelerator(UINT uID) 
{ 
m_hAccel = LoadAccelerators(g_ThisDll.GetInstance(), MAKEINTRESOURCE(uID)); 
} 
 
int TranslateAccelerator(HWND hwnd, LPMSG pmsg) 
{ 
if (!m_hAccel) 
{ 
return(FALSE); 
} 
 
return(::TranslateAccelerator(hwnd, m_hAccel, pmsg)); 
} 
 
private: 
HACCEL m_hAccel; 
} ; 
 
// 
// CSFView - IShellView implementation 
// 
 
class CSFView : public CUnknown, public IShellView 
{ 
public: 
CSFView(LPSHELLFOLDER psf, IShellFolderViewCallback *psfvcb); 
virtual ~CSFView(); 
 
STDMETHODIMP QueryInterface(REFIID riid, LPVOID * ppvObj); 
STDMETHODIMP_(ULONG) AddRef(); 
STDMETHODIMP_(ULONG) Release(); 
 
// *** IOleWindow methods *** 
STDMETHODIMP GetWindow(HWND * lphwnd); 
STDMETHODIMP ContextSensitiveHelp(BOOL fEnterMode); 
 
// *** IShellView methods *** 
STDMETHODIMP TranslateAccelerator(LPMSG lpmsg); 
STDMETHODIMP EnableModeless(BOOL fEnable); 
STDMETHODIMP UIActivate(UINT uState); 
STDMETHODIMP Refresh(); 
 
STDMETHODIMP CreateViewWindow(IShellView  *lpPrevView, 
                LPCFOLDERSETTINGS lpfs, IShellBrowser  * psb, 
                RECT * prcView, HWND  *phWnd); 
STDMETHODIMP DestroyViewWindow(); 
STDMETHODIMP GetCurrentInfo(LPFOLDERSETTINGS lpfs); 
STDMETHODIMP AddPropertySheetPages(DWORD dwReserved, 
                LPFNADDPROPSHEETPAGE lpfn, LPARAM lparam); 
STDMETHODIMP SaveViewState(); 
STDMETHODIMP SelectItem(LPCITEMIDLIST pidlItem, UINT uFlags); 
STDMETHODIMP GetItemObject(UINT uItem, REFIID riid, 
                LPVOID *ppv); 
 
private: 
static int CALLBACK CSFView::CompareIDs(LPVOID p1, LPVOID p2, LPARAM lParam); 
 
void AddColumns(); 
BOOL SaveColumns(LPSTREAM pstm); 
void RestoreColumns(LPSTREAM pstm, int nCols); 
void RestoreViewState(); 
 
void ColumnClick(int iCol) 
{ 
m_sfState.lParamSort = (LPARAM)DPA_GetPtr(m_aParamSort, iCol); 
        m_cView.SortItems(CompareIDs); 
} 
 
HRESULT CallCB(UINT uMsg, WPARAM wParam, LPARAM lParam) 
{ 
return(m_psfvcb ? m_psfvcb->Message(uMsg, wParam, lParam) : E_NOTIMPL); 
} 
 
int GetMenuIDFromViewMode(); 
BOOL IsInCommDlg() {return(m_pCDB != NULL);} 
HRESULT IncludeObject(LPCITEMIDLIST pidl) 
{ 
return(IsInCommDlg() ? m_pCDB->IncludeObject(this, pidl) : S_OK); 
} 
HRESULT OnDefaultCommand() 
{ 
return(IsInCommDlg() ? m_pCDB->OnDefaultCommand(this) : S_FALSE); 
} 
HRESULT OnStateChange(UINT uFlags) 
{ 
return(IsInCommDlg() ? m_pCDB->OnStateChange(this, uFlags) : S_FALSE); 
} 
 
void InitFileMenu(HMENU hmInit); 
void InitEditMenu(HMENU hmInit); 
void InitViewMenu(HMENU hmInit); 
int AddObject(LPCITEMIDLIST pidl); 
 
HRESULT FillList(BOOL bInteractive); 
BOOL ShowAllObjects() {return(TRUE);} 
 
void MergeArrangeMenu(HMENU hmView); 
void MergeViewMenu(HMENU hmenu, HMENU hmMerge); 
BOOL OnActivate(UINT uState); 
BOOL OnDeactivate(); 
 
IContextMenu * GetSelContextMenu(); 
void ReleaseSelContextMenu(); 
 
BOOL OnInitMenuPopup(HMENU hmInit, int nIndex, BOOL fSystemMenu); 
void OnCommand(IContextMenu *pcm, WPARAM wParam, LPARAM lParam); 
 
void CheckToolbar(); 
void MergeToolBar(); 
 
BOOL GetArrangeText(int iCol, UINT idFmt, LPSTR pszText, UINT cText); 
void GetCommandHelpText(UINT id, LPSTR pszText, UINT cchText, BOOL bToolTip); 
LRESULT OnMenuSelect(UINT idCmd, UINT uFlags, HMENU hmenu); 
 
 
LPSHELLFOLDER m_psf;                       // ShellFolder pointer 
ICommDlgBrowser *m_pCDB;                   // ICommdlgBrowser 
IShellFolderViewCallback *m_psfvcb;        // pointer to ShellFolderView  
                                           // callback 
CEnsureRelease m_erFolder;  
CEnsureRelease m_erCB; 
 
CSFViewDlg m_cView;                        //  ViewDlg which contains the 
                                           //  listview in the right pane 
HWND m_hwndMain; 
 
FOLDERSETTINGS m_fs; 
IShellBrowser *m_psb; 
SFSTATE m_sfState; 
 
CMenuTemp m_cmCur; 
UINT m_uState; 
 
IContextMenu *m_pcmSel; 
 
HDPA m_aParamSort;                         // maintains a sorted list of  
                                           // items in a DPA 
 
CAccelerator m_cAccel; 
 
    CSafeMalloc m_cMalloc; 
 
friend class CSFViewDlg; 
} ; 
 
#endif // _SFVWnd_H_