void CLeftView::OnDelete() { // Get tree selection HTREEITEM item = TreeCtrl.GetSelectedItem (); if (item) { // Edit the label ? CEdit *edit = TreeCtrl.GetEditControl(); if (edit) { edit->SetWindowText (""); } else { // Get the sub object CGeorgesEditDocSub *subObject = (CGeorgesEditDocSub*)TreeCtrl.GetItemData (item); if (subObject) { // Editable ? if (subObject->isEditable ()) { // Get some information about the current node bool deleteInsert = false; // Is a form child ? CGeorgesEditDocSub *parent = subObject->getParent (); if (parent && parent->getType () == CGeorgesEditDocSub::Form) { // Does the node in the same form ? CGeorgesEditDoc *doc = GetDocument (); if (doc) { // Get the parent node const CFormDfn *parentDfn; uint indexDfn; const CFormDfn *nodeDfn; const CType *nodeType; CFormElm *parentNode; UFormDfn::TEntryType type; bool array; bool parentVDfnArray; CForm *form=doc->getFormPtr (); CFormElm *elm = (CFormElm *)doc->getRootNode (subObject->getSlot ()); nlverify ( elm->getNodeByName (parent->getFormName ().c_str (), &parentDfn, indexDfn, &nodeDfn, &nodeType, &parentNode, type, array, parentVDfnArray, true, NLGEORGES_FIRST_ROUND) ); // Is a non empty array ? if (array && parentNode) { // Document modified doc->modify (new CActionBuffer (IAction::FormArrayDelete, NULL, 0, *doc, subObject->getFormName ().c_str (), toString (subObject->getIdInParent ()).c_str (), doc->getLeftView ()->getCurrentSelectionId (), subObject->getSlot ())); } } } } } } } }
void CLeftView::OnEditCopy() { CGeorgesEditDoc *doc = (CGeorgesEditDoc*)GetDocument( ); if (doc) { // What is selected ? HTREEITEM item = TreeCtrl.GetSelectedItem (); if (item != NULL) { // Edit the label ? CEdit *edit = TreeCtrl.GetEditControl(); if (edit) { edit->SendMessage (WM_COPY); } else { // Get the sub data CGeorgesEditDocSub *subData = (CGeorgesEditDocSub*)TreeCtrl.GetItemData (item); if (subData) { // Get thte node type CGeorgesEditDocSub::TSub subType = subData->getType (); // Good type for copy ? if (subType == CGeorgesEditDocSub::Form) { theApp.SerialIntoMemStream (subData->getFormName ().c_str(), doc, subData->getSlot (), true); } } } } } }
void CLeftView::OnEditPaste() { CGeorgesEditDoc *doc = (CGeorgesEditDoc*)GetDocument( ); if (doc) { // What is selected ? HTREEITEM item = TreeCtrl.GetSelectedItem (); if (item != NULL) { // Edit the label ? CEdit *edit = TreeCtrl.GetEditControl(); if (edit) { edit->SendMessage (WM_PASTE); } else { // Get the sub data CGeorgesEditDocSub *subData = (CGeorgesEditDocSub*)TreeCtrl.GetItemData (item); if (subData) { // Get thte node type CGeorgesEditDocSub::TSub subType = subData->getType (); // Good type for copy ? if (subType == CGeorgesEditDocSub::Form) { // Document is modified by this view if (theApp.FillMemStreamWithClipboard (subData->getFormName ().c_str(), doc, subData->getSlot ())) { doc->modify (new CActionBuffer (IAction::FormPaste, theApp.MemStream.buffer (), theApp.MemStream.length(), *doc, subData->getFormName ().c_str(), "", doc->getLeftView ()->getCurrentSelectionId (), subData->getSlot ())); } } } } } } }
BOOL CLeftView::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult) { // Selection change ? NMHDR *pnmh = (LPNMHDR) lParam; switch (pnmh->code) { case TVN_BEGINLABELEDIT: { // Get tree selection LPNMTVDISPINFO ptvdi = (LPNMTVDISPINFO) lParam; if (ptvdi->item.hItem) { // Get the sub object CGeorgesEditDocSub *subObject = (CGeorgesEditDocSub*)TreeCtrl.GetItemData (ptvdi->item.hItem); if (subObject) { // Editable ? if (subObject->isEditable ()) { // Get some information about the current node bool deleteInsert = false; // Is a form child ? CGeorgesEditDocSub *parent = subObject->getParent (); if (parent && parent->getType () == CGeorgesEditDocSub::Form) { // Does the node in the same form ? CGeorgesEditDoc *doc = GetDocument (); if (doc) { // Get the parent node const CFormDfn *parentDfn; uint indexDfn; const CFormDfn *nodeDfn; const CType *nodeType; CFormElm *parentNode; UFormDfn::TEntryType type; bool array; bool parentVDfnArray; CForm *form=doc->getFormPtr (); CFormElm *elm = (CFormElm *)doc->getRootNode (subObject->getSlot ()); nlverify ( elm->getNodeByName (parent->getFormName ().c_str (), &parentDfn, indexDfn, &nodeDfn, &nodeType, &parentNode, type, array, parentVDfnArray, true, NLGEORGES_FIRST_ROUND) ); // Is a non empty array ? if (array && parentNode) { // Edit the tree *pResult = 0; return TRUE; } } } } } } *pResult = 1; return TRUE; } break; case TVN_ENDLABELEDIT: { // Get tree selection LPNMTVDISPINFO ptvdi = (LPNMTVDISPINFO) lParam; if (ptvdi->item.hItem) { // Get the sub object CGeorgesEditDocSub *subObject = (CGeorgesEditDocSub*)TreeCtrl.GetItemData (ptvdi->item.hItem); if (subObject) { // Editable ? if (subObject->isEditable ()) { // Get some information about the current node bool deleteInsert = false; // Is a form child ? CGeorgesEditDocSub *parent = subObject->getParent (); if (parent && parent->getType () == CGeorgesEditDocSub::Form) { // Does the node in the same form ? CGeorgesEditDoc *doc = GetDocument (); if (doc) { // Get the parent node const CFormDfn *parentDfn; uint indexDfn; const CFormDfn *nodeDfn; const CType *nodeType; CFormElm *parentNode; UFormDfn::TEntryType type; bool array; bool parentVDfnArray; CForm *form=doc->getFormPtr (); CFormElm *elm = (CFormElm *)doc->getRootNode (subObject->getSlot ()); nlverify ( elm->getNodeByName (parent->getFormName ().c_str (), &parentDfn, indexDfn, &nodeDfn, &nodeType, &parentNode, type, array, parentVDfnArray, true, NLGEORGES_FIRST_ROUND) ); // Is a non empty array ? if (array && parentNode && (ptvdi->item.mask & TVIF_TEXT)) { // Change the node name TreeCtrl.SetItemText (ptvdi->item.hItem, ptvdi->item.pszText); doc->modify (new CActionString (IAction::FormArrayRename, ptvdi->item.pszText, *doc, subObject->getFormName ().c_str (), toString (subObject->getIdInParent ()).c_str(), doc->getLeftView ()->getCurrentSelectionId (), subObject->getSlot ())); return TRUE; } } } } } } *pResult = 1; return TRUE; } break; case TVN_SELCHANGED: { LPNMTREEVIEW itemData = (LPNMTREEVIEW) lParam; // Unbold old item if (itemData->itemOld.hItem) TreeCtrl.SetItemState(itemData->itemOld.hItem, 0, TVIS_BOLD); CGeorgesEditDoc *doc = GetDocument(); if (doc) { CGeorgesEditDocSub *data = (CGeorgesEditDocSub *)TreeCtrl.GetItemData (itemData->itemNew.hItem); nlassert (data); doc->changeSubSelection (data, this); TreeCtrl.SetFocus (); } } break; case NM_RCLICK: { // Get item clicked TVHITTESTINFO tvhti; GetCursorPos(&tvhti.pt); ::ScreenToClient(TreeCtrl, &tvhti.pt); tvhti.flags = LVHT_NOWHERE; TreeView_HitTest(TreeCtrl, &tvhti); // Item clicked ? if(TVHT_ONITEM & tvhti.flags) { // Select the item if (TreeCtrl.GetSelectedItem ()) TreeCtrl.SetItemState(TreeCtrl.GetSelectedItem (), 0, TVIS_BOLD); TreeCtrl.SelectItem (tvhti.hItem); TreeCtrl.SetItemState(tvhti.hItem, TVIS_BOLD, TVIS_BOLD); // Get the sub object CGeorgesEditDocSub *subObject = (CGeorgesEditDocSub*)TreeCtrl.GetItemData (tvhti.hItem); if (subObject) { // Editable ? if (subObject->isEditable ()) { // Get some information about the current node bool deleteInsert = false; // Is a form child ? CGeorgesEditDocSub *parent = subObject->getParent (); if (parent && parent->getType () == CGeorgesEditDocSub::Form) { // Does the node in the same form ? CGeorgesEditDoc *doc = GetDocument (); if (doc) { // Get the node const CFormDfn *parentDfn; uint indexDfn; const CFormDfn *nodeDfn; const CType *nodeType; CFormElm *node; UFormDfn::TEntryType type; bool array; bool parentVDfnArray; CForm *form=doc->getFormPtr (); CFormElm *elm = (CFormElm *)doc->getRootNode (subObject->getSlot ()); nlverify ( elm->getNodeByName (parent->getFormName ().c_str (), &parentDfn, indexDfn, &nodeDfn, &nodeType, &node, type, array, parentVDfnArray, true, NLGEORGES_FIRST_ROUND) ); // Is the parent array ? deleteInsert = array; } } // Show right click menu // Create menu CMenu mainMenu; mainMenu.LoadMenu (IDR_LEFT_VIEW_CONTEXT); CMenu *popup = mainMenu.GetSubMenu (0); // Enable disable items popup->EnableMenuItem (4, MF_BYPOSITION|(deleteInsert?MF_ENABLED:MF_GRAYED)); popup->EnableMenuItem (5, MF_BYPOSITION|(deleteInsert?MF_ENABLED:MF_GRAYED)); popup->EnableMenuItem (6, MF_BYPOSITION|(deleteInsert?MF_ENABLED:MF_GRAYED)); ::ClientToScreen(TreeCtrl, &tvhti.pt); popup->TrackPopupMenu (TPM_LEFTALIGN | TPM_RIGHTBUTTON, tvhti.pt.x, tvhti.pt.y, this, NULL); } } } } break; } return CView::OnNotify(wParam, lParam, pResult); }