/// <summary> /// Implementation of "paste" action using 2 delegates for the concrete action on JToken tree and TreeView. /// </summary> /// <param name="node"></param> /// <param name="pasteJTokenImplementation">Implementation of paste action in the JToken tree.</param> /// <param name="pasteTreeNodeImplementation">Implementation of paste action in the treeView.</param> private static void ClipboardPaste(this JTokenTreeNode node, Action <JToken> pasteJTokenImplementation, Action <TreeNode> pasteTreeNodeImplementation) { var sourceJTokenTreeNode = EditorClipboard <JTokenTreeNode> .Get(); var jTokenSource = sourceJTokenTreeNode.JTokenTag.DeepClone(); try { pasteJTokenImplementation(jTokenSource); } catch (Exception exception) { // If cut was asked, the clipboard is now empty and source should be inserted again in clipboard if (EditorClipboard <JTokenTreeNode> .IsEmpty()) { EditorClipboard <JTokenTreeNode> .Set(sourceJTokenTreeNode, false); } throw new JTokenTreeNodePasteException(exception); } var treeView = node.TreeView; treeView.BeginUpdate(); pasteTreeNodeImplementation(JsonTreeNodeFactory.Create(jTokenSource)); treeView.EndUpdate(); // If cut was asked, the clipboard is now empty and source should be removed from treeview if (EditorClipboard <JTokenTreeNode> .IsEmpty()) { sourceJTokenTreeNode.EditDelete(); } }
/// <inheritdoc /> protected override void OnVisibleChanged(EventArgs e) { if (Visible) { JTokenNode = FindSourceTreeNode <JTokenTreeNode>(); // Collapse item shown if node is expanded and has children CollapseAllToolStripItem.Visible = JTokenNode.IsExpanded && JTokenNode.Nodes.Cast <TreeNode>().Any(); // Expand item shown if node if not expanded or has a children not expanded ExpandAllToolStripItem.Visible = !JTokenNode.IsExpanded || JTokenNode.Nodes.Cast <TreeNode>().Any(t => !t.IsExpanded); // Remove item enabled if it is not the root or the value of a property DeleteNodeToolStripItem.Enabled = (JTokenNode.Parent != null) && !(JTokenNode.Parent is JPropertyTreeNode); // Cut item enabled if delete is CutNodeToolStripItem.Enabled = DeleteNodeToolStripItem.Enabled; // Paste items enabled only when a copy or cut operation is pending PasteNodeAfterToolStripItem.Enabled = !EditorClipboard <JTokenTreeNode> .IsEmpty() && (JTokenNode.Parent != null) && !(JTokenNode.Parent is JPropertyTreeNode); PasteNodeBeforeToolStripItem.Enabled = !EditorClipboard <JTokenTreeNode> .IsEmpty() && (JTokenNode.Parent != null) && !(JTokenNode.Parent is JPropertyTreeNode); PasteNodeReplaceToolStripItem.Enabled = !EditorClipboard <JTokenTreeNode> .IsEmpty() && (JTokenNode.Parent != null); } base.OnVisibleChanged(e); }
/// <inheritdoc /> protected override void OnVisibleChanged(EventArgs e) { var type = ""; if (Visible) { JTokenNode = FindSourceTreeNode <JTokenTreeNode>(); // Collapse item shown if node is expanded and has children CollapseAllToolStripItem.Visible = JTokenNode.IsExpanded && JTokenNode.Nodes.Cast <TreeNode>().Any(); // Expand item shown if node if not expanded or has a children not expanded ExpandAllToolStripItem.Visible = !JTokenNode.IsExpanded || JTokenNode.Nodes.Cast <TreeNode>().Any(t => !t.IsExpanded); // Remove item enabled if it is not the root or the value of a property DeleteNodeToolStripItem.Enabled = (JTokenNode.Parent != null) && !(JTokenNode.Parent is JPropertyTreeNode); // Cut item enabled if delete is CutNodeToolStripItem.Enabled = DeleteNodeToolStripItem.Enabled; // Paste items enabled only when a copy or cut operation is pending PasteNodeAfterToolStripItem.Enabled = !EditorClipboard <JTokenTreeNode> .IsEmpty() && (JTokenNode.Parent != null) && !(JTokenNode.Parent is JPropertyTreeNode); PasteNodeBeforeToolStripItem.Enabled = !EditorClipboard <JTokenTreeNode> .IsEmpty() && (JTokenNode.Parent != null) && !(JTokenNode.Parent is JPropertyTreeNode); PasteNodeReplaceToolStripItem.Enabled = !EditorClipboard <JTokenTreeNode> .IsEmpty() && (JTokenNode.Parent != null); AddWizardStepToolStripItem.Visible = (JTokenNode.Level == 0 && JTokenNode.Text.StartsWith("[Array]")); AddWizardItemToolStripItem.Visible = (JTokenNode.Level == 3 && JTokenNode.Text.StartsWith("[Array]")); AddWizardSubitemToolStripItem.Visible = (JTokenNode.Level == 6 && JTokenNode.Text.StartsWith("[Array]")); if (AddWizardSubitemToolStripItem.Visible) { try { type = JTokenNode.Parent.Parent.FirstNode.FirstNode.Text; } catch { MessageBox.Show(this, "Type of Item cannot be found. Did you modify the json? Possibly recreate this item!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } type = Helper.GetSubItemType(type); if (type != "") { AddWizardSubitemToolStripItem.Text = "Add a " + type; } } RemoveWizardStepToolStripItem.Visible = (JTokenNode.Level == 1 && JTokenNode.Text.StartsWith("{Object}")); if (RemoveWizardStepToolStripItem.Visible) { try { RemoveWizardStepToolStripItem.Text = string.Format("Remove '{0}'", JTokenNode.FirstNode.FirstNode.Text); } catch { MessageBox.Show(this, "Type of Item cannot be found. Did you modify the json? Possibly recreate this item!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } } RemoveWizardItemToolStripItem.Visible = (JTokenNode.Level == 4 && JTokenNode.Text.StartsWith("{Object}")); if (RemoveWizardItemToolStripItem.Visible) { try { RemoveWizardItemToolStripItem.Text = string.Format("Remove '{0}'", JTokenNode.Nodes[1].FirstNode.Text); } catch { MessageBox.Show(this, "Type of Item cannot be found. Did you modify the json? Possibly recreate this item!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } } RemoveWizardSubitemToolStripItem.Visible = (JTokenNode.Level == 7 && JTokenNode.Text.StartsWith("{Object}")); if (RemoveWizardSubitemToolStripItem.Visible) { try { RemoveWizardSubitemToolStripItem.Text = string.Format("Remove '{0}'", JTokenNode.Nodes[1].FirstNode.Text); } catch { MessageBox.Show(this, "Type of Item cannot be found. Did you modify the json? Possibly recreate this item!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } } } base.OnVisibleChanged(e); }