// MainFrm.cpp : implementation of the CMainFrame class // #include "stdafx.h" #include "FileExplorer.h" #include "MainFrm.h" #include "LeftView.h" #include "FileExplorerView.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif const int ID_MAXHISTORYITEMDISPLAYED=20; const int ID_BACKWARD_BASE=18000; const int ID_FORWARD_BASE=19000; ///////////////////////////////////////////////////////////////////////////// // CMainFrame IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd) BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) //{{AFX_MSG_MAP(CMainFrame) ON_WM_CREATE() //}}AFX_MSG_MAP ON_UPDATE_COMMAND_UI_RANGE(AFX_ID_VIEW_MINIMUM, AFX_ID_VIEW_MAXIMUM, OnUpdateViewStyles) ON_COMMAND_RANGE(AFX_ID_VIEW_MINIMUM, AFX_ID_VIEW_MAXIMUM, OnViewStyle) ON_NOTIFY(TBN_DROPDOWN, AFX_IDW_TOOLBAR, OnDropDown) ON_COMMAND(ID_VIEW_TYPE, OnViewType) ON_COMMAND(ID_VIEW_UP, OnViewUp) ON_COMMAND(ID_VIEW_BACKWARD, OnViewBackward) ON_COMMAND(ID_VIEW_FORWARD, OnViewForward) ON_UPDATE_COMMAND_UI(ID_VIEW_UP, OnUpdateViewUp) ON_UPDATE_COMMAND_UI(ID_VIEW_BACKWARD, OnUpdateViewBackward) ON_UPDATE_COMMAND_UI(ID_VIEW_FORWARD, OnUpdateViewForward) ON_COMMAND_RANGE(ID_BACKWARD_BASE, ID_BACKWARD_BASE+ID_MAXHISTORYITEMDISPLAYED, OnBackwardItem) ON_COMMAND_RANGE(ID_FORWARD_BASE, ID_FORWARD_BASE+ID_MAXHISTORYITEMDISPLAYED, OnForwardItem) END_MESSAGE_MAP() static UINT indicators[] = { ID_SEPARATOR, // status line indicator ID_INDICATOR_CAPS, ID_INDICATOR_NUM, ID_INDICATOR_SCRL, }; static UINT buttons[] = { ID_VIEW_BACKWARD, ID_VIEW_FORWARD, ID_VIEW_UP, ID_SEPARATOR, ID_EDIT_CUT, ID_EDIT_COPY, ID_EDIT_PASTE, ID_EDIT_DELETE, ID_SEPARATOR, ID_VIEW_PROPERTY, ID_VIEW_TYPE, }; ///////////////////////////////////////////////////////////////////////////// // CMainFrame construction/destruction CMainFrame::CMainFrame() { // TODO: add member initialization code here } CMainFrame::~CMainFrame() { } int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1; if (!m_wndToolBar.Create(this,WS_CHILD|WS_VISIBLE|CBRS_TOP|CBRS_TOOLTIPS| CBRS_FLYBY|CBRS_SIZE_DYNAMIC) || !m_wndToolBar.SetButtons(buttons,sizeof(buttons)/sizeof(buttons[1])) || m_wndToolBar.GetToolBarCtrl(). AddBitmap(sizeof(buttons)/sizeof(buttons[1]),IDB_TB_FILE)==-1) { TRACE0("Failed to create toolbar\n"); return -1; // fail to create } ///////////// // COXCoolToolBar specific functions m_wndToolBar.IniSizes(CSize(24,22)); m_wndToolBar.SetButtonTextFromID(COXCoolToolBar::TTID_TOOLTIP); m_wndToolBar.SetMaxTextRows(1); m_wndToolBar.SetButtonsMinMaxWidth(0,80); m_wndToolBar.SetHotImageList(m_wndToolBar.AddImageList(IDB_TB_FILE_HOT,24, RGB(192,192,192),ILC_COLOR8|ILC_MASK)); // m_wndToolBar.SetDisabledImageList(m_wndToolBar.AddImageList(IDB_TB_FILE_DISABLED,24, // RGB(255,0,255),ILC_COLOR8|ILC_MASK)); m_wndToolBar.UpdateSizes(); m_wndToolBar.SetButtonStyle(0,m_wndToolBar.GetButtonStyle(0)|TBSTYLE_DROPDOWN); m_wndToolBar.SetButtonStyle(1,m_wndToolBar.GetButtonStyle(1)|TBSTYLE_DROPDOWN); m_wndToolBar.SetButtonStyle(10,m_wndToolBar.GetButtonStyle(10)|TBSTYLE_DROPDOWN); m_wndToolBar.SetDropDownArrow(TRUE); //////////// if (!m_wndStatusBar.Create(this) || !m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT))) { TRACE0("Failed to create status bar\n"); return -1; // fail to create } // TODO: Delete these three lines if you don't want the toolbar to // be dockable m_wndToolBar.EnableDocking(CBRS_ALIGN_TOP|CBRS_ALIGN_BOTTOM); EnableDocking(CBRS_ALIGN_ANY); DockControlBar(&m_wndToolBar); return 0; } BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT /*lpcs*/, CCreateContext* pContext) { // create splitter window if (!m_wndSplitter.CreateStatic(this, 1, 2)) return FALSE; if (!m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CLeftView),CSize(0,0),pContext) || !m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CFileExplorerView), CSize(0,0),pContext)) { m_wndSplitter.DestroyWindow(); return FALSE; } m_wndSplitter.SetColumnInfo(0,200,0); m_wndSplitter.SetActivePane(0,0); return TRUE; } BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { if( !CFrameWnd::PreCreateWindow(cs) ) return FALSE; // TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs return TRUE; } ///////////////////////////////////////////////////////////////////////////// // CMainFrame diagnostics #ifdef _DEBUG void CMainFrame::AssertValid() const { CFrameWnd::AssertValid(); } void CMainFrame::Dump(CDumpContext& dc) const { CFrameWnd::Dump(dc); } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // CMainFrame message handlers CFileExplorerView* CMainFrame::GetRightPane() { CWnd* pWnd = m_wndSplitter.GetPane(0, 1); CFileExplorerView* pView = DYNAMIC_DOWNCAST(CFileExplorerView, pWnd); return pView; } CLeftView* CMainFrame::GetLeftPane() { CWnd* pWnd = m_wndSplitter.GetPane(0, 0); CLeftView* pView = DYNAMIC_DOWNCAST(CLeftView, pWnd); return pView; } void CMainFrame::OnUpdateViewStyles(CCmdUI* pCmdUI) { // TODO: customize or extend this code to handle choices on the // View menu. CFileExplorerView* pView = GetRightPane(); // if the right-hand pane hasn't been created or isn't a view, // disable commands in our range if (pView == NULL) pCmdUI->Enable(FALSE); else { DWORD dwStyle = pView->m_filesList.GetStyle() & LVS_TYPEMASK; // if the command is ID_VIEW_LINEUP, only enable command // when we're in LVS_ICON or LVS_SMALLICON mode if (pCmdUI->m_nID == ID_VIEW_LINEUP) { if (dwStyle == LVS_ICON || dwStyle == LVS_SMALLICON) pCmdUI->Enable(); else pCmdUI->Enable(FALSE); } else { // otherwise, use dots to reflect the style of the view pCmdUI->Enable(); BOOL bChecked = FALSE; switch (pCmdUI->m_nID) { case ID_VIEW_DETAILS: bChecked = (dwStyle == LVS_REPORT); break; case ID_VIEW_SMALLICON: bChecked = (dwStyle == LVS_SMALLICON); break; case ID_VIEW_LARGEICON: bChecked = (dwStyle == LVS_ICON); break; case ID_VIEW_LIST: bChecked = (dwStyle == LVS_LIST); break; default: bChecked = FALSE; break; } pCmdUI->SetRadio(bChecked ? 1 : 0); } } } void CMainFrame::OnViewStyle(UINT nCommandID) { // TODO: customize or extend this code to handle choices on the // View menu. CFileExplorerView* pView = GetRightPane(); // if the right-hand pane has been created and is a CFileExplorerView, // process the menu commands... if (pView != NULL) { DWORD dwStyle=(DWORD)-1; switch (nCommandID) { case ID_VIEW_LINEUP: { // ask the list control to snap to grid pView->m_filesList.Arrange(LVA_SNAPTOGRID); } break; // other commands change the style on the list control case ID_VIEW_DETAILS: dwStyle = LVS_REPORT; break; case ID_VIEW_SMALLICON: dwStyle = LVS_SMALLICON; break; case ID_VIEW_LARGEICON: dwStyle = LVS_ICON; break; case ID_VIEW_LIST: dwStyle = LVS_LIST; break; } // change the style; window will repaint automatically if (dwStyle != -1) pView->m_filesList.ModifyStyle(LVS_TYPEMASK, dwStyle); } } void CMainFrame::OnDropDown(NMHDR* pNotifyStruct, LRESULT* pResult) { // this function handles the dropdown menus from the toolbar NMTOOLBAR* pNMToolBar = (NMTOOLBAR*)pNotifyStruct; CRect rect; // translate the current toolbar item rectangle into screen coordinates // so that we'll know where to pop up the menu m_wndToolBar.GetItemRect(m_wndToolBar.CommandToIndex(pNMToolBar->iItem), &rect); rect.top = rect.bottom; ::ClientToScreen(pNMToolBar->hdr.hwndFrom, &rect.TopLeft()); switch(pNMToolBar->iItem) { case ID_VIEW_BACKWARD: { CWnd* pWnd=m_wndSplitter.GetPane(0,0); ASSERT(pWnd!=NULL); CLeftView* pTreeView=DYNAMIC_DOWNCAST(CLeftView,pWnd); ASSERT(pTreeView->m_arrHistory.GetSize()>1 && pTreeView->m_nCurrentItemInHistory!=0); CMenu menuPopup; VERIFY(menuPopup.CreatePopupMenu()); int nMenuItemCount=0; int nHistoryItemIndex=pTreeView->m_nCurrentItemInHistory-1; while(nMenuItemCount=0) { LPITEMIDLIST lpFullIDL=pTreeView->m_arrHistory.GetAt(nHistoryItemIndex); if(lpFullIDL==NULL) { menuPopup.AppendMenu(MF_STRING,ID_BACKWARD_BASE+nMenuItemCount, _T("Desktop")); nHistoryItemIndex--; nMenuItemCount++; } else { HTREEITEM hItem=pTreeView->m_folderTree.FindFolder(lpFullIDL); if(hItem==NULL) { pTreeView->m_arrHistory.RemoveAt(nHistoryItemIndex); pTreeView->m_nCurrentItemInHistory--; nHistoryItemIndex--; } else { CString sText=pTreeView->m_folderTree.GetItemText(hItem); menuPopup.AppendMenu(MF_STRING,ID_BACKWARD_BASE+nMenuItemCount, sText); nHistoryItemIndex--; nMenuItemCount++; } } } menuPopup.TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON,rect.left, rect.top+1,AfxGetMainWnd()); break; } case ID_VIEW_FORWARD: { CWnd* pWnd=m_wndSplitter.GetPane(0,0); ASSERT(pWnd!=NULL); CLeftView* pTreeView=DYNAMIC_DOWNCAST(CLeftView,pWnd); ASSERT((pTreeView->m_arrHistory.GetSize()-1)> pTreeView->m_nCurrentItemInHistory); CMenu menuPopup; VERIFY(menuPopup.CreatePopupMenu()); int nMenuItemCount=0; int nHistoryItemIndex=pTreeView->m_nCurrentItemInHistory+1; while(nMenuItemCountm_arrHistory.GetSize()) { LPITEMIDLIST lpFullIDL=pTreeView->m_arrHistory.GetAt(nHistoryItemIndex); if(lpFullIDL==NULL) { menuPopup.AppendMenu(MF_STRING,ID_FORWARD_BASE+nMenuItemCount, _T("Desktop")); nHistoryItemIndex++; nMenuItemCount++; } else { HTREEITEM hItem=pTreeView->m_folderTree.FindFolder(lpFullIDL); if(hItem==NULL) { pTreeView->m_arrHistory.RemoveAt(nHistoryItemIndex); } else { CString sText=pTreeView->m_folderTree.GetItemText(hItem); menuPopup.AppendMenu(MF_STRING,ID_FORWARD_BASE+nMenuItemCount, sText); nHistoryItemIndex++; nMenuItemCount++; } } } menuPopup.TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON,rect.left, rect.top+1,AfxGetMainWnd()); break; } case ID_VIEW_TYPE: { CMenu menu; CMenu* pPopup; menu.LoadMenu(IDR_VIEWTYPE); pPopup=menu.GetSubMenu(0); pPopup->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON,rect.left, rect.top+1,AfxGetMainWnd()); break; } } *pResult=TBDDRET_DEFAULT; } void CMainFrame::OnBackwardItem(UINT nCommandID) { CWnd* pWnd=m_wndSplitter.GetPane(0,0); ASSERT(pWnd!=NULL); CLeftView* pTreeView=DYNAMIC_DOWNCAST(CLeftView,pWnd); ASSERT(pTreeView->m_arrHistory.GetSize()>1 && pTreeView->m_nCurrentItemInHistory!=0); int nItemIndex=pTreeView->m_nCurrentItemInHistory-1-nCommandID+ID_BACKWARD_BASE; ASSERT(nItemIndex>=0); LPITEMIDLIST lpFullIDLPrev=pTreeView->m_arrHistory.GetAt(nItemIndex); HTREEITEM hPrevItem=NULL; if(lpFullIDLPrev!=NULL) { hPrevItem=pTreeView->m_folderTree.FindFolder(lpFullIDLPrev); } else { hPrevItem=pTreeView->m_folderTree.GetRootItem(); } if(hPrevItem!=NULL) { pTreeView->m_nCurrentItemInHistory=nItemIndex; pTreeView->m_folderTree.SelectItem(hPrevItem); } } void CMainFrame::OnForwardItem(UINT nCommandID) { CWnd* pWnd=m_wndSplitter.GetPane(0,0); ASSERT(pWnd!=NULL); CLeftView* pTreeView=DYNAMIC_DOWNCAST(CLeftView,pWnd); ASSERT((pTreeView->m_arrHistory.GetSize()-1)>pTreeView->m_nCurrentItemInHistory); int nItemIndex=pTreeView->m_nCurrentItemInHistory+1+nCommandID-ID_FORWARD_BASE; ASSERT(nItemIndexm_arrHistory.GetSize()); LPITEMIDLIST lpFullIDLNext=pTreeView->m_arrHistory.GetAt(nItemIndex); HTREEITEM hNextItem=NULL; if(lpFullIDLNext!=NULL) { hNextItem=pTreeView->m_folderTree.FindFolder(lpFullIDLNext); } else { hNextItem=pTreeView->m_folderTree.GetRootItem(); } if(hNextItem!=NULL) { pTreeView->m_nCurrentItemInHistory=nItemIndex; pTreeView->m_folderTree.SelectItem(hNextItem); } } void CMainFrame::OnViewType() { // TODO: Add your command handler code here OnViewStyle(ID_VIEW_LARGEICON); } void CMainFrame::OnViewUp() { // TODO: Add your command handler code here CWnd* pWnd=m_wndSplitter.GetPane(0,0); ASSERT(pWnd!=NULL); CLeftView* pTreeView=DYNAMIC_DOWNCAST(CLeftView,pWnd); HTREEITEM hItem=pTreeView->m_folderTree.GetSelectedItem(); ASSERT(hItem!=NULL); HTREEITEM hParentItem=pTreeView->m_folderTree.GetParentItem(hItem); ASSERT(hParentItem!=NULL); pTreeView->m_folderTree.SelectItem(hParentItem); } void CMainFrame::OnViewBackward() { // TODO: Add your command handler code here CWnd* pWnd=m_wndSplitter.GetPane(0,0); ASSERT(pWnd!=NULL); CLeftView* pTreeView=DYNAMIC_DOWNCAST(CLeftView,pWnd); ASSERT(pTreeView->m_arrHistory.GetSize()>1 && pTreeView->m_nCurrentItemInHistory!=0); LPITEMIDLIST lpFullIDLPrev=pTreeView->m_arrHistory. GetAt(pTreeView->m_nCurrentItemInHistory-1); HTREEITEM hPrevItem=NULL; if(lpFullIDLPrev!=NULL) { hPrevItem=pTreeView->m_folderTree.FindFolder(lpFullIDLPrev); } else { hPrevItem=pTreeView->m_folderTree.GetRootItem(); } if(hPrevItem!=NULL) { pTreeView->m_nCurrentItemInHistory--; pTreeView->m_folderTree.SelectItem(hPrevItem); } } void CMainFrame::OnViewForward() { // TODO: Add your command handler code here CWnd* pWnd=m_wndSplitter.GetPane(0,0); ASSERT(pWnd!=NULL); CLeftView* pTreeView=DYNAMIC_DOWNCAST(CLeftView,pWnd); ASSERT((pTreeView->m_arrHistory.GetSize()-1)>pTreeView->m_nCurrentItemInHistory); LPITEMIDLIST lpFullIDLNext=pTreeView->m_arrHistory. GetAt(pTreeView->m_nCurrentItemInHistory+1); HTREEITEM hNextItem=NULL; if(lpFullIDLNext!=NULL) { hNextItem=pTreeView->m_folderTree.FindFolder(lpFullIDLNext); } else { hNextItem=pTreeView->m_folderTree.GetRootItem(); } if(hNextItem!=NULL) { pTreeView->m_nCurrentItemInHistory++; pTreeView->m_folderTree.SelectItem(hNextItem); } } void CMainFrame::OnUpdateViewForward(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here CWnd* pWnd=m_wndSplitter.GetPane(0,0); ASSERT(pWnd!=NULL); CLeftView* pTreeView=DYNAMIC_DOWNCAST(CLeftView,pWnd); pCmdUI->Enable((pTreeView->m_arrHistory.GetSize()-1)> pTreeView->m_nCurrentItemInHistory); } void CMainFrame::OnUpdateViewBackward(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here CWnd* pWnd=m_wndSplitter.GetPane(0,0); ASSERT(pWnd!=NULL); CLeftView* pTreeView=DYNAMIC_DOWNCAST(CLeftView,pWnd); pCmdUI->Enable(pTreeView->m_arrHistory.GetSize()>1 && pTreeView->m_nCurrentItemInHistory!=0); } void CMainFrame::OnUpdateViewUp(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here BOOL bEnabled=FALSE; CWnd* pWnd=m_wndSplitter.GetPane(0,0); ASSERT(pWnd!=NULL); CLeftView* pTreeView=DYNAMIC_DOWNCAST(CLeftView,pWnd); HTREEITEM hItem=pTreeView->m_folderTree.GetSelectedItem(); if(hItem!=NULL) { HTREEITEM hParentItem=pTreeView->m_folderTree.GetParentItem(hItem); if(hParentItem!=NULL) bEnabled=TRUE; } pCmdUI->Enable(bEnabled); }