MenuItemStyle staticMenuItemStyle;
MenuItemStyle staticMenuStyle;
MenuItemStyle staticSelectedStyle;
+ Style staticHoverStyle;
+ Style dynamicHoverStyle;
MenuItemStyleCollection levelMenuItemStyles;
MenuItemStyleCollection levelSelectedStyles;
}
}
+ [PersistenceMode (PersistenceMode.InnerProperty)]
+ [NotifyParentProperty (true)]
+ [DefaultValue (null)]
+ [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
+ public virtual Style DynamicHoverStyle {
+ get {
+ if (dynamicHoverStyle == null) {
+ dynamicHoverStyle = new Style ();
+ if (IsTrackingViewState)
+ dynamicHoverStyle.TrackViewState();
+ }
+ return dynamicHoverStyle;
+ }
+ }
+
+ [PersistenceMode (PersistenceMode.InnerProperty)]
+ [NotifyParentProperty (true)]
+ [DefaultValue (null)]
+ [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
+ public virtual Style StaticHoverStyle {
+ get {
+ if (staticHoverStyle == null) {
+ staticHoverStyle = new Style ();
+ if (IsTrackingViewState)
+ staticHoverStyle.TrackViewState();
+ }
+ return staticHoverStyle;
+ }
+ }
+
[Browsable (false)]
[DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
public MenuItem SelectedItem {
staticMenuStyle.TrackViewState ();
if (staticSelectedStyle != null)
staticSelectedStyle.TrackViewState();
+ if (staticHoverStyle != null)
+ staticHoverStyle.TrackViewState();
+ if (dynamicHoverStyle != null)
+ dynamicHoverStyle.TrackViewState();
}
protected override object SaveViewState()
{
- object[] states = new object [11];
+ object[] states = new object [13];
states[0] = base.SaveViewState ();
states[1] = dataBindings == null ? null : ((IStateManager)dataBindings).SaveViewState();
states[2] = items == null ? null : ((IStateManager)items).SaveViewState();
states[8] = (staticMenuItemStyle == null ? null : staticMenuItemStyle.SaveViewState());
states[9] = staticMenuStyle == null ? null : staticMenuStyle.SaveViewState();
states[10] = staticSelectedStyle == null ? null : staticSelectedStyle.SaveViewState();
+ states[11] = staticHoverStyle == null ? null : staticHoverStyle.SaveViewState();
+ states[12] = dynamicHoverStyle == null ? null : dynamicHoverStyle.SaveViewState();
for (int i = states.Length - 1; i >= 0; i--) {
if (states [i] != null)
staticMenuStyle.LoadViewState (states[9]);
if (states[10] != null)
staticSelectedStyle.LoadViewState (states[10]);
+ if (states[11] != null)
+ staticHoverStyle.LoadViewState (states[11]);
+ if (states[12] != null)
+ dynamicHoverStyle.LoadViewState (states[12]);
}
protected override void OnPreRender (EventArgs e)
script += string.Format ("{0}.dho = {1};\n", cmenu, ClientScriptManager.GetScriptLiteral (DynamicHorizontalOffset));
if (DynamicVerticalOffset != 0)
script += string.Format ("{0}.dvo = {1};\n", cmenu, ClientScriptManager.GetScriptLiteral (DynamicVerticalOffset));
+
+ // The order in which styles are defined matters when more than one class
+ // is assigned to an element
+
+ if (dynamicMenuStyle != null)
+ RegisterItemStyle (dynamicMenuStyle);
+ if (staticMenuStyle != null)
+ RegisterItemStyle (staticMenuStyle);
+
+ if (staticMenuItemStyle != null)
+ RegisterItemStyle (staticMenuItemStyle);
+ if (staticSelectedStyle != null)
+ RegisterItemStyle (staticSelectedStyle);
+ if (dynamicMenuItemStyle != null)
+ RegisterItemStyle (dynamicMenuItemStyle);
+ if (dynamicSelectedStyle != null)
+ RegisterItemStyle (dynamicSelectedStyle);
+
+ if (levelMenuItemStyles != null)
+ foreach (Style style in levelMenuItemStyles)
+ RegisterItemStyle (style);
+
+ if (levelSelectedStyles != null)
+ foreach (Style style in levelSelectedStyles)
+ RegisterItemStyle (style);
+
+ if (dynamicHoverStyle != null)
+ RegisterItemStyle (dynamicHoverStyle);
+ if (staticHoverStyle != null)
+ RegisterItemStyle (staticHoverStyle);
+
+ if (staticHoverStyle != null)
+ script += string.Format ("{0}.staticHover = {1};\n", cmenu, ClientScriptManager.GetScriptLiteral (staticHoverStyle.RegisteredCssClass));
+ if (dynamicHoverStyle != null)
+ script += string.Format ("{0}.dynamicHover = {1};\n", cmenu, ClientScriptManager.GetScriptLiteral (dynamicHoverStyle.RegisteredCssClass));
+
Page.ClientScript.RegisterStartupScript (typeof(Menu), ClientID, script, true);
if (dataBindings != null && dataBindings.Count > 0) {
bindings = null;
}
+ void RegisterItemStyle (Style baseStyle)
+ {
+ Page.Header.StyleSheet.RegisterStyle (baseStyle, this);
+ Style ts = new Style ();
+ ts.CopyTextStylesFrom (baseStyle);
+ Page.Header.StyleSheet.CreateStyleRule (ts, "." + baseStyle.RegisteredCssClass + " A", this);
+ }
+
protected override void RenderContents (HtmlTextWriter writer)
{
ArrayList dynamicMenus = new ArrayList ();
}
}
- void RenderMenu (HtmlTextWriter writer, ICollection items, bool vertical, ArrayList dynamicMenus, bool dynamic)
+ void RenderMenu (HtmlTextWriter writer, MenuItemCollection items, bool vertical, ArrayList dynamicMenus, bool dynamic)
{
-// writer.AddAttribute ("border", "1");
writer.AddAttribute ("cellpadding", "0");
writer.AddAttribute ("cellspacing", "0");
- writer.AddStyleAttribute ("border-width", "0");
if (dynamic && dynamicMenuStyle != null)
- dynamicMenuStyle.AddAttributesToRender (writer);
+ writer.AddAttribute ("class", dynamicMenuStyle.RegisteredCssClass);
else if (!dynamic && staticMenuStyle != null)
- staticMenuStyle.AddAttributesToRender (writer);
+ writer.AddAttribute ("class", staticMenuStyle.RegisteredCssClass);
writer.RenderBeginTag (HtmlTextWriterTag.Table);
if (!vertical) writer.RenderBeginTag (HtmlTextWriterTag.Tr);
- foreach (MenuItem item in items) {
+ for (int n=0; n<items.Count; n++) {
+ MenuItem item = items [n];
+ if (n > 0) {
+ int itemSpacing = GetItemSpacing (item, dynamic);
+ if (itemSpacing != 0) {
+ if (vertical) {
+ writer.AddAttribute ("height", itemSpacing + "px");
+ writer.RenderBeginTag (HtmlTextWriterTag.Tr);
+ writer.RenderEndTag ();
+ } else {
+ writer.AddAttribute ("width", itemSpacing + "px");
+ writer.RenderBeginTag (HtmlTextWriterTag.Td);
+ writer.RenderEndTag ();
+ }
+ }
+ }
RenderMenuItem (writer, item, dynamicMenus);
}
if (vertical)
writer.RenderBeginTag (HtmlTextWriterTag.Tr);
+ Style itemStyle = null;
if (levelMenuItemStyles != null && item.Depth < levelMenuItemStyles.Count)
- levelMenuItemStyles [item.Depth].AddAttributesToRender (writer);
+ itemStyle = levelMenuItemStyles [item.Depth];
else if (isDynamicItem) {
if (dynamicMenuItemStyle != null)
- dynamicMenuItemStyle.AddAttributesToRender (writer);
+ itemStyle = dynamicMenuItemStyle;
} else {
if (staticMenuItemStyle != null)
- staticMenuItemStyle.AddAttributesToRender (writer);
+ itemStyle = staticMenuItemStyle;
}
+ Style selectedStyle = null;
if (item == SelectedItem) {
if (levelSelectedStyles != null && item.Depth < levelSelectedStyles.Count)
- levelSelectedStyles [item.Depth].AddAttributesToRender (writer);
+ selectedStyle = levelSelectedStyles [item.Depth];
else if (isDynamicItem) {
if (dynamicSelectedStyle != null)
- dynamicSelectedStyle.AddAttributesToRender (writer);
+ selectedStyle = dynamicSelectedStyle;
} else {
if (staticSelectedStyle != null)
- staticSelectedStyle.AddAttributesToRender (writer);
+ selectedStyle = staticSelectedStyle;
}
}
+ string cls = "";
+ if (itemStyle != null) cls += itemStyle.RegisteredCssClass + " ";
+ if (selectedStyle != null) cls += selectedStyle.RegisteredCssClass + " ";
+ if (cls != "")
+ writer.AddAttribute ("class", cls);
+
+ string parentId = isDynamicItem ? "'" + item.Parent.Path + "'" : "null";
+ if (dynamicChildren) {
+ writer.AddAttribute ("onmouseover", string.Format ("javascript:Menu_OverItem ('{0}','{1}',{2})", ClientID, item.Path, parentId));
+ writer.AddAttribute ("onmouseout", string.Format ("javascript:Menu_OutItem ('{0}','{1}')", ClientID, item.Path));
+ } else if (isDynamicItem) {
+ writer.AddAttribute ("onmouseover", string.Format ("javascript:Menu_OverDynamicLeafItem ('{0}','{1}',{2})", ClientID, item.Path, parentId));
+ writer.AddAttribute ("onmouseout", string.Format ("javascript:Menu_OutItem ('{0}','{1}',{2})", ClientID, item.Path, parentId));
+ } else {
+ writer.AddAttribute ("onmouseover", string.Format ("javascript:Menu_OverStaticLeafItem ('{0}','{1}')", ClientID, item.Path));
+ writer.AddAttribute ("onmouseout", string.Format ("javascript:Menu_OutItem ('{0}','{1}')", ClientID, item.Path));
+ }
+
+ writer.AddAttribute ("id", GetItemClientId (item, "i"));
+
writer.RenderBeginTag (HtmlTextWriterTag.Td);
// Bottom separator image
// Menu item box
- string parentId = isDynamicItem ? "'" + item.Parent.Path + "'" : "null";
- if (dynamicChildren) {
- writer.AddAttribute ("onmouseover", string.Format ("javascript:Menu_OverItem ('{0}','{1}',{2})", ClientID, item.Path, parentId));
- writer.AddAttribute ("onmouseout", string.Format ("javascript:Menu_OutItem ('{0}','{1}')", ClientID, item.Path));
- } else if (isDynamicItem) {
- writer.AddAttribute ("onmouseover", string.Format ("javascript:Menu_OverLeafItem ('{0}', {1})", ClientID, parentId));
- writer.AddAttribute ("onmouseout", string.Format ("javascript:Menu_OutItem ('{0}', {1})", ClientID, parentId));
- } else {
- writer.AddAttribute ("onmouseover", string.Format ("javascript:Menu_OverStaticLeafItem ('{0}')", ClientID));
- }
- writer.AddAttribute ("id", GetItemClientId (item, "i"));
-
-// writer.AddAttribute ("border", "1");
writer.AddAttribute ("cellpadding", "0");
writer.AddAttribute ("cellspacing", "0");
- writer.AddStyleAttribute ("border-width", "0");
writer.AddAttribute ("width", "100%");
writer.RenderBeginTag (HtmlTextWriterTag.Table);
writer.RenderBeginTag (HtmlTextWriterTag.Tr);
}
}
+ int GetItemSpacing (MenuItem item, bool dynamic)
+ {
+ int itemSpacing;
+
+ if (item.Selected) {
+ if (levelSelectedStyles != null && item.Depth < levelSelectedStyles.Count) {
+ itemSpacing = levelSelectedStyles [item.Depth].ItemSpacing;
+ if (itemSpacing != 0) return itemSpacing;
+ }
+
+ if (dynamic) itemSpacing = DynamicSelectedStyle.ItemSpacing;
+ else itemSpacing = StaticSelectedStyle.ItemSpacing;
+ if (itemSpacing != 0) return itemSpacing;
+ }
+
+ if (levelMenuItemStyles != null && item.Depth < levelMenuItemStyles.Count) {
+ itemSpacing = levelMenuItemStyles [item.Depth].ItemSpacing;
+ if (itemSpacing != 0) return itemSpacing;
+ }
+
+ if (dynamic) return DynamicMenuItemStyle.ItemSpacing;
+ else return StaticMenuItemStyle.ItemSpacing;
+ }
+
void RenderItemHref (HtmlTextWriter writer, MenuItem item)
{
if (item.NavigateUrl != "") {
var subm = getSubMenu (menuId, itemId);
if (subm.parentMenu == null && parentId != null)
subm.parentMenu = getSubMenu (menuId, parentId);
- var item = getMenuItem (menuId, itemId);
if (subm.firstShown != true) {
+ var item = getMenuItem (menuId, itemId);
var offx; var offy;
if (subm.parentMenu != null) {
offx = parseInt (subm.parentMenu.style.left);
Menu_SetActive (menu, subm);
Menu_ShowMenu (subm);
+ if (parentId != null && menu.dynamicHover != null)
+ Menu_HilighItem (menuId, itemId, menu.dynamicHover);
+ else if (parentId == null && menu.staticHover != null)
+ Menu_HilighItem (menuId, itemId, menu.staticHover);
}
-function Menu_OverLeafItem (menuId, parentId) {
+function Menu_OverDynamicLeafItem (menuId, itemId, parentId) {
var menu = getMenu (menuId);
var subm = getSubMenu (menuId, parentId);
Menu_SetActive (menu, subm);
Menu_ShowMenu (subm);
+ if (menu.dynamicHover != null)
+ Menu_HilighItem (menuId, itemId, menu.dynamicHover);
}
-function Menu_OverStaticLeafItem (menuId) {
+function Menu_OverStaticLeafItem (menuId, itemId) {
var menu = getMenu (menuId);
Menu_SetActive (menu, null);
+ if (menu.dynamicHover != null)
+ Menu_HilighItem (menuId, itemId, menu.staticHover);
}
-function Menu_OutItem (menuId, itemId) {
+function Menu_HilighItem (menuId, itemId, hoverClass)
+{
+ var item = getMenuItem (menuId, itemId);
+ if (item.normalClass == null)
+ item.normalClass = item.className;
+ item.className = item.normalClass + " " + hoverClass;
+}
+
+function Menu_OutItem (menuId, itemId, parentId) {
var menu = getMenu (menuId);
- Menu_HideMenu (menu, getSubMenu (menuId, itemId), menu.disappearAfter);
+ var subm = getSubMenu (menuId, itemId);
+ if (subm == null && parentId != null)
+ subm = getSubMenu (menuId, parentId);
+ if (subm != null)
+ Menu_HideMenu (menu, subm, menu.disappearAfter);
+ var item = getMenuItem (menuId, itemId);
+ if (item != null && item.normalClass != null)
+ item.className = item.normalClass;
}
function Menu_SetActive (menu, subm) {