From fbb5a6fb41b8ddf05424b0cae99725c710cd73f5 Mon Sep 17 00:00:00 2001 From: Lluis Sanchez Date: Fri, 3 Dec 2004 19:09:20 +0000 Subject: [PATCH] 2004-12-03 Lluis Sanchez Gual * MenuEventArgs.cs: Changed to sealed. * TreeView.cs: Minor fix. * Menu.cs, MenuItemBindingCollection.cs, MenuItemCollection.cs, MenuItemStyle.cs, MenuItemBinding.cs, MenuItem.cs, MenuItemStyleCollection.cs: Initial Menu code. svn path=/trunk/mcs/; revision=37044 --- .../System.Web.UI.WebControls/ChangeLog | 8 + .../System.Web.UI.WebControls/Menu.cs | 256 +++++++++ .../MenuEventArgs.cs | 2 +- .../System.Web.UI.WebControls/MenuItem.cs | 494 ++++++++++++++++++ .../MenuItemBinding.cs | 306 +++++++++++ .../MenuItemBindingCollection.cs | 104 ++++ .../MenuItemCollection.cs | 248 +++++++++ .../MenuItemStyle.cs | 149 ++++++ .../MenuItemStyleCollection.cs | 104 ++++ .../System.Web.UI.WebControls/TreeView.cs | 3 +- 10 files changed, 1671 insertions(+), 3 deletions(-) create mode 100644 mcs/class/System.Web/System.Web.UI.WebControls/Menu.cs create mode 100644 mcs/class/System.Web/System.Web.UI.WebControls/MenuItem.cs create mode 100644 mcs/class/System.Web/System.Web.UI.WebControls/MenuItemBinding.cs create mode 100644 mcs/class/System.Web/System.Web.UI.WebControls/MenuItemBindingCollection.cs create mode 100644 mcs/class/System.Web/System.Web.UI.WebControls/MenuItemCollection.cs create mode 100644 mcs/class/System.Web/System.Web.UI.WebControls/MenuItemStyle.cs create mode 100644 mcs/class/System.Web/System.Web.UI.WebControls/MenuItemStyleCollection.cs diff --git a/mcs/class/System.Web/System.Web.UI.WebControls/ChangeLog b/mcs/class/System.Web/System.Web.UI.WebControls/ChangeLog index a8c2acff907..c21f3b1b58b 100644 --- a/mcs/class/System.Web/System.Web.UI.WebControls/ChangeLog +++ b/mcs/class/System.Web/System.Web.UI.WebControls/ChangeLog @@ -1,3 +1,11 @@ +2004-12-03 Lluis Sanchez Gual + + * MenuEventArgs.cs: Changed to sealed. + * TreeView.cs: Minor fix. + * Menu.cs, MenuItemBindingCollection.cs, MenuItemCollection.cs, + MenuItemStyle.cs, MenuItemBinding.cs, MenuItem.cs, + MenuItemStyleCollection.cs: Initial Menu code. + 2004-12-02 Lluis Sanchez Gual * TreeNodeBindingCollection.cs, TreeNodeStyleCollection.cs: diff --git a/mcs/class/System.Web/System.Web.UI.WebControls/Menu.cs b/mcs/class/System.Web/System.Web.UI.WebControls/Menu.cs new file mode 100644 index 00000000000..42f9ae629d4 --- /dev/null +++ b/mcs/class/System.Web/System.Web.UI.WebControls/Menu.cs @@ -0,0 +1,256 @@ +// +// System.Web.UI.WebControls.Menu.cs +// +// Authors: +// Lluis Sanchez Gual (lluis@novell.com) +// +// (C) 2004 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.Handlers; +using System.Collections.Specialized; +using System.IO; + +namespace System.Web.UI.WebControls +{ + public class Menu : HierarchicalDataBoundControl, IPostBackEventHandler, INamingContainer + { + MenuItemCollection items; + MenuItemBindingCollection dataBindings; + MenuItem selectedItem; + Hashtable bindings; + + [PersistenceMode (PersistenceMode.InnerProperty)] + [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)] + [Editor ("System.Web.UI.Design.MenuItemBindingsEditor, " + Consts.AssemblySystem_Design, typeof (System.Drawing.Design.UITypeEditor))] + public virtual MenuItemBindingCollection DataBindings { + get { + if (dataBindings == null) { + dataBindings = new MenuItemBindingCollection (); + if (IsTrackingViewState) + ((IStateManager)dataBindings).TrackViewState(); + } + return dataBindings; + } + } + + [DefaultValue (500)] + public virtual int DisappearAfter { + get { + object o = ViewState ["DisappearAfter"]; + if (o != null) return (int)o; + return 500; + } + set { + ViewState["DisappearAfter"] = value; + } + } + + [DefaultValue ("")] + [UrlProperty] + [WebCategory ("Appearance")] + [Editor ("System.Web.UI.Design.ImageUrlEditor, " + Consts.AssemblySystem_Design, typeof (System.Drawing.Design.UITypeEditor))] + public virtual string DynamicBottomSeparatorImageUrl { + get { + object o = ViewState ["dbsiu"]; + if (o != null) return (string)o; + return ""; + } + set { + ViewState["dbsiu"] = value; + } + } + +/* [DefaultValue (true)] + public virtual bool DynamicEnableDefaultPopOutImage { + get { + object o = ViewState ["dedpoi"]; + if (o != null) return (bool)o; + return true; + } + set { + ViewState["dedpoi"] = value; + } + } +*/ + [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)] + [PersistenceMode (PersistenceMode.InnerProperty)] + [Editor ("System.Web.UI.Design.MenuItemCollectionEditor, " + Consts.AssemblySystem_Design, typeof (System.Drawing.Design.UITypeEditor))] + public virtual MenuItemCollection Items { + get { + if (items == null) { + items = new MenuItemCollection (this); + if (IsTrackingViewState) + ((IStateManager)items).TrackViewState(); + } + return items; + } + } + + [DefaultValue ('/')] + public virtual char PathSeparator { + get { + object o = ViewState ["PathSeparator"]; + if(o != null) return (char)o; + return '/'; + } + set { + ViewState ["PathSeparator"] = value; + } + } + + [Browsable (false)] + [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] + public MenuItem SelectedItem { + get { return selectedItem; } + } + + internal void SetSelectedItem (MenuItem item) + { + if (selectedItem == item) return; + if (selectedItem != null) + selectedItem.SelectedFlag = false; + selectedItem = item; + selectedItem.SelectedFlag = true; + // OnSelectedItemChanged (new MenuItemEventArgs (selectedItem)); + } + + public MenuItem FindItem (string valuePath) + { + if (valuePath == null) throw new ArgumentNullException ("valuePath"); + string[] path = valuePath.Split (PathSeparator); + int n = 0; + MenuItemCollection col = Items; + bool foundBranch = true; + while (col.Count > 0 && foundBranch) { + foundBranch = false; + foreach (MenuItem item in col) { + if (item.Value == path [n]) { + if (++n == path.Length) return item; + col = item.ChildItems; + foundBranch = true; + break; + } + } + } + return null; + } + + string GetBindingKey (string dataMember, int depth) + { + return dataMember + " " + depth; + } + + internal MenuItemBinding FindBindingForItem (string type, int depth) + { + if (bindings == null) return null; + + MenuItemBinding bin = (MenuItemBinding) bindings [GetBindingKey (type, depth)]; + if (bin != null) return bin; + + bin = (MenuItemBinding) bindings [GetBindingKey (type, -1)]; + if (bin != null) return bin; + + bin = (MenuItemBinding) bindings [GetBindingKey ("", depth)]; + if (bin != null) return bin; + + bin = (MenuItemBinding) bindings [GetBindingKey ("", -1)]; + return bin; + } + + protected internal override void PerformDataBinding () + { + base.PerformDataBinding (); + HierarchicalDataSourceView data = GetData (""); + IHierarchicalEnumerable e = data.Select (); + foreach (object obj in e) { + IHierarchyData hdata = e.GetHierarchyData (obj); + MenuItem item = new MenuItem (); + item.Bind (hdata); + Items.Add (item); + } + } + + void IPostBackEventHandler.RaisePostBackEvent (string eventArgument) + { + } + + protected override void TrackViewState() + { + EnsureDataBound (); + + base.TrackViewState(); + if (dataBindings != null) { + ((IStateManager)dataBindings).TrackViewState (); + } + if (items != null) { + ((IStateManager)items).TrackViewState();; + } + } + + protected override object SaveViewState() + { + object[] states = new object [2]; + states[0] = base.SaveViewState(); + states[1] = (dataBindings == null ? null : ((IStateManager)dataBindings).SaveViewState()); + states[2] = (items == null ? null : ((IStateManager)items).SaveViewState()); + + for (int i = states.Length - 1; i >= 0; i--) { + if (states [i] != null) + return states; + } + + return null; + } + + protected override void LoadViewState (object savedState) + { + if (savedState == null) + return; + + object [] states = (object []) savedState; + base.LoadViewState (states[0]); + + if (states[1] != null) + ((IStateManager)dataBindings).LoadViewState(states[8]); + if (states[2] != null) + ((IStateManager)Items).LoadViewState(states[9]); + } + + protected override void RenderContents (HtmlTextWriter writer) + { + writer.WriteLine ("This is a menu"); + } + + } +} + +#endif diff --git a/mcs/class/System.Web/System.Web.UI.WebControls/MenuEventArgs.cs b/mcs/class/System.Web/System.Web.UI.WebControls/MenuEventArgs.cs index 24575939910..a0a6012dd29 100644 --- a/mcs/class/System.Web/System.Web.UI.WebControls/MenuEventArgs.cs +++ b/mcs/class/System.Web/System.Web.UI.WebControls/MenuEventArgs.cs @@ -32,7 +32,7 @@ namespace System.Web.UI.WebControls { - public class MenuEventArgs : CommandEventArgs + public sealed class MenuEventArgs : CommandEventArgs { private MenuItem item; private object source; diff --git a/mcs/class/System.Web/System.Web.UI.WebControls/MenuItem.cs b/mcs/class/System.Web/System.Web.UI.WebControls/MenuItem.cs new file mode 100644 index 00000000000..cff024bef84 --- /dev/null +++ b/mcs/class/System.Web/System.Web.UI.WebControls/MenuItem.cs @@ -0,0 +1,494 @@ +// +// System.Web.UI.WebControls.MenuItem.cs +// +// Authors: +// Lluis Sanchez Gual (lluis@novell.com) +// +// (C) 2004 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. +// +// Copyright (C) 2004 Novell, Inc (http://www.novell.com) +// + +#if NET_2_0 + +using System; +using System.Collections; +using System.Text; +using System.ComponentModel; +using System.Web.UI; + +namespace System.Web.UI.WebControls +{ + [ParseChildrenAttribute (true, "ChildItems")] + public sealed class MenuItem: IStateManager, ICloneable + { + StateBag ViewState = new StateBag (); + MenuItemCollection items; + bool marked; + Menu menu; + MenuItem parent; + int index; + string path; + int depth = -1; + + IHierarchyData hierarchyData; + bool gotBinding; + MenuItemBinding binding; + PropertyDescriptorCollection boundProperties; + + public MenuItem () + { + } + + public MenuItem (string text) + { + Text = text; + } + + public MenuItem (string text, string value) + { + Text = text; + Value = value; + } + + public MenuItem (string text, string value, string imageUrl) + { + Text = text; + Value = value; + ImageUrl = imageUrl; + } + + public MenuItem (string text, string value, string imageUrl, string navigateUrl, string target) + { + Text = text; + Value = value; + ImageUrl = imageUrl; + NavigateUrl = navigateUrl; + Target = target; + } + + [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] + [Browsable (false)] + public int Depth { + get { + if (depth != -1) return depth; + depth = 0; + MenuItem nod = parent; + while (nod != null) { + depth++; + nod = nod.parent; + } + return depth; + } + } + + void ResetPathData () + { + path = null; + depth = -1; + gotBinding = false; + } + + internal Menu Menu { + get { return menu; } + set { + if (SelectedFlag) { + if (value != null) + value.SetSelectedItem (this); + else if (menu != null) + menu.SetSelectedItem (null); + } + menu = value; + if (items != null) + items.SetMenu (menu); + ResetPathData (); + } + } + + [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] + [DefaultValue (false)] + [Browsable (false)] + public bool DataBound { + get { return hierarchyData != null; } + } + + [DefaultValue (null)] + [Browsable (false)] + public object DataItem { + get { + if (hierarchyData == null) throw new InvalidOperationException ("MenuItem is not data bound."); + return hierarchyData.Item; + } + } + + [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] + [DefaultValue ("")] + [Browsable (false)] + public string DataPath { + get { + if (hierarchyData == null) throw new InvalidOperationException ("MenuItem is not data bound."); + return hierarchyData.Path; + } + } + + [MergableProperty (false)] + [Browsable (false)] + [PersistenceMode (PersistenceMode.InnerDefaultProperty)] + public MenuItemCollection ChildItems { + get { + if (items == null) { + if (DataBound) + FillBoundChildren (); + else + items = new MenuItemCollection (this); + + if (((IStateManager)this).IsTrackingViewState) + ((IStateManager)items).TrackViewState(); + } + return items; + } + } + + [DefaultValue ("")] + [UrlProperty] + [Editor ("System.Web.UI.Design.ImageUrlEditor, " + Consts.AssemblySystem_Design, typeof (System.Drawing.Design.UITypeEditor))] + public string ImageUrl { + get { + object o = ViewState ["ImageUrl"]; + if (o != null) return (string)o; + if (DataBound) { + MenuItemBinding bin = GetBinding (); + if (bin != null) { + if (bin.ImageUrlField != "") + return (string) GetBoundPropertyValue (bin.ImageUrlField); + return bin.ImageUrl; + } + } + return ""; + } + set { + ViewState ["ImageUrl"] = value; + } + } + + [DefaultValue ("")] + [UrlProperty] + [Editor ("System.Web.UI.Design.UrlEditor, " + Consts.AssemblySystem_Design, typeof (System.Drawing.Design.UITypeEditor))] + public string NavigateUrl { + get { + object o = ViewState ["NavigateUrl"]; + if (o != null) return (string)o; + if (DataBound) { + MenuItemBinding bin = GetBinding (); + if (bin != null) { + if (bin.NavigateUrlField != "") + return (string) GetBoundPropertyValue (bin.NavigateUrlField); + return bin.NavigateUrl; + } + } + return ""; + } + set { + ViewState ["NavigateUrl"] = value; + } + } + + [DefaultValue ("")] + public string Target { + get { + object o = ViewState ["Target"]; + if(o != null) return (string)o; + if (DataBound) { + MenuItemBinding bin = GetBinding (); + if (bin != null) { + if (bin.TargetField != "") + return (string) GetBoundPropertyValue (bin.TargetField); + return bin.Target; + } + } + return ""; + } + set { + ViewState ["Target"] = value; + } + } + + [Localizable (true)] + [DefaultValue ("")] + public string Text { + get { + object o = ViewState ["Text"]; + if (o != null) return (string)o; + if (DataBound) { + MenuItemBinding bin = GetBinding (); + if (bin != null) { + string text; + if (bin.TextField != "") + text = (string) GetBoundPropertyValue (bin.TextField); + else if (bin.Text != "") + text = bin.Text; + else + text = hierarchyData.ToString (); + + if (bin.FormatString.Length != 0) + text = string.Format (bin.FormatString, text); + return text; + } + return hierarchyData.ToString (); + } + return ""; + } + set { + ViewState ["Text"] = value; + } + } + + [Localizable (true)] + [DefaultValue ("")] + public string ToolTip { + get { + object o = ViewState ["ToolTip"]; + if(o != null) return (string)o; + if (DataBound) { + MenuItemBinding bin = GetBinding (); + if (bin != null) { + if (bin.ToolTipField != "") + return (string) GetBoundPropertyValue (bin.ToolTipField); + return bin.ToolTip; + } + } + return ""; + } + set { + ViewState ["ToolTip"] = value; + } + } + + [Localizable (true)] + [DefaultValue ("")] + public string Value { + get { + object o = ViewState ["Value"]; + if(o != null) return (string)o; + if (DataBound) { + MenuItemBinding bin = GetBinding (); + if (bin != null) { + if (bin.ValueField != "") + return (string) GetBoundPropertyValue (bin.ValueField); + if (bin.Value != "") + return bin.Value; + } + return hierarchyData.ToString (); + } + return ""; + } + set { + ViewState ["Value"] = value; + } + } + + [DefaultValue (false)] + public bool Selected { + get { + return SelectedFlag; + } + set { + if (menu != null) { + if (!value && menu.SelectedItem == this) + menu.SetSelectedItem (null); + else if (value) + menu.SetSelectedItem (this); + } + else + SelectedFlag = value; + } + } + + internal bool SelectedFlag { + get { + object o = ViewState ["Selected"]; + if(o != null) return (bool)o; + return false; + } + set { + ViewState ["Selected"] = value; + } + } + + [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] + [Browsable (false)] + public MenuItem Parent { + get { return parent; } + } + + [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] + [Browsable (false)] + public string ValuePath { + get { + if (menu == null) return Value; + + StringBuilder sb = new StringBuilder (Value); + MenuItem item = parent; + while (item != null) { + sb.Insert (0, menu.PathSeparator); + sb.Insert (0, item.Value); + item = item.Parent; + } + return sb.ToString (); + } + } + + internal int Index { + get { return index; } + set { index = value; ResetPathData (); } + } + + internal void SetParent (MenuItem item) { + parent = item; + ResetPathData (); + } + + internal string Path { + get { + if (path != null) return path; + StringBuilder sb = new StringBuilder (index.ToString()); + MenuItem item = parent; + while (item != null) { + sb.Insert (0, '_'); + sb.Insert (0, item.Index.ToString ()); + item = item.Parent; + } + path = sb.ToString (); + return path; + } + } + + internal bool HasChildData { + get { return items != null; } + } + + void IStateManager.LoadViewState (object savedState) + { + if (savedState == null) + return; + + object[] states = (object[]) savedState; + ViewState.LoadViewState (states [0]); + + if (menu != null && SelectedFlag) + menu.SetSelectedItem (this); + + if (states [1] != null) + ((IStateManager)ChildItems).LoadViewState (states [1]); + } + + object IStateManager.SaveViewState () + { + object[] states = new object[2]; + states[0] = ViewState.SaveViewState(); + states[1] = (items == null ? null : ((IStateManager)items).SaveViewState()); + + for (int i = 0; i < states.Length; i++) { + if (states [i] != null) + return states; + } + return null; + } + + void IStateManager.TrackViewState () + { + if (marked) return; + marked = true; + ViewState.TrackViewState(); + + if (items != null) + ((IStateManager)items).TrackViewState (); + } + + bool IStateManager.IsTrackingViewState + { + get { return marked; } + } + + internal void SetDirty () + { + ViewState.SetDirty (); + } + + object ICloneable.Clone () + { + MenuItem nod = new MenuItem (); + foreach (DictionaryEntry e in ViewState) + nod.ViewState [(string)e.Key] = e.Value; + + foreach (ICloneable c in ChildItems) + nod.ChildItems.Add ((MenuItem)c.Clone ()); + + return nod; + } + + internal void Bind (IHierarchyData hierarchyData) + { + this.hierarchyData = hierarchyData; + } + + MenuItemBinding GetBinding () + { + if (menu == null) return null; + if (gotBinding) return binding; + binding = menu.FindBindingForItem (hierarchyData.Type, Depth); + gotBinding = true; + return binding; + } + + object GetBoundPropertyValue (string name) + { + if (boundProperties == null) { + ICustomTypeDescriptor desc = hierarchyData as ICustomTypeDescriptor; + if (desc == null) + throw new InvalidOperationException ("Property '" + name + "' not found in data bound item"); + boundProperties = desc.GetProperties (); + } + + PropertyDescriptor prop = boundProperties.Find (name, true); + if (prop == null) + throw new InvalidOperationException ("Property '" + name + "' not found in data bound item"); + return prop.GetValue (hierarchyData); + } + + void FillBoundChildren () + { + items = new MenuItemCollection (this); + if (!hierarchyData.HasChildren) return; + + IHierarchicalEnumerable e = hierarchyData.GetChildren (); + foreach (object obj in e) { + IHierarchyData hdata = e.GetHierarchyData (obj); + MenuItem item = new MenuItem (); + item.Bind (hdata); + items.Add (item); + } + } + } +} + +#endif diff --git a/mcs/class/System.Web/System.Web.UI.WebControls/MenuItemBinding.cs b/mcs/class/System.Web/System.Web.UI.WebControls/MenuItemBinding.cs new file mode 100644 index 00000000000..d7cfe75c579 --- /dev/null +++ b/mcs/class/System.Web/System.Web.UI.WebControls/MenuItemBinding.cs @@ -0,0 +1,306 @@ +// +// System.Web.UI.WebControls.MenuItemBinding.cs +// +// Authors: +// Lluis Sanchez Gual (lluis@novell.com) +// +// (C) 2004 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. +// +// Copyright (C) 2004 Novell, Inc (http://www.novell.com) +// + +#if NET_2_0 + +using System; +using System.Collections; +using System.Web.UI; +using System.ComponentModel; + +namespace System.Web.UI.WebControls +{ + [DefaultProperty ("TextField")] + public sealed class MenuItemBinding: IStateManager, ICloneable, IDataSourceViewSchemaAccessor + { + StateBag ViewState = new StateBag (); + + [DefaultValue ("")] + public string DataMember { + get { + object o = ViewState ["DataMember"]; + if (o != null) return (string) o; + return ""; + } + set { + ViewState ["DataMember"] = value; + } + } + + [DefaultValue (-1)] + public int Depth { + get { + object o = ViewState ["Depth"]; + if (o != null) return (int) o; + return -1; + } + set { + ViewState ["Depth"] = value; + } + } + + [DefaultValue (true)] + public bool Enabled { + get { + object o = ViewState ["Enabled"]; + if (o != null) return (bool) o; + return true; + } + set { + ViewState ["Enabled"] = value; + } + } + + [DefaultValue ("")] + [TypeConverter ("System.Web.UI.Design.DataSourceViewSchemaConverter, " + Consts.AssemblySystem_Design)] + public string EnabledField { + get { + object o = ViewState ["EnabledField"]; + if (o != null) return (string) o; + return ""; + } + set { + ViewState ["EnabledField"] = value; + } + } + + [Localizable (true)] + [DefaultValue ("")] + public string FormatString { + get { + object o = ViewState ["FormatString"]; + if (o != null) return (string) o; + return ""; + } + set { + ViewState ["FormatString"] = value; + } + } + + [DefaultValue ("")] + [UrlProperty] + [Editor ("System.Web.UI.Design.ImageUrlEditor, " + Consts.AssemblySystem_Design, typeof (System.Drawing.Design.UITypeEditor))] + public string ImageUrl { + get { + object o = ViewState ["ImageUrl"]; + if (o != null) return (string) o; + return ""; + } + set { + ViewState ["ImageUrl"] = value; + } + } + + [DefaultValue ("")] + [TypeConverter ("System.Web.UI.Design.DataSourceViewSchemaConverter, " + Consts.AssemblySystem_Design)] + public string ImageUrlField { + get { + object o = ViewState ["ImageUrlField"]; + if (o != null) return (string) o; + return ""; + } + set { + ViewState ["ImageUrlField"] = value; + } + } + + [DefaultValue ("")] + [UrlProperty] + [Editor ("System.Web.UI.Design.UrlEditor, " + Consts.AssemblySystem_Design, typeof (System.Drawing.Design.UITypeEditor))] + public string NavigateUrl { + get { + object o = ViewState ["NavigateUrl"]; + if (o != null) return (string) o; + return ""; + } + set { + ViewState ["NavigateUrl"] = value; + } + } + + [DefaultValue ("")] + [TypeConverter ("System.Web.UI.Design.DataSourceViewSchemaConverter, " + Consts.AssemblySystem_Design)] + public string NavigateUrlField { + get { + object o = ViewState ["NavigateUrlField"]; + if (o != null) return (string) o; + return ""; + } + set { + ViewState ["NavigateUrlField"] = value; + } + } + + [DefaultValue ("")] + public string Target { + get { + object o = ViewState ["Target"]; + if(o != null) return (string)o; + return ""; + } + set { + ViewState ["Target"] = value; + } + } + + [DefaultValue ("")] + [TypeConverter ("System.Web.UI.Design.DataSourceViewSchemaConverter, " + Consts.AssemblySystem_Design)] + public string TargetField { + get { + object o = ViewState ["TargetField"]; + if (o != null) return (string) o; + return ""; + } + set { + ViewState ["TargetField"] = value; + } + } + + [Localizable (true)] + [DefaultValue ("")] + [WebSysDescription ("The display text of the menu item.")] + public string Text { + get { + object o = ViewState ["Text"]; + if(o != null) return (string)o; + return ""; + } + set { + ViewState ["Text"] = value; + } + } + + [DefaultValue ("")] + [TypeConverter ("System.Web.UI.Design.DataSourceViewSchemaConverter, " + Consts.AssemblySystem_Design)] + public string TextField { + get { + object o = ViewState ["TextField"]; + if(o != null) return (string)o; + return ""; + } + set { + ViewState ["TextField"] = value; + } + } + + [DefaultValue ("")] + [Localizable (true)] + public string ToolTip { + get { + object o = ViewState ["ToolTip"]; + if(o != null) return (string)o; + return ""; + } + set { + ViewState ["ToolTip"] = value; + } + } + + [DefaultValue ("")] + [TypeConverter ("System.Web.UI.Design.DataSourceViewSchemaConverter, " + Consts.AssemblySystem_Design)] + public string ToolTipField { + get { + object o = ViewState ["ToolTipField"]; + if(o != null) return (string)o; + return ""; + } + set { + ViewState ["ToolTipField"] = value; + } + } + + [DefaultValue ("")] + [Localizable (true)] + public string Value { + get { + object o = ViewState ["Value"]; + if(o != null) return (string)o; + return ""; + } + set { + ViewState ["Value"] = value; + } + } + + [DefaultValue ("")] + [TypeConverter ("System.Web.UI.Design.DataSourceViewSchemaConverter, " + Consts.AssemblySystem_Design)] + public string ValueField { + get { + object o = ViewState ["ValueField"]; + if(o != null) return (string)o; + return ""; + } + set { + ViewState ["ValueField"] = value; + } + } + + void IStateManager.LoadViewState (object savedState) + { + ViewState.LoadViewState (savedState); + } + + object IStateManager.SaveViewState () + { + return ViewState.SaveViewState(); + } + + void IStateManager.TrackViewState () + { + ViewState.TrackViewState (); + } + + bool IStateManager.IsTrackingViewState { + get { return ViewState.IsTrackingViewState; } + } + + [MonoTODO] + object IDataSourceViewSchemaAccessor.DataSourceViewSchema { + get { throw new NotImplementedException (); } + set { throw new NotImplementedException (); } + } + + object ICloneable.Clone () + { + MenuItemBinding bin = new MenuItemBinding (); + foreach (DictionaryEntry e in ViewState) + bin.ViewState [(string)e.Key] = e.Value; + return bin; + } + + internal void SetDirty () + { + foreach (string key in ViewState.Keys) + ViewState.SetItemDirty (key, true); + } + } +} + +#endif diff --git a/mcs/class/System.Web/System.Web.UI.WebControls/MenuItemBindingCollection.cs b/mcs/class/System.Web/System.Web.UI.WebControls/MenuItemBindingCollection.cs new file mode 100644 index 00000000000..0c8161955fa --- /dev/null +++ b/mcs/class/System.Web/System.Web.UI.WebControls/MenuItemBindingCollection.cs @@ -0,0 +1,104 @@ +// +// System.Web.UI.WebControls.MenuItemBindingCollection.cs +// +// Authors: +// Lluis Sanchez Gual (lluis@novell.com) +// +// (C) 2004 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. +// +// Copyright (C) 2004 Novell, Inc (http://www.novell.com) +// + +#if NET_2_0 + +using System; +using System.Collections; +using System.Web.UI; + +namespace System.Web.UI.WebControls +{ + public sealed class MenuItemBindingCollection: StateManagedCollection + { + static Type[] types = new Type[] { typeof (MenuItemBinding) }; + + internal MenuItemBindingCollection () + { + } + + public int Add (MenuItemBinding binding) + { + return ((IList)this).Add (binding); + } + + public bool Contains (MenuItemBinding binding) + { + return ((IList)this).Contains (binding); + } + + public void CopyTo (MenuItemBinding[] array, int index) + { + ((IList)this).CopyTo (array, index); + } + + protected override object CreateKnownType (int index) + { + return new MenuItemBinding (); + } + + protected override Type[] GetKnownTypes () + { + return types; + } + + public int IndexOf (MenuItemBinding binding) + { + return ((IList)this).IndexOf (binding); + } + + public void Insert (int index, MenuItemBinding binding) + { + ((IList)this).Insert (index, binding); + } + + public void Remove (MenuItemBinding binding) + { + ((IList)this).Remove (binding); + } + + public void RemoveAt (int index) + { + ((IList)this).RemoveAt (index); + } + + public MenuItemBinding this [int i] { + get { return (MenuItemBinding) ((IList)this) [i]; } + set { ((IList)this) [i] = value; } + } + + protected override void SetDirtyObject (object o) + { + ((MenuItemBinding)o).SetDirty (); + } + } +} + +#endif diff --git a/mcs/class/System.Web/System.Web.UI.WebControls/MenuItemCollection.cs b/mcs/class/System.Web/System.Web.UI.WebControls/MenuItemCollection.cs new file mode 100644 index 00000000000..01514219f8d --- /dev/null +++ b/mcs/class/System.Web/System.Web.UI.WebControls/MenuItemCollection.cs @@ -0,0 +1,248 @@ +// +// System.Web.UI.WebControls.MenuItemCollection.cs +// +// Authors: +// Lluis Sanchez Gual (lluis@novell.com) +// +// (C) 2004 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. +// +// Copyright (C) 2004 Novell, Inc (http://www.novell.com) +// + +#if NET_2_0 + +using System; +using System.Web.UI; +using System.Collections; + +namespace System.Web.UI.WebControls +{ + public sealed class MenuItemCollection: ICollection, IEnumerable, IStateManager + { + MenuItem[] originalItems; + ArrayList items = new ArrayList (); + Menu menu; + MenuItem parent; + bool marked; + bool dirty; + + public MenuItemCollection () + { + } + + public MenuItemCollection (MenuItem owner) + { + this.parent = owner; + this.menu = owner.Menu; + } + + internal MenuItemCollection (Menu menu) + { + this.menu = menu; + } + + internal void SetMenu (Menu menu) + { + this.menu = menu; + foreach (MenuItem item in items) + item.Menu = menu; + } + + public MenuItem this [int i] { + get { return (MenuItem) items [i]; } + } + + public void Add (MenuItem child) + { + child.Index = items.Add (child); + child.Menu = menu; + child.SetParent (parent); + if (marked) { + ((IStateManager)child).TrackViewState (); + child.SetDirty (); + dirty = true; + } + } + + public void AddAt (int index, MenuItem child) + { + items.Insert (index, child); + child.Index = index; + child.Menu = menu; + child.SetParent (parent); + for (int n=index+1; n 0 && foundBranch) { foundBranch = false; - foreach (TreeNode node in Nodes) { + foreach (TreeNode node in col) { if (node.Value == path [n]) { if (++n == path.Length) return node; col = node.ChildNodes; @@ -766,7 +766,6 @@ namespace System.Web.UI.WebControls ((IStateManager)Nodes).LoadViewState(states[9]); } - [MonoTODO] void IPostBackEventHandler.RaisePostBackEvent (string eventArgument) { string[] args = eventArgument.Split ('|'); -- 2.25.1