⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 workspace.cpp

📁 功能: 增加一个文件在工作区
💻 CPP
字号:
// WorkSpace.cpp : implementation file
//

#include "stdafx.h"
#include "MyFolder.h"
#include "WorkSpace.h"
#include "FolderNameDialog.h"
#include "OpenMultiFileDlg.h"
#include "Folder.h"
#include "FolderTree.h"
#include "Mainfrm.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#define IDS_PROJECT_COUNT               61205

#endif

/////////////////////////////////////////////////////////////////////////////
// CWorkSpace

IMPLEMENT_DYNCREATE(CWorkSpace, CTreeView)

CWorkSpace::CWorkSpace()
{
}

CWorkSpace::~CWorkSpace()
{
}


BEGIN_MESSAGE_MAP(CWorkSpace, CTreeView)
	//{{AFX_MSG_MAP(CWorkSpace)
	ON_WM_RBUTTONDOWN()
	ON_COMMAND(ID_NEW_ROOT_FOLDER, OnNewRootFolder)
	ON_WM_CREATE()
	ON_COMMAND(ID_NEW_FOLDER, OnNewFolder)
	ON_COMMAND(ID_ADD_FILE, OnAddFile)
	ON_WM_LBUTTONUP()
	ON_COMMAND(ID_WORKSPCE_BAR, OnHideWorkSpace)
	ON_UPDATE_COMMAND_UI(ID_WORKSPCE_BAR, OnUpdateWorkspceBar)
	ON_WM_LBUTTONDOWN()
	ON_COMMAND(ID_DEL_WORKSPACE_ITEM, OnDelWorkspaceItem)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CWorkSpace drawing

void CWorkSpace::OnDraw(CDC* pDC)
{
	CDocument* pDoc = GetDocument();
	// TODO: add draw code here
}

/////////////////////////////////////////////////////////////////////////////
// CWorkSpace diagnostics

#ifdef _DEBUG
void CWorkSpace::AssertValid() const
{
	CTreeView::AssertValid();
}

void CWorkSpace::Dump(CDumpContext& dc) const
{
	CTreeView::Dump(dc);
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CWorkSpace message handlers







void CWorkSpace::OnRButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	UINT uFlag = 0;
  HTREEITEM hTreeItem = m_pTreeCtrl->HitTest(point, &uFlag);//获取点击的节点信息(handle)

	CMenu menu;
  if(hTreeItem && (uFlag & TVHT_ONITEM))//如果结点存在
	{
		m_pTreeCtrl->Select(hTreeItem, TVGN_CARET);//将结点信息赋给hTreeItem
		CString strFileName = m_pTreeCtrl->GetItemText(hTreeItem);//将节点名称赋给strFileName
		CFolder* pFolder= (CFolder*)m_pTreeCtrl->GetItemData(hTreeItem);//获取结点Data
		if(pFolder->IsFolder(strFileName))//选中文件夹
			VERIFY(menu.LoadMenu(IDR_WORKSPACE_FOLDER));//右键弹出IDR_WORKSPACE_FOLDER菜单
	//	else//选中File
	//		VERIFY(menu.LoadMenu(IDR_WORKSPACE_FILE));//右键弹出IDR_WORKSPACE_FILE菜单
	}
	else//选中空白

	VERIFY(menu.LoadMenu(IDR_WORKSPACE));//右键IDR_WORKSPACE菜单
	CMenu* pPopup = menu.GetSubMenu(0);//弹出右键菜单
    ASSERT(pPopup != NULL);
    ClientToScreen(&point);//逻辑坐标转为屏幕坐标
	pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, 
		point.x, point.y, AfxGetMainWnd());//弹出右键	

}

void CWorkSpace::OnNewRootFolder() 
{
	CString strFolderName;
	int nCount = m_FolderLi.GetCount();//获取“工程”个数
	strFolderName.Format(IDS_PROJECT_COUNT, nCount + 1);

	CFolderNameDialog Dlg;//弹出CFolderNameDlg对话框
	Dlg.m_strFolderName = strFolderName; //给m_strFolderName赋值
	if(Dlg.DoModal() == IDCANCEL)//点击“取消”则返回
		return;

	strFolderName = Dlg.m_strFolderName;
	CFolder* pChileFolder = new CFolder(strFolderName);

	m_FolderLi.AddTail(pChileFolder);
	m_pTreeCtrl->FillItem(pChileFolder);
//	m_bIsDirty = TRUE;//文件修改
}

