📄 leftview.cpp
字号:
////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2008
//
// The following code is supplied "as-is" and
// is given without warranty of any kind.
// It may be freely distributed and used.
// The user holds author blameless from any complications or
// problems that may arise from the use of this code.
//
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
// $Workfile: $ created: 04/05/2008 11:52
////////////////////////////////////////////////////////////////////////////////
// $Revision: $ $Modtime: $
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
// Author: steveb
//
// History:
//
////////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "CodezBank.h"
#include "CodezBankDoc.h"
#include "LeftView.h"
#include "MainFrm.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
using namespace Views;
IMPLEMENT_DYNCREATE(CLeftView, CTreeView)
BEGIN_MESSAGE_MAP(CLeftView, CTreeView)
ON_WM_SIZE()
ON_WM_CREATE()
ON_NOTIFY_REFLECT(TVN_GETDISPINFO, &CLeftView::OnTvnGetdispinfo)
ON_NOTIFY_REFLECT(TVN_ENDLABELEDIT, &CLeftView::OnTvnEndlabeledit)
ON_NOTIFY_REFLECT(TVN_ITEMEXPANDED, &CLeftView::OnTvnItemexpanded)
ON_NOTIFY_REFLECT(TVN_SELCHANGED, &CLeftView::OnTvnSelchanged)
ON_COMMAND(ID_EDIT_DELETE, &CLeftView::OnEditDelete)
ON_UPDATE_COMMAND_UI(ID_EDIT_DELETE, &CLeftView::OnUpdateEditDelete)
ON_WM_CONTEXTMENU()
ON_WM_RBUTTONDOWN()
ON_NOTIFY_REFLECT(TVN_BEGINDRAG, &CLeftView::OnTvnBegindrag)
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONUP()
ON_COMMAND(ID_EDIT_RENAME, &CLeftView::OnEditRename)
ON_UPDATE_COMMAND_UI(ID_EDIT_RENAME, &CLeftView::OnUpdateEditRename)
ON_UPDATE_COMMAND_UI(ID_VIEW_UPONELEVEL, &CLeftView::OnUpdateViewUponelevel)
END_MESSAGE_MAP()
///////////////////////////////////////////////
///
///
///////////////////////////////////////////////
CLeftView::CLeftView():
m_bLDragging(FALSE)
, m_hDrag(NULL)
, m_hDrop(NULL)
, m_pDragImage(NULL)
{
m_nMask = TVIF_IMAGE | TVIF_PARAM | TVIF_SELECTEDIMAGE | TVIF_TEXT;
}
///////////////////////////////////////////////
///
///
///////////////////////////////////////////////
CLeftView::~CLeftView()
{
}
///////////////////////////////////////////////
///
///
///////////////////////////////////////////////
BOOL CLeftView::PreCreateWindow(CREATESTRUCT& cs)
{
cs.style |= TVS_HASLINES|TVS_HASBUTTONS|TVS_LINESATROOT|TVS_SHOWSELALWAYS|TVS_EDITLABELS;
return CTreeView::PreCreateWindow(cs);
}
///////////////////////////////////////////////
///
///
///////////////////////////////////////////////
void CLeftView::OnInitialUpdate()
{
CTreeView::OnInitialUpdate();
for(POSITION pos = GetDocument()->m_lstNodes.GetHeadPosition(); pos != NULL; )
Populate(NULL, GetDocument()->m_lstNodes.GetNext(pos));
}
///////////////////////////////////////////////
/// recursive populate function
///
///////////////////////////////////////////////
void CLeftView::Populate(HTREEITEM hParent, CCodeNode* pNode)
{
int nImage = 0;
if(pNode->m_nFolderType == nodeCode)
nImage = 1;
HTREEITEM hItem = GetTreeCtrl().InsertItem(m_nMask, LPSTR_TEXTCALLBACK, nImage, nImage, 0, 0, (LPARAM)pNode, hParent, TVI_LAST);
if(pNode->m_bExpanded)
GetTreeCtrl().Expand(hParent, TVE_EXPAND);
for(POSITION pos = pNode->m_lstChildren.GetHeadPosition(); pos != NULL; )
Populate(hItem, pNode->m_lstChildren.GetNext(pos));
}
#ifdef _DEBUG
///////////////////////////////////////////////
///
///
///////////////////////////////////////////////
void CLeftView::AssertValid() const
{
CTreeView::AssertValid();
}
///////////////////////////////////////////////
///
///
///////////////////////////////////////////////
void CLeftView::Dump(CDumpContext& dc) const
{
CTreeView::Dump(dc);
}
///////////////////////////////////////////////
///
///
///////////////////////////////////////////////
CCodezBankDoc* CLeftView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CCodezBankDoc)));
return (CCodezBankDoc*)m_pDocument;
}
#endif //_DEBUG
///////////////////////////////////////////////
///
///
///////////////////////////////////////////////
void Views::CLeftView::OnSize(UINT nType, int cx, int cy)
{
CTreeView::OnSize(nType, cx, cy);
AfxGetApp()->WriteProfileInt(SECTION_SETTINGS, KEY_TREEVIEW, cx);
}
///////////////////////////////////////////////
///
///
///////////////////////////////////////////////
int Views::CLeftView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CTreeView::OnCreate(lpCreateStruct) == -1)
return -1;
m_Image.Create(16, 16, ILC_MASK|ILC_COLOR24, 0, 1);
m_Image.Add(AfxGetApp()->LoadIcon(IDI_FOLDER));
m_Image.Add(AfxGetApp()->LoadIcon(IDI_CODE2));
GetTreeCtrl().SetImageList(&m_Image, TVSIL_NORMAL);
return 0;
}
///////////////////////////////////////////////
///
///
///////////////////////////////////////////////
void Views::CLeftView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)
{
CCodeNode* pNodeIn = reinterpret_cast<CCodeNode*>(pHint);
switch(lHint)
{
case hintNewFolder:
case hintNewSnippet:
AddNewFolder(pNodeIn);
break;
case hintSelTreeItem:
{
HTREEITEM hSel = GetTreeCtrl().GetSelectedItem();
if(hSel == NULL)
{
hSel = GetTreeCtrl().GetRootItem();
while(hSel)
{
DoSelect(hSel, pNodeIn);
hSel = GetTreeCtrl().GetNextSiblingItem(hSel);
}
}
else
{
DoSelect(hSel, pNodeIn);
}
}
break;
case hintSelFoundTreeItem:
{
HTREEITEM hSel = GetTreeCtrl().GetRootItem();
while(hSel)
{
DoSelect(hSel, pNodeIn);
hSel = GetTreeCtrl().GetNextSiblingItem(hSel);
}
}
break;
case hintUpOneLevel:
MoveUp();
break;
case hintNewRootFolder:
AddNewTopFolder(pNodeIn);
break;
case hintRepaintTree:
Invalidate();
break;
case hintRemoveItemFromTree:
{
HTREEITEM hSel = GetTreeCtrl().GetSelectedItem();
if(hSel == NULL)
{
hSel = GetTreeCtrl().GetRootItem();
while(hSel)
{
DoRemove(hSel, pNodeIn);
hSel = GetTreeCtrl().GetNextSiblingItem(hSel);
}
}
else
{
DoRemove(hSel, pNodeIn);
}
}
break;
case hintClearDocument:
GetTreeCtrl().DeleteAllItems();
break;
case hintReloadTree:
GetTreeCtrl().DeleteAllItems();
for(POSITION pos = GetDocument()->m_lstNodes.GetHeadPosition(); pos != NULL; )
Populate(NULL, GetDocument()->m_lstNodes.GetNext(pos));
break;
}
}
///////////////////////////////////////////////
///
///
///////////////////////////////////////////////
void CLeftView::AddNewFolder(CCodeNode* pNodeIn)
{
HTREEITEM hSel = GetTreeCtrl().GetSelectedItem();
if(hSel)
{
DWORD_PTR dwData = GetTreeCtrl().GetItemData(hSel);
CCodeNode* pNode = reinterpret_cast<CCodeNode*>(dwData);
pNode->m_lstChildren.AddTail(pNodeIn);
GetDocument()->UpdateAllViews(this, hintRefreshListView, pNode);
}
else
{
GetDocument()->m_lstNodes.AddTail(pNodeIn);
GetDocument()->UpdateAllViews(this, hintRefreshListView, NULL);
}
int nImage = 0;
if(pNodeIn->m_nFolderType == nodeCode)
nImage = 1;
HTREEITEM hItem = GetTreeCtrl().InsertItem(m_nMask, LPSTR_TEXTCALLBACK, nImage, nImage, 0, 0, (LPARAM)pNodeIn, hSel, TVI_LAST);
GetTreeCtrl().Expand(hSel, TVE_EXPAND);
GetTreeCtrl().Invalidate();
}
///////////////////////////////////////////////
///
///
///////////////////////////////////////////////
void CLeftView::AddNewTopFolder(CCodeNode* pNodeIn)
{
int nImage = 0;
if(pNodeIn->m_nFolderType == nodeCode)
nImage = 1;
GetDocument()->m_lstNodes.AddTail(pNodeIn);
HTREEITEM hItem = GetTreeCtrl().InsertItem(m_nMask, LPSTR_TEXTCALLBACK, nImage, nImage, 0, 0, (LPARAM)pNodeIn, NULL, TVI_ROOT);
GetTreeCtrl().Invalidate();
}
///////////////////////////////////////////////
///
///
///////////////////////////////////////////////
void Views::CLeftView::OnTvnGetdispinfo(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMTVDISPINFO pTVDispInfo = reinterpret_cast<LPNMTVDISPINFO>(pNMHDR);
CCodeNode* pNode = reinterpret_cast<CCodeNode*>(pTVDispInfo->item.lParam);
strcpy_s(pTVDispInfo->item.pszText, 260, pNode->m_strName);
*pResult = 0;
}
///////////////////////////////////////////////
///
///
///////////////////////////////////////////////
void Views::CLeftView::OnTvnEndlabeledit(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMTVDISPINFO pTVDispInfo = reinterpret_cast<LPNMTVDISPINFO>(pNMHDR);
CCodeNode* pNode = reinterpret_cast<CCodeNode*>(pTVDispInfo->item.lParam);
if(pTVDispInfo->item.pszText)
{
pNode->m_strName = pTVDispInfo->item.pszText;
pNode->Modify();
GetDocument()->SetModifiedFlag();
}
*pResult = 0;
}
///////////////////////////////////////////////
///
///
///////////////////////////////////////////////
void Views::CLeftView::OnTvnItemexpanded(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
CCodeNode* pNode = reinterpret_cast<CCodeNode*>(pNMTreeView->itemNew.lParam);
if(pNMTreeView->action == 1)
pNode->m_bExpanded = false;
else if(pNMTreeView->action == 2)
pNode->m_bExpanded = true;
*pResult = 0;
}
///////////////////////////////////////////////
///
///
///////////////////////////////////////////////
void Views::CLeftView::OnTvnSelchanged(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
*pResult = 0;
CCodeNode* pNode = reinterpret_cast<CCodeNode*>(pNMTreeView->itemNew.lParam);
if(!pNode)
return;
switch(pNode->m_nFolderType)
{
case nodeFolder:
Frame()->SwitchView(NULL);
GetDocument()->UpdateAllViews(this, hintRefreshListView, pNode);
break;
case nodeCode:
Frame()->SwitchView("Code");
GetDocument()->UpdateAllViews(this, hintRefreshCodeView, pNode);
break;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -