/// <summary> /// Select the given item in the tree view. /// </summary> /// <param name="item">The KmlItem to select</param> /// <returns>Whether item was found or not</returns> public bool Select(KmlItem item) { // Stack will contain items parent nodes Stack <KmlNode> stack = new Stack <KmlNode>(); // Search in KML, root node goes first onto the stack foreach (KmlNode node in KmlRoots) { stack.Push(node); if (SelectSearch(stack, item)) { break; } else { stack.Pop(); } } // This reverses the stack, so root node comes out first stack = new Stack <KmlNode>(stack); // Master node will be selected later, // if item is KmlNode, master = GuiTreeNode for item // otherwise, master = GuiTreeNode for item.Parent GuiTreeNode masterNode = null; // Expand recursively all parent nodes from stack, root first // Seach root in the Tree.Items foreach (GuiTreeNode treeNode in Tree.Items) { if (stack.Count > 0) { KmlNode peek = stack.Peek(); if (treeNode.DataNode == peek) { stack.Pop(); masterNode = treeNode; treeNode.IsExpanded = true; break; } } else if (treeNode.DataNode == item) { masterNode = treeNode; break; } } if (masterNode == null) { // Item found nowhere return(false); } // Seach following nodes recursive in parent treeNode foreach (KmlNode node in stack) { foreach (GuiTreeNode treeNode in masterNode.Items) { if (treeNode.DataNode == node) { // No need to pop, this is handled by foreach loop masterNode = treeNode; if (!(item is KmlAttrib) || item.Parent != treeNode.DataNode) { treeNode.IsExpanded = true; } break; } } } // And now we can select and focus the item if it is a node, its parent otherwise if (item is KmlNode && masterNode.DataNode != item) { foreach (GuiTreeNode sub in masterNode.Items) { if (sub.DataNode == item) { sub.BringIntoView(); // Force a refreh, by causing SelectionChanged to invoke sub.IsSelected = false; sub.IsSelected = true; Focus(); break; } } } else { masterNode.BringIntoView(); // Force a refreh, by causing SelectionChanged to invoke masterNode.IsSelected = false; masterNode.IsSelected = true; Focus(); if (item is KmlAttrib) { foreach (GuiTreeAttrib attrib in TreeDetails.Items) { if (attrib.DataAttrib == item) { attrib.IsSelected = true; TreeDetails.Focus(); } } } } return(true); }
/// <summary> /// Select the given item in the tree view. /// </summary> /// <param name="item">The KmlItem to select</param> public void Select(KmlItem item) { // Stack will contain items parent nodes Stack <KmlNode> stack = new Stack <KmlNode>(); // Search in KML, root node goes first onto the stack foreach (KmlNode node in KmlRoots) { stack.Push(node); if (!SelectSearch(stack, item)) { stack.Pop(); } } // This reverses the stack, so root node comes out first stack = new Stack <KmlNode>(stack); // Expand recursively all parent nodes from stack, root first GuiTreeNode masterNode = null; // Seach root in the Tree.Items foreach (GuiTreeNode treeNode in Tree.Items) { if (treeNode.DataNode == stack.Peek()) { stack.Pop(); masterNode = treeNode; treeNode.IsExpanded = true; break; } } if (masterNode == null) { // Some bullshit went horribly wrong return; } // Seach following nodes recursive in parent treeNode foreach (KmlNode node in stack) { foreach (GuiTreeNode treeNode in masterNode.Items) { if (treeNode.DataNode == node) { // No need to pop, this is handled by foreach loop masterNode = treeNode; treeNode.IsExpanded = true; break; } } } // And now we can select and focus the item if it is a node, it's parent otherwise if (item is KmlNode) { foreach (GuiTreeNode sub in masterNode.Items) { if (sub.DataNode == item) { sub.BringIntoView(); sub.IsSelected = true; Focus(); break; } } } else { masterNode.BringIntoView(); masterNode.IsSelected = true; Focus(); } }