|
|
//*******************************************************************************************
//
// Filename : SFVWnd.h
//
// Definitions of CListView, CSFViewDlg, CAccelerator, CSFView
//
// Copyright (c) 1994 - 1996 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_
|