/* * Copy/paste in one step. Will not set the copied element for later paste. */ private void CloneItem(object sender, EventArgs e) { FieldInstanceNode newNode = CreateCopyNode(); if (newNode != null) { InsertTreeItem(newNode); } }
/* * Set the name field of the edited label's FieldInstance. */ void LabelEdited(object o, NodeLabelEditEventArgs args) { FieldInstanceNode instanceNode = args.Node as FieldInstanceNode; if (instanceNode != null) { instanceNode.Fields[instanceNode.NameIndex].Value = args.Label; dataGridView.Refresh(); DataChanged = true; } }
/* * Apply value edited in data grid view to appropriate FieldInstance. */ void CellEdited(object o, DataGridViewCellEventArgs args) { FieldInstanceNode fieldNode = treeView.SelectedNode as FieldInstanceNode; if (fieldNode != null && args.ColumnIndex == 1) { DataChanged = true; // update node label if (args.RowIndex == fieldNode.NameIndex) { fieldNode.Text = fieldNode.Fields[args.RowIndex].Value; } } }
/* * Remove the currently selected item from the tree. */ void DeleteEntry(object unused1 = null, EventArgs unused2 = null) { TreeNodeCollection removeFrom = EditedNodes; FieldInstanceNode toRemove = treeView.SelectedNode as FieldInstanceNode; if (removeFrom != null && toRemove != null) { if (EditedFieldList != null) { EditedFieldList.Remove(toRemove.Fields); } removeFrom.Remove(toRemove); DataChanged = true; } }
/* * Insert the given item into the currently selected node. * This can only be done for list nodes (new entry in the list) * or root nodes (new entry in the model). * TODO: check the inserted types when inserting into a list. */ private void InsertTreeItem(FieldInstanceNode newNode) { TreeNodeCollection addTo = EditedNodes; if (newNode != null && addTo != null) { List <List <FieldInstance> > parentList = EditedFieldList; addTo.Add(newNode); if (parentList != null) { parentList.Add(newNode.Fields); } newNode.EnsureVisible(); treeView.SelectedNode = newNode; DataChanged = true; } }
/* * Create a copy of the currently selected node. * Will copy the values from the contained field instances so we don't * get into referencing problems. */ private FieldInstanceNode CreateCopyNode() { FieldInstanceNode newNode = null; List <FieldInstance> toClone = treeView.SelectedNode.Tag as List <FieldInstance>; if (toClone != null) { ListTypeNode listNode = treeView.SelectedNode.Parent as ListTypeNode; int nameIndex = listNode != null ? (listNode.Field.Info as ListType).NameAt : -1; List <FieldInstance> fields = new List <FieldInstance>(); toClone.ForEach(f => { fields.Add(f.CreateCopy()); }); newNode = new FieldInstanceNode(fields, nameIndex); } return(newNode); }
/* * Upon tree node selection, fill the grid view with fields of selected element. * Also, enable edit menu items depending on selection. */ void NodeSelected(object o, TreeViewEventArgs args) { dataGridView.CancelEdit(); FieldInstanceNode node = treeView.SelectedNode as FieldInstanceNode; if (node != null) { List <FieldInstance> dataFields = node.SimpleFields; dataGridView.DataSource = new BindingList <FieldInstance>(dataFields); } else { dataGridView.DataSource = new List <FieldInstance>(); } // enable menu items cloneToolStripMenuItem.Enabled = CanEditElements; copyToolStripMenuItem.Enabled = CanEditElements; deleteToolStripMenuItem.Enabled = CanEditElements; pasteToolStripMenuItem.Enabled = CopiedNode != null && CanEditElements; treeView.LabelEdit = args.Node is FieldInstanceNode; }
/* * Copy the currently selected tree item (for later paste). */ private void CopyTreeItem(object unused1 = null, EventArgs unused2 = null) { CopiedNode = treeView.SelectedNode as FieldInstanceNode; }