// // System.Web.UI.WebControls.Menu.cs // // Authors: // Lluis Sanchez Gual (lluis@novell.com) // Igor Zelmanovich (igorz@mainsoft.com) // // (C) 2004-2010 Novell, Inc (http://www.novell.com) // // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // #if NET_2_0 using System; using System.Collections; using System.Text; using System.ComponentModel; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.Handlers; using System.Collections.Specialized; using System.IO; using System.Drawing; using System.Collections.Generic; namespace System.Web.UI.WebControls { [DefaultEvent ("MenuItemClick")] [ControlValueProperty ("SelectedValue")] [Designer ("System.Web.UI.Design.WebControls.MenuDesigner, " + Consts.AssemblySystem_Design, "System.ComponentModel.Design.IDesigner")] [SupportsEventValidation] public class Menu : HierarchicalDataBoundControl, IPostBackEventHandler, INamingContainer { IMenuRenderer renderer; MenuItemStyle dynamicMenuItemStyle; SubMenuStyle dynamicMenuStyle; MenuItemStyle dynamicSelectedStyle; MenuItemStyle staticMenuItemStyle; SubMenuStyle staticMenuStyle; MenuItemStyle staticSelectedStyle; Style staticHoverStyle; Style dynamicHoverStyle; MenuItemStyleCollection levelMenuItemStyles; MenuItemStyleCollection levelSelectedStyles; SubMenuStyleCollection levelSubMenuStyles; ITemplate staticItemTemplate; ITemplate dynamicItemTemplate; MenuItemCollection items; MenuItemBindingCollection dataBindings; MenuItem selectedItem; string selectedItemPath; Hashtable bindings; Hashtable _menuItemControls; bool _requiresChildControlsDataBinding; SiteMapNode _currSiteMapNode; Style popOutBoxStyle; Style controlLinkStyle; Style dynamicMenuItemLinkStyle; Style staticMenuItemLinkStyle; Style dynamicSelectedLinkStyle; Style staticSelectedLinkStyle; Style dynamicHoverLinkStyle; Style staticHoverLinkStyle; #if NET_4_0 bool? renderList; bool includeStyleBlock = true; MenuRenderingMode renderingMode = MenuRenderingMode.Default; #endif static readonly object MenuItemClickEvent = new object(); static readonly object MenuItemDataBoundEvent = new object(); public static readonly string MenuItemClickCommandName = "Click"; public event MenuEventHandler MenuItemClick { add { Events.AddHandler (MenuItemClickEvent, value); } remove { Events.RemoveHandler (MenuItemClickEvent, value); } } public event MenuEventHandler MenuItemDataBound { add { Events.AddHandler (MenuItemDataBoundEvent, value); } remove { Events.RemoveHandler (MenuItemDataBoundEvent, value); } } protected virtual void OnMenuItemClick (MenuEventArgs e) { if (Events != null) { MenuEventHandler eh = (MenuEventHandler) Events [MenuItemClickEvent]; if (eh != null) eh (this, e); } } protected virtual void OnMenuItemDataBound (MenuEventArgs e) { if (Events != null) { MenuEventHandler eh = (MenuEventHandler) Events [MenuItemDataBoundEvent]; if (eh != null) eh (this, e); } } IMenuRenderer Renderer { get { if (renderer == null) renderer = CreateRenderer (null); return renderer; } } #if NET_4_0 bool RenderList { get { if (renderList == null) { switch (RenderingMode) { case MenuRenderingMode.List: renderList = true; break; case MenuRenderingMode.Table: renderList = false; break; default: if (RenderingCompatibilityLessThan40) renderList = false; else renderList = true; break; } } return renderList.Value; } } [DefaultValue (true)] [Description ("Determines whether or not to render the inline style block (only used in standards compliance mode)")] public bool IncludeStyleBlock { get { return includeStyleBlock; } set { includeStyleBlock = value; } } [DefaultValue (MenuRenderingMode.Default)] public MenuRenderingMode RenderingMode { get { return renderingMode; } set { if (value < MenuRenderingMode.Default || value > MenuRenderingMode.List) throw new ArgumentOutOfRangeException ("value"); renderingMode = value; renderer = CreateRenderer (renderer); } } #endif [DefaultValueAttribute (null)] [PersistenceMode (PersistenceMode.InnerProperty)] [EditorAttribute ("System.Web.UI.Design.WebControls.MenuBindingsEditor, " + Consts.AssemblySystem_Design, "System.Drawing.Design.UITypeEditor, " + Consts.AssemblySystem_Drawing)] [MergablePropertyAttribute (false)] public MenuItemBindingCollection DataBindings { get { if (dataBindings == null) { dataBindings = new MenuItemBindingCollection (); if (IsTrackingViewState) ((IStateManager)dataBindings).TrackViewState(); } return dataBindings; } } [DefaultValue (500)] [ThemeableAttribute (false)] public int DisappearAfter { get { object o = ViewState ["DisappearAfter"]; if (o != null) return (int)o; return 500; } set { ViewState["DisappearAfter"] = value; } } [ThemeableAttribute (true)] [DefaultValue ("")] [UrlProperty] [Editor ("System.Web.UI.Design.ImageUrlEditor, " + Consts.AssemblySystem_Design, "System.Drawing.Design.UITypeEditor, " + Consts.AssemblySystem_Drawing)] public string DynamicBottomSeparatorImageUrl { get { object o = ViewState ["dbsiu"]; if (o != null) return (string)o; return String.Empty; } set { ViewState["dbsiu"] = value; } } [DefaultValueAttribute ("")] public string DynamicItemFormatString { get { object o = ViewState ["DynamicItemFormatString"]; if (o != null) return (string)o; return ""; } set { ViewState["DynamicItemFormatString"] = value; } } [DefaultValue ("")] [UrlProperty] [WebCategory ("Appearance")] [Editor ("System.Web.UI.Design.ImageUrlEditor, " + Consts.AssemblySystem_Design, "System.Drawing.Design.UITypeEditor, " + Consts.AssemblySystem_Drawing)] public string DynamicTopSeparatorImageUrl { get { object o = ViewState ["dtsiu"]; if (o != null) return (string)o; return ""; } set { ViewState["dtsiu"] = value; } } [DefaultValue ("")] [UrlProperty] [WebCategory ("Appearance")] [Editor ("System.Web.UI.Design.ImageUrlEditor, " + Consts.AssemblySystem_Design, "System.Drawing.Design.UITypeEditor, " + Consts.AssemblySystem_Drawing)] public string StaticBottomSeparatorImageUrl { get { object o = ViewState ["sbsiu"]; if (o != null) return (string)o; return ""; } set { ViewState["sbsiu"] = value; } } [DefaultValue ("")] [UrlProperty] [WebCategory ("Appearance")] [Editor ("System.Web.UI.Design.ImageUrlEditor, " + Consts.AssemblySystem_Design, "System.Drawing.Design.UITypeEditor, " + Consts.AssemblySystem_Drawing)] public string StaticTopSeparatorImageUrl { get { object o = ViewState ["stsiu"]; if (o != null) return (string)o; return ""; } set { ViewState["stsiu"] = value; } } [DefaultValue (Orientation.Vertical)] public Orientation Orientation { get { object o = ViewState ["Orientation"]; if (o != null) return (Orientation) o; return Orientation.Vertical; } set { ViewState["Orientation"] = value; } } [DefaultValue (1)] [ThemeableAttribute (true)] public int StaticDisplayLevels { get { object o = ViewState ["StaticDisplayLevels"]; if (o != null) return (int)o; return 1; } set { if (value < 1) throw new ArgumentOutOfRangeException (); ViewState["StaticDisplayLevels"] = value; } } [DefaultValueAttribute ("")] public string StaticItemFormatString { get { object o = ViewState ["StaticItemFormatString"]; if (o != null) return (string)o; return ""; } set { ViewState["StaticItemFormatString"] = value; } } [DefaultValue (typeof (Unit), "16px")] [ThemeableAttribute (true)] public Unit StaticSubMenuIndent { get { object o = ViewState ["StaticSubMenuIndent"]; if (o != null) return (Unit)o; // LAMESPEC: on 4.0 it returns Unit.Empty and on 3.5 16px #if NET_4_0 return Unit.Empty; #else return new Unit (16); #endif } set { ViewState["StaticSubMenuIndent"] = value; } } [ThemeableAttribute (true)] [DefaultValue (3)] public int MaximumDynamicDisplayLevels { get { object o = ViewState ["MaximumDynamicDisplayLevels"]; if (o != null) return (int)o; return 3; } set { if (value < 0) throw new ArgumentOutOfRangeException (); ViewState["MaximumDynamicDisplayLevels"] = value; } } [DefaultValue (0)] public int DynamicVerticalOffset { get { object o = ViewState ["DynamicVerticalOffset"]; if (o != null) return (int)o; return 0; } set { ViewState["DynamicVerticalOffset"] = value; } } [DefaultValue (0)] public int DynamicHorizontalOffset { get { object o = ViewState ["DynamicHorizontalOffset"]; if (o != null) return (int)o; return 0; } set { ViewState["DynamicHorizontalOffset"] = value; } } [DefaultValue (true)] public bool DynamicEnableDefaultPopOutImage { get { object o = ViewState ["dedpoi"]; if (o != null) return (bool)o; return true; } set { ViewState["dedpoi"] = value; } } [DefaultValue (true)] public bool StaticEnableDefaultPopOutImage { get { object o = ViewState ["sedpoi"]; if (o != null) return (bool)o; return true; } set { ViewState["sedpoi"] = value; } } [DefaultValueAttribute (null)] [PersistenceMode (PersistenceMode.InnerProperty)] [Editor ("System.Web.UI.Design.MenuItemCollectionEditor," + Consts.AssemblySystem_Design, "System.Drawing.Design.UITypeEditor, " + Consts.AssemblySystem_Drawing)] [MergablePropertyAttribute (false)] public MenuItemCollection Items { get { if (items == null) { items = new MenuItemCollection (this); if (IsTrackingViewState) ((IStateManager)items).TrackViewState(); } return items; } } [DefaultValue ('/')] public char PathSeparator { get { object o = ViewState ["PathSeparator"]; if(o != null) return (char)o; return '/'; } set { ViewState ["PathSeparator"] = value; } } [DefaultValue (false)] public bool ItemWrap { get { object o = ViewState ["ItemWrap"]; if(o != null) return (bool)o; return false; } set { ViewState ["ItemWrap"] = value; } } internal Style PopOutBoxStyle { get { if (popOutBoxStyle == null) { popOutBoxStyle = new Style (); popOutBoxStyle.BackColor = Color.White; } return popOutBoxStyle; } } internal Style ControlLinkStyle { get { if (controlLinkStyle == null) { controlLinkStyle = new Style (); controlLinkStyle.AlwaysRenderTextDecoration = true; } return controlLinkStyle; } } internal Style DynamicMenuItemLinkStyle { get { if (dynamicMenuItemLinkStyle == null) { dynamicMenuItemLinkStyle = new Style (); } return dynamicMenuItemLinkStyle; } } internal Style StaticMenuItemLinkStyle { get { if (staticMenuItemLinkStyle == null) { staticMenuItemLinkStyle = new Style (); } return staticMenuItemLinkStyle; } } internal Style DynamicSelectedLinkStyle { get { if (dynamicSelectedLinkStyle == null) { dynamicSelectedLinkStyle = new Style (); } return dynamicSelectedLinkStyle; } } internal Style StaticSelectedLinkStyle { get { if (staticSelectedLinkStyle == null) { staticSelectedLinkStyle = new Style (); } return staticSelectedLinkStyle; } } internal Style DynamicHoverLinkStyle { get { if (dynamicHoverLinkStyle == null) { dynamicHoverLinkStyle = new Style (); } return dynamicHoverLinkStyle; } } internal Style StaticHoverLinkStyle { get { if (staticHoverLinkStyle == null) { staticHoverLinkStyle = new Style (); } return staticHoverLinkStyle; } } internal MenuItemStyle StaticMenuItemStyleInternal { get { return staticMenuItemStyle; } } internal SubMenuStyle StaticMenuStyleInternal { get { return staticMenuStyle; } } internal MenuItemStyle DynamicMenuItemStyleInternal { get { return dynamicMenuItemStyle; } } internal SubMenuStyle DynamicMenuStyleInternal { get { return dynamicMenuStyle; } } internal MenuItemStyleCollection LevelMenuItemStylesInternal { get { return levelMenuItemStyles; } } internal List