BOOL CWorkSpace::PreCreateWindow(CREATESTRUCT& cs)
{
	cs.style |= TVS_HASBUTTONS | TVS_HASLINES | 
		TVS_LINESATROOT |TVS_SHOWSELALWAYS | TVS_TRACKSELECT;

	return CTreeView::PreCreateWindow(cs);
}

int CWorkSpace::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CTreeView::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	m_pTreeCtrl = (CFolderTree*)&GetTreeCtrl();
	CFolder* pFolder = NULL;
	m_ImageList.Create(IDB_FOLDER_BMP, 16, 1, RGB(0,255,0));
	m_pTreeCtrl->SetImageList(&m_ImageList, TVSIL_NORMAL);
	return 0;
}

void CWorkSpace::OnNewFolder() 
{
	CString strFolderName;//定义CString对象strFolderName(文件夹路径)
	strFolderName.LoadString(IDS_NEW_FOLDER);//存储ID号(表示“新文件夹”)
	HTREEITEM hTreeItem = m_pTreeCtrl->GetSelectedItem();//得到当前点击节点信息(没获得返回0)(handl)
	//if(!hTreeItem)
   // strFolderName = CString("Project");//如果不是节点,则strFolderName=工程,建立新工程
	CFolderNameDialog Dlg;
	Dlg.m_strFolderName = strFolderName;//弹出CFolderNameDlg对话框
	if(Dlg.DoModal() == IDCANCEL)//不建立新文件夹
		return;

//	m_bIsDirty = TRUE;//文件修改
	strFolderName = Dlg.m_strFolderName;//strFolderName为对话框中m_strFolderName名字
	CFolder* pFolder = NULL;//pFolder指针清空
	CFolder* pChileFolder = new CFolder(strFolderName);//为strFolderName动态分配内存

/**if(!hTreeItem)
	{
		m_FolderList.AddTail(pChileFolder);

		m_pTreeCtrl->FillItem(pChileFolder, NULL);
		return;
	}
**/	
	pFolder = (CFolder*)m_pTreeCtrl->GetItemData(hTreeItem);//获取结点Data
	pFolder->AddFolder(pChileFolder);

	TV_INSERTSTRUCT TreeCtrlItem;//定义TreeCtrlItem
	TreeCtrlItem.hParent = hTreeItem;//定义父亲节点(父亲结点为鼠标选中的文件夹)

	TreeCtrlItem.hInsertAfter = TVI_LAST;//在最后位置插人节点
	TreeCtrlItem.item.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_PARAM | TVIF_SELECTEDIMAGE;
//激活上述属性
	TreeCtrlItem.hParent = hTreeItem;
	TreeCtrlItem.item.pszText = strFolderName.GetBuffer(strFolderName.GetLength());//得到文件名
	strFolderName.ReleaseBuffer();//释放GetBuffer
	TreeCtrlItem.item.iImage = 0;//选取一个新建文件夹图象
	TreeCtrlItem.item.iSelectedImage = 1;//选中该节点时的图象
	TreeCtrlItem.item.lParam = (LPARAM)pChileFolder;

	m_pTreeCtrl->InsertItem(&TreeCtrlItem);//插入节点
	m_pTreeCtrl->Expand(hTreeItem, TVE_EXPAND);	//扩充列表	
	
}

