protected override void RenderMenuItem(HtmlTextWriter writer, MenuItem item, bool vertical, bool notLast, bool isFirst, OwnerContext oc)
{
Menu owner = Owner;
string clientID = oc.ClientID;
bool displayChildren = owner.DisplayChildren(item);
bool dynamicChildren = displayChildren && (item.Depth + 1 >= oc.StaticDisplayLevels);
bool isDynamicItem = IsDynamicItem(owner, item);
bool isVertical = oc.IsVertical || isDynamicItem;
Unit itemSpacing = owner.GetItemSpacing(item, isDynamicItem);
if (itemSpacing != Unit.Empty && (item.Depth > 0 || !isFirst))
{
RenderMenuItemSpacing(writer, itemSpacing, isVertical);
}
if (!String.IsNullOrEmpty(item.ToolTip))
{
writer.AddAttribute(HtmlTextWriterAttribute.Title, item.ToolTip);
}
if (isVertical)
{
writer.RenderBeginTag(HtmlTextWriterTag.Tr);
}
string parentId = isDynamicItem ? "'" + item.Parent.Path + "'" : "null";
if (dynamicChildren)
{
writer.AddAttribute("onmouseover",
"javascript:Menu_OverItem ('" + clientID + "','" + item.Path + "'," + parentId + ")");
writer.AddAttribute("onmouseout",
"javascript:Menu_OutItem ('" + clientID + "','" + item.Path + "')");
}
else if (isDynamicItem)
{
writer.AddAttribute("onmouseover",
"javascript:Menu_OverDynamicLeafItem ('" + clientID + "','" + item.Path + "'," + parentId + ")");
writer.AddAttribute("onmouseout",
"javascript:Menu_OutItem ('" + clientID + "','" + item.Path + "'," + parentId + ")");
}
else
{
writer.AddAttribute("onmouseover",
"javascript:Menu_OverStaticLeafItem ('" + clientID + "','" + item.Path + "')");
writer.AddAttribute("onmouseout",
"javascript:Menu_OutItem ('" + clientID + "','" + item.Path + "')");
}
writer.RenderBeginTag(HtmlTextWriterTag.Td);
// Top separator image
if (isDynamicItem)
{
RenderSeparatorImage(owner, writer, oc.DynamicTopSeparatorImageUrl, false);
}
else
{
RenderSeparatorImage(owner, writer, oc.StaticTopSeparatorImageUrl, false);
}
// Menu item box
MenuItemStyle style = new MenuItemStyle();
if (oc.Header != null)
{
// styles are registered
if (!isDynamicItem && oc.StaticMenuItemStyle != null)
{
AddCssClass(style, oc.StaticMenuItemStyle.CssClass);
AddCssClass(style, oc.StaticMenuItemStyle.RegisteredCssClass);
}
if (isDynamicItem && oc.DynamicMenuItemStyle != null)
{
AddCssClass(style, oc.DynamicMenuItemStyle.CssClass);
AddCssClass(style, oc.DynamicMenuItemStyle.RegisteredCssClass);
}
if (oc.LevelMenuItemStyles != null && oc.LevelMenuItemStyles.Count > item.Depth)
{
AddCssClass(style, oc.LevelMenuItemStyles [item.Depth].CssClass);
AddCssClass(style, oc.LevelMenuItemStyles [item.Depth].RegisteredCssClass);
}
if (item == oc.SelectedItem)
{
if (!isDynamicItem && oc.StaticSelectedStyle != null)
{
AddCssClass(style, oc.StaticSelectedStyle.CssClass);
AddCssClass(style, oc.StaticSelectedStyle.RegisteredCssClass);
}
if (isDynamicItem && oc.DynamicSelectedStyle != null)
{
AddCssClass(style, oc.DynamicSelectedStyle.CssClass);
AddCssClass(style, oc.DynamicSelectedStyle.RegisteredCssClass);
}
if (oc.LevelSelectedStyles != null && oc.LevelSelectedStyles.Count > item.Depth)
{
AddCssClass(style, oc.LevelSelectedStyles [item.Depth].CssClass);
AddCssClass(style, oc.LevelSelectedStyles [item.Depth].RegisteredCssClass);
}
}
}
else
{
// styles are not registered
if (!isDynamicItem && oc.StaticMenuItemStyle != null)
{
style.CopyFrom(oc.StaticMenuItemStyle);
}
if (isDynamicItem && oc.DynamicMenuItemStyle != null)
{
style.CopyFrom(oc.DynamicMenuItemStyle);
}
if (oc.LevelMenuItemStyles != null && oc.LevelMenuItemStyles.Count > item.Depth)
{
style.CopyFrom(oc.LevelMenuItemStyles [item.Depth]);
}
if (item == oc.SelectedItem)
{
if (!isDynamicItem && oc.StaticSelectedStyle != null)
{
style.CopyFrom(oc.StaticSelectedStyle);
}
if (isDynamicItem && oc.DynamicSelectedStyle != null)
{
style.CopyFrom(oc.DynamicSelectedStyle);
}
if (oc.LevelSelectedStyles != null && oc.LevelSelectedStyles.Count > item.Depth)
{
style.CopyFrom(oc.LevelSelectedStyles [item.Depth]);
}
}
}
style.AddAttributesToRender(writer);
writer.AddAttribute("id", GetItemClientId(clientID, item, "i"));
writer.AddAttribute("cellpadding", "0", false);
writer.AddAttribute("cellspacing", "0", false);
writer.AddAttribute("border", "0", false);
writer.AddAttribute("width", "100%", false);
writer.RenderBeginTag(HtmlTextWriterTag.Table);
writer.RenderBeginTag(HtmlTextWriterTag.Tr);
// Menu item text
if (isVertical)
{
writer.AddStyleAttribute(HtmlTextWriterStyle.Width, "100%");
}
if (!owner.ItemWrap)
{
writer.AddStyleAttribute("white-space", "nowrap");
}
writer.RenderBeginTag(HtmlTextWriterTag.Td);
RenderItemHref(owner, writer, item);
Style linkStyle = new Style();
if (oc.Header != null)
{
// styles are registered
AddCssClass(linkStyle, oc.ControlLinkStyle.RegisteredCssClass);
if (!isDynamicItem && oc.StaticMenuItemStyle != null)
{
AddCssClass(linkStyle, oc.StaticMenuItemStyle.CssClass);
AddCssClass(linkStyle, oc.StaticMenuItemLinkStyle.RegisteredCssClass);
}
if (isDynamicItem && oc.DynamicMenuItemStyle != null)
{
AddCssClass(linkStyle, oc.DynamicMenuItemStyle.CssClass);
AddCssClass(linkStyle, oc.DynamicMenuItemLinkStyle.RegisteredCssClass);
}
if (oc.LevelMenuItemStyles != null && oc.LevelMenuItemStyles.Count > item.Depth)
{
AddCssClass(linkStyle, oc.LevelMenuItemStyles [item.Depth].CssClass);
AddCssClass(linkStyle, oc.LevelMenuItemLinkStyles [item.Depth].RegisteredCssClass);
}
if (item == oc.SelectedItem)
{
if (!isDynamicItem && oc.StaticSelectedStyle != null)
{
AddCssClass(linkStyle, oc.StaticSelectedStyle.CssClass);
AddCssClass(linkStyle, oc.StaticSelectedLinkStyle.RegisteredCssClass);
}
if (isDynamicItem && oc.DynamicSelectedStyle != null)
{
AddCssClass(linkStyle, oc.DynamicSelectedStyle.CssClass);
AddCssClass(linkStyle, oc.DynamicSelectedLinkStyle.RegisteredCssClass);
}
if (oc.LevelSelectedStyles != null && oc.LevelSelectedStyles.Count > item.Depth)
{
AddCssClass(linkStyle, oc.LevelSelectedStyles [item.Depth].CssClass);
AddCssClass(linkStyle, oc.LevelSelectedLinkStyles [item.Depth].RegisteredCssClass);
}
}
}
else
{
// styles are not registered
linkStyle.CopyFrom(oc.ControlLinkStyle);
if (!isDynamicItem && oc.StaticMenuItemStyle != null)
{
linkStyle.CopyFrom(oc.StaticMenuItemLinkStyle);
}
if (isDynamicItem && oc.DynamicMenuItemStyle != null)
{
linkStyle.CopyFrom(oc.DynamicMenuItemLinkStyle);
}
if (oc.LevelMenuItemStyles != null && oc.LevelMenuItemStyles.Count > item.Depth)
{
linkStyle.CopyFrom(oc.LevelMenuItemLinkStyles [item.Depth]);
}
if (item == oc.SelectedItem)
{
if (!isDynamicItem && oc.StaticSelectedStyle != null)
{
linkStyle.CopyFrom(oc.StaticSelectedLinkStyle);
}
if (isDynamicItem && oc.DynamicSelectedStyle != null)
{
linkStyle.CopyFrom(oc.DynamicSelectedLinkStyle);
}
if (oc.LevelSelectedStyles != null && oc.LevelSelectedStyles.Count > item.Depth)
{
linkStyle.CopyFrom(oc.LevelSelectedLinkStyles [item.Depth]);
}
}
linkStyle.AlwaysRenderTextDecoration = true;
}
linkStyle.AddAttributesToRender(writer);
writer.AddAttribute("id", GetItemClientId(clientID, item, "l"));
if (item.Depth > 0 && !isDynamicItem)
{
double value;
#if NET_4_0
Unit unit = oc.StaticSubMenuIndent;
if (unit == Unit.Empty)
{
value = 16;
}
else
{
value = unit.Value;
}
#else
value = oc.StaticSubMenuIndent.Value;
#endif
Unit indent = new Unit(value * item.Depth, oc.StaticSubMenuIndent.Type);
writer.AddStyleAttribute(HtmlTextWriterStyle.MarginLeft, indent.ToString());
}
writer.RenderBeginTag(HtmlTextWriterTag.A);
owner.RenderItemContent(writer, item, isDynamicItem);
writer.RenderEndTag(); // A
writer.RenderEndTag(); // TD
// Popup image
if (dynamicChildren)
{
string popOutImage = GetPopOutImage(owner, item, isDynamicItem);
if (popOutImage != null)
{
writer.RenderBeginTag(HtmlTextWriterTag.Td);
writer.AddAttribute("src", owner.ResolveClientUrl(popOutImage));
writer.AddAttribute("border", "0");
string toolTip = String.Format(isDynamicItem ? oc.DynamicPopOutImageTextFormatString : oc.StaticPopOutImageTextFormatString, item.Text);
writer.AddAttribute(HtmlTextWriterAttribute.Alt, toolTip);
writer.RenderBeginTag(HtmlTextWriterTag.Img);
writer.RenderEndTag(); // IMG
writer.RenderEndTag(); // TD
}
}
writer.RenderEndTag(); // TR
writer.RenderEndTag(); // TABLE
writer.RenderEndTag(); // TD
if (!isVertical && itemSpacing == Unit.Empty && (notLast || (displayChildren && !dynamicChildren)))
{
writer.AddStyleAttribute("width", "3px");
writer.RenderBeginTag(HtmlTextWriterTag.Td);
writer.RenderEndTag();
}
// Bottom separator image
string separatorImg = item.SeparatorImageUrl;
if (separatorImg.Length == 0)
{
if (isDynamicItem)
{
separatorImg = oc.DynamicBottomSeparatorImageUrl;
}
else
{
separatorImg = oc.StaticBottomSeparatorImageUrl;
}
}
if (separatorImg.Length > 0)
{
if (!isVertical)
{
writer.RenderBeginTag(HtmlTextWriterTag.Td);
}
RenderSeparatorImage(owner, writer, separatorImg, false);
if (!isVertical)
{
writer.RenderEndTag(); // TD
}
}
if (isVertical)
{
writer.RenderEndTag(); // TR
}
if (itemSpacing != Unit.Empty)
{
RenderMenuItemSpacing(writer, itemSpacing, isVertical);
}
// Submenu
if (displayChildren && !dynamicChildren)
{
if (isVertical)
{
writer.RenderBeginTag(HtmlTextWriterTag.Tr);
}
writer.RenderBeginTag(HtmlTextWriterTag.Td);
writer.AddAttribute("width", "100%");
owner.RenderMenu(writer, item.ChildItems, vertical, false, item.Depth + 1, notLast);
if (item.Depth + 2 == oc.StaticDisplayLevels)
{
owner.RenderDynamicMenu(writer, item.ChildItems);
}
writer.RenderEndTag(); // TD
if (isVertical)
{
writer.RenderEndTag(); // TR
}
}
}