From 80ce6bb633015934250e2aa2ea9f23516a5d1b51 Mon Sep 17 00:00:00 2001 From: Jonas Rapp Date: Wed, 29 Dec 2021 15:18:35 +0100 Subject: [PATCH] Fixed #606 menu to add more nodes of same type --- FXBEditorUtils/FXBEditorUtils.projitems | 1 - FXBEditorUtils/TreeNodeCapabilities.cs | 60 --------- .../AppCode/FetchNodeCapabilities.cs | 121 +++++++++++++----- FetchXmlBuilder/AppCode/TreeNodeHelper.cs | 39 ++++-- .../DockControls/TreeBuilderControl.cs | 11 ++ .../TreeBuilderControl.designer.cs | 11 +- .../DockControls/TreeBuilderControl.resx | 39 +++--- 7 files changed, 156 insertions(+), 126 deletions(-) delete mode 100644 FXBEditorUtils/TreeNodeCapabilities.cs diff --git a/FXBEditorUtils/FXBEditorUtils.projitems b/FXBEditorUtils/FXBEditorUtils.projitems index fc904c89..698db084 100644 --- a/FXBEditorUtils/FXBEditorUtils.projitems +++ b/FXBEditorUtils/FXBEditorUtils.projitems @@ -16,6 +16,5 @@ - \ No newline at end of file diff --git a/FXBEditorUtils/TreeNodeCapabilities.cs b/FXBEditorUtils/TreeNodeCapabilities.cs deleted file mode 100644 index 5f7b8123..00000000 --- a/FXBEditorUtils/TreeNodeCapabilities.cs +++ /dev/null @@ -1,60 +0,0 @@ -using System.Collections.Generic; -using System.Windows.Forms; - -namespace Cinteros.Xrm.XmlEditorUtils -{ - public abstract class TreeNodeCapabilities - { - public string Name = ""; - public bool Delete = false; - public bool Attributes = false; - public bool Comment = true; - public bool Uncomment = false; - public List ChildTypes = new List(); - - public TreeNodeCapabilities() - { - } - - protected TreeNodeCapabilities(TreeNode node) - { - Name = node.Name; - } - - public int IndexOfChild(string name) - { - var index = 0; - while (index < ChildTypes.Count && ChildTypes[index].Name != name) - { - index++; - } - if (index >= ChildTypes.Count) - { - index = -1; - } - return index; - } - - public override string ToString() - { - return Name + " (" + (ChildTypes != null ? ChildTypes.Count.ToString() : "?") + ")"; - } - } - - public class ChildNodeCapabilities - { - public string Name; - public bool Multiple; - - public ChildNodeCapabilities(string name, bool multiple) - { - Name = name; - Multiple = multiple; - } - - public override string ToString() - { - return Name; - } - } -} \ No newline at end of file diff --git a/FetchXmlBuilder/AppCode/FetchNodeCapabilities.cs b/FetchXmlBuilder/AppCode/FetchNodeCapabilities.cs index 2e4397d1..f5921739 100644 --- a/FetchXmlBuilder/AppCode/FetchNodeCapabilities.cs +++ b/FetchXmlBuilder/AppCode/FetchNodeCapabilities.cs @@ -1,63 +1,122 @@ using Cinteros.Xrm.XmlEditorUtils; +using System.Collections.Generic; using System.Windows.Forms; namespace Cinteros.Xrm.FetchXmlBuilder.AppCode { - public class FetchNodeCapabilities : TreeNodeCapabilities + public class FetchNodeCapabilities { - public FetchNodeCapabilities(TreeNode node) - : base(node) + public string Name; + public bool Multiple = true; + public bool Delete = true; + public bool Attributes = false; + public bool Comment = true; + public bool Uncomment = false; + public List ChildTypes; + + public FetchNodeCapabilities(string name, bool addchildren) : this(name) + { + if (addchildren) + { + AddChildren(); + } + } + + private FetchNodeCapabilities(string name) { + Name = name; switch (Name) { case "fetch": + Multiple = false; + Delete = false; Comment = false; - ChildTypes.Add(new ChildNodeCapabilities("entity", false)); - ChildTypes.Add(new ChildNodeCapabilities("-", true)); - ChildTypes.Add(new ChildNodeCapabilities("#comment", true)); break; case "entity": + Multiple = false; + Attributes = true; + break; case "link-entity": - Delete = true; Attributes = true; - ChildTypes.Add(new ChildNodeCapabilities("-", true)); - ChildTypes.Add(new ChildNodeCapabilities("all-attributes", false)); - ChildTypes.Add(new ChildNodeCapabilities("attribute", true)); - ChildTypes.Add(new ChildNodeCapabilities("filter", true)); - ChildTypes.Add(new ChildNodeCapabilities("order", true)); - ChildTypes.Add(new ChildNodeCapabilities("link-entity", true)); - ChildTypes.Add(new ChildNodeCapabilities("-", true)); - ChildTypes.Add(new ChildNodeCapabilities("#comment", true)); break; case "all-attributes": + Multiple = false; + break; case "attribute": case "order": - Delete = true; - ChildTypes.Add(new ChildNodeCapabilities("#comment", true)); + case "filter": + case "condition": + case "value": + break; + case "#comment": + Comment = false; + Uncomment = true; + break; + } + } + + private void AddChildren() + { + ChildTypes = new List(); + switch (Name) + { + case "fetch": + ChildTypes.Add(new FetchNodeCapabilities("entity")); + ChildTypes.Add(new FetchNodeCapabilities("-")); + ChildTypes.Add(new FetchNodeCapabilities("#comment")); + break; + case "entity": + case "link-entity": + ChildTypes.Add(new FetchNodeCapabilities("-")); + ChildTypes.Add(new FetchNodeCapabilities("all-attributes")); + ChildTypes.Add(new FetchNodeCapabilities("attribute")); + ChildTypes.Add(new FetchNodeCapabilities("filter")); + ChildTypes.Add(new FetchNodeCapabilities("order")); + ChildTypes.Add(new FetchNodeCapabilities("link-entity")); + ChildTypes.Add(new FetchNodeCapabilities("-")); + ChildTypes.Add(new FetchNodeCapabilities("#comment")); + break; + case "all-attributes": + case "attribute": + case "order": + ChildTypes.Add(new FetchNodeCapabilities("#comment")); break; case "filter": - Delete = true; - ChildTypes.Add(new ChildNodeCapabilities("condition", true)); - ChildTypes.Add(new ChildNodeCapabilities("filter", true)); - ChildTypes.Add(new ChildNodeCapabilities("-", true)); - ChildTypes.Add(new ChildNodeCapabilities("#comment", true)); + ChildTypes.Add(new FetchNodeCapabilities("condition")); + ChildTypes.Add(new FetchNodeCapabilities("filter")); + ChildTypes.Add(new FetchNodeCapabilities("-")); + ChildTypes.Add(new FetchNodeCapabilities("#comment")); break; case "condition": - Delete = true; - ChildTypes.Add(new ChildNodeCapabilities("value", true)); - ChildTypes.Add(new ChildNodeCapabilities("-", true)); - ChildTypes.Add(new ChildNodeCapabilities("#comment", true)); + ChildTypes.Add(new FetchNodeCapabilities("value")); + ChildTypes.Add(new FetchNodeCapabilities("-")); + ChildTypes.Add(new FetchNodeCapabilities("#comment")); break; case "value": - Delete = true; - ChildTypes.Add(new ChildNodeCapabilities("#comment", true)); + ChildTypes.Add(new FetchNodeCapabilities("#comment")); break; case "#comment": - Delete = true; - Comment = false; - Uncomment = true; break; } } + + public int IndexOfChild(string name) + { + var index = 0; + while (index < ChildTypes.Count && ChildTypes[index].Name != name) + { + index++; + } + if (index >= ChildTypes.Count) + { + index = -1; + } + return index; + } + + public override string ToString() + { + return Name + " (" + (ChildTypes != null ? ChildTypes.Count.ToString() : "?") + ")"; + } } } \ No newline at end of file diff --git a/FetchXmlBuilder/AppCode/TreeNodeHelper.cs b/FetchXmlBuilder/AppCode/TreeNodeHelper.cs index 4d7ca143..66fa4dcc 100644 --- a/FetchXmlBuilder/AppCode/TreeNodeHelper.cs +++ b/FetchXmlBuilder/AppCode/TreeNodeHelper.cs @@ -57,7 +57,6 @@ public static TreeNode AddTreeViewNode(object parentObject, XmlNode xmlNode, Tre throw new Exception("AddTreeViewNode: Unsupported control type"); } node.Tag = attributes; - AddContextMenu(node, tree); foreach (XmlNode childNode in xmlNode.ChildNodes) { AddTreeViewNode(node, childNode, tree, fxb); @@ -292,8 +291,14 @@ public static void AddContextMenu(TreeNode node, TreeBuilderControl tree) } if (node != null) { - var nodecapabilities = new FetchNodeCapabilities(node); + var nodecapabilities = new FetchNodeCapabilities(node.Name, true); + if (nodecapabilities.Multiple) + { + tree.addOneMoreToolStripMenuItem.Text = "More " + nodecapabilities.Name; + tree.addOneMoreToolStripMenuItem.Tag = "MORE-" + nodecapabilities.Name; + AddLinkFromCapability(tree, "+" + nodecapabilities.Name, "MORE-" + nodecapabilities.Name); + } if (nodecapabilities.Attributes && tree.selectAttributesToolStripMenuItem.Enabled) { AddLinkFromCapability(tree, "Select Attributes", "SelectAttributes"); @@ -316,6 +321,7 @@ public static void AddContextMenu(TreeNode node, TreeBuilderControl tree) dummy.Enabled = false; } + tree.addOneMoreToolStripMenuItem.Visible = nodecapabilities.Multiple; tree.selectAttributesToolStripMenuItem.Visible = nodecapabilities.Attributes; tree.deleteToolStripMenuItem.Enabled = nodecapabilities.Delete; tree.commentToolStripMenuItem.Enabled = nodecapabilities.Comment; @@ -421,7 +427,7 @@ internal static void AddXmlNode(TreeNode currentNode, XmlNode parentXmlNode) parentXmlNode.AppendChild(newNode); } - internal static TreeNode AddChildNode(TreeNode parentNode, string name) + internal static TreeNode AddChildNode(TreeNode parentNode, string name, TreeNode sisterNode = null) { var childNode = new TreeNode(name); childNode.Tag = new Dictionary(); @@ -432,20 +438,27 @@ internal static TreeNode AddChildNode(TreeNode parentNode, string name) } if (parentNode != null) { - var parentCap = new FetchNodeCapabilities(parentNode); - var nodeIndex = parentCap.IndexOfChild(name); - var pos = 0; - while (pos < parentNode.Nodes.Count && nodeIndex >= parentCap.IndexOfChild(parentNode.Nodes[pos].Name)) - { - pos++; - } - if (pos == parentNode.Nodes.Count) + if (sisterNode != null) { - parentNode.Nodes.Add(childNode); + parentNode.Nodes.Insert(sisterNode.Index + 1, childNode); } else { - parentNode.Nodes.Insert(pos, childNode); + var parentCap = new FetchNodeCapabilities(parentNode.Name, true); + var nodeIndex = parentCap.IndexOfChild(name); + var pos = 0; + while (pos < parentNode.Nodes.Count && nodeIndex >= parentCap.IndexOfChild(parentNode.Nodes[pos].Name)) + { + pos++; + } + if (pos == parentNode.Nodes.Count) + { + parentNode.Nodes.Add(childNode); + } + else + { + parentNode.Nodes.Insert(pos, childNode); + } } } return childNode; diff --git a/FetchXmlBuilder/DockControls/TreeBuilderControl.cs b/FetchXmlBuilder/DockControls/TreeBuilderControl.cs index 4204f84e..ee51a90b 100644 --- a/FetchXmlBuilder/DockControls/TreeBuilderControl.cs +++ b/FetchXmlBuilder/DockControls/TreeBuilderControl.cs @@ -469,6 +469,10 @@ private void DisplayDefinition(XmlDocument fetchDoc) tvFetch.Nodes.Clear(); TreeNodeHelper.AddTreeViewNode(tvFetch, definitionXmlNode, this, fxb); tvFetch.ExpandAll(); + if (tvFetch.Nodes.Count > 0) + { + tvFetch.SelectedNode = tvFetch.Nodes[0]; + } ManageMenuDisplay(); } @@ -564,6 +568,13 @@ private void HandleNodeMenuClick(string ClickedTag) { SelectAttributes(); } + else if (ClickedTag.StartsWith("MORE-")) + { + var nodename = ClickedTag.Substring(5); + updateNode = TreeNodeHelper.AddChildNode(tvFetch.SelectedNode.Parent, nodename, tvFetch.SelectedNode); + RecordHistory("add " + updateNode.Name); + HandleNodeSelection(updateNode); + } else { updateNode = TreeNodeHelper.AddChildNode(tvFetch.SelectedNode, ClickedTag); diff --git a/FetchXmlBuilder/DockControls/TreeBuilderControl.designer.cs b/FetchXmlBuilder/DockControls/TreeBuilderControl.designer.cs index b2579438..49ea5ab1 100644 --- a/FetchXmlBuilder/DockControls/TreeBuilderControl.designer.cs +++ b/FetchXmlBuilder/DockControls/TreeBuilderControl.designer.cs @@ -45,6 +45,7 @@ private void InitializeComponent() this.addToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.nodeMenu = new System.Windows.Forms.ContextMenuStrip(this.components); this.selectAttributesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.addOneMoreToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.deleteToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparatorBeginOfEdition = new System.Windows.Forms.ToolStripSeparator(); this.commentToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); @@ -228,6 +229,7 @@ private void InitializeComponent() // this.nodeMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.selectAttributesToolStripMenuItem, + this.addOneMoreToolStripMenuItem, this.addToolStripMenuItem, this.deleteToolStripMenuItem, this.toolStripSeparatorBeginOfEdition, @@ -239,7 +241,7 @@ private void InitializeComponent() this.toolStripSeparator1, this.showMetadataToolStripMenuItem}); this.nodeMenu.Name = "nodeMenu"; - this.nodeMenu.Size = new System.Drawing.Size(203, 220); + this.nodeMenu.Size = new System.Drawing.Size(203, 343); this.nodeMenu.ItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.nodeMenu_ItemClicked); // // selectAttributesToolStripMenuItem @@ -249,6 +251,12 @@ private void InitializeComponent() this.selectAttributesToolStripMenuItem.Tag = "SelectAttributes"; this.selectAttributesToolStripMenuItem.Text = "Select attributes..."; // + // addOneMoreToolStripMenuItem + // + this.addOneMoreToolStripMenuItem.Name = "addOneMoreToolStripMenuItem"; + this.addOneMoreToolStripMenuItem.Size = new System.Drawing.Size(285, 32); + this.addOneMoreToolStripMenuItem.Text = "Add one more"; + // // deleteToolStripMenuItem // this.deleteToolStripMenuItem.Name = "deleteToolStripMenuItem"; @@ -373,5 +381,6 @@ private void InitializeComponent() private System.Windows.Forms.ToolTip tt; private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; private System.Windows.Forms.ToolStripMenuItem showMetadataToolStripMenuItem; + internal System.Windows.Forms.ToolStripMenuItem addOneMoreToolStripMenuItem; } } diff --git a/FetchXmlBuilder/DockControls/TreeBuilderControl.resx b/FetchXmlBuilder/DockControls/TreeBuilderControl.resx index efd3c7da..05229d09 100644 --- a/FetchXmlBuilder/DockControls/TreeBuilderControl.resx +++ b/FetchXmlBuilder/DockControls/TreeBuilderControl.resx @@ -126,26 +126,25 @@ - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAACxMAAAsTAQCanBgAAAQKSURBVEhLtZTrV1JZGIf5m+YcHNfMrNWMNZUWSSpiilKK - CioXxQtS431ChBQV0FQgjByLUcdLiihI2mQfW7WaNWOW/Se/efc5yCVZzRfnwwOczd7Pb78vmy1JJBL/ - KzkHz5Ocg5nE9+JYiWwgvLmK7dgOcs35GjkHd+Ix2EIeKBwmSO9WgLMqU1wdakDXnB3r0c1UmO9lCN2H - Nhhe9+DeKzsW9sOp77LEDG84iIL+2iwp132W76yVGA644Tzwov51J+oPO6E57IDmlYhvPySEZMnv+pw5 - ZVlYiK5ycK2lkHaVoXBRhzoS1v4pcuelSOOBFbFEDCl57yOXuPirkJhhLgOnl0PqqAbnUuPmmh63D9pF - 9s1QJ/G/eCIGzK8+g1TYXVLAdiiggLSnAnn3q/CtvRpFbi2uOjSQmkpovgLcWI0QkO+tRc0Lc5qEGdV7 - ZgzuucSAMpsBXCctYHSkYWLeWQ31ogUzbwOY/yeE4FEInjezqAy1g6PvTkNYFap4W4oqwhQfgCS0Gk4K - qewMpAOVgqDmN4sgDRzNw38UxNzRI8weBTDzwQflglkMoYDLC1pUxUi824ZKxk4rancskHRM28SeZsBT - JfyYWuix591sUuoXpNPHs5g6noGHGHk3AX6EVaHGxfkG3Iq2EiZUMLZNUG23Q1L2qz4tbxOR9t0SSr/s - bcTDD3MZ0odwH09j4ngK4x+9cH104yd3nTD30uNGKCOmLDQRKyQXumkHSTGDZ8ePes8W/exp+ELqEaRj - nybw4NM4nCcu/DgpBlwLN0GxZYRi04iy5yKmrSFIeDoRX5JnVwmLeJsK9vcuQTqaIXWcjGH4ZBS976m9 - tirkTdxG6boRpRtpSujZHp2CJL+N+m0kcQbSIfqBqa8cBZU/1gvSkaTUdvIA908cGPo8Avm8TphzZUFH - QgNK1gx0mohVkeXYGiTXf6k/G3CP7h86GeyEfNOnhMKvRd/fNkE6+HkY1r8GUBzUgqNWXvTXi8I/DJCf - smKAfmNQvCo0IxbwBhIbbqZgfyR+lALoFLGAggk1ZIF6yIONKJypww9OFS547qDwiRbFyy0oXtHjxjKj - BTL2vGxAOLYqBjiCXvB6Erdkk8eqGFYhn3osX2rBjXAzZE91kNHdI3vaBBl7XmKQVIA+/96M6zQ+FplL - 36aR3Si+NyrBN5M4E60cvEWBK7TrzN1lyk6F156JFBH2zemUXAhgL8O+SfBNJNUlITmnkaHD2Y/xiA8l - S8a0LClkMpEmFFJFynA7AtuLWfJUAMO74Ed5TwsKWqtQatXCMedOTd6Ib6H/+SQqlzoFWeEiQ4ciem9Y - 6oVr009Xc/yMnHFm4L+I7u1iZXcda7EtxBN7OaWZ5Bw8T3IOnh8Jyb/1r01c7p6sKwAAAABJRU5ErkJg - gg== + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAL + EQAACxEBf2RfkQAABApJREFUSEu1lOtXUlkYh/mb5hwc18ys1Yw1lRZJKmKKUooKKhfFC1LjfUKEFBXQ + VCCMHItRx0uKKEjaZB9btZo1Y5b9J7959znIJVnNF+fDA5zN3s9vvy+bLUkkEv8rOQfPk5yDmcT34liJ + bCC8uYrt2A5yzfkaOQd34jHYQh4oHCZI71aAsypTXB1qQNecHevRzVSY72UI3Yc2GF734N4rOxb2w6nv + ssQMbziIgv7aLCnXfZbvrJUYDrjhPPCi/nUn6g87oTnsgOaViG8/JIRkye/6nDllWViIrnJwraWQdpWh + cFGHOhLW/ily56VI44EVsUQMKXnvI5e4+KuQmGEuA6eXQ+qoBudS4+aaHrcP2kX2zVAn8b94IgbMrz6D + VNhdUsB2KKCAtKcCefer8K29GkVuLa46NJCaSmi+AtxYjRCQ761FzQtzmoQZ1XtmDO65xIAymwFcJy1g + dKRhYt5ZDfWiBTNvA5j/J4TgUQieN7OoDLWDo+9OQ1gVqnhbiirCFB+AJLQaTgqp7AykA5WCoOY3iyAN + HM3DfxTE3NEjzB4FMPPBB+WCWQyhgMsLWlTFSLzbhkrGTitqdyyQdEzbxJ5mwFMl/Jha6LHn3WxS6hek + 08ezmDqegYcYeTcBfoRVocbF+QbcirYSJlQwtk1QbbdDUvarPi1vE5H23RJKv+xtxMMPcxnSh3AfT2Pi + eArjH71wfXTjJ3edMPfS40YoI6YsNBErJBe6aQdJMYNnx496zxb97Gn4QuoRpGOfJvDg0zicJy78OCkG + XAs3QbFlhGLTiLLnIqatIUh4OhFfkmdXCYt4mwr29y5BOpohdZyMYfhkFL3vqb22KuRN3EbpuhGlG2lK + 6NkenYIkv436bSRxBtIh+oGprxwFlT/WC9KRpNR28gD3TxwY+jwC+bxOmHNlQUdCA0rWDHSaiFWR5dga + JNd/qT8bcI/uHzoZ7IR806eEwq9F3982QTr4eRjWvwZQHNSCo1Ze9NeLwj8MkJ+yYoB+Y1C8KjQjFvAG + EhtupmB/JH6UAugUsYCCCTVkgXrIg40onKnDD04VLnjuoPCJFsXLLShe0ePGMqMFMva8bEA4tioGOIJe + 8HoSt2STx6oYViGfeixfasGNcDNkT3WQ0d0je9oEGXteYpBUgD7/3ozrND4WmUvfppHdKL43KsE3kzgT + rRy8RYErtOvM3WXKToXXnokUEfbN6ZRcCGAvw75J8E0k1SUhOaeRocPZj/GIDyVLxrQsKWQykSYUUkXK + cDsC24tZ8lQAw7vgR3lPCwpaq1Bq1cIx505N3ohvof/5JCqXOgVZ4SJDhyJ6b1jqhWvTT1dz/IyccWbg + v4ju7WJldx1rsS3EE3s5pZnkHDxPcg6eHwnJv/WvTVzunqwrAAAAAElFTkSuQmCC