void CWorkSpace::OnAddFile() 
{
	COpenMultiFileDlg dlgFile(TRUE);//打开COpenMultiFileDlg对话框选取增加的文件
	CString title,strFilter;//定义title,strFilter,strDefault
	VERIFY(title.LoadString(AFX_IDS_OPENFILE));//将AFX_IDS_OPENFILE读进title
	
	strFilter+="MyFolder 文件(*.my)";
	strFilter+=(TCHAR)'\0';//next string please
	strFilter+=_T("*.ost");
	strFilter+=(TCHAR)'\0';//last string
	strFilter+="所有文件(*.*)";
	strFilter+=(TCHAR)'\0';//next string please
	strFilter+=_T("*.*");
	strFilter+=(TCHAR)'\0';//last string

	dlgFile.m_ofn.nMaxCustFilter++;
	dlgFile.m_ofn.lpstrFilter=strFilter;
	dlgFile.m_ofn.lpstrTitle=title;
	dlgFile.m_ofn.hwndOwner=AfxGetMainWnd()->GetSafeHwnd();
	
	if(dlgFile.DoModal()==IDOK)//如果点击对话眶中“ok”按钮
	{
	POSITION pos=dlgFile.GetStartPosition();//获取当前的路径
		CString strName;//定义strName
	
		while (pos!=NULL)//如果当前路径不为空,即有文件存在
		{	
		strName = dlgFile.GetNextPathName(pos);//获取文件完整路径

			AddFileName(strName);//增加文件名到目录树,将路径传递给AddFileName函数 
		}

	}	
}
void CWorkSpace::AddFileName(CString strPathName) //增加文件名到目录树函数
{
	if(strPathName.IsEmpty())//如果strPathName为空,则返回
	{ ASSERT(FALSE); return;}

	HTREEITEM hTreeItem = m_pTreeCtrl->GetSelectedItem();//得到当前结点信息
	CFolder* pFolder = (CFolder*)m_pTreeCtrl->GetItemData(hTreeItem);//获取当前结点数据
	if(!pFolder->AddFileName(strPathName))//调用CFolder中的AddFileName函数。
     	return	;   //文件没有增加到m_FileNameArray则返回

	TV_INSERTSTRUCT TreeCtrlItem;//定义TreeCtrlItem
	TreeCtrlItem.hParent = hTreeItem;//父结点=hTreeItem
	TreeCtrlItem.hInsertAfter = TVI_LAST;//最后一个结点
	TreeCtrlItem.item.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_PARAM | TVIF_SELECTEDIMAGE;
//激活上述iImage,iSelectedImage,lParam属性
	int nCount = strPathName.GetLength() - strPathName.ReverseFind('\\')-1;//求得文件库路径字符数
	CString strFileName = strPathName.Right(nCount);//获得文件名称

	TreeCtrlItem.hParent = hTreeItem;//父结点=hTreeItem
	TreeCtrlItem.item.pszText = strFileName.GetBuffer(strFileName.GetLength());//结点上得到文件名
	strFileName.ReleaseBuffer();//释放GetBuffer
	TreeCtrlItem.item.iImage = 2;//选取一个新建文件图象
	TreeCtrlItem.item.iSelectedImage = 2;//选中该节点时的图象
	TreeCtrlItem.item.lParam = (LPARAM)pFolder;

	m_pTreeCtrl->InsertItem(&TreeCtrlItem);//插入结点
	m_pTreeCtrl->Expand(hTreeItem, TVE_EXPAND);//扩充列表

	//AfxGetApp()->OpenDocumentFile(strFileName);
}

