2 // System.Web.UI.WebControls.MenuItemCollection.cs
5 // Lluis Sanchez Gual (lluis@novell.com)
7 // (C) 2004 Novell, Inc (http://www.novell.com)
9 // Permission is hereby granted, free of charge, to any person obtaining
10 // a copy of this software and associated documentation files (the
11 // "Software"), to deal in the Software without restriction, including
12 // without limitation the rights to use, copy, modify, merge, publish,
13 // distribute, sublicense, and/or sell copies of the Software, and to
14 // permit persons to whom the Software is furnished to do so, subject to
15 // the following conditions:
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28 // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
35 using System.Collections;
37 namespace System.Web.UI.WebControls
39 public sealed class MenuItemCollection: ICollection, IEnumerable, IStateManager
41 MenuItem[] originalItems;
42 ArrayList items = new ArrayList ();
48 public MenuItemCollection ()
52 public MenuItemCollection (MenuItem owner)
55 this.menu = owner.Menu;
58 internal MenuItemCollection (Menu menu)
63 internal void SetMenu (Menu menu)
66 foreach (MenuItem item in items)
70 public MenuItem this [int i] {
71 get { return (MenuItem) items [i]; }
74 public void Add (MenuItem child)
76 child.Index = items.Add (child);
78 child.SetParent (parent);
80 ((IStateManager)child).TrackViewState ();
86 public void AddAt (int index, MenuItem child)
88 items.Insert (index, child);
91 child.SetParent (parent);
92 for (int n=index+1; n<items.Count; n++)
93 ((MenuItem)items[n]).Index = n;
95 ((IStateManager)child).TrackViewState ();
103 if (menu != null || parent != null) {
104 foreach (MenuItem nod in items) {
106 nod.SetParent (null);
113 public bool Contains (MenuItem child)
115 return items.Contains (child);
118 public void CopyTo (Array itemArray, int index)
120 items.CopyTo (itemArray, index);
123 public void CopyTo (MenuItem[] itemArray, int index)
125 items.CopyTo (itemArray, index);
128 public IEnumerator GetEnumerator ()
130 return items.GetEnumerator ();
133 public int IndexOf (MenuItem item)
135 return items.IndexOf (item);
138 public void Remove (MenuItem item)
140 int i = IndexOf (item);
148 public void RemoveAt (int index)
150 MenuItem item = (MenuItem) items [index];
151 items.RemoveAt (index);
158 get { return items.Count; }
161 public bool IsSynchronized {
162 get { return false; }
165 public object SyncRoot {
166 get { return items; }
169 void System.Collections.ICollection.CopyTo (Array array, int index)
171 items.CopyTo (array, index);
174 void IStateManager.LoadViewState (object state)
176 if (state == null) return;
177 object[] its = (object[]) state;
179 dirty = (bool)its [0];
184 for (int n=1; n<its.Length; n++) {
185 Pair pair = (Pair) its [n];
186 int oi = (int) pair.First;
188 if (oi != -1) item = originalItems [oi];
189 else item = new MenuItem ();
190 if (dirty) Add (item);
191 ((IStateManager)item).LoadViewState (pair.Second);
195 object IStateManager.SaveViewState ()
197 object[] state = null;
198 bool hasData = false;
201 state = new object [items.Count + 1];
203 for (int n=0; n<items.Count; n++) {
204 MenuItem item = items[n] as MenuItem;
205 int oi = Array.IndexOf (originalItems, item);
206 object ns = ((IStateManager)item).SaveViewState ();
207 if (ns != null) hasData = true;
208 state [n + 1] = new Pair (oi, ns);
211 ArrayList list = new ArrayList ();
212 for (int n=0; n<items.Count; n++) {
213 MenuItem item = items[n] as MenuItem;
214 object ns = ((IStateManager)item).SaveViewState ();
217 list.Add (new Pair (n, ns));
221 list.Insert (0, false);
222 state = list.ToArray ();
232 void IStateManager.TrackViewState ()
235 originalItems = new MenuItem [items.Count];
236 for (int n=0; n<items.Count; n++) {
237 originalItems [n] = (MenuItem) items [n];
238 ((IStateManager)originalItems [n]).TrackViewState ();
242 bool IStateManager.IsTrackingViewState {
243 get { return marked; }