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

340 lines
8.3 KiB
C++

// LeftView.cpp : implementation of the CLeftView class
//
#include "stdafx.h"
#include "FileExplorer.h"
#include "FileExplorerDoc.h"
#include "LeftView.h"
#include "MainFrm.h"
#include "FileExplorerView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CLeftView
IMPLEMENT_DYNCREATE(CLeftView, CView)
BEGIN_MESSAGE_MAP(CLeftView, CView)
//{{AFX_MSG_MAP(CLeftView)
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(TVN_SELCHANGED,IDC_FOLDERTREE,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()
/////////////////////////////////////////////////////////////////////////////
// CLeftView construction/destruction
CLeftView::CLeftView()
{
// TODO: add construction code here
m_nCurrentItemInHistory=-1;
m_bPopulateList=TRUE;
}
CLeftView::~CLeftView()
{
}
BOOL CLeftView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CLeftView drawing
void CLeftView::OnDraw(CDC* pDC)
{
CFileExplorerDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
UNREFERENCED_PARAMETER(pDC);
}
void CLeftView::OnInitialUpdate()
{
CView::OnInitialUpdate();
ASSERT(::IsWindow(m_folderTree.GetSafeHwnd()));
m_folderTree.SetEnableContextMenu(TRUE);
m_folderTree.SetOnlyFileSystemFolders(FALSE);
m_folderTree.SetNotifyError(TRUE);
m_folderTree.InitializeTree();
m_folderTree.SelectItem(m_folderTree.GetNextItem(TVI_ROOT,TVGN_CHILD));
}
/////////////////////////////////////////////////////////////////////////////
// CLeftView diagnostics
#ifdef _DEBUG
void CLeftView::AssertValid() const
{
CView::AssertValid();
}
void CLeftView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CFileExplorerDoc* CLeftView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CFileExplorerDoc)));
return (CFileExplorerDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CLeftView message handlers
int CLeftView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
if(!m_folderTree.Create(WS_VISIBLE|WS_CHILD|TVS_HASLINES|TVS_LINESATROOT|
TVS_HASBUTTONS|TVS_EDITLABELS|TVS_SHOWSELALWAYS,CRect(0,0,0,0),this,
IDC_FOLDERTREE))
{
return -1;
}
return 0;
}
void CLeftView::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
if(::IsWindow(m_folderTree.GetSafeHwnd()))
m_folderTree.MoveWindow(0,0,cx,cy);
}
BOOL CLeftView::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
UNREFERENCED_PARAMETER(pDC);
return TRUE;
}
void CLeftView::OnSelectFolder(NMHDR* pNotifyStruct, LRESULT* result)
{
*result=0;
LPNMTREEVIEW pnmtv=(LPNMTREEVIEW)pNotifyStruct;
if(pnmtv->itemNew.hItem==NULL)
return;
// Get folder info associated with item
LPNAMESPACEOBJECT lpNameSpaceObject=
(LPNAMESPACEOBJECT)m_folderTree.GetItemData(pnmtv->itemNew.hItem);
ASSERT(lpNameSpaceObject!=NULL || m_folderTree.GetShowDesktopItem());
CMainFrame* pMainFrame=(CMainFrame*)AfxGetMainWnd();
ASSERT(pMainFrame!=NULL);
// get shell folder object from saved PIDLs
if(m_bPopulateList)
{
if(lpNameSpaceObject!=NULL)
{
COXShellNamespaceNavigator navigator;
LPSHELLFOLDER lpsfSelected=navigator.
GetShellFolder(lpNameSpaceObject->lpsfParent,
lpNameSpaceObject->lpRelativeIDL);
if(lpsfSelected!=NULL)
{
CFileExplorerView* pListView=pMainFrame->GetRightPane();
pListView->m_filesList.PopulateList(lpsfSelected,
lpNameSpaceObject->lpFullIDL);
lpsfSelected->Release();
}
}
else
{
CFileExplorerView* pListView=pMainFrame->GetRightPane();
pListView->m_filesList.PopulateList();
}
}
BOOL bExistInHistory=FALSE;
if(m_arrHistory.GetSize()>m_nCurrentItemInHistory && m_nCurrentItemInHistory>=0)
{
if(lpNameSpaceObject==NULL)
bExistInHistory=(m_arrHistory.GetAt(m_nCurrentItemInHistory)==NULL);
else
bExistInHistory=(m_arrHistory.GetAt(m_nCurrentItemInHistory)==
lpNameSpaceObject->lpFullIDL);
if(!bExistInHistory)
{
m_arrHistory.RemoveAt(m_nCurrentItemInHistory+1,
m_arrHistory.GetSize()-m_nCurrentItemInHistory-1);
}
}
if(!bExistInHistory)
{
m_nCurrentItemInHistory++;
// ??? IDL might be deleted in the future, probably have to copy it
if(lpNameSpaceObject==NULL)
m_arrHistory.SetAtGrow(m_nCurrentItemInHistory,NULL);
else
m_arrHistory.SetAtGrow(m_nCurrentItemInHistory,lpNameSpaceObject->lpFullIDL);
}
}
void CLeftView::OnEditPaste()
{
// TODO: Add your command handler code here
HTREEITEM hItem=m_folderTree.GetSelectedItem();
ASSERT(hItem!=NULL);
LPNAMESPACEOBJECT lpNameSpaceObject=
(LPNAMESPACEOBJECT)m_folderTree.GetItemData(hItem);
ASSERT(lpNameSpaceObject!=NULL);
ASSERT((lpNameSpaceObject->dwFlags&SFGAO_FOLDER)==SFGAO_FOLDER);
m_folderTree.InvokeCommand(hItem,IDCMD_PASTE);
}
void CLeftView::OnEditCopy()
{
// TODO: Add your command handler code here
HTREEITEM hItem=m_folderTree.GetSelectedItem();
ASSERT(hItem!=NULL);
m_folderTree.InvokeCommand(hItem,IDCMD_COPY);
}
void CLeftView::OnEditCut()
{
// TODO: Add your command handler code here
HTREEITEM hItem=m_folderTree.GetSelectedItem();
ASSERT(hItem!=NULL);
m_folderTree.InvokeCommand(hItem,IDCMD_CUT);
}
void CLeftView::OnEditDelete()
{
// TODO: Add your command handler code here
HTREEITEM hItem=m_folderTree.GetSelectedItem();
ASSERT(hItem!=NULL);
m_folderTree.InvokeCommand(hItem,IDCMD_DELETE);
}
void CLeftView::OnViewProperties()
{
// TODO: Add your command handler code here
HTREEITEM hItem=m_folderTree.GetSelectedItem();
ASSERT(hItem!=NULL);
m_folderTree.InvokeCommand(hItem,IDCMD_PROPERTIES);
}
void CLeftView::OnUpdateEditPaste(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
OnUpdate(pCmdUI,ID_EDIT_PASTE);
}
void CLeftView::OnUpdateEditCopy(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
OnUpdate(pCmdUI,ID_EDIT_COPY);
}
void CLeftView::OnUpdateEditCut(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
OnUpdate(pCmdUI,ID_EDIT_CUT);
}
void CLeftView::OnUpdateEditDelete(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
OnUpdate(pCmdUI,ID_EDIT_DELETE);
}
void CLeftView::OnUpdateViewProperties(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
OnUpdate(pCmdUI,ID_VIEW_PROPERTY);
}
void CLeftView::OnUpdate(CCmdUI* pCmdUI, UINT nID)
{
HTREEITEM hItem=m_folderTree.GetSelectedItem();
if(hItem==NULL)
{
pCmdUI->Enable(FALSE);
return;
}
// Get folder info associated with item
LPNAMESPACEOBJECT lpNameSpaceObject=
(LPNAMESPACEOBJECT)m_folderTree.GetItemData(hItem);
if(lpNameSpaceObject==NULL)
{
pCmdUI->Enable(FALSE);
return;
}
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 CLeftView::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_folderTree.SetFocus();
}