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

📄 leftview.cpp

📁 CodezBank is just a small application that stores source code snippets organized in a hierarhichal m
💻 CPP
📖 第 1 页 / 共 2 页
字号:
////////////////////////////////////////////////////////////////////////////////
// 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 + -