// Ryzom - MMORPG Framework
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see .
#include "stdafx.h"
#include "georges_edit.h"
#include "main_frm.h"
#include "georges_edit_doc.h"
#include "georges_edit_view.h"
#include "left_view.h"
#include "action.h"
using namespace std;
using namespace NLGEORGES;
using namespace NLMISC;
// ***************************************************************************
// CLeftView
// ***************************************************************************
IMPLEMENT_DYNCREATE(CLeftView, CView)
// ***************************************************************************
BEGIN_MESSAGE_MAP(CLeftView, CView)
//{{AFX_MSG_MAP(CLeftView)
ON_WM_SIZE()
ON_WM_SETFOCUS()
ON_COMMAND(ID_EDIT_COPY, OnEditCopy)
ON_COMMAND(ID_EDIT_PASTE, OnEditPaste)
ON_COMMAND(ID_EDIT_CUT, OnEditCut)
ON_COMMAND(ID_INSERT, OnInsert)
ON_COMMAND(ID_DELETE, OnDelete)
ON_COMMAND(ID_EDIT_REDO, OnEditRedo)
ON_UPDATE_COMMAND_UI(ID_EDIT_REDO, OnUpdateEditRedo)
ON_COMMAND(ID_EDIT_UNDO, OnEditUndo)
ON_UPDATE_COMMAND_UI(ID_EDIT_UNDO, OnUpdateEditUndo)
ON_COMMAND(ID_EDIT_RENAME, OnEditRename)
ON_COMMAND(ID_EDIT_FETCH1, OnEditFetch1)
ON_COMMAND(ID_EDIT_FETCH2, OnEditFetch2)
ON_COMMAND(ID_EDIT_FETCH3, OnEditFetch3)
ON_COMMAND(ID_EDIT_FETCH4, OnEditFetch4)
ON_COMMAND(ID_EDIT_HOLD1, OnEditHold1)
ON_COMMAND(ID_EDIT_HOLD2, OnEditHold2)
ON_COMMAND(ID_EDIT_HOLD3, OnEditHold3)
ON_COMMAND(ID_EDIT_HOLD4, OnEditHold4)
ON_WM_KEYDOWN()
ON_COMMAND(ID_EDIT_COLLAPSEALL, OnEditCollapseall)
ON_COMMAND(ID_EDIT_EXPANDALL, OnEditExpandall)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
// ***************************************************************************
// CLeftView construction/destruction
// ***************************************************************************
CLeftView::CLeftView()
{
}
// ***************************************************************************
CLeftView::~CLeftView()
{
}
// ***************************************************************************
BOOL CLeftView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
// ***************************************************************************
// CLeftView drawing
// ***************************************************************************
void CLeftView::OnDraw(CDC* pDC)
{
CGeorgesEditDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
}
// ***************************************************************************
void CLeftView::getSubObject (CGeorgesEditDocSub *subObject, HTREEITEM parent, HTREEITEM item)
{
// Is this child exist ?
if (!item)
{
int itemImage = subObject->getItemImage (GetDocument());
item = TreeCtrl.InsertItem (utf8ToTStr(subObject->getName()), itemImage, itemImage, parent);
}
// Set name
TreeCtrl.SetItemText (item, utf8ToTStr(subObject->getName()));
// Set item data
TreeCtrl.SetItemData (item, (DWORD)subObject);
// For each children
HTREEITEM child = TreeCtrl.GetChildItem (item);
for (uint i=0; igetChildrenCount(); i++)
{
getSubObject (subObject->getChild (i), item, child);
if (child)
{
// Next child
child = TreeCtrl.GetNextSiblingItem (child);
}
}
// Remove old children
while (child)
{
HTREEITEM toDelete = child;
child = TreeCtrl.GetNextSiblingItem (child);
nlverify (TreeCtrl.DeleteItem (toDelete));
}
}
// ***************************************************************************
void CLeftView::expand ()
{
if (IsWindow (TreeCtrl))
{
HTREEITEM item = TreeCtrl.GetRootItem ();
if (item != NULL)
{
item = TreeCtrl.GetChildItem (item);
if (item != NULL)
{
item = TreeCtrl.GetNextSiblingItem (item);
expand (item);
}
}
}
}
// ***************************************************************************
void CLeftView::expand (HTREEITEM item)
{
TreeCtrl.Expand (item, TVE_EXPAND);
HTREEITEM child = TreeCtrl.GetChildItem (item);
while (child)
{
expand (child);
child = TreeCtrl.GetNextSiblingItem (child);
}
}
// ***************************************************************************
void CLeftView::collapse (HTREEITEM item)
{
TreeCtrl.Expand (item, TVE_COLLAPSE);
HTREEITEM child = TreeCtrl.GetChildItem (item);
while (child)
{
collapse (child);
child = TreeCtrl.GetNextSiblingItem (child);
}
}
// ***************************************************************************
void CLeftView::OnInitialUpdate()
{
CView::OnInitialUpdate();
// Create the tree
RECT rect;
GetClientRect (&rect);
TreeCtrl.Create (TVS_EDITLABELS|TVS_HASLINES|TVS_LINESATROOT|TVS_HASBUTTONS|WS_VISIBLE|WS_CHILD, rect, this, 0);
TreeCtrl.SetImageList( &(theApp.ImageList.ImageList), TVSIL_NORMAL);
getFromDocument ();
if (theApp.StartExpanded)
expand ();
HTREEITEM child = TreeCtrl.GetChildItem (TreeCtrl.GetRootItem ());
if (child)
{
child = TreeCtrl.GetNextItem (child, TVGN_NEXT);
if (child)
{
if (TreeCtrl.GetSelectedItem ())
TreeCtrl.SetItemState(TreeCtrl.GetSelectedItem (), 0, TVIS_BOLD);
TreeCtrl.Select (child, TVGN_CARET);
TreeCtrl.SetItemState(child, TVIS_BOLD, TVIS_BOLD);
}
}
}
// ***************************************************************************
// CLeftView diagnostics
// ***************************************************************************
#ifdef _DEBUG
void CLeftView::AssertValid() const
{
CView::AssertValid();
}
// ***************************************************************************
void CLeftView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
// ***************************************************************************
CGeorgesEditDoc* CLeftView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CGeorgesEditDocType)) ||
m_pDocument->IsKindOf(RUNTIME_CLASS(CGeorgesEditDocDfn)) ||
m_pDocument->IsKindOf(RUNTIME_CLASS(CGeorgesEditDocForm)));
return (CGeorgesEditDoc*)m_pDocument;
}
#endif //_DEBUG
// ***************************************************************************
// CLeftView message handlers
// ***************************************************************************
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 (), &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 (), &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, tStrToUtf8(ptvdi->item.pszText).c_str(), *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 (), &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);
}
// ***************************************************************************
void CLeftView::getFromDocument ()
{
CGeorgesEditDoc *doc = GetDocument();
if (doc && IsWindow (TreeCtrl))
{
// Get the tree root
//TreeCtrl.Expand (TreeCtrl.GetRootItem (), TVE_EXPAND);
getSubObject (&doc->RootObject, NULL, TreeCtrl.GetRootItem ());
}
}
// ***************************************************************************
void CLeftView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)
{
if (IsWindow (TreeCtrl))
{
getFromDocument ();
}
}
// ***************************************************************************
void CLeftView::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);
if (IsWindow (TreeCtrl))
{
RECT rect;
GetClientRect (&rect);
TreeCtrl.SetWindowPos (NULL, 0, 0, rect.right-rect.left, rect.bottom-rect.top, SWP_NOZORDER|SWP_NOOWNERZORDER);
}
}
// ***************************************************************************
BOOL CLeftView::PreTranslateMessage(MSG* pMsg)
{
if (theApp.m_pMainWnd->PreTranslateMessage(pMsg))
return TRUE;
// Key ?
if (pMsg->message == WM_KEYDOWN)
{
// Tabulation ?
if ((int) pMsg->wParam == VK_TAB)
{
CGeorgesEditDoc *doc = (CGeorgesEditDoc*)GetDocument( );
if (doc)
{
// Right view ?
CGeorgesEditView* pView = doc->getRightView ();
if (pView->isFocusable ())
{
doc->switchToView (pView);
// Shift ?
if (GetAsyncKeyState (VK_SHIFT) & (1<<15))
pView->setFocusLastWidget ();
}
}
return TRUE;
}
else if ((int) pMsg->wParam == VK_INSERT)
{
OnInsert ();
return TRUE;
}
else if ((int) pMsg->wParam == VK_DELETE)
{
OnDelete ();
return TRUE;
}
}
return CView::PreTranslateMessage(pMsg);
}
// ***************************************************************************
void CLeftView::OnSetFocus(CWnd* pOldWnd)
{
CView::OnSetFocus(pOldWnd);
TreeCtrl.SetFocus ();
}
// ***************************************************************************
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 ()));
}
}
}
}
}
}
}
// ***************************************************************************
CGeorgesEditDocSub *CLeftView::getSelectedObject ()
{
HTREEITEM item = TreeCtrl.GetSelectedItem ();
if (item != NULL)
{
return (CGeorgesEditDocSub *)TreeCtrl.GetItemData (item);
}
return NULL;
}
// ***************************************************************************
bool CLeftView::changeSubSelection (CGeorgesEditDocSub *sub, HTREEITEM item)
{
// First time ?
if (item == NULL)
item = TreeCtrl.GetRootItem ();
// Good one ?
if ( (CGeorgesEditDocSub *)TreeCtrl.GetItemData (item) == sub )
{
// Select it.
if (TreeCtrl.GetSelectedItem ())
TreeCtrl.SetItemState(TreeCtrl.GetSelectedItem (), 0, TVIS_BOLD);
nlverify (TreeCtrl.SelectItem (item));
TreeCtrl.SetItemState(item, TVIS_BOLD, TVIS_BOLD);
return true;
}
// Scan ohters
HTREEITEM child = TreeCtrl.GetChildItem (item);
while (child)
{
// Good one ?
if (changeSubSelection (sub, child))
return true;
// Get next item
child = TreeCtrl.GetNextSiblingItem (child);
}
// Selection not found
return false;
}
// ***************************************************************************
bool CLeftView::changeSubSelection (uint &sub, HTREEITEM item)
{
// First time ?
if (item == NULL)
item = TreeCtrl.GetRootItem ();
// Good one ?
if ( sub == 0 )
{
// Select it.
if (TreeCtrl.GetSelectedItem ())
TreeCtrl.SetItemState(TreeCtrl.GetSelectedItem (), 0, TVIS_BOLD);
nlverify (TreeCtrl.SelectItem (item));
TreeCtrl.SetItemState(item, TVIS_BOLD, TVIS_BOLD);
return true;
}
// Scan ohters
HTREEITEM child = TreeCtrl.GetChildItem (item);
while (child)
{
// Good one ?
if (changeSubSelection (--sub, child))
return true;
// Get next item
child = TreeCtrl.GetNextSiblingItem (child);
}
// Selection not found
return false;
}
// ***************************************************************************
uint CLeftView::getCurrentSelectionId (uint *count, HTREEITEM item)
{
if (IsWindow (TreeCtrl))
{
uint id = 0;
// Root item
if (item == NULL)
item = TreeCtrl.GetRootItem ();
// First id
if (count == NULL)
{
count = &id;
*count = 0;
}
// Good node ?
if (TreeCtrl.GetSelectedItem () == item)
{
return *count;
}
// Look in children
item = TreeCtrl.GetChildItem (item);
while (item)
{
// Increment id
(*count) ++;
// Found ?
if (getCurrentSelectionId (count, item) != 0xffffffff)
return *count;
// Next child
item = TreeCtrl.GetNextSiblingItem (item);
}
}
// Not found
return 0xffffffff;
}
// ***************************************************************************
bool CLeftView::setCurrentSelectionId (uint id, HTREEITEM item)
{
if (IsWindow (TreeCtrl))
{
// Root item
if (item == NULL)
{
item = TreeCtrl.GetRootItem ();
}
// Good node ?
if (id == 0)
{
// Select the node
if (TreeCtrl.GetSelectedItem ())
TreeCtrl.SetItemState(TreeCtrl.GetSelectedItem (), 0, TVIS_BOLD);
TreeCtrl.Select (item, TVGN_CARET);
TreeCtrl.SetItemState(item, TVIS_BOLD, TVIS_BOLD);
return true;
}
// Look in children
item = TreeCtrl.GetChildItem (item);
while (item)
{
// Increment id
id++;
// Found ?
if (setCurrentSelectionId (id, item))
return true;
// Next child
item = TreeCtrl.GetNextSiblingItem (item);
}
}
// Not found
return false;
}
// ***************************************************************************
void CLeftView::OnEditCut()
{
// Copy
OnEditCopy ();
// Delete
OnDelete ();
}
// ***************************************************************************
void CLeftView::OnInsert()
{
// Get tree selection
HTREEITEM item = TreeCtrl.GetSelectedItem ();
if (item)
{
// 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 (), &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 CActionString (IAction::FormArrayInsert, toString (subObject->getIdInParent ()).c_str (),
*doc, subObject->getFormName ().c_str (), "", doc->getLeftView ()->getCurrentSelectionId (), subObject->getSlot ()));
}
}
}
}
}
}
}
// ***************************************************************************
void CLeftView::OnDelete()
{
// Get tree selection
HTREEITEM item = TreeCtrl.GetSelectedItem ();
if (item)
{
// Edit the label ?
CEdit *edit = TreeCtrl.GetEditControl();
if (edit)
{
edit->SetWindowText (_T(""));
}
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 (), &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::OnEditRedo()
{
CGeorgesEditDoc *doc = (CGeorgesEditDoc*)GetDocument( );
if (doc)
{
doc->OnEditRedo();
}
}
void CLeftView::OnUpdateEditRedo(CCmdUI* pCmdUI)
{
CGeorgesEditDoc *doc = (CGeorgesEditDoc*)GetDocument( );
if (doc)
{
doc->OnUpdateEditRedo(pCmdUI) ;
}
}
void CLeftView::OnEditUndo()
{
CGeorgesEditDoc *doc = (CGeorgesEditDoc*)GetDocument( );
if (doc)
{
doc->OnEditUndo();
}
}
void CLeftView::OnUpdateEditUndo(CCmdUI* pCmdUI)
{
CGeorgesEditDoc *doc = (CGeorgesEditDoc*)GetDocument( );
if (doc)
{
doc->OnUpdateEditUndo(pCmdUI) ;
}
}
void CLeftView::OnEditRename()
{
// Edit the tree
HTREEITEM item = TreeCtrl.GetSelectedItem ();
if (item)
TreeCtrl.EditLabel ( item );
}
void CLeftView::OnEditFetch1()
{
CGeorgesEditDoc *doc = (CGeorgesEditDoc*)GetDocument( );
if (doc)
{
if (doc->isForm ())
((CGeorgesEditDocForm*)doc)->OnEditFetch1();
}
}
void CLeftView::OnEditFetch2()
{
CGeorgesEditDoc *doc = (CGeorgesEditDoc*)GetDocument( );
if (doc)
{
if (doc->isForm ())
((CGeorgesEditDocForm*)doc)->OnEditFetch2();
}
}
void CLeftView::OnEditFetch3()
{
CGeorgesEditDoc *doc = (CGeorgesEditDoc*)GetDocument( );
if (doc)
{
if (doc->isForm ())
((CGeorgesEditDocForm*)doc)->OnEditFetch3();
}
}
void CLeftView::OnEditFetch4()
{
CGeorgesEditDoc *doc = (CGeorgesEditDoc*)GetDocument( );
if (doc)
{
if (doc->isForm ())
((CGeorgesEditDocForm*)doc)->OnEditFetch4();
}
}
void CLeftView::OnEditHold1()
{
CGeorgesEditDoc *doc = (CGeorgesEditDoc*)GetDocument( );
if (doc)
{
if (doc->isForm ())
((CGeorgesEditDocForm*)doc)->OnEditHold1();
}
}
void CLeftView::OnEditHold2()
{
CGeorgesEditDoc *doc = (CGeorgesEditDoc*)GetDocument( );
if (doc)
{
if (doc->isForm ())
((CGeorgesEditDocForm*)doc)->OnEditHold2();
}
}
void CLeftView::OnEditHold3()
{
CGeorgesEditDoc *doc = (CGeorgesEditDoc*)GetDocument( );
if (doc)
{
if (doc->isForm ())
((CGeorgesEditDocForm*)doc)->OnEditHold3();
}
}
void CLeftView::OnEditHold4()
{
CGeorgesEditDoc *doc = (CGeorgesEditDoc*)GetDocument( );
if (doc)
{
if (doc->isForm ())
((CGeorgesEditDocForm*)doc)->OnEditHold4();
}
}
void CLeftView::OnEditCollapseall()
{
// Edit the tree
HTREEITEM item = TreeCtrl.GetSelectedItem ();
if (item)
collapse (item);
}
void CLeftView::OnEditExpandall()
{
// Edit the tree
HTREEITEM item = TreeCtrl.GetSelectedItem ();
if (item)
expand (item);
}