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>{0}:CustomMossRadMenuControl>")]
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;
}
}
}