📄 treeview.cpp
字号:
// Adds an item's data to a combobox (m_pCombo)
BOOL CJTITreeView::ShowItem()
{
CString strData(' ',(m_nLevel-1)*2);
CString strPad(' ',150);
CString strID;
// Indent the item based on its level
strID.Format("\t%d",m_tvItem.lParam);
if(m_nLevel > 0)
strData += m_tvItem.pszText+strPad+strID;
else strData = "** Active Group **"+strPad+strID;
m_pCombo->AddString(strData);
if(m_tvItem.lParam == m_nDefGroup)
m_pCombo->SelectString(-1,strData);
return(0);
}
// Deletes the specified item
BOOL CJTITreeView::ClearItem()
{
GROUPS& arrGroups = GetDocument()->GetGroups();
int nItem = m_tvItem.lParam;
// Zap the group's items
arrGroups[nItem].arrItems.SetSize(0);
// Reset the default clipboard monitoring group to zero if this
// group was currently the default group
if(GetDocument()->GetDefGroup() == nItem)
GetDocument()->SetDefGroup(0);
return(0);
}
// Builds a textual representation of the tree in the specified combobox
void CJTITreeView::DisplayTree(CComboBox *pCombo)
{
m_nLevel = 0;
m_pCombo = pCombo;
m_nDefGroup = GetDocument()->GetDefGroup();
RecurseItem(m_pTree->GetRootItem(),ShowItem);
}
// Deletes the specified tree node along with each of its child nodes
void CJTITreeView::ClearTree(HTREEITEM htreeItem)
{
m_nLevel = 0;
RecurseItem(htreeItem,ClearItem);
}
// Saves the tree to the specified archive
void CJTITreeView::SaveTree(CArchive& ar, int *pMap, HTREEITEM htreeStart)
{
m_pArchive = &ar;
m_nLevel = 0;
m_nIndex = 0;
m_pMap = pMap;
BYTE byCount = m_pTree->GetCount();
ar.Write(&byCount,sizeof(byCount));
if(!htreeStart)
htreeStart = m_pTree->GetRootItem();
RecurseItem(htreeStart,ArchiveItem);
}
// Loads the tree from the specified archive
int CJTITreeView::LoadTree(CArchive& ar, BOOL bReset)
{
GROUPS& arrGroups = GetDocument()->GetGroups();
char szTitle[500];
BYTE byLen, byImage;
int nNewLevel, nCurrLevel = 0;
HTREEITEM htreeParent = NULL;
TV_INSERTSTRUCT tvstruct;
BYTE byCount;
// Clear the tree
if(bReset)
m_pTree->DeleteAllItems();
// Get and set the group count
ar.Read(&byCount,sizeof(byCount));
if(bReset)
{
arrGroups.SetSize(0);
m_nGroupCount = 0;
}
// Iterate through the items
for(BYTE i = 0; i < byCount; i++)
{
CGroup Group;
// Create place-holder for the group
arrGroups.Add(Group);
// Read an item
ar.Read(&nNewLevel,sizeof(nNewLevel));
ar.Read(&byImage,sizeof(byImage));
ar.Read(&byLen,sizeof(byLen));
ar.Read(szTitle,byLen);
szTitle[byLen] = '\0';
// Is this item at a parent level of last item we inserted?
if(nNewLevel < nCurrLevel)
{
int nTemp = nCurrLevel;
// Yes...figure out how many levels back it should be
while(nTemp >= nNewLevel)
{
htreeParent = m_pTree->GetParentItem(htreeParent);
nTemp--;
}
}
else
{
// No...this item is a sibling so let's assign the same
// parent as the last item we inserted
if(nNewLevel == nCurrLevel)
htreeParent = m_pTree->GetParentItem(htreeParent);
}
// Save the new level
nCurrLevel = nNewLevel;
// Insert the new item and save its item handle
tvstruct.hParent = htreeParent;
tvstruct.hInsertAfter = TVI_LAST;
tvstruct.item.iImage = byImage;
tvstruct.item.iSelectedImage = byImage;
tvstruct.item.pszText = szTitle;
tvstruct.item.lParam = i;
tvstruct.item.mask = TVIF_IMAGE|TVIF_SELECTEDIMAGE|TVIF_TEXT|TVIF_PARAM;
htreeParent = m_pTree->InsertItem(&tvstruct);
}
// Expand the root item
m_pTree->Expand(m_pTree->GetRootItem(),TVE_EXPAND);
// Save the global group count
m_nGroupCount += byCount;
return(byCount);
}
// Terminate drag/drop with ESCAPE key
void CJTITreeView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
if(nChar == VK_ESCAPE && m_bDragging)
{
m_pImageList->DragLeave(this);
m_pImageList->EndDrag();
ReleaseCapture();
KillTimer(1);
m_bDragging = FALSE;
m_pTree->SelectDropTarget(NULL);
}
else CTreeView::OnKeyDown(nChar, nRepCnt, nFlags);
}
// Adds a group to the tree
void CJTITreeView::OnAddItem()
{
CJTIGrpPropDlg dlgProp;
dlgProp.SetTitle("Add Group");
// Display the add dialog
if(dlgProp.DoModal() == IDOK)
{
HTREEITEM htreeParent = m_pTree->GetSelectedItem();
HTREEITEM htreeItem = m_pTree->InsertItem(dlgProp.GetDescription(),
1,1,htreeParent,TVI_FIRST);
m_pTree->SetItemData(htreeItem,m_nGroupCount++);
GROUPS& arrGroups = GetDocument()->GetGroups();
CGroup group;
arrGroups.Add(group);
GetDocument()->SetModifiedFlag(TRUE);
GetDocument()->SaveModified();
m_pTree->Expand(m_pTree->GetRootItem(),TVE_EXPAND);
m_pTree->Expand(htreeParent,TVE_EXPAND);
}
}
// Deletes the selected item from the tree
void CJTITreeView::OnDeleteItem()
{
if(AfxMessageBox(IDS_DELETE_GROUP,MB_ICONQUESTION|MB_YESNOCANCEL) == IDYES)
{
HTREEITEM htreeItem = m_pTree->GetSelectedItem();
// Remove all items for the associated group and sub-groups
ClearTree(htreeItem);
// Reset the default clipboard monitoring group to zero if this
// group was currently the default group
int nItem = m_pTree->GetItemData(htreeItem);
if(GetDocument()->GetDefGroup() == nItem)
GetDocument()->SetDefGroup(0);
// Remove the group from the tree too
m_pTree->DeleteItem(htreeItem);
GetDocument()->SetModifiedFlag(TRUE);
GetDocument()->SaveModified();
}
}
// Handles enabling the delete menu item
void CJTITreeView::OnUpdateDeleteItem(CCmdUI* pCmdUI)
{
// Must have an item selected and it can't be the root item
pCmdUI->Enable((m_pTree->GetSelectedItem() != m_pTree->GetRootItem())
&& m_pTree->GetSelectedItem());
}
// Displays the group context menu
void CJTITreeView::ShowMenu(CPoint point)
{
CMenu menu;
menu.LoadMenu(IDR_TREEMENU);
CMenu *pPopup = menu.GetSubMenu(0);
SetFocus();
pPopup->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_RIGHTBUTTON,
point.x,point.y,GetParentFrame(),NULL);
}
// Handles the right-click button
void CJTITreeView::OnRclick(NMHDR* pNMHDR, LRESULT* pResult)
{
CPoint pt, ptTemp;
GetCursorPos(&pt);
unsigned int nFlags;
ptTemp = pt;
ScreenToClient(&ptTemp);
HTREEITEM htreeItem = m_pTree->HitTest(ptTemp,&nFlags);
if(htreeItem)
m_pTree->SelectItem(htreeItem);
ShowMenu(pt);
*pResult = 0;
}
// Displays the group properties dialogbox
void CJTITreeView::OnItemProperties()
{
CJTIGrpPropDlg dlgProp;
HTREEITEM htreeItem = m_pTree->GetSelectedItem();
m_pTree->GetItemText(htreeItem);
dlgProp.SetDescription(m_pTree->GetItemText(htreeItem));
if(dlgProp.DoModal() == IDOK)
{
m_pTree->SetItemText(htreeItem,dlgProp.GetDescription());
GetDocument()->SetModifiedFlag(TRUE);
GetDocument()->SaveModified();
}
}
// Handles enabling the group properties menu item
void CJTITreeView::OnUpdateItemProperties(CCmdUI* pCmdUI)
{
pCmdUI->Enable((m_pTree->GetSelectedItem() != m_pTree->GetRootItem()));
}
// Called when the selection changes in the group tree
void CJTITreeView::OnSelChanged(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
int nGroup = pNMTreeView->itemNew.lParam;
// Notify the link list that it needs to update itself
CMainFrame *pFrame = (CMainFrame *) GetParentFrame();
pFrame->GetList()->PostMessage(UM_GROUP_CHANGED,nGroup);
*pResult = 0;
}
// Disables Copy menu item
void CJTITreeView::OnUpdateEditCopy(CCmdUI* pCmdUI)
{
pCmdUI->Enable(FALSE);
}
// Disables Cut menu item
void CJTITreeView::OnUpdateEditCut(CCmdUI* pCmdUI)
{
pCmdUI->Enable(FALSE);
}
// Disables Paste menu item
void CJTITreeView::OnUpdateEditPaste(CCmdUI* pCmdUI)
{
pCmdUI->Enable(FALSE);
}
void CJTITreeView::OnEditCopy()
{
}
// Called to handle keyboard shortcuts
BOOL CJTITreeView::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message == WM_KEYUP)
{
if(m_pTree->GetSelectedItem())
{
switch(pMsg->wParam)
{
// Insert key adds group
case VK_INSERT:
OnAddItem();
return(TRUE);
// Delete key deletes group
case VK_DELETE:
if(m_pTree->GetSelectedItem() != m_pTree->GetRootItem())
OnDeleteItem();
return(TRUE);
}
}
}
return CTreeView::PreTranslateMessage(pMsg);
}
// Handles Paste Default context menu item
void CJTITreeView::OnPasteDefault()
{
HTREEITEM htreeItem = m_pTree->GetSelectedItem();
int nGroup = m_pTree->GetItemData(htreeItem);
// Make selected group the default paste group
if(nGroup == nGroup == GetDocument()->GetDefGroup())
nGroup = 0;
GetDocument()->SetDefGroup(nGroup);
GetDocument()->SetModifiedFlag(TRUE);
GetDocument()->SaveModified();
}
// Handles enabling Default Paste Group menu item
void CJTITreeView::OnUpdatePasteDefault(CCmdUI* pCmdUI)
{
HTREEITEM htreeItem = m_pTree->GetSelectedItem();
int nGroup = m_pTree->GetItemData(htreeItem);
pCmdUI->Enable(nGroup > 0);
if(nGroup > 0)
pCmdUI->SetCheck(nGroup == GetDocument()->GetDefGroup());
}
// Handles the Move Down menu item
void CJTITreeView::OnMoveDown()
{
HTREEITEM htreeItem = m_pTree->GetSelectedItem();
// Move the item down one position in the group
HTREEITEM htreeNewItem = MoveNode(htreeItem,m_pTree->GetParentItem(htreeItem),
m_pTree->GetNextSiblingItem(htreeItem));
m_pTree->DeleteItem(htreeItem);
m_pTree->SelectItem(htreeNewItem);
GetDocument()->SetModifiedFlag(TRUE);
GetDocument()->SaveModified();
}
// Handles enabling the Move Down menu item
void CJTITreeView::OnUpdateMoveDown(CCmdUI* pCmdUI)
{
BOOL bEnable = FALSE;
HTREEITEM htreeItem = m_pTree->GetSelectedItem();
if(htreeItem && htreeItem != m_pTree->GetRootItem() && m_pTree->GetNextSiblingItem(htreeItem))
bEnable = TRUE;
pCmdUI->Enable(bEnable);
}
// Handles the Move Up menu item
void CJTITreeView::OnMoveUp()
{
HTREEITEM htreeItem = m_pTree->GetSelectedItem();
HTREEITEM htreeSibling = m_pTree->GetPrevSiblingItem(htreeItem);
htreeSibling = m_pTree->GetPrevSiblingItem(htreeSibling);
if(!htreeSibling)
htreeSibling = TVI_FIRST;
// Move the item up one postion in the group
HTREEITEM htreeNewItem = MoveNode(htreeItem,m_pTree->GetParentItem(htreeItem),htreeSibling);
m_pTree->DeleteItem(htreeItem);
m_pTree->SelectItem(htreeNewItem);
GetDocument()->SetModifiedFlag(TRUE);
GetDocument()->SaveModified();
}
// Handles enabling the Move Up menu item
void CJTITreeView::OnUpdateMoveUp(CCmdUI* pCmdUI)
{
BOOL bEnable = FALSE;
HTREEITEM htreeItem = m_pTree->GetSelectedItem();
if(htreeItem && htreeItem != m_pTree->GetRootItem() && m_pTree->GetPrevSiblingItem(htreeItem))
bEnable = TRUE;
pCmdUI->Enable(bEnable);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -