2025-11-27 16:46:48 +09:00

310 lines
7.9 KiB
C++

// FileExplorerView.cpp : implementation of the CFileExplorerView class
//
#include "stdafx.h"
#include "FileExplorer.h"
#include "FileExplorerDoc.h"
#include "FileExplorerView.h"
#include "MainFrm.h"
#include "LeftView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CFileExplorerView
IMPLEMENT_DYNCREATE(CFileExplorerView, CView)
BEGIN_MESSAGE_MAP(CFileExplorerView, CView)
//{{AFX_MSG_MAP(CFileExplorerView)
ON_WM_CREATE()
ON_WM_SIZE()
ON_WM_ERASEBKGND()
ON_COMMAND(ID_EDIT_COPY, OnEditCopy)
ON_COMMAND(ID_EDIT_CUT, OnEditCut)
ON_COMMAND(ID_EDIT_PASTE, OnEditPaste)
ON_UPDATE_COMMAND_UI(ID_EDIT_COPY, OnUpdateEditCopy)
ON_UPDATE_COMMAND_UI(ID_EDIT_CUT, OnUpdateEditCut)
ON_UPDATE_COMMAND_UI(ID_EDIT_PASTE, OnUpdateEditPaste)
//}}AFX_MSG_MAP
ON_NOTIFY(NM_DBLCLK,IDC_FILELIST,OnSelectFolder)
ON_COMMAND(ID_EDIT_DELETE, OnEditDelete)
ON_COMMAND(ID_VIEW_PROPERTY, OnViewProperties)
ON_UPDATE_COMMAND_UI(ID_EDIT_DELETE, OnUpdateEditDelete)
ON_UPDATE_COMMAND_UI(ID_VIEW_PROPERTY, OnUpdateViewProperties)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CFileExplorerView construction/destruction
CFileExplorerView::CFileExplorerView()
{
// TODO: add construction code here
}
CFileExplorerView::~CFileExplorerView()
{
}
BOOL CFileExplorerView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CFileExplorerView drawing
void CFileExplorerView::OnDraw(CDC* pDC)
{
CFileExplorerDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
UNREFERENCED_PARAMETER(pDC);
}
void CFileExplorerView::OnInitialUpdate()
{
CView::OnInitialUpdate();
// TODO: You may populate your ListView with items by directly accessing
// its list control through a call to GetListCtrl().
ASSERT(::IsWindow(m_filesList.GetSafeHwnd()));
m_filesList.SetEnableContextMenu(TRUE);
m_filesList.SetOnlyFileSystemItems(FALSE);
m_filesList.SetNotifyError(TRUE);
}
/////////////////////////////////////////////////////////////////////////////
// CFileExplorerView diagnostics
#ifdef _DEBUG
void CFileExplorerView::AssertValid() const
{
CView::AssertValid();
}
void CFileExplorerView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CFileExplorerDoc* CFileExplorerView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CFileExplorerDoc)));
return (CFileExplorerDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CFileExplorerView message handlers
int CFileExplorerView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
if(!m_filesList.Create(WS_VISIBLE|WS_CHILD|LVS_REPORT|
LVS_EDITLABELS|LVS_SHOWSELALWAYS,
CRect(0,0,0,0),this,IDC_FILELIST))
{
return -1;
}
return 0;
}
void CFileExplorerView::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
if(::IsWindow(m_filesList.GetSafeHwnd()))
m_filesList.MoveWindow(0,0,cx,cy);
}
BOOL CFileExplorerView::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
UNREFERENCED_PARAMETER(pDC);
return TRUE;
}
void CFileExplorerView::OnSelectFolder(NMHDR* pNotifyStruct, LRESULT* result)
{
UNREFERENCED_PARAMETER(pNotifyStruct);
*result=0;
CPoint ptMouseCursor;
::GetCursorPos(&ptMouseCursor);
m_filesList.ScreenToClient(&ptMouseCursor);
// Use HitTest function to define the list item by coordinate
UINT nFlags=NULL;
int nItem=m_filesList.HitTest(ptMouseCursor,&nFlags);
if(nItem!=-1 && (nFlags&LVHT_ONITEM)!=0)
{
// Get folder info associated with item
LPNAMESPACEOBJECT lpNameSpaceObject=
(LPNAMESPACEOBJECT)m_filesList.GetItemData(nItem);
ASSERT(lpNameSpaceObject!=NULL);
if(lpNameSpaceObject->dwFlags&SFGAO_HASSUBFOLDER ||
lpNameSpaceObject->dwFlags&SFGAO_FOLDER)
{
COXShellNamespaceNavigator navigator;
LPSHELLFOLDER lpsfSelected=
navigator.GetShellFolder(lpNameSpaceObject->lpsfParent,
lpNameSpaceObject->lpRelativeIDL);
if(lpsfSelected!=NULL)
{
m_filesList.PopulateList(lpsfSelected,lpNameSpaceObject->lpFullIDL);
CMainFrame* pMainFrame=(CMainFrame*)AfxGetMainWnd();
ASSERT(pMainFrame!=NULL);
CLeftView* pTreeView=pMainFrame->GetLeftPane();
pTreeView->m_bPopulateList=FALSE;
pTreeView->m_folderTree.OpenFolder(lpNameSpaceObject->lpFullIDL);
pTreeView->m_bPopulateList=TRUE;
}
}
}
}
void CFileExplorerView::OnEditPaste()
{
// TODO: Add your command handler code here
int nItem=m_filesList.GetNextItem(-1,LVNI_SELECTED);
ASSERT(nItem!=-1);
LPNAMESPACEOBJECT lpNameSpaceObject=
(LPNAMESPACEOBJECT)m_filesList.GetItemData(nItem);
ASSERT(lpNameSpaceObject!=NULL);
ASSERT((lpNameSpaceObject->dwFlags&SFGAO_FOLDER)==SFGAO_FOLDER);
m_filesList.InvokeCommand(nItem,IDCMD_PASTE);
}
void CFileExplorerView::OnEditCopy()
{
// TODO: Add your command handler code here
int nItem=m_filesList.GetNextItem(-1,LVNI_SELECTED);
ASSERT(nItem!=-1);
m_filesList.InvokeCommand(nItem,IDCMD_COPY);
}
void CFileExplorerView::OnEditCut()
{
// TODO: Add your command handler code here
int nItem=m_filesList.GetNextItem(-1,LVNI_SELECTED);
ASSERT(nItem!=-1);
m_filesList.InvokeCommand(nItem,IDCMD_CUT);
}
void CFileExplorerView::OnEditDelete()
{
// TODO: Add your command handler code here
int nItem=m_filesList.GetNextItem(-1,LVNI_SELECTED);
ASSERT(nItem!=-1);
m_filesList.InvokeCommand(nItem,IDCMD_DELETE);
}
void CFileExplorerView::OnViewProperties()
{
// TODO: Add your command handler code here
int nItem=m_filesList.GetNextItem(-1,LVNI_SELECTED);
ASSERT(nItem!=-1);
m_filesList.InvokeCommand(nItem,IDCMD_PROPERTIES);
}
void CFileExplorerView::OnUpdateEditPaste(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
OnUpdate(pCmdUI,ID_EDIT_PASTE);
}
void CFileExplorerView::OnUpdateEditCopy(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
OnUpdate(pCmdUI,ID_EDIT_COPY);
}
void CFileExplorerView::OnUpdateEditCut(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
OnUpdate(pCmdUI,ID_EDIT_CUT);
}
void CFileExplorerView::OnUpdateEditDelete(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
OnUpdate(pCmdUI,ID_EDIT_DELETE);
}
void CFileExplorerView::OnUpdateViewProperties(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
OnUpdate(pCmdUI,ID_VIEW_PROPERTY);
}
void CFileExplorerView::OnUpdate(CCmdUI* pCmdUI, UINT nID)
{
int nItem=m_filesList.GetNextItem(-1,LVNI_SELECTED);
if(nItem==-1)
{
pCmdUI->Enable(FALSE);
return;
}
// Get folder info associated with item
LPNAMESPACEOBJECT lpNameSpaceObject=
(LPNAMESPACEOBJECT)m_filesList.GetItemData(nItem);
ASSERT(lpNameSpaceObject!=NULL);
switch(nID)
{
case ID_EDIT_PASTE:
pCmdUI->Enable(lpNameSpaceObject->dwFlags&SFGAO_FOLDER);
break;
case ID_EDIT_COPY:
pCmdUI->Enable(lpNameSpaceObject->dwFlags&SFGAO_CANCOPY);
break;
case ID_EDIT_CUT:
pCmdUI->Enable((lpNameSpaceObject->dwFlags&SFGAO_CANCOPY)!=0 &&
(lpNameSpaceObject->dwFlags&SFGAO_CANDELETE)!=0);
break;
case ID_EDIT_DELETE:
pCmdUI->Enable(lpNameSpaceObject->dwFlags&SFGAO_CANDELETE);
break;
case ID_VIEW_PROPERTY:
pCmdUI->Enable(lpNameSpaceObject->dwFlags&SFGAO_HASPROPSHEET);
break;
default:
ASSERT(FALSE);
}
}
void CFileExplorerView::OnActivateView(BOOL bActivate, CView* pActivateView, CView* pDeactiveView)
{
// TODO: Add your specialized code here and/or call the base class
CView::OnActivateView(bActivate, pActivateView, pDeactiveView);
m_filesList.SetFocus();
}