//*******************************************************************************************
//
// 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_