void IAction::update (bool updateLeftView, TUpdateRightView rightViewFlag, CGeorgesEditDoc &doc, const char *_FormName) { // Right and left view CGeorgesEditView *rightView = doc.getRightView (); nlassert (rightView); CLeftView *leftView = doc.getLeftView (); nlassert (leftView); // Update left view ? if (updateLeftView) doc.updateDocumentStructure (); // Set the current view.. uint subSelection = leftView->getCurrentSelectionId (); if (subSelection != _SelId) { doc.changeSubSelection (_SelId, NULL); return; } if (leftView->getCurrentSelectionId () == 1) { rightView->HeaderDialog.getFromDocument (*doc.getHeaderPtr ()); } else if (doc.isType ()) { rightView->TypeDialog.getFromDocument (*(doc.getTypePtr())); } else if (doc.isDfn ()) { rightView->DfnDialog.getFromDocument (*(doc.getDfnPtr())); } else if (doc.isForm ()) { if (rightViewFlag == DoNothing) { } else if (rightViewFlag == UpdateLabels) { rightView->FormDialog.updateLabels (); } else if (rightViewFlag == UpdateValues) { rightView->FormDialog.updateValues (); } else if (rightViewFlag == Redraw) { rightView->FormDialog.getFromDocument (); } } }
// --------------------------------------------------------------------------- void CGeorgesImpl::LineDown () { AFX_MANAGE_STATE(AfxGetStaticModuleState()); CMainFrame* pWnd = dynamic_cast< CMainFrame* >( theApp.m_pMainWnd ); CMDIChildWnd *pChild = pWnd->MDIGetActive (); if (pChild == NULL) return; // Get active document CGeorgesEditDoc *doc = (CGeorgesEditDoc *)pChild->GetActiveDocument (); if (doc) { // Get the left view CLeftView* pView = doc->getLeftView (); // Check type CGeorgesEditDocSub *subDoc = doc->getSelectedObject (); if (subDoc) { // 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 = doc->getRootNode (subDoc->getSlot ()); nlverify ( elm->getNodeByName (subDoc->getFormName ().c_str (), &parentDfn, indexDfn, &nodeDfn, &nodeType, &node, type, array, parentVDfnArray, true, NLGEORGES_FIRST_ROUND) ); // Is a type entry ? if ( (type == UFormDfn::EntryType) && !array ) { // Select next if ((subDoc->getIdInParent ()+1) < subDoc->getParent ()->getChildrenCount ()) doc->changeSubSelection (subDoc->getParent ()->getChild (subDoc->getIdInParent ()+1), pView); } } } }
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); }