private void recursively_draw_sitemap_for_robots(TextWriter Output, SobekCM_SiteMap_Node Node, string Indent) { // Add this text if ((Node.URL.Length > 0) && (Node.URL != currentMode.Info_Browse_Mode)) { Output.WriteLine(Indent + "<a href='" + currentMode.Base_URL + Node.URL + "' title='" + Node.Description + "'>" + Node.Title + "</a><br />"); } else { Output.WriteLine(Indent + "<span Title='" + Node.Description + "' class='SobekSiteMapNoLink' >" + Node.Title + "</span><br />"); } // Add all the children if (Node.Child_Nodes_Count > 0) { foreach (SobekCM_SiteMap_Node childNode in Node.Child_Nodes) { recursively_draw_sitemap_for_robots(Output, childNode, Indent + " "); } } }
/// <summary> Event handler loads the nodes on request to the serial hierarchy trees when the user requests them /// by expanding a node </summary> /// <param name="sender"> TreeView object that fired this event </param> /// <param name="e"> Event arguments includes the tree node which was expanded </param> void treeView1_TreeNodePopulate(object sender, TreeNodeEventArgs e) { SobekCM_SiteMap_Node retrieved_node = siteMap.Node_By_Value(Convert.ToInt32(e.Node.Value)); // Determine the base URL string base_url = currentMode.Base_URL; if (currentMode.Writer_Type == Writer_Type_Enum.HTML_LoggedIn) { base_url = base_url + "l/"; } if ((retrieved_node != null) && (retrieved_node.Child_Nodes_Count > 0)) { foreach (SobekCM_SiteMap_Node childNode in retrieved_node.Child_Nodes) { // Add this child node to the tree view TreeNode childTreeNode = new TreeNode { SelectAction = TreeNodeSelectAction.None, Value = childNode.NodeValue.ToString() }; if (childNode.Child_Nodes_Count > 0) { childTreeNode.PopulateOnDemand = true; } if (childNode.URL.Length > 0) { childTreeNode.Text = string.Format("<a href='{0}' title='{1}'>{2}</a>", base_url + childNode.URL, childNode.Description, childNode.Title); } else { childTreeNode.Text = string.Format("<span Title='{0}' class='SobekSiteMapNoLink' >{1}</span>", childNode.Description, childNode.Title); childTreeNode.SelectAction = TreeNodeSelectAction.Expand; } e.Node.ChildNodes.Add(childTreeNode); } } }
private void add_child_nodes(TreeNode treeNode, SobekCM_SiteMap_Node siteNode, string base_url, int selected_node) { // Only do anything if there are child nodes defined if (siteNode.Child_Nodes_Count > 0) { // Step through each child node ReadOnlyCollection <SobekCM_SiteMap_Node> childNodes = siteNode.Child_Nodes; int child_node_counter = 0; while (child_node_counter < childNodes.Count) { // Get this child node SobekCM_SiteMap_Node childNode = childNodes[child_node_counter]; // Add this child node to the tree view TreeNode childTreeNode = new TreeNode { SelectAction = TreeNodeSelectAction.None, Value = childNode.NodeValue.ToString() }; if (childNode.URL.Length > 0) { childTreeNode.Text = string.Format("<a href='{0}' title='{1}'>{2}</a>", base_url + childNode.URL, childNode.Description, childNode.Title); } else { childTreeNode.Text = string.Format("<span Title='{0}' class='SobekSiteMapNoLink' >{1}</span>", childNode.Description, childNode.Title); childTreeNode.SelectAction = TreeNodeSelectAction.Expand; } treeNode.ChildNodes.Add(childTreeNode); if (childNode.Child_Nodes_Count > 0) { // Determine if the selected node is in the child nodes... if ((childNode.NodeValue < selected_node) && ((child_node_counter + 1 == childNodes.Count) || (childNodes[child_node_counter + 1].NodeValue > selected_node))) { // Recurse through any children add_child_nodes(childTreeNode, childNode, base_url, selected_node); } else { childTreeNode.PopulateOnDemand = true; } } // Was this node currently selected? if (childNode.NodeValue == selected_node) { childTreeNode.Text = string.Format("<span Title='{0}'>{1}</span>", childNode.Description, childNode.Title); childTreeNode.Expand(); // Create the breadcrumbs now StringBuilder breadcrumbBuilder = new StringBuilder(); breadcrumbBuilder.Append(childTreeNode.Text); // Add each parent next, if they have a URL and also expand each parent TreeNode selectedNodeExpander = childTreeNode; while (selectedNodeExpander.Parent != null) { // expand this node (selectedNodeExpander.Parent).Expand(); // add to breadcrumb, if a link if (selectedNodeExpander.Parent.SelectAction == TreeNodeSelectAction.None) { string text = selectedNodeExpander.Parent.Text.Replace(" Namespace</a>", "</a>").Replace(" Sub-Namespace</a>", "</a>"); breadcrumbBuilder.Insert(0, text + " <img src=\"" + currentMode.Base_URL + "design/skins/" + currentMode.Base_Skin + "/breadcrumbimg.gif\" alt=\">\" /><img src=\"" + currentMode.Base_URL + "design/skins/" + currentMode.Base_Skin + "/breadcrumbimg.gif\" alt=\">\" /> "); } // step up another level selectedNodeExpander = selectedNodeExpander.Parent; } breadcrumbs = breadcrumbBuilder.ToString(); } child_node_counter++; } } }
/// <summary> Reads an existing site map file and returns the fully built <see cref="SobekCM_SiteMap" /> object </summary> /// <param name="SiteMap_File"> Sitemap file to read </param> /// <returns> Fully built sitemap object </returns> public static SobekCM_SiteMap Read_SiteMap_File(string SiteMap_File) { Stream reader = null; XmlTextReader nodeReader = null; SobekCM_SiteMap siteMap = null; int nodeValue = 1; Stack <SobekCM_SiteMap_Node> nodesStack = new Stack <SobekCM_SiteMap_Node>(); try { // Create and open the readonly file stream reader = new FileStream(SiteMap_File, FileMode.Open, FileAccess.Read); // create the XML node reader nodeReader = new XmlTextReader(reader); // Read through the XML document while (nodeReader.Read()) { if (nodeReader.NodeType == XmlNodeType.Element) { // Handle the main sitemap tag if (nodeReader.Name == "siteMap") { // This is the first node read, so it may have additional information siteMap = new SobekCM_SiteMap(); // Look for the optional default breadcrumbs attribute if (nodeReader.MoveToAttribute("default_breadcrumb")) { siteMap.Default_Breadcrumb = nodeReader.Value; } // Look for the optional width attribute if (nodeReader.MoveToAttribute("width")) { short width; Int16.TryParse(nodeReader.Value, out width); siteMap.Width = width; } // Look for the optional url restriction attribute if (nodeReader.MoveToAttribute("restrictedRobotUrl")) { siteMap.Restricted_Robot_URL = nodeReader.Value; } } // Handle a new siteMapNode if (nodeReader.Name == "siteMapNode") { string url = String.Empty; string title = String.Empty; string description = String.Empty; bool empty = false; // Before moving to any attributes, check to see if this is empty if (nodeReader.IsEmptyElement) { empty = true; } // Step through the attributes while (nodeReader.MoveToNextAttribute()) { switch (nodeReader.Name) { case "url": url = nodeReader.Value; break; case "title": title = nodeReader.Value; break; case "description": description = nodeReader.Value; break; } } // Create the new node SobekCM_SiteMap_Node newNode = new SobekCM_SiteMap_Node(url, title, description, nodeValue++); // Add to the parent if (nodesStack.Count == 0) { // This is the first node read so it should be the root node if (siteMap != null) { siteMap.RootNodes.Add(newNode); } } else { nodesStack.Peek().Add_Child_Node(newNode); } // Add this to the stack, at least until the end of this node is found // if this is not an empty element if (!empty) { nodesStack.Push(newNode); } } } else if ((nodeReader.NodeType == XmlNodeType.EndElement) && (nodeReader.Name == "siteMapNode")) { nodesStack.Pop(); } } } finally { if (nodeReader != null) { nodeReader.Close(); } if (reader != null) { reader.Close(); } } return(siteMap); }