📄 pmarkupdemoview.cpp
字号:
m_edit.SetFocus();
return 0;
}
HTREEITEM CPMarkupDemoView::AddElemToTree(HTREEITEM hParentItem)
{
HTREEITEM hItem;
hItem = m_tree.InsertItem( m_pXML->GetTagName(), hParentItem );
m_tree.SetItemData( hItem, 0 );
return hItem;
}
BOOL CPMarkupDemoView::ElemHasSubItems()
{
BOOL bElemHasSubItems = FALSE;
if ( m_pXML->FindChildElem() || ! m_pXML->GetChildData().IsEmpty() )
bElemHasSubItems = TRUE;
return bElemHasSubItems;
}
BOOL CPMarkupDemoView::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
// NMHDR is { HWND hwndFrom; UINT idFrom; UINT code; }
NMHDR* pNMHDR = (NMHDR*)lParam;
// Double-click on tree
if ( pNMHDR->code == NM_DBLCLK && pNMHDR->idFrom == IDC_MARKUP_TREE )
{
if ( m_tree.GetSelectedItem() )
{
OnMarkupFind();
// Message handled
*pResult = 0;
return TRUE;
}
}
// Right-click on tree
if ( pNMHDR->code == NM_RCLICK && pNMHDR->idFrom == IDC_MARKUP_TREE )
{
// Create popup menu
// From resource, use menu.LoadMenu( IDR_MARKUPTREE );
// and menu.GetSubMenu(0)->TrackPopupMenu()
CMenu menu;
UINT nFlags = MF_STRING;
BOOL bShowMenu = TRUE;
DWORD dwPos = GetMessagePos();
CPoint point(LOWORD(dwPos), HIWORD(dwPos));
ScreenToClient(&point);
if ( GetDocument()->IsParsed() )
{
// Determine item right-clicked on
HTREEITEM hItem = m_tree.HitTest( point );
if ( hItem )
{
// Select item clicked on
m_tree.SelectItem( hItem );
// Is it an attribute?
BOOL bIsAttrib = m_tree.GetItemData( hItem );
// Is this the root element or root element attribute?
BOOL bRootElem = FALSE;
HTREEITEM hParentItem = m_tree.GetParentItem( hItem );
if ( ! hParentItem ||
( ! m_tree.GetParentItem(hParentItem) && m_tree.GetItemData(hItem)==1 ) )
bRootElem = TRUE;
menu.CreatePopupMenu();
if ( bIsAttrib )
{
menu.AppendMenu( nFlags, ID_MARKUP_FIND, _T("&Find Elem") );
menu.AppendMenu( nFlags, ID_MARKUP_ADD_ATTRIB, _T("Add A&ttrib") );
}
else
{
menu.AppendMenu( nFlags, ID_MARKUP_FIND, _T("&Find Elem") );
if ( ! bRootElem )
menu.AppendMenu( nFlags, ID_MARKUP_ADD, _T("&Add Elem") );
menu.AppendMenu( nFlags, ID_MARKUP_ADD_CHILD, _T("Add &Child Elem") );
menu.AppendMenu( nFlags, ID_MARKUP_ADD_ATTRIB, _T("Add A&ttrib") );
}
}
else
bShowMenu = FALSE;
}
else
{
menu.CreatePopupMenu();
menu.AppendMenu( nFlags, ID_FILE_PARSE, _T("&Parse") );
}
if ( bShowMenu )
{
// Run popup menu
ClientToScreen(&point);
menu.TrackPopupMenu(
TPM_LEFTALIGN , point.x, point.y, this );
}
// Message handled
*pResult = 0;
return TRUE;
}
// Expand item in tree
if ( pNMHDR->code == TVN_ITEMEXPANDING && pNMHDR->idFrom == IDC_MARKUP_TREE )
{
NMTREEVIEW* pnmtv = (NMTREEVIEW*)pNMHDR;
if ( pnmtv->action & TVE_EXPAND )
{
// Is the child empty?
HTREEITEM hParentItem = pnmtv->itemNew.hItem;
HTREEITEM hItem = m_tree.GetChildItem( hParentItem );
if ( hItem && m_tree.GetItemText( hItem ).IsEmpty() )
{
// Remove blank child
m_tree.DeleteItem( hItem );
// Add attribs and child elements to tree
SetPos( hParentItem );
while ( m_pXML->FindChildElem() )
{
// Go into child
m_pXML->IntoElem();
// Add to tree control
hItem = AddElemToTree( hParentItem );
// Create empty child under it, if it has data, attribs, or children
if ( ElemHasSubItems() )
m_tree.InsertItem( _T(""), hItem );
// Back to parent to find next child
m_pXML->OutOfElem();
}
}
}
}
if ( pNMHDR->code == GN_CONTEXTMENU && pNMHDR->idFrom == IDC_MARKUP_TREE )
{
// Create popup menu
// From resource, use menu.LoadMenu( IDR_MARKUPTREE );
// and menu.GetSubMenu(0)->TrackPopupMenu()
CMenu menu;
UINT nFlags = MF_STRING;
BOOL bShowMenu = TRUE;
DWORD dwPos = GetMessagePos();
CPoint point(LOWORD(dwPos), HIWORD(dwPos));
ScreenToClient(&point);
if ( GetDocument()->IsParsed() )
{
// Determine item right-clicked on
HTREEITEM hItem = m_tree.HitTest( point );
if ( hItem )
{
// Select item clicked on
m_tree.SelectItem( hItem );
// Is it an attribute?
BOOL bIsAttrib = m_tree.GetItemData( hItem );
// Is this the root element or root element attribute?
BOOL bRootElem = FALSE;
HTREEITEM hParentItem = m_tree.GetParentItem( hItem );
if ( ! hParentItem ||
( ! m_tree.GetParentItem(hParentItem) && m_tree.GetItemData(hItem)==1 ) )
bRootElem = TRUE;
menu.CreatePopupMenu();
if ( bIsAttrib )
{
menu.AppendMenu( nFlags, ID_MARKUP_FIND, _T("&Find Elem") );
menu.AppendMenu( nFlags, ID_MARKUP_ADD_ATTRIB, _T("Add A&ttrib") );
}
else
{
menu.AppendMenu( nFlags, ID_MARKUP_FIND, _T("&Find Elem") );
if ( ! bRootElem )
menu.AppendMenu( nFlags, ID_MARKUP_ADD, _T("&Add Elem") );
menu.AppendMenu( nFlags, ID_MARKUP_ADD_CHILD, _T("Add &Child Elem") );
menu.AppendMenu( nFlags, ID_MARKUP_ADD_ATTRIB, _T("Add A&ttrib") );
}
}
else
bShowMenu = FALSE;
}
else
{
menu.CreatePopupMenu();
menu.AppendMenu( nFlags, ID_FILE_PARSE, _T("&Parse") );
}
if ( bShowMenu )
{
// Run popup menu
ClientToScreen(&point);
menu.TrackPopupMenu(
TPM_LEFTALIGN , point.x, point.y, this );
}
// Message handled
*pResult = 0;
return TRUE;
}
return CView::OnNotify(wParam, lParam, pResult);
}
void CPMarkupDemoView::OnMarkupFind()
{
if ( GetDocument()->IsParsed() )
{
HTREEITEM hItem = m_tree.GetSelectedItem();
if ( hItem )
{
// Select element
SetPos( hItem );
int nStart, nEnd;
GetDocument()->m_doc.GetOffsets( nStart, nEnd );
m_edit.SetSel( nStart, nEnd + 1 );
// Edit control must have focus to display selection
// Post message so that it gets focus after current message is complete
PostMessage( WM_APP );
}
}
}
void CPMarkupDemoView::OnMarkupAdd()
{
if ( GetDocument()->IsParsed() )
{
HTREEITEM hItem = m_tree.GetSelectedItem();
if ( hItem )
{
// Add a new element to the document
SetPos( hItem );
CString csName = m_pXML->GetTagName();
m_pXML->AddElem( csName );
// Add item to tree
HTREEITEM hParentItem = m_tree.GetParentItem( hItem );
hItem = m_tree.InsertItem( csName, hParentItem, hItem );
m_tree.SetItemData( hItem, 0 );
// Set document in edit window
SetEditTextFromDoc();
}
}
}
void CPMarkupDemoView::OnMarkupAddChild()
{
if ( GetDocument()->IsParsed() )
{
HTREEITEM hParentItem = m_tree.GetSelectedItem();
if ( hParentItem )
{
// Find last child position
HTREEITEM hItem = m_tree.GetChildItem( hParentItem );
HTREEITEM hItemSet = hParentItem;
BOOL bChild = FALSE;
while ( hItem )
{
hItemSet = hItem;
bChild = TRUE;
hItem = m_tree.GetNextSiblingItem( hItem );
}
SetPos( hItemSet, bChild );
// Add a new element to the document
CString csName = _T("ChildOf") + m_pXML->GetTagName();
m_pXML->AddChildElem( csName );
// Add item to tree
hItem = m_tree.InsertItem( csName, hParentItem );
m_tree.SetItemData( hItem, 0 );
m_tree.Expand( hParentItem, TVE_EXPAND );
// Set document in edit window
SetEditTextFromDoc();
}
}
}
void CPMarkupDemoView::OnMarkupAddAttrib()
{
if ( GetDocument()->IsParsed() )
{
HTREEITEM hItem = m_tree.GetSelectedItem();
if ( hItem )
{
// Add a new attrib to the element
SetPos( hItem );
++m_nAddAttrib;
CString csAttribName;
csAttribName.Format( _T("attrib%d"), m_nAddAttrib );
CString csAttribValue;
csAttribValue.Format( _T("val%d"), m_nAddAttrib );
m_pXML->AddAttrib( csAttribName, csAttribValue );
// If selected item is attribute, get element item
if ( m_tree.GetItemData(hItem) == 1 )
hItem = m_tree.GetParentItem( hItem );
// Determine last attribute item
HTREEITEM hAttribItem = TVI_FIRST;
HTREEITEM hNextChildItem = m_tree.GetChildItem( hItem );
// Make sure its not an unexpanded tree item already having children
if ( ! hNextChildItem || ! m_tree.GetItemText(hNextChildItem).IsEmpty() )
{
while ( hNextChildItem && m_tree.GetItemData( hNextChildItem ) == 1 )
{
hAttribItem = hNextChildItem;
hNextChildItem = m_tree.GetNextSiblingItem( hNextChildItem );
}
}
m_tree.Expand( hItem, TVE_EXPAND );
// Set document in edit window
SetEditTextFromDoc();
}
}
}
void CPMarkupDemoView::OnEditCopy()
{
m_edit.Copy();
}
void CPMarkupDemoView::OnEditCut()
{
m_edit.Cut();
}
void CPMarkupDemoView::OnEditPaste()
{
m_edit.Paste();
}
void CPMarkupDemoView::OnEditUndo()
{
m_edit.Undo();
}
void CPMarkupDemoView::OnUpdateEditUndo(CCmdUI* pCmdUI)
{
pCmdUI->Enable( m_edit.CanUndo() );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -