📄 prjtreec.cpp
字号:
#include "stdafx.h"
#include "editcmd.h"
#include "resource.h"
#include "prjtreec.h"
#include "sheetpls.h"
#include "registry.h"
#include "editpad.h"
#include "wm.h"
#include "filesup.h"
#include "edfopdlg.h"
#include "edfaddlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define ICON_WIDTH 16
#define ICON_HEIGHT 16
#define STATUS_WIDTH ICON_WIDTH
#define STATUS_HEIGHT ICON_HEIGHT
#define TEXT_DELTA 2
#pragma warning ( disable : 4711 )
/////////////////////////////////////////////////////////////////////////////
// CProjectTreeCtrl
CProjectTreeCtrl::CProjectTreeCtrl () : m_dwLayout (0)
{
}
CProjectTreeCtrl:: ~ CProjectTreeCtrl ()
{
}
BOOL CProjectTreeCtrl::ExpandItem (HTREEITEM hItem, UINT nCode)
{
if (Expand (hItem, nCode))
{
int iNormal, iSelected;
if (GetItemState (hItem, TVIS_EXPANDED) & TVIS_EXPANDED)
{
if (GetItemImage (hItem, iNormal, iSelected) && iNormal == 2)
SetItemImage (hItem, 3, 3);
}
else
{
if (GetItemImage (hItem, iNormal, iSelected) && iNormal == 3)
SetItemImage (hItem, 2, 2);
}
return TRUE;
}
return FALSE;
}
HTREEITEM CProjectTreeCtrl::InsertFile (LPCTSTR lpszItem, int nImage, int nSelectedImage, LPARAM lParam, HTREEITEM hParent)
{
HTREEITEM hItem = GetNextItem (hParent, TVGN_CHILD), hAfter = TVI_FIRST;
CProjectItem *pItem;
while (hItem)
{
pItem = (CProjectItem*) GetItemData (hItem);
if (pItem->dwType & PI_FILE)
break;
hAfter = hItem;
hItem = GetNextItem (hItem, TVGN_NEXT);
}
while (hItem)
{
pItem = (CProjectItem*) GetItemData (hItem);
if (_tcsicmp (GetItemText (hItem), lpszItem) > 0)
break;
hAfter = hItem;
hItem = GetNextItem (hItem, TVGN_NEXT);
}
if (!hItem)
hAfter = TVI_LAST;
return InsertItem (TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE|TVIF_PARAM, lpszItem, nImage, nSelectedImage, 0, 0, lParam, hParent, hAfter);
}
HTREEITEM CProjectTreeCtrl::InsertGroup (LPCTSTR lpszItem, int nImage, int nSelectedImage, LPARAM lParam, HTREEITEM hParent)
{
HTREEITEM hItem = GetNextItem (hParent, TVGN_CHILD), hAfter = TVI_FIRST;
CProjectItem *pItem;
while (hItem)
{
pItem = (CProjectItem*) GetItemData (hItem);
if ((pItem->dwType & PI_FILE) || _tcsicmp (GetItemText (hItem), lpszItem) > 0)
break;
hAfter = hItem;
hItem = GetNextItem (hItem, TVGN_NEXT);
}
return InsertItem (TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE|TVIF_PARAM, lpszItem, nImage, nSelectedImage, 0, 0, lParam, hParent, hAfter);
}
BOOL CProjectTreeCtrl::
Create (DWORD dwStyle, CRect rect, CWnd * pParentWnd, UINT nID)
{
if (m_dwLayout & PRJTREEC_HEADER)
{
rect.top += 15;
rect.bottom -= 15;
}
return CAppTreeCtrl::Create (dwStyle, rect, pParentWnd, nID);
}
static int GetItemIcon (LPCTSTR pszName)
{
int iIcon;
CString sExt = GetNameExt (pszName);
sExt.MakeLower ();
if (sExt == _T ("c"))
iIcon = 6;
else if (sExt == _T ("cc") || sExt == _T ("cpp") || sExt == _T ("cxx"))
iIcon = 7;
else if (sExt == _T ("def"))
iIcon = 8;
else if (sExt == _T ("h") || sExt == _T ("hpp") || sExt == _T ("hxx") || sExt == _T ("inl") || sExt == _T ("hm"))
iIcon = 9;
else if (sExt == _T ("rc") || sExt == _T ("rc2"))
iIcon = 10;
else if (sExt == _T ("ico") || sExt == _T ("bmp") || sExt == _T ("cur") || sExt == _T ("gif") || sExt == _T ("jpg"))
iIcon = 5;
else
iIcon = 4;
return iIcon;
}
void CProjectTreeCtrl::
PopulateItem (CProjectItem *pParent, HTREEITEM hParent)
{
CString sName;
CProjectItem *pItem;
POSITION pos = pParent->lstItems.GetHeadPosition ();
int iIcon;
while (pos)
{
pItem = pParent->lstItems.GetNext (pos);
sName = GetNameExt (pItem->sPath);
if (sName.IsEmpty ())
sName = _T ("Unnamed");
if (pItem->dwType & PI_FILE)
{
iIcon = GetItemIcon (pItem->sPath);
InsertFile (sName, iIcon, iIcon, (LPARAM) pItem, hParent);
}
else
PopulateItem (pItem, InsertGroup (sName, 2, 2, (LPARAM) pItem, hParent));
}
}
void CProjectTreeCtrl::
Populate ()
{
PopulateEmpty ();
if (!g_pProject)
return;
CString sName = GetName (g_pProject->sPath);
if (sName.IsEmpty ())
sName = _T ("Unnamed");
HTREEITEM hParent = InsertItem (TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE|TVIF_PARAM, sName, 0, 0, 0, 0, NULL, TVI_ROOT, TVI_FIRST), hItem;
CProjectItem *pItem;
int iIcon;
POSITION pos = g_pProject->lstItems.GetHeadPosition ();
while (pos)
{
pItem = g_pProject->lstItems.GetNext (pos);
sName = GetNameExt (pItem->sPath);
if (sName.IsEmpty ())
sName = _T ("Unnamed");
if (pItem->dwType & PI_ROOT)
if (pItem->dwType & PI_FILE) // pItem->lstItems.IsEmpty ())
{
iIcon = GetItemIcon (pItem->sPath);
InsertFile (sName, iIcon, iIcon, (LPARAM) pItem, hParent);
}
else
if (pItem->dwType & PI_SUBITEM)
{
hItem = InsertGroup (sName, 1, 1, (LPARAM) pItem, hParent);
PopulateItem (pItem, hItem);
// ExpandItem (hItem, TVE_EXPAND);
}
else
PopulateItem (pItem, InsertGroup (sName, 2, 2, (LPARAM) pItem, hParent));
}
ExpandItem (hParent, TVE_EXPAND);
m_listSelected.AddTail (hParent);
}
void CProjectTreeCtrl::
PopulateEmpty ()
{
m_listSelected.RemoveAll ();
DeleteAllItems ();
}
void CProjectTreeCtrl::
PopulateName ()
{
if (!g_pProject)
return;
CString sName = GetName (g_pProject->sPath);
if (sName.IsEmpty ())
sName = _T ("Unnamed");
SetItemText (GetRootItem (), sName);
}
void CProjectTreeCtrl::
Paint (void)
{
// Invalidate ();
// UpdateWindow ();
RedrawWindow ();
}
DWORD CProjectTreeCtrl::
GetLayout ()
{
return m_dwLayout;
}
void CProjectTreeCtrl::
SetLayout (DWORD dwLayout)
{
if (m_dwLayout != dwLayout)
{
m_dwLayout = dwLayout;
if (!(m_dwLayout & PRJTREEC_HEADER) && ::IsWindow (m_ctlHeader.GetSafeHwnd ()))
{
m_ctlHeader.DestroyWindow ();
}
Invalidate ();
}
}
void CProjectTreeCtrl::
MakeColumns ()
{
if (m_dwLayout & PRJTREEC_HEADER)
{
CRect rect;
GetWindowRect (rect);
rect.right -= rect.left;
rect.bottom -= rect.top;
rect.left = rect.top =0;
m_ctlHeader.m_pctlTree = this;
rect.top = 0;
rect.bottom = 17;
if (!m_ctlHeader.Create (WS_CHILD | WS_VISIBLE, rect, GetParent (), GetDlgCtrlID () + 1))
{
return;
}
m_ctlHeader.FlatHeader ();
CString sName0 = _T ("Name"), sName1 = _T ("Description");
LPCTSTR pszName = REGISTRY_ROOT _T ("ProjectTree");
int nWidth0 = 200, nWidth1 = 250;
RegLoadNumber (HKEY_CURRENT_USER, pszName, sName0, (DWORD*) &nWidth0);
RegLoadNumber (HKEY_CURRENT_USER, pszName, sName1, (DWORD*) &nWidth1);
HDITEM item;
item.mask = HDI_TEXT | HDI_FORMAT | HDI_WIDTH;
item.fmt = HDF_LEFT;
item.cxy = nWidth0;
item.pszText = (LPTSTR) (LPCTSTR) sName0;
m_ctlHeader.InsertItem (0, &item);
item.cxy = nWidth1;
item.pszText = (LPTSTR) (LPCTSTR) sName1;
m_ctlHeader.InsertItem (1, &item);
// m_ctlHeader.RefreshItemRectCache ();
}
}
BEGIN_MESSAGE_MAP (CProjectTreeCtrl, CAppTreeCtrl)
//{{AFX_MSG_MAP( CProjectTreeCtrl )
ON_NOTIFY_REFLECT (TVN_BEGINLABELEDIT, OnBeginLabelEdit)
ON_NOTIFY_REFLECT (TVN_ENDLABELEDIT, OnEndLabelEdit)
ON_NOTIFY_REFLECT (TVN_ITEMEXPANDED, OnItemExpanded)
ON_NOTIFY_REFLECT (TVN_SELCHANGED, OnSelectionChanged)
ON_WM_CREATE ()
ON_WM_DESTROY ()
ON_WM_LBUTTONDBLCLK ()
ON_WM_PAINT ()
ON_WM_LBUTTONDOWN ()
ON_WM_LBUTTONUP ()
ON_WM_RBUTTONDOWN ()
ON_WM_RBUTTONUP ()
ON_WM_SIZE ()
ON_MESSAGE (WM_APPEND_MENU, OnAppendMenu)
ON_MESSAGE (WM_PROCESS_MENU, OnProcessMenu)
ON_MESSAGE (WM_APPEND_PROPS, OnAppendProps)
ON_COMMAND(ID_PROPERTIES, OnProperties)
ON_COMMAND(ID_OPEN, OnOpen)
ON_COMMAND(ID_NEW_FILE, OnNewFile)
ON_COMMAND(ID_NEW_GROUP, OnNewGroup)
ON_COMMAND(ID_ADD_FILE, OnAddFile)
ON_COMMAND(ID_REMOVE_ITEM, OnRemoveItem)
ON_COMMAND(ID_ITEM_PROPERTIES, OnItemProperties)
ON_COMMAND(ID_RENAME_ITEM, OnRenameItem)
ON_COMMAND(ID_REFRESH, OnRefresh)
//}}AFX_MSG_MAP
// ON_MESSAGE (TVM_HITTEST, OnHitTest)
// ON_WM_TIMER ()
END_MESSAGE_MAP ()
/////////////////////////////////////////////////////////////////////////////
// CProjectTreeCtrl message handlers
void CProjectTreeCtrl::
OnSelectionChanged (NMHDR * pNMHDR, LRESULT * pResult)
{
TV_DISPINFO *pTVDispInfo = (TV_DISPINFO *) pNMHDR;
*pResult = 0;
}
void CProjectTreeCtrl::
OnBeginLabelEdit (NMHDR * pNMHDR, LRESULT * pResult)
{
TV_DISPINFO *pTVDispInfo = (TV_DISPINFO *) pNMHDR;
CProjectItem *pItem = (CProjectItem*) GetItemData (pTVDispInfo->item.hItem);
*pResult = !(pItem && (pItem->dwType & PI_GROUP) && !(pItem->dwType & PI_SUBITEM));
}
void CProjectTreeCtrl::
OnEndLabelEdit (NMHDR * pNMHDR, LRESULT * pResult)
{
TV_DISPINFO *pTVDispInfo = (TV_DISPINFO *) pNMHDR;
CProjectItem *pItem = (CProjectItem*) GetItemData (pTVDispInfo->item.hItem);
if (pItem && (pItem->dwType & PI_GROUP) && !(pItem->dwType & PI_SUBITEM))
{
SetItemText (pTVDispInfo->item.hItem, pItem->sPath = pTVDispInfo->item.pszText);
ASSERT (g_pProject);
g_pProject->SetModified ();
}
CWnd *pWnd = AfxGetMainWnd ();
pWnd->SetForegroundWindow ();
pWnd->SetFocus ();
}
void CProjectTreeCtrl::
OnItemExpanded (NMHDR * pNMHDR, LRESULT * pResult)
{
NM_TREEVIEW *pNMTreeView = (NM_TREEVIEW *) pNMHDR;
if (GetItemState (pNMTreeView->itemNew.hItem, TVIS_EXPANDED) & TVIS_EXPANDED)
{
int iNormal, iSelected;
if (GetItemImage (pNMTreeView->itemNew.hItem, iNormal, iSelected) && iNormal == 2)
SetItemImage (pNMTreeView->itemNew.hItem, 3, 3);
}
else
{
int iNormal, iSelected;
if (GetItemImage (pNMTreeView->itemNew.hItem, iNormal, iSelected) && iNormal == 3)
SetItemImage (pNMTreeView->itemNew.hItem, 2, 2);
}
*pResult = 0;
}
int CProjectTreeCtrl::
OnCreate (LPCREATESTRUCT lpCreateStruct)
{
if (CAppTreeCtrl::OnCreate (lpCreateStruct) == -1)
return -1;
m_objStatusImages.Create (IDB_PRJTREE, ICON_WIDTH, 0, RGB (0, 255, 0));
SetImageList (&m_objStatusImages, TVSIL_NORMAL);
return 0;
}
#pragma warning ( disable : 4100 )
void CProjectTreeCtrl::
OnPaint ()
{
CPaintDC dc (this); // device context for painting
CWnd::DefWindowProc(WM_PAINT, (WPARAM)dc.m_hDC, 0);
/*HTREEITEM hItem = GetFirstVisibleItem ();
int n = GetVisibleCount () + 1;
CRect rc, rc0, rc1;
CFont *pOldFont = NULL;
CFont normal;
LOGFONT lf;
GetFont ()->GetLogFont (&lf);
lf.lfWeight = FW_NORMAL;
normal.CreateFontIndirect (&lf);
pOldFont = dc.SelectObject (&normal);
CPen pen1 (PS_SOLID, 0,::GetSysColor (COLOR_BTNSHADOW)), pen2 (PS_SOLID, 0,::GetSysColor (COLOR_BTNFACE)),
pen3 (PS_SOLID, 0,::GetSysColor (COLOR_WINDOWTEXT)), *pOldPen = dc.SelectObject (&pen1);
CList < int, int >m_ext;
CString sText;
if (m_dwLayout & PRJTREEC_TABBEDCOLS)
{
if (m_dwLayout & PRJTREEC_HEADER)
{
VERIFY (m_ctlHeader.GetCachedItemRect (0, rc0));
VERIFY (m_ctlHeader.GetCachedItemRect (1, rc1));
}
else
{
rc0.SetRect (0, 0, 200, 0);
rc1.SetRect (200, 0, 550, 0);
}
}
while (hItem && n--)
{
CString sItem = GetItemText (hItem);
VERIFY (GetItemRect (hItem, &rc, TRUE));
rc.right++;
if (m_dwLayout & PRJTREEC_TABBEDCOLS)
{
if (rc0.right < rc.right + STATUS_WIDTH)
{
rc.right = rc0.right - STATUS_WIDTH;
}
}
UINT state = GetItemState (hItem, TVIS_SELECTED | TVIS_EXPANDED);
if (state & TVIS_SELECTED)
{
dc.SetTextColor (::GetSysColor (COLOR_HIGHLIGHTTEXT));
dc.SetBkColor (::GetSysColor (COLOR_HIGHLIGHT));
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -