using System; using System.Collections.Generic; using System.ComponentModel; using System.Text; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using Microsoft.SharePoint.Publishing; using Microsoft.SharePoint; using Microsoft.SharePoint.Publishing.Navigation; using Telerik.WebControls; namespace TestWebApp.ServerControls { [DefaultProperty("Text")] [ToolboxData("<{0}:CustomMossRadMenuControl runat=server>")] public class CustomMossRadMenuControl : WebControl, INamingContainer { protected override void CreateChildControls() { //Get the root publishingweb web for the site PublishingWeb rootWeb = PublishingWeb.GetPublishingWeb(SPContext.Current.Site.RootWeb); //Get the URL of the default page in the web string defaultPageUrl = rootWeb.DefaultPage.ServerRelativeUrl; //find the item in the PSMP PortalListItemSiteMapNode smnHome = (PortalListItemSiteMapNode)PortalSiteMapProvider.CurrentNavSiteMapProviderNoEncode.FindSiteMapNode(defaultPageUrl); //initialize the RadMenu RadMenu menu = new RadMenu(); menu.ID = "MainMenu"; //double-check this path to make sure it matches you're installation menu.RadControlsDir = "/_wpresources/RadMenu.Net2/4.3.2.0__bbe59a8ad3533e68/RadControls"; menu.Skin = "Outlook"; //Set the client-side clicked event handler menu.OnClientItemClicked = "MainMenu_RadMenuItemClicked"; //create the first menu item for the default (home) page RadMenuItem rmiHome = new RadMenuItem(); rmiHome.NavigateUrl = smnHome.Url; rmiHome.Text = smnHome.Title; rmiHome.Attributes.Add("PageGuid", smnHome.UniqueId.ToString("N")); rmiHome.Attributes.Add("WebGuid", smnHome.WebId.ToString("N")); //Get the SPListItem for the PortalListItemSiteMapNode, retreive a custom field value, //and populate the menu item's tooltip SPListItem pageItem = getListItemFromPortalSiteMapNode(smnHome); //rmiHome.ToolTip = // pageItem.Fields["MenuItemToolTip"].GetFieldValueAsText(pageItem["MenuItemToolTip"]); menu.Items.Add(rmiHome); //iterate through each one of the pages and subsites and create menu items for them foreach (SiteMapNode smnTopLevelItem in smnHome.ParentNode.ChildNodes) { RadMenuItem rmiTopLevelItem = createMenuItem(smnTopLevelItem); //if the current sitemap has children, create a submenu for it if (smnTopLevelItem.HasChildNodes) { foreach (SiteMapNode smnChildItem in smnTopLevelItem.ChildNodes) { RadMenuItem rmiChildItem = createMenuItem(smnChildItem); rmiTopLevelItem.Items.Add(rmiChildItem); } } menu.Items.Add(rmiTopLevelItem); } this.Controls.Add(menu); //create the client-side script for the RadMenuItemClicked event handler StringBuilder sbScript = new StringBuilder(); sbScript.Append(Environment.NewLine + ""); this.Page.ClientScript.RegisterStartupScript(typeof(string), "RadMenu_MainMenu_RadMenuItemClicked", sbScript.ToString()); } /// /// Create a RadMenuItem from a SiteMapNode /// /// SiteMapNode used to create RadMenuItem /// RadMenuItem private RadMenuItem createMenuItem(SiteMapNode siteMapNode) { RadMenuItem menuItem = new RadMenuItem(); menuItem.NavigateUrl = siteMapNode.Url; menuItem.Text = siteMapNode.Title; SPListItem listItem = null; //if the SiteMapNode is the default page, it will be a PortalWebSiteMapNode if (siteMapNode is PortalWebSiteMapNode) listItem = getListItemFromPortalSiteMapNode((PortalWebSiteMapNode)siteMapNode); if (siteMapNode is PortalListItemSiteMapNode) listItem = getListItemFromPortalSiteMapNode((PortalListItemSiteMapNode)siteMapNode); //create the custom attributes on the list item if (listItem != null) { menuItem.Attributes.Add("PageGuid", listItem.UniqueId.ToString("N")); menuItem.Attributes.Add("WebGuid", listItem.Web.ID.ToString("N")); menuItem.ToolTip = listItem.Fields["MenuItemToolTip"].GetFieldValueAsText(listItem["MenuItemToolTip"]); } else { menuItem.Attributes.Add("PageGuid", string.Empty); menuItem.Attributes.Add("WebGuid", string.Empty); menuItem.ToolTip = siteMapNode.Title; } return menuItem; } private SPListItem getListItemFromPortalSiteMapNode(PortalListItemSiteMapNode siteMapNode) { SPWeb web = SPContext.Current.Site.AllWebs[siteMapNode.WebId]; PublishingWeb pubWeb = PublishingWeb.GetPublishingWeb(web); SPListItem pageItem = pubWeb.PagesList.Items[siteMapNode.UniqueId]; return pageItem; } private SPListItem getListItemFromPortalSiteMapNode(PortalWebSiteMapNode siteMapNode) { SPWeb web = SPContext.Current.Site.AllWebs[siteMapNode.WebId]; PublishingWeb pubWeb = PublishingWeb.GetPublishingWeb(web); SPListItem pageItem = null; if (pubWeb.DefaultPage != null) pageItem = pubWeb.PagesList.Items[pubWeb.DefaultPage.Item.UniqueId]; return pageItem; } } }