void CWorkSpace::OnLButtonUp(UINT nFlags, CPoint point) 
{
	TCHAR szFullPath[MAX_PATH];

	int nSize = ::GetModuleFileName(AfxGetInstanceHandle(), szFullPath, MAX_PATH);//获得应用程序的路径
	if(nSize == 0)
	{
		Invalidate();
		return;	
	}
	CString strPath(szFullPath);
	int n = strPath.ReverseFind( '\\' )+1;
	strPath = strPath.Left(n);//去掉可执行文件名
//	ASSERT(FALSE);
/*	if(m_hDragItem)
	{
		UINT uFlag = 0;
		HTREEITEM hTreeItem = m_pTreeCtrl->HitTest(point, &uFlag);
		BOOL bIsFolder = FALSE;
		CString strItemText, strDragItemText;
		BOOL bAddSuccess = TRUE;
		if(hTreeItem && (uFlag & TVHT_ONITEM))
		{
			CFolder* pFolder = (CFolder*)m_pTreeCtrl->GetItemData(hTreeItem);
			if(CanBeDropTargert(hTreeItem, m_hDragItem))
			{
				strDragItemText = m_pTreeCtrl->GetItemText(m_hDragItem);
				CFolder* pDragFolder = (CFolder*)m_pTreeCtrl->GetItemData(m_hDragItem);
				TV_INSERTSTRUCT TreeCtrlItem;
				if(pDragFolder->IsFolder(strDragItemText))
				{
					if(pDragFolder->m_pFather)
						pDragFolder->m_pFather->RemoveFolder(pDragFolder, FALSE);
					else
						RemoveFolder(pDragFolder, FALSE);
					pFolder->AddFolder(pDragFolder);										
					TreeCtrlItem.item.iImage = 0;
					TreeCtrlItem.item.iSelectedImage = 1;
					bIsFolder = TRUE;
				}
				else
				{
					CString strPathName = pDragFolder->FindFullFileName(strDragItemText);
					if(strPathName.IsEmpty())
					{
						ASSERT(FALSE);
						return;
					}
					BOOL b = pDragFolder->RemoveFileName(strDragItemText);
					ASSERT(b);
					bAddSuccess = pFolder->AddFileName(strPathName);
					ASSERT(bAddSuccess);
					TreeCtrlItem.item.iImage = 2;
					TreeCtrlItem.item.iSelectedImage = 2;
				}
				strItemText = m_pTreeCtrl->GetItemText(hTreeItem);
				if(!pFolder->IsFolder(strItemText))
					hTreeItem = m_pTreeCtrl->GetParentItem(hTreeItem);

				TreeCtrlItem.hParent = hTreeItem;
				m_pTreeCtrl->DeleteItem(m_hDragItem);
				TreeCtrlItem.hInsertAfter = TVI_LAST;
				TreeCtrlItem.item.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_PARAM | TVIF_SELECTEDIMAGE;
				TreeCtrlItem.item.pszText = strDragItemText.GetBuffer(strDragItemText.GetLength());
				strDragItemText.ReleaseBuffer();
				TreeCtrlItem.item.lParam = (LPARAM)pFolder;
				if(bIsFolder)
					m_pTreeCtrl->FillItem(pDragFolder, hTreeItem);
				else if(bAddSuccess)
					m_pTreeCtrl->SelectDropTarget(m_pTreeCtrl->InsertItem(&TreeCtrlItem));
				else 
					ASSERT(FALSE);
				m_pTreeCtrl->SortChildren(hTreeItem);
				m_pTreeCtrl->Expand(hTreeItem, TVE_EXPAND);
				::SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));//箭头Cursor
				m_bIsDirty = TRUE;
			}
		}
	}
	m_hDragItem = NULL;*/
	CTreeView::OnLButtonUp(nFlags, point);
	GetParent()->Invalidate();
}

void CWorkSpace::OnHideWorkSpace() 
{
	((CMainFrame*)AfxGetMainWnd())->m_wndWorkSpaceBar.ShowWindow(SW_HIDE);	
	((CMainFrame*)AfxGetMainWnd())->RecalcLayout();	
}

void CWorkSpace::OnUpdateWorkspceBar(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	
}

void CWorkSpace::OnDelWorkspaceItem() 
{
	HTREEITEM hCurItem = m_pTreeCtrl->GetSelectedItem();//获得当前结点信息
	if(!hCurItem)//当前结点为空则返回
		return;

	if(AfxMessageBox(IDS_DEL_IT, MB_YESNO) != IDYES)//弹出“确定删除”对话框判断是否删除
		return;

	CFolder* pFolder = (CFolder*)m_pTreeCtrl->GetItemData(hCurItem);//获取结点Data
	ASSERT(pFolder);
	CString strItemText = m_pTreeCtrl->GetItemText(hCurItem);//获取当前结点名
	if(pFolder->IsFolder(strItemText))//删除的是否文件夹
	{
/**/		if(pFolder->m_pFather)
			pFolder->m_pFather->RemoveFolder(pFolder);	//调用RemoveFolder函数,调用父亲结点的m_FolderList中删除。		
	else
			RemoveFolder(pFolder);//删除文件夹
	}
	else//删除文件
		pFolder->RemoveFileName(strItemText, FALSE);//调用RemoveFileName函数

	m_pTreeCtrl->DeleteItem(hCurItem);//删除结点
	Invalidate();	
}
void CWorkSpace::RemoveFolder(CFolder* pFolder, BOOL bDelete/*=TRUE*/)//删除文件夹,
{                                                 //在OnDelWorkspaceItem()等函数中调用 
	ASSERT(pFolder != NULL);//如果文件夹存在

	POSITION pos;//定义索引指针
	pos = m_FolderLi.Find(pFolder);//指针指向要删除的文件夹
	if(!pos)//指针为空则返回
		return;

	m_FolderLi.RemoveAt(pos);//删除指针
	if(bDelete)
		delete pFolder;//释放指针指向的对象

	Invalidate();
} 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -